Функция WdfDeviceEnqueueRequest (wdfdevice.h)
[Применяется только к KMDF]
Метод WdfDeviceEnqueueRequest доставляет указанный запрос ввода-вывода в платформу, чтобы платформа впоследствии может добавить запрос в одну из очередей ввода-вывода, созданных драйвером для указанного устройства.
Синтаксис
NTSTATUS WdfDeviceEnqueueRequest(
[in] WDFDEVICE Device,
[in] WDFREQUEST Request
);
Параметры
[in] Device
Дескриптор объекта устройства платформы.
[in] Request
Дескриптор объекта запроса платформы.
Возвращаемое значение
Если операция выполнена успешно, метод возвращает STATUS_SUCCESS. К дополнительным возвращаемым значениям относятся:
Код возврата | Описание |
---|---|
|
Объем доступной памяти низкий. |
|
Драйвер не создал очереди ввода-вывода для устройства, и драйвер не является драйвером фильтра. |
|
Очередь ввода-вывода устройства не принимает запросы. |
Метод может возвращать другие значения NTSTATUS.
Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Комментарии
Драйвер может вызывать WdfDeviceEnqueueRequest только из функции обратного вызова EvtIoInCallerContext .
Метод WdfDeviceEnqueueRequest добавляет запрос в очередь ввода-вывода для конкретного типа запроса драйвера для устройства, если драйвер создал его. В противном случае метод добавляет запрос в очередь устройства по умолчанию, если драйвер создал ее.
Если драйвер не создал очереди ввода-вывода для устройства, WdfDeviceEnqueueRequest выполняет следующие действия.
- Если драйвер является драйвером фильтра, WdfDeviceEnqueueRequest отправляет запрос целевому объекту ввода-вывода драйвера.
- Если драйвер не является драйвером фильтра, WdfDeviceEnqueueRequest возвращает STATUS_INVALID_DEVICE_REQUEST.
В результате, если драйверу необходимо использовать запрос или его контекст после вызова WdfDeviceEnqueueRequest, он должен принять ссылку на запрос перед вызовом WdfDeviceEnqueueRequest.
Для этого драйвер может вызвать WdfObjectReference до, а затем WdfObjectDereference после вызова WdfDeviceEnqueueRequest. Драйвер должен разыменовывание запроса перед выходом из EvtIoInCallerContext.
Дополнительные сведения о методе WdfDeviceEnqueueRequest см. в разделе Управление очередями ввода-вывода.
Для kmdf версий 1.0 и 1.5 необходимо вызывать WdfDeviceEnqueueRequest на PASSIVE_LEVEL. Для версий 1.7 и более поздних можно вызвать WdfDeviceEnqueueRequest по адресу IRQL <= DISPATCH_LEVEL.
Примеры
Следующий пример кода представляет собой функцию обратного вызова EvtIoInCallerContext , которая ищет запросы, содержащие пользовательский код элемента управления вводом-выводом, IOCTL_NONPNP_METHOD_NEITHER. Если код элемента управления вводом-выводом не найден, функция обратного вызова просто возвращает запрос в платформу. Если функция обратного вызова находит код элемента управления вводом-выводом, она предварительно обрабатывает запрос, а затем возвращает его платформе. При обнаружении ошибки функция обратного вызова завершает запрос.
VOID
MyEvtDeviceIoInCallerContext(
IN WDFDEVICE Device,
IN WDFREQUEST Request
)
{
NTSTATUS status = STATUS_SUCCESS;
WDF_REQUEST_PARAMETERS params;
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
if(!(params.Type == WdfRequestTypeDeviceControl &&
params.Parameters.DeviceIoControl.IoControlCode == IOCTL_NONPNP_METHOD_NEITHER)) {
status = WdfDeviceEnqueueRequest(
Device,
Request
);
if(!NT_SUCCESS(status)) {
goto End;
}
return;
}
//
// Found a match for the control code. Preprocess the request, and then
// return the request to the framework.
//
//...(Preprocess the request here.)
status = WdfDeviceEnqueueRequest(
Device,
Request
);
if(!NT_SUCCESS(status)) {
goto End;
}
return;
End:
WdfRequestComplete(
Request,
status
);
return;
}
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Минимальная версия KMDF | 1,0 |
Верхняя часть | wdfdevice.h (включая Wdf.h) |
Библиотека | Wdf01000.sys (см. раздел Управление версиями библиотеки платформы). |
IRQL | <= DISPATCH_LEVEL (см. раздел о примечаниях) |
Правила соответствия DDI | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf) |