扫描驱动程序

使用 /scan 命令选项扫描驱动程序是可选的。 如果在验证驱动程序之前未进行扫描,则 SDV 会扫描函数角色类型声明,并在验证驱动程序时创建 Sdv-map.h 文件。

在此扫描期间,SDV 会尝试检测验证驱动程序所需的驱动程序入口点。 它将扫描结果记录在 Sdv-map.h 中,Sdv-map.h 是它在驱动程序的 sources 目录中创建的文件。

但是,请务必在扫描步骤后或验证后查看此文件,以确保 SDV 检测到正确的入口点。 如果入口点缺失或错误,验证可能不可靠。 更重要的是,如果 SDV 无法检测到任何入口点,则无法验证驱动程序。

对于每个驱动程序,只需扫描一次。 此后,SDV 会保留驱动程序的 Sdv-map.h 文件,以供将来验证。

检查 Sdv-map.h 文件

运行扫描命令或验证驱动程序后,打开 Sdv-map.h 文件并检查该文件。 Sdv-map.h 是格式化文本文件。 你可以阅读任何文本编辑器,如记事本。

将 Sdv-map.h 文件的内容与驱动程序的声明函数角色类型进行比较。 检查 Sdv-map.h 文件的内容,查看是否已正确标识驱动程序的回调或调度例程。

无需 Sdv-map.h 文件即可列出驱动程序中的所有入口点;仅分析中使用的 IRP 主要函数代码或函数角色类型的入口点。 不要将任何 IRP 主要函数代码或函数角色类型添加到文件。

有关 Sdv-map.h 文件的详细信息,请参阅 Sdv-map.hSdv-map.h 文件的格式中介绍了该格式。 批准 Sdv-map.h 文件中介绍了 Sdv-map.h 文件中可能出现的错误。

以下示例显示来自 Fail_driver1 的 Sdv-map.h 文件的内容,这是 tools\sdv\samples\fail_drivers\wdm 目录中的示例 WDM 驱动程序。

//Approved=false
//DriverAddDevice
#define fun_AddDevice DriverAddDevice
//DriverEntry
#define fun_DriverEntry DriverEntry
//DriverUnload
#define fun_DriverUnload DriverUnload
//CompletionRoutine
#define fun_IO_COMPLETION_ROUTINE_1 CompletionRoutine
//DpcForIsrRoutine
#define fun_IO_DPC_ROUTINE_1 DpcForIsrRoutine
//DispatchCreate
#define fun_IRP_MJ_CREATE DispatchCreate
//DispatchPnp
#define fun_IRP_MJ_PNP DispatchPnp
//DispatchPower
#define fun_IRP_MJ_POWER DispatchPower
//DispatchRead
#define fun_IRP_MJ_READ DispatchRead
//DispatchSystemControl
#define fun_IRP_MJ_SYSTEM_CONTROL DispatchSystemControl
//InterruptServiceRoutine
#define fun_KSERVICE_ROUTINE_1 InterruptServiceRoutine

更正 Sdv-map.h 文件

在验证驱动程序之前,请更正 Sdv-map.h 文件中的任何错误。 即使 Sdv-map.h 文件不正确或未获批准,SDV 也会验证驱动程序,但验证结果可能不可靠。 例如,如果不使用相应的函数角色类型声明驱动程序的调度或回调例程,则驱动程序例程将不会显示在 Sdv-map.h 文件中。 因此,你可能会错过在代码中查找缺陷,因为 SDV 认为使用函数角色类型的规则不适用,即使你在验证过程中指定了这些规则。

若要更正 Sdv-map.h 文件,请确保使用适当的函数角色类型声明驱动程序的调度或回调例程。 然后重新扫描驱动程序并验证它们是否出现在 Sdv-map.h 文件中。

批准 Sdv-map.h 文件

确定 Sdv-map.h 文件正确后,可以批准该文件。 如果未对文件进行任何更改,则无需批准它。

即使 Sdv-map.h 文件未获批准,SDV 也会验证驱动程序。

若要批准 Sdv-map.h 文件,请在文件的第一行更改:

//Approved=false

to:

//Approved=true

只需为每个驱动程序批准 Sdv-map.h 文件一次。 此后,SDV 为驱动程序保留已批准的 Sdv-map.h 文件,以供将来验证。 如果希望 SDV 再次扫描源代码以获取函数角色类型声明,只需删除 文件即可。

以下示例显示了 KMDF 示例驱动程序的已批准的 Sdv-map.h 文件,Fail_Driver1。 SDV 使用 Sdv-map.h 文件将驱动程序声明的回调函数与验证所需的函数角色类型映射为 SDV。

//Approved=true
//DriverEntry
#define fun_DriverEntry DriverEntry
//EvtDriverDeviceAdd
#define fun_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
//EvtIoDeviceControl
#define fun_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl
//EvtIoInternalDeviceControl
#define fun_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControl
//EvtIoRead
#define fun_WDF_IO_QUEUE_IO_READ EvtIoRead
//EvtRequestCancel
#define fun_WDF_REQUEST_CANCEL_1 EvtRequestCancel