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

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

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

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

Виртуальную память (целевого объекта) можно считывать с помощью 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 .