RequestProcessing 规则集 (KMDF)
使用这些规则验证驱动程序是否已正确完成或取消 I/O 请求数据包 (IRP) 。
在本节中
主题 | 说明 |
---|---|
ChangeQueueState 规则指定 WDF 驱动程序不会尝试从并发线程更改队列的状态,也不从同一线程中调用一个接一个地更改状态的 DDI。 队列状态更改回调函数包括 WdfIoQueueStop、 WdfIoQueueStopSynchronously、WdfIoQueuePurge、WdfIoQueuePurgeSynchronously、 WdfIoQueueDrain、 WdfIoQueueDrainSynchronously、 WdfIoQueueStopAndPurge 和 WdfIoQueueStopAndPurgeSynchronously。 如果在队列状态更改正在进行时调用这些 DDI,则会导致计算机崩溃或变得无响应。 |
|
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 请求发送设备驱动程序接口 (DDI) 。 |
|
InvalidReqAccess 规则指定在完成或取消请求后不会访问这些请求。 此规则可能与其他规则重叠,例如检查双重完成的规则,或针对请求检查的规则已标记为可取消两次。 |
|
InvalidReqAccessLocal 规则指定在完成或取消本地创建的请求后不会访问这些请求。 此规则可能与其他规则重叠,例如检查双重完成的规则,或针对请求检查的规则已标记为可取消两次。 |
|
IoctlReqs 规则指定 IOCTL 请求不得传递到不适当的 KMDF 请求或发送设备驱动程序接口 (DDI) 。 |
|
MarkCancOnCancReqLocal 规则指定不能在同一 I/O 请求上连续调用两次 WdfRequestMarkCancelable 方法。 |
|
NoIoQueuePurgeSynchronously 规则验证 WDF 驱动程序未从以下 EvtIO 队列对象事件回调函数调用 WdfIoQueueStopSynchronously、WdfIoQueueDrainSynchronously、WdfIoQueueStopAndPurgeSynchronously 或 WdfIoQueuePurgeSynchronously 函数: |
|
OutputBufferAPI 规则指定在 EvtIoWrite 回调函数中使用正确的缓冲区检索 DDI。 在 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 目标格式设置函数设置请求的格式,然后再将其发送到具有 send 选项的 I/O 目标WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET。 |
|
RequestSendAndForgetNoFormatting2 规则验证驱动程序在将请求发送到具有 send 选项WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET的 I/O 目标之前,不会使用 I/O 目标格式函数设置请求的格式。 |
|
StopAckWithinEvtIoStop 规则指定仅从 EvtIoStop 回调函数中调用 WdfRequestStopAcknowledge 函数。 |
|
WdfIoQueueFindRequestFailed 规则指定仅在 WdfIoQueueFindRequestFailed 返回STATUS_SUCCESS后调用 WdfIoQueueRetrieveFoundRequest 或 WdfObjectDereference。 |
|
WdfIoQueueRetrieveFoundRequest 规则指定仅在调用 WdfIoQueueFindRequest 并 STATUS_SUCCESS返回 WdfIoQueueFindRequest 之后调用 WdfIoQueueRequest 方法,并且不在同一请求中调用 WdfObjectDereference。 |
|
WdfIoQueueRetrieveNextRequest 规则指定在调用 WdfIoQueueFindRequest 之后不调用 WdfIoQueueRetrieveNextRequest。 |
|
WriteReqs 规则指定写入请求不会传递到不适当的 KMDF 方法。 |
选择 RequestProcessing 规则集
在 Microsoft Visual Studio 中选择驱动程序项目 (.vcxProj) 。 在“ 驱动程序 ”菜单中,单击“ 启动静态驱动程序验证程序...”。
单击“ 规则 ”选项卡。在“ 规则集”下,选择“ 请求处理”。
若要从 Visual Studio 开发人员命令提示符窗口中选择默认规则集,请使用 /检查 选项指定 RequestProcessing.sdv。 例如:
msbuild /t:sdv /p:Inputs="/check:RequestProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷 和 静态驱动程序验证程序命令 (MSBuild) 。