簡體   English   中英

設備驅動程序:Windows ReadFile函數超時

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM