.process (プロセス コンテキストの設定)
.process コマンドでは、プロセス コンテキストに使用するプロセスを指定します。
.process [/i] [/p [/r]] [/P] [Process]
パラメーター
/i
ライブ デバッグのみ (ローカル カーネル デバッグ中の指定は不可)。プロセスを侵襲的にデバッグすることを指定します。 この種のデバッグは、ターゲット コンピューターのオペレーティング システムが、指定されたプロセスを実際に有効化することを意味します (このオプションを指定していない場合、.process コマンドによりデバッガーの出力が変更されますが、ターゲット コンピューター自体には影響しません)。/i を使用する場合は、g (Go) コマンドを使用してターゲットを実行する必要があります。 数秒後、ターゲットはデバッガーに戻り、指定された Process がアクティブ化され、プロセス コンテキストに使用されます。
/p
/p を使用していて、Process がゼロ以外の場合、このプロセスのすべての遷移ページ テーブル エントリ (PTE) は、アクセス前に物理アドレスに変換されます。 デバッガーはこのプロセスで使用されているすべてのメモリの物理アドレスを特定する必要があるため、この変換により速度が低下する可能性があります。 また、デバッガーでは、デバッグ ケーブルを介して大量のデータの転送が必要になる場合があります (この動作は、.cache forcedecodeuser と同じです)。
/p オプションを指定していて、Process がゼロの場合または省略した場合、変換は無効になります (この動作は、.cache noforcedecodeptes と同じです)。
/r
/r オプションおよび /p オプションを指定すると、プロセス コンテキストの設定後に、ユーザー モード シンボルの再読み込みが行われます (この動作は、.reload /user と同じです)。
/P
(ライブ・デバッグと完全なメモリ ダンプのみ) /P を指定していて、Process がゼロ以外の場合は、アクセス前にすべての遷移ページ テーブル エントリ (PTE) が物理アドレスに変換されます。 /p オプションの場合とは異なり、/P オプションを指定した場合は、指定したプロセスだけでなく、すべてのユーザー モードおよびカーネル モード プロセスの PTE が変換されます。 デバッガーは使用されているすべてのメモリの物理アドレスを特定する必要があるため、この変換により速度が低下する可能性があります。 また、デバッガーでは、デバッグ ケーブルを介して大量のデータの転送が必要になる場合があります (この動作は .cache forcedecodeptes と同じです)。
Process
必要なプロセスのアドレスを指定します (正確には、このパラメーターで、このプロセスの EPROCESS ブロックのアドレスを指定します)。 プロセス コンテキストがこのプロセスに設定されます。 Process を省略するかゼロを指定すると、プロセス コンテキストは現在のシステム状態に対応する既定プロセスにリセットされます (/i オプションを使用してプロセス コンテキストを設定した場合は、/i オプションを使用してプロセス コンテキストをリセットする必要があります)。
Environment
項目 | 説明 |
---|---|
モード | カーネル モードのみ |
対象 | ライブ、クラッシュ ダンプ |
プラットフォーム | すべて |
追加情報
プロセス コンテキストおよびその他のコンテキスト設定の詳細については、「コンテキストの変更」を参照してください。
解説
通常、カーネル デバッグを行う場合、確認できるユーザー モード アドレス空間は、現在のプロセスに関連付けられているものだけです。
.process コマンドは、特定のユーザーモード プロセスをプロセス コンテキストとして使用するようにカーネル デバッガーに指示します。 この使用法には複数の効力がありますが、最も重要なものは、デバッガーがこのプロセスの仮想アドレス空間にアクセスできるという点です。 デバッガーがこのプロセスのページ テーブルを使用してすべてのユーザー モード メモリ アドレスを解釈するため、このメモリに対する読み取りと書き込みが可能になります。
.context (ユーザーモード アドレス コンテキストの設定) コマンドにも同様の効力があります。 ただし、.context コマンドではユーザー モード アドレス コンテキストを特定のページ ディレクトリに設定しますが、.process コマンドではプロセス コンテキストを特定のプロセスに設定します。 x86 ベースのプロセッサでは、.context と .process の効力がほとんど同じになります。 ただし、Itanium ベースのプロセッサでは、1 つのプロセスに複数のページ ディレクトリが存在する場合があります。 この状況では、プロセスに関連付けられたすべてのページ ディレクトリへのアクセスが可能になるため、.process コマンドの方が強力です。 プロセス・コンテキストの詳細については、「プロセス コンテキスト」を参照してください。
メモ: ライブ デバッグを実行する場合は、/i パラメーターまたは /p パラメーターを使用する必要があります。 これらのパラメーターのいずれかを指定しないと、ユーザー モードまたはセッション メモリを正しく表示できません。
/i パラメーターを指定すると、ターゲット プロセスがアクティブ化されます。 このオプションを使用する場合、このコマンドを有効にするためにターゲットを一度実行する必要があります。 再度実行すると、プロセス コンテキストが失われます。
/p パラメーターを指定すると、forcedecodeuser 設定が有効になります (forcedecodeuser オプションが既にアクティブであれば、/p を使用する必要はありません)。プロセス コンテキストと forcedecodeuser の状態が維持されるのは、ターゲットが再度実行されるまでの間のみです。
クラッシュ ダンプのデバッグを実行する場合は、/i オプションと /p オプションを使用できません。 ただし、クラッシュの発生時にディスクにページングされたユーザー モード プロセスの仮想アドレス空間には、どの部分にもアクセスできません。
カーネル デバッガーを使用してユーザー空間にブレークポイントを設定する場合は、/i オプションを使用して、ターゲットを正しいプロセス コンテキストに切り替えます。
次の例は、!process 拡張機能を使用して、目的のプロセスの EPROCESS ブロックのアドレスを特定する方法を示しています。
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
次の例では、このプロセス アドレスを指定して .process コマンドを使用しています。
kd> .process fe3c0d60
Implicit process is now fe3c0d60
このコマンドを使用することで .context コマンドが不要になっています。 ユーザー モード アドレス コンテキストには、既に目的の値が設定されています。
kd> .context
User-mode page directory base is 11f000
この値により、さまざまな方法でアドレス空間を調べることができます。 たとえば、次の例は、!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