共用方式為


無法檢查驅動程式的狀態

在下列範例中,驅動程式會使用 ASSERT 宏檢查驅動程式映射偵錯版本中的正確裝置狀態,但不會檢查相同驅動程式來源零售組建中的裝置狀態:

   case IOCTL_WAIT_FOR_EVENT:

      ASSERT((!Extension->WaitEventIrp));
      Extension->WaitEventIrp = Irp;
      IoMarkIrpPending(Irp);
      status = STATUS_PENDING;

在偵錯驅動程式映射中,如果驅動程式已暫止 IRP,系統會判斷提示。 不過,在零售組建中,驅動程式不會檢查此錯誤。 對相同 IOCTL 的兩次呼叫會導致驅動程式無法追蹤 IRP。

在多處理器系統上,此程式碼片段可能會導致其他問題。 假設在此常式上,此常式擁有權 (管理此 IRP) 的許可權。 當常式將 Irp 指標儲存在 Extension-WaitEventIrp >的全域結構時,另一個執行緒可以從該全域結構取得 IRP 位址,並在 IRP 上執行作業。 若要避免這個問題,驅動程式應該在儲存 IRP 之前將 IRP 標示為擱置中,而且應該同時包含 對 IoMarkIrpPending 的 呼叫,以及在相互鎖定的序列中包含指派。 可能也需要 IRP 的 Cancel 常式。