1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <Windows.h> BOOL SafeTerminateProcess( HANDLE hProcess, UINT uExitCode) { DWORD tid, dwCode, dwErr = 0; HANDLE hProcessDup = INVALID_HANDLE_VALUE; HANDLE hRemoteThread = NULL; HINSTANCE hKernel = GetModuleHandleA( "Kernel32" ); BOOL bSuccess = FALSE; BOOL bDup = DuplicateHandle(GetCurrentProcess(), hProcess, GetCurrentProcess(), &hProcessDup, PROCESS_ALL_ACCESS, FALSE, 0); if (GetExitCodeProcess((bDup) ? hProcessDup : hProcess, &dwCode) && (dwCode == STILL_ACTIVE)) { FARPROC pfnExitProc = GetProcAddress(hKernel, "ExitProcess" ); hRemoteThread = CreateRemoteThread((bDup) ? hProcessDup : hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pfnExitProc, ( PVOID )uExitCode, 0, &tid); if (hRemoteThread == NULL) dwErr = GetLastError(); } else { dwErr = ERROR_PROCESS_ABORTED; } if (hRemoteThread) { WaitForSingleObject((bDup) ? hProcessDup : hProcess, INFINITE); CloseHandle(hRemoteThread); bSuccess = TRUE; } if (bDup) CloseHandle(hProcessDup); if (!bSuccess) SetLastError(dwErr); return bSuccess; } void main() { PROCESS_INFORMATION pi = { 0 }; STARTUPINFOA si = { sizeof (STARTUPINFOA) }; CreateProcessA(NULL, "notepad.exe" , NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); Sleep(1000); SafeTerminateProcess(pi.hProcess, 1); } |
[VC++] SafeTerminateProcess
2017. 8. 31. 16:50