DDI 用法规则集 (KMDF)

使用这些规则验证驱动程序是否正确使用 KMDF DDI。

在本节中

主题 说明

BufAfterReqCompletedIoctl

BufAfterReqCompletedIoctl 规则指定在 EvtIoDeviceControl 回调函数中,在完成 I/O 请求后,无法访问检索到的 I/O 请求缓冲区。

BufAfterReqCompletedIntIoctl

BufAfterReqCompletedIntIoctl 规则指定在请求完成后,无法在 EvtIoInternalDeviceControl 回调函数内部 (访问其缓冲区,只能) 。 通过调用 WdfRequestRetrieveOutputBufferWdfRequestRetrieveUnsafeUserOutputBufferWdfRequestRetrieveInputBufferWdfRequestRetrieveUnsafeUserInputBuffer 来检索缓冲区。

BufAfterReqCompletedIntIoctlA

BufAfterReqCompletedIntIoctlA 规则验证请求完成后,无法在 EvtIoInternalDeviceControl 回调 (访问其缓冲区,仅) 。 通过调用 WdfRequestRetrieveInputBufferWdfRequestRetrieveOutputBufferWdfRequestRetrieveUnsafeUserInputBufferWdfRequestRetrieveUnsafeUserOutputBuffer 检索缓冲区。

BufAfterReqCompletedIoctlA

BufAfterReqCompletedIoctlA 规则指定在 EvtIoDeviceControl 回调函数中,在完成 I/O 请求后,无法访问检索到的 I/O 请求缓冲区。

BufAfterReqCompletedRead

BufAfterReqCompletedRead 规则指定在 EvtIoRead 回调函数中,在完成 I/O 请求后,无法访问检索到的 I/O 请求缓冲区。 有 14 个 DDI 可用作可能的缓冲区访问方法。

BufAfterReqCompletedReadA

BufAfterReqCompletedReadA 规则指定在 EvtIoRead 回调函数中,在完成 I/O 请求后,无法访问检索到的 I/O 请求缓冲区。 有 14 个 DDI 可用作可能的缓冲区访问方法。

BufAfterReqCompletedWrite

BufAfterReqCompletedWrite 规则指定在 EvtIoWrite 回调函数中,在 I/O 请求完成后无法访问检索到的 I/O 请求缓冲区。

BufAfterReqCompletedWriteA

BufAfterReqCompletedWriteA 规则指定在 EvtIoWrite 回调函数中,在 I/O 请求完成后无法访问检索到的 I/O 请求缓冲区。

ChildDeviceInitApi

ChildDeviceInitApi 规则指定,对于子设备,必须在驱动程序为子设备对象调用 WdfDeviceCreate 方法之前调用框架设备对象初始化方法。

ControlDeviceDeleted

ControDeviceDeleted 规则指定,如果 PnP 驱动程序创建控制设备对象,驱动程序必须在卸载驱动程序之前删除其中一个清理回调函数中的控制设备对象。

ControlDeviceInitAPI

ControlDeviceInitAPI 规则指定在 WdfControlDeviceInitAllocate 和所有其他为控制设备设置 WDFDEVICE_INIT 结构的设备对象初始化 DDI 之前,必须为控制设备调用 WdfDeviceCreate

CtlDeviceFinishInitDeviceAdd

CtlDeviceFinishInitDeviceAdd 规则指定,如果驱动程序在 EvtDriverDeviceAdd 回调函数中创建控制设备对象,则必须在创建设备后和退出 EvtDriverDeviceAdd 回调函数之前调用 WdfControlFinishInitializing。 此规则不适用于非 PnP 驱动程序。

CtlDeviceFinishInitDrEntry

CtlDeviceFinishInitDrEntry 规则指定,如果驱动程序在 DriverEntry 回调函数中创建控制设备对象,则必须在创建设备后从 EvtDriverDeviceAdd 回调函数退出之前调用 WdfControlFinishInitializing。 此规则不适用于非 PnP 驱动程序。

DeviceCreateFail

DeviceCreateFail 规则指定当 WdfDeviceCreate 调用失败时,EVT_WDF_DRIVER_DEVICE_ADD返回错误状态。

