Функция WdfDeviceEnqueueRequest (wdfdevice.h)
[Применимо только к KMDF]
Метод WdfDeviceEnqueueRequest предоставляет указанный запрос ввода-вывода в платформу, чтобы платформа впоследствии может добавить запрос в одну из очередей ввода-вывода, созданных драйвером для указанного устройства.
Синтаксис
NTSTATUS WdfDeviceEnqueueRequest(
[in] WDFDEVICE Device,
[in] WDFREQUEST Request
);
Параметры
[in] Device
Дескриптор объекта устройства платформы.
[in] Request
Дескриптор объекта запроса платформы.
Возвращаемое значение
Если операция выполнена успешно, метод возвращает STATUS_SUCCESS. К дополнительным возвращаемым значениям относятся:
Возвращаемый код | Описание |
---|---|
|
Объем доступной памяти низкий. |
|
Драйвер не создал очереди ввода-вывода для устройства, а драйвер не является драйвером фильтра. |
|
Очередь ввода-вывода устройства не принимает запросы. |
Метод может возвращать другие значения NTSTATUS.
Ошибка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Замечания
Драйвер может вызывать WdfDeviceEnqueueRequest только из функции обратного вызова EvtIoInCallerCon text.
Метод WdfDeviceEnqueueRequest добавляет запрос в очередь ввода-вывода для конкретного типа драйвера для устройства, если драйвер создал его. В противном случае метод добавляет запрос в очередь по умолчанию устройства, если драйвер создал его.
Если драйвер не создал очереди ввода-вывода для устройства, WdfDeviceEnqueueRequest выполните следующие действия:
- Если драйвер является драйвером фильтра, WdfDeviceEnqueueRequest отправляет запрос на целевой объект ввода-вывода драйвера.
- Если драйвер не является драйвером фильтра, WdfDeviceEnqueueRequest возвращает STATUS_INVALID_DEVICE_REQUEST.
В результате, если драйверу необходимо использовать запрос или его контекст после вызова WdfDeviceEnqueueRequest, перед вызовом WdfDeviceEnqueueRequest.
Для этого драйвер может вызывать WdfObjectReference до, а затем WdfObjectDereference после вызова WdfDeviceEnqueueRequest. Драйвер должен разыменовывание запроса перед выходом EvtIoInCallerContext.
Дополнительные сведения о методе WdfDeviceEnqueueRequest см. в управлении очередями ввода-вывода.
Для версий 1.0 и 1.5 KMDF 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 (include Wdf.h) |
библиотеки | Wdf01000.sys (см. управление версиями библиотеки Платформы).) |
IRQL | <= DISPATCH_LEVEL (см. раздел примечаний) |
правил соответствия DDI | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), KmdfIrql(kmdf), kmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf) |