最近在寫程序的時候,發現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來判斷這個文件是不是真的有效,否則後續在讀和寫
文件的時候,會發生難以預料的錯誤。