使用這些規則來確認您的驅動程式已正確完成或取消 I/O 要求封包(IRP)。
本節中
| 主題 | 說明 |
|---|---|
ChangeQueueState 規則指定 WDF 驅動程式不會嘗試從並行線程變更佇列的狀態,也不會從相同線程內呼叫變更 DIS 的狀態。 隊列狀態變更回呼函式為 WdfIoQueueStop、WdfIoQueueStopSynchronously、WdfIoQueuePurge、WdfIoQueuePurgeSynchronously、WdfIoQueueDrain、WdfIoQueueDrainSynchronously、WdfIoQueueStopAndPurge 和 WdfIoQueueStopAndPurgeSynchronously。 如果佇列狀態變更正在進行時呼叫這些 DIS,則會導致電腦當機或變得沒有回應。 |
|
CompleteCanceledReq 規則會指定如果要求已經取消,要求就不再有效,而且驅動程式不應該完成它。 當驅動程式取消先前標記為可取消的要求時,必須檢查該要求尚未被取消。 如果驅動程式未進行這項檢查,驅動程式可能會完成已釋放的要求。 |
|
#B0 #A1 雙重完成 #A2 #C3 |
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 請求或發送設備驅動程式介面(DDIs)。 |
|
MarkCancOnCancReqLocal 規則指定 WdfRequestMarkCancelable 方法無法在相同的 I/O 要求上連續呼叫兩次。 |
|
NoIoQueuePurgeSynchronously 規則驗證 WDF 驅動程式不會從下列 EvtIO 佇列物件事件回呼函式呼叫 WdfIoQueueStopSynchronously、WdfIoQueueDrainSynchronously、WdfIoQueueStopAndPurgeSynchronously 或 WdfIoQueuePurgeSynchronously 函式: |
|
OutputBufferAPI 規則指定在 EvtIoWrite 回呼函式中使用正確的緩衝區擷取 DDIs。 在 EvtIoWrite 回呼函式中,無法呼叫下列 DIS 來擷取緩衝區: |
|
ReadReqs 規則會指定讀取要求不會傳遞至不適當的 KMDF 方法。 |
|
ReqCompletionRoutine 規則指定必須先設定完成例程,才能將要求傳送至 I/O 目標。 |
|
ReqDelete 規則會指定驅動程式建立的要求不會傳遞至 WdfRequestCompleteXxx 函式。 因此,請求應該在完成時刪除。 |
|
ReqIsCancOnCancReq 規則指定 WdfRequestIsCanceled 方法只能在未標示為可取消的要求上呼叫。 |
|
ReqMarkCancelableSend 規則會指定驅動程序轉送的要求不會藉由呼叫 WdfRequestMarkCancelable 來標示為可取消。 |
|
DeferredRequestCompleted 規則會指定針對非篩選驅動程式,除非延遲或轉送要求,或呼叫 WdfRequestStopAcknowledge,否則每個提供給驅動程式的預設 I/O 佇列要求都必須完成。 |
|
RequestFormattedValid 規則會指定驅動程式在傳送要求至 I/O 目標之前,先格式化所有要求,但WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET要求除外。 |
|
RequestGetStatusValid 規則,指定下列其中一種情況中,應該針對要求呼叫 WdfRequestGetStatus:
|
|
RequestSendAndForgetNoFormatting 規則將驗證驅動程式不會在將請求傳送至具有 WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET 傳送選項的 I/O 目標之前使用 I/O 目標格式化函式來格式化該請求。 |
|
RequestSendAndForgetNoFormatting2 規則會驗證驅動程式不會在使用傳送選項 WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET 將要求傳送至 I/O 目標之前,使用 I/O 目標格式函式來格式化要求。 |
|
StopAckWithinEvtIoStop 規則指定 WdfRequestStopAcknowledge 函式只會從 EvtIoStop 回呼函式內呼叫。 |
|
WdfIoQueueFindRequestFailed 規則指定 WdfIoQueueRetrieveFoundRequest 或 WdfObjectDereference 只能在 WdfIoQueueFindRequestFailed 傳回STATUS_SUCCESS之後呼叫。 |
|
WdfIoQueueRetrieveFoundRequest 規則指定只有在呼叫 WdfIoQueueFindRequest 並傳 STATUS_SUCCESS回 WdfObjectDereference 之後,才會呼叫 WdfIoQueueRequest 方法,而且不會在相同的要求上呼叫 WdfObjectDereference。 |
|
WdfIoQueueRetrieveNextRequest 規則指定在呼叫 WdfIoQueueFindRequest 之後,不會呼叫 WdfIoQueueRetrieveNextRequest。 |
|
WriteReqs 規則會指定寫入要求不會傳遞至不適當的 KMDF 方法。 |
若要選取 RequestProcessing 規則集
在 Visual Studio Microsoft中選取您的驅動程式專案 (.vcxProj)。 從「驅動程式」選單中,按下「啟動靜態驅動程式驗證程式…」。
按兩下 [ 規則] 索引標籤。在 [規則集] 底下,選取 [要求處理]。
若要從 Visual Studio 開發人員命令提示字元視窗中選取預設規則集,請使用 /check 選項指定 RequestProcessing.sdv。 例如:
msbuild /t:sdv /p:Inputs="/check:RequestProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32如需詳細資訊,請參閱 使用靜態驅動程式驗證器尋找驅動程式中的瑕疵 和 靜態驅動程式驗證器命令 (MSBuild)。