共用方式為


KMDF) (RequestProcessing 規則集

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

本節內容

主題 描述

ChangeQueueState

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

CompleteCanceledReq

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

DoubleCompletion

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

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

InternalIoctlReqs

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

InvalidReqAccess

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

InvalidReqAccessLocal

InvalidReqAccessLocal 規則會指定在本機建立的要求完成或取消之後,不會存取這些要求。 此規則可能會與其他規則重疊,例如檢查雙重完成的規則,或檢查要求的規則已標示為可取消的兩次。

IoctlReqs

IoctlReqs 規則指定 IOCTL 要求不得傳遞至不適當的 KMDF 要求,或傳送設備驅動器介面 (DIS) 。

MarkCancOnCancReqLocal

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

NoIoQueuePurgeSynchronously

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

OutputBufferAPI

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

ReadReqs

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

ReqCompletionRoutine

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

ReqDelete

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

ReqIsCancOnCancReq

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

ReqMarkCancelableSend

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

RequestCompleted

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

RequestFormattedValid

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

RequestGetStatusValid

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

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

RequestSendAndForgetNoFormatting

RequestSendAndForgetNoFormatting 規則會先確認驅動程式不會使用 I/O 目標格式函式來格式化要求,然後再將它傳送至 I/O 目標,並將該選項傳送至 I/O 目標WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET。

RequestSendAndForgetNoFormatting2

RequestSendAndForgetNoFormatting2 規則會先確認驅動程式不會使用 I/O 目標格式函式來格式化要求,然後再將它傳送至 I/O 目標,並將傳送選項WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET。

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. 在 Microsoft Visual Studio 中選取您的驅動程式專案 (.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)