次の方法で共有


ドライバーの状態を確認できない

次の例では、ドライバーは ASSERT マクロを使用して、ドライバー イメージのデバッグ バージョンで正しいデバイスの状態を確認しますが、同じドライバー ソースのリテール ビルドではデバイスの状態を確認しません。

   case IOCTL_WAIT_FOR_EVENT:

      ASSERT((!Extension->WaitEventIrp));
      Extension->WaitEventIrp = Irp;
      IoMarkIrpPending(Irp);
      status = STATUS_PENDING;

デバッグ ドライバー イメージで、ドライバーが既に保留中の IRP を保持している場合、システムはアサートします。 ただし、リテール ビルドでは、ドライバーはこのエラーを確認しません。 同じ IOCTL を 2 回呼び出すと、ドライバーは IRP を追跡できなくなります。

マルチプロセッサ システムでは、このコード フラグメントによって追加の問題が発生する可能性があります。 エントリ時に、このルーチンにこの IRP の所有権 (操作する権限) があるとします。 ルーチンは、Extension->WaitEventIrp でグローバル構造体に Irp ポインターを保存するとき、別のスレッドは、そのグローバル構造体から IRP アドレスを取得し、IRP の操作を実行できます。 この問題を回避するには、ドライバーは、IRP を保存する前に保留中の IRP をマークする必要がありますし、 IoMarkIrpPending への呼び出しと、インターロックされたシーケンスでの割り当ての両方を含める必要があります。 IRP の キャンセル ルーチンも必要な場合があります。