visual-c++之WinCE : How can I determine the module that contains a code address

me-sa 阅读:17 2024-11-24 20:56:43 评论:0

我写了一个涉及 OpenProcess、EnumProcessModules、GetModuleInformation 和 GetModuleBaseName 的解决方案,但显然 EnumProcessModules 和 GetModuleBaseName 在 Windows CE 中不存在!还有什么选择?

请您参考如下方法:

我找到了使用 CreateToolhelp32Snapshot、Module32First、Module32Next、Process32First 和 Process32Next 执行此操作的方法。首先,您必须获取模块列表,然后搜索模块列表以找到所需的地址。

#include <Tlhelp32.h> 
 
struct MyModuleInfo 
{ 
    BYTE* Base; 
    HMODULE Handle; 
    DWORD Size; 
    enum { MaxNameLen = 36 }; 
    TCHAR Name[MaxNameLen]; 
}; 
 
bool GetModuleList(vector<MyModuleInfo>& moduleList) 
{ 
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPMODULE | TH32CS_GETALLMODS, 0); 
    if (hSnapshot == INVALID_HANDLE_VALUE) 
        return false; 
 
    MODULEENTRY32 moduleInfo; 
    moduleInfo.dwSize = sizeof(moduleInfo); 
    if (Module32First(hSnapshot, &moduleInfo)) do { 
        MyModuleInfo myInfo; 
        myInfo.Handle = moduleInfo.hModule; 
        myInfo.Base = moduleInfo.modBaseAddr; 
        myInfo.Size = moduleInfo.modBaseSize; 
        memcpy(myInfo.Name, moduleInfo.szModule, min(sizeof(myInfo.Name), sizeof(moduleInfo.szModule))); 
        myInfo.Name[myInfo.MaxNameLen-1] = '\0'; 
        moduleList.push_back(myInfo); 
    } while (Module32Next(hSnapshot, &moduleInfo)); 
 
    // The module list obtained above only contains DLLs! To get the EXE files 
    // also, we must call Process32First and Process32Next in a loop. 
    PROCESSENTRY32 processInfo; 
    processInfo.dwSize = sizeof(processInfo); 
    if (Process32First(hSnapshot, &processInfo)) do { 
        MyModuleInfo myInfo; 
        myInfo.Handle = NULL; // No handle given 
        myInfo.Base = (BYTE*)processInfo.th32MemoryBase; 
        myInfo.Size = 0x800000; // No size provided! Allow max 8 MB 
        memcpy(myInfo.Name, processInfo.szExeFile, min(sizeof(myInfo.Name), sizeof(processInfo.szExeFile))); 
        myInfo.Name[myInfo.MaxNameLen-1] = '\0'; 
        moduleList.push_back(myInfo); 
    } while(Process32Next(hSnapshot, &processInfo)); 
 
    // Debug output 
    for (int i = 0; i < (int)moduleList.size(); i++) { 
        MyModuleInfo& m = moduleList[i]; 
        TRACE(_T("%-30s: 0x%08x - 0x%08x\n"), m.Name, (DWORD)m.Base, (DWORD)m.Base + m.Size); 
    } 
 
    CloseToolhelp32Snapshot(hSnapshot); 
    return true; 
} 
 
const MyModuleInfo* GetModuleForAddress(vector<MyModuleInfo>& moduleList, void* address) 
{ 
    for (int m = 0; m < (int)moduleList.size(); m++) { 
        const MyModuleInfo& mInfo = moduleList[m]; 
        if (address >= mInfo.Base && address < mInfo.Base + mInfo.Size) 
            return &mInfo; 
    } 
    return NULL; 
} 


标签:C++
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号