IWDFIoQueue::RetrieveNextRequest 方法(wudfddi.h)
[警告: UMDF 2 是最新版本的 UMDF,取代了 UMDF 1。 所有新的 UMDF 驱动程序都应使用 UMDF 2 编写。 没有将新功能添加到 UMDF 1,并且对较新版本的 Windows 10 上的 UMDF 1 的支持有限。 通用 Windows 驱动程序必须使用 UMDF 2。 有关详细信息,请参阅 UMDF入门 。]
RetrieveNextRequest 方法从 I/O 队列中检索下一个 I/O 请求。
语法
HRESULT RetrieveNextRequest(
[out] IWDFIoRequest **ppRequest
);
参数
[out] ppRequest
指向缓冲区的指针,该缓冲区接收指向下一个请求对象的 IWDFIoRequest 接口的指针,或者在队列为空或找不到下一个请求时接收 NULL。
返回值
RetrieveNextRequest 返回以下值之一:
返回代码 | 描述 |
---|---|
|
已成功从 I/O 队列检索下一个 I/O 请求。 |
|
队列未调度请求。 如果设备正在进行电源状态转换,并且所有队列都停止调度请求,或者驱动程序显式调用 IWDFIoQueue::Stop 以停止调度请求,则会出现这种情况。 如果驱动程序尝试从受电源管理的手动队列中删除请求且已关闭,或者队列已暂停,则也会发生这种情况。 |
|
队列中没有请求。 |
|
发出调用以从并行队列检索请求。 |
RetrieveNextRequest 也可能返回其他 HRESULT 值。
言论
如果驱动程序配置 I/O 队列以手动调度 I/O 请求,驱动程序可以调用 RetrieveNextRequest 方法从队列中获取下一个请求。 有关手动调度 I/O 请求的详细信息,请参阅 为 I/O 队列配置调度模式。
如果驱动程序配置 I/O 队列以顺序调度 I/O 请求,驱动程序仍可以调用 RetrieveNextRequest 方法,以便从队列中获取下一个请求,而不会收到错误。 尽管该框架允许驱动程序调用 RetrieveNextRequest 从顺序队列检索请求,但在驱动程序完成当前请求之前,驱动程序应仅调用 RetrieveNextRequest。 否则,如果驱动程序尝试在驱动程序完成当前请求后调用 RetrieveNextRequest,则可能会出现争用情况。 此争用条件发生在框架从顺序队列自动调度下一个请求和驱动程序调用 RetrieveNextRequest 以检索下一个请求之间。
例子
下面的代码示例来自 umdf_fx2 示例驱动程序,只要可以检索请求,就会轮询队列中的请求。 代码首先验证请求是否与特定文件对象相关联。
VOID
CMyDevice::ServiceSwitchChangeQueue(
__in SWITCH_STATE NewState,
__in HRESULT CompletionStatus,
__in_opt IWDFFile *SpecificFile
)
{
IWDFIoRequest *fxRequest;
HRESULT enumHr = S_OK;
do {
HRESULT hr;
//
// Get the next request.
//
if (NULL != SpecificFile) {
enumHr = m_SwitchChangeQueue->RetrieveNextRequestByFileObject(
SpecificFile,
&fxRequest
);
}
else {
enumHr = m_SwitchChangeQueue->RetrieveNextRequest(&fxRequest);
}
//
// If a request was retrieved, complete it.
//
if (S_OK == enumHr) {
if (S_OK == CompletionStatus) {
IWDFMemory *fxMemory;
//
// Copy the result to the request buffer.
//
fxRequest->GetOutputMemory(&fxMemory);
hr = fxMemory->CopyFromBuffer(0,
&NewState,
sizeof(SWITCH_STATE));
fxMemory->Release();
}
else {
hr = CompletionStatus;
}
//
// Complete the request with the copy or
// completion status.
//
if (S_OK == hr) {
fxRequest->CompleteWithInformation(hr,
sizeof(SWITCH_STATE));
}
else {
fxRequest->Complete(hr);
}
fxRequest->Release();
}
}
while (S_OK == enumHr);
}
要求
要求 | 价值 |
---|---|
终止支持 | 在 UMDF 2.0 及更高版本中不可用。 |
目标平台 | 桌面 |
最低 UMDF 版本 | 1.5 |
标头 | wudfddi.h (包括 Wudfddi.h) |
DLL | WUDFx.dll |