Declarar funciones mediante tipos de rol de función para controladores NDIS

Para permitir que SDV analice un controlador NDIS, debe declarar las funciones mediante las declaraciones de tipo de rol de función para NDIS. Los tipos de rol de función se definen en Ndis.h.

Para obtener la lista de tipos de roles de función y sus funciones de devolución de llamada de eventos correspondientes, vea Declaraciones de función NDIS del comprobador de controladores estáticos.

Cada función de devolución de llamada de un controlador NDIS debe declararse especificando el tipo de rol correspondiente.

En el ejemplo de código siguiente se muestra la declaración de tipo de rol de función para la función de devolución de llamada MiniportPause . En este ejemplo, la función de devolución de llamada se denomina myMiniportPause. El tipo de rol de función MINIPORT_PAUSE.

MINIPORT_PAUSE myMiniportPause;

Si una función de devolución de llamada tiene una declaración de prototipo de función, debe reemplazar el prototipo de función por la declaración de tipo de rol de función.

En el ejemplo siguiente se muestran las declaraciones de función NDIS del archivo de encabezado MP.h, que se encuentra en el subdirectorio fail_drivers SDV de WDK. Las funciones relacionadas se declaran en 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;

Parámetros de función y tipos de roles de función

Según sea necesario en el lenguaje de programación C, los tipos de parámetro que se usan en la definición de función deben coincidir con los tipos de parámetro del prototipo de función o, en este caso, con el tipo de rol de función. SDV depende de las firmas de función para el análisis y omite las funciones cuyas firmas no coinciden.

Por ejemplo, debe declarar una función MiniportInterrupt mediante el MINIPORT_ISR de rol de función:

MINIPORT_ISR myMPIsr;

Al implementar la rutina de interrupción , myMPIsr, los tipos de parámetro deben coincidir con los que usa MINIPORT_ISR, es decir, NDIS_HANDLE, PBOOLEAN y PULONG (consulte la función MiniportInterrupt para obtener sintaxis).

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

Ejecución Code Analysis para que los controladores comprueben las declaraciones de función

Para ayudarle a determinar si el código fuente está preparado, ejecute Code Analysis para controladores. Code Analysis para controladores comprueba si hay declaraciones de tipo de rol de función y puede ayudar a identificar declaraciones de función que podrían haber faltado o advertirle cuando los parámetros de la definición de función no coinciden con los del tipo de rol de función.