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

要使 SDV 能够分析 NDIS 驱动程序,必须使用 NDIS 的函数角色类型声明来声明函数。 函数角色类型在 Ndis.h 中定义。

有关函数角色类型及其相应事件回调函数的列表,请参阅静态驱动程序验证程序 NDIS 函数声明

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

下面的代码示例显示了 MiniportPause 回调函数的函数角色类型声明。 在本例中,回调函数被调用 myMiniportPause。 函数角色类型为 MINIPORT_PAUSE。

MINIPORT_PAUSE myMiniportPause;

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

下面的示例显示了头文件 MP.h 中的 NDIS 函数声明,该文件位于 WDK 的 SDV fail_drivers 子目录中。 相关函数在 Main.c 中声明。

\tools\sdv\samples\fail_drivers\NDIS\fail_driver1.

/--------------------------------------
// Miniport routines in MAIN.C
//--------------------------------------

NDIS_STATUS
DriverEntry(
    IN  PDRIVER_OBJECT      DriverObject,
    IN  PUNICODE_STRING     RegistryPath
    );


MINIPORT_ALLOCATE_SHARED_MEM_COMPLETE MPAllocateComplete;

MINIPORT_HALT MPHalt;
MINIPORT_SET_OPTIONS MPSetOptions;
MINIPORT_INITIALIZE MPInitialize;
MINIPORT_PAUSE MPPause;
MINIPORT_RESTART MPRestart;
MINIPORT_OID_REQUEST MPOidRequest;
MINIPORT_INTERRUPT_DPC MPHandleInterrupt;
MINIPORT_ISR MPIsr;
MINIPORT_RESET MPReset;
MINIPORT_RETURN_NET_BUFFER_LISTS MPReturnNetBufferLists;
MINIPORT_CANCEL_OID_REQUEST MPCancelOidRequest;
MINIPORT_SHUTDOWN MPShutdown;
MINIPORT_SEND_NET_BUFFER_LISTS MPSendNetBufferLists;
MINIPORT_CANCEL_SEND MPCancelSendNetBufferLists;
MINIPORT_DEVICE_PNP_EVENT_NOTIFY MPPnPEventNotify;
MINIPORT_UNLOAD MPUnload;
MINIPORT_CHECK_FOR_HANG MPCheckForHang;
MINIPORT_ENABLE_INTERRUPT MpEnableInterrupt;
MINIPORT_DISABLE_INTERRUPT MpDisableInterrupt;
MINIPORT_SYNCHRONIZE_INTERRUPT MPSynchronizeInterrupt;
MINIPORT_PROCESS_SG_LIST MPProcessSGList;
NDIS_TIMER_FUNCTION MpDemonstrationTimer;
NDIS_IO_WORKITEM MPQueuedWorkItem;

函数参数和函数作用类型

按照 C 编程语言的要求,在函数定义中使用的参数类型必须与函数原型的参数类型相匹配,或者在本例中与函数角色类型相匹配。 SDV 依靠函数签名进行分析,并忽略签名不匹配的函数。

例如,应使用 MINIPORT_ISR 函数角色类型声明 MiniportInterrupt 函数:

MINIPORT_ISR myMPIsr;

在执行中断例程 myMPIsr时,参数类型必须与 MINIPORT_ISR 使用的类型一致,即 NDIS_HANDLE、PBOOLEAN 和 PULONG(语法参见 MiniportInterrupt 函数)。

BOOLEAN 
myMPIsr(
    __in  NDIS_HANDLE      MiniportInterruptContext,
    __out PBOOLEAN        QueueMiniportInterruptDpcHandler,
    __out PULONG          TargetProcessors
    ) {
}

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

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