繁体   English   中英

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

[英]Device driver: Windows ReadFile function timeout

我使用的设备驱动程序偶尔会丢失硬件中断。

要从设备读取数据,我使用功能

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

当设备驱动程序错过中断时,此功能将永远阻塞。 这导致程序停顿,必须重新启动Windows才能解决该问题。

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

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

它失败,并显示错误代码87(无效参数)。 显然,我无法在设备驱动程序句柄上使用此超时内容。 我怎样才能解决这个问题? 还有其他方法可以在设备驱动程序上设置超时限制吗?

谢谢

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

并非所有的设备驱动程序都支持异步I / O,因此这可能实际上对您不起作用。 在这种情况下, ReadFile仍将阻塞,并且不会返回“ ERROR_PENDING_IO”。

如果超时,还应该在重叠结构超出范围之前调用CancelIO杀死ReadFile。 否则,如果碰巧在稍后完成,它将尝试将用于覆盖的重叠结构写入内存。

正确的Asynch I / O有点棘手,因此请仔细阅读文档。

更新:我想到了一种替代方法,您可以从看门狗线程中调用CancelIEx 作为较新的API,您必须支持的平台上可能未提供该API。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM