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; }
bool AttachServerConsole() { bool lbAttachRc = false; DWORD nErrCode; HWND hCurCon = GetRealConsoleWindow(); if (hCurCon == NULL && gnServerPID != 0) { // функция есть только в WinXP и выше AttachConsole_t _AttachConsole = GetAttachConsoleProc(); if (_AttachConsole) { lbAttachRc = (_AttachConsole(gnServerPID) != 0); if (!lbAttachRc) { nErrCode = GetLastError(); _ASSERTE(nErrCode==0 && lbAttachRc); } } } return lbAttachRc; }