Compartir a través de


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
STATUS_INVALID_PARAMETER
Se ha detectado un parámetro no válido.
STATUS_INVALID_DEVICE_STATE
El controlador no especificó una versión del contrato de cliente cuando llamó a WDF_USB_DEVICE_CREATE_CONFIG_INIT.
STATUS_INSUFFICIENT_RESOURCES
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)

Consulte también

WdfUsbTargetDeviceCreateUrb

WdfUsbTargetDeviceCreateWithParameters