使用这些规则以验证您的驱动程序是否正确地使用 KMDF DDIs。
本部分内容
| 主题 | DESCRIPTION |
|---|---|
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 和所有其他设备对象初始化 DDI,必须在控制设备的 WdfDeviceCreate 之前调用为控制设备设置WDFDEVICE_INIT结构。 |
|
CtlDeviceFinishInitDeviceAdd 规则指定,如果驱动程序在 EvtDriverDeviceAdd 回调函数中创建控制设备对象,则必须在创建设备后以及从 EvtDriverDeviceAdd 回调函数退出之前调用 WdfControlFinishInitializing。 此规则不适用于非 PnP 驱动程序。 |
|
CtlDeviceFinishInitDrEntry 规则指定,如果驱动程序在 DriverEntry 回调函数中创建控制设备对象,则必须在创建设备后以及从 EvtDriverDeviceAdd 回调函数退出之前调用 WdfControlFinishInitializing。 此规则不适用于非 PnP 驱动程序。 |
|
DeviceCreateFail 规则指定EVT_WDF_DRIVER_DEVICE_ADD调用 WdfDeviceCreate 失败时返回错误状态。 |
|
DeviceInitAllocate 规则指定,对于 PDO 设备或控制设备对象,必须在驱动程序调用 WdfDeviceCreate 之前调用 WdfPdoInitInitAllocate 或 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规则规定,接收PWDFDEVICE_INIT作为参数的DDI不能通过NULL指针来调用与WDFDEVICE_INIT结构。 |
|
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 规则规定,在驱动程序调用 WdfDeviceCreate 初始化 PDO 之前,必须调用 WdfPdoInitAllocate 和其他所有为物理设备对象设置WDFDEVICE_INIT结构的设备对象初始化 DDI。 |
|
PdoInitFreeDeviceCallback 规则指定,如果驱动程序调用任何框架设备对象初始化函数时发生错误,驱动程序必须调用 WdfDeviceInitFree。 |
|
PdoInitFreeDeviceCreate 规则指定驱动程序必须调用 WdfDeviceInitFree 而不是WdfDeviceCreate(如果在某个设备对象初始化函数中发生错误,并且驱动程序从对 WdfPdoInitAllocate 的调用中收到WDFDEVICE_INIT结构)。 |
|
PdoInitFreeDeviceCreateType2 规则指定驱动程序在调用 WdfDeviceInitFree 后不得调用 WdfDeviceCreate。 |
|
PdoInitFreeDeviceCreateType4 规则指定,如果驱动程序调用 WdfDeviceCreate 时发生错误,驱动程序必须调用 WdfDeviceInitFree。 |
|
ControlDeviceInitAllocate 规则指定,对于控件设备对象,驱动程序必须在驱动程序调用 WdfDeviceCreate 之前调用框架设备对象初始化方法 WdfControlDeviceInitAllocate。 |
|
InputBufferAPI 规则指定在 EvtIoRead回调函数中使用正确的缓冲区检索 DDI。 在 EvtIoRead 回调函数中,无法调用以下 DDI 进行缓冲区检索: |
选择 DDI 使用规则集
在 Microsoft Visual Studio 中选择你的驱动程序项目(.vcxProj)。 在 “驱动程序 ”菜单中,单击“ 启动静态驱动程序验证程序...”。
单击“ 规则 ”选项卡。在 “规则集”下,选择 DDIUsage。
若要从 Visual Studio 开发人员命令提示符窗口中选择默认规则集,请使用 /check 选项指定 DDIUsage.sdv。 例如:
msbuild /t:sdv /p:Inputs="/check:DDIUsage.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32有关详细信息,请参阅使用静态驱动程序验证程序查找驱动程序和静态驱动程序验证程序命令中的缺陷(MSBuild)。