Compartilhar via


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
STATUS_INVALID_PARAMETER
Um parâmetro inválido foi detectado.
STATUS_INVALID_DEVICE_STATE
O driver não especificou uma versão do contrato do cliente quando chamou WDF_USB_DEVICE_CREATE_CONFIG_INIT.
STATUS_INSUFFICIENT_RESOURCES
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;
}


Requisitos

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

Consulte também

WdfUsbTargetDeviceCreateUrb

WdfUsbTargetDeviceCreateWithParameters