警告规则集 (KMDF)

使用这些规则验证驱动程序是否可以在各种上下文中正确处理 IRP,并遵循 Microsoft 建议的最佳做法。

在本节中

主题 说明

DeferredRequestCompleted

DeferredRequestCompleted 规则指定,如果提供给驱动程序的默认 I/O 队列的 I/O 请求未在回调函数中完成,但延迟处理,则必须在延迟处理回调函数中完成该请求,除非将请求转发并传递到框架,或者除非调用 WdfRequestStopAcknowledge 方法。

DriverAttributeChanged

DriverAttributeChanged 规则指定驱动程序不得更改 KMDF 驱动程序的执行级别或同步范围。

DrvAckIoStop

DrvAckIoStop 规则验证驱动程序在电源管理的队列关闭时是否知道挂起的请求,并且驱动程序会相应地确认、完成或取消挂起的请求。 对于自托管 I/O 请求,驱动程序还应正确处理来自其 EvtDeviceSelfManagedIoSuspend 函数的 这些请求。 在关机期间无法处理这些请求的驱动程序将导致 bug 检查0x9F:DRIVER_POWER_STATE_FAILURE

EvtIoResumeGetParam

EvtIoResumeGetParam 规则指定不在 EvtIoResumeGetParam 回调函数中调用 WdfRequestGetParameters

EvtIoStopGetParam

EvtIoStopGetParam 规则检查是否未在 EvtIoStop 回调中调用 WdfRequestGetParameters

EvtIoStopResume

EvtIoStopResume 规则指定,如果驱动程序注册了 EvtIoStop 回调函数,然后使用 Requeue 参数等于 FALSE 调用 WdfRequestStopAcknowledge,则驱动程序必须注册 EvtIoResume 回调函数。 当设备再次进入 D0 状态时,框架会将请求传送到 EvtIoResume 回调函数。

EvtSurpriseRemoveNoRequestComplete

EvtSurpriseRemoveNoRequestComplete 规则指定 WDF 驱动程序不应完成来自 EvtDeviceSurpriseRemoval 回调的请求,而应使用自托管 I/O 回调函数。 EvtDeviceSurpriseRemoval 回调未与断电路径同步。

FDOPowerPolicyOwnerAPI

FDOPowerPolicyOwnerAPI 规则指定,如果 FDO 驱动程序放弃电源策略所有权,则只能在驱动程序是电源策略所有者的执行路径上调用 WdfDeviceInitSetPowerPolicyEventCallbacksWdfDeviceAssignS0IdleSettingsWdfDeviceAssignSxWakeSettings 方法。 SDV 针对此规则发出警告。

NoCancelFromEvtSurpriseRemove

NoCancelFromEvtSurpriseRemove 规则指定 WDF 驱动程序不应取消来自 EvtDeviceSurpriseRemoval 回调函数的请求,而应使用自托管 I/O 回调函数。 EvtDeviceSurpriseRemoval 回调函数未与断电路径同步。

PagedCodeAtD0

PagedCodeAtD0 规则指定驱动程序不得在启动代码路径中的回调函数中将代码标记为可分页。

ParentObjectCheck

ParentObjectCheck 规则指定驱动程序应调用 WdfMemoryCreate,并使用 WDF_OBJECT_ATTRIBUTES 结构指定父对象。 如果驱动程序未为框架内存对象设置父对象,则框架会将驱动程序设置为默认父对象,以便除非驱动程序显式删除框架内存对象,否则它将保留在内存中,直到驱动程序对象卸载为止。

ReqNotCanceledLocal

ReqNotCanceledLocal 规则指定,如果在默认 I/O 队列回调函数中完成标记为可取消的请求,则必须在完成之前对 I/O 请求调用 WdfRequestUnmarkCancelable 方法。 I/O 请求必须完成,除非请求在调用 WdfRequestUnmarkCancelable 之前已取消。

ReqSendFail

ReqSendFail 规则指定在 WdfRequestSend 方法可能失败的情况下,驱动程序必须设置正确的完成状态。

RequestCompletedLocal

RequestCompletedLocal 规则指定,如果在任何 EvtIoDefault、EvtIoRead、EvtIoWriteEvtIoDeviceControlEvtIoInternalDeviceControl 回调函数中未完成 I/O 请求,并且如果未在回调函数内对请求调用 WdfRequestMarkCancelable,则驱动程序代码中可能存在请求完成问题。

RequestForUrbXrb

如果客户端驱动程序调用 WdfUsbTargetDeviceCreateWithParameters,并在WDF_USB_DEVICE_CREATE_CONFIG结构中指定客户端协定版本USBD_CLIENT_CONTRACT_VERSION_602, (将 USB 驱动程序堆栈的新功能用于Windows 8) ,则内部使用 URB 的 DDI 仅在以下任何先决条件适用时使用 URB 上下文

SyncReqSend

SyncReqSend 规则指定所有同步发送请求都是使用特定于同步的 KMDF 设备驱动程序接口方法完成的,并且这些方法设置了非零超时值。

SyncReqSend2

SyncReqSend2 规则指定同步请求发送时设置了非零超时值。

选择警告规则集

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

  2. 单击“ 规则 ”选项卡。在 “规则集”下,选择“ 警告”。

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

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

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