Повторяющиеся точки входа для типа роли функции
Для большинства типов ролей функций SDV предполагает, что драйвер имеет не более одной функции обратного вызова для каждой точки входа. Однако существуют некоторые типы ролей функций, которые могут иметь несколько функций обратного вызова событий, связанных с ними. Например, драйвер KMDF может иметь несколько функций обратного вызова EvtTimerFunc или EvtDpcFunc (которые используют заметки EVT_WDF_TIMER и EVT_WDF_DPC типа роли). В этом случае SDV добавляет целое число к типу функции в Sdv-map.h. Например, если драйвер имеет две функции обратного вызова DPC, SDV сопоставляет их с fun_WDF_DPC_1 и fun_WDF_DPC_2.
Если драйвер превышает максимальное количество функций обратного вызова для типа роли, SDV отображает следующее сообщение.
Static Driver Verifier found more than one entry point for '[role type]'
Если тип роли функции имеет больше точек входа, чем поддерживает SDV, то с драйвером не обязательно что-то не так. Однако для получения точных результатов проверки необходимо изменить файл Sdv.-map.h, чтобы удалить повторяющиеся записи.
Например, в следующем файле Sdv-map.h показано, что есть две функции CompletionRoutine , которые были помечены с помощью типа роли EVT_WDF_REQUEST_COMPLETION_ROUTINE. В файле Sdv-map.h SDV определяет EvtRequestReadCompletionRoutine и EvtRequestWriteCompletionRoutine как fun_WDF_REQUEST_COMPLETION_ROUTINE.
//Approved=false
#define fun_WDF_DRIVER_DEVICE_ADD OsrFxEvtDeviceAdd
#define fun_WDF_IO_QUEUE_IO_READ OsrFxEvtIoRead
#define fun_WDF_IO_QUEUE_IO_STOP OsrFxEvtIoStop
#define fun_WDF_DEVICE_D0_EXIT OsrFxEvtDeviceD0Exit
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine
#define fun_WDF_OBJECT_CONTEXT_CLEANUP OsrFxEvtDriverContextCleanup
#define fun_WDF_DEVICE_D0_ENTRY OsrFxEvtDeviceD0Entry
#define fun_WDF_DEVICE_PREPARE_HARDWARE OsrFxEvtDevicePrepareHardware
#define fun_WDF_IO_QUEUE_IO_WRITE OsrFxEvtIoWrite
#define fun_WDF_IO_QUEUE_IO_DEVICE_CONTROL OsrFxEvtIoDeviceControl
Чтобы удалить дублирование, закомментируйте вторую процедуру завершения (замените #d в #define двумя разделителями комментариев (//). Затем установите значение Approved=true и выполните проверку.
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine
//efine fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine
Просмотрев результаты проверки с помощью одной процедуры завершения, измените файл Sdv-map.h еще раз, но на этот раз закомментируйте процедуру завершения, которая была только что проверена, и удалите комментарий (замените //на #d) из подпрограммы завершения, которая не была проверена. Затем снова запустите SDV.
Типы ролей функций, поддерживающие несколько точек входа
Некоторые типы ролей функций поддерживают несколько записей. Если количество записей превышает поддерживаемую максимальную, SDV также сообщает о них как о повторяющихся записях. Вы можете обрабатывать эти дополнительные записи так же, как и повторяющиеся записи, выборочно закомментируя операторы #define для подпрограмм обратного вызова в файле Sdv-map.h и выполняя отдельные проверки. Например, если драйвер имеет восемь функций обратного вызова DPC (которые используют тип роли EVT_WDF_DPC), можно сделать следующее:
Измените Sdv-map.h и закомментируйте операторы define для fun_WDF_DPC_5 через fun_WDF_DPC_8.
Запустите SDV в драйвере.
Затем снова измените Sdv-map.h, чтобы определить fun_WDF_DPC_5 через fun_WDF_DPC_8 и закомментировать операторы define для fun_WDF_DPC_1 через fun_WDF_DPC_4.
Запустите SDV в драйвере.
Список типов ролей функций, которые могут иметь несколько функций обратного вызова, см. в статье Заметки KMDF статического средства проверки драйверов . В списке отображается максимальное количество функций обратного вызова, поддерживаемых SDV для этих типов ролей.