關於WriteFile函式的lpNumberOfBytesWritten在Win8開始的不同

whatday發表於2013-06-02

今天我寫一個程式,把lpNumberOfBytesWritten的指標給錯了,隱式給成了NULL,但我是在Win8編譯測試的,結果WriteFile通過了,我沒察覺到這個錯誤。而我轉到Win7上執行,直接蹦了,百思不解,無奈之下開啟OD調,結果發現死在WriteFile這裡,仔細一跟,我艹。。。

原來是這樣的,lpNumberOfBytesWritten引數大家都不能設定為NULL或一個無效的指標,除非lpOverlapped引數不是NULL,也就是說WriteFile的最後2個引數必須有一個不為NULL,MSDN也是這樣寫的。可Win8開始不是這樣了,你可以把WriteFile的最後2個引數都設定為NULL。。。比如:

WriteFile(hFile,lpBuffer,dwWriteSize,NULL,NULL);

這樣在Win7下執行會掛的,而Win8下不會,因為Win8會檢查lpNumberOfBytesWritten參賽是否為空指標,如果是空指標就跳過不寫了。彙編如下

Win7:

Win8:


很多人可能問了,為什麼那麼舒服的東西微軟不早點加?加不加我們無法控制,不過可以在Win7等老系統下把lpNumberOfBytesWritten設定為NULL並且不崩潰的辦法有沒有?相信聰明的你一定想到了,呃,就是在WriteFile前加個SEH或者VEH,騙系統我們已經處理了那個指標訪問異常讓系統繼續執行就行了(因為訪問lpNumberOfBytesWritten是在NtWriteFile結束後才訪問的,所以檔案的寫操作其實已經完成了)。。。

相關文章