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