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


функция обратного вызова 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.
Платформа вызывает функции обратного вызова драйвера EvtDeviceProcessQueryInterfaceRequest только для идентификаторов GUID, зарегистрированных драйвером, вызвав WdfDeviceAddQueryInterface. Поэтому эти функции обратного вызова не используют возвращаемое значение STATUS_NOT_SUPPORTED для отчета о непредвиденных идентификаторах GUID. Вместо этого функция обратного вызова EvtDeviceProcessQueryInterfaceRequest должна возвращать STATUS_NOT_SUPPORTED при определении того, что для конкретного случая он не будет обрабатывать интерфейс. Например, на основе данных, которые предоставляет запрашивающий драйвер, драйвер может определить, что драйвер нижнего уровня должен обслуживать запрос интерфейса. Возвращаемое значение STATUS_NOT_SUPPORTED сообщает платформе, что драйвер не обслуживает запрос интерфейса, но драйвер более низкого уровня может его обслуживать.

Дополнительные сведения об интерфейсах, определенных драйвером, см. в разделе Использование интерфейсов 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. Сведения о Use_decl_annotationsсм. в поведению функции.

Требования

Требование Ценность
целевая платформа Всеобщий
минимальная версия KMDF 1.0
заголовка wdfqueryinterface.h (include Wdf.h)
IRQL PASSIVE_LEVEL

См. также

ИНТЕРФЕЙСА

WDF_QUERY_INTERFACE_CONFIG

WdfDeviceAddQueryInterface

WdfFdoQueryForInterface