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



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

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

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

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

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

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

失败,错误码为87(无效参数)。显然,我不能在设备驱动程序句柄上使用这个超时的东西。我该如何解决这个问题?是否有其他方法可以在设备驱动程序上设置超时限制?

谢谢

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

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

如果超时,还应该在重叠结构超出作用域之前调用CancelIO来终止ReadFile。否则,如果操作在稍后完成,它将尝试写入重叠结构所在的内存。

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

Update:我想到了另一种方法,您可以从看门狗线程调用CancelIEx。作为一个较新的API,它可能不存在于您必须支持的平台上。

最新更新