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

Чтобы включить SDV для анализа драйвера KMDF, необходимо объявить функции с помощью объявлений типов роли функции для KMDF. Типы ролей функции определяются в Wdf.h и в других файлах заголовков KMDF, включенных в Wdf.h. Список типов ролей функций и соответствующих функций обратного вызова событий см. в разделе Объявления функций KMDF средства проверки статических драйверов.

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

Например, в следующем примере кода показано объявление типа роли функции для функции обратного вызова EvtDriverDeviceAdd . В этом примере функция обратного вызова называется myDriver_EvtDriverDeviceAdd. Тип роли функции — EVT_WDF_DRIVER_DEVICE_ADD.

EVT_WDF_DRIVER_DEVICE_ADD myDriver_EvtDriverDeviceAdd;

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

Ниже приведен список из файла заголовка Fail_Driver6.h. Связанные функции объявляются в FailDriver6.c.

/*++

Copyright (C) Microsoft.  All rights reserved.
Module Name:
    fail_driver6.h
Environment:
    Kernel mode
--*/

#include <NTDDK.h>  
#include <wdf.h>

#include "fail_library6.h"

DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd;
EVT_WDF_IO_QUEUE_IO_READ EvtIoRead;
EVT_WDF_IO_QUEUE_IO_WRITE EvtIoWrite;
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl;
EVT_WDF_DEVICE_CONTEXT_CLEANUP DeviceContextCleanUp;
EVT_WDF_DEVICE_CONTEXT_DESTROY DeviceContextDestroy;
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK QueueCleanup;
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK QueueDestroy;
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK FileContextCleanup;
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK FileContextDestroy;

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

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

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

Параметры функции и типы ролей функций

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

Например, следует объявить подпрограмму EvtDriverDeviceAdd с помощью типа роли функции EVT_WDF_DRIVER_DEVICE_ADD.

EVT_WDF_DRIVER_DEVICE_ADD myEvtDriverDeviceAdd;

При реализации функции myEvtDriverDeviceAdd типы параметров должны соответствовать типам параметров, используемым EVT_WDF_DRIVER_DEVICE_ADD, а именно WDFDRIVER и PWDFDEVICE_INIT (синтаксис описан в разделе Подпрограмма EvtDriverDeviceAdd ).

NTSTATUS
 myEvtDriverDeviceAdd (
  WDFDRIVER Driver,
 PWDFDEVICE_INIT DeviceInit
 )
{
}