【问题标题】:Device driver: Windows ReadFile function timeout设备驱动程序:Windows ReadFile 函数超时
【发布时间】:2011-12-18 19:18:43
【问题描述】:

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

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

  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(无效参数)。显然,我不能在设备驱动程序句柄上使用这个超时的东西。我怎样才能解决这个问题?是否有其他方法可以在设备驱动程序上设置超时限制?

谢谢

【问题讨论】:

  • 可能this库对你有用。
  • SetCommTimeouts 用于串行 I/O,而不是通用设备驱动程序 I/O。

标签: c++ windows timeout device-driver readfile


【解决方案1】:

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

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

如果超时,您还应该调用CancelIO 在重叠结构超出范围之前终止 ReadFile。否则,如果它恰好稍后完成,它会尝试写入重叠结构曾经存在的内存。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 2011-11-14
    • 2011-08-17
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    相关资源
    最近更新 更多