Virtueller und physischer Arbeitsspeicher

Die Engine bietet eine Reihe von Methoden zum Lesen und Schreiben des virtuellen und physischen Arbeitsspeichers eines Ziels.

Virtueller Arbeitsspeicher

Wenn Sie einen Speicherort im virtuellen Speicher eines Ziels angeben, wird der virtuelle Adressraum des Ziels verwendet. Beim Debuggen im Benutzermodus ist dies der virtuelle Adressraum des aktuellen Prozesses. Beim Debuggen im Kernelmodus ist dies der virtuelle Adressraum des impliziten Prozesses. Weitere Informationen zum aktuellen und impliziten Prozess finden Sie unter Threads und Prozesse .

Der virtuelle Arbeitsspeicher (des Ziels) kann mithilfe von ReadVirtual gelesen und mit WriteVirtual geschrieben werden.

Zeiger im Arbeitsspeicher des Ziels können mit den Convenience-Methoden ReadPointersVirtual und WritePointersVirtual gelesen und geschrieben werden. Diese Methoden konvertieren automatisch zwischen den 64-Bit-Zeigern, die von der Engine verwendet werden, und den nativen Zeigern, die vom Ziel verwendet werden. Diese Methoden sind nützlich, wenn Sie Arbeitsspeicher anfordern, der Zeiger enthält, die für nachfolgende Anforderungen verwendet werden , z. B. einen Zeiger auf eine Zeichenfolge.

Mit den Methoden SearchVirtual und SearchVirtual2 können Sie den virtuellen Speicher des Ziels nach einem Bytemuster durchsuchen.

Die FillVirtual-Methode kann verwendet werden, um ein Bytemuster mehrmals in den virtuellen Arbeitsspeicher des Ziels zu kopieren.

Der virtuelle Arbeitsspeicher des Ziels kann auch so gelesen und geschrieben werden, dass der virtuelle Arbeitsspeichercache des Debuggermoduls mit den Methoden ReadVirtualUncached und WriteVirtualUncached umgangen wird. Diese nicht zwischengespeicherten Versionen sind nützlich, um virtuellen Arbeitsspeicher zu lesen, der von Natur aus flüchtig ist, z. B. speicherseitig zugeordnete Gerätebereiche, ohne den Cache zu verunreinigen oder zu ungültig machen. Nicht zwischengespeicherter Speicherzugriff sollte nur in Situationen verwendet werden, in dem er erforderlich ist, da die Leistung des nicht zwischengespeicherten Zugriffs erheblich niedriger sein kann als der zwischengespeicherte Zugriff.

Die Engine bietet einige praktische Methoden zum Lesen von Zeichenfolgen aus dem virtuellen Speicher des Ziels. Um eine Multibytezeichenfolge aus dem Ziel zu lesen, verwenden Sie ReadMultiByteStringVirtual und ReadMultiByteStringVirtualWide. Um eine Unicode-Zeichenfolge aus dem Ziel zu lesen, verwenden Sie ReadUnicodeStringVirtual und ReadUnicodeStringVirtualWide.

Um Informationen zu einem Speicherspeicherort zu finden, verwenden Sie GetOffsetInformation. Nicht der gesamte virtuelle Adressraum im Ziel enthält gültigen Arbeitsspeicher. Verwenden Sie GetValidRegionVirtual, um gültigen Arbeitsspeicher in einer Region zu finden. Bei der manuellen Suche nach gültigem Arbeitsspeicher in einem Ziel findet die Methode GetNextDifferentlyValidOffsetVirtual den nächsten Speicherort, an dem sich die Gültigkeit ändern kann.

Physischer Arbeitsspeicher

Auf den physischen Arbeitsspeicher kann nur beim Debuggen im Kernelmodus direkt zugegriffen werden.

Physischer Arbeitsspeicher auf dem Ziel kann mit ReadPhysical und ReadPhysical2 gelesen und mit WritePhysical und WritePhysical2 geschrieben werden.

Die FillPhysical-Methode kann verwendet werden, um ein Bytemuster mehrmals in den physischen Speicher des Ziels zu kopieren.

Eine Adresse im virtuellen Adressraum des Ziels kann mithilfe der VirtualToPhysical-Methode in eine physische Adresse auf dem Ziel übersetzt werden. Die Pagingstrukturen des Systems, die zum Übersetzen einer virtuellen Adresse in eine physische Adresse verwendet werden, können mithilfe von GetVirtualTranslationPhysicalOffsets gefunden werden.

Events

Wenn der virtuelle oder physische Arbeitsspeicher des Ziels geändert wird, wird die Rückrufmethode IDebugEventCallbacks::ChangeDebuggeeState aufgerufen.