최종보고서 SMT (System Monitoring Tool : 시스템자원모니터링툴 ) 팀명 : Point of C++ 팀장 : 한소라 (11학번) 팀원 : 이재익 (09학번) 한우영 (09학번) 김은지 (11학번) 지도교수 : 양정모교수님 - 1 -
목 차 1. 서론 1-1. 개발배경및목적... 3 1-2. 연구내용... 3 1-3. 개발환경... 3 2. 본론 2-1. 프로그램구성... 4 2-2. MEMORY 값측정함수... 4 2-3. CPU값측정함수... 5 2-4. 프로그램실행화면... 8 3. 결론 3-1. 결론및의견... 14 4. 부록 4-1. 소스코드... 15 4-2. 발표PPT자료... 22 4-3. 참고자료... 33-2 -
1. 서론 1-1 연구배경및목적 우리는현재어떤일이든컴퓨터를통해처리하고있고생활의거의대부분이컴퓨터와연관되어있다고생각합니다. 그런데최근각종악성코드로인해시스템자원을고갈시키는등의방법으로시스템의운영을방해하거나정보자료를훼손하여많은사용자들에게피해를주고있습니다. 따라서본프로젝트를통해시스템자원의과부하등시스템운영상태를실시간으로감시하고, 각종침해를실시간으로통제함으로써피해를최소화하고, 시스템의안정적인운영을도모하려고합니다. 더불어 MEMORY, CPU에관한시스템함수에대한학습을통해실력을쌓고체계적인진행을통해 C프로그램의전반적인학습으로프로그래밍실력의향상을목표에두고임할것입니다. 1-2 연구내용 우리의연구목적은실시간으로과다사용되고있는프로세스를검출하여시스템자원을통제하여시스템운영의피해를최소화하기위한프로그램인시스템모니터링툴 (System Monitoring Tool : SMT) 제작입니다. SMT에서는시스템함수인 GlobalMemoryStatusEx( ) 와 GetCpuUsage( ) 를사용하여시스템모니터링을실행합니다. 컴퓨터가동작하고 SMT를실행시켜시스템자원인 MEMORY, CPU의프로세스별사용량을모니터링하여사용량이 70% 이상으로과다사용이되고있는지를탐지합니다. 사용량이 70% 이상에해당되는프로세스를검출하여자동으로 Suspend하며, 사용자에게메시지박스와알림음을통해경보를하고해당하는프로세스의상세정보를출력합니다. 사용자에게해당프로세스를종료시킬것인지질의를통해사용자의의사를묻고, 계속실행할경우프로세스의 Suspend상태를풀어주고프로세스의과다사용을다시탐지합니다. 1-3 개발환경 - 운영체제 : Windows7 - 프로그래밍언어 : C/C++ - 개발도구 : Microsoft Visual Studio 2008/2010-3 -
2. 본론 2-1 프로그램구성 < 그림 1 > 시스템개요도 본시스템모니터링툴 (SMT) 은컴퓨터가동작하고 SMT를실행시켜시스템자원인 MEMORY, CPU의프로세스별사용량이 70% 으로과다사용이되고있는지를탐지합니다. 해당되는프로세스를검출하여자동으로 Suspend하며, 사용자에게메시지박스를통해경보를하고프로세스의상세정보를출력합니다. 사용자에게해당프로세스를종료시킬것인지질의를합니다. 계속실행할경우프로세스의 Suspend상태를풀어주고프로세스의과다사용을다시탐지합니다. 2-2 MEMORY 값측정함수 시스템의메모리값을얻어오기위하여 GlobalMemoryStatusEx( ) API를사용하였습니다. API 소개 GlobalMemoryStatusEx API는가상메모리, 페이지파일, 실제메모리 ( 물리메모리 ) 등의정보를얻고자할때사용합니다. 구조체는 MEMORYSTATUSEX가사용됩니다. - 4 -
API 선언 Public Dexlare Sub GlobalMemoryStatusEx Lib "kernel32"(lpbuffer As MEMORYSTATUSEX) 구조체선언 Public Type MEMORYSTATUSEX dwlength As Long 구조체의크기 dwmemoryload As Long 메모리의사용량 ( 백분율 ) ulltotalphys As Currency 실제메모리의총크기 ullavailphys As Currency 실제메모리의남은크기 ulltotalpagefile As Currency 페이지파일의총크기 ullavailpagefile As Currency 페이지파일의남은크기 ulltotalvirtual As Currency 가상메모리의총크기 ullavailvirtual As Currency 가상메모리의남은크기 ullavailextendedvirtual As Currency 확장된가상메모리의남은크기 설명 GlobalMemoryStatusEx( ) API를사용해얻어온값들의단위는메가바이트가아니므로, 단위를맞추기위해 102.4로나누고거기에 1000을곱한다음또다시 1024로나눕니다. 또, 구조체 MEMORYSTATUSEX 에서는각메모리의크기와사용가능한공간만을구할수있는데저두대를응용하여메모리사용량을구합니다. ( 메모리크기 - 사용가능한공간 ) GlobalMemoryStatus( ) API는메모리의크기가 4GB 이상이되면값이이상하게나온다고하여 GlobalMemoryStatusEx( ) API를사용하였습니다. 2-3 CPU 값측정함수 레지스트를통한 HKEY_PERPOMANCE_DATA 키에값을가져오는방법입니다. 실제보이지않는키이기 때문에 regedit 로해서 HKEY_PERFORMANCE_DATA 를조회할수는없습니다. HKEY_PERFORMANCE_DATA 에있는값들을통해서성능에관련된정보를획득할수있었습니다. 정의되는함수 LPBYTE GetPerformanceData(LPTSTR src); - 5 -
int GetCounterValue(const int& objid, const int& counterid, const char* instancename, PERF_DATA_BLOCK **datablock, LONGLONG &value); double GetCpuUsage(const char* process); 정의되는함수는총 3 개지만실제사용하는함수는 GetCpuUsage( ) 입니다. 다른함수는통계정보를얻 기위하여사용합니다. GetCpuUsage( ) 함수 GetCpuUsage( ) 함수를통해서 CPU 사용량을얻을수있습니다. GetCounterValue( ) 함수에의해서 HKEY_PERFORMANCE_DATA 키에있는원하는카운터객체 (PERF_COUNTER_BLOCK) 를얻을수있고, 그곳에서원하는값을얻을수있습니다. 이렇게얻은값을통해서 CPU사용율을계산할수있습니다. GetCounterValue( ) 함수 GetCounterValue( ) 함수는 HKEY_PERFORMANCE_DATA치에서원하는카운터객체를찾고거기에서을얻는것입니다. 사용되는인자가많습니다. 첫번째인자는찾는객체 ID이고두번째인자는찾고자하는카운터객체 ID이고세번째인자는찾고자하는인스턴스이름입니다. 네번째인자는성능데이터값 (PERF_DATA_BLOCK) 이저장되고다섯번째인자는카운트블록 (PERF_COUNTER_BLOCK) 의값이저장됩니다. 앞의세개인자는입력인자이고나머지두개인자는출력인자입니다. 반환값은에러가발생시 -1이반환되고성공이면 0이반환됩니다. GetCounterValue( ) 함수구조체 PERF_DATA_BLOCK PERF_OBJECT_TYPE PERF_COUNTER_DEFINITION PERF_INSTANCE_DEFINITION PERF_COUNTER_BLOCK - 6 -
< 그림 2 > 구조체의관계 기본적인객체는 PERF_DATA_BLOCK 에서시작됩니다. 그뒤로여러객체들이따라오는데각객체는 PERF_OBFECT_TYPE를헤더로갖습니다. 그리고각객체에는여러카운터객체가포함됩니다. 그리고각객체에인스턴스개수에따라서여러인스턴스객체가포함되어있습니다. PERF_DATA_BLOCK 에서다음객체 (PERF_OBJECT_TYPE) 를찾으려면 PERF_DATA_BLOCK 의 HeaderLength 만큼이동하면되고여러객체에서다음객체를찾으려면 PERF_OBJECT_TYPE 에서 TotalByteLength 만큼이동하면됩니다. 그리고각객체 (PERF_DATA_BLOCK) 에서카운터정의객체 (PERF_COUNTER_DEFINITION) 을찾으려면 PERF_DATA_BLOCK 에서 PERF+DATA_BLOCK 의 HeaderLength 만큼이동하면됩니다. 카운터객체가여러개가오는데다음카운터객체 (PERF_COUNTER_DEFINITION) 를찾으려면 PERF_COUNTER_DEFINITION 의 ByteLength만큼이동하면됩니다. 그리고다중인스턴스라면첫번째인스턴스객체 (PERF_INSTANCE_DEFINITION) 를찾으려면 PERF_OBJECT_TYPE 에서 PERF_OBJECT_TYPE 의 DefinitionLength 만큼이동하면됩니다. 그리고다음인스턴스객체를찾으려면 PERF_INSTANCE_DEFINITION 에서 PERF_INSTANCE_DEFINIRION 의 ByteLength 만큼이동하면 PERF_INSTANCE_DEFINITION 을얻을수있습니다. 다중객체가아니면간단합니다. 첫번째인스턴스객체 (PERF_INSTANCE_DEFINITION) 위치는앞에서구한 - 7 -
값으로가지면되고다음은 PERF_COUNTER_BLOCK 에서 ByteLength 만큼이동하면됩니다. GetPerformanceData( ) 함수 GetPerformanceData( ) 함수는레지스트리에있는 HKEY_PERFORMANCE_DATA 키에서원하는객체값을얻어오는것이다. 이함수는 GetCounterValue( ) 함수에비해서는간단합니다. 입력되는인자는원하는인스턴스객체명을받습니다. 반환되는값은 PERF_DATA_BLOCK 의포인터를반환합니다. 만약에러가발생한다면 NULL값이반환됩니다. 2-4 프로그램실행화면 CPU 및메모리실시간모니터링구현부분소스코드 // CPU 및메모리실시간모니터링소스 BOOL SystemMonitoring( ) { HANDLE hprocesssnap; HANDLE hprocess; PROCESSENTRY32 pe32; MEMORYSTATUSEX statex; statex.dwlength = sizeof ( statex ); GlobalMemoryStatusEx ( &statex ); PROCESS_MEMORY_COUNTERS pmc; DWORD Code = 0; int i=0, j=0, ProcessID, suspend; char * processname; DWORD dwpriorityclass; hprocesssnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); //32bit 인 process 의정보를가져옴. if( hprocesssnap == INVALID_HANDLE_VALUE ) { printerror( TEXT("CreateToolhelp32Snapshot (of processes)") ); return( FALSE ); pe32.dwsize = sizeof( PROCESSENTRY32 ); //pe23 사이즈초기화 if(!process32first( hprocesssnap, &pe32 ) ) { - 8 -
printerror( TEXT("Process32First") ); CloseHandle( hprocesssnap ); return( FALSE ); do { hprocess = OpenProcess( PROCESS_QUERY_INFORMATION // 프로세스의 Handle값을얻어옴. PROCESS_VM_READ, FALSE, pe32.th32processid ); dwpriorityclass = GetPriorityClass(hProcess); // 프로세스의우선순위값을반환. processname=pe32.szexefile; strtok(processname,"."); if(0==i%3 i==0) { \n\n\n\n\n\n=============================== =======================\n" ); System Monitoring Tool\n"); [Point of Challenge]\n"); 모니터링중입니다.\n"); \n\n\n\n\n\n=============================== =======================\n" ); else if(0==i%2) { \n\n\n\n\n\n=============================== =======================\n" ); System Monitoring Tool\n"); [Point of Challenge]\n"); 모니터링중입니다...\n"); \n\n\n\n\n\n=============================== =======================\n" ); else { \n\n\n\n\n\n=============================== =======================\n" ); System Monitoring Tool\n"); [Point of Challenge]\n"); 모니터링중입니다..\n"); \n\n\n\n\n\n=============================== =======================\n" ); int processid=0; CCpuUsage usagea; CCpuUsage usageb; - 9 -
for( j=0;j<2;j++ ) { int SystemWideCpuUsage = usagea.getcpuusage(); // 전체프로세스 CPU 사용량 int ProcessCpuUsageByName = usageb.getcpuusage( processname ); // 프로세스 CPU 사용량 Sleep( 250 ); if( ProcessCpuUsageByName > 70 ) { // 프로세스 CPU 점유율 70% 가넘었을때 ProcessID = pe32.th32processid; suspend = DebugActiveProcess(ProcessID); // 프로세스일시중지 printf("\a"); printf("\a"); printf("\a"); // 경고음 MessageBoxW( NULL, L"CPU점유율이최대 70% 가넘는프로세스가발견되었습니다.", L"Warning", 0 ); // 경고메세지 system("cls"); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); _tprintf( TEXT("\n PROCESS NAME : %s"), pe32.szexefile ); _tprintf( TEXT("\n Process ID : %u"), pe32.th32processid ); if( j==1 ) 전체프로세스 CPU 사용량 : %d", SystemWideCpuUsage); if( j==1 ) 프로세스 CPU 사용량 : %d", ProcessCpuUsageByName); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); 프로세스를중지하였습니다."); 프로세스를종료하시려면 1"); 다시되돌리시려면 2를입력해주세요."); scanf("%d",&suspend); if( suspend == 1 ) { KillProcess(processname,ProcessID); // 프로세스kill함수호출 printf(" 프로세스를종료하였습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); - 10 -
if( suspend == 2 ) { DebugActiveProcessStop(ProcessID); // 프로세스일시중지해제 printf(" 프로세스를원래대로되돌렸습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); if( GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)) ) { // 프로세스메모리정보구하는함수 if( (pmc.workingsetsize/div) > ((statex.ullavailphys/div)*0.75) ) { // 메모리점유율 70% 가넘었을때 ProcessID = pe32.th32processid; suspend = DebugActiveProcess(ProcessID); // 프로세스일시중지 printf("\a"); printf("\a"); printf("\a"); // 경고음 MessageBoxW( NULL, L" 메모리점유율이최대 70% 가넘는프로세스가발견되었습니다.", L"Warning", 0 );// 경고메세지 system("cls"); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); _tprintf( TEXT("\n PROCESS NAME : %s"), pe32.szexefile ); _tprintf( TEXT("\n Process ID : %u"), pe32.th32processid ); 최대작업메모리의크기 : %*d KB\n", WIDTH, statex.ulltotalphys/div); 프로세스의작업메모리크기 : %d KB\n", pmc.workingsetsize/div); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); 프로세스를중지하였습니다."); 프로세스를종료하시려면 1"); 다시되돌리시려면 2를입력해주세요."); scanf("%d",&suspend); if (suspend == 1) { KillProcess( processname, ProcessID ); // 프로세스kill함수호출 printf(" 프로세스를종료하였습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); - 11 -
if (suspend == 2) { DebugActiveProcessStop( ProcessID ); // 프로세스일시중지해제 printf(" 프로세스를원래대로되돌렸습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); CloseHandle(hProcess); // 프로세스의핸들을반환해주는함수 i++; system("cls"); while( Process32Next( hprocesssnap, &pe32 ) ) // 엔트리프로세스를읽고없을때까지계속읽음 CloseHandle( hprocesssnap ); // 스냅샷의핸들을반환해주는함수 return 0; 위의프로그램소스코드를실행하게되면메인화면이출력되고 0 을제외한다른값을입력시켜모니터링 을시작합니다. < 그림 3 > 프로그램메인화면 - 12 -
< 그림 4 > 프로그램모니터링화면 프로그램이프로세스별 CPU, MEMORY 의사용율을모니터링하면서과다사용을검출합니다. MEMORY, CPU 의프로세스별사용량이 70% 으로과다사용이확인되면알림을주고프로세스를종료를원하면프 로세스를종료시킵니다. < 그림 5 > 프로세스 Suspend 후질의화면 - 13 -
3. 결론 3-1 결론및기대효과 시스템자원모니터링툴을직접프로그램으로구현하는과정에서시스템함수에관한지식을습득하고메모리과부하프로그램을제작하여컴퓨터에직접영향을미치는위험성들을실험을통해프로그램구동원리를공부할수가있었으며원도우프로그래밍의다양한기법, 기술을학습하여좀더폭넓은기술개발역량을배량하였습니다. 프로젝트를진행하면서처음에는과연수업시간에배웠던모든것을활용해서우리가할수있을까라는의문점을갖으면서도계획을세우고끝까지해보려는노력과팀워크가힘을더해어려운것도잘해결할수있었습니다. - 14 -
4. 부록 4-1. 소스코드 //include파일및전처리기정의 #include "stdafx.h" #include <windows.h> #include <winuser.h> #include <tlhelp32.h> #include <tchar.h> #include <stdio.h> #include <string.h> #include <Psapi.h> #include <stdlib.h> #include "CpuUsage.h" #pragma comment( lib, "psapi" ) #define DIV 1024 #define WIDTH 7 // 함수정의 BOOL KillProcess( char* processname, int a ); // 프로세스kill 함수 BOOL SystemMonitoring( ); // 시스템모니터링함수 void printerror( TCHAR* msg ); //Error탐지함수 //main 함수 int main( void ) { int start; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + System Monitoring Tool +\n"); printf(" + Ver. 1.0 +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + [Point of Challenge] +\n"); printf(" + +\n"); printf(" + Han So ra +\n"); printf(" + Han Woo young +\n"); printf(" + Lee Jae ik +\n"); printf(" + Kim Eun ji +\n"); - 15 -
printf(" + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + +\n"); printf(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\n"); printf(" 계속하시려면아무키나입력하시오.( 종료 =0)"); scanf("%d",&start); if(start==0){system("cls"); printf(" 프로그램을종료합니다.\n"); exit(0); system("cls"); while( 1 ) { SystemMonitoring( ); return 0; // CPU 및메모리실시간모니터링소스 BOOL SystemMonitoring( ) { HANDLE hprocesssnap; HANDLE hprocess; PROCESSENTRY32 pe32; MEMORYSTATUSEX statex; statex.dwlength = sizeof ( statex ); GlobalMemoryStatusEx ( &statex ); PROCESS_MEMORY_COUNTERS pmc; DWORD Code = 0; int i=0, j=0, ProcessID, suspend; char * processname; DWORD dwpriorityclass; hprocesssnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); //32bit 인 process 의정보를가져옴. if( hprocesssnap == INVALID_HANDLE_VALUE ) { printerror( TEXT("CreateToolhelp32Snapshot (of processes)") ); return( FALSE ); pe32.dwsize = sizeof( PROCESSENTRY32 ); //pe23 사이즈초기화 - 16 -
if(!process32first( hprocesssnap, &pe32 ) ) { printerror( TEXT("Process32First") ); CloseHandle( hprocesssnap ); return( FALSE ); do { hprocess = OpenProcess( PROCESS_QUERY_INFORMATION // 프로세스의 Handle값을얻어옴. PROCESS_VM_READ, FALSE, pe32.th32processid ); dwpriorityclass = GetPriorityClass(hProcess); // 프로세스의우선순위값을반환. processname=pe32.szexefile; strtok(processname,"."); if(0==i%3 i==0) { \n\n\n\n\n\n=============================== =======================\n" ); System Monitoring Tool\n"); [Point of Challenge]\n"); 모니터링중입니다.\n"); \n\n\n\n\n\n=============================== =======================\n" ); else if(0==i%2) { \n\n\n\n\n\n=============================== =======================\n" ); System Monitoring Tool\n"); [Point of Challenge]\n"); 모니터링중입니다...\n"); \n\n\n\n\n\n=============================== =======================\n" ); else { \n\n\n\n\n\n=============================== =======================\n" ); System Monitoring Tool\n"); [Point of Challenge]\n"); 모니터링중입니다..\n"); \n\n\n\n\n\n=============================== =======================\n" ); int processid=0; - 17 -
CCpuUsage usagea; CCpuUsage usageb; for( j=0;j<2;j++ ) { int SystemWideCpuUsage = usagea.getcpuusage(); // 전체프로세스 CPU 사용량 int ProcessCpuUsageByName = usageb.getcpuusage( processname ); // 프로세스 CPU 사용량 Sleep( 250 ); if( ProcessCpuUsageByName > 70 ) { // 프로세스 CPU 점유율 70% 가넘었을때 ProcessID = pe32.th32processid; suspend = DebugActiveProcess(ProcessID); // 프로세스일시중지 printf("\a"); printf("\a"); printf("\a"); // 경고음 MessageBoxW( NULL, L"CPU점유율이최대 70% 가넘는프로세스가발견되었습니다.", L"Warning", 0 ); // 경고메세지 system("cls"); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); _tprintf( TEXT("\n PROCESS NAME : %s"), pe32.szexefile ); _tprintf( TEXT("\n Process ID : %u"), pe32.th32processid ); if( j==1 ) 전체프로세스 CPU 사용량 : %d", SystemWideCpuUsage); if( j==1 ) 프로세스 CPU 사용량 : %d", ProcessCpuUsageByName); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); 프로세스를중지하였습니다."); 프로세스를종료하시려면 1"); 다시되돌리시려면 2를입력해주세요."); scanf("%d",&suspend); if( suspend == 1 ) { KillProcess(processname,ProcessID); // 프로세스kill함수호출 printf(" 프로세스를종료하였습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); - 18 -
if( suspend == 2 ) { DebugActiveProcessStop(ProcessID); // 프로세스일시중지해제 printf(" 프로세스를원래대로되돌렸습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); if( GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)) ) { // 프로세스메모리정보구하는함수 if( (pmc.workingsetsize/div) > ((statex.ullavailphys/div)*0.75) ) { // 메모리점유율 70% 가넘었을때 ProcessID = pe32.th32processid; suspend = DebugActiveProcess(ProcessID); // 프로세스일시중지 printf("\a"); printf("\a"); printf("\a"); // 경고음 MessageBoxW( NULL, L" 메모리점유율이최대 70% 가넘는프로세스가발견되었습니다.", L"Warning", 0 );// 경고메세지 system("cls"); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); _tprintf( TEXT("\n PROCESS NAME : %s"), pe32.szexefile ); _tprintf( TEXT("\n Process ID : %u"), pe32.th32processid ); 최대작업메모리의크기 : %*d KB\n", WIDTH, statex.ulltotalphys/div); 프로세스의작업메모리크기 : %d KB\n", pmc.workingsetsize/div); _tprintf(text("\n\n\n\n\n\n\n=============================== ================" ) ); 프로세스를중지하였습니다."); 프로세스를종료하시려면 1"); 다시되돌리시려면 2를입력해주세요."); scanf("%d",&suspend); if (suspend == 1) { KillProcess( processname, ProcessID ); // 프로세스kill함수호출 printf(" 프로세스를종료하였습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); - 19 -
Sleep( 1000 ); if (suspend == 2) { DebugActiveProcessStop( ProcessID ); // 프로세스일시중지해제 printf(" 프로세스를원래대로되돌렸습니다.\n"); Sleep( 1000 ); printf(" 모니터링을다시시작합니다."); Sleep( 1000 ); CloseHandle(hProcess); // 프로세스의핸들을반환해주는함수 i++; system("cls"); while( Process32Next( hprocesssnap, &pe32 ) ) // 엔트리프로세스를읽고없을때까지계속읽음 CloseHandle( hprocesssnap ); // 스냅샷의핸들을반환해주는함수 return 0; BOOL KillProcess(char * processname,int ProcessID) { // 프로세스 kill 함수선언 HANDLE hprocesssnap = NULL; DWORD Return = FALSE; PROCESSENTRY32 pe32 = {0; int result; char *exe = ".exe"; strcat(processname,exe); char *Temp = pe32.szexefile; hprocesssnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if(hprocesssnap == INVALID_HANDLE_VALUE) return (DWORD)INVALID_HANDLE_VALUE; pe32.dwsize = sizeof(processentry32); if(process32first(hprocesssnap, &pe32)) { DWORD Code = 0; DWORD dwpriorityclass; do { HANDLE hprocess; hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32processid); dwpriorityclass = GetPriorityClass(hProcess); - 20 -
result=strcmp(temp, processname); //kill 할프로세스를찾음 if(result==0) { // 찾으면 kill if(terminateprocess(hprocess, 0)) GetExitCodeProcess(hProcess, &Code); else return GetLastError(); CloseHandle(hProcess); while(process32next(hprocesssnap, &pe32)); Return = TRUE; else Return = FALSE; DebugActiveProcessStop(ProcessID); // 프로세스일시중지해제 CloseHandle(hProcessSnap); return Return; void printerror( TCHAR* msg ) { DWORD enum; TCHAR sysmsg[256]; TCHAR* p; //Error 출력함수선언 enum = GetLastError( ); FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM FORMAT_MESSAGE_IGNORE_INSERTS, NULL, enum, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language sysmsg, 256, NULL ); p = sysmsg; while( ( *p > 31 ) ( *p == 9 ) ) ++p; do { *p-- = 0; while( ( p >= sysmsg ) && ( ( *p == '.' ) ( *p < 33 ) ) ); _tprintf( TEXT("\n WARNING: %s failed with error %d (%s)"), msg, enum, sysmsg ); //Error부분출력 - 21 -
4-2. 발표 PPT 자료 - 22 -
- 23 -
- 24 -
- 25 -
- 26 -
- 27 -
- 28 -
- 29 -
- 30 -
- 31 -
- 32 -
4-3. 참고자료 http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx (MSDN 코리아 ) http://ospace.tistory.com/195 (JaPa2 - 배우면배울수록더배울것이생긴다 ) http://blog.daum.net/01193780006/9747158 (Daum blog) - 33 -