引擎提供了许多方法,用于读取和写入目标的虚拟和物理内存。
虚拟内存
在目标的虚拟内存中指定位置时,将使用目标的虚拟地址空间。 在用户模式调试中,这是当前进程的虚拟地址空间。 在内核模式调试中,这是隐式进程的虚拟地址空间。 有关当前和隐式进程的详细信息,请参阅 线程和进程 。
虚拟内存(目标)可以使用 ReadVirtual 读取并使用 WriteVirtual 进行 写入。
可以使用便捷方法 ReadPointersVirtual 和 WritePointersVirtual 读取和 写入目标内存中的指针。 这些方法将自动在引擎使用的 64 位指针和目标使用的本机指针之间进行转换。 在请求含有用于后续请求的指针的内存时,这些方法非常有用——例如,指向字符串的指针。
SearchVirtual 和 SearchVirtual2 方法可用于搜索目标的虚拟内存中的字节模式。
FillVirtual 方法可用于将字节模式(多次)复制到目标的虚拟内存。
还可以使用 ReadVirtualUncached 和 WriteVirtualUncached 方法读取和写入目标虚拟内存,以绕过调试器引擎的虚拟内存缓存的方式进行读取和写入。 这些未缓存的版本可用于读取本质上易失性的虚拟内存,例如内存映射设备区域,而不会污染或使缓存失效。 仅当需要时,才应使用未缓存内存访问,因为未缓存访问的性能可能明显低于缓存访问。
引擎提供了一些方便的方法,用于从目标的虚拟内存中读取字符串。 若要从目标读取多字节字符串,请使用 ReadMultiByteStringVirtual 和 ReadMultiByteStringVirtualWide。 若要从目标读取 Unicode 字符串,请使用 ReadUnicodeStringVirtual 和 ReadUnicodeStringVirtualWide。
若要查找有关内存位置的信息,请使用 GetOffsetInformation。 目标中的所有虚拟地址空间都不包含有效的内存。 若要查找区域中的有效内存,请使用 GetValidRegionVirtual。 在目标中手动搜索有效内存时, GetNextDifferentlyValidOffsetVirtual 方法将找到有效性可能更改的下一个位置。
物理内存
物理内存只能在内核模式调试中直接访问。
可以使用 ReadPhysical 和 ReadPhysical2 读取目标上的物理内存,并使用 WritePhysical 和 WritePhysical2 进行写入。
FillPhysical 方法可用于将字节模式(多次)复制到目标的物理内存。
目标虚拟地址空间中的地址可以使用 VirtualToPhysical 方法转换为目标上的物理地址。 使用 GetVirtualTranslationPhysicalOffsets 可以找到用于将虚拟地址转换为物理地址的系统分页结构。
事件
更改目标的虚拟或物理内存时,将调用 IDebugEventCallbacks::ChangeDebuggeeState 回调方法。