Функция WdfUsbTargetPipeReadSynchronously (wdfusb.h)

[Применимо к KMDF и UMDF]

Метод WdfUsbTargetPipeReadSynchronous создает запрос на чтение и отправляет его синхронно в указанный usb-канал ввода.

Синтаксис

NTSTATUS WdfUsbTargetPipeReadSynchronously(
  [in]            WDFUSBPIPE                Pipe,
  [in, optional]  WDFREQUEST                Request,
  [in, optional]  PWDF_REQUEST_SEND_OPTIONS RequestOptions,
  [in, optional]  PWDF_MEMORY_DESCRIPTOR    MemoryDescriptor,
  [out, optional] PULONG                    BytesRead
);

Параметры

[in] Pipe

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

[in, optional] Request

Дескриптор объекта запроса платформы. Этот параметр является необязательным и может быть null. Дополнительные сведения см. в следующем разделе "Примечания".

[in, optional] RequestOptions

Указатель на структуру, выделенную вызывающим объектом, WDF_REQUEST_SEND_OPTIONS, которая задает параметры запроса. Этот указатель необязателен и может быть null. Дополнительные сведения см. в следующем разделе "Примечания".

[in, optional] MemoryDescriptor

Указатель на выделенную вызывающим WDF_MEMORY_DESCRIPTOR структуру, описывающую буфер, который будет получать данные от устройства. Размер буфера должен быть нескольким из максимального размера пакета канала, если драйвер не вызвал WdfUsbTargetPipeSetNoMaximumPacketSizeCheck. Дополнительные сведения об этом буфере см. в следующем разделе "Примечания".

[out, optional] BytesRead

Указатель на расположение, которое получает количество байтов, которые были прочитаны, если операция выполнена успешно. Этот параметр является необязательным и может быть null.

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

WdfUsbTargetPipeReadSynchronous возвращает значение состояния завершения целевого объекта ввода-вывода, если операция завершается успешно. В противном случае этот метод может вернуть одно из следующих значений:

Возвращаемый код Описание
STATUS_INFO_LENGTH_MISMATCH
Неправильный размер структуры WDF_REQUEST_SEND_OPTIONS, на которую указывает RequestOption s.
STATUS_INVALID_PARAMETER
Обнаружен недопустимый параметр.
STATUS_INSUFFICIENT_RESOURCES
Недостаточно памяти было доступно.
STATUS_INVALID_DEVICE_REQUEST
IrQL вызывающего объекта не был PASSIVE_LEVEL, указан недопустимый дескриптор памяти, тип канала недействителен, направление передачи было недопустимым, или указанный запрос ввода-вывода уже помещался в целевой объект ввода-вывода.
STATUS_INVALID_BUFFER_SIZE
Размер буфера не был нескольким из максимального размера пакета канала.
STATUS_IO_TIMEOUT
Драйвер предоставил значение времени ожидания и запрос не завершился в течение выделенного времени.
STATUS_REQUEST_NOT_ACCEPTED
Пакет запроса ввода-вывода (IRP), который представляет параметр запроса , не предоставляет достаточно IO_STACK_LOCATION структур, чтобы разрешить драйверу пересылать запрос.
 

Этот метод также может возвращать другие значения NTSTATUS.

Ошибка возникает, если драйвер предоставляет недопустимый дескриптор объекта.

Замечания

Используйте метод WdfUsbTargetPipeReadSynchronous для синхронной отправки запросов на чтение. Чтобы асинхронно отправлять запросы на чтение, используйте WdfUsbTargetPipeFormatRequestForRead, а затем WdfRequestSend.

Канал, который указывает параметр канала , должен быть входным, а тип канала должен быть WdfUsbPipeTypeBulk или WdfUsbPipeTypeInterrupt.

Метод WdfUsbTargetPipeReadSynchronous не возвращается до завершения запроса, если драйвер не предоставляет значение времени ожидания в структуре WDF_REQUEST_SEND_OPTIONS, на которую указывает параметр RequestOptions или если ошибка не обнаружена.

Вы можете пересылать запрос ввода-вывода, полученный драйвером в очереди ввода-вывода, или создать и отправить новый запрос. В любом случае для платформы требуется объект запроса и некоторое пространство буфера.

Чтобы перенаправить запрос ввода-вывода, полученный драйвером в очереди ввода-вывода:

  1. Укажите дескриптор полученного запроса для параметра запроса .
  2. Используйте выходной буфер полученного запроса для параметра WdfUsbTargetPipeReadSynchronous метода MemoryDescriptor.

    Драйвер должен вызвать WdfRequestRetrieveOutputMemory, чтобы получить дескриптор объекта памяти платформы, представляющего выходной буфер запроса, а затем поместить его в структуру WDF_MEMORY_DESCRIPTOR, на которую MemoryDescriptor указывает.

Дополнительные сведения о переадресации запроса ввода-вывода см. в запросах на пересылку операций ввода-вывода.

Драйверы часто делят полученные запросы ввода-вывода на небольшие запросы, которые они отправляют в целевой объект ввода-вывода, поэтому ваш драйвер может создавать новые запросы.

