gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:01:04 26 4
gpt4 key购买 nike

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

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

  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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com