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
在系统时间单位(100 纳秒间隔)中,在框架自动取消 I/O 请求之前可以运行的时间量。
- 如果值为负值,则过期时间相对于当前系统时间。
- 如果值为正值,则过期时间指定为绝对时间(相对于 1601 年 1 月 1 日)。
- 如果值为零,则框架不会超时请求。
返回值
如果作成功,发送 将返回S_OK。 否则,此方法返回在 Winerror.h 中定义的错误代码之一。
请注意,返回值表示 Send 方法尝试将 I/O 请求发送到 I/O 目标的状态。 返回值不表示 I/O 请求的完成状态。 驱动程序必须使用 IWDFRequestCompletionParams 接口来获取 I/O 请求的完成状态。
言论
如果 发送 返回错误代码,驱动程序通常应使用返回 发送 返回的错误代码完成请求,如以下示例部分中的代码所示。
如果驱动程序在 标志 参数中设置WDF_REQUEST_SEND_OPTION_SYNCHRONOUS标志,并且如果 发送 成功将 I/O 请求发送到 I/O 目标,发送 在 I/O 目标完成 I/O 请求后返回。 在这种情况下,发送 返回S_OK,驱动程序可以立即调用 IWDFIoRequest::GetCompletionParams 以获取 IWDFRequestCompletionParams 接口。 IWDFIoRequest::GetCompletionParams 的代码示例 显示调用 发送 并设置了WDF_REQUEST_SEND_OPTION_SYNCHRONOUS标志。
如果驱动程序未设置WDF_REQUEST_SEND_OPTION_SYNCHRONOUS标志,并且如果 发送 成功将 I/O 请求发送到 I/O 目标,发送 返回S_OK,而 I/O 目标仍在异步处理 I/O 请求。 在这种情况下,驱动程序提供 IRequestCallbackRequestCompletion::OnCompletion 回调函数,框架在 I/O 目标完成 I/O 请求后调用。 通常,OnCompletion 回调函数 IWDFIoRequest::GetCompletionParams调用。 以下示例部分中的代码示例显示了在没有WDF_REQUEST_SEND_OPTION_SYNCHRONOUS标志的情况下调用 发送。
如果驱动程序为管道配置了 连续读取器,驱动程序无法调用 发送 向 USB 管道发送 I/O 请求。
例子
下面的代码示例将请求转发到设备的 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