當我們寫某些具有破壞性的程式時就需要對進程進行遍曆和提取ID
對於上述功能,我們先介紹幾個API
1.CreateToolhelp32Snapshout function
得到進程、模組或者線程的快照
文法如下:
HANDLE WINAPI CreateToolhelp32Snapshot( _In_ DWORD dwFlags, _In_ DWORD th32ProcessID );
第一個參數:快照中包含了系統的一部分,參數如下:
我們這裡用TH32CS_SNAPPROCESS
快照包含了系統裡面的所有進程。
第二個是關於 PROCESSENTRY32結構體
文法如下:
typedef struct tagPROCESSENTRY32 { DWORD dwSize; DWORD cntUsage; DWORD th32ProcessID; ULONG_PTR th32DefaultHeapID; DWORD th32ModuleID; DWORD cntThreads; DWORD th32ParentProcessID; LONG pcPriClassBase; DWORD dwFlags; TCHAR szExeFile[MAX_PATH]; } PROCESSENTRY32, *PPROCESSENTRY32;
這描述了一個入口,這個入口是當快照被調用時系統地址空間裡面的進程被讀取。
這裡只介紹szExeFile[MAX_PATH]和
th32ParentProcessID:這是建立進程後的進程的標識(父進程)
szExeFile:進程裡面可執行檔的名字
下面是原始碼!部分函數沒有講解,但可以通過注釋或者字面意思可以瞭解
#include <Windows.h> #include <stdio.h> #include <TlHelp32.h> int main() { HANDLE hProceessnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProceessnap == INVALID_HANDLE_VALUE) { printf_s("建立進行快照失敗\n"); return -1; } else { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); BOOL hProcess = Process32First(hProceessnap, &pe32); char buff[1024]; while (hProcess) { wsprintf(buff, "進程名:%s--------------------進程ID:%d", pe32.szExeFile, pe32.th32ParentProcessID); printf_s("%s\n", buff); memset(buff, 0x00, 1024); hProcess = Process32Next(hProceessnap, &pe32); } } CloseHandle(hProceessnap); return 0; }
運行結果如下
以上就是C/C++遍曆進程和進程ID的小工具的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!