Compartilhar via


Função WdfUsbTargetDeviceCreateIsochUrb (wdfusb.h)

[Aplica-se somente ao KMDF]

O método WdfUsbTargetDeviceCreateIsochUrb aloca um URB (bloco de solicitação USB isócrono).

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 que foi 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 de estrutura.

[out, optional] Urb

Um ponteiro para uma estrutura URB que recebe o endereço do novo URB isocrono. A estrutura inicializa o conteúdo da estrutura URB como zero. Esse parâmetro é opcional e pode ser NULL.

Retornar valor

WdfUsbTargetDeviceCreateIsochUrb retornará STATUS_SUCCESS se a operação for bem-sucedida. Caso contrário, esse método pode retornar um dos seguintes valores:

Código de retorno Descrição
STATUS_INVALID_PARAMETER
Um parâmetro inválido foi detectado.
STATUS_INVALID_DEVICE_STATE
O driver não especificou uma versão de contrato de cliente quando chamou WDF_USB_DEVICE_CREATE_CONFIG_INIT.
STATUS_INSUFFICIENT_RESOURCES
Memória insuficiente disponível.
 

Esse método também pode retornar outros valores NTSTATUS.

Comentários

Antes de chamar WdfUsbTargetDeviceCreateIsochUrb, um driver deve chamar WdfUsbTargetDeviceCreateWithParameters. Se tiver êxito, WdfUsbTargetDeviceCreateIsochUrb retornará 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 de 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ócrona. O exemplo determina o número de bytes necessários para manter a solicitação de transferência isócrona e configura manualmente o cabeçalho URB e os pacotes isócronos no 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;
}


Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista
Plataforma de Destino Universal
Versão mínima do KMDF 1.11
Cabeçalho wdfusb.h (inclua Wdfusb.h)
Biblioteca Wdf01000.sys (consulte Controle de versão da biblioteca de estrutura.)
IRQL <=DISPATCH_LEVEL
Regras de conformidade de DDI DriverCreate(kmdf)

Confira também

WdfUsbTargetDeviceCreateUrb

WdfUsbTargetDeviceCreateWithParameters