[英]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.