エラーが発生したドライバー アンロードのデバッグ

DeviceObject または DriverObject への漏えいした参照がある場合、ドライバーはアンロードされません。 これは、失敗したドライバー アンロードの一般的な原因です。

IoCreateDevice とは別に、DriverObject および DeviceObject への参照を受け取る関数がいくつかあります。 関数の使用に関するガイドラインに従わないと、参照が漏洩します。

この問題をデバッグする方法の例を次に示します。 この例では DeviceObject を使用していますが、この手法はすべてのオブジェクトに対して機能します。

アンロードに失敗するドライバーの修正

  1. ドライバーが IoCreateDevice を呼び出す直後にブレークポイントを置きます。 DeviceObject のアドレスを取得します。

  2. このオブジェクト アドレスで !object 拡張機能を使用して、オブジェクト ヘッダーを見つけます。

    kd> !object 81a578c0 
    Object: 81a578c0  Type: (81bd0e70) Device
        ObjectHeader: 81a578a8
        HandleCount: 0  PointerCount: 3
        Directory Object: e1001208  Name: Serial0 
    

    ObjectHeader 内の最初の変数は、ポインター数または参照数です。

  3. ObjectHeader のアドレスを使用して、ポインター数に書き込みブレークポイントを置きます。

    kd> ba w4 81a578a8 "k;g" 
    
  4. g (実行) を使用します。 デバッガーがログを生成します。

  5. 一致しない参照/逆参照のペア (具体的には、欠落している逆参照) を探します。 (ObReferenceObject は、カーネル内のマクロとして実装されます。)