在下列範例中,驅動程式會使用 ASSERT 巨集來檢查驅動程式映像偵錯版本中的正確裝置狀態,但不會檢查相同驅動程式來源零售組建中的裝置狀態:
case IOCTL_WAIT_FOR_EVENT:
ASSERT((!Extension->WaitEventIrp));
Extension->WaitEventIrp = Irp;
IoMarkIrpPending(Irp);
status = STATUS_PENDING;
在偵錯驅動程式映射中,如果驅動程式已經保留擱置的 IRP,系統將會判斷提示。 不過,在零售組建中,驅動程式不會檢查此錯誤。 對相同 IOCTL 的連續兩次呼叫會使驅動程式失去 IRP 的追蹤。
在多處理器系統上,此程式碼片段可能會導致其他問題。 假設在進入時,此例程擁有此 IRP 的所有權(可以操作此 IRP)。 當常式將 Irp 指標儲存在 Extension-WaitEventIrp> 的全域結構中時,另一個執行線程可以從該全域結構取得 IRP 位址,並在 IRP 上執行作業。 若要防止此問題,驅動程式應該在儲存 IRP 之前將 IRP 標示為擱置中,並且在互鎖的序列中包含對 IoMarkIrpPending 的呼叫和指派操作。 IRP 的 Cancel 常式可能也是必要的。