#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