3

我正在为 Windbg 编写一个扩展,在某个特定点我需要获得内存偏移的权限,就像!address addr在 Windbg 中提供的那样。我在这里查看了调试器引擎 API 的可用功能:

http://msdn.microsoft.com/en-us/library/windows/hardware/ff551059%28v=vs.85%29.aspx

但是,我找不到这样一个函数,它可以根据内存偏移量返回部分/权限信息。基本上我想知道地址所在的部分,数据部分,文本部分等,它有什么权限等等。

我找到的最接近的探测函数是 IDebugDataSpaces4 接口中的 GetOffsetInformation。但是,根据文档,它没有提供我正在寻找的任何东西:

http://msdn.microsoft.com/en-us/library/windows/hardware/ff548055(v=vs.85).aspx

我总是可以运行!address命令并解析其输出,但我正在寻找一种更简洁的方法,可以通过使用 API 直接获取此信息。

我错过了什么吗?是否有记录/未记录的方式可以实现这一目标?

4

1 回答 1

3

QueryVirtual 不起作用吗?

#include <engextcpp.hpp>

class EXT_CLASS : public ExtExtension
{
public:
    EXT_COMMAND_METHOD(getoffinfo);
};

EXT_DECLARE_GLOBALS();


EXT_COMMAND( getoffinfo, "", "{;e,d=0;getoffinfo;simulates !address <address>}" )

{
    ULONG64 Offset  = GetUnnamedArgU64(0);
    if (Offset == 0)
    {
        Out( "usage !getoffinfo <address>\n");
    }
    else
    {
        MEMORY_BASIC_INFORMATION64 meminfo;
        memset(&meminfo,0,sizeof(MEMORY_BASIC_INFORMATION64 ));
        m_Data2->QueryVirtual(Offset,&meminfo);
        Out("Allocation Base    :   %x\n",meminfo.AllocationBase);
        Out("Base Address       :   %x\n",meminfo.BaseAddress);
        Out("End Address        :   %x\n",meminfo.AllocationBase + meminfo.RegionSize);
        Out("RegionSize         :   %x\n",meminfo.RegionSize);
        Out("Type               :   %x\n",meminfo.Type);
        Out("State              :   %x\n",meminfo.State);
    }

}

结果如下

0:000> !address windbg
Usage:                  Image
Allocation Base:        01000000
Base Address:           01000000
End Address:            01001000
Region Size:            00001000
Type:                   01000000    MEM_IMAGE
State:                  00001000    MEM_COMMIT
Protect:                00000002    PAGE_READONLY
More info:              lmv m windbg
More info:              !lmi windbg
More info:              ln 0x1000000

0:000> .load getoffinfo
0:000> !getoffinfo
usage !getoffinfo <address>
0:000> !getoffinfo windbg
Allocation Base    :   1000000
Base Address       :   1000000
End Address        :   1001000
RegionSize         :   1000
Type               :   1000000
State              :   1000
于 2014-12-11T12:28:29.057 回答