函数角色类型的重复入口点
对于大多数函数角色类型,SDV 假定驱动程序最多为每个入口点提供一个回调函数。 但是,某些函数角色类型可以有多个关联的事件回调函数。 例如,KMDF 驱动程序可能有多个 EvtTimerFunc 或 EvtDpcFunc 回调函数 (使用 EVT_WDF_TIMER,EVT_WDF_DPC角色类型批注) 。 在这种情况下,SDV 会将整数追加到 Sdv-map.h 中的函数类型。 例如,如果驱动程序有两个 DPC 回调函数,SDV 将它们映射到 fun_WDF_DPC_1 和 fun_WDF_DPC_2。
如果驱动程序超过角色类型的最大回调函数数,SDV 将显示以下消息。
Static Driver Verifier found more than one entry point for '[role type]'
如果函数角色类型具有的入口点数超过 SDV 支持的入口点数,则驱动程序不一定出错。 但是,若要获得准确的验证结果,必须编辑 Sdv.-map.h 文件以删除重复条目。
例如,以下 Sdv-map.h 文件显示有两个使用 EVT_WDF_REQUEST_COMPLETION_ROUTINE 角色类型进行批注的 CompletionRoutine 函数。 在 Sdv-map.h 文件中,SDV 将 EvtRequestReadCompletionRoutine 和 EvtRequestWriteCompletionRoutine 定义为 fun_WDF_REQUEST_COMPLETION_ROUTINE。
//Approved=false
#define fun_WDF_DRIVER_DEVICE_ADD OsrFxEvtDeviceAdd
#define fun_WDF_IO_QUEUE_IO_READ OsrFxEvtIoRead
#define fun_WDF_IO_QUEUE_IO_STOP OsrFxEvtIoStop
#define fun_WDF_DEVICE_D0_EXIT OsrFxEvtDeviceD0Exit
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine
#define fun_WDF_OBJECT_CONTEXT_CLEANUP OsrFxEvtDriverContextCleanup
#define fun_WDF_DEVICE_D0_ENTRY OsrFxEvtDeviceD0Entry
#define fun_WDF_DEVICE_PREPARE_HARDWARE OsrFxEvtDevicePrepareHardware
#define fun_WDF_IO_QUEUE_IO_WRITE OsrFxEvtIoWrite
#define fun_WDF_IO_QUEUE_IO_DEVICE_CONTROL OsrFxEvtIoDeviceControl
若要删除重复,请注释掉第二个完成例程 (将 #define 中的 #d 替换为两个注释分隔符 () // 。 然后设置 Approved=true 并运行验证。
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine
//efine fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine
使用一个完成例程查看验证结果后,请再次编辑 Sdv-map.h 文件,但这次注释掉刚刚验证的完成例程,并删除注释 (将 替换为 // 未验证的完成例程 中的#d) 。 然后再次运行 SDV。
支持多个入口点的函数角色类型
某些函数角色类型支持多个条目。 当条目数超过支持的最大值时,SDV 还会将这些条目报告为重复条目。 可以通过选择性地注释掉 Sdv-map.h 文件中回调例程 的 #define 语句并单独进行验证,以处理重复条目的方式处理这些附加条目。 例如,如果驱动程序有 8 个 DPC 回调函数 (使用 EVT_WDF_DPC 角色类型) ,则可以执行以下操作:
编辑 Sdv-map.h 并通过fun_WDF_DPC_8注释掉fun_WDF_DPC_5的 define 语句。
在驱动程序上运行 SDV。
然后再次编辑 Sdv-map.h 以通过fun_WDF_DPC_8定义fun_WDF_DPC_5,并通过fun_WDF_DPC_4注释掉用于fun_WDF_DPC_1的 define 语句。
在驱动程序上运行 SDV。
有关可具有多个回调函数的函数角色类型的列表,请参阅 静态驱动程序验证程序 KMDF 注释 。 该列表显示 SDV 支持这些角色类型的最大回调函数数。