我正在使用ReadDirectoryChangesW(Windows API)異步結合GetQueuedCompletionStatus。如何檢測可能的緩衝區溢出以瞭解至少有一個文件系統更改事件已丟失?ReadDirectoryChangesW:異步使用時如何檢測緩衝區溢出?
回答
當使用ReadDirectoryChangesW
異步,你會得到事件的第一組,那麼你必須再次調用它更多事件。如果您的緩衝區中的事件數量超過,則不會發生錯誤。在OS級緩衝區中發生的事件多於錯誤狀態,並且您發現如下:
- 發生了一些事件。
- 通過
ReadDirectoryChangesW
開始異步操作成功完成。您的緩衝區已滿,事件句柄已設置或IOCP被觸發。 - 發生其他事件,這些事件存儲在OS級緩衝區中。
- 發生更多附加事件,這些事件溢出OS級緩衝區。這不會改變重疊的操作,已經成功在步驟2
- 您等待事件處理,或處理IOCP的狀態,並發現完成OVERLAPPED通話。
- 你再打電話
ReadDirectoryChangesW
開始異步的重疊的操作檢查,因爲第2步此調用同步失敗時發生的任何事件,GetLastError() == ERROR_NOTIFY_ENUM_DIR
,或dwBytesTransferred == 0
成功,因爲the documentation says this also means to re-enumerate the directory
如果傳輸的字節數爲零,則緩衝區對於系統分配來說太大,或者太小而無法提供有關目錄或子樹中發生的所有更改的詳細信息。在這種情況下,您應該通過枚舉目錄或子樹來計算更改。
聽起來很有趣。這是你的經歷嗎?是否有任何文件指定這種行爲?對於更新的Windows版本,這可能會發生變化嗎?這是5年前我正在研究'ReadDirectoryChangesW'行爲,但我敢肯定,我沒有看到任何錯誤指示通過對'ReadDirectoryChangesW'的同步調用。 – mstrap
@mstrap:其實我並不完全確定#6。該文檔建議它可以用'dwBytesTransferred == 0'完成。我可以肯定的是,這個錯誤將會在隨後的調用中報告,因爲它發生在數據可用於完成第一個調用之後。 –
從here來看,好像沒有這樣的返回錯誤代碼異步。
建議:監控變化同步,而是在一個專門的線程,並觀看了ERROR_NOTIFY_ENUM_DIR
。
您可能無法完成您的檢測這種方式,但here是一個偉大的教程,可以幫助。
您還可以檢查出的答案this other question.
- 1. 緩衝區溢出異步js'eachSeries
- 2. ***檢測到緩衝區溢出***
- 3. 測試緩衝區溢出
- 4. 緩衝區溢出(VS)緩衝區溢出(VS)堆棧溢出
- 5. 緩衝區溢出
- 6. 緩衝區溢出緩衝區長度
- 7. 金絲雀字如何讓gcc檢測緩衝區溢出?
- 8. 如何檢測緩衝區溢出C在這種情況下,
- 9. GCC如何檢測堆棧緩衝區溢出
- 10. 利用緩衝區溢出
- 11. 如何利用緩衝區溢出?
- 12. 速率很高時檢測到httperf緩衝區溢出
- 13. 堆/緩衝區溢出異常
- 14. 緩衝區溢出異常通過fscanf_s
- 15. 緩衝區溢出怪異的行爲
- 16. 使用snprintf緩衝區溢出
- 17. 緩衝區溢出防止使用NSString
- 18. 緩衝區溢出使用PEG /腿
- 19. 緩衝區溢出不溢出
- 20. 如何防止memcpy緩衝區溢出?
- 21. 堆棧緩衝區溢出
- 22. 緩衝區溢出攻擊
- 23. JSP緩衝區溢出
- 24. 數組緩衝區溢出
- 25. QTime緩衝區溢出?
- 26. 過程緩衝區溢出
- 27. C++溢出緩衝區
- 28. 的strtok - 緩衝區溢出
- 29. 緩衝區溢出援助
- 30. Dillema與緩衝區溢出
請顯示一些源代碼... – Yahia
使用GetQueuedCompletionStatus顯示緩衝區溢出的可靠檢測的源代碼正是問題所在。 – mstrap