.context (Definir contexto de endereço no modo de usuário)
O comando .context especifica o diretório de página de um processo que será usado para o contexto de endereço de modo de usuário, ou exibe o contexto de endereço de modo de usuário atual.
.context [PageDirectoryBase]
Parâmetros
Base de diretório de página
Especifica o endereço base de um diretório de página de um processo desejado. O contexto de endereço no modo de usuário será definido para este diretório de página. Se PageDirectoryBase for zero, o contexto de endereço no modo de usuário será definido como o diretório de página para o estado atual do sistema. Se PageDirectoryBase for omitido, o contexto de endereço no modo de usuário atual será exibido.
Ambiente
Item | Descrição |
---|---|
Modos | somente no modo kernel |
Destinos | ao vivo, despejo de memória |
Plataformas | all |
Informações Adicionais
Para saber mais sobre o endereço do modo de usuário e outras configurações de contexto, confira Alterar contextos.
Comentários
Em geral, quando você faz a depuração do kernel, o único espaço visível de endereço no modo de usuário está associado ao processo atual.
O comando .context instrui o depurador do kernel a usar o diretório de página especificado como o contexto de endereço no modo de usuário. Após a execução desse comando, o depurador terá acesso a esse espaço de endereço virtual. As tabelas de página para esse espaço de endereço serão usadas para interpretar todos os endereços de memória no modo de usuário. Isso permite ler e gravar nessa memória.
O comando .process (Definir contexto do processo) tem um efeito similar. Mas, o comando .context define o contexto de endereço no modo de usuário de um diretório de página específico, enquanto o comando .process define o contexto do processo de um processo específico. Em um processador x86, esses dois comandos têm essencialmente o mesmo efeito. Para obter mais detalhes, confira Contexto do processo.
Em caso de depuração ao vivo, você deve emitir um comando .cache forcedecodeuser além do comando .context. Isso força o depurador a pesquisar os endereços físicos do espaço de memória necessário. (Isso pode ser lento porque, em geral, significa que um grande volume de dados deve ser transferido pelo cabo de depuração.)
Em caso de depuração de despejo de falha, o comando .cache não é necessário. Mas, você não terá acesso às partes do espaço de endereço virtual do processo de modo de usuário que foram paginadas no disco quando ocorreu a falha.
Veja um exemplo. Use a extensão !process para localizar a base de diretório do processo desejado:
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
Agora use o comando .context com esta base de diretório de página.
kd> .context 0011f000
Isso permite examinar o espaço de endereço de várias formas. Por exemplo, aqui está a saída da extensão !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