Объявление функций с помощью типов ролей функций для драйверов NDIS

Чтобы sdv мог анализировать драйвер NDIS, необходимо объявить функции с помощью объявлений типов роли функции для NDIS. Типы ролей функций определены в Ndis.h.

Список типов ролей функций и соответствующих им функций обратного вызова событий см. в разделе Объявления функций NDIS средства проверки статических драйверов.

Каждая функция обратного вызова в драйвере NDIS должна быть объявлена путем указания соответствующего типа роли.

В следующем примере кода показано объявление типа роли функции для функции обратного вызова MiniportPause . В этом примере функция обратного вызова называется myMiniportPause. Тип роли функции — MINIPORT_PAUSE.

MINIPORT_PAUSE myMiniportPause;

Если функция обратного вызова имеет объявление прототипа функции, необходимо заменить прототип функции объявлением типа роли функции.

В следующем примере показаны объявления функций NDIS из файла заголовка MP.h, который находится в подкаталоге SDV fail_drivers WDK. Связанные функции объявляются в 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
    ) {
}

Выполнение анализа кода для драйверов для проверки объявлений функций

Чтобы определить, подготовлен ли исходный код, выполните анализ кода для драйверов. Анализ кода для драйверов проверяет наличие объявлений типа роли функции и может помочь определить объявления функций, которые могли быть пропущены, или предупредить вас, если параметры определения функции не совпадают с параметрами в типе роли функции.