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

时间:2011-10-31 14:37:27

标签: 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 lpOverlapped
  ); 

当设备驱动程序错过中断时,此功能将永久阻止。这导致程序停止,并且必须重新启动窗口才能解决它。

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

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

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

感谢

1 个答案:

答案 0 :(得分:4)

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

并非所有设备驱动程序都支持异步I / O,因此这可能实际上不适合您。如果是这种情况,ReadFile仍会阻止,而不会返回“ERROR_PENDING_IO”。

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

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

更新:我可以选择从监视程序线程调用CancelIEx。作为较新的API,它可能不会出现在您必须支持的平台上。