1. 程式人生 > 其它 >[Windows程式設計]模組遍歷

[Windows程式設計]模組遍歷

模組遍歷

整體思路

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;
}