Winapi 虚拟串行端口Windows驱动程序问题

Winapi 虚拟串行端口Windows驱动程序问题,winapi,driver,umdf,Winapi,Driver,Umdf,关于中的样本 在queue.c中,当应用程序从我的虚拟驱动程序请求数据时,会调用EvIoRead。当没有数据时,执行以下代码: OID EvtIoRead( _In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, _In_ size_t Length ) { .... if (bytesCopied > 0) { // // Data was read from buffer s

关于中的样本

在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);
    }
}

调用
wdfrequestforwardtooqueue
。然而,我不确定当有新数据时该怎么办。如何触发再次调用
EvtIoRead

只是希望它能对某人有所帮助。
在读取时,您已经完成了WDFrequestForwardtoIQUE以对请求进行排队。此时应用程序读取文件应处于等待状态。当驱动程序中的数据准备就绪时,将上一个请求排队并将数据复制到该请求。

您不能尝试再次调用
EvtIoRead
——这是错误的。当有人试图从您的驱动程序读取数据时调用此回调。如果您没有数据-您没有完成请求,但在获得新数据时将其放入io队列(
wdFrequestForwardToOqueue
)-您需要从io队列提取请求并完成它在示例中-当新数据-通过
WdfIoQueueRetrieveNextRequest从队列中删除请求(queueContext->ReadQueue,&savedRequest);
并通过
wdfrequestforwardtooqueue(savedRequest,Queue)放回处理
-此时
EvtIoRead
使用此请求调用,但实际上在调用
wdfioqueretrievenextrequest
后,您需要复制数据以请求并完成它
wdfrequestcomplete with information