KMDF) (RequestProcessing 規則集
使用這些規則來確認驅動程式已正確完成或取消 I/O 要求封包, (IRP) 。
本節內容
主題 | 描述 |
---|---|
ChangeQueueState 規則會指定 WDF 驅動程式不會嘗試從並行線程變更佇列的狀態,也不會從相同的線程內呼叫變更 DIS 的狀態。 隊列狀態變更回呼函式為 WdfIoQueueStop、WdfIoQueueStopSynchronously、WdfIoQueuePurge、WdfIoQueuePurgeSynchronously、WdfIoQueueDrain、WdfIoQueueDrainSynchronously、WdfIoQueueStopAndPurge和 WdfIoQueueStopAndPurgeSynchronously。 如果佇列狀態變更正在進行時呼叫這些 DIS,則會導致電腦當機或變得沒有回應。 |
|
CompleteCanceledReq 規則會指定如果要求已經取消,要求就不再有效,而且驅動程式不應該完成。 當驅動程式取消標記先前標示為可取消的要求時,它必須檢查要求尚未取消。 如果驅動程式未進行這項檢查,驅動程式可能會完成已釋出的要求。 |
|
DoubleCompletion 規則指定驅動程式不能完成 I/O 要求兩次。 下列方法不應該在相同要求的數據列中呼叫兩次: WdfRequestComplete、 WdfRequestCompleteWithInformation、 WdfRequestCompleteWithPriorityBoost。 |
|
DoubleCompletionLocal 規則指定驅動程式不能完成 I/O 要求兩次。 |
|
EvtIoStopCancel 規則指定在 EvtIoStop 回呼函式內,驅動程式會針對無法取消的 I/O 要求呼叫下列其中一種方法。 |
|
EvtIoStopCompleteOrStopAck 規則會指定在 EvtIoStop 回呼函式內,驅動程式會針對架構呈現的每個 I/O 要求呼叫下列其中一種方法。 如果未這麼做,驅動程式可能會封鎖系統進入另一個較低的電源狀態。 |
|
EvtSurpriseRemoveNoSuspendQueue 規則會指定 WDF 驅動程式不應該清空、停止或清除 EvtDeviceSurpriseRemoval 回呼函式中的佇列,而是應該使用自我管理 I/O 回呼函式。 EvtDeviceSurpriseRemoval 回呼函式不會與關閉電源路徑同步。 |
|
FileObjectConfigured 規則會指定呼叫 WdfRequestGetFileObject 方法之前會呼叫 WdfDeviceInitSetFileObjectConfig。 |
|
InternalIoctlReqs 規則會指定內部 IOCTL 要求不會傳遞至不適當的 KMDF 要求傳送設備驅動器介面, (DIS) 。 |
|
InvalidReqAccess 規則會指定要求在完成或取消之後不會存取。 此規則可能會與其他規則重疊,例如檢查雙重完成的規則,或檢查要求的規則已標示為可取消的兩次。 |
|
InvalidReqAccessLocal 規則會指定在本機建立的要求完成或取消之後,不會存取這些要求。 此規則可能會與其他規則重疊,例如檢查雙重完成的規則,或檢查要求的規則已標示為可取消的兩次。 |
|
IoctlReqs 規則指定 IOCTL 要求不得傳遞至不適當的 KMDF 要求,或傳送設備驅動器介面 (DIS) 。 |
|
MarkCancOnCancReqLocal 規則指定在同一個 I/O 要求上無法連續呼叫 WdfRequestMarkCancelable 方法兩次。 |
|
NoIoQueuePurgeSynchronously 規則會驗證 WDF 驅動程式不會從下列 EvtIO 佇列物件事件回呼函式呼叫 WdfIoQueueStopSynchronously、WdfIoQueueDrainSynchronously、WdfIoQueueStopAndPurgeSynchronously或 WdfIoQueuePurgeSynchronously 函式: |
|
OutputBufferAPI 規則會指定在 EvtIoWrite 回呼函式中使用正確的緩衝區擷取 DIS。 在 EvtIoWrite 回呼函式中,無法呼叫下列 DDI 以進行緩衝區擷取: |
|
ReadReqs 規則會指定讀取要求不會傳遞至不適當的 KMDF 方法。 |
|
ReqCompletionRoutine 規則指定必須先設定完成例程,才能將要求傳送至 I/O 目標。 |
|
ReqDelete 規則會指定驅動程式建立的要求不會傳遞至 WdfRequestCompleteXxx 函式。 相反地,完成時應該刪除要求。 |
|
ReqIsCancOnCancReq 規則指定 WdfRequestIsCanceled 方法只能在未標示為可取消的要求上呼叫。 |
|
ReqMarkCancelableSend 規則會指定驅動程序轉送的要求不會藉由呼叫 WdfRequestMarkCancelable 標示為可取消。 |
|
DeferredRequestCompleted 規則會指定針對非篩選驅動程式,必須完成提供給驅動程序預設 I/O 佇列的每個要求,除非延遲或轉送要求,或呼叫 WdfRequestStopAcknowledge。 |
|
RequestFormattedValid 規則會指定驅動程式在傳送要求至 I/O 目標之前,先格式化所有要求,但WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET要求除外。 |
|
RequestGetStatusValid 規則,指定在下列其中一種情況下,應該針對要求呼叫 WdfRequestGetStatus:
|
|
RequestSendAndForgetNoFormatting 規則會先確認驅動程式不會使用 I/O 目標格式函式來格式化要求,然後再將它傳送至 I/O 目標,並將該選項傳送至 I/O 目標WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET。 |
|
RequestSendAndForgetNoFormatting2 規則會先確認驅動程式不會使用 I/O 目標格式函式來格式化要求,然後再將它傳送至 I/O 目標,並將傳送選項WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET。 |
|
StopAckWithinEvtIoStop 規則指定 WdfRequestStopAcknowledge 函式只會從 EvtIoStop 回呼函式內呼叫。 |
|
WdfIoQueueFindRequestFailed 規則指定 WdfIoQueueRetrieveFoundRequest 或 WdfObjectDereference 應該只在 WdfIoQueueFindRequestFailed 傳回STATUS_SUCCESS之後呼叫。 |
|
WdfIoQueueRetrieveFoundRequest 規則指定只有在呼叫 WdfIoQueueFindRequest 並傳回 STATUS_SUCCESS WdfObjectDereference 之後,才會呼叫 WdfIoQueueRequest 方法,而且相同的要求上不會呼叫任何 WdfObjectDereference。 |
|
WdfIoQueueRetrieveNextRequest 規則指定在呼叫 WdfIoQueueFindRequest 之後,不會呼叫 WdfIoQueueRetrieveNextRequest。 |
|
WriteReqs 規則會指定寫入要求不會傳遞至不適當的 KMDF 方法。 |
若要選取 RequestProcessing 規則集
在 Microsoft Visual Studio 中選取您的驅動程式專案 (.vcxProj) 。 從 [ 驅動程式] 功能表中,按兩下 [ 啟動靜態驅動程序驗證程式...]。
按兩下 [ 規則] 索引 標籤。在 [規則集] 底下,選取 [要求處理]。
若要從 Visual Studio 開發人員命令提示字元視窗中選取預設規則集,請使用 /check 選項指定 RequestProcessing.sdv。 例如:
msbuild /t:sdv /p:Inputs="/check:RequestProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
如需詳細資訊,請參閱 使用靜態驅動程式驗證器在驅動程式 和 靜態驅動程式驗證器命令中尋找瑕疵, (MSBuild) 。