bool JobbedProcessManager::terminate(unsigned code) { if (hProcess) { if (!TerminateProcess(hProcess, code)) throw WindowsException("TerminateProcess"); } return false; }
bool JobbedProcessManager::spawn() { HANDLE handle; STARTUPINFO si = {sizeof(STARTUPINFO), 0}; PROCESS_INFORMATION pi; if (!szUsername) return false; if (!CreatePipe(&si.hStdInput, &handle, nullptr, 0)) throw WindowsException("CreatePipe stdin"); hStdin = handle; if (!CreatePipe(&handle, &si.hStdOutput, nullptr, 0)) throw WindowsException("CreatePipe stdout"); hStdout = handle; if (!CreatePipe(&handle, &si.hStdError, nullptr, 0)) throw WindowsException("CreatePipe stderr"); hStderr = handle; si.dwFlags |= STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; if (!CreateProcessWithLogonW(szUsername, L".", szPassword, 0, szExecutable, szCmdLine, NORMAL_PRIORITY_CLASS | CREATE_SUSPENDED | CREATE_BREAKAWAY_FROM_JOB | CREATE_UNICODE_ENVIRONMENT, szEnvBlock, szDirectory, &si, &pi)) throw WindowsException("CreateProcessWithLogonW"); CloseHandle(si.hStdInput); CloseHandle(si.hStdOutput); CloseHandle(si.hStdError); hProcess = pi.hProcess; if (!(handle = SearchForJobByService(hProcess, L"seclogon"))) throw WindowsException("Failed to find job", 0); hJob = handle; if (!SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &extLimits, sizeof extLimits)) throw WindowsException("SetInformationJobObject JobObjectExtendedLimitInformation"); if (!SetInformationJobObject(hJob, JobObjectBasicUIRestrictions, &uiLimits, sizeof uiLimits)) throw WindowsException("SetInformationJobObject JobObjectBasicUIRestrictions"); LARGE_INTEGER liFreq; QueryPerformanceFrequency(&liFreq); qpc_freq = 1.0 / liFreq.QuadPart; QueryPerformanceCounter(&liStart); ResumeThread(pi.hThread); CloseHandle(pi.hThread); if (!(handle = CreateThread(nullptr, 0, s_ShockerProc, this, 0, nullptr))) throw WindowsException("CreateThread"); hShocker = handle; return true; }
bool JobbedProcessManager::wait(DWORD time) { switch (WaitForSingleObject(hProcess, time)) { case WAIT_OBJECT_0: return true; case WAIT_FAILED: throw WindowsException("WaitForSingleObject"); default: return false; } }
bool ListView::InsertColumn(const TCHAR* szText, const UINT iWidth, const UINT iSubItem) { EmptyStruct<LVCOLUMN> oColumn; // Set properties oColumn.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; oColumn.pszText = const_cast<TCHAR*>(szText); oColumn.cx = iWidth; oColumn.iSubItem = iSubItem; // Insert if (SendMessage(LVM_INSERTCOLUMN, iSubItem, reinterpret_cast<LPARAM>(&oColumn)) == -1) throw WindowsException(HERE, TEXT("Unable to insert column")); return true; }
DWORD JobbedProcessManager::return_code() { DWORD out; if (!GetExitCodeProcess(hProcess, &out)) throw WindowsException("GetExitCodeProcess"); return out; }