Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы включить sdV для проверки драйвера KMDF, необходимо объявить каждую функцию обратного вызова с помощью типа роли функции обратного вызова. Типы ролей функции обратного вызова определяются в различных файлах заголовков WDF и включаются при создании драйвера с использованием заголовочного файла Wdf.h. В следующей таблице показаны типы ролей функций и функции обратного вызова событий, с которыми они связаны.
Перед определениями функции обратного вызова необходимо объявить функции обратного вызова драйвера. Объявление типа роли функции для функции обратного вызова EvtDriverDeviceAdd показано в следующем примере. В этом примере функция обратного вызова называется EvtDriverDeviceAdd.
#include <NTDDK.h>
#include <wdf.h>
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
Если функция обратного вызова имеет объявление прототипа функции, необходимо заменить прототип функции объявлением типа роли функции. Дополнительные сведения о объявлениях типов ролей функции см. в разделе "Использование объявлений типов ролей функции".
В следующей таблице показаны типы функций обратного вызова и функции обратного вызова событий, с которыми они связаны.
| Тип функциональной роли | Функция обратного вызова событий |
|---|---|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_CLEANUP |
EvtChildListAddressDescriptionCleanup (Очистка описания адреса списка дочерних элементов) |
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_COPY |
|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE |
|
EVT_WDF_CHILD_LIST_CREATE_DEVICE |
|
EVT_WDF_CHILD_LIST_DEVICE_REENUMERATED |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_CLEANUP |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COPY |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_DUPLICATE (Дублирование идентификатора описания списка дочерних элементов в WDF) |
|
EVT_WDF_CHILD_LIST_SCAN_FOR_CHILDREN |
|
EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 |
|
EVT_WDF_DEVICE_ARM_WAKE_FROM_SX |
|
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
|
EVT_WDF_DEVICE_CONTEXT_DESTROY |
|
EVT_WDF_DEVICE_D0_ENTRY |
|
EVT_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED |
|
EVT_WDF_DEVICE_D0_EXIT |
|
EVT_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED |
|
Обработчик EVT_WDF_УСТРОЙСТВО_ОТКЛЮЧЕНИЕ_ПРОБУЖДЕНИЯ_ШИНЫ |
|
EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 |
|
EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX |
|
EVT_WDF_ИЗВЛЕЧЕНИЕ_УСТРОЙСТВА |
|
EVT_WDF_DEVICE_ENABLE_WAKE_AT_BUS |
|
EVT_WDF_DEVICE_FILE_CREATE |
|
EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS |
|
EVT_WDF_DEVICE_PNP_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_POWER_POLICY_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_POWER_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_PREPARE_HARDWARE (Подготовка оборудования устройства WDF) |
|
EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST |
|
EVT_WDF_DEVICE_QUERY_REMOVE |
|
EVT_WDF_DEVICE_QUERY_STOP |
|
EVT_WDF_DEVICE_RELATIONS_QUERY |
|
EVT_WDF_DEVICE_RELEASE_HARDWARE |
|
EVT_WDF_DEVICE_REMOVE_ADDED_RESOURCES |
|
EVT_WDF_DEVICE_RESOURCE_REQUIREMENTS_QUERY |
|
EVT_WDF_DEVICE_RESOURCES_QUERY |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_FLUSH |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_SUSPEND |
|
EVT_WDF_DEVICE_SET_LOCK |
|
EVT_WDF_DEVICE_SHUTDOWN_NOTIFICATION |
|
EVT_WDF_DEVICE_SURPRISE_REMOVAL |
|
EVT_WDF_DEVICE_USAGE_NOTIFICATION |
|
EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED |
|
EVT_WDF_DEVICE_WAKE_FROM_SX_TRIGGERED |
|
EVT_WDF_DMA_ENABLER_DISABLE |
|
EVT_WDF_DMA_ENABLER_ENABLE |
|
EVT_WDF_DMA_ENABLER_FILL |
|
EVT_WDF_DMA_ENABLER_FLUSH |
|
EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_START |
|
EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_STOP |
|
EVT_WDF_DPC |
|
EVT_WDF_DRIVER_DEVICE_ADD |
|
EVT_WDF_DRIVER_UNLOAD |
|
EVT_WDF_FILE_CLEANUP |
|
EVT_WDF_FILE_CLOSE |
|
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
|
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
|
EVT_WDF_INTERRUPT_DISABLE |
|
EVT_WDF_INTERRUPT_DPC |
|
EVT_WDF_INTERRUPT_ENABLE |
|
EVT_WDF_INTERRUPT_ISR |
|
EVT_WDF_INTERRUPT_SYNCHRONIZE |
|
EVT_WDF_IO_IN_CALLER_CONTEXT |
|
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
|
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
|
EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE |
|
EVT_WDF_IO_QUEUE_IO_DEFAULT |
|
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL |
|
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL |
|
EVT_WDF_IO_QUEUE_IO_READ |
|
EVT_WDF_IO_QUEUE_IO_RESUME |
|
EVT_WDF_IO_QUEUE_IO_STOP |
|
EVT_WDF_IO_QUEUE_IO_WRITE |
|
EVT_WDF_IO_QUEUE_STATE |
|
EVT_WDF_IO_TARGET_QUERY_REMOVE |
|
EVT_WDF_IO_TARGET_REMOVE_CANCELED |
|
EVT_WDF_IO_TARGET_REMOVE_COMPLETE |
|
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
|
EVT_WDF_OBJECT_CONTEXT_DESTROY |
|
EVT_WDF_PROGRAM_DMA |
|
EVT_WDF_REQUEST_CANCEL |
|
EVT_WDF_REQUEST_COMPLETION_ROUTINE |
|
EVT_WDF_TIMER |
|
EVT_WDF_TRACE_CALLBACK |
|
EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD |
|
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE |
|
EVT_WDF_WMI_INSTANCE_SET_INSTANCE |
|
EVT_WDF_WMI_INSTANCE_SET_ITEM |
|
EVT_WDF_WMI_PROVIDER_FUNCTION_CONTROL |
|
EVT_WDF_WORKITEM |
|
EVT_WDFDEVICE_WDM_IRP_PREPROCESS |
Типы ролей функций, разрешающие несколько функций обратного вызова
Существуют некоторые типы ролей функций, которые могут иметь несколько функций обратного вызова событий, связанных с ними. Например, драйвер может иметь несколько функций обратного вызова EvtTimerFunc или EvtDpcFunc . В следующей таблице показано максимальное количество обратных вызовов, поддерживаемых SDV для каждого типа роли функции. Хотя для драйвера не является ошибкой превышение максимального числа функций обратного вызова, перечисленных в таблице, это несколько усложняет процесс проверки при использовании SDV. Сведения об изменениях, которые могут потребоваться внести в файл Sdv-map.h для размещения дополнительных функций обратного вызова, см. в разделе "Повторяющиеся точки входа" для типа роли функции.
| Тип функциональной роли | Максимальное количество функций обратного вызова |
|---|---|
EVT_WDF_DPC |
7 |
EVT_WDF_INTERRUPT_SYNCHRONIZE |
11 |
EVT_WDF_TIMER |
6 |
EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD |
5 |
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE |
5 |
EVT_WDF_WMI_INSTANCE_SET_INSTANCE |
5 |
EVT_WDF_WMI_INSTANCE_SET_ITEM |
5 |
Типы ролей функций и очереди ввода-вывода
Используйте следующие типы ролей функций при объявлении обработчиков запросов и функций обратного вызова, использующих платформу KMDF для доставки запросов ввода-вывода драйверу (для последовательной или параллельной отправки). Не используйте эти типы ролей функций для функций, которые вручную перенаправляют запросы из очереди по умолчанию в другие очереди (отправка вручную). SDV не поддерживает модель памяти, которая позволяет отслеживать запросы из одной очереди в другую.
Дополнительные сведения о очередях ввода-вывода см. в разделе "Создание очередей ввода-вывода".
| Типы ролей функций, используемые для очереди ввода-вывода, настроенной для ручной отправки |
|---|
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK (обработчик уничтожения контекста очереди ввода-вывода) |
EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE |
EVT_WDF_IO_QUEUE_IO_DEFAULT |
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL |
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL |
EVT_WDF_IO_QUEUE_IO_READ |
EVT_WDF_IO_QUEUE_IO_RESUME |
EVT_WDF_IO_QUEUE_IO_STOP |
EVT_WDF_IO_QUEUE_IO_WRITE |
EVT_WDF_IO_QUEUE_STATE |
Типы ролей функций для функций EvtCleanupCallback и EvtDestroyCallback
Необходимо объявить функции EvtCleanupCallback и EvtDestroyCallback с типами ролей функций, специфичными для объекта. SDV требует, чтобы эти типы ролей конкретного объекта определяли, правильно ли драйвер использует функцию обратного вызова. Используйте следующие таблицы, чтобы определить, какой тип функции следует использовать.
| Тип объекта | Тип роли функции для EvtCleanupCallback |
|---|---|
Объект устройства |
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
Объект очереди ввода-вывода |
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
Объект Файл |
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
Все прочие объекты |
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
| Тип объекта | Тип роли функции для EvDestroyCallback |
|---|---|
Объект устройства |
EVT_WDF_DEVICE_CONTEXT_DESTROY |
Объект очереди ввода-вывода |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK (обработчик уничтожения контекста очереди ввода/вывода WDF) |
Объект Файл |
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
Все прочие объекты |
EVT_WDF_OBJECT_CONTEXT_DESTROY |