IWDFUsbTargetDevice::FormatRequestForControlTransfer 方法 (wudfusb.h)

[警告: UMDF 2 是最新版本的 UMDF,并取代 UMDF 1。 所有新的 UMDF 驱动程序都应使用 UMDF 2 编写。 不会向 UMDF 1 添加任何新功能,并且较新版本的 Windows 10 上对 UMDF 1 的支持有限。 通用 Windows 驱动程序必须使用 UMDF 2。 有关详细信息,请参阅使用 UMDF 入门。]

FormatRequestForControlTransfer 方法为 USB 控制传输设置 I/O 请求对象的格式。

语法

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

参数

[in] pRequest

指向要设置格式的请求对象的 IWDFIoRequest 接口的指针。

[in] SetupPacket

指向控件传输 WINUSB_SETUP_PACKET 的指针。

[in, optional] pMemory

指向 IWDFMemory 接口的指针,该接口用于访问用于控制传输的缓冲区。 此参数是可选的。

[in, optional] TransferOffset

指向 WDFMEMORY_OFFSET 结构的指针,该结构描述用于控制传输的内存偏移量。 此参数可选。

返回值

FormatRequestForControlTransfer 返回以下值之一:

返回代码 说明
S_OK

FormatRequestForControlTransfer 已成功格式化 I/O 请求对象。

E_OUTOFMEMORY

FormatRequestForControlTransfer 遇到分配失败。

E_INVALIDARG
指定的 TransferOffset 参数无效的内存偏移量。

注解

在 UMDF 驱动程序调用 FormatRequestForControlTransfer 以设置控制传输操作的 I/O 请求的格式后,框架随后可以将请求发送到 I/O 目标。

示例

以下代码示例取自 WDK 中的 wdf_osrfx2_lab 示例。

    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
    }                                                          
      

要求

要求
结束支持 在 UMDF 2.0 及更高版本中不可用。
目标平台 桌面
最低 UMDF 版本 1.5
标头 wudfusb.h (包括 Wudfusb.h)
DLL WUDFx.dll

另请参阅

IWDFIoRequest

IWDFMemory

IWDFUsbTargetDevice

WDFMEMORY_OFFSET