본문 바로가기
IT-개발,DB

[개발/MFC] 프로세스 죽이기

by SB리치퍼슨 2012. 4. 3.
프로세스 죽이기


Kernel32.dll 에 있는 ExitProcess()라는 함수에 대한 포인터를 얻고 이를
CreateRemoteThread()를 이용하여 프로세스를 호출하고 스스로 종료되게 하는 기능입니다.


BOOL SafeTerminateProcess(HANDLE hProcess, UNIT uExitCode)
{
DWORD dwTID, dwCode, dwErr = 0;
HANDLE hProcessDup = INVALID_HANDLE_VALUE;
HANDLE hRT = NULL;
HINSTANCE hKernel = GetModule Handle("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;
pfnExitProc = GetProcAddress(hKernel, "ExitProcess");
hRT = CreateRemoteThread((bDup) ? hProcessDup : hProcess,
NULL,
0,
(LPTHREAD_START_ROUTINE) pfnExitProc,
(PVOID) uExitCode, 0, &dwTID);

if (hRT == NULL) dwErr = GetLastError();
}
else
{
dwErr = ERROR_PROCESS_ABORTED;
}

if (hRT)
{
WaitForSingleObject((bDup) ? hProcessDup : hProcess, INFINITE);
Closehandle(hRT);
bSuccess = TRUE;
}

if (bDup)
CloseHandle(hProcessDup);
if (! bSuccess)
SetLastError(dwErr);

return bSuccess;
}


 

반응형

댓글