IWDFIoRequest::Send 方法 (wudfddi.h)

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

Send 方法将请求发送到指定的 I/O 目标。

语法

HRESULT Send(
  [in] IWDFIoTarget *pIoTarget,
  [in] ULONG        Flags,
  [in] LONGLONG     Timeout
);

参数

[in] pIoTarget

指向 I/O 目标对象的 IWDFIoTarget 接口的指针,该对象通常表示堆栈中的较低驱动程序。

[in] Flags

WDF_REQUEST_SEND_OPTIONS_FLAGS类型标志的有效按位 OR。

[in] Timeout

在框架自动取消 I/O 请求之前,系统时间单位 (100 纳秒间隔) 。

  • 如果值为负值,则过期时间相对于当前系统时间。
  • 如果值为正值,则过期时间指定为相对于 1601 年 1 月 1 日) 的绝对时间 (。
  • 如果值为零,则框架不会超时请求。
相对过期时间不受在指定超时期限内可能发生的系统时间的任何更改的影响。 绝对过期时间反映系统时间更改。

返回值

如果操作成功,Send 将返回S_OK。 否则,此方法返回 Winerror.h 中定义的错误代码之一。

请注意,返回值表示 Send 方法尝试将 I/O 请求发送到 I/O 目标的状态。 返回值不表示 I/O 请求的完成状态。 驱动程序必须使用 IWDFRequestCompletionParams 接口来获取 I/O 请求的完成状态。

注解

如果 Send 返回错误代码,驱动程序通常应使用 Send 返回的错误代码完成请求,如以下示例部分所示。

如果驱动程序在 Flags 参数中设置了 WDF_REQUEST_SEND_OPTION_SYNCHRONOUS 标志,并且 如果 Send 成功将 I/O 请求发送到 I/O 目标, 则 Send 将在 I/O 目标完成 I/O 请求后返回。 在这种情况下, Send 返回S_OK驱动程序可以立即调用 IWDFIoRequest::GetCompletionParams 以获取 IWDFRequestCompletionParams 接口。 IWDFIoRequest::GetCompletionParams 中的代码示例演示了对 Send 的调用,并设置了WDF_REQUEST_SEND_OPTION_SYNCHRONOUS标志。

如果驱动程序未设置WDF_REQUEST_SEND_OPTION_SYNCHRONOUS标志,并且 Send 成功将 I/O 请求发送到 I/O 目标, 则 Send 将返回S_OK同时 I/O 目标仍在异步处理 I/O 请求。 在这种情况下,驱动程序提供 IRequestCallbackRequestCompletion::OnCompletion 回调函数,框架在 I/O 目标完成 I/O 请求后调用该函数。 通常, OnCompletion 回调函数调用 IWDFIoRequest::GetCompletionParams。 以下示例部分中的代码示例演示了对不带 WDF_REQUEST_SEND_OPTION_SYNCHRONOUS 标志的 Send 的调用。

如果驱动程序已为该管道配置了连续读取器,则驱动程序无法调用 Send 将 I/O 请求发送到 USB 管道。

示例

下面的代码示例将请求转发到设备的 I/O 目标。

    IWDFIoRequest* FxRequest;

    //
    // Set the completion callback.
    // When the lower request is completed, the driver is 
    // notified through the completion callback. 
    //

    IRequestCallbackRequestCompletion *completionCallback = 
        QueryIRequestCallbackRequestCompletion();
 
    FxRequest->SetCompletionCallback(
                                     completionCallback,
                                     NULL  //pContext
                                     );

    completionCallback->Release();
 
    //
    // Format the I/O request.  
 
    FxRequest->FormatUsingCurrentType( );

    //
    // Send down the request.
    //
    HRESULT hrSend = S_OK;
 
    hrSend = FxRequest->Send(
                             m_FxIoTarget,
                             0, // Asynchronous
                             0  // No time-out
                             );
 
    if (S_OK != hrSend) {
        //
        // If the send failed, the driver must complete the 
        // request with the failure.
        FxRequest->CompleteWithInformation(hrSend, 0);
    }

要求

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

另请参阅

IRequestCallbackRequestCompletion::OnCompletion

IWDFIoRequest

IWDFIoRequest::GetCompletionParams

IWDFIoTarget

WDF_REQUEST_SEND_OPTIONS_FLAGS (UMDF)