標籤:share mem window ase pid max hot print 線程
原文:http://blog.csdn.net/qq78442761/article/details/54646010
當我們寫某些具有破壞性的程式時就需要對進程進行遍曆和提取ID
對於上述功能,我們先介紹幾個API
1.CreateToolhelp32Snapshout function
得到進程、模組或者線程的快照
文法如下:
[cpp] view plain copy
- HANDLE WINAPI CreateToolhelp32Snapshot(
- _In_ DWORD dwFlags,
- _In_ DWORD th32ProcessID
- );
第一個參數:快照中包含了系統的一部分,參數如下:
我們這裡用TH32CS_SNAPPROCESS
快照包含了系統裡面的所有進程。
第二個是關於 PROCESSENTRY32結構體
文法如下:
[cpp] view plain copy
- 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:進程裡面可執行檔的名字
下面是原始碼!部分函數沒有講解,但可以通過注釋或者字面意思可以瞭解
[cpp] view plain copy
- #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;
- }
運行結果如下
-
頂
-
1
-
踩
C/C++遍曆進程和進程ID的小工具