Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Для большинства типов ролей функций 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 двумя разделителями комментариев (//). Затем задайте значение "Утверждено=true " и запустите проверку.
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine
//efine fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine
После просмотра результатов проверки с помощью одной команды завершения измените файл Sdv-map.h еще раз, но на этот раз закомментируйте команду завершения, которая была только что проверена, и удалите комментарий (замените // c #d) для команды завершения, которая не была проверена. Затем снова запустите SDV.
Типы ролей функций, поддерживающие несколько точек входа
Некоторые типы ролей функций поддерживают несколько записей. Когда число записей превышает поддерживаемое максимальное, SDV также сообщает об этих записях как о дубликатах. Эти дополнительные записи можно обрабатывать так же, как и для обработки повторяющихся записей, выборочно закомментируя инструкции #define для подпрограмм обратного вызова в файле Sdv-map.h и делая отдельные проверки. Например, если драйвер имеет восемь функций обратного вызова DPC (которые используют тип роли EVT_WDF_DPC), можно сделать следующее:
Измените sdv-map.h и закомментируйте инструкции определения для fun_WDF_DPC_5 через fun_WDF_DPC_8.
Запустите SDV на драйвере.
Затем снова измените sdv-map.h, чтобы определить fun_WDF_DPC_5 через fun_WDF_DPC_8 и закомментировать инструкции определения для fun_WDF_DPC_1 через fun_WDF_DPC_4.
Запустите SDV на драйвере.
См. аннотации Static Driver Verifier KMDF для списка типов ролей функций, которые могут иметь более чем одну функцию обратного вызова. В списке отображается максимальное количество функций обратного вызова, поддерживаемых SDV для этих типов ролей.