ドライバー開発を始めたばかりです。ロード、アンロード、およびデバッグのいくつかの実験のために、次の単純なドライバーを作成しました。
#include <ntddk.h>
void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
UNREFERENCED_PARAMETER(pDriverObject);
DbgPrint("Driver unloading\n");
}
NTSTATUS DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath)
{
UNREFERENCED_PARAMETER(DriverObject);
UNREFERENCED_PARAMETER(RegistryPath);
DriverObject->DriverUnload = DriverUnload;
DbgPrint("Hello, World\n");
return STATUS_SUCCESS;
}
ターゲット システムである Windows 7 64 ビット用のドライバーをデバッグ シンボルを使用してコンパイルし、それをターゲット システムにコピーして、OSR Driver Loader でロードして実行しました。
すべてが正常に動作し、ドライバーをアンロードしてロードできます。
シリアル接続を使用して WinDbg に接続でき、ターゲット システムを正常に中断して実行できます。ただし、ブレークポイントを設定しようとすると問題が発生します。
私は最初に次のようにブレークポイントを設定しようとしました:
kd> bp MyDriver1!DriverEntry
しかし、問題は、ドライバーをリロードしてブレークポイントをチェックした場合です。
kd> bl
0 e fffff880`03572010 0001 (0001) < Unloaded_MyDriver1.sys >+0x1010
初心者の私には見栄えが悪く(アンロード?)、ロード時に途切れることはありませんでした。
したがって、モジュールがロードされたときにブレークポイントを設定できることがわかりました。
kd> bu MyDriver1
0 e fffff880`03578000 0001 (0001) MyDriver1!DriverEntry < PERF > (MyDriver1+0x0)
上記のコマンドの後にシステムの実行を続行し、ドライバーをロードすると (net start MyDriver1)、システムがクラッシュします。
Break 命令の例外 - コード 80000003 (最初のチャンス)
- *
- どちらかを押したので、このメッセージが表示されています *
- CTRL+C (コンソール カーネル デバッガーを実行している場合) または、*
- CTRL+BREAK (GUI カーネル デバッガーを実行している場合)、*
- デバッガー マシンのキーボードで。*
- *
- これはバグでもシステムクラッシュでもありません *
- *
- デバッガに侵入するつもりがなかった場合は、"g" キーを押してから *
- 今すぐ「Enter」キーを押してください。このメッセージはすぐに再表示される場合があります。それであれば *
- 「g」と「Enter」をもう一度押します。*
- *
nt!RtlpBreakWithStatusInstruction: fffff800
028ca490 cc int 3 kd > bu MyDriver1 kd> bl 0 e fffff880
03572010 0001(0001) MyDriver1!DriverEntry < PERF > (MyDriver1+0x0)
kd > bc 0 kd> bl 1 e fffff880`03578000 0001 (0001)
MyDriver1!DriverEntry (MyDriver1+0x0)
kd> g アクセス違反 - コード c0000005 (!!! 二度目のチャンス!!!)
nt!IopUnloadDriver+0x327: fffff800`02cb8b29 0fb74844 movzx
ecx,word ptr [rax+44h]
最後に、今実行を続けると、BSOD が発生します...
ここで何が問題なのですか?私のコードは間違っていますか、それともブレークポイントを正しく設定していませんか?