Função WdfUsbTargetDeviceCreateIsochUrb (wdfusb.h)
[Aplica-se somente ao KMDF]
O método WdfUsbTargetDeviceCreateIsochUrb aloca um URB (bloco de solicitação USB isocrono).
Sintaxe
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
Um identificador para um objeto de dispositivo USB obtido de uma chamada anterior para WdfUsbTargetDeviceCreateWithParameters.
[in, optional] Attributes
Um ponteiro para uma estrutura de WDF_OBJECT_ATTRIBUTES fornecida pelo chamador que contém atributos para o novo objeto de memória. Se o driver fornecer esse parâmetro, o membro ParentObject da estrutura deverá ser um objeto de dispositivo USB (WDFUSBDEVICE) ou um objeto de solicitação (WDFREQUEST) criado pela estrutura ou qualquer objeto cuja cadeia de pais leve a um desses tipos. Esse parâmetro é opcional e pode ser WDF_NO_OBJECT_ATTRIBUTES.
[in] NumberOfIsochPackets
Especifica o número de pacotes isocronos para os quais o sistema aloca memória na URB.
[out] UrbMemory
Um ponteiro para um local do tipo WDFMEMORY que recebe um identificador para um objeto de memória da estrutura.
[out, optional] Urb
Um ponteiro para uma estrutura URB que recebe o endereço da nova URB isocrona. A estrutura inicializa o conteúdo da estrutura URB como zero. Esse parâmetro é opcional e pode ser NULL.
Valor de retorno
WdfUsbTargetDeviceCreateIsochUrb retornará STATUS_SUCCESS se a operação for bem-sucedida. Caso contrário, esse método poderá retornar um dos seguintes valores:
Código de retorno | Descrição |
---|---|
|
Um parâmetro inválido foi detectado. |
|
O driver não especificou uma versão do contrato do cliente quando chamou WDF_USB_DEVICE_CREATE_CONFIG_INIT. |
|
Memória insuficiente estava disponível. |
Esse método também pode retornar outros valores NTSTATUS .
Observações
Antes de chamar WdfUsbTargetDeviceCreateIsochUrb, um driver deve chamar WdfUsbTargetDeviceCreateWithParameters. Se bem-sucedido, WdfUsbTargetDeviceCreateIsochUrb retorna um identificador para um objeto de memória de estrutura que descreve o URB isocrono recém-alocado.
Um driver pode chamar WdfUsbTargetDeviceCreateIsochUrb para alocar uma estrutura URB antes de chamar WdfUsbTargetDeviceFormatRequestForUrb.
Normalmente, um driver chama WdfUsbTargetDeviceCreateIsochUrb de dentro de um manipulador de solicitação .
O objeto de memória e seu buffer são excluídos quando o objeto pai é excluído. Um driver também pode excluir um objeto de memória e seu buffer chamando WdfObjectDelete.
Para obter informações relacionadas, consulte a seção Comentários do WdfUsbTargetDeviceCreateUrb.
Exemplos
O exemplo de código a seguir baseia-se na rotina PerformIsochTransfer no driver de exemplo Isorwr. O exemplo chama WdfUsbTargetDeviceCreateIsochUrb para alocar um bloco de solicitação USB isócrono. O exemplo determina o número de bytes necessários para manter a solicitação de transferência isocrona e configura manualmente o cabeçalho URB e os pacotes isocronos na URB. Neste ponto, o driver pode chamar WdfUsbTargetPipeFormatRequestForUrb, conforme mostrado no exemplo em 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;
}