Windows_/Windows_Source

프로세스 리스트 출력, 강제 종료 소스

sosal 2014. 7. 24. 01:00
반응형

/*

 * http://sosal.kr/

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