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

标签 visual-c++ windows-ce

我写了一个涉及 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;
}

关于visual-c++ - WinCE : How can I determine the module that contains a code address?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4090758/

相关文章:

.net - 在托管 C++ 中创建 KeyValuePair

visual-c++ - 如何使用 Visual C++ 2008 添加工具提示来控制窗口应用程序 (win32 API)

string - 在vc++中将 'System::String ^'转换为 'const char *'

c++ - Windows Mobile 中 atof 的 Unicode 版本在哪里

c++ - 对 USB 设备使用 GetStatus 时出错 Win CE 6.0

c++ - 从对话框窗口调用第二个对话框无法使任何一个处于事件状态

c++ - Lamba 依赖模板依赖值作为该模板构造函数的默认值在 MSVC 上失败

c++ - WinCe PlaySound 不是每次都有效

usb - 是否可以在 Window CE 6.0 仿真器中使用主机 PC 的 USB 端口?

javascript - 使用 javascript 将焦点放在选择内?