|
百度一下0x000000c5,可得到的結(jié)果有 26600 條。但是在絕大多數(shù)的結(jié)果內(nèi),沒有人給出了對癥下藥的合理方案。在我看來,藍(lán)屏發(fā)生后,如若想要徹底解決,就不應(yīng)該去"嘗試"各種解決方案,而是使用 WinDbg 一類的利器,直接找到罪魁禍?zhǔn)住?/p> 首先,我們來認(rèn)識一下,什么是常見的 0x000000c5 崩潰。 值為 0x000000c5的 bug check 其實是 DRIVER_CORRUPTED_EXPOOL。什么意思呢?說明系統(tǒng)嘗試以過高的進(jìn)程 IRQL 級別去訪問無效內(nèi)存。在藍(lán)屏信息中,0x000000c5 后面的括號內(nèi)還應(yīng)跟有四個參數(shù),其中第一個表明引用的內(nèi)存地址,第二個參數(shù)表示引用時的 IRQL 級別,第三個參數(shù)要么是0要么是1,0表示讀取,1表示寫入,最后一個參數(shù)表示引用該內(nèi)存的一個地址。 那么,一般有哪些原因引起了該錯誤呢? 引起該問題的一般原因為,一定有一個驅(qū)動程序損壞了系統(tǒng)的內(nèi)存池。如果驅(qū)動損壞的是小于一個頁面大小的分配單元,那么就會引發(fā) 0x000000c5 錯誤;倘若驅(qū)動損壞的是很大的區(qū)域,那么就會引發(fā) DRIVER_CORRUPTED_MMPOOL 錯誤,值為 0x000000D0。 我該如何解決? 我的建議是,一定要啟用特殊池!如果不啟用特殊池,我們是無法得到真正的罪魁禍?zhǔn)椎摹6?,對于這個錯誤的直系、嫡系錯誤,我都推薦使用特殊池。我手頭上暫時沒有保存下來的 0x000000c5 內(nèi)存轉(zhuǎn)儲,但是有一個 0x100000C5 DRIVER_CORRUPTED_EXPOOL。下面我展示一下堆棧結(jié)果:
從圖中我們可以看見,0x7c90e514 并沒有得到正確的解析,而且我可以告訴大家,它的地址也不是真實值,而是 WinDbg 根據(jù)內(nèi)存上下文猜解的。此例中,我們就算使用 dds adb6ad48 命令,再配合 dds 命令,也只能找到一個微軟公司的 win32k.sys 文件,這顯然不是罪魁禍?zhǔn)?。為了讓我們能夠定位出這個殺手驅(qū)動,我們不得不使用特殊池。
什么是特殊池?原理是什么?
特殊池就是特殊內(nèi)存池,一旦啟用,就好像系統(tǒng)部署了7x24小時監(jiān)控,盯著可能是罪魁禍?zhǔn)椎尿?qū)動。關(guān)于原理,我簡單解釋一下,就是通過啟用特殊內(nèi)存池,被檢驗的所有驅(qū)動程序?qū)τ诼孕∮谝粋€頁面大小的緩沖區(qū)申請都將使用特殊內(nèi)存池,不而是使用一般情形下的換頁或非換頁內(nèi)存池。從特殊內(nèi)存池中分配的緩沖區(qū)被夾在兩個無效頁面之間。因此,對于小于一個頁面大小的緩沖區(qū)的溢出,系統(tǒng)在溢出發(fā)生時就會檢測到,因為它導(dǎo)致了在緩沖區(qū)之后的無效頁面發(fā)生了頁面錯誤,也就是pagefault。那么,再次崩潰時,得到的錯誤應(yīng)該是 DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION(0x000000d6),這樣就將不可調(diào)試的轉(zhuǎn)為可調(diào)試的轉(zhuǎn)儲文件了,而且運氣好的話能夠看見Windbg直接指出引起崩潰的驅(qū)動。
怎樣啟用特殊池?
1、運行"verifier.exe",您會看見"驅(qū)動程序驗證程序管理器"向?qū)В?/p> 2、選擇第二項——"創(chuàng)建自定義設(shè)置(供程序開發(fā)人員使用)",然后點擊"下一步"; 3、選擇第二項——"從一個完整的列表選擇單個設(shè)置",并點擊"下一步"; 4、僅選中第一項——"特殊池"前面的復(fù)選框,進(jìn)入下一步; 5、選擇第三項——"自動選擇這臺計算機上安裝的所有驅(qū)動程序",點擊"完成"; 6、重新啟動系統(tǒng)。 在重啟系統(tǒng)之后,特殊池就生效了,接下來您要做的就是等待系統(tǒng)再次崩潰出現(xiàn)藍(lán)屏。通過藍(lán)屏之后重新生成的內(nèi)存轉(zhuǎn)儲文件就因該可以查到真兇了。 以上用到的 verifier.exe 在系統(tǒng)中有,在 Windows Driver Kit 里面也帶有。如果通過它啟用特殊池也未能查明真兇,請使用Debugging Tools for Windows 中的 gFlags 工具通過 pool tag 啟用特殊池再試。 |
|
|