!vtop
!Vtop拡張機能は、仮想アドレスを対応する物理アドレスに変換し、その他のページテーブルとページディレクトリ情報を表示します。
構文
!vtop PFN VirtualAddress
!vtop 0 VirtualAddress
パラメーター
DirBase
プロセスのディレクトリベースを指定します。 各プロセスには、独自の仮想アドレス空間があります。 !process拡張を使用して、プロセスのディレクトリベースを決定する。
PFN
プロセスのディレクトリベースのページフレーム番号 (PFN) を指定します。
0
アドレス変換のために、!vtopが現在のプロセスコンテキストを使うようにする。
VirtualAddress
ページが必要な仮想アドレスを指定します。
DLL
Kdexts.dll
追加情報
これらの結果を実現するその他の方法については、 「仮想アドレスを物理アドレスに変換する」 を参照してください。 !ptovも参照してください。 ページテーブルとページディレクトリの詳細については、 「Microsoft Windowsの内部構造」 を参照してください。これは、Mark RussinovichとDavid Solomonによるものです。
解説
このコマンドを使用するには、まず!process拡張機能を使用して、プロセスのディレクトリベースを決定します。 このディレクトリベースのページフレーム番号 (PFN) は、末尾の3つの16進ゼロ(言い換えると、12ビットの数値を右シフトすることによって)を削除することによって確認できます。
例を次に示します。
kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
....
PROCESS ff779190 SessionId: 0 Cid: 04fc Peb: 7ffdf000 ParentCid: 0394
DirBase: 098fd000 ObjectTable: e1646b30 TableSize: 8.
Image: MyApp.exe
ディレクトリベースが0x098FD000であるため、そのPFNは0x098FDです。
kd> !vtop 98fd 12f980
Pdi 0 Pti 12f
0012f980 09de9000 pfn(09de9)
末尾の3つのゼロが省略可能である方法に注意してください。 !Vtop拡張機能には、ページディレクトリインデックス (PDI) 、ページテーブルインデックス (PTI) 、最初に入力した仮想アドレス、物理ページの先頭の物理アドレス、およびページフレーム番号 (PFN) のページテーブルエントリ (PTE) が表示されます。
仮想アドレス0x0012F980を物理アドレスに変換する場合は、最後の3つの16進数 (0x980) を取得し、ページ (0x09DE9000) の先頭の物理アドレスに追加するだけです。 これにより、物理アドレス0x09DE9980が提供されます。
3つのゼロを削除し、完全なディレクトリベースを渡すことを忘れた場合!vtop PFNではなく、結果は通常正しいです。 これは、!vtopがPFNにするには大きすぎる数値を受け取るときに、右シフト12ビットし、代わりにその数値を使用するためです。
kd> !vtop 98fd 12f980
Pdi 0 Pti 12f
0012f980 09de9000 pfn(09de9)
kd> !vtop 98fd000 12f980
Pdi 0 Pti 12f
0012f980 09de9000 pfn(09de9)
ただし、いくつかのディレクトリベースの値はこの方法で変換されないため、常にPFNを使用することをお勧めします。