c++ - 设备驱动程序: Windows ReadFile function timeout

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

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

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

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

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

谢谢

最佳答案

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

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

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

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

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

关于c++ - 设备驱动程序: Windows ReadFile function timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7955199/

相关文章:

c++ - 为嵌入式解释器安装为 VS2010 编译的 Numpy

windows - 在 Windows 上的 Go 中通过 telnet/ssh 写入现有的 tcp 套接字

python - 通过命令行获取信息提示

为 Windows 创建应用程序兼容性垫片

c# - HttpWebRequest 超时

使用 Retrofit/OkHttpClient 的 WiFi 上的 Android SocketTimeoutException

c++ - QPixmap 绘制性能问题

c++ - 指向类成员的指针作为模板参数

PHP脚本超时

c++ - 关于C++编程实践的看法