共用方式為


RequestProcessing 規則集 (KMDF)

使用這些規則來確認您的驅動程式已正確完成或取消 I/O 要求封包(IRP)。

本節中

主題 說明

ChangeQueueState

ChangeQueueState 規則指定 WDF 驅動程式不會嘗試從並行線程變更佇列的狀態,也不會從相同線程內呼叫變更 DIS 的狀態。 隊列狀態變更回呼函式為 WdfIoQueueStopWdfIoQueueStopSynchronouslyWdfIoQueuePurgeWdfIoQueuePurgeSynchronouslyWdfIoQueueDrainWdfIoQueueDrainSynchronouslyWdfIoQueueStopAndPurgeWdfIoQueueStopAndPurgeSynchronously。 如果佇列狀態變更正在進行時呼叫這些 DIS,則會導致電腦當機或變得沒有回應。

完成已取消請求

CompleteCanceledReq 規則會指定如果要求已經取消,要求就不再有效,而且驅動程式不應該完成它。 當驅動程式取消先前標記為可取消的要求時,必須檢查該要求尚未被取消。 如果驅動程式未進行這項檢查,驅動程式可能會完成已釋放的要求。

#B0 #A1 雙重完成 #A2 #C3

DoubleCompletion 規則指定驅動程式不能完成 I/O 要求兩次。 下列方法不應在同一個要求裡連續呼叫兩次:WdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoost

DoubleCompletionLocal

DoubleCompletionLocal 規則指定驅動程式不能完成 I/O 要求兩次。

EvtIoStopCancel

EvtIoStopCancel 規則會指定在 EvtIoStop 回呼函式內,驅動程式會針對無法取消的 I/O 要求呼叫下列其中一種方法。

EvtIoStopCompleteOrStopAck

EvtIoStopCompleteOrStopAck 規則會指定在 EvtIoStop 回呼函式內,驅動程式會針對架構呈現的每個 I/O 要求呼叫下列其中一種方法。 如果未這麼做,驅動程式可能會封鎖系統進入另一個較低的電源狀態。

EvtSurpriseRemoveNoSuspendQueue

EvtSurpriseRemoveNoSuspendQueue 規則指定 WDF 驅動程式不應該從 EvtDeviceSurpriseRemoval 回呼函式清空、停止或清除佇列,而應該改用自我管理的 I/O 回呼函式。 EvtDeviceSurpriseRemoval 回呼函式不會與關閉電源路徑同步。

已配置檔案物件

FileObjectConfigured 規則會指定呼叫 WdfRequestGetFileObject 方法之前,會先呼叫 WdfDeviceInitSetFileObjectConfig

InternalIoctlReqs

InternalIoctlReqs 規則指定內部 IOCTL 要求不會傳遞至不適當的 KMDF 要求傳送設備驅動器介面 (DIS)。

InvalidReqAccess

InvalidReqAccess 規則指定請求在完成或取消後不會被存取。 此規則可能會與其他規則重疊,例如檢查兩次完成的規則,或檢查要求被標記為可取消兩次的規則。

InvalidReqAccessLocal

完成或取消後,本地建立的請求不應被存取,此為 InvalidReqAccessLocal 規則。 此規則可能會與其他規則重疊,例如檢查雙重完成的規則,或者檢查請求已被標記為可取消兩次的規則。

IoctlReqs

IoctlReqs 規則指定 IOCTL 要求不得傳遞至不適當的 KMDF 請求或發送設備驅動程式介面(DDIs)。

MarkCancOnCancReqLocal

MarkCancOnCancReqLocal 規則指定 WdfRequestMarkCancelable 方法無法在相同的 I/O 要求上連續呼叫兩次。

NoIoQueuePurgeSynchronously

NoIoQueuePurgeSynchronously 規則驗證 WDF 驅動程式不會從下列 EvtIO 佇列物件事件回呼函式呼叫 WdfIoQueueStopSynchronouslyWdfIoQueueDrainSynchronouslyWdfIoQueueStopAndPurgeSynchronouslyWdfIoQueuePurgeSynchronously 函式:

OutputBufferAPI

