我正在使用偶尔错过硬件中断的设备驱动程序。
要从设备读取数据,我使用函数
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(参数无效)。显然,我不能在设备驱动程序句柄上使用此超时内容。我怎样才能解决这个问题?是否有其他方法可以在设备驱动程序上设置超时限制?
感谢
答案 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,它可能不会出现在您必须支持的平台上。