可能是ReadFile的一個Bug

最近在寫程序的時候,發現Microsoft提供的File Management Functions或多或少存在一些Bug,比如ReadFile。

前段時間移動硬盤壞了,於是用強大的R-Studio恢復硬盤上的數據,文件全部被恢復出來,但是後來在打開其中一個名爲 a.c 文件的

時候,notepad提示說“函數不正確”,又試了下notepad++,一樣打不開,說File does not exist,這是什麼原因?

於是拿起Ollydbg跟了一下notepad打開文件的過程,發現它在調用CreateFile打開這個文件時,該函數能夠正確執行,並且

返回一個有效的文件句柄,緊接着它又調用了GetFileInformationByHandle這個函數,而這個函數卻失敗了,GetLastError返回1,

即ERROR_INVALID_FUNCTION(好奇怪的錯誤代碼)。想了想,之所以會這樣,可能是因爲這個文件在恢復的時候,沒有恢復成功,

文件索引損壞了,但它又確實存在於磁盤上,所以CreateFile能夠正確執行。

好玩的是,一些AV軟件在掃描到這個文件時會假死,在這個地方掃不下去了,跟了一下,發現是在調用CreateFile之後,直接就調用

ReadFile去讀這個文件了,而ReadFile卻一直沒有返回,程序執行不下去了,這可能是ReadFile的一個Bug。

所以,我們應該在調用完CreateFile之後,立即調用GetFileInformationByHandle來判斷這個文件是不是真的有效,否則後續在讀和寫

文件的時候,會發生難以預料的錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章