EnumProcessModules Function
獲得指定進程中所有模塊的句柄。
語法
BOOL WINAPI EnumProcessModules(in HANDLE hProcess,out HMODULE *lphModule,in DWORD cb,out LPDWORD lpcbNeeded);
參數
hProcess [傳入]
指定進程的句柄。
lphModule [傳出]
用來存放所有模塊句柄的數組。
cb [傳入]
lphModule參數所傳入的數組的大小,單位是字節。
lpcbNeeded [傳出]
要把所有模塊的句柄存放進lphModule參數所傳入的數組中,所需要的字節數。
返回值
如果函數執行成功,則返回值為非零。
如果函數執行失敗,則返回值為零。可以調用 GetLastError函數來獲得更多的錯誤信息。
備注
EnumProcessModules的設計,主要是為調試器和類似程序在必須獲取其它進程的模塊信息時使用的。如果目標進程的模塊列表已經損壞,或者尚未初始化,那么,EnumProcessModules可能會執行失敗,或者返回錯誤的信息。
建議使用數組來存放大批模塊句柄的值,因為,難以確定在你調用EnumProcessModules時,有多少模塊在當時的進程中。如果lphModule所傳遞的數組太小,以至於無法容納進程中的所有的模塊句柄,這點你可以從lpcbNeeded參數的值來判斷。如果lpcbNeeded比傳入的數組要大,請擴大數組並重新調用EnumProcessModules函數。
調用EnumProcessModules函數所枚舉的模塊數量,是lpcbNeeded參數的值除以HMODULE的大小,HMODULE的大小可以用sizeof來獲得。
有LOAD_LIBRARY_AS_DATAFILE標志時,EnumProcessModules函數無法檢索已加載的模塊句柄。有關詳細信息,請參閱LoadLibraryEx。
不要對本函數的任何返回值調用CloseHandle函數。這些返回的信息只是來自於一次快照,並沒有資源需要釋放。
如果在WOW64上運行的32位應用程序調用本函數,那它只能枚舉32位進程中的模塊。對於64位的進程,本函數將執行失敗,錯誤代碼是ERROR_PARTIAL_COPY (299)。
使用CreateToolhelp32Snapshot函數,對指定進程和堆棧、模塊,以及這些進程所使用的線程采取快照。
從Windows 7和Windows Server 2008 R2開始,Psapi.h為PSAPI函數建立了版本號。PSAPI的版本號影響程序在必須加載庫和調用本函數時所用的名字。
如果PSAPI_VERSION大於等於2,本函數將被定義為Psapi.h或者Kernel32.lib和Kernel32.dll中的K32EnumProcessModules。在PSAPI_VERSION為1時調用K32EnumProcessModules,本函數將被定義為在Psapi.h或者Psapi.lib和Psapi.dll封裝中的EnumProcessModulesas函數。
程序必須運行在較早版本的Windows,或者Windows 7和以后的版本上時,你總是可以使用EnumProcessModules函數。為保證符號的正確識別,請添加Psapi.lib到TARGETLIBS宏並且使用參數–DPSAPI_VERSION=1來編譯程序。在程序運行時動態加載Psapi.dll。
列舉進程的路徑
實現例子 :
void ShowProcess2()
{
DWORD processPID[MAX_NUM]; //保存進程ID
DWORD dwneed;
::EnumProcesses(processPID,sizeof(processPID),&dwneed);
int count = dwneed/sizeof(DWORD);
printf("總進程數為%dn",count);
HANDLE hProcess;
HMODULE hModule;
DWORD need;
DWORD nSize = 0;
wchar_t fileName[100] = {0};
for(int i=0; i<count; ++i)
{
hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,processPID[i]);
if(hProcess)
{
::EnumProcessModules(hProcess,&hModule,sizeof(hModule),&need);
::GetModuleFileNameExA(hProcess,hModule, (LPSTR)fileName,sizeof(fileName));
printf("%d %sn",i,fileName);
}
}
CloseHandle(hProcess);
CloseHandle(hModule);
}
{
DWORD processPID[MAX_NUM]; //保存進程ID
DWORD dwneed;
::EnumProcesses(processPID,sizeof(processPID),&dwneed);
int count = dwneed/sizeof(DWORD);
printf("總進程數為%dn",count);
HANDLE hProcess;
HMODULE hModule;
DWORD need;
DWORD nSize = 0;
wchar_t fileName[100] = {0};
for(int i=0; i<count; ++i)
{
hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,processPID[i]);
if(hProcess)
{
::EnumProcessModules(hProcess,&hModule,sizeof(hModule),&need);
::GetModuleFileNameExA(hProcess,hModule, (LPSTR)fileName,sizeof(fileName));
printf("%d %sn",i,fileName);
}
}
CloseHandle(hProcess);
CloseHandle(hModule);
}