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);
}


References