Share via


Windows 機密 強制控制代碼關閉

Raymond Chen

有過想要刪除檔案但無法因為某些程式檔案開啟? 執行在這種情況下是讓程式已有檔案在正確動作會開啟以關閉它,您無法執行個體,問人編輯文件來關閉它。 但有時候您取得 impatient 使用某些公用程式,可以強制關閉的檔案控制代碼。 然後您所成交的長期資料損毀的暫存洩壓,

強制關閉控制代碼相當於至程式,請釋放一些記憶體。 程式會認為控制代碼 (或記憶體) 仍然有效,並將繼續使用它。 但是,由於控制代碼是真正的可用的它將會重複用於其他。

說您是高中在您看到在購物服務區號碼 305 要活頁簿。 您強制在購物服務區開啟,並取得活頁簿。 現在,鎖定開啟,而且其他有人是藉由],並至中將自己錄包。 同時,原始擁有者的購物服務區 305 則會傳回從午餐,擷取活頁簿的包,並需要其類別。

現在有兩個問題: 在原始的使用者的購物服務區 305 錯誤錄包並處於危險的筆記,有人其他的筆記本中。 第二個人,同時,就必須被偷他錄袋。

如果你很幸運,下一件事,程式會執行就會是關閉您強制先前關閉的控制代碼。 程式取得的控制代碼無效] 錯誤,但因為有什麼可以程式只是進行像已順利關閉控制代碼。 但這是極少情況。

更可能的是,程式最後會回到控制代碼並試著使用它時,發生無效的控制代碼的錯誤。 更多可能會是控制代碼您強制關閉會使用的其他項目。 這時請完全 berserk 事情會開始。 假設為另一個檔案的控制代碼重複使用。 現在程式會認為它的在讀取,並將第一個的檔案寫入,但實際上它第二個檔案上作業。 結果會是在第一個檔案 (不是應該已寫入的資料) 和第二個檔案 (目的的第一個檔案已寫入第二個檔案的資料) 的資料損毀。

當程式關閉的第一個檔案時, 也會關閉回收控制代碼。 您已建立一個重疊顯示錯誤: 您強制關閉,第一個檔案而且結果部分的第二個控制代碼已強制關閉。

為每個控制代碼具有不小心前一個元件損毀的控制代碼所要求的元件可以無限期地,繼續資料損毀。 前一個元件最後會關閉它認為是有效的控制代碼時, 它實際上會關閉目前現在繼續下一個元件,以要求控制碼的損毀的元件所使用的控制代碼。

假設搜尋索引服務會有檔案開啟的索引,但已取得暫時停留,而您想要刪除的檔案,讓您 (unwisely) 強制關閉控制代碼。 搜尋索引服務開啟它的記錄檔,以記錄部分的資訊],並已刪除的檔案控制代碼是為該記錄檔的檔案控制代碼回收。 stuck 的作業最後完成,和搜尋的索引服務最後以關閉它擁有的控制代碼周圍取得開啟,但是它結束不知情的狀況下將自己關閉記錄檔的檔案控制代碼。

搜尋索引服務會開啟另一個檔案時,假設一個組態檔寫入,因此它可以更新某些永續性的狀態。 記錄檔的控制代碼取得為組態檔案的控制代碼回收的。 搜尋索引服務要記錄一些資訊中,因此它會寫入其記錄檔。 不幸的是,已關閉的記錄檔的檔案控制代碼,而且其組態檔的控制代碼重複使用。 記錄的資訊會進入組態檔,損毀它。

同時,另一個控制碼您強制關閉已重新使用 Mutex 代碼可用來協助防止資料被損毀。 當關閉原始檔案控制代碼時, 關閉 Mutex 的控制代碼,並對資料損毀,保護會遺失。 在長的服務執行,多損毀會成為其索引。 最後,有人注意到索引傳回不正確的結果。 並嘗試重新啟動服務時它失敗因為其組態檔已損毀。

您公司會搜尋索引服務] 和 [它們決定索引已損毀,記錄檔 mysteriously 已經停止記錄,而且記憶體回收已覆寫組態檔中報告問題。 某些不佳的技術人員會指派 hopeless 工作的找出為什麼服務損毀它的索引] 與 [組態檔案中,不知道損毀的來源您就會強制關閉控制代碼。

Raymond Chen 網站 」 The Old New Thing"並處理 Windows 的歷史,Win32 的程式設計和 misreading 新聞頭條的採用相同標題的書名 (Addison-Wesley,2007)。