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

C++ 设备驱动程序:Windows ReadFile函数超时,c++,windows,timeout,device-driver,readfile,C++,Windows,Timeout,Device Driver,Readfile,我使用的设备驱动程序偶尔会错过来自硬件的中断 要从设备读取数据,我使用函数 BOOL WINAPI ReadFile( __in HANDLE hFile, __out LPVOID lpBuffer, __in DWORD nNumberOfBytesToRead, __out_opt LPDWORD lpNumberOfBytesRead, __inout_opt LPOVERLAPPED lpOverl

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

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

  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。打开提供文件\u标志\u重叠标志的设备驱动程序,然后在调用时传递重叠结构。当i/o完成时,将向句柄发送信号,这样您就可以使用传递给ReadFile的句柄和超时

并非所有设备驱动程序都支持异步I/O,因此这可能并不适用于您。如果是这种情况,则仍将阻塞,并且不会返回“ERROR\u PENDING\u IO”

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

异步i/o有点棘手,所以请仔细阅读文档


更新:我遇到了另一个选择,您可以从看门狗线程调用它。作为一个较新的API,它可能不存在于您必须支持的平台上。

可能库对您很有用。SetCommTimeout用于串行I/O,而不是通用设备驱动程序I/O。