Windows編程之模塊遍歷
PS: 主要扣代碼使用,直接滑動到最下面使用.
遍歷模塊需要幾個API,和一個結構體
1.創建進程快照
2.遍歷首次模塊
3.繼續下次遍歷
4.模塊信息結構體
API 分別是:
1.創建進程快照
HANDLE WINAPI CreateToolhelp32Snapshot( 進程快照API DWORD dwFlags, 遍歷的標志,表示你要遍歷什么(進程,模塊,堆...) DWORD th32ProcessID 遍歷的進程ID,如果為0,則是當前進程,如果不為0,則是創建指定進程的快照進行遍歷 );
注意,創建進程快照需要包含頭文件 Tlhelp32.h
返回值:
成功返回快照句柄
失敗返回 INVALID_HANDLE_VALUE
2.遍歷首次模塊.
BOOL WINAPI Module32First( HANDLE hSnapshot, 快照句柄 LPMODULEENTRY32 lpme 模塊信息結構體 );
模塊信息結構體
對我們有用的就是
dwSize 初始化結構體的大小
th32ProcessId 進程ID
szExeFile[MAX_PATH] 進程路徑
3.遍歷下一次進程
BOOL WINAPI Process32Next( HANDLE hSnapshot, 進程句柄 LPPROCESSENTRY32 lppe 進程信息結構體 );
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;
這個常用的也很多
模塊基址 模塊大小 模塊句柄 模塊名稱,以及模塊路徑等等.
兼容代碼,遍歷自己進程模塊(DLL)
#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) { /* 循環遍歷添加自己的額外代碼 */ bRet = Module32Next(hSnapshot,&mi); } return 0; }
兼容代碼,遍歷指定進程模塊
思路:
1.獲取你想要遍歷的進程ID (可以通過遍歷進程,也可以通過通過句柄獲得進程ID)
2.創建進程快照,第一個參數傳入遍歷模塊,第二個參數傳入你想要遍歷進程的ID
#include <stdio.h> #include <windows.h> #include <Tlhelp32.h> int main(int argc, char* argv[]) { HANDLE hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if (INVALID_HANDLE_VALUE == hProcessSnapshot) { return 0; } DWORD dwPid = 0; PROCESSENTRY32 pi; pi.dwSize = sizeof(PROCESSENTRY32); BOOL Ret = Process32First(hProcessSnapshot,&pi); while (Ret) { if (strcmp("QQ.exe",pi.szExeFile) == 0) { dwPid = pi.th32ProcessID; break; } Ret = Process32Next(hProcessSnapshot,&pi); } CloseHandle(hProcessSnapshot); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPid);//上面獲取了進程PID,下面使用即可. if (INVALID_HANDLE_VALUE == hSnapshot) { return 0; } MODULEENTRY32 mi; mi.dwSize = sizeof(MODULEENTRY32); //第一次使用必須初始化成員 BOOL bRet = Module32First(hSnapshot,&mi); while (bRet) { /* 循環遍歷添加自己的額外代碼 */ bRet = Module32Next(hSnapshot,&mi); } CloseHandle(hSnapshot); return 0; }