DDI 用法规则集 (KMDF)

使用这些规则以验证您的驱动程序是否正确地使用 KMDF DDIs。

本部分内容

主题 DESCRIPTION

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 方法之前,必须调用框架设备对象初始化方法。

控制设备已删除

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

ControlDeviceInitAPI

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

CtlDeviceFinishInitDeviceAdd

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

CtlDeviceFinishInitDrEntry

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

设备创建失败

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

DeviceInitAllocate

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

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规则规定,接收PWDFDEVICE_INIT作为参数的DDI不能通过NULL指针来调用与WDFDEVICE_INIT结构。

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 规则规定,在驱动程序调用 WdfDeviceCreate 初始化 PDO 之前,必须调用 WdfPdoInitAllocate 和其他所有为物理设备对象设置WDFDEVICE_INIT结构的设备对象初始化 DDI。

PdoInitFreeDeviceCallback

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

PdoInitFreeDeviceCreate

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

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 开发人员命令提示符窗口中选择默认规则集,请使用 /check 选项指定 DDIUsage.sdv。 例如:

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

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