使用 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
    ) {
}

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

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