Чтобы создать новый запрос ввода-вывода:

  1. Укажите дескриптор запроса null в параметре WdfUsbTargetPipeReadSynchronous метода request или создайте новый объект запроса и предоставьте его дескриптор:
    • Если вы предоставляете дескриптор запроса NULL, платформа использует внутренний объект запроса. Этот метод прост в использовании, но драйвер не может отменить запрос.
    • При вызове WdfRequestCreate для создания одного или нескольких объектов запроса можно повторно использовать эти объекты запроса, вызвав WdfRequestReuse. Этот метод позволяет драйвера EvtDriverDeviceAdd функцию обратного вызова для предварительного размещения объектов запросов для устройства. Кроме того, другой поток драйвера может вызывать WdfRequestCancelSentRequest, чтобы отменить запрос при необходимости.

    Драйвер может указать параметр, отличный отNULLRequestOptions, предоставляет ли драйвер параметрNULL или параметр NULLRequest. Например, можно использовать параметр RequestOptions для указания значения времени ожидания.

  2. Предоставьте буферное пространство для параметра WdfUsbTargetPipeReadSynchronous метода MemoryDescriptor.

    Драйвер может указать это буферное пространство в качестве локально выделенного буфера, как дескриптор WDFMEMORY или как MDL. Вы можете использовать любой метод, наиболее удобный.

    При необходимости платформа преобразует описание буфера в то, что правильно для метода целевого объекта ввода-вывода для доступа к буферам данных.

    Доступны следующие методы:

    • Укажите локальный буфер

      Так как WdfUsbTargetPipeReadSynchronous обрабатывает запросы ввода-вывода синхронно, драйвер может создавать буферы запросов, которые являются локальными для вызывающей подпрограммы, как показано в следующем примере кода.

      WDF_MEMORY_DESCRIPTOR  memoryDescriptor;
      MY_BUFFER_TYPE  myBuffer;
      WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&memoryDescriptor,
                                        (PVOID) &myBuffer,
                                        sizeof(myBuffer));
      
    • Укажите дескриптор WDFMEMORY

      Вызов WdfMemoryCreate или WdfMemoryCreatePreallocated для получения дескриптора в управляемой платформой памяти, как показано в следующем примере кода.

      WDF_MEMORY_DESCRIPTOR  memoryDescriptor;
      WDFMEMORY  memoryHandle = NULL;
      status = WdfMemoryCreate(NULL,
                               NonPagedPool,
                               POOL_TAG,
                               MY_BUFFER_SIZE,
                               &memoryHandle,
                               NULL);
      WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(&memoryDescriptor,
                                        memoryHandle,
                                        NULL);
      

      Кроме того, драйвер может вызывать WdfRequestRetrieveOutputMemory для получения дескриптора объекта памяти платформы, представляющего выходной буфер запроса ввода-вывода, если требуется передать содержимое этого буфера целевому объекту ввода-вывода. Драйвер не должен завершить полученный запрос ввода-вывода, пока новый запрос, который WdfUsbTargetPipeReadSynchronous отправляется в целевой объект ввода-вывода, был удален, повторно использован или переформатирован. (WdfUsbTargetPipeReadSynchronous увеличивает число ссылок объекта памяти. Удаление, повторное использование или переформатирование объекта запроса уменьшает количество ссылок объекта памяти.)

    • Предоставление MDL

      Драйверы могут получить MDL, связанный с полученным запросом ввода-вывода, вызвав WdfRequestRetrieveOutputWdmMdl.

Платформа задает флаг USBD_SHORT_TRANSFER_OK во внутреннем URB. Если установить этот флаг, последний пакет передачи данных будет меньше максимального размера пакета.

Драйвер не может вызывать WdfUsbTargetPipeReadSynchronous, если он настроил непрерывного чтения для канала.

Сведения о получении сведений о состоянии после завершения запроса ввода-вывода см. в получения сведений о завершении.

Дополнительные сведения о методе WdfUsbTargetPipeReadSynchronous и целевых объектах ввода-вывода USB см. в целевых объектов USB-ввода-вывода.

Примеры

Следующий пример кода создает объект памяти платформы, инициализирует структуру WDF_MEMORY_DESCRIPTOR и передает структуру в WdfUsbTargetPipeReadSynchronous. В этом примере указывается null для дескриптора объекта запроса, поэтому платформа создаст новый объект запроса для целевого объекта ввода-вывода.

WDFMEMORY  wdfMemory;
WDF_MEMORY_DESCRIPTOR  readBufDesc;
ULONG  BytesRead;

status = WdfMemoryCreate(
                         WDF_NO_OBJECT_ATTRIBUTES,
                         NonPagedPool,
                         0,
                         readSize,
                         &wdfMemory,
                         NULL
                         );
if (!NT_SUCCESS(status)){
    return ;
}

buffer = WdfMemoryGetBuffer(
                            wdfMemory,
                            NULL
                            );

WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(
                                  &readBufDesc,
                                  buffer,
                                  readSize
                                  );

status = WdfUsbTargetPipeReadSynchronously(
                                           Pipe,
                                           NULL,
                                           NULL,
                                           &readBufDesc,
                                           &BytesRead
                                           );

Требования

Требование Ценность
целевая платформа Всеобщий
минимальная версия KMDF 1.0
минимальная версия UMDF 2.0
заголовка wdfusb.h (include Wdfusb.h)
библиотеки Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL PASSIVE_LEVEL
правил соответствия DDI DriverCreate(kmdf), InternalIoctlReqs(kmdf), IoctlReqs(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdfdf), KmdfIrqlExplicit(kmdf), SyncReqSend(kmdf), UsbKmdfIrql(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf), WriteReqs(kmdf)

См. также

WDF_MEMORY_DESCRIPTOR_INIT_BUFFER

WdfMemoryCreate

WdfUsbTargetPipeGetInformation