функция обратного вызова EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST (wdfqueryinterface.h)
[Применимо только к KMDF]
Функция обратного вызова событий драйвера EvtDeviceProcessQueryInterfaceRequest проверяет запрос другого драйвера на доступ к определяемом драйвером интерфейсу, прежде чем платформа передает интерфейс драйверу запроса.
Синтаксис
EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST EvtWdfDeviceProcessQueryInterfaceRequest;
NTSTATUS EvtWdfDeviceProcessQueryInterfaceRequest(
[in] WDFDEVICE Device,
[in] LPGUID InterfaceType,
[in, out] PINTERFACE ExposedInterface,
[in, out] PVOID ExposedInterfaceSpecificData
)
{...}
Параметры
[in] Device
Дескриптор объекта устройства платформы.
[in] InterfaceType
Указатель на GUID, определяющий определяемый драйвером интерфейс.
[in, out] ExposedInterface
Указатель на структуру интерфейса , описывающую определяемый драйвером интерфейс и предоставленный драйвером, запрашивающим доступ к интерфейсу.
[in, out] ExposedInterfaceSpecificData
Указатель на дополнительные, необязательные, определяемые драйвером сведения о интерфейсе. Драйверы на основе платформы указывают это значение, предоставляя значение параметра, отличное отNULLInterfaceSpecificData при вызове WdfFdoQueryForInterface.
Возвращаемое значение
Если функция обратного вызова EvtDeviceProcessQueryInterfaceRequest получает guid, который он поддерживает, и если функция не сталкивается с ошибками, она должна возвращать STATUS_SUCCESS или другое значение состояния, для которого NT_SUCCESS(состояние) равно TRUE. Платформа продолжает передавать запрос вниз стека, чтобы узнать, поддерживают ли дополнительные драйверы интерфейс.
Функция обратного вызова EvtDeviceProcessQueryInterfaceRequest должна возвращать STATUS_NOT_SUPPORTED если она определяет, что для конкретного случая она не будет обслуживать интерфейс. Платформа продолжает передавать запрос вниз стека, чтобы узнать, поддерживает ли другой драйвер интерфейс. Дополнительные сведения об этой ситуации см. в следующем разделе "Примечания".
Если функция обратного вызова сталкивается с ошибкой, она должна вернуть значение состояния, для которого NT_SUCCESS(состояние) равно FALSE. Платформа завершает запрос другого драйвера на интерфейс и не передает запрос вниз по стеку.
Замечания
Драйверы на основе платформы регистрируют функцию обратного вызова событий EvtDeviceProcessQueryInterfaceRequest путем вызова WdfDeviceAddQueryInterface.
Если определяемый драйвером интерфейс поддерживает только односторонняя связь и задает элемент ImportInterface структуры WDF_QUERY_INTERFACE_CONFIG, описывающей интерфейс для FALSE, функция обратного вызова EvtDeviceProcessQueryInterfaceRequest является необязательной. Когда другой драйвер вызывает WdfFdoQueryForInterface, платформа копирует значения интерфейса, определяемые драйвером, в структуру интерфейса драйвера, а затем вызывает функцию обратного вызова. Для односторонного взаимодействия необходимо предоставить функцию обратного вызова только в том случае, если требуется, чтобы драйвер проверял и, возможно, изменял значения интерфейса, прежде чем платформа возвращает их в запрашивающий драйвер.
Драйвер должен предоставить функцию обратного вызова событий EvtDeviceProcessQueryInterfaceRequest, если драйвер определяет интерфейс, поддерживающий двустороннее взаимодействие (и задает для элемента WDF_QUERY_INTERFACE_CONFIG структуры WDF_QUERY_INTERFACE_CONFIG значение TRUE). Функция обратного вызова требуется, так как, если ImportInterfaceTRUE, а другой драйвер вызывает WdfFdoQueryForInterface, платформа не копирует определяемый драйвером интерфейс в структуру интерфейса запрашивающего драйвера. Вместо этого функция обратного вызова должна обновить структуру интерфейса драйвера запроса.
Функция обратного вызова может изменить интерфейс. В частности, это может:
- Измените любое значение в любом элементе интерфейса.
- Выделите контекст для динамического экземпляра, изменив элемент контекста контекста структуры INTERFACE.
Дополнительные сведения об интерфейсах, определенных драйвером, см. в разделе Использование интерфейсов Driver-Defined.
Примеры
Чтобы определить функцию обратного вызова EvtDeviceProcessQueryInterfaceRequest, необходимо сначала указать объявление функции, определяющее тип определяемой функции обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с помощью типов функций обратного вызова помогает анализ кода для драйверов, статический проверяющий драйвер (SDV) и другие средства проверки подлинности, и это требование для написания драйверов для операционной системы Windows.
Например, чтобы определить функцию обратного вызова EvtDeviceProcessQueryInterfaceRequest, которая называется MyDeviceProcessQueryInterfaceRequest, используйте тип EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST, как показано в следующем примере кода:
EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST MyDeviceProcessQueryInterfaceRequest;
Затем реализуйте функцию обратного вызова следующим образом:
_Use_decl_annotations_
NTSTATUS
MyDeviceProcessQueryInterfaceRequest (
WDFDEVICE Device,
LPGUID InterfaceType,
PINTERFACE ExposedInterface,
PVOID ExposedInterfaceSpecificData
)
{...}
Тип функции EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST определен в файле заголовка WdfQueryInterface.h. Чтобы более точно определить ошибки при запуске средств анализа кода, обязательно добавьте в определение функции заметку Use_decl_annotations. Заметка Use_decl_annotations гарантирует, что используются заметки, применяемые к типу функции EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST в файле заголовка.
Дополнительные сведения о требованиях к объявлениям функций см. в объявлении функций с помощью типов ролей функций для драйверов KMDF.
Сведения о
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
минимальная версия KMDF | 1.0 |
заголовка | wdfqueryinterface.h (include Wdf.h) |
IRQL | PASSIVE_LEVEL |
См. также
ИНТЕРФЕЙСА