共用方式為


無法檢查驅動程序的狀態

在下列範例中,驅動程式會使用 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 常式可能也是必要的。