Поделиться через


Виртуальная и физическая память

Подсистема предоставляет ряд методов для чтения и записи виртуальной и физической памяти целевого объекта.

Виртуальная память

При указании расположения в виртуальной памяти целевого объекта используется виртуальное адресное пространство целевого объекта. При отладке в пользовательском режиме это виртуальное адресное пространство текущего процесса. При отладке в режиме ядра это виртуальное адресное пространство неявного процесса. Дополнительные сведения о текущем и неявном процессе см. в разделе Потоки и процессы .

Виртуальную память (целевого объекта) можно считывать с помощью ReadVirtual и записывать с помощью WriteVirtual.

Указатели в памяти целевого объекта можно считывать и записывать с помощью удобных методов ReadPointersVirtual и WritePointersVirtual. Эти методы автоматически преобразуются между 64-разрядными указателями, используемыми подсистемой, и собственными указателями, используемыми целевым объектом. Эти методы полезны при запросе памяти, содержащей указатели, которые будут использоваться для последующих запросов, например указателя на строку.

Методы SearchVirtual и SearchVirtual2 можно использовать для поиска шаблона байтов в виртуальной памяти целевого объекта.

Метод FillVirtual можно использовать для многократного копирования шаблона байтов в виртуальную память целевого объекта.

Виртуальную память целевого объекта также можно считать и записать таким образом, чтобы обойти кэш виртуальной памяти подсистемы отладчика с помощью методов ReadVirtualUncached и WriteVirtualUncached. Эти некэшированные версии полезны для чтения виртуальной памяти, которая является непостоянной, например, сопоставленных с памятью областей устройств, без загрязнения или недействительности кэша. Некэшированный доступ к памяти следует использовать только в ситуациях, когда это необходимо, так как производительность некэшированного доступа может быть значительно ниже, чем кэшированный доступ.

Подсистема предоставляет некоторые удобные методы для чтения строк из виртуальной памяти целевого объекта. Для чтения многобайтовой строки из целевого объекта используйте readMultiByteStringVirtual и ReadMultiByteStringVirtualWide. Для чтения строки Юникода из целевого объекта используйте ReadUnicodeStringVirtual и ReadUnicodeStringVirtualWide.

Чтобы найти сведения о расположении в памяти, используйте GetOffsetInformation. Не все виртуальные адресные пространства в целевом объекте содержат допустимую память. Чтобы найти допустимую память в регионе, используйте GetValidRegionVirtual. При поиске допустимой памяти в целевом объекте вручную метод GetNextDifferentlyValidOffsetVirtual найдет следующее расположение, в котором допустимость может измениться.

Физическая память

Прямой доступ к физической памяти можно получить только при отладке в режиме ядра.

Физическую память в целевом объекте можно считать с помощью readPhysical и ReadPhysical2, а также записать с помощью WritePhysical и WritePhysical2.

Метод FillPhysical можно использовать для многократного копирования шаблона байтов в физическую память целевого объекта.

Адрес в виртуальном адресном пространстве целевого объекта можно преобразовать в физический адрес целевого объекта с помощью метода VirtualToPhysical . Структуры подкачки системы, используемые для преобразования виртуального адреса в физический, можно найти с помощью GetVirtualTranslationPhysicalOffsets.

События

При изменении виртуальной или физической памяти целевого объекта вызывается метод обратного вызова IDebugEventCallbacks::ChangeDebuggeeState .