我正在编写 dbgeng 客户端并尝试为时间旅行调试会话枚举可用的虚拟内存。
Dbgeng API 有IDebugDataSpaces2::QueryVirtual
方法,它适用于实时用户模式调试会话,但不适用于 TTD 跟踪会话重放。当我尝试调用它时,我收到 0x8000ffff (E_UNEXPECTED) 错误。
看起来!address
和!vprot
来自windbg preview gui的命令有同样的问题
0:000> !vprot 0
ERROR: !vprot: extension exception 0x8000ffff.
"QueryVirtual failed"
0:000> !address
BaseAddress EndAddress+1 RegionSize Type State Protect Usage
--------------------------------------------------------------------------------------------------------------------------
有IDebugDataSpaces4::GetValidRegionVirtual
方法。它可以工作,但太长了(看起来它试图手动检查每一页)。看起来IDebugDataSpaces4::GetNextDifferentlyValidOffsetVirtual
对于 TTD 重放也有问题。
dbgeng API 是否有其他方法来枚举进程的有效内存范围?或者也许还有另一种方法可以从 IDX 或 RUN 文件中获取此信息?