Condividi tramite


Funzione WdfUsbTargetDeviceSendUrbSynchronously (wdfusb.h)

[Si applica solo a KMDF]

Il metodo WdfUsbTargetDeviceSendUrbSynchronously invia una richiesta USB in modo sincrono a un dispositivo USB specificato, usando i parametri di richiesta descritti da un .

Sintassi

NTSTATUS WdfUsbTargetDeviceSendUrbSynchronously(
  [in]           WDFUSBDEVICE              UsbDevice,
  [in, optional] WDFREQUEST                Request,
  [in, optional] PWDF_REQUEST_SEND_OPTIONS RequestOptions,
  [in]           PURB                      Urb
);

Parametri

[in] UsbDevice

Handle per un oggetto dispositivo USB ottenuto da una chiamata precedente a WdfUsbTargetDeviceCreateWithParameters.

[in, optional] Request

Handle per un oggetto richiesta framework. Questo parametro è facoltativo e può essere NULL. Per altre informazioni, vedere la sezione Osservazioni seguente.

[in, optional] RequestOptions

Puntatore a una struttura WDF_REQUEST_SEND_OPTIONS allocata dal chiamante che specifica le opzioni per la richiesta. Questo puntatore è facoltativo e può essere NULL. Per altre informazioni, vedere la sezione Osservazioni seguente.

[in] Urb

Puntatore a una struttura di inizializzata dal chiamante.

Se il driver precedentemente chiamato WdfUsbTargetDeviceCreateWithParameters per creare UsbDevice, il driver deve usare WdfUsbTargetDeviceCreateUrb o WdfUsbTargetDeviceCreateIsochUrb per creare questo comando.

Valore restituito

WdfUsbTargetDeviceSendUrbSynchronously restituisce il valore di stato di completamento della destinazione I/O se l'operazione ha esito positivo. In caso contrario, questo metodo può restituire uno dei valori seguenti:

Codice restituito Descrizione
STATUS_INVALID_PARAMETER
È stato rilevato un parametro non valido.
STATUS_INVALID_DEVICE_REQUEST
IRQL del chiamante non valido.
STATUS_INSUFFICIENT_RESOURCES
Memoria insufficiente disponibile.
STATUS_IO_TIMEOUT
Il driver ha fornito un valore di timeout e la richiesta non è stata completata entro il tempo assegnato.
 

Questo metodo potrebbe anche restituire altri valori NTSTATUS .

Se il driver fornisce un handle di oggetto non valido, si verifica un controllo di bug.

Osservazioni

Usare il metodo WdfUsbTargetDeviceSendUrbSynchronously per inviare in modo sincrono una richiesta di trasferimento del controllo USB. Per inviare tali richieste in modo asincrono, usare WdfUsbTargetDeviceFormatRequestForUrb, seguito da WdfRequestSend.

Il metodo WdfUsbTargetDeviceSendUrbSynchronously non restituisce fino al completamento della richiesta, a meno che il driver non fornisca un valore di timeout nella struttura WDF_REQUEST_SEND_OPTIONS del parametro RequestOptions o a meno che non venga rilevato un errore.

È possibile inoltrare una richiesta di I/O ricevuta dal driver in una coda di I/O oppure creare e inviare una nuova richiesta.

Per inoltrare una richiesta di I/O ricevuta dal driver in una coda di I/O, specificare l'handle della richiesta ricevuta per il parametro WdfUsbTargetDeviceSendUrbSynchronously metodo Request.

Per creare e inviare una nuova richiesta, specificare un handle di richiesta NULL per il parametro request oppure creare un nuovo oggetto richiesta e specificarne l'handle:

  • Se si specifica un handle di richiesta NULL , il framework usa un oggetto richiesta interno. Questa tecnica è semplice da usare, ma il driver non può annullare la richiesta.
  • Se si chiama WdfRequestCreate per creare uno o più oggetti richiesta, è possibile riutilizzare questi oggetti richiesta chiamando WdfRequestReuse. Questa tecnica consente al driver di EvtDriverDeviceAdd funzione di callback per preallocare gli oggetti richiesta per un dispositivo. Inoltre, un altro thread del driver può chiamare WdfRequestCancelSentRequest per annullare la richiesta, se necessario.
Il driver può specificare un parametro nullNULLnull, indipendentemente dal fatto che il driver fornisca un NULL nono un parametro RequestNULL . È ad esempio possibile usare il parametro RequestOptions per specificare un valore di timeout.

Per informazioni su come ottenere informazioni sullo stato dopo il completamento di una richiesta di I/O, vedere ottenere informazioni di completamento.

Per altre informazioni sul metodo WdfUsbTargetDeviceSendUrbSynchronously e sulle destinazioni di I/O USB, vedere Destinazioni I/O USB.

Esempi

Nell'esempio di codice seguente viene inizializzata una struttura RPC e viene chiamato WdfUsbTargetDeviceSendUrbSynchronously.

URB Urb;
NTSTATUS status;

Urb.UrbHeader.Function =  URB_FUNCTION_GET_CONFIGURATION;
Urb.UrbHeader.Length = sizeof(struct _URB_CONTROL_GET_CONFIGURATION_REQUEST);
Urb.UrbControlGetConfigurationRequest.TransferBufferLength = 1 ; // Must be 1
Urb.UrbControlGetConfigurationRequest.TransferBufferMDL = NULL;
Urb.UrbControlGetConfigurationRequest.TransferBuffer = outBuffer;
Urb.UrbControlGetConfigurationRequest.UrbLink = NULL;

status = WdfUsbTargetDeviceSendUrbSynchronously(
                                                UsbDevice,
                                                NULL,
                                                NULL,
                                                &Urb
                                                );

Fabbisogno

Requisito Valore
piattaforma di destinazione Universale
versione minima di KMDF 1.0
intestazione wdfusb.h (include Wdfusb.h)
libreria Wdf01000.sys (vedere Controllo delle versioni della libreria framework).
IRQL PASSIVE_LEVEL
regole di conformità DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), SyncReqSend(kmdf), UsbKmdfIrql(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf)

Vedere anche

EvtDriverDeviceAdd

WDF_REQUEST_SEND_OPTIONS

WdfRequestCancelSentRequest

WdfRequestCreare

WdfRequestReuse

WdfRequestSend

WdfUsbTargetDeviceFormatRequestForUrb