사용자 도구

사이트 도구


kb:windowstoolhelpapi

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:windowstoolhelpapi [2014/11/09 20:46] (현재)
줄 1: 줄 1:
 +====== Tool Help API ======
 +Tool Help API들은 시스템 상에서 실행 중인 프로세스 및 스레드의 목록을 얻어내기 위한 WIN32 API들이다.
 +
 +
 +====== 프로세스 목록 알아내기 ======
 +<code cpp>
 +#include <​windows.h>​
 +#include <​tlhelp32.h>​
 +#include <​stdio.h>​
 +
 +BOOL GetProcessList () 
 +
 +    HANDLE ​        ​hProcessSnap = NULL; 
 +    BOOL           ​bRet ​     = FALSE; ​
 +    PROCESSENTRY32 pe32      = {0}; 
 + 
 +    //  Take a snapshot of all processes in the system. ​
 +
 +    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,​ 0); 
 +
 +    if (hProcessSnap == INVALID_HANDLE_VALUE) ​
 +        return (FALSE); ​
 + 
 +    //  Fill in the size of the structure before using it. 
 +
 +    pe32.dwSize = sizeof(PROCESSENTRY32); ​
 + 
 +    //  Walk the snapshot of the processes, and for each process, ​
 +    //  display information. ​
 +
 +    if (Process32First(hProcessSnap,​ &​pe32)) ​
 +    { 
 +        DWORD         ​dwPriorityClass; ​
 +        BOOL          bGotModule = FALSE; ​
 +        MODULEENTRY32 me32       = {0}; 
 + 
 +        do 
 +        { 
 +            bGotModule = GetProcessModule(pe32.th32ProcessID, ​
 +                pe32.th32ModuleID,​ &me32, sizeof(MODULEENTRY32)); ​
 +
 +            if (bGotModule) ​
 +            { 
 +                HANDLE hProcess; ​
 + 
 +                // Get the actual priority class. ​
 +                hProcess = OpenProcess (PROCESS_ALL_ACCESS, ​
 +                    FALSE, pe32.th32ProcessID); ​
 +                dwPriorityClass = GetPriorityClass (hProcess); ​
 +                CloseHandle (hProcess); ​
 +
 +                // Print the process'​s information. ​
 +                printf( "​\nPriority Class Base\t%d\n", ​
 +                    pe32.pcPriClassBase); ​
 +                printf( "​PID\t\t\t%d\n",​ pe32.th32ProcessID);​
 +                printf( "​Thread Count\t\t%d\n",​ pe32.cntThreads);​
 +                printf( "​Module Name\t\t%s\n",​ me32.szModule);​
 +                printf( "Full Path\t\t%s\n\n",​ me32.szExePath);​
 +            } 
 +        } 
 +        while (Process32Next(hProcessSnap,​ &​pe32)); ​
 +        bRet = TRUE; 
 +    } 
 +    else 
 +        bRet = FALSE; ​   // could not walk the list of processes ​
 + 
 +    // Do not forget to clean up the snapshot object. ​
 +
 +    CloseHandle (hProcessSnap); ​
 +    return (bRet); ​
 +}
 +</​code>​
 +
 +CreateProcess 함수와 조합하면,​ 어떤 프로세스가 실행되고 있는지 검사해서,​ 없다면 실행하는 데몬 프로그램 같은 것도 만들 수 있을 것이다.
 +
 +
 +====== 프로세스 내의 스레드 목록 알아내기 ======
 +<code cpp>
 +#include <​windows.h>​
 +#include <​tlhelp32.h>​
 +#include <​stdio.h>​
 +
 +BOOL RefreshThreadList (DWORD dwOwnerPID) ​
 +
 +    HANDLE ​       hThreadSnap = NULL; 
 +    BOOL          bRet        = FALSE; ​
 +    THREADENTRY32 te32        = {0}; 
 + 
 +    // Take a snapshot of all threads currently in the system. ​
 +
 +    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,​ 0); 
 +    if (hThreadSnap == INVALID_HANDLE_VALUE) ​
 +        return (FALSE); ​
 + 
 +    // Fill in the size of the structure before using it. 
 +    te32.dwSize = sizeof(THREADENTRY32); ​
 + 
 +    // Walk the thread snapshot to find all threads of the process. ​
 +    // If the thread belongs to the process, add its information ​
 +    // to the display list.
 + 
 +    if (Thread32First(hThreadSnap,​ &​te32)) ​
 +    { 
 +        do 
 +        { 
 +            if (te32.th32OwnerProcessID == dwOwnerPID) ​
 +            { 
 +                printf( "​\nTID\t\t%d\n",​ te32.th32ThreadID); ​
 +                printf( "Owner PID\t%d\n",​ te32.th32OwnerProcessID); ​
 +                printf( "Delta Priority\t%d\n",​ te32.tpDeltaPri); ​
 +                printf( "Base Priority\t%d\n",​ te32.tpBasePri); ​
 +            } 
 +        } 
 +        while (Thread32Next(hThreadSnap,​ &​te32)); ​
 +        bRet = TRUE; 
 +    } 
 +    else 
 +        bRet = FALSE; ​         // could not walk the list of threads ​
 + 
 +    // Do not forget to clean up the snapshot object. ​
 +    CloseHandle (hThreadSnap); ​
 +    return (bRet); ​
 +}
 +</​code>​
 +
 +
 +====== 프로세스를 구성하는 모듈들 알아내기 ======
 +<code cpp>
 +#include <​windows.h>​
 +#include <​tlhelp32.h>​
 +
 +BOOL GetProcessModule (DWORD dwPID, DWORD dwModuleID, ​
 +     ​LPMODULEENTRY32 lpMe32, DWORD cbMe32) ​
 +
 +    BOOL          bRet        = FALSE; ​
 +    BOOL          bFound ​     = FALSE; ​
 +    HANDLE ​       hModuleSnap = NULL; 
 +    MODULEENTRY32 me32        = {0}; 
 + 
 +    // Take a snapshot of all modules in the specified process. ​
 +    hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,​ dwPID); ​
 +    if (hModuleSnap == INVALID_HANDLE_VALUE) ​
 +        return (FALSE); ​
 + 
 +    // Fill the size of the structure before using it. 
 +    me32.dwSize = sizeof(MODULEENTRY32); ​
 + 
 +    // Walk the module list of the process, and find the module of 
 +    // interest. Then copy the information to the buffer pointed ​
 +    // to by lpMe32 so that it can be returned to the caller. ​
 +
 +    if (Module32First(hModuleSnap,​ &​me32)) ​
 +    { 
 +        do 
 +        { 
 +            if (me32.th32ModuleID == dwModuleID) ​
 +            { 
 +                CopyMemory (lpMe32, &me32, cbMe32); ​
 +                bFound = TRUE; 
 +            } 
 +        } 
 +        while (!bFound && Module32Next(hModuleSnap,​ &​me32)); ​
 + 
 +        bRet = bFound; ​  // if this sets bRet to FALSE, dwModuleID ​
 +                         // no longer exists in specified process ​
 +    } 
 +    else 
 +        bRet = FALSE; ​          // could not walk module list 
 + 
 +    // Do not forget to clean up the snapshot object. ​
 +    CloseHandle (hModuleSnap); ​
 +    return (bRet); ​
 +}
 +</​code>​
 +
 +====== 링크 ======
 +  * [[http://​msdn.microsoft.com/​library/​default.asp?​url=/​library/​en-us/​perfmon/​base/​tool_help_library.asp?​frame=true | MSDN > Tool Help Library]]
  
kb/windowstoolhelpapi.txt · 마지막으로 수정됨: 2014/11/09 20:46 (바깥 편집)