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


функция обратного вызова EVT_WDFDEVICE_WDM_IRP_PREPROCESS (wdfdevice.h)

[Применяется только к KMDF]

Функция обратного вызова события EvtDeviceWdmIrpPreprocess драйвера получает IRP до того, как платформа обработает IRP.

Синтаксис

EVT_WDFDEVICE_WDM_IRP_PREPROCESS EvtWdfdeviceWdmIrpPreprocess;

NTSTATUS EvtWdfdeviceWdmIrpPreprocess(
  [in]      WDFDEVICE Device,
  [in, out] PIRP Irp
)
{...}

Параметры

[in] Device

Дескриптор объекта устройства платформы.

[in, out] Irp

Указатель на структуру IRP .

Возвращаемое значение

Функция обратного вызова EvtDeviceWdmIrpPreprocess должна:

  • Задайте для элемента IoStatus.Status IRP значение STATUS_SUCCESS или другое значение состояния, для которого NT_SUCCESS(status) равно TRUE, и верните то же значение (после вызова IoCompleteRequest), если функция обратного вызова успешно завершает полученный IRP.
  • Задайте для элемента IoStatus.Status IRP значение состояния, для которого NT_SUCCESS(status) равно FALSE, и верните то же значение (после вызова IoCompleteRequest), если функция обратного вызова обнаруживает ошибку.
  • Возвращает STATUS_PENDING, если функция обратного вызова вызывает IoMarkIrpPending.
  • Возвращает значение, возвращаемое методом WdfDeviceWdmDispatchPreprocessedIrp , если функция обратного вызова вызывает этот метод.

Комментарии

Чтобы зарегистрировать функцию обратного вызова EvtDeviceWdmIrpPreprocess , драйвер должен вызвать WdfDeviceInitAssignWdmIrpPreprocessCallback.

Драйвер может использовать функцию обратного вызова EvtDeviceWdmIrpPreprocess для выполнения любого или всех следующих действий:

  • Обработайте IRP, который не поддерживается платформой, следуя правилам WDM для обработки IRP.
  • Предварительная обработка IRP до того, как платформа обработает его.
  • Задайте процедуру завершения, чтобы драйвер смог постобработать IRP после ее обработки платформой.
Дополнительные сведения о реализации функции обратного вызова EvtDeviceWdmIrpPreprocess см. в разделе Обработка WDM IRP за пределами платформы.

Если вы хотите, чтобы платформа впоследствии обрабатывала IRP так же, как если бы функция обратного вызова EvtDeviceWdmIrpPreprocess не была вызвана, функция обратного вызова должна вызвать WdfDeviceWdmDispatchPreprocessedIrp , чтобы вернуть IRP в платформу.

Если драйвер регистрирует функцию обратного вызова EvtDeviceWdmIrpPreprocess , платформа добавляет дополнительное расположение стека ввода-вывода в irP, которое получает функция обратного вызова. Дополнительное расположение стека ввода-вывода позволяет функции обратного вызова задать подпрограмму IoCompletion перед вызовом WdfDeviceWdmDispatchPreprocessedIrp.

Функция обратного вызова EvtDeviceWdmIrpPreprocess вызывается в irQL вызывающего потока. IrQL определяется типом IRP, который платформа передает в EvtDeviceWdmIrpPreprocess. Например, если диспетчер PnP отправляет IRP_MN_QUERY_DEVICE_RELATIONS по адресу IRQL = PASSIVE_LEVEL, платформа вызывает EvtDeviceWdmIrpPreprocess по адресу IRQL = PASSIVE_LEVEL.

Требования

Требование Значение
Целевая платформа Универсальное
Минимальная версия KMDF 1,0
Верхняя часть wdfdevice.h (включая Wdf.h)
IRQL <=DISPATCH_LEVEL

См. также раздел

WdfDeviceInitAssignWdmIrpPreprocessCallback

WdfDeviceWdmDispatchPreprocessedIrp