/*
* 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"));
}
'Windows_ > Windows_Source' 카테고리의 다른 글
| Windows :: 스레드 생성 함수와 예제 // CreateThread _beginthreadex (0) | 2014.07.24 | 
|---|---|
| Windows :: 환경변수와 환경변수 상속 (0) | 2014.07.24 | 
| CreateProcess 함수 예제 소스코드 (1) | 2014.07.24 |