CreateToolhelp32Snapshot 建立系統快照Process32First/Next 遍歷進程,資訊於 PROCESSENTRY32CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid) 針對特定進程建立模組快照Module32First/Next 遍歷模組,資訊於 MODULEENTRY32HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
PROCESS_MEMORY_COUNTERS pmc;
pfGetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc));
BOOL CEmuteFileDlg::GetProcessModule(DWORD dwPID, DWORD dwModuleID,
LPMODULEENTRY32 lpMe32, DWORD cbMe32) {
BOOL bRet = FALSE, bFound = FALSE;
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
if (hModuleSnap == INVALID_HANDLE_VALUE) return FALSE;
MODULEENTRY32 me32 = {0}; me32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hModuleSnap, &me32)) {
do {
if (me32.th32ModuleID == dwModuleID) {
CopyMemory(lpMe32, &me32, cbMe32);
bFound = TRUE;
}
} while (!bFound && Module32Next(hModuleSnap, &me32));
bRet = bFound;
}
CloseHandle(hModuleSnap);
return bRet;
}
BOOL EnableDebugPrivilege() {
HANDLE hToken; BOOL fOk = FALSE;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) {
TOKEN_PRIVILEGES tp = {1};
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
fOk = (GetLastError() == ERROR_SUCCESS);
CloseHandle(hToken);
}
return fOk;
}
作者提到:「很想知道怎麼獲取進程的執行緒模組名稱」。ToolHelp32 可透過 TH32CS_SNAPTHREAD 遍歷執行緒 (THREADENTRY32),但執行緒本身無模組概念;需結合模組快照與執行緒堆疊回溯 (StackWalk) 才能分析執行緒所在模組,屬進階除錯技術範疇。