[Windows程式設計]模組遍歷
阿新 • • 發佈:2021-10-14
模組遍歷
整體思路
1.建立程序快照
2.遍歷首次模組
3.繼續下次遍歷
4.模組資訊結構體
相關API的呼叫
- 建立程序快照API
HANDLE WINAPI CreateToolhelp32Snapshot( 程序快照API
DWORD dwFlags, 遍歷的標誌,表示你要遍歷什麼(程序,模組,堆...)
DWORD th32ProcessID 遍歷的程序ID,如果為0,則是當前程序,如果不為0,則是建立指定程序的快照進行遍歷
);
成功返回快照地址,失敗返回(INVALID_HANDLE_VALUE)-1
- 遍歷第一個模組
點開檢視 LPMODULEENTRY32 結構體
typedef struct tagMODULEENTRY32 {
DWORD dwSize; 大小,第一次使用必須初始化
DWORD th32ModuleID; 程序模組識別符號
DWORD th32ProcessID; 程序ID
DWORD GlblcntUsage; 全域性模組使用次數
DWORD ProccntUsage; 模組的引用計數
BYTE * modBaseAddr; 模組的基址
DWORD modBaseSize; 模組的大小
HMODULE hModule; 模組的控制代碼
TCHAR szModule[MAX_MODULE_NAME32 + 1]; 模組名稱的字串
TCHAR szExePath[MAX_PATH]; 模組路徑字串
} MODULEENTRY32;
typedef MODULEENTRY32 *PMODULEENTRY32;
BOOL WINAPI Module32First(
HANDLE hSnapshot, 快照控制代碼
LPMODULEENTRY32 lpme 模組資訊結構體
);
- 獲取下一個模組
BOOL WINAPI Process32Next(
HANDLE hSnapshot, 程序控制代碼
LPPROCESSENTRY32 lppe 程序資訊結構體
);
實現
#include <stdio.h> #include <windows.h> #include <Tlhelp32.h> int main(int argc, char* argv[]) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0); if (INVALID_HANDLE_VALUE == hSnapshot) { return 0; } MODULEENTRY32 mi; mi.dwSize = sizeof(MODULEENTRY32); //第一次使用必須初始化成員 BOOL bRet = Module32First(hSnapshot,&mi); while (bRet) { printf("%s",mi->szExePath); //模組名 bRet = Module32Next(hSnapshot,&mi); } return 0; }