Как получить информацию о разделе / ​​разрешения на смещение от windbg/dbgeng api?

Я пишу расширение для Windbg, и в определенный момент мне нужно получить разрешения для смещения памяти, очень похоже на то, как !address addr предоставит в Windbg. Я ознакомился с доступными функциями API отладчика здесь:

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

Однако мне не удалось найти такую ​​функцию, которая возвращала бы информацию о разделе / ​​разрешениях относительно смещения памяти. В основном я хотел бы узнать, в каком разделе находится адрес, в разделе данных, в текстовом разделе и т. Д., Какие у него есть разрешения и так далее.

Самая близкая по звучанию функция, которую я нашел, - это GetOffsetInformation в интерфейсе IDebugDataSpaces4. Однако, согласно документации, она не дает ничего из того, что я ищу:

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

Я всегда мог запустить !address Команда и его вывод анализируется, но я искал более чистый способ, где я мог бы получить эту информацию напрямую, используя API.

Я что-то пропустил? Есть ли документированный / недокументированный способ, которым я мог бы достичь этого?

1 ответ

Решение

Не работает ли 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
Другие вопросы по тегам