【问题标题】:Question on Virtual Serial port Windows driver关于虚拟串口Windows驱动的问题
【发布时间】: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

标签: winapi driver umdf


【解决方案1】:

只是回答希望对某人有所帮助。 在读取时,您已完成 WdfRequestForwardToIoQueue 以对请求进行排队。这次应用程序 ReadFile 应处于等待状态。当驱动程序中的数据准备好时,获取排队的先前请求并将数据复制到该请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多