DeviceInitAllocate

DeviceInitAllocate 规则指定,对于 PDO 设备或控制设备对象,必须在驱动程序调用 WdfDeviceCreate 之前调用框架设备对象初始化方法 WdfPdoInitAllocate 或 WdfControlDeviceInitAllocate

DeviceInitAPI

对于 FDO 设备,必须先调用框架设备对象初始化方法和框架 FDO 初始化方法,然后驱动程序才能为设备对象调用 WdfDeviceCreate 方法。

DoubleDeviceInitFree

DoubleDeviceInitFree 规则指定驱动程序不应释放设备初始化结构两次。

DriverCreate

DriverCreate 规则指定使用内核模式驱动程序框架 (KMDF) 的驱动程序必须调用 WdfDriverCreate 方法来从其 DriverEntry 例程中创建框架驱动程序对象。

InitFreeDeviceCallback

InitFreeDeviceCallback 规则指定,如果驱动程序在初始化新的框架设备对象时遇到错误,并且驱动程序从调用 WdfControlDeviceInitAllocate 收到了 WDFDEVICE_INIT 结构,则驱动程序必须调用 WdfDeviceInitFree

InitFreeDeviceCreate

InitFreeDeviceCreate 规则指定,如果某个设备对象初始化方法中发生错误,并且驱动程序从调用 WdfControlDeviceInitAllocate 收到了 WDFDEVICE_INIT 结构,驱动程序必须调用 WdfDeviceInitFree 而不是 WdfDeviceCreate

InitFreeDeviceCreateType2

InitFreeDeviceCreateType2 规则指定驱动程序在调用 WdfDeviceInitFree 后不得调用 WdfDeviceCreate

InitFreeDeviceCreateType4

InitFreeDeviceCreateType4 规则指定,如果驱动程序在调用 WdfDeviceCreate 时遇到错误,并且驱动程序从调用 WdfControlDeviceInitAllocate 收到了 WDFDEVICE_INIT 结构,则必须调用 WdfDeviceInitFree

InitFreeNull

InitFreeNull 规则指定不能通过使用指向WDFDEVICE_INIT结构的 NULL 指针来调用作为参数接收PWDFDEVICE_INIT的 DDI。

MdlAfterReqCompletedIntIoctl

MdlAfterReqCompletedIntIoctl 规则指定在 EvtIoInternalDeviceControl 回调函数中,I/O 请求完成后无法访问内存描述符列表 (MDL) 。

MdlAfterReqCompletedIntIoctlA

MdlAfterReqCompletedIntIoctlA 规则指定在 EvtIoInternalDeviceControl 回调函数中,在 I/O 请求完成后无法访问内存描述符列表 (MDL) 。

MdlAfterReqCompletedIoctl

