Win32API プロセスのスナップショットを取得する Process32First, Process32Next

プロセスのスナップショットを取得する


使用するAPI

  • CreateToolhelp32Snapshot

  • Process32First

  • Process32Next

  • CloseHandle

  • CreateToolhelp32Snapshot
    プロセスと、プロセスが使っているヒープ、モジュール、
    スレッドのスナップショットを作成します。
    
     HANDLE WINAPI CreateToolhelp32Snapshot(
      DWORD dwFlags,      
      DWORD th32ProcessID 
    );


    TH32CS_INHERITスナップショットのハンドルが継承可能であることを意味します。
    TH32CS_SNAPALLTH32CS_SNAPHEAPLIST、TH32CS_SNAPMODULE、TH32CS_SNAPPROCESS、 TH32CS_SNAPTHREAD のすべてを指定したのと同じことを意味します。
    TH32CS_SNAPHEAPLIST指定されたプロセスのヒープリストを、スナップショットに含めます。
    TH32CS_SNAPMODULE指定されたプロセスのモジュールリストを、スナップショットに含めます。
    TH32CS_SNAPPROCESSプロセスリストを、スナップショットに含めます。
    TH32CS_SNAPTHREADレッドリストを、スナップショットに含めます。

    参考:http://msdn.microsoft.com/ja-jp/library/cc428938.aspx



    PROCESSENTRY32構造体は、tlhelp32.h で以下のように定義されている

    typedef struct tagPROCESSENTRY32
    {
        DWORD   dwSize;
        DWORD   cntUsage;
        DWORD   th32ProcessID;          // this process
        ULONG_PTR th32DefaultHeapID;
        DWORD   th32ModuleID;           // associated exe
        DWORD   cntThreads;
        DWORD   th32ParentProcessID;    // this process's parent process
        LONG    pcPriClassBase;         // Base priority of process's threads
        DWORD   dwFlags;
        CHAR    szExeFile[MAX_PATH];    // Path
    } PROCESSENTRY32;
    typedef PROCESSENTRY32 *  PPROCESSENTRY32;
    typedef PROCESSENTRY32 *  LPPROCESSENTRY32;



    #include <windows.h>
    #include <tlhelp32.h>
    
    int main()
    {
    	HANDLE hSnapshot;
    	PROCESSENTRY32 entry;
    	
    	hSnapshot = CreateToolhelp32Snapshot(
    		TH32CS_SNAPPROCESS,
    		0
    		);
    
    	if (hSnapshot == INVALID_HANDLE_VALUE) {
    		return 1;
    	}
    
    	entry.dwSize = sizeof(PROCESSENTRY32);
    	
    	if (!Process32First(hSnapshot, &entry)) {
    		goto Exit;
    	}
    
    	do {
    		printf("ExeFile = %s\n", entry.szExeFile);
    	} while (Process32Next(hSnapshot, &entry));
    
    
    Exit:
    	CloseHandle(hSnapshot);
    
    	return 0;
    }