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