KERNEL_SECURITY_CHECK_FAILURE bug 檢查的值為 0x00000139。 此bug檢查表明內核已檢測到關鍵數據結構的損壞。
這很重要
本文適用於程式設計人員。 如果您是在使用計算機時收到藍色螢幕錯誤碼的客戶,請參閱 針對藍螢幕錯誤進行疑難解答。
Bug Check 0x139 KERNEL_SECURITY_CHECK_FAILURE 參數
參數 | 說明 |
---|---|
1 | 損壞的類型。 如需詳細資訊,請參閱下表。 |
2 | 導致 bug 檢查的異常的陷阱幀的位址 |
3 | 導致 bug 檢查的異常的異常記錄的位址 |
4 | 已保留 |
下表描述了 Parameter 1 (參數 1) 的可能值。
參數 1 | 說明 |
---|---|
0 | 基於堆疊的緩衝區已溢出(舊版 /GS 衝突)。 |
1 | VTGuard 檢測代碼檢測到嘗試使用非法虛擬函數表。 通常,C++ 物件已損壞,然後嘗試使用損壞物件的 this 指標進行虛擬方法調用。 |
2 | 堆疊 Cookie 檢測代碼檢測到基於堆疊的緩衝區溢出(/GS 衝突)。 |
3 | LIST_ENTRY已損壞(例如,雙重刪除)。 有關更多資訊,請參閱以下 Cause 部分。 |
4 | 已保留 |
5 | 將無效參數傳遞給將無效參數視為 fatal 的函數。 |
6 | 載入程式未正確初始化堆疊 Cookie 安全 Cookie。 這可能是由於構建僅在 Windows 8 上運行的驅動程式並嘗試在早期版本的 Windows 上載入驅動程式映像而導致的。 若要避免此問題,必須構建驅動程式以在早期版本的 Windows 上運行。 |
7 | 請求了致命程式退出。 |
8 | 編譯器插入的數位邊界檢查檢測到非法的陣列索引作。 |
9 | 對 RtlQueryRegistryValues 的調用指定了不帶RTL_QUERY_REGISTRY_TYPECHECK RTL_QUERY_REGISTRY_DIRECT,並且目標值不在受信任的系統配置單元中。 |
10 | 間接呼叫保護檢查檢測到無效的控制轉移。 |
11 | 寫保護檢查檢測到無效的記憶體寫入。 |
12 | 嘗試切換到無效的光纖上下文。 |
13 | 嘗試分配無效的寄存器上下文。 |
14 | 物件的引用計數無效。 |
18 | 嘗試切換到無效的 jmp_buf 上下文。 |
19 | 對唯讀數據進行了不安全的修改。 |
20 | 加密自檢失敗。 |
21 | 檢測到無效的異常鏈。 |
22 | 發生加密庫錯誤。 |
23 | 從 DllMain 中進行了無效調用。 |
24 | 檢測到無效的映像基位址。 |
25 | 在保護延遲載入時遇到不可恢復的故障。 |
26 | 對不安全的分機進行了調用。 |
二十七 | 調用了已棄用的服務。 |
28 | 檢測到越界緩衝區訪問。 |
二十九 | RTL_BALANCED_NODE RBTree 條目已損壞。 |
37 | 調用了超出範圍的 switch jumptable 條目。 |
38 | 嘗試對無效目標執行 longjmp。 |
39 | 無法將導出抑制的調用目標設為有效的調用目標。 |
原因
使用參數 1 表和轉儲檔,可以縮小許多此類 bug 檢查的原因。
LIST_ENTRY損壞可能難以追蹤,此bug檢查表明雙向連結清單中引入了不一致(在清單中添加或刪除單個清單條目元素時檢測到)。 遺憾的是,在損壞發生時不一定能檢測到不一致,因此可能需要進行一些偵查工作來確定根本原因。
清單項目損壞的常見原因包括:
- 驅動程式已損壞內核同步物件,例如KEVENT(例如,當線程仍在等待同一KEVENT時重複初始化KEVENT,或者允許基於堆疊的KEVENT在另一個線程使用該KEVENT) 時超出範圍。 這種類型的 bug 檢查通常發生在 nt!Ke* 或 nt!Ki* 代碼。 當線程完成對同步物件的等待或代碼嘗試將同步物件置於終止狀態時,可能會發生這種情況。 通常,發出信號的同步物件是已損壞的同步物件。 有時,具有特殊池的驅動程序驗證程式可以幫助追蹤罪魁禍首 (如果損壞的同步對象位於已釋放) 的池塊中。
- 驅動程式損壞了定期 KTIMER。 這種類型的 bug 檢查通常發生在 nt!Ke* 或 nt!Ki* 代碼,涉及向計時器發送信號,或從計時器表中插入或移除計時器。 縱的計時器可能是損壞的計時器,但可能需要使用 !timer 檢查計時器表(或手動遍歷計時器清單連結)以確定哪個計時器已損壞。 有時,具有特殊池的驅動程序驗證程式可以幫助追蹤罪魁禍首(如果損壞的 KTIMER 位於已釋放的池塊中)。
- 驅動程式對內部 LIST_ENTRY 樣式鏈表管理不善。 一個典型的示例是在同一列表條目上調用 RemoveEntryList 兩次,而不在兩個 RemoveEntryList 調用之間重新插入清單條目。 其他變體是可能的,例如在同一列表中重複插入一個條目。
- 驅動程式釋放了包含LIST_ENTRY的數據結構,而沒有從其相應的清單中刪除數據結構,從而導致稍後在重用舊池塊后檢查清單時檢測到損壞。
- 驅動程式以併發方式使用了 LIST_ENTRY 樣式清單,而沒有正確同步,從而導致清單更新被撕裂。
在大多數情況下,您可以通過向前和向後遍歷鏈錶( dl 和 dlb 命令對此很有用)並比較結果來識別損壞的數據結構。 向前和向後行走之間的清單不一致的地方通常是損壞的位置。 由於鏈表更新作可以修改相鄰元素的清單連結,因此您應該仔細查看損壞的清單條目的鄰居,因為它們可能是潛在的罪魁禍首。
由於許多系統元件在內部使用 LIST_ENTRY 清單,因此驅動程式使用系統 API 的各種類型的資源管理不善可能會導致系統管理的連結表中的連結清單損壞。
解決辦法
確定此問題的原因通常需要使用調試器來收集其他資訊。 應檢查多個轉儲檔,以查看此停止代碼是否具有相似的特徵,例如,出現停止代碼時正在運行的代碼。
有關詳細資訊,請參閱 使用 Windows 調試器 (WinDbg) 進行故障轉儲分析、 使用 !analyze 擴展 和 !analyze。
使用事件日誌查看是否有更高級別的事件發生導致此停止代碼。
這些常規故障排除提示可能會有所説明。
如果您最近將硬體新增至系統,請嘗試移除或取代它。 或者,請洽詢製造商以查看是否有任何修補程式可供使用。
如果最近新增了新的設備驅動器或系統服務,請嘗試移除或更新它們。 嘗試判斷系統中導致出現新錯誤檢查程式代碼的變更。
檢查事件查看器中的系統日誌是否有其他錯誤消息,這些消息可能有助於查明導致錯誤的設備或驅動程式。 在與藍色畫面相同的時間範圍中,尋找系統記錄檔中發生的嚴重錯誤。
查看 設備管理員 ,查看是否有任何設備標有感嘆號 (!)。 查看驅動程式屬性中顯示的事件日誌,瞭解任何出現故障的驅動程式。 請嘗試更新相關的驅動程式。
執行病毒偵測程式。 病毒可以感染針對 Windows 格式化的所有硬碟類型,而產生的磁碟損毀可能會產生系統錯誤檢查碼。 確保病毒檢測程式檢查主引導記錄中是否有感染。
有關其他常規故障排除資訊,請參閱 分析 Bug 檢查藍屏數據。
另請參閱
使用 Windows 調試程式(WinDbg)進行記憶體傾印分析
使用 WinDbg 分析 Kernel-Mode 傾印檔案