WDM (IrpProcessing 規則集)
使用這些規則來確認驅動程序正確地處理 I/O 要求封包, (IRP) 。
本節內容
主題 | 描述 |
---|---|
CompleteRequest 規則會確認完成例程執行之後不會呼叫 IoCompleteRequest 例程,而且不會傳回STATUS_MORE_PROCESSING_REQUIRED。 |
|
CompleteRequestStatusCheck 規則會確認 IRP 中的 I/O 狀態值符合較低驅動程式傳回的狀態值。 |
|
CompletionRoutineRegistered 規則會指定,如果分派例程使用 IoSetCompletionRoutineEx 註冊 IoCompletion 例程,則分派例程之後必須呼叫 IoCallDriver 或 PoCallDriver。 |
|
DoubleCompletion (WDM) 規則指定驅動程式不得針對相同的 IRP 呼叫 IoCompleteRequest 例程兩次。 |
|
IoReuseIrp 規則會指定驅動程式應該只在先前使用 IoAllocateIrp 配置的 IRP 上使用 IoReuseIrp。 |
|
IoReuseIrp2 規則會指定驅動程式應該只在先前在驅動程式內配置的 IRP 上使用 IoReuseIrp。 |
|
IoSetCompletionExCompleteIrp 規則會指定 IoSetCompletionRoutineEx 例程會傳回 NTSTATUS 值。 驅動程式必須檢查此值,以判斷IoCompletion例程是否已在呼叫IoCallDriver或PoCallDriver之前成功註冊,以及IoSetCompletionRoutineEx是否失敗,則應該完成IRP並傳回分派例程。 |
|
IoSetCompletionRoutineExCheck 規則會指定 IoSetCompletionRoutineEx 例程會傳回 NTSTATUS 值。 驅動程式必須檢查此值,以判斷是否已在呼叫 IoCallDriver 或 PoCallDriver 之前成功註冊 IoCompletion 例程。 |
|
IoSetCompletionRoutineExCheckDeviceObject 規則會指定,如果目前的裝置物件未傳遞至 IoSetCompletionRoutineEx,而較低的裝置對像是,這可能會導致競爭條件,即使完成例程尚未執行,仍可卸除目前的裝置物件。 |
|
IoSetCompletionRoutineNonPnpDriver 規則會指定不是 PnP 驅動程序的驅動程式應該使用 IoSetCompletionRoutineEx 而非 IoSetCompletionRoutine。 |
|
IrpCancelField 規則指定在 IRP 上設定已畫筆的取消例程時,驅動程式會檢查 Irp-Cancel> 成員的值。 |
|
IrpProcessingComplete 規則會指定,如果分派例程傳回STATUS_SUCCESS,則驅動程式本身或較低層級驅動程序必須已完成 IRP。 |
|
LowerDriverReturn 規則指定在使用 PoCallDriver 或 IoCallDriver 呼叫較低的驅動程式之後,驅動程式會儲存呼叫的傳回狀態,並將收到的傳回狀態傳遞至分派例程。 |
|
SignalEventInCompletion 規則會指定處理異步 IRP 時,驅動程式必須在設定 Irp-PendingReturned> 旗標時,在完成例程中呼叫 KeSetEvent。 |
|
SignalEventInCompletion2 規則指定在處理異步 IRP 時,驅動程式必須在設定 Irp-PendingReturned> 旗標時,在完成例程中呼叫 KeSetEvent。 |
|
SignalEventInCompletion3 規則會指定處理異步 IRP 時,驅動程式必須在設定 Irp-PendingReturned> 旗標時,在完成例程中呼叫 KeSetEvent。 |
|
StartIoCancel 規則會指定驅動程式在呼叫具有非 NULLCancel 例程的 IoSetCancelable 參數之前,必須先將 NonCancelable 參數設為 FALSE 來呼叫 IoSetStartIoAttributes。 |
|
StartIoRecursion 規則會指定,如果驅動程式的 StartIo 例程包含對 IoStartNextPacket 的呼叫,驅動程式必須先呼叫 IoSetStartIoAttributes,並將 DeferredStartIo 屬性設定為 TRUE。 否則,可能會產生無限遞歸。 |
|
PnpRemove 規則會指定驅動程式無法完成失敗IRP_MN_SURPRISE_REMOVAL、IRP_MN_CANCEL_REMOVE_DEVICE、IRP_MN_CANCEL_STOP_DEVICE或IRP_MN_REMOVE_DEVICE要求。 |
|
PnpSurpriseRemove 規則指定驅動程式不會在處理IRP_MN_SURPRISE_REMOVAL要求時呼叫 IoDeleteDevice 或 IoDetachDevice。 |
|
PowerDownAllocate 規則指定當處理從 s0 到 [S1... 的 SystemPowerState 轉換IRP_MN_SET_POWER要求時,FDO 和 FIDO 驅動程式不應該配置記憶體S5]。 |
|
PowerDownFail 規則指定當裝置關閉電源時,FDO 或 FIDO 驅動程式不應該失敗IRP_MN_SET_POWER要求。 此規則僅適用於 FDO 和 FIDO 驅動程式。 |
|
PowerIrpDIS 規則會指定當驅動程式處理具有IRP_MN_SET_POWER的系統或裝置IRP_MJ_POWER時,不應該呼叫只能在PASSIVE_LEVEL呼叫的 DIS。 |
|
PowerUpFail 規則會指定當裝置啟動時,FDO 或 FIDO 驅動程式不應該失敗IRP_MN_SET_POWER要求。 |
|
PnpIrpCompletion 規則會驗證 FDO 驅動程式是否將 PnP IRP 傳遞至較低的驅動程式。 |
|
WmiComplete 規則會指定在處理 WMI 次要 IRP 時,驅動程式會在從 DispatchSystemControl 例程傳回之前呼叫 IoCompleteRequest。 |
|
WmiForward 規則會指定當需要轉送時,驅動程式必須轉送 WMI 次要 IRP。 |
若要選取 IrpProcessing 規則集
在 Microsoft Visual Studio 中選取您的驅動程式專案 (.vcxProj) 。 從 [ 驅動程式] 功能表中,按兩下 [ 啟動靜態驅動程序驗證程式...]。
按兩下 [ 規則] 索引 標籤。在 [規則集] 底下,選取 [ IrpProcessing]。
若要從 Visual Studio 開發人員命令提示字元視窗中選取預設規則集,請使用 /check 選項指定 IrpProcessing.sdv。 例如:
msbuild /t:sdv /p:Inputs="/check:IrpProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
如需詳細資訊,請參閱 使用靜態驅動程式驗證器在驅動程式 和 靜態驅動程式驗證器命令中尋找瑕疵, (MSBuild) 。