Memoria virtual y física
El motor proporciona una serie de métodos para leer y escribir la memoria virtual y física de un destino.
Memoria virtual
Al especificar una ubicación en la memoria virtual de un destino, se usa el espacio de direcciones virtuales del destino. En la depuración en modo de usuario, este es el espacio de direcciones virtuales del proceso actual. En la depuración en modo kernel, este es el espacio de direcciones virtuales del proceso implícito. Consulte Subprocesos y procesos para obtener más información sobre el proceso actual e implícito.
La memoria virtual (del destino) se puede leer mediante ReadVirtual y escrita mediante WriteVirtual.
Los punteros de la memoria del destino se pueden leer y escribir mediante los métodos de conveniencia ReadPointersVirtual y WritePointersVirtual. Estos métodos se convertirán automáticamente entre los punteros de 64 bits utilizados por el motor y los punteros nativos usados por el destino. Estos métodos son útiles al solicitar memoria que contiene punteros que se usarán para las solicitudes posteriores; por ejemplo, un puntero a una cadena.
Los métodos SearchVirtual y SearchVirtual2 se pueden usar para buscar en la memoria virtual del destino un patrón de bytes.
El método FillVirtual se puede usar para copiar un patrón de bytes, varias veces, en la memoria virtual del destino.
La memoria virtual del destino también se puede leer y escribir de forma que omita la memoria caché de memoria virtual del motor del depurador mediante los métodos ReadVirtualUncached y WriteVirtualUncached. Estas versiones no almacenadas en caché son útiles para leer la memoria virtual que es intrínsecamente volátil, como las áreas de dispositivo asignadas a memoria, sin contaminación ni invalidación de la memoria caché. El acceso a memoria sin almacenar en caché solo debe usarse en situaciones en las que sea necesario, ya que el rendimiento del acceso sin almacenamiento en caché puede ser significativamente menor que el acceso almacenado en caché.
El motor proporciona algunos métodos útiles para leer cadenas de la memoria virtual del destino. Para leer una cadena multibyte del destino, use ReadMultiByteStringVirtual y ReadMultiByteStringVirtualWide. Para leer una cadena Unicode del destino, use ReadUnicodeStringVirtual y ReadUnicodeStringVirtualWide.
Para buscar información sobre una ubicación de memoria, use GetOffsetInformation. No todo el espacio de direcciones virtuales del destino contiene memoria válida. Para buscar memoria válida dentro de una región, use GetValidRegionVirtual. Al buscar manualmente memoria válida en un destino, el método GetNextDifferentlyValidOffsetVirtual encontrará la siguiente ubicación donde la validez puede cambiar.
Memoria física
Solo se puede acceder a la memoria física directamente en la depuración en modo kernel.
La memoria física en el destino se puede leer mediante ReadPhysical y ReadPhysical2 y escrita mediante WritePhysical y WritePhysical2.
El método FillPhysical se puede usar para copiar un patrón de bytes, varias veces, en la memoria física del destino.
Una dirección del espacio de direcciones virtuales del destino se puede traducir a una dirección física del destino mediante el método VirtualToPhysical . Las estructuras de paginación del sistema que se usan para traducir una dirección virtual a una dirección física se pueden encontrar mediante GetVirtualTranslationPhysicalOffsets.
Eventos
Cuando se cambia la memoria virtual o física del destino, se llama al método de devolución de llamada IDebugEventCallbacks::ChangeDebuggeeState .