使用 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 依赖于函数签名进行分析,并忽略其签名不匹配的函数。

例如,应该使用以下函数角色类型声明 miniportInterrupt MINIPORT_ISR函数:

MINIPORT_ISR myMPIsr;

实现中断例程 myMPIsr 时,参数类型必须与 MINIPORT_ISR 使用的参数类型匹配,即 NDIS_HANDLE、PBOOLEAN 和 PULONG (请参阅语法) 的 MiniportInterrupt 函数。

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

运行Code Analysis驱动程序以验证函数声明

为了帮助你确定是否已准备好源代码,请为驱动程序Code Analysis代码。 Code Analysis驱动程序检查函数角色类型声明,并有助于识别可能错过的函数声明,或在函数定义的参数与函数角色类型中的参数不匹配时发出警告。