MdlAfterReqCompletedIoctl 规则指定在 EvtIoDeviceControl 回调函数中,I/O 请求完成后无法访问 MDL) 内存描述符列表 (。

MdlAfterReqCompletedIoctlA

MdlAfterReqCompletedIoctlA 规则指定在 EvtIoDeviceControl 回调函数中,I/O 请求完成后无法访问 MDL) 内存描述符列表 (。

MdlAfterReqCompletedRead

MdlAfterReqCompletedRead 规则指定在 EvtIoRead 回调函数内,在 I/O 请求完成后,无法访问检索到的 MDL) 对象的内存描述符 (列表。

MdlAfterReqCompletedReadA

MdlAfterReqCompletedReadA 规则指定在 EvtIoRead 回调函数中,在完成 I/O 请求后,无法访问检索到的 MDL) 对象的内存描述符 (列表。

MdlAfterReqCompletedWrite

MdlAfterReqCompletedWrite 规则指定在 EvtIoWrite 回调函数中,在完成 I/O 请求后,无法访问检索到的 MDL) 对象的内存描述符 (列表。

MdlAfterReqCompletedWriteA

MdlAfterReqCompletedWriteA 规则指定在 EvtIoWrite 回调函数中,在 I/O 请求完成后,无法访问检索 (到的 MDL) 对象的内存描述符列表。

MemAfterReqCompletedIntIoctl

MemAfterReqCompletedIntIoctl 规则指定在 EvtIoInternalDeviceControl 回调函数中,I/O 请求完成后无法访问框架内存对象。

MemAfterReqCompletedIntIoctlA

MemAfterReqCompletedIntIoctlA 规则指定在 EvtIoInternalDeviceControl 回调函数中,I/O 请求完成后无法访问框架内存对象。

MemAfterReqCompletedIoctl

MemAfterReqCompletedIoctl 规则指定在 EvtIoDeviceControl 回调函数中,I/O 请求完成后无法访问框架内存对象。

MemAfterReqCompletedIoctlA

MemAfterReqCompletedIoctlA 规则指定在 EvtIoDeviceControl 回调函数中,I/O 请求完成后无法访问框架内存对象。

MemAfterReqCompletedRead

MemAfterReqCompletedRead 规则指定在 EvtIoRead 回调函数中,I/O 请求完成后无法访问框架内存对象。

MemAfterReqCompletedReadA

MemAfterReqCompletedReadA 规则指定在 EvtIoRead 回调函数中,I/O 请求完成后无法访问框架内存对象。

MemAfterReqCompletedWrite

MemAfterReqCompletedWrite 规则指定在 EvtIoWrite 回调函数中,I/O 请求完成后无法访问框架内存对象。

MemAfterReqCompletedWriteA

MemAfterReqCompletedWriteA 规则指定在 EvtIoWrite 回调函数中,I/O 请求完成后无法访问框架内存对象。

NullCheck

NullCheck 规则验证驱动程序代码中的 NULL 值稍后不会在驱动程序中取消引用。 如果满足以下任一条件,则此规则将报告缺陷:

  • 有一个分配 NULL,稍后将取消引用。
  • 驱动程序中的过程有一个全局/参数,该参数可能为 NULL,稍后将取消引用,并且驱动程序中有一个显式检查,指示指针的初始值可能为 NULL。

如果出现 NullCheck 规则冲突,跟踪树窗格中将突出显示最相关的代码语句。 有关使用报表输出的详细信息,请参阅 静态驱动程序验证程序报告了解跟踪查看器

PdoDeviceInitAPI

PdoDeviceInitAPI 规则指定在驱动程序为 PDO 调用 WdfDeviceCreate 之前,必须调用 WdfPdoInitAllocate 和其他所有为物理设备对象设置WDFDEVICE_INIT结构的设备对象初始化 DDI (PDO) 。

PdoInitFreeDeviceCallback

PdoInitFreeDeviceCallback 规则指定,如果驱动程序调用任何框架设备对象初始化函数时发生错误,驱动程序必须调用 WdfDeviceInitFree

PdoInitFreeDeviceCreate

PdoInitFreeDeviceCreate 规则指定,如果某个设备对象初始化函数中发生错误,并且驱动程序从调用 WdfPdoInitAllocate 收到WDFDEVICE_INIT结构,则驱动程序必须调用 WdfDeviceInitFree 而不是 WdfDeviceCreate

PdoInitFreeDeviceCreateType2

PdoInitFreeDeviceCreateType2 规则指定驱动程序在调用 WdfDeviceInitFree 后不得调用 WdfDeviceCreate

PdoInitFreeDeviceCreateType4

PdoInitFreeDeviceCreateType4 规则指定,如果驱动程序调用 WdfDeviceCreate 时发生错误,驱动程序必须调用 WdfDeviceInitFree

ControlDeviceInitAllocate

ControlDeviceInitAllocate 规则指定,对于控制设备对象,驱动程序必须在驱动程序调用 WdfDeviceCreate 之前调用框架设备对象初始化方法 WdfControlDeviceInitAllocate

InputBufferAPI

InputBufferAPI 规则指定在 EvtIoRead回调函数中使用正确的缓冲区检索 DDI。 在 EvtIoRead 回调函数中,无法调用以下 DDI 进行缓冲区检索:

选择 DDI 使用规则集

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

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

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

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

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