Partager via


Méthode IWDFUsbTargetDevice ::FormatRequestForControlTransfer (wudfusb.h)

[Avertissement : UMDF 2 est la dernière version d’UMDF et remplace UMDF 1. Tous les nouveaux pilotes UMDF doivent être écrits à l’aide d’UMDF 2. Aucune nouvelle fonctionnalité n’est ajoutée à UMDF 1 et la prise en charge d’UMDF 1 est limitée sur les versions plus récentes de Windows 10. Les pilotes Windows universels doivent utiliser UMDF 2. Pour plus d’informations, consultez Prise en main avec UMDF.]

La méthode FormatRequestForControlTransfer met en forme un objet de requête d’E/S pour un transfert de contrôle USB.

Syntaxe

HRESULT FormatRequestForControlTransfer(
  [in]           IWDFIoRequest        *pRequest,
  [in]           PWINUSB_SETUP_PACKET SetupPacket,
  [in, optional] IWDFMemory           *pMemory,
  [in, optional] PWDFMEMORY_OFFSET    TransferOffset
);

Paramètres

[in] pRequest

Pointeur vers l’interface IWDFIoRequest pour l’objet de requête à mettre en forme.

[in] SetupPacket

Pointeur vers un WINUSB_SETUP_PACKET pour le transfert de contrôle.

[in, optional] pMemory

Pointeur vers l’interface IWDFMemory utilisée pour accéder à la mémoire tampon utilisée pour le transfert de contrôle. Ce paramètre est facultatif.

[in, optional] TransferOffset

Pointeur vers une structure WDFMEMORY_OFFSET qui décrit le décalage de mémoire utilisé pour le transfert de contrôle. Ce paramètre est facultatif.

Valeur renvoyée

FormatRequestForControlTransfer retourne l’une des valeurs suivantes :

Code de retour Description
S_OK

FormatRequestForControlTransfer a correctement mis en forme un objet de requête d’E/S.

E_OUTOFMEMORY

FormatRequestForControlTransfer a rencontré un échec d’allocation.

E_INVALIDARG
Décalage de mémoire spécifié par le paramètre TransferOffset n’est pas valide.

Remarques

Après qu’un pilote UMDF a appelé FormatRequestForControlTransfer pour mettre en forme une demande d’E/S pour une opération de transfert de contrôle, l’infrastructure peut ensuite envoyer la demande à la cible d’E/S.

Exemples

L’exemple de code suivant est tiré de l’exemple de wdf_osrfx2_lab dans le WDK.

    WINUSB_CONTROL_SETUP_PACKET setupPacket;

    ULONG bytesTransferred;

    HRESULT hr = S_OK;

    //
    // Setup the control packet.
    //

    WINUSB_CONTROL_SETUP_PACKET_INIT( &setupPacket,
                                      BmRequestHostToDevice,
                                      BmRequestToDevice,
                                      USBFX2LK_SET_BARGRAPH_DISPLAY,
                                      0,
                                      0 );

    //
    // Issue the request to WinUsb.
    //

    hr = SendControlTransferSynchronously(
                &(setupPacket.WinUsb),
                (PUCHAR) BarGraphState,
                sizeof(BAR_GRAPH_STATE),
                &bytesTransferred
                );
...

HRESULT
CMyDevice::SendControlTransferSynchronously(
    _In_ PWINUSB_SETUP_PACKET SetupPacket,
    _Inout_updates_(BufferLength) PBYTE Buffer,
    _In_ ULONG BufferLength,
    _Out_ PULONG LengthTransferred
    )
{
    HRESULT hr = S_OK;
    IWDFIoRequest *pWdfRequest = NULL;
    IWDFDriver * FxDriver = NULL;
    IWDFMemory * FxMemory = NULL; 
    IWDFRequestCompletionParams * FxComplParams = NULL;
    IWDFUsbRequestCompletionParams * FxUsbComplParams = NULL;

    *LengthTransferred = 0;
    
    hr = m_FxDevice->CreateRequest( NULL, //pCallbackInterface
                                    NULL, //pParentObject
                                    &pWdfRequest);

    if (SUCCEEDED(hr))
    {
        m_FxDevice->GetDriver(&FxDriver);

        hr = FxDriver->CreatePreallocatedWdfMemory( Buffer,
                                                    BufferLength,
                                                    NULL, //pCallbackInterface
                                                    pWdfRequest, //pParetObject
                                                    &FxMemory );
    }

    if (SUCCEEDED(hr))
    {
        hr = m_pIUsbTargetDevice->FormatRequestForControlTransfer( pWdfRequest,
                                                                   SetupPacket,
                                                                   FxMemory,
                                                                   NULL); //TransferOffset
    }                                                          
      

Configuration requise

Condition requise Valeur
Fin de la prise en charge Non disponible dans UMDF 2.0 et versions ultérieures.
Plateforme cible Desktop (Expérience utilisateur)
Version UMDF minimale 1.5
En-tête wudfusb.h (inclure Wudfusb.h)
DLL WUDFx.dll

Voir aussi

IWDFIoRequest

IWDFMemory

IWDFUsbTargetDevice

WDFMEMORY_OFFSET