функция 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 |