[英]Device driver: Windows ReadFile function timeout
我使用的设备驱动程序偶尔会丢失硬件中断。
要从设备读取数据,我使用功能
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。 打开将提供FILE_FLAG_OVERLAPPED标志提供给CreateFile的设备驱动程序,然后在调用ReadFile时传递一个重叠的结构。 当I / O完成时,将向该句柄发出信号,因此您可以使用WaitForSingleObject ,在其中提供传递给ReadFile的Handle和超时。
并非所有的设备驱动程序都支持异步I / O,因此这可能实际上对您不起作用。 在这种情况下, ReadFile仍将阻塞,并且不会返回“ ERROR_PENDING_IO”。
如果超时,还应该在重叠结构超出范围之前调用CancelIO杀死ReadFile。 否则,如果碰巧在稍后完成,它将尝试将用于覆盖的重叠结构写入内存。
正确的Asynch I / O有点棘手,因此请仔细阅读文档。
更新:我想到了一种替代方法,您可以从看门狗线程中调用CancelIEx 。 作为较新的API,您必须支持的平台上可能未提供该API。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.