本發明專利技術公開了一種用于解除文件占用的方法,包括:獲取待解除占用的目標文件的所有文件句柄;獲取所述待解除占用的目標文件的所有文件句柄各自所屬的進程私有句柄表;將所述目標文件的所有文件句柄的文件句柄對象由各自的進程私有句柄表中移除;將所述目標文件的所有文件句柄的文件句柄對象的引用計數從系統中清零。本發明專利技術同時還公開了一種用于解除文件占用的裝置。本發明專利技術解除文件占用時不必復制句柄,不會破壞被打開文件的正常運行。
【技術實現步驟摘要】
本專利技術涉及計算機
,特別是涉及一種用于解除文件占用的方法。本專利技術還涉及一種用于解除文件占用的裝置。
技術介紹
解除文件占用是目前一些安全軟件 提供的一項功能。由于文件在被進程調用后,將不能手動進行諸如刪除改名等操作。利用這個功能可以解除進程對文件的占用,從而讓用戶可以執行刪除文件、更改名稱、移動位置等操作。現有視窗(window)操作系統下,一種解除文件占用的方法原理如下如果文件由某個進程打開,那么這個進程就擁有了它的句柄。使用函數ZwQuerySystemInformation()來枚舉句柄,將每一個句柄都用DuplicateHandle進行復制,確定句柄屬于哪個文件,如果是要找的文件,就將句柄拷貝,然后使用DuplicateHandle去關閉占用的句柄。上述的方法在實踐中會遇到兩處難點。第一,在對打開的命名管道(named pipe)處理的句柄調用ZwQueryInformationFile ()的時候,調用線程會等待pipe中的消息,而pipe中卻可能沒有消息,也就是說,調用ZwQueryInformationFile ()的線程實際上永久性地掛起了。第二,在拷貝句柄后,兩個句柄(我們進程的和打開文件進程的)將會指向同一個目標文件,從而文件當前的輸入輸出模式、在文件中的位置以及其它與文件相關的信息就會由兩個進程來共享。這時,甚至只是讀取文件(復制句柄或者原來句柄)都會引起讀取位置的改變,從而破壞了打開文件程序的正常運行。雖然,上述的第一個難點可以通過如下方式解決,即目標文件的獲取不用在挑選句柄的主線程中進行,而是啟動獨立的線程并設置一個超時時間來避免掛起。但是這種方法較為麻煩,而且效率低。上述的第二個難點,需要用停止占用文件進程的線程、拷貝文件或者重新啟動占用文件的進程等方式來解決。但是這些方法不能用于許多情形,比如要在運行的系統中拷貝注冊表文件,用這種方法就不會成功。因而使用上還是有局限性。
技術實現思路
鑒于上述問題,提出了本專利技術以便提供一種克服上述問題或者至少部分地解決上述問題的用于解除文件占用的方法和相應的用于解除文件占用的裝置。依據本專利技術的一個方面,提供了一種用于解除文件占用的方法,包括獲取待解除占用的目標文件的所有文件句柄;獲取所述待解除占用的目標文件的所有文件句柄各自所屬的進程私有句柄表;將所述目標文件的所有文件句柄的文件句柄對象由各自的進程私有句柄表中移除;將所述目標文件的所有文件句柄的文件句柄對象的引用計數從系統中清零??蛇x的,所述獲取待解除占用的目標文件的所有文件句柄包括獲取待解除占用的目標文件的路徑;枚舉系統打開的所有文件句柄;獲取所有文件句柄對應文件的具體路徑,并與待解除占用的目標文件的路徑進行匹配;將匹配成功的文件句柄作為待解除占用的目標文件的句柄??蛇x的,所述枚舉系統打開的所有文件句柄包括枚舉系統的所有進程;犾取每一進程的私有句柄表;集合所有進程的私有句柄表,獲得所有進程打開的句柄;在所述所有進程打開的句柄中找出所有的文件句柄?!た蛇x的,所述枚舉系統的所有進程至少包括如下步驟通過遍歷活動進程鏈表中每一個進程在系統內核中所表示的數據結構,實現對活動進程的枚舉,獲得進程表??蛇x的,所述枚舉系統打開的所有文件句柄包括,獲取當前進程;獲取該當前進程的私有句柄表;遍歷該當前進程的私有句柄表與其它進程的私有句柄表形成的句柄表鏈,獲得其它進程;對所有獲得的進程獲取其私有句柄表;集合所獲取的私有句柄表,獲得所有進程打開的句柄;在所述所有進程打開的句柄中找出所有的文件句柄??蛇x的,所述在所述所有進程打開的句柄中找出所有的文件句柄包括通過內存偏移找到各進程打開的每一句柄的句柄對象的對象頭;在對象頭中讀取對象類型數據或者對象類型索引;根據對象頭中對象類型數據或者對象類型索引指向的對象類型數據判斷句柄類型;篩選出類型為文件句柄的句柄??蛇x的,將文件句柄對象由進程的句柄表中移除方式包括路徑擦除或路徑更改。根據本專利技術的另一方面,還提供一種用于解除文件占用的裝置,包括目標文件句柄獲取單元,用于獲取待解除占用的目標文件的所有文件句柄;進程句柄表獲取單元,用于獲取所述待解除占用的目標文件的所有文件句柄各自所屬的進程私有句柄表;文件句柄對象移除單元,用于將所述目標文件的所有文件句柄的文件句柄對象由各自的進程私有句柄表中移除;清零單元,用于將所述目標文件的所有文件句柄的文件句柄對象的引用計數從系統中清零??蛇x的,所述目標文件句柄獲取單元包括路徑獲取單元,用于獲取待解除占用的目標文件的路徑;文件句柄枚舉單元,用于枚舉系統打開的所有文件句柄;匹配單元,用于獲取所有文件句柄對應文件的具體路徑,并與待解除占用的目標文件的路徑進行匹配。可選的,所述文件句柄枚舉單元還包括進程枚舉單元,用于枚舉系統的所有進程;私有句柄枚舉單元,用于獲取進程的私有句柄表;私有句柄表集合單元,用于集合所有進程的私有句柄表,獲得所有進程打開的句柄;文件句柄篩選單元,用于在所述所有進程打開的句柄中找出所有的文件句柄。可選的,所述進程枚舉單元包括進程遍歷執行單元,用于遍歷活動進程鏈表中每一個進程在系統內核中所表示的·數據結構;存儲單元,用于存儲獲得的進程表。可選的,所述文件句柄枚舉單元包括指定單元,用于指定當前任一進程;私有句柄枚舉單元,用于獲取當前進程的私有句柄表;句柄表鏈遍歷執行單元,用于遍歷該當前進程的私有句柄表與其它進程的私有句柄表形成的句柄表鏈,獲得其它進程;私有句柄表合并單元,用于集合所獲取的私有句柄表,獲得所有進程打開的句柄;文件句柄篩選單元,用于在所述所有進程打開的句柄中找出所有的文件句柄??蛇x的,所述文件句柄篩選單元還包括對象頭確定單元;用于通過內存偏移找到各進程打開的每一句柄的句柄對象的對象頭;對象類型或類型索引讀取單元,用于在對象頭中讀取對象類型數據或者對象類型索引;判斷單元,用于根據對象頭中對象類型數據或者對象類型索引指向的對象類型數據判斷句柄類型;篩選單元,用于篩選出類型為文件句柄的句柄??蛇x的,所述文件句柄對象移除單元為文件路徑擦除單元或路徑更改單元。根據本專利技術提供的具體實施例,本專利技術公開了以下技術效果本專利技術的方法通過找到目標文件的文件句柄,并在句柄表中直接對文件句柄對象進行操作,將其由句柄表中移除,并將文件句柄對象的引用計數從系統中降為零,使得系統認為此對象已經沒有任何其它進程所引用;從而達到解除文件被進程占用的目的;相對于
技術介紹
中所述的解除文件占用的方法,本專利技術的方法不必復制句柄,從而也不存在調用ZwQueryInformationFile的線程被永久掛起的問題;其次,由于本專利技術的方法不必復制句柄,自然也不存在兩個句柄(復制句柄和原句柄)同時指向同一目標文件的問題,則不存在由于兩個進程中的某一個對文件進行操作而破壞打開文件正常運行的問題。上述說明僅是本專利技術技術方案的概述,為了能夠更清楚了解本專利技術的技術手段,而可依照說明書的內容予以實施,并且為了讓本專利技術的上述和其它目的、特征和優點能夠更明顯易懂,以下特舉本專利技術的具體實施方式。附圖說明通過閱讀下文優選實施方式的詳細描述,各種其他的優點和益處對于本領域普通技術人員將變得清楚明了。附圖僅用于示出優選實施方式的目的,而并不認為是對本專利技術的限制。而且在整個附圖中本文檔來自技高網...
【技術保護點】
一種用于解除文件占用的方法,包括:獲取待解除占用的目標文件的所有文件句柄;獲取所述待解除占用的目標文件的所有文件句柄各自所屬的進程私有句柄表;將所述目標文件的所有文件句柄的文件句柄對象由各自的進程私有句柄表中移除;將所述目標文件的所有文件句柄的文件句柄對象的引用計數從系統中清零。
【技術特征摘要】
1.一種用于解除文件占用的方法,包括 獲取待解除占用的目標文件的所有文件句柄; 獲取所述待解除占用的目標文件的所有文件句柄各自所屬的進程私有句柄表; 將所述目標文件的所有文件句柄的文件句柄對象由各自的進程私有句柄表中移除; 將所述目標文件的所有文件句柄的文件句柄對象的引用計數從系統中清零。2.根據權利要求I所述的用于解除文件占用的方法,所述獲取待解除占用的目標文件的所有文件句柄包括 獲取待解除占用的目標文件的路徑; 枚舉系統打開的所有文件句柄; 獲取所有文件句柄對應文件的具體路徑,并與待解除占用的目標文件的路徑進行匹配; 將匹配成功的文件句柄作為待解除占用的目標文件的句柄。3.根據權利要求2所述的用于解除文件占用的方法,所述枚舉系統打開的所有文件句柄包括 枚舉系統的所有進程; 獲取每一進程的私有句柄表; 集合所有進程的私有句柄表,獲得所有進程打開的句柄; 在所述所有進程打開的句柄中找出所有的文件句柄。4.根據權利要求3所述的用于解除文件占用的方法,所述枚舉系統的所有進程至少包括如下步驟 通過遍歷活動進程鏈表中每一個進程在系統內核中所表示的數據結構,實現對活動進程的枚舉,獲得進程表。5.根據權利要求2所述的用于解除文件占用的方法,所述枚舉系統打開的所有文件句柄包括, 獲取當前進程; 獲取該當如進程的私有句柄表; 遍歷該當前進程的私有句柄表與其它進程的私有句柄表形成的句柄表鏈,獲得其它進程; 對所有獲得的進程獲取其私有句柄表; 集合所獲取的私有句柄表,獲得所有進程打開的句柄; 在所述所有進程打開的句柄中找出所有的文件句柄。6.根據權利要求3或5所述的用于解除文件占用的方法,所述在所述所有進程打開的句柄中找出所有的文件句柄包括 通過內存偏移找到各進程打開的每一句柄的句柄對象的對象頭; 在對象頭中讀取對象類型數據或者對象類型索引; 根據對象頭中對象類型數據或者對象類型索引指向的對象類型數據判斷句柄類型; 篩選出類型為文件句柄的句柄。7.根據權利要求I所述的用于解除文件占用的方法,將文件句柄對象由進程的句柄表中移除方式包括路徑擦除或路徑更改。8.一種用于解除文件占用的裝置,包括 目標文件句柄獲取單元,用于獲取待解除占用的目標文件的所有文件句柄; 進程句柄表獲取單元,用于獲取...
【專利技術屬性】
技術研發人員:張輝,
申請(專利權)人:北京奇虎科技有限公司,奇智軟件北京有限公司,
類型:發明
國別省市:
還沒有人留言評論。發表了對其他瀏覽者有用的留言會獲得科技券。