使用 KMDF 驱动程序的函数角色类型来声明函数

若要使 SDV 能够分析 KMDF 驱动程序,必须使用 KMDF 的函数角色类型声明来声明函数。 函数角色类型在 Wdf.h 和 Wdf.h 中包含的其他 KMDF 头文件中定义。 有关函数角色类型及其相应事件回调函数的列表,请参阅 静态驱动程序验证程序 KMDF 函数声明

KMDF 驱动程序中的每个事件回调函数都必须通过指定相应的角色类型来声明。

例如,下面的代码示例演示 EvtDriverDeviceAdd 回调函数的函数角色类型声明。 在此示例中,回调函数称为 myDriver_EvtDriverDeviceAdd。 函数角色类型为EVT_WDF_DRIVER_DEVICE_ADD。

EVT_WDF_DRIVER_DEVICE_ADD myDriver_EvtDriverDeviceAdd;

如果回调函数具有函数原型声明,则必须将函数原型替换为函数角色类型声明。

以下列表来自头文件 Fail_Driver6.h。 相关函数在 FailDriver6.c 中声明。

/*++

Copyright (C) Microsoft.  All rights reserved.
Module Name:
    fail_driver6.h
Environment:
    Kernel mode
--*/

#include <NTDDK.h>  
#include <wdf.h>

#include "fail_library6.h"

DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd;
EVT_WDF_IO_QUEUE_IO_READ EvtIoRead;
EVT_WDF_IO_QUEUE_IO_WRITE EvtIoWrite;
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl;
EVT_WDF_DEVICE_CONTEXT_CLEANUP DeviceContextCleanUp;
EVT_WDF_DEVICE_CONTEXT_DESTROY DeviceContextDestroy;
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK QueueCleanup;
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK QueueDestroy;
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK FileContextCleanup;
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK FileContextDestroy;

使用角色类型声明声明驱动程序回调函数后,可以 扫描驱动程序。 扫描驱动程序会生成 Sdv-map.h 文件,可以检查该文件以确定是否正确标识入口点。

运行驱动程序代码分析以验证函数声明

若要帮助你确定是否准备好源代码,请运行 适用于驱动程序的代码分析。 驱动程序的代码分析检查函数角色类型声明,并有助于识别函数定义的参数与函数角色类型中的参数不匹配时可能遗漏的函数声明或发出警告。

函数参数和函数角色类型

根据 C 编程语言的要求,在函数定义中使用的参数类型必须与函数原型的参数类型(在本例中为函数角色类型)匹配。 SDV 依赖于函数签名进行分析,并忽略其签名不匹配的函数。

例如,应使用 EVT_WDF_DRIVER_DEVICE_ADD 函数角色类型声明 EvtDriverDeviceAdd 例程。

EVT_WDF_DRIVER_DEVICE_ADD myEvtDriverDeviceAdd;

实现函数 myEvtDriverDeviceAdd 时,参数类型必须与EVT_WDF_DRIVER_DEVICE_ADD所使用的参数类型(即 WDFDRIVER)匹配,PWDFDEVICE_INIT (有关语法) 请参阅 EvtDriverDeviceAdd 例程。

NTSTATUS
 myEvtDriverDeviceAdd (
  WDFDRIVER Driver,
 PWDFDEVICE_INIT DeviceInit
 )
{
}