Mémoire virtuelle et physique

Le moteur fournit un certain nombre de méthodes pour lire et écrire la mémoire virtuelle et physique d’une cible.

Mémoire virtuelle

Lorsque vous spécifiez un emplacement dans la mémoire virtuelle d’une cible, l’espace d’adressage virtuel de la cible est utilisé. Dans le débogage en mode utilisateur, il s’agit de l’espace d’adressage virtuel du processus actuel. Dans le débogage en mode noyau, il s’agit de l’espace d’adressage virtuel du processus implicite. Pour plus d’informations sur le processus actuel et implicite, consultez Threads et processus .

La mémoire virtuelle (de la cible) peut être lue à l’aide de ReadVirtual et écrite à l’aide de WriteVirtual.

Les pointeurs dans la mémoire de la cible peuvent être lus et écrits à l’aide des méthodes de commodité ReadPointersVirtual et WritePointersVirtual. Ces méthodes sont automatiquement converties entre les pointeurs 64 bits utilisés par le moteur et les pointeurs natifs utilisés par la cible. Ces méthodes sont utiles lors de la demande de mémoire qui contient des pointeurs qui seront utilisés pour les requêtes suivantes, par exemple, un pointeur vers une chaîne.

Les méthodes SearchVirtual et SearchVirtual2 peuvent être utilisées pour rechercher un modèle d’octets dans la mémoire virtuelle de la cible.

La méthode FillVirtual peut être utilisée pour copier un modèle d’octets, plusieurs fois, dans la mémoire virtuelle de la cible.

La mémoire virtuelle de la cible peut également être lue et écrite d’une manière qui contourne le cache de mémoire virtuelle du moteur du débogueur à l’aide des méthodes ReadVirtualUncached et WriteVirtualUncached. Ces versions non mises en cache sont utiles pour lire la mémoire virtuelle qui est intrinsèquement volatile, comme les zones d’appareil mappées à la mémoire, sans contaminer ou invalider le cache. L’accès à la mémoire non mis en cache ne doit être utilisé que dans les situations où il est nécessaire, car les performances de l’accès non mis en cache peuvent être considérablement inférieures à celles de l’accès mis en cache.

Le moteur fournit des méthodes pratiques pour lire des chaînes à partir de la mémoire virtuelle de la cible. Pour lire une chaîne multioctet à partir de la cible, utilisez ReadMultiByteStringVirtual et ReadMultiByteStringVirtualWide. Pour lire une chaîne Unicode à partir de la cible, utilisez ReadUnicodeStringVirtual et ReadUnicodeStringVirtualWide.

Pour trouver des informations sur un emplacement de mémoire, utilisez GetOffsetInformation. Tout l’espace d’adressage virtuel dans la cible ne contient pas de mémoire valide. Pour rechercher une mémoire valide dans une région, utilisez GetValidRegionVirtual. Lors de la recherche manuelle de la mémoire valide dans une cible, la méthode GetNextDifferentlyValidOffsetVirtual trouve l’emplacement suivant où la validité peut changer.

Mémoire physique

La mémoire physique est uniquement accessible directement dans le débogage en mode noyau.

La mémoire physique sur la cible peut être lue à l’aide de ReadPhysical et ReadPhysical2, et écrite à l’aide de WritePhysical et WritePhysical2.

La méthode FillPhysical peut être utilisée pour copier un modèle d’octets, plusieurs fois, dans la mémoire physique de la cible.

Une adresse dans l’espace d’adressage virtuel de la cible peut être traduite en adresse physique sur la cible à l’aide de la méthode VirtualToPhysical . Les structures de pagination du système utilisées pour traduire une adresse virtuelle en adresse physique sont accessibles à l’aide de GetVirtualTranslationPhysicalOffsets.

Événements

Lorsque la mémoire virtuelle ou physique de la cible est modifiée, la méthode de rappel IDebugEventCallbacks::ChangeDebuggeeState est appelée.