Функция WdfUsbTargetPipeFormatRequestForAbort (wdfusb.h)
[Относится к KMDF и UMDF]
Метод WdfUsbTargetPipeFormatRequestForAbort создает запрос прерывания для указанного USB-канала, но не отправляет запрос.
Синтаксис
NTSTATUS WdfUsbTargetPipeFormatRequestForAbort(
[in] WDFUSBPIPE Pipe,
[in] WDFREQUEST Request
);
Параметры
[in] Pipe
Дескриптор объекта канала платформы, полученный путем вызова WdfUsbInterfaceGetConfiguredPipe.
[in] Request
Дескриптор объекта запроса платформы. Дополнительные сведения см. в разделе "Примечания".
Возвращаемое значение
WdfUsbTargetPipeFormatRequestForAbort возвращает значение состояния завершения целевого объекта ввода-вывода в случае успешного выполнения операции. В противном случае этот метод может вернуть одно из следующих значений:
Код возврата | Описание |
---|---|
|
Обнаружен недопустимый параметр. |
|
Недостаточно памяти. |
|
Пакет запроса ввода-вывода (IRP), который представляет параметр Request , не предоставляет достаточно IO_STACK_LOCATION структур, позволяющих драйверу пересылать запрос. |
Этот метод также может возвращать другие значения NTSTATUS.
Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Комментарии
Используйте WdfUsbTargetPipeFormatRequestForAbort, а затем WdfRequestSend, чтобы отправить запрос на прерывание USB синхронно или асинхронно. Кроме того, используйте метод WdfUsbTargetPipeAbortSynchronously для синхронной отправки запроса.
Запрос прерывания USB приводит к тому, что целевой объект ввода-вывода драйвера отменяет все запросы ввода-вывода, отправленные в канал. Когда драйвер вызывает WdfRequestSend, платформа отправляет запрос URB_FUNCTION_ABORT_PIPE целевому объекту ввода-вывода. Дополнительные сведения об отмене операций в USB-канале (также называемом "прерыванием канала") см. в спецификации USB.
Вы можете переслать запрос ввода-вывода, полученный драйвером в очереди ввода-вывода, или создать и отправить новый запрос.
Чтобы переслать запрос ввода-вывода, полученный драйвером в очереди ввода-вывода, укажите дескриптор полученного запроса для параметра Request метода WdfUsbTargetPipeFormatRequestForAbort.
Чтобы создать новый запрос ввода-вывода, вызовите WdfRequestCreate , чтобы предварительно выделить объект запроса. Укажите дескриптор запроса для параметра Request метода WdfUsbTargetPipeFormatRequestForAbort. Вы можете повторно использовать объект запроса, вызвав WdfRequestReuse. Функция обратного вызова EvtDriverDeviceAdd вашего драйвера может предварительно выделить объекты запросов для устройства.
После вызова WdfUsbTargetPipeFormatRequestForAbort для форматирования запроса ввода-вывода драйвер должен вызвать WdfRequestSend для отправки запроса (синхронно или асинхронно) целевому объекту ввода-вывода.
Несколько вызовов WdfUsbTargetPipeFormatRequestForAbort , использующих один и тот же запрос, не приводят к выделению дополнительных ресурсов. Таким образом, чтобы снизить вероятность того, что WdfRequestCreate вернет STATUS_INSUFFICIENT_RESOURCES, функция обратного вызова EvtDriverDeviceAdd драйвера может вызвать WdfRequestCreate для предварительного выделения одного или нескольких объектов запроса для устройства. Впоследствии драйвер может повторно использовать (вызвать WdfRequestReuse), переформатировать (вызвать WdfUsbTargetPipeFormatRequestForAbort) и повторно отправить (вызвать WdfRequestSend) каждый объект запроса без риска STATUS_INSUFFICIENT_RESOURCES возвращаемого значения при последующем вызове WdfRequestCreate. Все последующие вызовы WdfUsbTargetPipeFormatRequestForAbort для повторно использованного объекта запроса будут возвращать STATUS_SUCCESS, если значения параметров не изменяются. (Если драйвер не вызывает один и тот же метод форматирования запросов каждый раз, могут быть выделены дополнительные ресурсы.)
Сведения о получении сведений о состоянии после завершения запроса ввода-вывода см. в разделе Получение сведений о завершении.
Дополнительные сведения о методе WdfUsbTargetPipeFormatRequestForAbort и целевых объектах USB-ввода-вывода см. в разделе Целевые объекты ввода-вывода USB.
Примеры
Следующий пример кода форматирует запрос прерывания для USB-канала, регистрирует функцию обратного вызова CompletionRoutine и отправляет запрос.
status = WdfUsbTargetPipeFormatRequestForAbort(
pipe,
Request
);
if (!NT_SUCCESS(status)) {
goto Exit;
}
WdfRequestSetCompletionRoutine(
Request,
AbortCompletionRoutine,
pipe
);
if (WdfRequestSend(
Request,
WdfUsbTargetPipeGetIoTarget(pipe),
WDF_NO_SEND_OPTIONS
) == FALSE) {
status = WdfRequestGetStatus(Request);
goto Exit;
}
Exit:
if (!NT_SUCCESS(status)) {
WdfRequestCompleteWithInformation(
Request,
status,
0
);
}
return;
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Минимальная версия KMDF | 1,0 |
Минимальная версия UMDF | 2,0 |
Верхняя часть | wdfusb.h (включая Wdfusb.h) |
Библиотека | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | <=DISPATCH_LEVEL |
Правила соответствия DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestFormattedValid(kmdf), RequestForUrbXrb(kmdf), RequestSendAndForgetNoFormatting(kmdf), RequestSendAndForgetNoFormatting2(kmdf), UsbKmdfIrql(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf) |