【发布时间】:2019-12-22 17:52:16
【问题描述】:
关于https://github.com/microsoft/Windows-driver-samples/tree/master/serial/VirtualSerial2中的示例。
在 queue.c 中,当应用从我的虚拟驱动程序请求数据时调用 EvIoRead。当没有数据时,执行这段代码:
OID
EvtIoRead(
_In_ WDFQUEUE Queue,
_In_ WDFREQUEST Request,
_In_ size_t Length
)
{
....
if (bytesCopied > 0) {
//
// Data was read from buffer succesfully
//
WdfRequestCompleteWithInformation(Request, status, bytesCopied);
return;
}
else {
//
// No data to read. Queue the request for later processing.
//
status = WdfRequestForwardToIoQueue(Request,
queueContext->ReadQueue);
}
}
WdfRequestForwardToIoQueue 被调用。但是,当有新数据时,我不确定该怎么做。如何触发EvtIoRead 再次被调用?
【问题讨论】:
-
您不能尝试再次调用
EvtIoRead- 这是错误的。当有人尝试从您的驱动程序读取数据时调用此回调。如果您没有数据 - 您没有完成请求,但在获得新数据时将其放入 io 队列 (WdfRequestForwardToIoQueue) - 您需要从 io 队列中提取请求并完成它 -
例如 - 当新数据时 - 请求通过
WdfIoQueueRetrieveNextRequest( queueContext->ReadQueue, &savedRequest);从队列中删除并通过WdfRequestForwardToIoQueue( savedRequest, Queue)放回处理 - 此时EvtIoRead调用此请求 -
但是在调用
WdfIoQueueRetrieveNextRequest之后,您需要复制数据来请求并完成它WdfRequestCompleteWithInformation。