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