DDI 用法规则集 (KMDF)
使用这些规则验证驱动程序是否正确使用 KMDF DDI。
在本节中
主题 | 说明 |
---|---|
BufAfterReqCompletedIoctl 规则指定在 EvtIoDeviceControl 回调函数中,在完成 I/O 请求后,无法访问检索到的 I/O 请求缓冲区。 |
|
BufAfterReqCompletedIntIoctl 规则指定在请求完成后,无法在 EvtIoInternalDeviceControl 回调函数内部 (访问其缓冲区,只能) 。 通过调用 WdfRequestRetrieveOutputBuffer 或 WdfRequestRetrieveUnsafeUserOutputBuffer 或 WdfRequestRetrieveInputBuffer 或 WdfRequestRetrieveUnsafeUserInputBuffer 来检索缓冲区。 |
|
BufAfterReqCompletedIntIoctlA 规则验证请求完成后,无法在 EvtIoInternalDeviceControl 回调 (访问其缓冲区,仅) 。 通过调用 WdfRequestRetrieveInputBuffer 或 WdfRequestRetrieveOutputBuffer 或 WdfRequestRetrieveUnsafeUserInputBuffer 或 WdfRequestRetrieveUnsafeUserOutputBuffer 检索缓冲区。 |
|
BufAfterReqCompletedIoctlA 规则指定在 EvtIoDeviceControl 回调函数中,在完成 I/O 请求后,无法访问检索到的 I/O 请求缓冲区。 |
|
BufAfterReqCompletedRead 规则指定在 EvtIoRead 回调函数中,在完成 I/O 请求后,无法访问检索到的 I/O 请求缓冲区。 有 14 个 DDI 可用作可能的缓冲区访问方法。 |
|
BufAfterReqCompletedReadA 规则指定在 EvtIoRead 回调函数中,在完成 I/O 请求后,无法访问检索到的 I/O 请求缓冲区。 有 14 个 DDI 可用作可能的缓冲区访问方法。 |
|
BufAfterReqCompletedWrite 规则指定在 EvtIoWrite 回调函数中,在 I/O 请求完成后无法访问检索到的 I/O 请求缓冲区。 |
|
BufAfterReqCompletedWriteA 规则指定在 EvtIoWrite 回调函数中,在 I/O 请求完成后无法访问检索到的 I/O 请求缓冲区。 |
|
ChildDeviceInitApi 规则指定,对于子设备,必须在驱动程序为子设备对象调用 WdfDeviceCreate 方法之前调用框架设备对象初始化方法。 |
|
ControDeviceDeleted 规则指定,如果 PnP 驱动程序创建控制设备对象,驱动程序必须在卸载驱动程序之前删除其中一个清理回调函数中的控制设备对象。 |
|
ControlDeviceInitAPI 规则指定在 WdfControlDeviceInitAllocate 和所有其他为控制设备设置 WDFDEVICE_INIT 结构的设备对象初始化 DDI 之前,必须为控制设备调用 WdfDeviceCreate 。 |
|
CtlDeviceFinishInitDeviceAdd 规则指定,如果驱动程序在 EvtDriverDeviceAdd 回调函数中创建控制设备对象,则必须在创建设备后和退出 EvtDriverDeviceAdd 回调函数之前调用 WdfControlFinishInitializing。 此规则不适用于非 PnP 驱动程序。 |
|
CtlDeviceFinishInitDrEntry 规则指定,如果驱动程序在 DriverEntry 回调函数中创建控制设备对象,则必须在创建设备后从 EvtDriverDeviceAdd 回调函数退出之前调用 WdfControlFinishInitializing。 此规则不适用于非 PnP 驱动程序。 |
|
DeviceCreateFail 规则指定当 WdfDeviceCreate 调用失败时,EVT_WDF_DRIVER_DEVICE_ADD返回错误状态。 |
|
DeviceInitAllocate 规则指定,对于 PDO 设备或控制设备对象,必须在驱动程序调用 WdfDeviceCreate 之前调用框架设备对象初始化方法 WdfPdoInitAllocate 或 WdfControlDeviceInitAllocate。 |
|
对于 FDO 设备,必须先调用框架设备对象初始化方法和框架 FDO 初始化方法,然后驱动程序才能为设备对象调用 WdfDeviceCreate 方法。 |
|
DoubleDeviceInitFree 规则指定驱动程序不应释放设备初始化结构两次。 |
|
DriverCreate 规则指定使用内核模式驱动程序框架 (KMDF) 的驱动程序必须调用 WdfDriverCreate 方法来从其 DriverEntry 例程中创建框架驱动程序对象。 |
|
InitFreeDeviceCallback 规则指定,如果驱动程序在初始化新的框架设备对象时遇到错误,并且驱动程序从调用 WdfControlDeviceInitAllocate 收到了 WDFDEVICE_INIT 结构,则驱动程序必须调用 WdfDeviceInitFree。 |
|
InitFreeDeviceCreate 规则指定,如果某个设备对象初始化方法中发生错误,并且驱动程序从调用 WdfControlDeviceInitAllocate 收到了 WDFDEVICE_INIT 结构,驱动程序必须调用 WdfDeviceInitFree 而不是 WdfDeviceCreate。 |
|
InitFreeDeviceCreateType2 规则指定驱动程序在调用 WdfDeviceInitFree 后不得调用 WdfDeviceCreate。 |
|
InitFreeDeviceCreateType4 规则指定,如果驱动程序在调用 WdfDeviceCreate 时遇到错误,并且驱动程序从调用 WdfControlDeviceInitAllocate 收到了 WDFDEVICE_INIT 结构,则必须调用 WdfDeviceInitFree。 |
|
InitFreeNull 规则指定不能通过使用指向WDFDEVICE_INIT结构的 NULL 指针来调用作为参数接收PWDFDEVICE_INIT的 DDI。 |
|
MdlAfterReqCompletedIntIoctl 规则指定在 EvtIoInternalDeviceControl 回调函数中,I/O 请求完成后无法访问内存描述符列表 (MDL) 。 |
|
MdlAfterReqCompletedIntIoctlA 规则指定在 EvtIoInternalDeviceControl 回调函数中,在 I/O 请求完成后无法访问内存描述符列表 (MDL) 。 |
|
MdlAfterReqCompletedIoctl 规则指定在 EvtIoDeviceControl 回调函数中,I/O 请求完成后无法访问 MDL) 内存描述符列表 (。 |
|
MdlAfterReqCompletedIoctlA 规则指定在 EvtIoDeviceControl 回调函数中,I/O 请求完成后无法访问 MDL) 内存描述符列表 (。 |
|
MdlAfterReqCompletedRead 规则指定在 EvtIoRead 回调函数内,在 I/O 请求完成后,无法访问检索到的 MDL) 对象的内存描述符 (列表。 |
|
MdlAfterReqCompletedReadA 规则指定在 EvtIoRead 回调函数中,在完成 I/O 请求后,无法访问检索到的 MDL) 对象的内存描述符 (列表。 |
|
MdlAfterReqCompletedWrite 规则指定在 EvtIoWrite 回调函数中,在完成 I/O 请求后,无法访问检索到的 MDL) 对象的内存描述符 (列表。 |
|
MdlAfterReqCompletedWriteA 规则指定在 EvtIoWrite 回调函数中,在 I/O 请求完成后,无法访问检索 (到的 MDL) 对象的内存描述符列表。 |
|
MemAfterReqCompletedIntIoctl 规则指定在 EvtIoInternalDeviceControl 回调函数中,I/O 请求完成后无法访问框架内存对象。 |
|
MemAfterReqCompletedIntIoctlA 规则指定在 EvtIoInternalDeviceControl 回调函数中,I/O 请求完成后无法访问框架内存对象。 |
|
MemAfterReqCompletedIoctl 规则指定在 EvtIoDeviceControl 回调函数中,I/O 请求完成后无法访问框架内存对象。 |
|
MemAfterReqCompletedIoctlA 规则指定在 EvtIoDeviceControl 回调函数中,I/O 请求完成后无法访问框架内存对象。 |
|
MemAfterReqCompletedRead 规则指定在 EvtIoRead 回调函数中,I/O 请求完成后无法访问框架内存对象。 |
|
MemAfterReqCompletedReadA 规则指定在 EvtIoRead 回调函数中,I/O 请求完成后无法访问框架内存对象。 |
|
MemAfterReqCompletedWrite 规则指定在 EvtIoWrite 回调函数中,I/O 请求完成后无法访问框架内存对象。 |
|
MemAfterReqCompletedWriteA 规则指定在 EvtIoWrite 回调函数中,I/O 请求完成后无法访问框架内存对象。 |
|
NullCheck 规则验证驱动程序代码中的 NULL 值稍后不会在驱动程序中取消引用。 如果满足以下任一条件,则此规则将报告缺陷:
如果出现 NullCheck 规则冲突,跟踪树窗格中将突出显示最相关的代码语句。 有关使用报表输出的详细信息,请参阅 静态驱动程序验证程序报告 和 了解跟踪查看器。 |
|
PdoDeviceInitAPI 规则指定在驱动程序为 PDO 调用 WdfDeviceCreate 之前,必须调用 WdfPdoInitAllocate 和其他所有为物理设备对象设置WDFDEVICE_INIT结构的设备对象初始化 DDI (PDO) 。 |
|
PdoInitFreeDeviceCallback 规则指定,如果驱动程序调用任何框架设备对象初始化函数时发生错误,驱动程序必须调用 WdfDeviceInitFree。 |
|
PdoInitFreeDeviceCreate 规则指定,如果某个设备对象初始化函数中发生错误,并且驱动程序从调用 WdfPdoInitAllocate 收到WDFDEVICE_INIT结构,则驱动程序必须调用 WdfDeviceInitFree 而不是 WdfDeviceCreate。 |
|
PdoInitFreeDeviceCreateType2 规则指定驱动程序在调用 WdfDeviceInitFree 后不得调用 WdfDeviceCreate。 |
|
PdoInitFreeDeviceCreateType4 规则指定,如果驱动程序调用 WdfDeviceCreate 时发生错误,驱动程序必须调用 WdfDeviceInitFree。 |
|
ControlDeviceInitAllocate 规则指定,对于控制设备对象,驱动程序必须在驱动程序调用 WdfDeviceCreate 之前调用框架设备对象初始化方法 WdfControlDeviceInitAllocate。 |
|
InputBufferAPI 规则指定在 EvtIoRead回调函数中使用正确的缓冲区检索 DDI。 在 EvtIoRead 回调函数中,无法调用以下 DDI 进行缓冲区检索: |
选择 DDI 使用规则集
在 Microsoft Visual Studio 中选择驱动程序项目 (.vcxProj) 。 在“ 驱动程序 ”菜单中,单击“ 启动静态驱动程序验证程序...”。
单击“ 规则 ”选项卡。在“ 规则集”下,选择“ DDIUsage”。
若要从 Visual Studio 开发人员命令提示符窗口中选择默认规则集,请使用 /检查 选项指定 DDIUsage.sdv。 例如:
msbuild /t:sdv /p:Inputs="/check:DDIUsage.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷 和 静态驱动程序验证程序命令 (MSBuild) 。