функция USBD_UrbAllocate (usbdlib.h)
Подпрограмма USBD_UrbAllocate выделяет блок USB-запросов (URB).
Синтаксис
NTSTATUS USBD_UrbAllocate(
[in] USBD_HANDLE USBDHandle,
[out] PURB *Urb
);
Параметры
[in] USBDHandle
UsbD-дескриптор, полученный драйвером клиента в предыдущем вызове подпрограммы USBD_CreateHandle.
[out] Urb
Указатель на только что выделенную структуру URB. Все члены структуры равны нулю. Драйвер клиента должен освободить URB после завершения использования драйвера, вызвав USBD_UrbFree.
Возвращаемое значение
Подпрограмма USBD_UrbAllocate возвращает STATUS_SUCCESS, если запрос выполнен успешно. В противном случае USBD_UrbAllocate задает Urb значение NULL и возвращает код сбоя.
Возможные значения включают, но не ограничиваются STATUS_INVALID_PARAMETER, которые указывают, что вызывающий объект, переданный в null, USBDHandle или Urb.
Замечания
Подпрограмма USBD_UrbAllocate позволяет базовому стеку USB-драйверов выделить непрозрачный контекст URB для URB. Используя контекст URB, стек USB-драйверов может обрабатывать запросы более эффективно и надежно. Эти оптимизации обеспечиваются стеком драйверов USB 3.0, включенным в Windows 8. Клиентский драйвер не может получить доступ к контексту URB; Контекст используется внутренне водителем шины.
Независимо от версии USB-протокола контроллера узла, базового стека USB-драйвера, целевой операционной системы драйвер клиента должен всегда вызывать USBD_UrbAllocate, чтобы выделить структуру URB. USBD_UrbAllocate заменяет более ранние механизмы выделения, такие как ExAllocatePoolWithTagили выделение их в стеке.
Драйвер клиента должен не использовать USBD_UrbAllocate.
- Чтобы выделить URB с переменной длиной, например URB для передачи изохронной передачи. Вместо этого драйвер клиента должен вызывать USBD_IsochUrbAllocate.
- Если целевая операционная система — Windows XP с пакетом обновления 2 (SP2) или более ранней версией Windows.
Чтобы освободить URB, выделенный USBD_UrbAllocate, необходимо вызвать USBD_UrbFree.
Примеры
В следующем примере кода показано, как выделить, отправить и освободить URB. Пример отправляет URB синхронно. Сведения о реализации функции SubmitUrbSync см. в разделе "Пример" в разделе ОтправкаURB.
NTSTATUS CreateandSubmitURBSynchronously (
_In_ USBD_HANDLE USBDHandle
{
PURB Urb = NULL;
NTSTATUS status;
status = USBD_UrbAllocate(USBDHandle, &Urb);
if (!NT_SUCCESS(status))
{
goto CreateandSubmitURBExit;
}
//Format the URB for the request. Not Shown.
status = BuildURBForBulkTransfer (Urb);
if (!NT_SUCCESS(status))
{
goto CreateandSubmitURBExit;
}
status = SubmitUrbSync( TargetDeviceObject,
Urb)
if (!NT_SUCCESS(status))
{
goto CreateandSubmitURBExit;
}
CreateandSubmitURBExit:
if (Urb)
{
USBD_UrbFree( USBDHandle, Urb);
}
return status;
}
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Требуется WDK для Windows 8. Предназначено для Windows Vista и более поздних версий операционной системы Windows. |
целевая платформа | Настольный |
заголовка | usbdlib.h |
библиотеки | Usbdex.lib |
IRQL | DISPATCH_LEVEL |