Condividi tramite


Funzione WdfUsbTargetDeviceCreateIsochUrb (wdfusb.h)

[Si applica solo a KMDF]

Il metodo WdfUsbTargetDeviceCreateIsochUrb alloca un blocco di richieste USB isochronous (BLOCK).

Sintassi

NTSTATUS WdfUsbTargetDeviceCreateIsochUrb(
  [in]            WDFUSBDEVICE           UsbDevice,
  [in, optional]  PWDF_OBJECT_ATTRIBUTES Attributes,
  [in]            ULONG                  NumberOfIsochPackets,
  [out]           WDFMEMORY              *UrbMemory,
  [out, optional] PURB                   *Urb
);

Parametri

[in] UsbDevice

Handle per un oggetto dispositivo USB ottenuto da una chiamata precedente a WdfUsbTargetDeviceCreateWithParameters.

[in, optional] Attributes

Puntatore a una struttura di WDF_OBJECT_ATTRIBUTES fornita dal chiamante che contiene attributi per il nuovo oggetto memoria. Se il driver fornisce questo parametro, il membro ParentObject della struttura deve essere un oggetto dispositivo USB (WDFUSBDEVICE) o un oggetto request (WDFREQUEST) creato dal framework o qualsiasi oggetto la cui catena di elementi padre porta a uno di questi tipi. Questo parametro è facoltativo e può essere WDF_NO_OBJECT_ATTRIBUTES.

[in] NumberOfIsochPackets

Specifica il numero di pacchetti isocroni per i quali il sistema alloca la memoria nell'oggetto ROUTE.

[out] UrbMemory

Puntatore a una posizione tipizzata WDFMEMORY che riceve un handle per un oggetto memoria del framework.

[out, optional] Urb

Puntatore a unastrutturaae che che riceve l'indirizzo del nuovo isocrono). Il framework inizializza il contenuto della struttura DELL'OGGETTO su zero. Questo parametro è facoltativo e può essere NULL.

Valore restituito

WdfUsbTargetDeviceCreateIsochUrb restituisce STATUS_SUCCESS se l'operazione ha esito positivo. In caso contrario, questo metodo può restituire uno dei valori seguenti:

Codice restituito Descrizione
STATUS_INVALID_PARAMETER
È stato rilevato un parametro non valido.
STATUS_INVALID_DEVICE_STATE
Il driver non ha specificato una versione del contratto client quando ha chiamato WDF_USB_DEVICE_CREATE_CONFIG_INIT.
STATUS_INSUFFICIENT_RESOURCES
Memoria insufficiente disponibile.
 

Questo metodo potrebbe anche restituire altri valori NTSTATUS.

Commenti

Prima di chiamare WdfUsbTargetDeviceCreateIsochUrb, un driver deve chiamare WdfUsbTargetDeviceCreateWithParameters. In caso di esito positivo, WdfUsbTargetDeviceCreateIsochUrb restituisce un handle a un oggetto memoria framework che descrive l'isocrona appena allocata.

Un driver può chiamare WdfUsbTargetDeviceCreateIsochUrb per allocare unastrutturaae prima di chiamare WdfUsbTargetDeviceFormatRequestForUrb.

In genere, un driver chiama WdfUsbTargetDeviceCreateIsochUrb dall'interno di un gestore di richieste.

L'oggetto memory e il relativo buffer vengono eliminati quando l'oggetto padre viene eliminato. Un driver può anche eliminare un oggetto memoria e il relativo buffer chiamando WdfObjectDelete.

Per informazioni correlate, vedere la sezione Osservazioni di WdfUsbTargetDeviceCreateUrb.

Esempio

L'esempio di codice seguente si basa sulla routine PerformIsochTransfer nel driver di esempio Isorwr. L'esempio chiama WdfUsbTargetDeviceCreateIsochUrb per allocare un blocco di richieste USB isochronous. Nell'esempio viene determinato il numero di byte necessari per contenere la richiesta di trasferimento isocrona e quindi viene configurata manualmente l'intestazione DHCP e i pacchetti isocroni nell'OGGETTO). A questo punto, il driver può chiamare WdfUsbTargetPipeFormatRequestForUrb, come illustrato nell'esempio in 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;
}


Requisiti

Requisito Valore
Client minimo supportato Windows Vista
Piattaforma di destinazione Universale
Versione KMDF minima 1.11
Intestazione wdfusb.h (include Wdfusb.h)
Libreria Wdf01000.sys (vedere Controllo delle versioni della libreria framework).
IRQL <=DISPATCH_LEVEL
Regole di conformità DDI DriverCreate(kmdf)

Vedi anche

WdfUsbTargetDeviceCreateUrb

WdfUsbTargetDeviceCreateWithParameters