エラーが発生したドライバー アンロードのデバッグ
DeviceObject または DriverObject への漏えいした参照がある場合、ドライバーはアンロードされません。 これは、失敗したドライバー アンロードの一般的な原因です。
IoCreateDevice とは別に、DriverObject および DeviceObject への参照を受け取る関数がいくつかあります。 関数の使用に関するガイドラインに従わないと、参照が漏洩します。
この問題をデバッグする方法の例を次に示します。 この例では DeviceObject を使用していますが、この手法はすべてのオブジェクトに対して機能します。
アンロードに失敗するドライバーの修正
ドライバーが IoCreateDevice を呼び出す直後にブレークポイントを置きます。 DeviceObject のアドレスを取得します。
このオブジェクト アドレスで !object 拡張機能を使用して、オブジェクト ヘッダーを見つけます。
kd> !object 81a578c0 Object: 81a578c0 Type: (81bd0e70) Device ObjectHeader: 81a578a8 HandleCount: 0 PointerCount: 3 Directory Object: e1001208 Name: Serial0
ObjectHeader 内の最初の変数は、ポインター数または参照数です。
ObjectHeader のアドレスを使用して、ポインター数に書き込みブレークポイントを置きます。
kd> ba w4 81a578a8 "k;g"
g (実行) を使用します。 デバッガーがログを生成します。
一致しない参照/逆参照のペア (具体的には、欠落している逆参照) を探します。 (ObReferenceObject は、カーネル内のマクロとして実装されます。)