프로세스 리스트 출력, 강제 종료 소스
/*
* made by so_Sal
*/
/*
* 아래 프로그램 예제 소스에서 쓰이는 함수들은
* LINK_ 에 모두 정리되어 있습니다.
* Process Name을 사용자로부터 입력받아
* 프로세스를 강제-종료하는 프로그램입니다.
* /
#include<stdio.h>
#include<locale.h>
#include<string.h>
#include<stdlib.h>
#include<tchar.h>
#include<windows.h>
#include<tlhelp32.h>
void ListProcessInfo(void);
void KillProcess(TCHAR* TargetProcess);
int _tmain(int argc, TCHAR* argv[]){
TCHAR TargetProcess[BUFSIZ];
//종료를 원하는 프로세스의 이름을 입력받을 버퍼
while(1){
ListProcessInfo(); //프로세스 목록을 출력하는 함수
_tprintf( _T("Input TargetProcess name (End :: EXIT) :: "));
_tscanf( _T("%s"),TargetProcess);
_tprintf(_T("input :: %s"), TargetProcess);
if(_tcscmp(TargetProcess, _T("EXIT")) == 0)
exit(EXIT_SUCCESS);
KillProcess(TargetProcess);
//프로세스를 Kill 하는 함수.
//ProcessName이 매개변수로 들어갑니다.
}
return 0;
}
//아래 함수는 프로세스 목록 출력 함수입니다.
void ListProcessInfo(void){
HANDLE hProcessSnap =
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//현재 프로세스의 상태를 사진찍듯 스냅샷~!
if(hProcessSnap == INVALID_HANDLE_VALUE){
_tprintf( _T("CreateToolhelp32Snapshot error \n"));
exit(EXIT_FAILURE);
}
PROCESSENTRY32 pe32; //프로세스 정보 저장 구조체
pe32.dwSize = sizeof(PROCESSENTRY32);
if( !Process32First(hProcessSnap, &pe32)){
_tprintf( _T("Process32First error ! \n"));
CloseHandle(hProcessSnap);
return;
}
//Process32First 함수로 부터, 모든 프로세스의 어머니격인
//System Process의 정보를 받아옵니다
_tprintf(_T("\t[Process name] \t[PID]\t[PPID]\t[ThreadID] \n"));
do{ //do~while() 구문
_tprintf(_T("%25s %8d %8d %8d \n"),
pe32.szExeFile,pe32.th32ProcessID, pe32.th32ParentProcessID,pe32.cntThreads);
} while(Process32Next(hProcessSnap,&pe32));
//Process32Next로 얻어온 프로세스 정보들을 모두 출력합니다.
return;
}
//아래는 프로세스를 Kill 하는 함수입니다.
//프로세스를 찾기 전까지 ListProcessInfo()와
//거의 같습니다.
void KillProcess(TCHAR* TargetProcess){
//매개변수로 Kill 하려는 프로세스의 이름을 가져옴
HANDLE hProcessSnap =
CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);
if( hProcessSnap == INVALID_HANDLE_VALUE){
_tprintf( _T("CreateToolhelp32Snapshot error! \n"));
return;
}
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
if(!Process32First(hProcessSnap, &pe32)){
_tprintf(_T("Process32First error ! \n"));
CloseHandle(hProcessSnap);
return;
}
HANDLE hProcess = NULL;
BOOL isKill = FALSE;
do { //do~while() 구문입니다. Process32Next 함수로 계속 반복
if(_tcscmp(pe32.szExeFile, TargetProcess) == 0)
hProcess = OpenProcess(
PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
// 사용자가 Kill을 원하는 프로세스의 이름 입력시
// 같은 정보를 가진 프로세스를 찾았다면
// OpenProcess를 이용해 핸들을 가져옵니다.
if(hProcess != NULL){
TerminateProcess(hProcess, -1);
//핸들이 정상적이라면..! 죽여버립니다. ㅠㅠ
isKill = TRUE;
CloseHandle(hProcess);
break;
}
} while( Process32Next(hProcessSnap, &pe32) );
CloseHandle(hProcessSnap);
if(isKill == FALSE)
_tprintf( _T("Kill process fail. Try again! \n"));
}