RequestProcessing 规则集 (KMDF)

使用这些规则验证驱动程序是否已正确完成或取消 I/O 请求数据包 (IRP) 。

在本节中

主题 说明

ChangeQueueState

ChangeQueueState 规则指定 WDF 驱动程序不会尝试从并发线程更改队列的状态,也不从同一线程中调用一个接一个地更改状态的 DDI。 队列状态更改回调函数包括 WdfIoQueueStopWdfIoQueueStopSynchronouslyWdfIoQueuePurgeWdfIoQueuePurgeSynchronouslyWdfIoQueueDrainWdfIoQueueDrainSynchronouslyWdfIoQueueStopAndPurgeWdfIoQueueStopAndPurgeSynchronously。 如果在队列状态更改正在进行时调用这些 DDI,则会导致计算机崩溃或变得无响应。

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 请求发送设备驱动程序接口 (DDI) 。

InvalidReqAccess

InvalidReqAccess 规则指定在完成或取消请求后不会访问这些请求。 此规则可能与其他规则重叠,例如检查双重完成的规则,或针对请求检查的规则已标记为可取消两次。

InvalidReqAccessLocal

InvalidReqAccessLocal 规则指定在完成或取消本地创建的请求后不会访问这些请求。 此规则可能与其他规则重叠,例如检查双重完成的规则,或针对请求检查的规则已标记为可取消两次。

IoctlReqs

IoctlReqs 规则指定 IOCTL 请求不得传递到不适当的 KMDF 请求或发送设备驱动程序接口 (DDI) 。

MarkCancOnCancReqLocal

MarkCancOnCancReqLocal 规则指定不能在同一 I/O 请求上连续调用两次 WdfRequestMarkCancelable 方法。

NoIoQueuePurgeSynchronously

NoIoQueuePurgeSynchronously 规则验证 WDF 驱动程序未从以下 EvtIO 队列对象事件回调函数调用 WdfIoQueueStopSynchronouslyWdfIoQueueDrainSynchronouslyWdfIoQueueStopAndPurgeSynchronouslyWdfIoQueuePurgeSynchronously 函数:

OutputBufferAPI

OutputBufferAPI 规则指定在 EvtIoWrite 回调函数中使用正确的缓冲区检索 DDI。 在 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 目标格式设置函数设置请求的格式,然后再将其发送到具有 send 选项的 I/O 目标WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET。

RequestSendAndForgetNoFormatting2

RequestSendAndForgetNoFormatting2 规则验证驱动程序在将请求发送到具有 send 选项WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET的 I/O 目标之前,不会使用 I/O 目标格式函数设置请求的格式。

StopAckWithinEvtIoStop

StopAckWithinEvtIoStop 规则指定仅从 EvtIoStop 回调函数中调用 WdfRequestStopAcknowledge 函数。

WdfIoQueueFindRequestFailed

WdfIoQueueFindRequestFailed 规则指定仅在 WdfIoQueueFindRequestFailed 返回STATUS_SUCCESS后调用 WdfIoQueueRetrieveFoundRequest 或 WdfObjectDereference

WdfIoQueueRetrieveFoundRequest

WdfIoQueueRetrieveFoundRequest 规则指定仅在调用 WdfIoQueueFindRequest 并 STATUS_SUCCESS返回 WdfIoQueueFindRequest 之后调用 WdfIoQueueRequest 方法,并且不在同一请求中调用 WdfObjectDereference

WdfIoQueueRetrieveNextRequest

WdfIoQueueRetrieveNextRequest 规则指定在调用 WdfIoQueueFindRequest 之后不调用 WdfIoQueueRetrieveNextRequest

WriteReqs

WriteReqs 规则指定写入请求不会传递到不适当的 KMDF 方法。

选择 RequestProcessing 规则集

  1. 在 Microsoft Visual Studio 中选择驱动程序项目 (.vcxProj) 。 在“ 驱动程序 ”菜单中,单击“ 启动静态驱动程序验证程序...”

  2. 单击“ 规则 ”选项卡。在“ 规则集”下,选择“ 请求处理”。

    若要从 Visual Studio 开发人员命令提示符窗口中选择默认规则集,请使用 /检查 选项指定 RequestProcessing.sdv。 例如:

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

    有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷静态驱动程序验证程序命令 (MSBuild)