Windows에서 프로세스를 강제 종료하려면 TerminateProcess() API를 사용하면 된다.
그런데 Windows NT 계열에서 TerminateProcess()를 사용하려면 PROCESS_TERMINATE 접근 권한을 가지는 프로세스 핸들이 필요하다.
OpenProcess()로 PROCESS_TERMINATE 접근 권한의 프로세스 핸들을 얻을 수 있는데 High integrity level 이상의 프로세스는 그 전에 먼저 SeDebugPrivilege 권한을 획득해야 한다.
따라서 프로세스를 종료하기 위한 절차는 다음과 같다.
1. 현재 프로세스의 권한을 변경하기 위한 액세스 토큰의 핸들을 가져온다.
OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken)
2. 액세스 토큰에 SeDebugPrivilege 권한을 추가한다.
SetPrivilege(hToken, SE_DEBUG_NAME, TRUE);
SetPrivilege() - 액세스 토근의 권한을 변경하기 위한 함수
3. 원하는 윈도우를 찾아서 프로세스 ID를 가져온다.
HWND hWnd = FindWindow(_T("종료시킬 윈도우"), NULL);
if (!hWnd)
return 1;
DWORD nProcessId;
GetWindowThreadProcessId(hWnd, &nProcessId);
4. 프로세스 ID로 PROCESS_TERMINATE의 접근 권한을 가지는 프로세스 핸들을 얻고 종료시킨다.
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, nProcessId);
if (hProcess)
{
TerminateProcess(hProcess, -1);
CloseHandle(hProcess);
}
5. 액세스 토큰에서 SeDebugPrivilege 권한을 제거하고 액세스 토큰 핸들을 닫는다.
SetPrivilege(hToken, SE_DEBUG_NAME, FALSE);
CloseHandle(hToken);
'개발' 카테고리의 다른 글
Visual C++로 XPCOM 컴포넌트 만드는 방법 (2) | 2007.07.19 |
---|---|
COM 인터페이스 포인터를 서로 다른 Apartment로 전달하기 (0) | 2007.06.27 |
투명 이미지 그리기(MaskBlt, TransparentBlt) (1) | 2007.04.03 |
메모리 DC를 이용한 더블 버퍼링 (0) | 2007.03.31 |
MFC의 CPropertySheet, CPropertyPage에서 디자인 깨지는 문제 (1) | 2007.02.28 |
댓글