若要使 SDV 能够验证 KMDF 驱动程序,必须使用回调函数角色类型声明每个回调函数。 回调函数角色类型在各种 WDF 头文件中定义,并在使用 Wdf.h 头文件生成驱动程序时包含。 下表显示了与其关联的函数角色类型和事件回调函数。
必须在回调函数定义之前声明驱动程序的回调函数。 以下示例显示了 EvtDriverDeviceAdd 回调函数的函数角色类型声明。 在此示例中,回调函数称为 EvtDriverDeviceAdd。
#include <NTDDK.h>
#include <wdf.h>
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
如果回调函数具有函数原型声明,则必须将函数原型替换为函数角色类型声明。 有关函数角色类型声明的详细信息,请参阅 “使用函数角色类型声明”。
下表显示了与其关联的回调函数类型和事件回调函数。
| 函数角色类型 | 事件回调函数 |
|---|---|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_CLEANUP |
|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_COPY |
|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE |
|
EVT_WDF_CHILD_LIST_CREATE_DEVICE |
|
EVT_WDF_CHILD_LIST_DEVICE_REENUMERATED |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_CLEANUP (子列表识别描述清理) |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COPY |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_DUPLICATE |
|
EVT_WDF_CHILD_LIST_SCAN_FOR_CHILDREN |
|
EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 |
|
EVT_WDF_DEVICE_ARM_WAKE_FROM_SX |
|
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
|
EVT_WDF_DEVICE_CONTEXT_DESTROY |
|
EVT_WDF_DEVICE_D0_ENTRY(设备D0入口事件) |
|
EVT_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED |
|
EVT_WDF_DEVICE_D0_EXIT |
|
EVT_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED |
|
EVT_WDF_DEVICE_DISABLE_WAKE_AT_BUS |
|
EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 |
|
EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX |
|
EVT_WDF_DEVICE_EJECT |
|
EVT_WDF_设备在总线启用唤醒 |
|
EVT_WDF_DEVICE_FILE_CREATE |
|
EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS |
|
EVT_WDF_DEVICE_PNP_STATE_CHANGE_NOTIFICATION(EVT_WDF设备即插即用状态更改通知) |
|
EVT_WDF_DEVICE_POWER_POLICY_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_POWER_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_PREPARE_HARDWARE |
|
EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST |
|
EVT_WDF_DEVICE_QUERY_REMOVE |
|
EVT_WDF_DEVICE_QUERY_STOP |
|
EVT_WDF_DEVICE_RELATIONS_QUERY |
|
EVT_WDF_DEVICE_RELEASE_HARDWARE |
|
EVT_WDF_DEVICE_REMOVE_ADDED_RESOURCES |
|
EVT_WDF_DEVICE_RESOURCE_REQUIREMENTS_QUERY |
|
EVT_WDF_DEVICE_RESOURCES_QUERY |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_FLUSH |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_SUSPEND |
|
EVT_WDF_DEVICE_SET_LOCK |
|
EVT_WDF_DEVICE_SHUTDOWN_NOTIFICATION |
EvtDeviceShutdownNotification(设备关闭通知) |
EVT_WDF_DEVICE_SURPRISE_REMOVAL |
|
EVT_WDF_DEVICE_USAGE_NOTIFICATION (设备使用通知) |
|
EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED (设备从S0状态唤醒触发器) |
|
EVT_WDF_DEVICE_WAKE_FROM_SX_TRIGGERED(设备从Sx状态唤醒的事件) |
|
EVT_WDF_DMA_ENABLER_DISABLE(事件回调:禁用DMA使能器) |
|
EVT_WDF_DMA_ENABLER_ENABLE |
|
EVT_WDF_DMA_ENABLER_FILL |
|
EVT_WDF_DMA_ENABLER_FLUSH |
|
EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_START (自管理IO启动) |
|
EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_STOP |
|
EVT_WDF_DPC |
|
EVT_WDF_DRIVER_DEVICE_ADD |
|
EVT_WDF_DRIVER_UNLOAD |
|
EVT_WDF_FILE_CLEANUP(文件清理事件) |
|
EVT_WDF_FILE_CLOSE |
|
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
|
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
|
EVT_WDF_INTERRUPT_DISABLE |
|
EVT_WDF_INTERRUPT_DPC |
|
EVT_WDF_INTERRUPT_ENABLE |
|
EVT_WDF_INTERRUPT_ISR |
|
EVT_WDF_INTERRUPT_SYNCHRONIZE |
|
EVT_WDF_IO_IN_CALLER_CONTEXT |
|
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
|
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
|
EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE |
|
EVT_WDF_IO_QUEUE_IO_DEFAULT |
|
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL |
|
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL |
|
EVT_WDF_IO_QUEUE_IO_READ |
|
EVT_WDF_IO_QUEUE_IO_RESUME |
|
EVT_WDF_IO_QUEUE_IO_STOP |
|
EVT_WDF_IO_QUEUE_IO_WRITE |
|
EVT_WDF_IO_QUEUE_STATE(WDF I/O 队列状态事件) |
|
EVT_WDF_IO_TARGET_QUERY_REMOVE |
|
EVT_WDF_IO_TARGET_REMOVE_CANCELED |
|
EVT_WDF_IO_TARGET_REMOVE_COMPLETE |
|
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
|
EVT_WDF_OBJECT_CONTEXT_DESTROY |
|
EVT_WDF_PROGRAM_DMA |
|
EVT_WDF_REQUEST_CANCEL |
|
EVT_WDF_REQUEST_COMPLETION_ROUTINE |
|
EVT_WDF_TIMER |
|
EVT_WDF_TRACE_CALLBACK |
|
EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD |
|
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE |
|
EVT_WDF_WMI_INSTANCE_SET_INSTANCE |
|
EVT_WDF_WMI_INSTANCE_SET_ITEM |
|
EVT_WDF_WMI_PROVIDER_FUNCTION_CONTROL |
|
EVT_WDF_WORKITEM |
|
EVT_WDFDEVICE_WDM_IRP_PREPROCESS |
允许多个回调函数的函数角色类型
有一些函数角色类型可以有多个与它们关联的事件回调函数。 例如,驱动程序可能有多个 EvtTimerFunc 或 EvtDpcFunc 回调函数。 下表显示了 SDV 支持的每个函数角色类型的最大回调数。 虽然驱动程序拥有的回调函数数目多于表中列出的最大回调函数数并非不正确,但在使用 SDV 时,这确实会使验证过程复杂化。 有关您可能需要对 Sdv-map.h 文件进行的更改,以容纳附加的回调函数的详细信息,请参阅 函数角色类型的重复入口点。
| 函数角色类型 | 回调函数最大数量 |
|---|---|
EVT_WDF_DPC |
7 |
EVT_WDF_INTERRUPT_SYNCHRONIZE |
11 |
EVT_WDF_TIMER |
6 |
EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD |
5 |
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE |
5 |
EVT_WDF_WMI_INSTANCE_SET_INSTANCE |
5 |
EVT_WDF_WMI_INSTANCE_SET_ITEM |
5 |
函数角色类型和 I/O 队列
声明依赖 KMDF 框架向驱动程序传递 I/O 请求 的请求处理程序 和回调函数时,请使用以下函数角色类型(用于顺序或并行调度)。 不要将这些函数角色类型用于将请求从默认队列手动转发到其他队列(手动调度)的函数。 SDV 不支持一种能够跟踪从一个队列到另一个队列请求的内存模型。
有关 I/O 队列的详细信息,请参阅 创建 I/O 队列。
| 用于为手动调度配置的 I/O 队列使用的函数角色类型 |
|---|
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE |
EVT_WDF_IO_QUEUE_IO_DEFAULT |
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL |
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL |
EVT_WDF_IO_QUEUE_IO_READ |
EVT_WDF_IO_QUEUE_IO_RESUME |
EVT_WDF_IO_QUEUE_IO_STOP |
EVT_WDF_IO_QUEUE_IO_WRITE |
EVT_WDF_IO_QUEUE_STATE(WDF I/O 队列状态事件) |
EvtCleanupCallback 和 EvtDestroyCallback 函数的函数角色类型
必须使用特定于对象的函数角色类型声明 EvtCleanupCallback 和 EvtDestroyCallback 函数。 SDV 需要这些特定于对象的角色类型来确定驱动程序是否使用回调函数正确。 使用下表确定要使用的函数类型。
| 对象类型 | EvtCleanupCallback 的函数角色类型 |
|---|---|
设备对象 |
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
I/O 队列对象 |
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
文件对象 |
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
所有其他对象 |
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
| 对象类型 | EvDestroyCallback 的函数角色类型 |
|---|---|
设备对象 |
EVT_WDF_DEVICE_CONTEXT_DESTROY(事件 WDF 设备上下文销毁) |
I/O 队列对象 |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
文件对象 |
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
所有其他对象 |
EVT_WDF_OBJECT_CONTEXT_DESTROY |