ドライバーの状態の確認エラー

次の例では、ドライバーは 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 のキャンセル ルーチンも必要な可能性があります。