虚拟和物理内存

引擎提供了许多用于读取和写入目标的虚拟和物理内存的方法。

虚拟内存

指定目标虚拟内存中的位置时,将使用目标的虚拟地址空间。 在用户模式调试中,这是当前进程的虚拟地址空间。 在内核模式调试中,这是隐式进程的虚拟地址空间。 有关当前和隐式进程的详细信息,请参阅 线程 和进程。

可以使用 ReadVirtual 读取目标) 的虚拟内存 (,并使用 WriteVirtual 进行写入。

可以使用便捷方法 ReadPointersVirtualWritePointersVirtual 读取和写入目标内存中的指针。 这些方法将在引擎使用的 64 位指针和目标使用的本机指针之间自动转换。 请求包含将用于后续请求的指针的内存(例如,指向字符串的指针)时,这些方法非常有用。

SearchVirtualSearchVirtual2 方法可用于在目标的虚拟内存中搜索字节模式。

FillVirtual 方法可用于多次将字节模式复制到目标的虚拟内存。

还可以使用 ReadVirtualUncached 和 WriteVirtualUncached 方法绕过调试器引擎的虚拟内存缓存来读取和写入目标的虚拟内存。 这些未缓存的版本可用于读取本质上易失的虚拟内存(例如内存映射设备区域),而不会污染缓存或使缓存失效。 应仅在需要未缓存的内存访问的情况下使用,因为未缓存的访问的性能可能明显低于缓存访问。

引擎提供了一些方便的方法,用于从目标的虚拟内存中读取字符串。 若要从目标读取多字节字符串,请使用 ReadMultiByteStringVirtualReadMultiByteStringVirtualWide。 若要从目标读取 Unicode 字符串,请使用 ReadUnicodeStringVirtualReadUnicodeStringVirtualWide

若要查找有关内存位置的信息,请使用 GetOffsetInformation。 并非目标中的所有虚拟地址空间都包含有效的内存。 若要查找区域中的有效内存,请使用 GetValidRegionVirtual。 在目标中手动搜索有效内存时,方法 GetNextDifferentlyValidOffsetVirtual 将找到有效性可能更改的下一个位置。

物理内存

物理内存只能在内核模式调试中直接访问。

可以使用 ReadPhysical 和 ReadPhysical2 读取目标上的物理内存,并使用 WritePhysicalWritePhysical2 进行写入。

FillPhysical 方法可用于多次将字节模式复制到目标的物理内存。

可以使用 VirtualToPhysical 方法将目标虚拟地址空间中的地址转换为目标上的物理地址。 可以使用 GetVirtualTranslationPhysicalOffsets 找到用于将虚拟地址转换为物理地址的系统分页结构。

事件

更改目标的虚拟或物理内存时,将调用 IDebugEventCallbacks::ChangeDebuggeeState 回调方法。