Поделиться через


Объявление функций с помощью типов ролей функций для драйверов 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
    ) {
}

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

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