Esempio n. 1
0
LRESULT CALLBACK AttachGuiWindowCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode == HC_ACTION)
	{
		CWPSTRUCT* p = (CWPSTRUCT*)lParam;
		if (p->message == gnAttachMsgId)
		{
			_ASSERTEX(wParam==1 && p->wParam==gnAttachMsgId);
			AttachMsgArg* args = (AttachMsgArg*)p->lParam;
			_ASSERTEX(args->MsgId==gnAttachMsgId && args->hConEmu==ghConEmuWnd && args->hProcessed==p->hwnd);

			HWND hOurWindow = p->hwnd;
			HMENU hMenu = user->getMenu(hOurWindow);
			wchar_t szClassName[255]; user->getClassNameW(hOurWindow, szClassName, countof(szClassName));
			DWORD nCurStyle = (DWORD)user->getWindowLongPtrW(hOurWindow, GWL_STYLE);
			DWORD nCurStyleEx = (DWORD)user->getWindowLongPtrW(hOurWindow, GWL_EXSTYLE);
			//BOOL bWasVisible = IsWindowVisible(hOurWindow);
			_ASSERTEX(IsWindowVisible(hOurWindow));
			OnGuiWindowAttached(hOurWindow, hMenu, NULL, szClassName, nCurStyle, nCurStyleEx, FALSE, SW_SHOW);
			args->Result = gnAttachMsgId;
			//if (!bWasVisible) // Надо?
			//	ShowWindow(hOurWindow, SW_SHOW);
		}
	}

	return user->callNextHookEx(ghAttachMsgHook, nCode, wParam, lParam);
}
Esempio n. 2
0
bool CDefTermHk::isDefaultTerminalAllowed(bool bDontCheckName /*= false*/)
{
	_ASSERTEX((gbPrepareDefaultTerminal==false) || ((gpDefTerm!=NULL) && (this==gpDefTerm)));

	if (!gbPrepareDefaultTerminal || !this)
	{
		_ASSERTEX(gbPrepareDefaultTerminal && this);
		return false;
	}

	DWORD nDelta = (GetTickCount() - mn_LastCheck);
	if (nDelta > SERIALIZE_CHECK_TIMEOUT)
	{
		ReloadSettings();
	}

	// Разрешен ли вообще?
	if (!m_Opt.bUseDefaultTerminal)
		return false;
	// Известны пути?
	if (!m_Opt.pszConEmuExe || !*m_Opt.pszConEmuExe || !m_Opt.pszConEmuBaseDir || !*m_Opt.pszConEmuBaseDir)
		return false;
	// Проверить НАШ exe-шник на наличие в m_Opt.pszzHookedApps
	if (!bDontCheckName && !IsAppMonitored(ms_ExeName))
		return false;
	// Да
	return true;
}
Esempio n. 3
0
RECT AttachGuiClientPos(DWORD anStyle /*= 0*/, DWORD anStyleEx /*= 0*/)
{
	//CheckOrigGuiClientRect();

	RECT rcPos = {}; // {0,0,grcAttachGuiClientOrig.right-grcAttachGuiClientOrig.left,grcAttachGuiClientOrig.bottom-grcAttachGuiClientOrig.top};

	if (ghConEmuWndBack)
	{
		user->getClientRect(ghConEmuWndBack, &rcPos);
		// AttachGuiClientPos may be called from CheckCanCreateWindow
		// and ghAttachGuiClient is NULL at this point
		_ASSERTEX(ghAttachGuiClient!=NULL || (anStyle||anStyleEx));

		DWORD nStyle = (anStyle || anStyleEx) ? anStyle : (DWORD)user->getWindowLongPtrW(ghAttachGuiClient, GWL_STYLE);
		DWORD nStyleEx = (anStyle || anStyleEx) ? anStyleEx : (DWORD)user->getWindowLongPtrW(ghAttachGuiClient, GWL_EXSTYLE);

		CorrectGuiChildRect(nStyle, nStyleEx, rcPos);
	}
	else
	{
		_ASSERTEX(ghConEmuWndBack!=NULL);
		_ASSERTEX(ghAttachGuiClient!=NULL);
		user->getWindowRect(ghConEmuWndBack, &rcPos);		
	}

	return rcPos;
}
Esempio n. 4
0
void MSection::Unlock(BOOL abExclusive)
{
	DWORD dwTID = GetCurrentThreadId();

	if (abExclusive)
	{
		//Process_Lock();

		_ASSERTEX(mn_TID == dwTID && mb_Exclusive);
		_ASSERTEX(mn_LockedTID[0] == dwTID);
		#ifdef _DEBUG
		mn_UnlockedExclusiveTID = dwTID;
		#endif
		mb_Exclusive = FALSE; mn_TID = 0;
		mn_LockedTID[0] = 0;
		if (mn_LockedCount[0] > 0)
		{
			mn_LockedCount[0] --; // на [0] mn_Locked не распространяется
		}
		else
		{
			_ASSERTEX(mn_LockedCount[0]>0);
		}
		m_cs.Leave();

		//Process_Unlock();
	}
	else
	{
		ReleaseRef(dwTID);
	}
}
BOOL MSectionLockSimple::Lock(MSectionSimple* apS, DWORD anTimeout/*=-1*/)
{
	if (mb_Locked && (mp_S != apS))
		Unlock();

	mp_S = apS;

	if (!mp_S)
	{
		_ASSERTEX(apS);
		return FALSE;
	}

	_ASSERTEX(!mb_Locked);
	_ASSERTEX(apS->IsInitialized());

	bool bLocked = false;
	DWORD nStartTick = GetTickCount();
	DWORD nDelta = -1;
#if 0
	EnterCriticalS	ection(&apS->m_S);

	bLocked = mb_Locked = true;

	nDelta = GetTickCount() - nStartTick;
	if (nDelta >= anTimeout)
	{
		_ASSERTEX(FALSE && "Failed to lock CriticalSection, timeout");
	}
#else
	while (true)
	{
		if (apS->TryEnter())
		{
			bLocked = mb_Locked = true;
			#ifdef _DEBUG
			mn_LockTID = GetCurrentThreadId();
			mn_LockTick = GetTickCount();
			#endif
			break;
		}

		nDelta = GetTickCount() - nStartTick;

		if (anTimeout != (DWORD)-1)
		{
			if (nDelta >= anTimeout)
			{
				_ASSERTEX(FALSE && "Failed to lock CriticalSection, timeout");
				break;
			}
		}

		Sleep(1);
	}
#endif

	return bLocked;
}
Esempio n. 6
0
void MSection::AddRef(DWORD dwTID)
{
	Process_Lock();

	#ifdef _DEBUG
	int dbgCurLockCount = 0;
	if (mn_Locked == 0)
	{
		for (int d=1; d<countof(mn_LockedCount); d++)
		{
			_ASSERTE(mn_LockedCount[d]>=0);
			dbgCurLockCount += mn_LockedCount[d];
		}
		if (dbgCurLockCount != 0)
		{
			_ASSERTEX(dbgCurLockCount==0 || mn_Locked);
		}
	}
	#endif

	mn_Locked ++; // увеличиваем счетчик nonexclusive locks
	_ASSERTEX(mn_Locked>0);
	ResetEvent(mh_ReleaseEvent); // На всякий случай сбросим Event
	INT_PTR j = -1; // будет -2, если ++ на существующий, иначе - +1 на пустой

	for (size_t i = 1; i < countof(mn_LockedTID); i++)
	{
		if (mn_LockedTID[i] == dwTID)
		{
			_ASSERTE(mn_LockedCount[i]>=0);
			mn_LockedCount[i] ++;
			j = -2;
			break;
		}
	}

	if (j == -1)
	{
		for (size_t i = 1; i < countof(mn_LockedTID); i++)
		{
			if (mn_LockedTID[i] == 0)
			{
				mn_LockedTID[i] = dwTID;
				_ASSERTE(mn_LockedCount[i]>=0);
				mn_LockedCount[i] ++;
				j = i;
				break;
			}
		}
	}

	if (j == -1)  // Этого быть не должно
	{
		_ASSERTEX(j != -1);
	}

	Process_Unlock();
}
Esempio n. 7
0
HWND CDefTermHk::AllocHiddenConsole(bool bTempForVS)
{
	// функция AttachConsole есть только в WinXP и выше
	AttachConsole_t _AttachConsole = GetAttachConsoleProc();
	if (!_AttachConsole)
	{
		LogHookingStatus(L"Can't create hidden console, function does not exist");
		return NULL;
	}

	LogHookingStatus(L"AllocHiddenConsole");

	ReloadSettings();
	_ASSERTEX(isDefTermEnabled() && (gbIsNetVsHost || bTempForVS));

	if (!isDefTermEnabled())
	{
		// Disabled in settings or registry
		LogHookingStatus(L"Application skipped by settings");
		return NULL;
	}

	HANDLE hSrvProcess = NULL;
	DWORD nAttachPID = bTempForVS ? 0 : gnSelfPID;
	DWORD nSrvPID = StartConsoleServer(nAttachPID, true, &hSrvProcess);
	if (!nSrvPID)
	{
		// Failed to start process?
		return NULL;
	}
	_ASSERTEX(hSrvProcess!=NULL);

	HWND hCreatedCon = NULL;

	// Do while server process is alive
	DWORD nStart = GetTickCount(), nMaxDelta = 30000, nDelta = 0;
	DWORD nWait = WaitForSingleObject(hSrvProcess, 0);
	while (nWait != WAIT_OBJECT_0)
	{
		if (_AttachConsole(nSrvPID))
		{
			hCreatedCon = GetRealConsoleWindow();
			if (hCreatedCon)
				break;
		}

		nWait = WaitForSingleObject(hSrvProcess, 150);

		nDelta = (GetTickCount() - nStart);
		if (nDelta > nMaxDelta)
			break;
	}

	return hCreatedCon;
}
Esempio n. 8
0
int MSection::ReleaseRef(DWORD dwTID)
{
	Process_Lock();

	_ASSERTEX(mn_Locked>0);
	int nInThreadLeft = 0;

	if (mn_Locked > 0)
		mn_Locked --;

	if (mn_Locked == 0)
	{
		SetEvent(mh_ReleaseEvent); // Больше nonexclusive locks не осталось
	}

	for (size_t i = 1; i < countof(mn_LockedTID); i++)
	{
		if (mn_LockedTID[i] == dwTID)
		{
			if (mn_LockedCount[i] > 0)
			{
				mn_LockedCount[i] --;
			}
			else
			{
				_ASSERTEX(mn_LockedCount[i] > 0);
			}

			if ((nInThreadLeft = mn_LockedCount[i]) == 0)
				mn_LockedTID[i] = 0; // Иначе при динамически создаваемых нитях - 10 будут в момент использованы

			break;
		}
	}

	if (mn_Locked == 0)
	{
		#ifdef _DEBUG
		int dbgCurLockCount = 0;
		for (int d=1; d<countof(mn_LockedCount); d++)
		{
			_ASSERTEX(mn_LockedCount[d]>=0);
			dbgCurLockCount += mn_LockedCount[d];
		}
		if (dbgCurLockCount != 0)
		{
			_ASSERTEX(dbgCurLockCount==0);
		}
		#endif
	}

	Process_Unlock();

	return nInThreadLeft;
}
Esempio n. 9
0
void OnConWndChanged(HWND ahNewConWnd)
{
	//BOOL lbForceReopen = FALSE;

	if (ahNewConWnd)
	{
		#ifdef _DEBUG
		if (user)
		{
			wchar_t sClass[64]; user->getClassNameW(ahNewConWnd, sClass, countof(sClass));
			_ASSERTEX(isConsoleClass(sClass));
		}
		#endif

		if (ghConWnd != ahNewConWnd)
		{
			ghConWnd = ahNewConWnd;
			//lbForceReopen = TRUE;
		}
	}
	else
	{
		//lbForceReopen = TRUE;
	}

	GetConMap(TRUE);
}
Esempio n. 10
0
void CTabPanelWin::ShowToolbar(bool bShow)
{
	if (bShow)
	{
		if (!IsToolbarCreated() && (CreateToolbar() != NULL))
		{
			REBARBANDINFO rbBand = {80}; // не используем size, т.к. приходит "новый" размер из висты и в XP обламываемся

			rbBand.fMask  = RBBIM_SIZE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_ID | RBBIM_STYLE | RBBIM_COLORS;
			rbBand.fStyle = RBBS_CHILDEDGE | RBBS_FIXEDSIZE | RBBS_VARIABLEHEIGHT;
			rbBand.clrBack = GetSysColor(COLOR_BTNFACE);
			rbBand.clrFore = GetSysColor(COLOR_BTNTEXT);

			SIZE sz = {0,0};
			SendMessage(mh_Toolbar, TB_GETMAXSIZE, 0, (LPARAM)&sz);

			// Set values unique to the band with the toolbar.
			rbBand.wID        = 2;
			rbBand.hwndChild  = mh_Toolbar;
			rbBand.cx = rbBand.cxMinChild = rbBand.cxIdeal = mn_LastToolbarWidth = sz.cx;
			rbBand.cyChild = rbBand.cyMinChild = rbBand.cyMaxChild = sz.cy + mn_ThemeHeightDiff;

			// Add the band that has the toolbar.
			if (!SendMessage(mh_Rebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand))
			{
				DisplayLastError(_T("Can't initialize rebar (toolbar)"));
			}
		}
	}
	else
	{
		_ASSERTEX(bShow);
	}
}
Esempio n. 11
0
BOOL WINAPI OnSetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode)
{
	//typedef BOOL (WINAPI* OnSetConsoleMode_t)(HANDLE hConsoleHandle, DWORD dwMode);
	ORIGINAL_KRNL(SetConsoleMode);
	BOOL lbRc = FALSE;

	#if 0
	if (!(dwMode & ENABLE_PROCESSED_OUTPUT))
	{
		_ASSERTEX((dwMode & ENABLE_PROCESSED_OUTPUT)==ENABLE_PROCESSED_OUTPUT);
	}
	#endif

	if (gbIsVimProcess)
	{
		if ((dwMode & (ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT)) != (ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT))
		{
			if (CEAnsi::IsOutputHandle(hConsoleHandle))
			{
				dwMode |= ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT;
			}
			else
			{
				dwMode |= ENABLE_WINDOW_INPUT;
			}
		}
	}

	lbRc = F(SetConsoleMode)(hConsoleHandle, dwMode);

	return lbRc;
}
Esempio n. 12
0
void MSectionLock::Unlock()
{
	if (mp_S && mb_Locked)
	{
		#ifdef _DEBUG
		DWORD nCurTID = GetCurrentThreadId();
		wchar_t szDbg[80];
		if (mb_Exclusive)
			msprintf(szDbg, countof(szDbg), L"::Unlock(), TID=%u\n", nCurTID);
		else
			szDbg[0] = 0;
		#endif

		_ASSERTEX(mb_Exclusive || mp_S->mn_Locked>0);
		mp_S->Unlock(mb_Exclusive);
		mb_Locked = FALSE;

		#ifdef _DEBUG
		if (*szDbg)
		{
			DebugString(szDbg);
		}
		#endif
	}
}
Esempio n. 13
0
void MSection::WaitUnlocked(DWORD dwTID, DWORD anTimeout)
{
	DWORD dwStartTick = GetTickCount();
	int nSelfCount = 0;

	for (size_t i = 1; i < countof(mn_LockedTID); i++)
	{
		if (mn_LockedTID[i] == dwTID)
		{
			_ASSERTEX(mn_LockedCount[i]>=0);
			nSelfCount = mn_LockedCount[i];
			break;
		}
	}

	while(mn_Locked > nSelfCount)
	{
#ifdef _DEBUG
		DEBUGSTR(L"!!! Waiting for exclusive access\n");
		DWORD nWait =
#endif
		    WaitForSingleObject(mh_ReleaseEvent, 10);
		DWORD dwCurTick = GetTickCount();
		DWORD dwDelta = dwCurTick - dwStartTick;

		if (anTimeout != (DWORD)-1)
		{
			if (dwDelta > anTimeout)
			{
				#ifndef CSECTION_NON_RAISE
				_ASSERTEX(dwDelta<=anTimeout);
				#endif
				break;
			}
		}

		#ifdef _DEBUG
		else if (dwDelta > 3000)
		{
			#ifndef CSECTION_NON_RAISE
			_ASSERTEX(dwDelta <= 3000);
			#endif
			break;
		}
		#endif
	}
}
Esempio n. 14
0
bool FileExistsSearch(LPCWSTR asFilePath, CmdArg& rsFound, bool abSetPath/*= true*/, bool abRegSearch /*= true*/)
{
	if (!asFilePath || !*asFilePath)
	{
		_ASSERTEX(asFilePath && *asFilePath);
		return false;
	}

	if (FileExists(asFilePath))
	{
		return true;
	}

	// Развернуть переменные окружения
	if (wcschr(asFilePath, L'%'))
	{
		bool bFound = false;
		wchar_t* pszExpand = ExpandEnvStr(asFilePath);
		if (pszExpand && FileExists(pszExpand))
		{
			// asFilePath will be invalid after .Set
			rsFound.Set(pszExpand);
			bFound = true;
		}
		SafeFree(pszExpand);

		if (bFound)
		{
			return true;
		}
	}

	// Search "Path"
	if (FileSearchInDir(asFilePath, rsFound))
	{
		return true;
	}

	// Только если приложение не нашли "по путям" - пытаемся определить его расположение через [App Paths]
	// В противном случае, в частности, может быть запущен "far" не из папки с ConEmu, а зарегистрированный
	// в реестре, если на машине их несколько установлено.

	#if !defined(CONEMU_MINIMAL)
	// В ConEmuHk этот блок не активен, потому что может быть "только" перехват CreateProcess,
	// а о его параметрах должно заботиться вызывающее (текущее) приложение
	if (abRegSearch && !wcschr(asFilePath, L'\\'))
	{
		// Если в asFilePath НЕ указан путь - искать приложение в реестре,
		// и там могут быть указаны доп. параметры (пока только добавка в %PATH%)
		if (SearchAppPaths(asFilePath, rsFound, abSetPath))
		{
			// Нашли по реестру, возможно обновили %PATH%
			return true;
		}
	}
	#endif

	return false;
}
Esempio n. 15
0
void UnregisterLdrNotification()
{
	if (gbLdrDllNotificationUsed)
	{
		_ASSERTEX(LdrUnregisterDllNotification!=NULL);
		LdrUnregisterDllNotification(gpLdrDllNotificationCookie);
	}
}
Esempio n. 16
0
void CheckOrigGuiClientRect()
{
	if (grcAttachGuiClientOrig.left==grcAttachGuiClientOrig.right && grcAttachGuiClientOrig.bottom==grcAttachGuiClientOrig.top)
	{
		_ASSERTEX(ghAttachGuiClient!=NULL);
		user->getWindowRect(ghAttachGuiClient, &grcAttachGuiClientOrig);
	}
}
Esempio n. 17
0
BOOL GetConsoleModeCached(HANDLE hConsoleHandle, LPDWORD lpMode, BOOL bForced /*= FALSE*/)
{
	BOOL lbRc = FALSE;

	static DWORD s_LastCheckTick = 0;
	static DWORD s_dwMode = 0;
	static HANDLE s_hConHandle = NULL;
	DWORD nTickDelta = 0;
	const DWORD TickDeltaMax = 250;

	if (hConsoleHandle == NULL)
	{
		// Сброс
		s_hConHandle = NULL;
		return FALSE;
	}

	if (!lpMode)
	{
		_ASSERTEX(lpMode!=NULL);
		return FALSE;
	}

	if (s_hConHandle && (s_hConHandle == hConsoleHandle))
	{
		nTickDelta = GetTickCount() - s_LastCheckTick;
		if (nTickDelta <= TickDeltaMax)
		{
			if (bForced)
			{
				#ifdef _DEBUG
				lbRc = FALSE;
				#endif
			}
			else
			{
				*lpMode = s_dwMode;
				lbRc = TRUE;
			}
		}
	}

	if (!lbRc)
	{
		DWORD dwMode = 0;
		lbRc = GetConsoleMode(hConsoleHandle, &dwMode);
		*lpMode = dwMode;
		if (lbRc)
		{
			s_dwMode = dwMode;
			s_LastCheckTick = GetTickCount();
			s_hConHandle = hConsoleHandle;
		}
	}

	return lbRc;
}
Esempio n. 18
0
// GetConsoleWindow хукается, поэтому, для получения реального консольного окна
// можно дергать эту экспортируемую функцию
HWND WINAPI GetRealConsoleWindow()
{
	_ASSERTE(gfGetRealConsoleWindow);
	HWND hConWnd = gfGetRealConsoleWindow ? gfGetRealConsoleWindow() : NULL; //GetConsoleWindow();
#ifdef _DEBUG
	wchar_t sClass[64]; user->getClassNameW(hConWnd, sClass, countof(sClass));
	_ASSERTEX(hConWnd==NULL || isConsoleClass(sClass));
#endif
	return hConWnd;
}
Esempio n. 19
0
bool MSection::isLockedExclusive()
{
	if (!this || !mb_Exclusive)
		return false;
	DWORD nTID = GetCurrentThreadId();
	if (mn_LockedTID[0] != nTID)
		return false;
	_ASSERTEX(mn_LockedCount[0] > 0);
	return (mn_LockedCount[0] > 0);
}
Esempio n. 20
0
void AttachGuiWindow(HWND hOurWindow)
{
	_ASSERTEX(gbAttachGuiClient); // Уже должен был быть установлен?
	gnAttachMsgId = RegisterWindowMessageW(L"ConEmu:Attach2Gui");
	if (gnAttachMsgId)
	{
		DWORD nWndTID = GetWindowThreadProcessId(hOurWindow, NULL);
		ghAttachMsgHook = SetWindowsHookExW(WH_CALLWNDPROC, AttachGuiWindowCallback, NULL, nWndTID);

		// Поскольку аттач хорошо бы выполнять в той нити, в которой крутится окно - то через хук
		AttachMsgArg args = {gnAttachMsgId, 0, ghConEmuWnd, hOurWindow};
		LRESULT lRc = SendMessageW(hOurWindow, gnAttachMsgId, gnAttachMsgId, (LPARAM)&args);
		_ASSERTEX(args.Result == gnAttachMsgId);
		UNREFERENCED_PARAMETER(lRc);

		UnhookWindowsHookEx(ghAttachMsgHook);
		ghAttachMsgHook = NULL;
	}
}
Esempio n. 21
0
bool MSectionSimple::TryEnter()
{
	_ASSERTEX(mb_Initialized);
	BOOL brc = TryEnterCriticalSection(&m_S);
	if (!brc)
	{
		mn_LastError = GetLastError();
		return false;
	}
	return true;
}
Esempio n. 22
0
void CDefTermHk::OnAllocConsoleFinished()
{
	if (!gbPrepareDefaultTerminal || !this)
	{
		_ASSERTEX((gbPrepareDefaultTerminal && gpDefTerm) && "Must be called in DefTerm mode only");
		return;
	}

	if (!ghConWnd || !IsWindow(ghConWnd))
	{
		LogHookingStatus(L"OnAllocConsoleFinished: ghConWnd must be initialized already!");
		_ASSERTEX(FALSE && "ghConWnd must be initialized already!");
		return;
	}

	ReloadSettings();
	_ASSERTEX(isDefTermEnabled() && gbIsNetVsHost);

	if (!isDefTermEnabled())
	{
		// Disabled in settings or registry
		LogHookingStatus(L"OnAllocConsoleFinished: !isDefTermEnabled()");
		return;
	}

	// По идее, после AllocConsole окно RealConsole всегда видимо
	BOOL bConWasVisible = IsWindowVisible(ghConWnd);
	_ASSERTEX(bConWasVisible);
	// Чтобы минимизировать "мелькания" - сразу спрячем его
	ShowWindow(ghConWnd, SW_HIDE);
	LogHookingStatus(L"Console window was hidden");

	if (!StartConsoleServer(gnSelfPID, false, NULL))
	{
		if (bConWasVisible)
			ShowWindow(ghConWnd, SW_SHOW);
		LogHookingStatus(L"Starting attach server failed?");
	}
}
Esempio n. 23
0
BOOL MSectionLock::Lock(MSection* apS, BOOL abExclusive/*=FALSE*/, DWORD anTimeout/*=-1*/)
{
	if (!apS)
		return FALSE;
	if (mb_Locked && apS == mp_S && (abExclusive == mb_Exclusive || mb_Exclusive))
		return TRUE; // уже заблокирован //111126 - возвращался FALSE

	_ASSERTEX(!mb_Locked);
	mb_Exclusive = (abExclusive!=FALSE);
	mp_S = apS;
	mb_Locked = mp_S->Lock(mb_Exclusive, anTimeout);
	return mb_Locked;
}
Esempio n. 24
0
MSection::MSection()
{
	mn_TID = 0; mn_Locked = 0; mb_Exclusive = FALSE;
#ifdef _DEBUG
	mn_UnlockedExclusiveTID = 0;
#endif
	ZeroStruct(mn_LockedTID); ZeroStruct(mn_LockedCount);
	m_cs.Init();
	m_lock_cs.Init();
	mh_ReleaseEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	_ASSERTEX(mh_ReleaseEvent!=NULL);

	if (mh_ReleaseEvent) ResetEvent(mh_ReleaseEvent);
	mh_ExclusiveThread = NULL;
}
Esempio n. 25
0
BOOL MSectionLock::RelockExclusive(DWORD anTimeout/*=-1*/)
{
	if (!mp_S)
	{
		_ASSERTEX(mp_S!=NULL);
		return FALSE;
	}
	if (mb_Locked && mb_Exclusive)
		return TRUE;  // уже

	// Чистый ReLock делать нельзя. Виснут другие нити, которые тоже запросили ReLock
	Unlock();
	mb_Exclusive = TRUE;
	mb_Locked = mp_S->Lock(mb_Exclusive, anTimeout);
	return mb_Locked;
}
Esempio n. 26
0
MSectionLock::~MSectionLock()
{
	_ASSERTEX((mb_Locked==FALSE || mb_Locked==TRUE) && (mb_Exclusive==FALSE || mb_Exclusive==TRUE));
	if (mb_Locked)
	{
		DWORD nCurTID = GetCurrentThreadId();

		Unlock();

		#ifdef _DEBUG
		wchar_t szDbg[80];
		msprintf(szDbg, countof(szDbg), L"::~MSectionLock, TID=%u\n", nCurTID);
		DebugString(szDbg);
		#endif
		UNREFERENCED_PARAMETER(nCurTID);
	}
}
Esempio n. 27
0
void MSection::ThreadTerminated(DWORD dwTID)
{
	for (size_t i = 1; i < countof(mn_LockedTID); i++)
	{
		if (mn_LockedTID[i] == dwTID)
		{
			mn_LockedTID[i] = 0;

			if (mn_LockedCount[i] != 0)
			{
				_ASSERTEX(mn_LockedCount[i] == 0);
			}

			break;
		}
	}
}
Esempio n. 28
0
bool InitHooksKernel()
{
	HLOG1("InitHooksKernel",0);
	bool lbRc = false;

	HookItem HooksKernel[] =
	{
		/* ************************ */
		HOOK_ITEM_BY_NAME(OpenFileMappingW,		kernel32),
		HOOK_ITEM_BY_NAME(MapViewOfFile,		kernel32),
		HOOK_ITEM_BY_NAME(UnmapViewOfFile,		kernel32),
		/* ************************ */
		HOOK_ITEM_BY_NAME(SetEnvironmentVariableA,	kernel32),
		HOOK_ITEM_BY_NAME(SetEnvironmentVariableW,	kernel32),
		HOOK_ITEM_BY_NAME(GetEnvironmentVariableA,	kernel32),
		HOOK_ITEM_BY_NAME(GetEnvironmentVariableW,	kernel32),
		#if 0
		HOOK_ITEM_BY_NAME(GetEnvironmentStringsA,	kernel32),
		#endif
		HOOK_ITEM_BY_NAME(GetEnvironmentStringsW,	kernel32),
		/* ************************ */
		HOOK_ITEM_BY_NAME(GetSystemTime,			kernel32),
		HOOK_ITEM_BY_NAME(GetLocalTime,				kernel32),
		HOOK_ITEM_BY_NAME(GetSystemTimeAsFileTime,	kernel32),
		/* ************************ */
		HOOK_ITEM_BY_NAME(Beep,						kernel32),
		/* ************************ */
		{0}
	};

	if (InitHooks(HooksKernel) < 0)
		goto wrap;

	#if 0
	// Проверка, как реагирует на дубли
	HooksCommon[1].NewAddress = NULL;
	_ASSERTEX(FALSE && "Testing");
	InitHooks(HooksCommon);
	#endif

	lbRc = true;
wrap:
	HLOGEND1();

	return lbRc;
}
Esempio n. 29
0
BOOL WINAPI OnSetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode)
{
	//typedef BOOL (WINAPI* OnSetConsoleMode_t)(HANDLE hConsoleHandle, DWORD dwMode);
	ORIGINAL_KRNL(SetConsoleMode);
	BOOL lbRc = FALSE;

	#if 0
	if (!(dwMode & ENABLE_PROCESSED_OUTPUT))
	{
		_ASSERTEX((dwMode & ENABLE_PROCESSED_OUTPUT)==ENABLE_PROCESSED_OUTPUT);
	}
	#endif

	if (gbIsVimProcess)
	{
		if ((dwMode & (ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT)) != (ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT))
		{
			if (HandleKeeper::IsOutputHandle(hConsoleHandle))
			{
				dwMode |= ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT;
			}
			else
			{
				dwMode |= ENABLE_WINDOW_INPUT;
			}
		}
	}

	#ifdef _DEBUG
	if ((gnExeFlags & (caf_Cygwin1|caf_Msys1|caf_Msys2))
		&& (dwMode & ENABLE_PROCESSED_INPUT)
		&& !HandleKeeper::IsOutputHandle(hConsoleHandle))
	{
		//_ASSERTE(!(dwMode & ENABLE_PROCESSED_INPUT));
		wchar_t szLog[120];
		msprintf(szLog, countof(szLog), L"\r\n\033[31;40m{PID:%u} Process is enabling ENABLE_PROCESSED_INPUT\033[m\r\n", GetCurrentProcessId());
		//WriteProcessed2(szLog, lstrlen(szLog), NULL, wps_Error);
		szLog[0] = 0;
	}
	#endif

	lbRc = F(SetConsoleMode)(hConsoleHandle, dwMode);

	return lbRc;
}
Esempio n. 30
0
void CTabPanelWin::ShowToolsPane(bool bShow)
{
	if (bShow)
	{
		_ASSERTE(isMainThread());
		if (!IsToolbarCreated() && (CreateToolbar() != NULL))
		{
			REBARBANDINFO rbBand = {REBARBANDINFO_SIZE}; // не используем size, т.к. приходит "новый" размер из висты и в XP обламываемся

			rbBand.fMask  = RBBIM_SIZE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_ID | RBBIM_STYLE;
			rbBand.fStyle = RBBS_CHILDEDGE | RBBS_FIXEDSIZE | RBBS_VARIABLEHEIGHT;

			#if 0
			rbBand.fMask |= RBBIM_COLORS;
			rbBand.clrFore = RGB(255,255,255);
			rbBand.clrBack = RGB(0,0,255);
			#endif

			SIZE sz = {0,0};
			SendMessage(mh_Toolbar, TB_GETMAXSIZE, 0, (LPARAM)&sz);

			rbBand.wID        = rbi_ToolBar;
			rbBand.hwndChild  = mh_Toolbar;
			rbBand.cx = rbBand.cxMinChild = rbBand.cxIdeal = mn_LastToolbarWidth = sz.cx;
			rbBand.cyChild = rbBand.cyMinChild = rbBand.cyMaxChild = sz.cy + mn_ThemeHeightDiff;

			if (!SendMessage(mh_Rebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand))
			{
				DisplayLastError(_T("Can't initialize rebar (toolbar)"));
			}
		}
	}
	else
	{
		_ASSERTEX(!bShow);
		INT_PTR nPaneIndex = SendMessage(mh_Rebar, RB_IDTOINDEX, rbi_ToolBar, 0);
		if (nPaneIndex >= 0)
		{
			SendMessage(mh_Rebar, RB_DELETEBAND, nPaneIndex, 0);
			DestroyWindow(mh_Toolbar);
			mh_Toolbar = NULL;
		}
	}
}