.context (Adresskontext im Benutzermodus einstellen)
Der Befehl .context gibt an, welches Seitenverzeichnis eines Prozesses für den Adresskontext des Benutzermodus verwendet werden soll, oder zeigt den aktuellen Adresskontext des Benutzermodus an.
.context [PageDirectoryBase]
Parameter
PageDirectoryBase
Gibt die Basisadresse für ein Seitenverzeichnis eines gewünschten Prozesses an. Der Adresskontext im Benutzermodus wird auf dieses Seitenverzeichnis eingestellt. Wenn PageDirectoryBase gleich Null ist, wird der Adresskontext im Benutzermodus auf das Seitenverzeichnis für den aktuellen Systemzustand gesetzt. Wenn PageDirectoryBase weggelassen wird, wird der aktuelle Adresskontext des Benutzermodus angezeigt.
Environment
Element | Beschreibung |
---|---|
Modi | Nur Kernelmodus |
Ziele | live, Crash Dump |
Plattformen | Alle |
Zusätzliche Informationen
Weitere Informationen über den Adresskontext im Benutzermodus und andere Kontexteinstellungen finden Sie unter Ändern von Kontexten.
Hinweise
Wenn Sie Kernel-Debugging betreiben, ist der einzige sichtbare Adressraum im Benutzermodus derjenige, der mit dem aktuellen Prozess verbunden ist.
Der Befehl .context weist den Kernel-Debugger an, das angegebene Seitenverzeichnis als Adresskontext für den Benutzermodus zu verwenden. Nachdem dieser Befehl ausgeführt wurde, hat der Debugger Zugriff auf diesen virtuellen Adressraum. Die Seitentabellen für diesen Adressraum werden verwendet, um alle Speicheradressen im Benutzermodus zu interpretieren. Damit können Sie diesen Speicher lesen und beschreiben.
Der Befehl .process (Set Process Context) hat eine ähnliche Wirkung. Der Befehl .context setzt jedoch den Adresskontext im Benutzermodus auf ein bestimmtes Seitenverzeichnis, während der Befehl .process den Prozesskontext auf einen bestimmten Prozess setzt. Auf einem x86-Prozessor haben diese beiden Befehle im Wesentlichen die gleiche Wirkung. Siehe Prozesskontext für weitere Details.
Wenn Sie Live-Debugging durchführen, sollten Sie den Befehl .cache forcedecodeuser zusätzlich zum Befehl .context ausführen. Dadurch wird der Debugger gezwungen, die physischen Adressen des benötigten Speicherplatzes zu suchen. (Dies kann langsam sein, da oft eine große Datenmenge über das Debug-Kabel übertragen werden muss)
Wenn Sie einen Crash-Dump debuggen, ist der Befehl .cache nicht erforderlich. Sie haben jedoch keinen Zugriff auf Teile des virtuellen Adressraums des Benutzermodusprozesses, die zum Zeitpunkt des Absturzes auf die Festplatte ausgelagert wurden.
Beispiel: Verwenden Sie die Erweiterung !process, um die Verzeichnisbasis für den gewünschten Prozess zu finden:
kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS fe5039e0 SessionId: 0 Cid: 0008 Peb: 00000000 ParentCid: 0000
DirBase: 00030000 ObjectTable: fe529b68 TableSize: 50.
Image: System
...
PROCESS fe3c0d60 SessionId: 0 Cid: 0208 Peb: 7ffdf000 ParentCid: 00d4
DirBase: 0011f000 ObjectTable: fe3d0f48 TableSize: 30.
Image: regsvc.exe
Verwenden Sie nun den Befehl .context mit dieser Seitenverzeichnisbasis.
kd> .context 0011f000
So können Sie den Adressraum auf verschiedene Arten untersuchen. Hier ist zum Beispiel die Ausgabe der Erweiterung !peb:
kd> !peb
PEB at 7FFDF000
InheritedAddressSpace: No
ReadImageFileExecOptions: No
BeingDebugged: No
ImageBaseAddress: 01000000
Ldr.Initialized: Yes
Ldr.InInitializationOrderModuleList: 71f40 . 77f68
Ldr.InLoadOrderModuleList: 71ec0 . 77f58
Ldr.InMemoryOrderModuleList: 71ec8 . 77f60
01000000 C:\WINNT\system32\regsvc.exe
77F80000 C:\WINNT\System32\ntdll.dll
77DB0000 C:\WINNT\system32\ADVAPI32.dll
77E80000 C:\WINNT\system32\KERNEL32.DLL
77D40000 C:\WINNT\system32\RPCRT4.DLL
77BE0000 C:\WINNT\system32\secur32.dll
SubSystemData: 0
ProcessHeap: 70000
ProcessParameters: 20000
WindowTitle: "'C:\WINNT\system32\regsvc.exe'"
ImageFile: 'C:\WINNT\system32\regsvc.exe'
CommandLine: 'C:\WINNT\system32\regsvc.exe'
DllPath: 'C:\WINNT\system32;.;C:\WINNT\System32;C:\WINNT\system;C:\WINNT;C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;C:\PROGRA~1\COMMON~1\AUTODE~1'
Environment: 0x10000