Freigeben über


WdfUsbTargetDeviceCreateIsochUrb-Funktion (wdfusb.h)

[Gilt nur für KMDF]

Die WdfUsbTargetDeviceCreateIsochUrb-Methode weist einen isochronen USB-Anforderungsblock (URB) zu.

Syntax

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

Parameter

[in] UsbDevice

Ein Handle für ein USB-Geräteobjekt, das aus einem vorherigen Aufruf von WdfUsbTargetDeviceCreateWithParameters abgerufen wurde.

[in, optional] Attributes

Ein Zeiger auf eine vom Aufrufer bereitgestellte WDF_OBJECT_ATTRIBUTES-Struktur , die Attribute für das neue Speicherobjekt enthält. Wenn der Treiber diesen Parameter bereitstellt, muss das ParentObject-Element der Struktur ein USB-Geräteobjekt (WDFUSBDEVICE) oder ein vom Framework erstelltes Anforderungsobjekt (WDFREQUEST) oder ein Objekt sein, dessen Kette von übergeordneten Elementen zu einem dieser Typen führt. Dieser Parameter ist optional und kann WDF_NO_OBJECT_ATTRIBUTES werden.

[in] NumberOfIsochPackets

Gibt die Anzahl der isochronen Pakete an, für die das System Arbeitsspeicher in der URB zuordnet.

[out] UrbMemory

Ein Zeiger auf einen WDFMEMORY-typisierten Speicherort, der ein Handle für ein Frameworkspeicherobjekt empfängt.

[out, optional] Urb

Ein Zeiger auf eine URB-Struktur, die die Adresse der neuen isochronen URB empfängt. Das Framework initialisiert den Inhalt der URB-Struktur auf Null. Dieser Parameter ist optional und kann NULL sein.

Rückgabewert

WdfUsbTargetDeviceCreateIsochUrb gibt STATUS_SUCCESS zurück, wenn der Vorgang erfolgreich ist. Andernfalls kann diese Methode einen der folgenden Werte zurückgeben:

Rückgabecode Beschreibung
STATUS_INVALID_PARAMETER
Ein ungültiger Parameter wurde erkannt.
STATUS_INVALID_DEVICE_STATE
Der Treiber hat keine Clientvertragsversion angegeben, als er WDF_USB_DEVICE_CREATE_CONFIG_INIT aufgerufen hat.
STATUS_INSUFFICIENT_RESOURCES
Es war nicht genügend Arbeitsspeicher verfügbar.
 

Diese Methode kann auch andere NTSTATUS-Werte zurückgeben.

Hinweise

Vor dem Aufrufen von WdfUsbTargetDeviceCreateIsochUrb muss ein Treiber WdfUsbTargetDeviceCreateWithParameters aufrufen. Bei erfolgreicher Ausführung gibt WdfUsbTargetDeviceCreateIsochUrb ein Handle an ein Frameworkspeicherobjekt zurück, das den neu zugeordneten isochronen URB beschreibt.

Ein Treiber kann WdfUsbTargetDeviceCreateIsochUrb aufrufen, um eine URB-Struktur zuzuordnen, bevor WdfUsbTargetDeviceFormatRequestForUrb aufgerufen wird.

In der Regel ruft ein Treiber WdfUsbTargetDeviceCreateIsochUrb aus einem Anforderungshandler auf.

Das Speicherobjekt und sein Puffer werden gelöscht, wenn das übergeordnete Objekt gelöscht wird. Ein Treiber kann auch ein Speicherobjekt und seinen Puffer löschen, indem er WdfObjectDelete aufruft.

Weitere Informationen finden Sie im Abschnitt "Hinweise" von WdfUsbTargetDeviceCreateUrb.

Beispiele

Das folgende Codebeispiel basiert auf der PerformIsochTransfer-Routine im Isorwr-Beispieltreiber. Im Beispiel wird WdfUsbTargetDeviceCreateIsochUrb aufgerufen, um einen isochronen USB-Anforderungsblock zuzuordnen. Im Beispiel wird die Anzahl der Bytes bestimmt, die zum Aufnehmen der isochronen Übertragungsanforderung erforderlich sind, und anschließend werden der URB-Header und die isochronen Pakete in der URB manuell konfiguriert. An diesem Punkt kann der Treiber WdfUsbTargetPipeFormatRequestForUrb aufrufen, wie im Beispiel in WdfUsbTargetDeviceCreateUrb gezeigt.


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;
}


Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Vista
Zielplattform Universell
KMDF-Mindestversion 1.11
Kopfzeile wdfusb.h (wdfusb.h einschließen)
Bibliothek Wdf01000.sys (siehe Versionsverwaltung der Frameworkbibliothek).)
IRQL <=DISPATCH_LEVEL
DDI-Complianceregeln DriverCreate(kmdf)

Weitere Informationen

WdfUsbTargetDeviceCreateUrb

WdfUsbTargetDeviceCreateWithParameters