Функция WdfUsbTargetPipeAbortSynchronously (wdfusb.h)
[Применимо к KMDF и UMDF]
Метод WdfUsbTargetPipeAbortSynchronous создает запрос прерывания и отправляет его синхронно в указанный USB-канал.
Синтаксис
NTSTATUS WdfUsbTargetPipeAbortSynchronously(
[in] WDFUSBPIPE Pipe,
[in, optional] WDFREQUEST Request,
[in, optional] PWDF_REQUEST_SEND_OPTIONS RequestOptions
);
Параметры
[in] Pipe
Дескриптор объекта канала платформы, полученный путем вызова WdfUsbInterfaceGetConfiguredPipe.
[in, optional] Request
Дескриптор объекта запроса платформы. Этот параметр является необязательным и может быть null. Дополнительные сведения см. в следующем разделе "Примечания".
[in, optional] RequestOptions
Указатель на структуру, выделенную вызывающим объектом, WDF_REQUEST_SEND_OPTIONS, которая задает параметры запроса. Этот указатель необязателен и может быть null. Дополнительные сведения см. в следующем разделе "Примечания".
Возвращаемое значение
WdfUsbTargetPipeAbortSynchronous возвращает значение состояния завершения целевого объекта ввода-вывода, если операция завершится успешно. В противном случае этот метод может вернуть одно из следующих значений:
Возвращаемый код | Описание |
---|---|
|
Размер структуры |
|
Обнаружен недопустимый дескриптор. |
|
Недостаточно памяти было доступно. |
|
IrQL вызывающего объекта не был PASSIVE_LEVEL, или указанный запрос ввода-вывода уже был помещен в очередь в целевой объект ввода-вывода. |
|
Драйвер предоставил значение времени ожидания и запрос не завершился в течение выделенного времени. |
Этот метод также может возвращать другие значения NTSTATUS.
Ошибка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Замечания
Используйте метод WdfUsbTargetPipeAbortSynchronous для синхронной отправки запроса на прерывание USB. Чтобы отправлять такие запросы асинхронно, используйте WdfUsbTargetPipeFormatRequestForAbort, а затем WdfRequestSend.
Запрос на прерывание USB приводит к тому, что целевой объект ввода-вывода драйвера отменяет все запросы ввода-вывода, отправленные в канал. Когда драйвер вызывает WdfUsbTargetPipeAbortSynchronous, платформа отправляет запрос URB_FUNCTION_ABORT_PIPE целевому объекту ввода-вывода. Дополнительные сведения об отмене операций на USB-канале (также называемом "прерывание канала"), см. в спецификации USB.
Метод WdfUsbTargetPipeAbortSynchronous не возвращается до завершения запроса, если драйвер не предоставляет значение времени ожидания в структуре WDF_REQUEST_SEND_OPTIONS параметра RequestOptionsWDF_REQUEST_SEND_OPTIONS или если не обнаружена ошибка.
Вы можете пересылать запрос ввода-вывода, полученный драйвером в очереди ввода-вывода, или создать и отправить новый запрос.
Чтобы пересылать запрос ввода-вывода, полученный драйвером в очереди ввода-вывода, укажите дескриптор полученного запроса для параметра метода
Чтобы создать и отправить новый запрос, укажите маркер запроса
- Если вы предоставляете дескриптор запроса NULL, платформа использует внутренний объект запроса. Этот метод прост в использовании, но драйвер не может отменить запрос.
-
При вызове WdfRequestCreate для создания одного или нескольких объектов запроса можно повторно использовать эти объекты запроса, вызвав WdfRequestReuse. Этот метод позволяет
драйвера EvtDriverDeviceAdd функцию обратного вызова для предварительного размещения объектов запросов для устройства. Кроме того, другой поток драйвера может вызывать WdfRequestCancelSentRequest, чтобы отменить запрос при необходимости.
Сведения о получении сведений о состоянии после завершения запроса ввода-вывода см. в получения сведений о завершении.
Дополнительные сведения о методе WdfUsbTargetPipeAbortSynchronous и целевых объектов usb-ввода-вывода см. в целевых объектов USB-ввода-вывода.
Примеры
В следующем примере кода отправляются запросы прерывания во все каналы, настроенные для интерфейса USB-устройства.
UCHAR i;
ULONG count;
NTSTATUS status;
PDEVICE_CONTEXT pDevContext;
pDevContext = GetDeviceContext(Device);
count = WdfUsbInterfaceGetNumConfiguredPipes(
pDevContext->UsbInterface
);
for (i = 0; i < count; i++) {
WDFUSBPIPE pipe;
pipe = WdfUsbInterfaceGetConfiguredPipe(
pDevContext->UsbInterface,
i,
NULL
);
status = WdfUsbTargetPipeAbortSynchronously(
pipe,
WDF_NO_HANDLE,
NULL
);
if (!NT_SUCCESS(status)) {
break;
}
}
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
минимальная версия KMDF | 1.0 |
минимальная версия UMDF | 2.0 |
заголовка | wdfusb.h (include Wdfusb.h) |
библиотеки |
Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | PASSIVE_LEVEL |
правил соответствия DDI |
DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), запросForUrbXrb(kmdf), UsbKmdfIrql(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf) |