Объявление функций с помощью типов ролей функций для драйверов 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
) {
}
Выполнение анализа кода для драйверов для проверки объявлений функций
Чтобы определить, подготовлен ли исходный код, запустите анализ кода для драйверов. Анализ кода для драйверов проверка для объявлений типов ролей функции и может помочь определить объявления функций, которые могли быть пропущены или предупреждают, когда параметры определения функции не соответствуют значениям в типе роли функции.