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


Сканирование драйвера

Сканирование драйвера с помощью параметра команды /scan является необязательным. Если не выполнить проверку перед проверкой драйвера, SDV сканирует объявления типов роли функции и создает файл Sdv-map.h при проверке драйвера.

Во время этой проверки SDV пытается обнаружить точки входа драйвера, необходимые для проверки драйвера. Он записывает результаты сканирования в Sdv-map.h, файл, который он создает в каталоге источников драйвера.

Однако очень важно просмотреть этот файл после этапа сканирования или после проверки, чтобы убедиться, что SDV обнаружил правильные точки входа. Если точки входа отсутствуют или неверны, проверка может быть ненадежной. Что еще более важно, если SDV не может обнаружить точки входа, он не сможет проверить драйвер.

Для каждого драйвера необходимо проверить только один раз. После этого SDV сохраняет файл Sdv-map.h для драйвера для будущих проверок.

Изучение файла Sdv-map.h

Выполнив команду сканирования или проверив драйвер, откройте файл Sdv-map.h и проверьте его. Sdv-map.h — это форматированный текстовый файл. Его можно прочитать в любом текстовом редакторе, например в Блокноте.

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

Файл Sdv-map.h не требуется для перечисления всех точек входа в драйвере. только точки входа для кодов основных функций IRP или типов ролей функций, которые используются в анализе. Не добавляйте в файл коды основных функций IRP или типы ролей функций.

Подробные сведения о файле Sdv-map.h см. в разделе Sdv-map.h. Формат описан в разделе Формат файла Sdv-map.h. Ошибки, которые могут появиться в файле Sdv-map.h, описаны в разделе Утверждение файла Sdv-map.h.

В следующем примере показано содержимое файла Sdv-map.h из Fail_driver1, примера драйвера WDM в каталоге tools\sdv\samples\fail_drivers\wdm.

//Approved=false
//DriverAddDevice
#define fun_AddDevice DriverAddDevice
//DriverEntry
#define fun_DriverEntry DriverEntry
//DriverUnload
#define fun_DriverUnload DriverUnload
//CompletionRoutine
#define fun_IO_COMPLETION_ROUTINE_1 CompletionRoutine
//DpcForIsrRoutine
#define fun_IO_DPC_ROUTINE_1 DpcForIsrRoutine
//DispatchCreate
#define fun_IRP_MJ_CREATE DispatchCreate
//DispatchPnp
#define fun_IRP_MJ_PNP DispatchPnp
//DispatchPower
#define fun_IRP_MJ_POWER DispatchPower
//DispatchRead
#define fun_IRP_MJ_READ DispatchRead
//DispatchSystemControl
#define fun_IRP_MJ_SYSTEM_CONTROL DispatchSystemControl
//InterruptServiceRoutine
#define fun_KSERVICE_ROUTINE_1 InterruptServiceRoutine

Исправление файла Sdv-map.h

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

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

Утверждение файла Sdv-map.h

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

SDV проверит драйвер, даже если файл Sdv-map.h не утвержден.

Чтобы утвердить файл Sdv-map.h, в первой строке файла измените:

//Approved=false

на:

//Approved=true

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

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

//Approved=true
//DriverEntry
#define fun_DriverEntry DriverEntry
//EvtDriverDeviceAdd
#define fun_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
//EvtIoDeviceControl
#define fun_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl
//EvtIoInternalDeviceControl
#define fun_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControl
//EvtIoRead
#define fun_WDF_IO_QUEUE_IO_READ EvtIoRead
//EvtRequestCancel
#define fun_WDF_REQUEST_CANCEL_1 EvtRequestCancel