Función WdfUsbTargetDeviceCreateIsochUrb (wdfusb.h)
[Solo se aplica a KMDF]
El método WdfUsbTargetDeviceCreateIsochUrb asigna un bloque de solicitud USB (URB) isochronous.
Sintaxis
NTSTATUS WdfUsbTargetDeviceCreateIsochUrb(
[in] WDFUSBDEVICE UsbDevice,
[in, optional] PWDF_OBJECT_ATTRIBUTES Attributes,
[in] ULONG NumberOfIsochPackets,
[out] WDFMEMORY *UrbMemory,
[out, optional] PURB *Urb
);
Parámetros
[in] UsbDevice
Identificador de un objeto de dispositivo USB obtenido de una llamada anterior a WdfUsbTargetDeviceCreateWithParameters.
[in, optional] Attributes
Puntero a una estructura de WDF_OBJECT_ATTRIBUTES proporcionada por el autor de la llamada que contiene atributos para el nuevo objeto de memoria. Si el controlador proporciona este parámetro, el miembro ParentObject de la estructura debe ser un objeto de dispositivo USB (WDFUSBDEVICE) o un objeto de solicitud (WDFREQUEST) creado por el marco, o cualquier objeto cuya cadena de elementos primarios conduce a uno de estos tipos. Este parámetro es opcional y puede ser WDF_NO_OBJECT_ATTRIBUTES.
[in] NumberOfIsochPackets
Especifica el número de paquetes isócronos para los que el sistema asigna memoria en el URB.
[out] UrbMemory
Puntero a una ubicación con tipo WDFMEMORY que recibe un identificador de un objeto de memoria de marco.
[out, optional] Urb
Puntero a una estructura URB que recibe la dirección del nuevo URB isócrono. El marco inicializa el contenido de la estructura URB en cero. Este parámetro es opcional y puede ser NULL.
Valor devuelto
WdfUsbTargetDeviceCreateIsochUrb devuelve STATUS_SUCCESS si la operación se realiza correctamente. De lo contrario, este método puede devolver uno de los valores siguientes:
Código devuelto | Descripción |
---|---|
|
Se ha detectado un parámetro no válido. |
|
El controlador no especificó una versión del contrato de cliente cuando llamó a WDF_USB_DEVICE_CREATE_CONFIG_INIT. |
|
No había suficiente memoria disponible. |
Este método también podría devolver otros valores NTSTATUS.
Comentarios
Antes de llamar a WdfUsbTargetDeviceCreateIsochUrb, un controlador debe llamar a WdfUsbTargetDeviceCreateWithParameters. Si se ejecuta correctamente, WdfUsbTargetDeviceCreateIsochUrb devuelve un identificador a un objeto de memoria de marco que describe el URB isócrono recién asignado.
Un controlador puede llamar a WdfUsbTargetDeviceCreateIsochUrb para asignar una estructura URB antes de llamar a WdfUsbTargetDeviceFormatRequestForUrb.
Normalmente, un controlador llama a WdfUsbTargetDeviceCreateIsochUrb desde un controlador de solicitudes.
El objeto de memoria y su búfer se eliminan cuando se elimina el objeto primario. Un controlador también puede eliminar un objeto de memoria y su búfer llamando a WdfObjectDelete.
Para obtener información relacionada, vea la sección Comentarios de WdfUsbTargetDeviceCreateUrb.
Ejemplos
El siguiente ejemplo de código se basa en la rutina PerformIsochTransfer del controlador de ejemplo Isorwr. En el ejemplo se llama a WdfUsbTargetDeviceCreateIsochUrb para asignar un bloque de solicitud USB isochronous. En el ejemplo se determina el número de bytes necesarios para contener la solicitud de transferencia isócrónica y, a continuación, se configura manualmente el encabezado URB y los paquetes isócronos en el URB. En este momento, el controlador puede llamar a WdfUsbTargetPipeFormatRequestForUrb, como se muestra en el ejemplo de WdfUsbTargetDeviceCreateUrb.
USBD_PIPE_HANDLE usbdPipeHandle;
ULONG numPackets = UserBufferLength/TransferSizePerFrame;
ULONG urbSize;
PURB urb;
WDFMEMORY memory;
WDF_OBJECT_ATTRIBUTES_INIT(&objectAttribs);
objectAttribs.ParentObject = UsbDevice;
status = WdfUsbTargetDeviceCreateIsochUrb(
pDevContext->WdfUsbTargetDevice,
&objectAttribs,
0,
numPackets,
&memory,
NULL
);
urb = WdfMemoryGetBuffer(urbMemory, &urbSize);
urbSize = GET_ISO_URB_SIZE(numPackets);
usbdPipeHandle = WdfUsbTargetPipeWdmGetPipeHandle(pipe);
urb->UrbIsochronousTransfer.Hdr.Length = GET_ISO_URB_SIZE(numPackets);
urb->UrbIsochronousTransfer.Hdr.Function = URB_FUNCTION_ISOCH_TRANSFER;
urb->UrbIsochronousTransfer.PipeHandle = usbdPipeHandle;
for (packetId = 0; packetId < numberOfPackets; packetId++) {
Urb-> UrbIsochronousTransfer.IsoPacket[packetId].Offset = xxx;
Urb-> UrbIsochronousTransfer.IsoPacket[packetId].YYY = yyy;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows Vista |
Plataforma de destino | Universal |
Versión mínima de KMDF | 1.11 |
Encabezado | wdfusb.h (incluya Wdfusb.h) |
Library | Wdf01000.sys (consulte Control de versiones de la biblioteca de marcos). |
IRQL | <=DISPATCH_LEVEL |
Reglas de cumplimiento de DDI | DriverCreate(kmdf) |