OutputBufferAPI 規則指定在 EvtIoWrite 回呼函式中使用正確的緩衝區擷取 DDIs。 在 EvtIoWrite 回呼函式中,無法呼叫下列 DIS 來擷取緩衝區:

ReadReqs

ReadReqs 規則會指定讀取要求不會傳遞至不適當的 KMDF 方法。

ReqCompletionRoutine

ReqCompletionRoutine 規則指定必須先設定完成例程,才能將要求傳送至 I/O 目標。

ReqDelete

ReqDelete 規則會指定驅動程式建立的要求不會傳遞至 WdfRequestCompleteXxx 函式。 因此,請求應該在完成時刪除。

在取消請求上請求被取消

ReqIsCancOnCancReq 規則指定 WdfRequestIsCanceled 方法只能在未標示為可取消的要求上呼叫。

ReqMarkCancelableSend

ReqMarkCancelableSend 規則會指定驅動程序轉送的要求不會藉由呼叫 WdfRequestMarkCancelable 來標示為可取消。

RequestCompleted

DeferredRequestCompleted 規則會指定針對非篩選驅動程式,除非延遲或轉送要求,或呼叫 WdfRequestStopAcknowledge,否則每個提供給驅動程式的預設 I/O 佇列要求都必須完成。

請求格式有效

RequestFormattedValid 規則會指定驅動程式在傳送要求至 I/O 目標之前,先格式化所有要求,但WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET要求除外。

RequestGetStatusValid

RequestGetStatusValid 規則,指定下列其中一種情況中,應該針對要求呼叫 WdfRequestGetStatus

  • WdfRequestSend 傳回失敗時。
  • 使用 WDF_REQUEST_SEND_OPTION_SYNCHRONOUS 傳送要求時。

RequestSendAndForgetNoFormatting

RequestSendAndForgetNoFormatting 規則將驗證驅動程式不會在將請求傳送至具有 WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET 傳送選項的 I/O 目標之前使用 I/O 目標格式化函式來格式化該請求。

RequestSendAndForgetNoFormatting2

RequestSendAndForgetNoFormatting2 規則會驗證驅動程式不會在使用傳送選項 WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET 將要求傳送至 I/O 目標之前,使用 I/O 目標格式函式來格式化要求。

StopAckWithinEvtIoStop

StopAckWithinEvtIoStop 規則指定 WdfRequestStopAcknowledge 函式只會從 EvtIoStop 回呼函式內呼叫。

WdfIoQueueFindRequestFailed

WdfIoQueueFindRequestFailed 規則指定 WdfIoQueueRetrieveFoundRequestWdfObjectDereference 只能在 WdfIoQueueFindRequestFailed 傳回STATUS_SUCCESS之後呼叫。

WdfIoQueueRetrieveFoundRequest

WdfIoQueueRetrieveFoundRequest 規則指定只有在呼叫 WdfIoQueueFindRequest 並傳 STATUS_SUCCESS回 WdfObjectDereference 之後,才會呼叫 WdfIoQueueRequest 方法,而且不會在相同的要求上呼叫 WdfObjectDereference

WdfIoQueueRetrieveNextRequest

WdfIoQueueRetrieveNextRequest 規則指定在呼叫 WdfIoQueueFindRequest 之後,不會呼叫 WdfIoQueueRetrieveNextRequest

WriteReqs

WriteReqs 規則會指定寫入要求不會傳遞至不適當的 KMDF 方法。

若要選取 RequestProcessing 規則集

  1. 在 Visual Studio Microsoft中選取您的驅動程式專案 (.vcxProj)。 從「驅動程式」選單中,按下「啟動靜態驅動程式驗證程式…」。

  2. 按兩下 [ 規則] 索引標籤。在 [規則集] 底下,選取 [要求處理]。

    若要從 Visual Studio 開發人員命令提示字元視窗中選取預設規則集,請使用 /check 選項指定 RequestProcessing.sdv。 例如:

    msbuild /t:sdv /p:Inputs="/check:RequestProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    如需詳細資訊,請參閱 使用靜態驅動程式驗證器尋找驅動程式中的瑕疵靜態驅動程式驗證器命令 (MSBuild)