微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设备驱动程序:Windows ReadFile函数超时

我使用的是偶尔会错过硬件中断的设备驱动程序。

要从设备读取数据,我使用该function

BOOL WINAPI ReadFile( __in HANDLE hFile,__out LPVOID lpBuffer,__in DWORD nNumberOfBytesToRead,__out_opt LPDWORD lpNumberOfBytesRead,__inout_opt LPOVERLAPPED lpOverlapped );

当设备驱动程序错过一个中断时,该function永远阻塞。 这导致程序停滞,并且必须重新启动窗口来解决它。

解决这个问题,我想调用Readfile()时使用超时限制。 但是当我使用

是否有可能检索创buildWDFREQUEST的cpu

为什么我的IOCTL调用copy_from_user协同工作,而不是与get_user协同工作?

世界上最简单的Windows驱动程序

测量设备驱动程序由我的程序引起的cpu / IO利用率

如何打包Windows驱动程序进行部署?

BOOL WINAPI SetCommTimeouts( __in HANDLE hFile,__in LPCOMMTIMEOUTS lpCommTimeouts );

它会失败,错误代码87(无效的参数)。 显然,我不能在设备驱动程序句柄上使用这个超时的东西。 我怎样才能解决这个问题? 有没有其他方法来设置设备驱动程序的超时限制?

谢谢

关于在terminal上打印KERNEL消息

生产者消费者在块设备驱动程序中的实现?

如何在代码中的SATA控制器上从PIO切换到DMA模式?

当你插入一个新的USB设备会发生什么?

如何以编程方式创build自定义input/输出设备?

您需要切换到异步I / O。 打开提供FILE_FLAG_OVERLAPPED标志给CreateFile的设备驱动程序,然后在调用ReadFile时传递重叠结构。 当I / O完成时,句柄将被发送信号,所以你可以使用WaitForSingleObject来传递给ReadFile的句柄和一个超时。

并非所有设备驱动程序都支持异步I / O,所以这可能不适合您。 如果是这种情况, ReadFile将仍然阻塞,不返回“ERROR_PENDING_IO”。

如果超时,则应在重叠结构超出范围之前调用CancelIO来终止 ReadFile。 否则,如果碰巧晚些时候完成,它会尝试将内存写入用于存储的重叠结构。

异步I / O有点棘手,所以仔细阅读文档。

更新:我发现一个替代方案可以从看门狗线程中调用CancelIEx 。 作为一个更新的API,它可能不会出现在你必须支持的平台上。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