次の方法で共有


ページアウトされたヘッダーからのシンボルの読み取り

カーネル デバッガーは、どのシンボルがそのモジュールに対応するかを知るために、ロードされた各モジュールのイメージのヘッダーを読み取る必要があります。

モジュールのヘッダーがディスクにページアウトされる場合、デバッガーはこのモジュールのシンボルをロードしません。 デバッグ プロセスに不可欠なモジュールでこれが発生した場合、重大な問題になる可能性があります。

この問題を解決するには、次の手順を使用できます。

ページアウトされたヘッダーのシンボルを取得するには

  1. カーネル自体の 2 番目のコピーを作成します。 これをネットワーク共有に置くのがおそらく最も簡単です。

  2. この共有のルート ディレクトリをシンボル パスに追加します。 シンボル パスを変更する方法については、「シンボル パス」を参照してください。

  3. .reload (モジュールの再ロード) コマンドを使用します。

  4. さらに詳細な出力を表示するには、!sym noisy 拡張コマンドを使用します。 これを使用すると、どのシンボルがターゲット コンピュータ上のモジュール イメージからロードされ、どのシンボルがカーネル モジュールのコピーからロードされたかを確認できます。

デバッガーにはファイルのコピーが実際にオリジナルと一致するかどうかを検証する方法がないため、この手法は注意して使用する必要があります。 したがって、ネットワーク共有で使用される Windows のバージョンがターゲット コンピューターで使用されるバージョンと一致することが重要です。

この手法は、カーネル モードのデバッグにのみ使用されます。 オペレーティング システムは、ユーザー モードのデバッグ中に必要なヘッダーをページングできます (ページング ファイルを保持するディスクがマウント解除されているか、アクセスできない場合を除く)。

このテクニックの使用例を次に示します。

kd> .reload
Connected to Windows XP 2268 x86 compatible target, ptr64 FALSE
Loading Kernel Symbols
..........Unable to read image header for dmload.sys at fe0be000 - NTSTATUS 0xC0000001
..........Unable to read image header for dmboot.sys at fda93000 - NTSTATUS 0xC0000001
.....................................Unable to read image header for fdc.sys at fdfc2000 - NTSTATUS 0xC0000001
...Unable to read image header for flpydisk.sys at fde4a000 - NTSTATUS 0xC0000001
.Unable to read image header for Fs_Rec.SYS at fe0c8000 - NTSTATUS 0xC0000001
.Unable to read image header for Null.SYS at fe2c4000 - NTSTATUS 0xC0000001
...................Unable to read image header for win32k.sys at a0000000 - NTSTATUS 0xC0000001
..Unable to read image header for dxg.sys at a0194000 - NTSTATUS 0xC0000001
.......Unable to read image header for ati2draa.dll at a01a4000 - NTSTATUS 0xC0000001
..Unable to read image header for ParVdm.SYS at fe116000 - NTSTATUS 0xC0000001
.......
Loading unloaded module list
..............
Loading User Symbols
Unable to retrieve the PEB address. This is usually caused
by being in the wrong process context or by paging

多くの画像にはアクセスできないヘッダーがあることに注意してください。 次のいずれかのファイル (この例では fs_rec.sys) のシンボルを確認します。

kd> x fs_rec!*
*** ERROR: Module load completed but symbols could not be loaded for fs_rec.sys

これらのヘッダーは明らかにページアウトされています。したがって、適切なイメージをシンボル パスに追加する必要があります。

kd> .sympath+ \\myserver\myshare\symbols\x86fre\symbols
Symbol search path is: symsrv*symsrv.dll*c:\localcache*https://msdl.microsoft.com/download/symbols;\\myserver\myshare\symbols\x86fre\symbols

kd> .reload
Connected to Windows XP 2268 x86 compatible target, ptr64 FALSE
Loading Kernel Symbols
..........Unable to read image header for dmload.sys at fe0be000 - NTSTATUS 0xC0000001
..........Unable to read image header for dmboot.sys at fda93000 - NTSTATUS 0xC0000001
.....................................Unable to read image header for fdc.sys at fdfc2000 - NTSTATUS 0xC0000001
...Unable to read image header for flpydisk.sys at fde4a000 - NTSTATUS 0xC0000001
.Unable to read image header for Fs_Rec.SYS at fe0c8000 - NTSTATUS 0xC0000001
.Unable to read image header for Null.SYS at fe2c4000 - NTSTATUS 0xC0000001
...................Unable to read image header for win32k.sys at a0000000 - NTSTATUS 0xC0000001
..Unable to read image header for dxg.sys at a0194000 - NTSTATUS 0xC0000001
.......Unable to read image header for ati2draa.dll at a01a4000 - NTSTATUS 0xC0000001
..Unable to read image header for ParVdm.SYS at fe116000 - NTSTATUS 0xC0000001
.......
Loading unloaded module list
..............
Loading User Symbols
Unable to retrieve the PEB address. This is usually caused
by being in the wrong process context or by paging

同じ警告が表示されますが、シンボル自体にアクセスできるようになりました。

kd> x fs_Rec!*
fe0c8358  Fs_Rec!_imp___allmul
fe0c8310  Fs_Rec!_imp__IoCreateDevice
fe0c835c  Fs_Rec!_imp___allshr
........
fe0c8360  Fs_Rec!ntoskrnl_NULL_THUNK_DATA
fe0c832c  Fs_Rec!_imp__KeSetEvent
fe0c9570  Fs_Rec!_NULL_IMPORT_DESCRIPTOR