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 |
---|---|
|
È stato rilevato un parametro non valido. |
|
Il driver non ha specificato una versione del contratto client quando ha chiamato WDF_USB_DEVICE_CREATE_CONFIG_INIT. |
|
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) |