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 |
---|---|
|
Ein ungültiger Parameter wurde erkannt. |
|
Der Treiber hat keine Clientvertragsversion angegeben, als er WDF_USB_DEVICE_CREATE_CONFIG_INIT aufgerufen hat. |
|
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) |