專利名稱:一種hfs+文件系統數據恢復方法及裝置的制作方法
技術領域:
本發明涉及計算機應用技術領域,更具體地說,涉及一種HFS+文件系統數據恢復方法及裝置。
背景技術:
分層文件系統(Hierarchical File System, HFS)是蘋果機的Mac操作系統所使用的一種文件系統,Mac操作系統早期使用HFS文件系統,HFS+是HFS的升級版本,在HFS 的基礎上做了一些重要的改進,HFS+卷的組織結構如圖1所示。其中包括保留區域(Reservide),該區域數據為全0 ’卷頭(Volume Header),每個HFS+卷都必須有一個卷頭,卷頭內存儲著各種與卷相關的信息,如卷建立的日期和時間,卷內的文件數量等,還有卷的其他重要結構的存儲位置;備份卷頭(Alternate Volume Header),卷頭的備份;分配文件(Alternate File),用來描述一個分配快是被占用還是空閑;域溢出文件(Extents Overflow File),多于8個域的文件信息,超出的部分保存在這里;目錄文件(Catalog File),用來描述卷內的文件和目錄層次結構,它存儲著卷內所有文件和目錄的重要信息,目錄文件的B-樹(B-tree)結構可以快速而有效地在一個層次很多的大目錄中尋找目標文件;屬性文件(Attributes File),用來保存文件或目錄的附加信息;啟動文件(Startup File)。蘋果機用B-tree結構來對數據進行管理,用它作為索引,通過這個索引就可以找到我們需要的文件。B-tree是一種多路搜索樹,它必須滿足1、定義任意非葉子節點最多只有M個兒子,且M> 2 ;2、根節點的兒子數為[2,M] ;3、除根節點以外的非葉子節點的兒子數為[M/2,M] ;4、每個節點存放至少M/2-l(取上整)和至多M-I個關鍵字(至少2個關鍵字);5、非葉子節點的關鍵字個數=指向兒子的指針個數-1 ;6、非葉子節點的關鍵字 K[1],K[2],...K[M-1];且 K[i] <K[i+l] ;7、非葉子節點的指針P [1],P [2],. . .,P [M];其中P[l]指向關鍵字小于K[l]的子樹,Ρ[Μ]指向關鍵字大于Κ[Μ-1]的子樹,其他P[i]指向關鍵字屬于(K[i_l],K[i])的子樹;8、所有葉子節點位于同一層。B-tree文件被分割成固定大小的“節點(Node) ”每個節點中都包含相應的檔案項。每個檔案項由一個關鍵字(key)和一些數據組成。HFS+文件中,共有4種節點頭節點,圖節點,索引節點和葉節點。其中,索引節點和葉節點如圖2所示,索引節點用于索引其他的索引節點,或者索引葉節點,葉節點用于查找數據,節點的每個記錄項的內容格式是什么,要看這個節點是子節點還是葉子節點,且是屬于目錄文件還是域溢出文件等等。B-tree文件中的頭節點是B-tree的第一個節點,每棵B-tree有一個唯一的頭節點,結構如圖3所示,它包含B-tree中如何找到其他節點的信息,其中包括節點描述(Node Descriptor)、B_ 樹頭記錄(B-tree Header Record)、用戶數據記錄(User Data Record)、 B-樹地圖記錄(B-tree Map Record)、偏移至空余空間(Offset to Free Space)、偏移至記錄 2 (Offset to Record 幻、偏移至記錄 1 (Offset to Record 1)、偏移至記錄 0 (Offset to Record 0)。
現有的蘋果機系統中,當本來是HFS+文件系統分區被重新分區,或被重新格式化,或者分區表損壞無法識別分區,或者無法識別是什么格式的文件系統時,采用目前的各種數據恢復軟件均無法恢復之前HFS+文件系統中的文件,因此會導致用戶丟失重要文件 fn息ο
發明內容
本發明要解決的技術問題在于,針對現有技術的上述缺陷,提供一種HFS+文件系統數據恢復方法及裝置,采用該方法及裝置可恢復存儲介質中的HFS+格式文件。本發明解決其技術問題所采用的技術方案是構造一種HFS+文件系統數據恢復方法,其中,包括以下步驟A、以扇區為單位對存儲介質中的文件進行掃描;B、從被掃描文件中查找卷頭,如果查找到所述卷頭,執行步驟C,否則執行步驟A, 掃描下一扇區;C、根據頭節點的節點描述符中的各字段和頭檔案中的各字段,從所查找到的所述卷頭所對應的目錄文件中查找頭節點,如果查找到頭節點,則執行步驟F,否則執行步驟D ;D、判斷所述卷頭是否是備份卷頭,如果是備份卷頭,執行步驟E,否則執行步驟A, 掃描下一扇區;E、根據所述備份卷頭的位置逆推出所述卷頭的位置,再根據所述卷頭位置和備份卷頭的各個字段定位頭節點,如果定位到頭節點,則執行步驟F,否則執行步驟A,掃描下一扇區;F、遍歷所有定位到的頭節點中所包含的B-樹,得到其中的文件和目錄信息,恢復文件數據。本發明所述的HFS+文件系統數據恢復方法,其中,所述步驟B中,查找所述卷頭時,判斷文件的卷頭簽名,如果文件的卷頭簽名16進制為0x482b、且版本等于4,或者文件的卷頭簽名16進制為0x4858、且版本等于5,則為所述卷頭。本發明所述的HFS+文件系統數據恢復方法,其中,所述步驟B還包括以下步驟的任意一個或并列多個步驟Bi、判斷文件的卷屬性,如果所述卷屬性等于0x80002000或者等于 0x80000000,則為所述卷頭,執行步驟C,否則執行步驟A,掃描下一扇區;步驟B2、判斷文件的最后裝載版本,如果所述最后裝載版本16進制為0x484653^ 或者0x46534b21,則為所述卷頭,執行步驟C,否則執行步驟A,掃描下一扇區;步驟B3、判斷文件的創建日期,如果所述創建日期不等于0、且修改日期不等于0、 且校驗日期不等于0,則為所述卷頭,執行步驟C,否則執行步驟A,掃描下一扇區;步驟B4、判斷文件的分配塊大小,如果所述分配塊大小等于0x1000、且資源叉默認塊組大小等于0x10000、且數據叉默認塊組大小等于0x10000,則為所述卷頭,執行步驟 C,否則執行步驟A,掃描下一扇區;步驟B5、判斷文件中的分配文件、域溢出文件、目錄文件、屬性文件和啟動文件,如果所述分配文件、域溢出文件、目錄文件、屬性文件和啟動文件的邏輯大小等于分配塊大小乘以總塊數、且域描述符的分配塊數的總和等于總塊數。
本發明所述的HFS+文件系統數據恢復方法,其中,所述步驟C中,查找所述頭節點方法為判斷所述頭節點的節點描述符中的各字段和所述頭節點的頭檔案的各字段,如果所述頭節點的節點描述符中的上一個節點號等于0、節點類型等于1、節點高度等于0、檔案數等于3以及保留字段等于0,且所述頭節點的頭檔案的根節點號大于0且小于節點總數、 未使用節點數小于節點總數、第一個葉節點號小于節點總數、最后一個葉節點號以及小于節點總數,則認為是所述頭節點。本發明所述的HFS+文件系統數據恢復方法,其中,所述步驟C中,所述頭節點的頭檔案還需要滿足以下任意一個或多個條件節點大小介于512與32768之間;節點類型為0 ;樹最大高度大于0且小于16。本發明所述的HFS+文件系統數據恢復方法,其中,所述步驟F包括步驟F1、查找葉節點,從所述頭節點的開始偏移處讀出B-樹的每個節點,判斷所讀出節點的節點描述符的各字段,如果所讀出節點的節點描述符的節點類型等于-1、節點高度小于16、且保留字段等于0,則判斷為所述葉節點,執行步驟F2 ;F2、恢復文件數據,解析所述葉節點中記錄的檔案信息,分解出目錄檔案項和文件檔案項,根據所述文件檔案項中的數據叉記錄的位置信息和大小信息恢復文件。本發明所述的HFS+文件系統數據恢復方法,其中,所述步驟Fl中,查找所述葉節點還需滿足以下任意一個條件或兩個條件所讀出節點的節點描述符的下一個節點小于或等于頭節點的頭檔案的節點總數;所讀出節點的上一個節點號小于或等于頭節點的頭檔案的節點總數。本發明還提供了一種HFS+文件系統數據恢復裝置,包括扇區掃描模塊、卷頭查找模塊、頭節點查找模塊、備份卷頭判斷模塊、頭節點定位模塊和文件恢復模塊其中,所述扇區掃描模塊,用于以扇區為單位對存儲介質中的文件進行掃描;所述卷頭查找模塊,用于從被掃描文件中查找卷頭,如果查找到所述卷頭,則觸發所述頭節點查找模塊,查找頭節點,否則觸發所述扇區掃描模塊,繼續掃描下一扇區;所述頭節點查找模塊,用于根據頭節點的節點描述符中的各字段和頭檔案中的各字段,從所查找到的所述卷頭所對應的目錄文件中查找頭節點,如果定位到所述頭節點,則觸發所述文件恢復模塊,恢復文件數據,否則觸發所述備份卷頭判斷模塊,判斷卷頭是否是備份卷頭;所述備份卷頭判斷模塊,用于判斷所述卷頭是否是備份卷頭,如果查找到所述備份卷頭,則觸發所述頭節點定位模塊,定位頭節點,否則觸發所述扇區掃描模塊,繼續掃描下一扇區;所述頭節點定位模塊,用于根據所述備份卷頭的位置逆推出所述卷頭的位置,再根據所述卷頭位置和備份卷頭的各個字段定位頭節點,如果定位到所述頭節點,則觸發所述文件恢復模塊,恢復文件數據,否則觸發所述扇區掃描模塊,繼續掃描下一扇區;所述文件恢復模塊,用于遍歷所有定位到的頭節點中所包含的B-樹,得到其中的文件和目錄信息,恢復文件數據。本發明所述的HFS+文件系統數據恢復裝置,其中,所述卷頭查找模塊包括卷頭簽名判斷單元,用于在查找所述卷頭時,判斷文件的卷頭簽名,如果所述文件的卷頭簽名16進制為0x482b、且版本等于4,或者所述文件的卷頭簽名16進制為0x4858、 且版本等于5,則為所述卷頭。本發明所述的HFS+文件系統數據恢復裝置,其中,所述頭節點查找模塊包括頭節點判斷單元,用于判斷所述頭節點的節點描述符中的各字段和所述頭節點的頭檔案的各字段,如果所述頭節點的節點描述符中的上一個節點號等于0、節點類型等于 1、節點高度等于0、檔案數等于3以及保留字段等于0,且所述頭節點的頭檔案的根節點號大于0且小于節點總數、未使用節點數小于節點總數、第一個葉節點號小于節點總數、最后一個葉節點號以及小于節點總數,則認為是所述頭節點。本發明的有益效果在于通過掃描存儲介質中的文件,并查找到卷頭,再通過卷頭查找到頭節點,然后遍歷所有定位到的目錄文件頭節點中所包含的B-樹,得到其中的文件和目錄信息,恢復文件數據,采用這樣的數據恢復方式后,只要是存儲介質上曾經存在過 HFS+格式的文件系統,就有可能將其中的HFS+格式文件恢復出來,即使是已經被刪除的 HFS+格式文件也有可能會被恢復出來。
下面將結合附圖及實施例對本發明作進一步說明,附圖中圖1是現有技術中的HFS+卷的組織結構示意圖;圖2是現有技術中的B-樹文件中的索引節點和葉節點示意圖;圖3是現有技術中的B-樹文件中的頭節點示意圖;圖4是本發明較佳實施例的HFS+文件系統數據恢復方法流程;圖5是本發明較佳實施例的HFS+文件系統數據恢復方法中步驟S130流程圖;圖6是本發明較佳實施例的HFS+文件系統數據恢復裝置原理框圖;圖7是本發明較佳實施例的HFS+文件系統數據恢復裝置中卷頭查找模塊原理框圖。
具體實施例方式本發明較佳實施例的HFS+文件系統數據恢復方法流程如圖4所示,該方法SlOO 開始于步驟Sl 10。在步驟S120中,以扇區為單位對存儲介質中的文件進行掃描。HFS+格式的文件系統中,卷頭在存儲介質上的位置是以扇區為單位的,且卷頭的前兩個扇區為保留區域,所以以扇區為單位從存儲介質的第二個扇區開始對文件進行掃描,以查找文件的卷頭。在步驟S130中,從被掃描文件中查找卷頭,如果查找到卷頭,執行步驟S140,否則執行步驟S120,掃描下一扇區。由于文件的卷頭中包含有各種與卷相關的信息,如卷建立的日期和時間,卷內的文件數量等,還有卷的其他重要結構的存儲位置,因此找到卷頭之后, 可以根據卷頭中的信息來查找文件的頭節點,然后可以頭節點中的B-樹信息來做索引,通過這個索引既可定位到需要恢復的文件。
優選地,在上述步驟S130中,查找文件的卷頭時,主要判斷文件的卷頭簽名,如果文件的卷頭簽名(signature)等于“H+”,16進制為0x482b、且版本等于4,或者文件的卷頭簽名16進制為0x4858、且版本等于5,則為卷頭。更優選地,如圖5所示,步驟S130除了包括步驟S131,即判斷卷頭簽名16進制是否為0x482b、且版本等于4,或者文件的卷頭簽名16進制是否為0x4858、且版本等于5之外,還進一步包括步驟S132、S133、S134、S135、S136中的一步或多步,即進一步判斷文件的下述各項中的一種或多種是否滿足條件,包括卷屬性、最后裝載版本、創建日期、分配塊大小,或者同時判斷卷頭中分配文件、域溢出文件、目錄文件、屬性文件和啟動文件的邏輯大對上述各項的判斷條件如下在步驟S132中,判斷文件的卷屬性,如果卷屬性(attributes)等于0x80002000 或者等于0x80000000,則為卷頭,否則舍棄;在步驟S133中,判斷文件的最后裝載版本,如果最后裝載版本(last Mounted Version)等于“HFSJ”(16 進制為 0x484653^),或者等于“FSK ! ”(16 進制為 0x46534b21), 則為卷頭,否則舍棄;在步驟S134中,判斷文件的創建日期,如果創建日期(create Date)不等于0、修改日期(modify Date)不等于0、且校驗日期(check Data)不等于0,則為卷頭,否則舍棄;在步驟S135中,判斷文件的分配塊大小,如果分配塊大小(block Size)等于 0x1000、且資源叉默認塊組大小(rsrc Clump Size)等于0x10000、且數據叉默認塊組大小 (data ClumpSize)等于0x10000,則為卷頭,否則舍棄;在步驟S136中,判斷卷頭中的分配文件、域溢出文件、目錄文件、屬性文件和啟動文件,由于這些文件都使用的是叉數據結構(HFS Plus Fork Data結構),如果卷頭中的分配文件、域溢出文件、目錄文件、屬性文件和啟動文件均滿足邏輯大小(logical Size)等于分配塊大小乘以總塊數(total Blocks)且域描述符(HFS Plus Extent Descriptor)的分配塊數(block Count)的總和要等于總塊數(total Blocks)。當包括步驟S132、S133、S134、S135、S136中的兩步以上時,每一步驟的執行可與判斷文件的卷頭簽名過程同時進行,相互之間沒有時間先后順序,可按照技術人員的需求自定義。當然,對卷頭的約束條件越多,所得到的卷頭也越準確,當同時判斷上述所有項,則可能得到文件中的所有卷頭。因此,在步驟S137中,可以設置為當S132、S133、S134、S135、S136中有一個判斷結果為是時,則確定為卷頭,執行步驟S140 ;還可將步驟S137設定為,當步驟S132、S133、 S134、S135、S136中所有判斷結果均為是時,才確定為卷頭,執行步驟S140,否則執行步驟 S120。或者是根據需要設定的其他條件,而不應局限于圖5中所示的步驟。在步驟S140中,根據頭節點的節點描述符中的各字段和頭檔案中的各字段,從所查找到的卷頭所對應的目錄文件中查找頭節點,如果查找到頭節點,則執行步驟S170,否則執行步驟S150。具體地,頭節點中的節點描述符(BT Node Descriptor)的各字段必須同時滿足下列條件(1-1)、上一個節點號(b Link)等于 0 ;
(1-2)、節點類型(kind)等于 1 ;(1-3)、節點高度(height)等于 0 ;(1-4)、檔案數(num Records)等于 3 ;(1-5)、保留字段(Reserved)等于 0。頭節點的頭檔案(BT Header Rec)的各字段必須同時滿足下列條件(2-1)、根節點號(root Node)大于0且小于節點總數(total Nodes);(2-2)、未使用節點數(free Nodes)小于節點總數(total Nodes);(2-3)、第一個葉節點號(first Leaf Node)小于節點總數(total Nodes);(2-4)、最后一個葉節點號(last Leaf Node)小于節點總數(total Nodes)。當頭節點的節點描述符中的各字段和頭檔案中的各字段滿足上述條件時,則認為是頭節點,執行步驟S170,否則執行步驟S150。進一步地,頭節點的頭檔案還需要滿足以下條件0-5)、節點大小(node Size),用字節表示必須是2的整數次冪,介于512與32768 之間;(2-6)、節點類型(btree Type)為 0 ;(2-7)、樹最大高度(tree Depth)大于0且小于16。可以根據需要設定當頭節點的節點描述符中的各字段滿足條件(1-1)、(1-2)、 (1-3)、(1-4)、(1-5),且頭檔案中的各字段滿足(2-1)、(2-2)、(2-3)、(2-4)、(2-5)、(2-6)、 (2-7)時,才則認為是頭節點,執行步驟S170,否則執行步驟S150。這樣可以保證頭節點判斷更加準確,以確保所恢復數據的完整性。在步驟S150中,判斷所查找的卷頭是否是備份卷頭,如果是備份卷頭,執行步驟 S160,否則執行步驟S120,掃描下一扇區。其中,判斷是否為備份卷頭的方法是,判斷所查找的卷頭的最后裝載版本,如果卷頭的最后裝載版本等于“ 10. 0”,16進制為0x31302e30,則為備份卷頭。在步驟S160中,根據備份卷頭的位置逆推出卷頭的位置,再根據卷頭位置和備份卷頭的各個字段定位頭節點,如果定位到頭節點,則執行步驟S170,否則執行步驟S120,掃描下一扇區。備份卷頭是卷頭的副本,當卷的總大小正好是分配塊大小(block Size)的整數倍時,卷的總大小等于卷頭/備份卷頭的分配塊總數(total Blocks)乘以卷頭/備份卷頭的分配塊大小(block Size)。而當卷大小不是分配塊大小(block Size)的整數倍時,則分配塊總數(total Blocks)記錄的塊數就不包含尾部多出的不夠一個分配塊的空間。所以可以從備份卷頭逆推卷頭的位置,但是存在分配塊大小(block Size)除去512(—個扇區的大小,因為分配塊大小一定是扇區大小的整數倍,卷大小也一定是扇區大小的整數倍) 個扇區的偏差。則先假設卷的大小為分配塊的整數倍,逆推出卷頭的位置,根據卷頭位置和備份卷頭的各個字段,定位到目錄文件的頭節點,發現這個頭節點定位正確,則證明所逆推的卷頭正確。如若不正確,則試著用原逆推的位置每次減去一個扇區,再來定位目錄文件的頭節點,直到定位的頭節點是正確的,或者減分配塊大小(block Size)除去512個扇區的次數。 找到成對的卷頭和備份卷頭就可以確認卷頭了,而不成對的卷頭和備份卷頭可能是被損壞或者非卷頭。
在步驟S170中,遍歷所有定位到的目錄文件頭節點中所包含的B-樹,得到其中的文件和目錄信息,恢復文件數據。頭節點的開始偏移就是B-tree的開始偏移,從頭節點的節點大小(node Size)得知每個節點的大小,節點總數(total Nodes)得知節點的總數,則從頭節點的開始偏移處將每個節點讀取出來,節點可能會是索引節點也可能是葉節點或者唯一的頭節點,這三種節點都有一個節點描述符(BT Node Descriptor)結構。具體包括a、查找葉節點,從頭節點的開始偏移處讀出B-樹的每個節點,判斷所讀出節點的節點描述符的各字段,如果所讀出節點的節點描述符的節點類型等于-1、節點高度小于16、且保留字段等于0,則判斷為葉節點,執行步驟b ;b、恢復文件數據,解析葉節點中記錄的檔案信息,分解出目錄檔案項(HFS Plus Catalog Folder)和文件檔案項(HFS Plus Catalog File),根據文件檔案項中的數據叉 (data Fork)記錄的位置信息和大小信息,恢復文件。優選地,上述步驟a中,查找葉節點還需滿足條件為所讀出節點的節點描述符的下一個節點小于或等于頭節點的頭檔案的節點總數。或者更進一步的包括判斷所讀出節點的上一個節點號,如果所讀出節點的上一個節點號小于或等于頭節點的頭檔案的節點總數。上述方法S100結束于步驟S180。在本發明的另一實施例中,還提供了一種HFS+文件系統數據恢復裝置,如圖6所示,包括扇區掃描模塊10、卷頭查找模塊20、頭節點查找模塊30、備份卷頭判斷模塊40、頭節點定位模塊50和文件恢復模塊60。其中,扇區掃描模塊10,用于以扇區為單位對存儲介質中的文件進行掃描,HFS+格式的文件系統中,卷頭在存儲介質上的位置是以扇區為單位的,且卷頭的前兩個扇區為保留區域,所以以扇區為單位從存儲介質的第二個扇區開始對文件進行掃描,以查找文件的卷頭。卷頭查找模塊20,用于從被掃描文件中查找卷頭,如果查找到卷頭,則觸發頭節點查找模塊30,查找頭節點,否則觸發扇區掃描模塊10,繼續掃描下一扇區。由于文件的卷頭中包含有各種與卷相關的信息,如卷建立的日期和時間,卷內的文件數量等,還有卷的其他重要結構的存儲位置,因此找到卷頭之后,可以根據卷頭中的信息來查找文件的頭節點,然后可以頭節點中的B-樹信息來做索引,通過這個索引既可定位到需要恢復的文件。頭節點查找模塊30,用于根據頭節點的節點描述符中的各字段和頭檔案中的各字段,從所查找到的卷頭所對應的目錄文件中查找頭節點。如果定位到頭節點,則觸發文件恢復模塊60,恢復文件數據,否則觸發備份卷頭判斷模塊40,判斷卷頭是否是備份卷頭。備份卷頭判斷模塊40,用于判斷卷頭是否是備份卷頭。其中,判斷是否為備份卷頭的方法是,判斷所查找的卷頭的最后裝載版本,如果卷頭的最后裝載版本等于“ 10. 0”,16 進制為0x3130^30,則為備份卷頭。如果查找到備份卷頭,則觸發頭節點定位模塊50,定位頭節點,否則觸發扇區掃描模塊10,繼續掃描下一扇區。頭節點定位模塊50,用于根據備份卷頭的位置逆推出卷頭的位置,再根據卷頭位置和備份卷頭的各個字段定位頭節點。如果定位到頭節點,則觸發文件恢復模塊60,恢復文件數據,否則觸發扇區掃描模塊10,繼續掃描下一扇區。由于備份卷頭是卷頭的副本,當卷的總大小正好是分配塊大小(block Size)的整數倍時,卷的總大小等于卷頭/備份卷頭的分配塊總數(total Blocks)乘以卷頭/備份卷頭的分配塊大小(block Size)。而當卷大小不是分配塊大小(block Size)的整數倍時,則分配塊總數(total Blocks)記錄的塊數就不包含尾部多出的不夠一個分配塊的空間。所以可以從備份卷頭逆推卷頭的位置,但是存在分配塊大小(block Size)除去512(—個扇區的大小,因為分配塊大小一定是扇區大小的整數倍,卷大小也一定是扇區大小的整數倍)個扇區的偏差。文件恢復模塊60,用于遍歷所有定位到的頭節點中所包含的B-樹,得到其中的文件和目錄信息,恢復文件數據。頭節點的開始偏移就是B-tree的開始偏移,從頭節點的節點大小(node Size)得知每個節點的大小,節點總數(total Nodes)得知節點的總數,則從頭節點的開始偏移處將每個節點讀取出來,節點可能會是索引節點也可能是葉節點或者唯一的頭節點,這三種節點都有一個節點描述符(BT Node Descriptor)結構。具體包括a、查找葉節點,從頭節點的開始偏移處讀出B-樹的每個節點,判斷所讀出節點的節點描述符的各字段,如果所讀出節點的節點描述符的節點類型等于-1、節點高度小于16、且保留字段等于0,則判斷為葉節點,執行步驟b ;b、恢復文件數據,解析葉節點中記錄的檔案信息,分解出目錄檔案項(HFSPlus Catalog Folder)和文件檔案項(HFS Plus Catalog File),根據文件檔案項中的數據叉 (data Fork)記錄的位置信息和大小信息,恢復文件。優選地,上述步驟a中,查找葉節點還需滿足條件為所讀出節點的節點描述符的下一個節點小于或等于頭節點的頭檔案的節點總數。或者更進一步的包括判斷所讀出節點的上一個節點號,如果所讀出節點的上一個節點號小于或等于頭節點的頭檔案的節點總數。在進一步的實施例中,如圖7所示,上述HFS+文件系統數據恢復裝置的卷頭查找模塊20包括卷頭簽名判斷單元21,用于在查找卷頭時,判斷文件的卷頭簽名,如果文件的卷頭簽名16進制為0x482b、且版本等于4,或者文件的卷頭簽名16進制為0x4858、且版本等于5,則為卷頭。在更進一步的實施例中,如圖7所示,上述卷頭查找模塊20還包括卷屬性判斷單元22、最后裝載版本判斷單元23、創建日期判斷單元M、分配塊大小判斷單元25以及文件邏輯大小判斷單元26中的個或多個。分別用于進一步的判斷文件的下述各項是否滿足條件,包括卷屬性、最后裝載版本、創建日期、分配塊大小,或者同時判斷卷頭中分配文件、域溢出文件、目錄文件、屬性文件和啟動文件的邏輯大小。其中,卷屬性判斷單元22,用于判斷文件的卷屬性,如果卷屬性(attributes)等于0x80002000或者等于0x80000000,則為卷頭,否則舍棄;最后裝載版本判斷單元23,用于判斷文件的最后裝載版本,如果最后裝載版本(last Mounted Version)等于“HFSJ”(16 進制為0x484653^),或者等于“FSK !,,(16進制為0x46534b21),則為卷頭,否則舍棄;創建日期判斷單元對,用于判斷文件的創建日期,如果創建日期(create Date)不等于0、修改日期(modify Date)不等于0、且校驗日期(check Data)不等于0,則為卷頭,否則舍棄; 分配塊大小判斷單元25,用于判斷文件的分配塊大小,如果分配塊大小(block Size)等于 0x1000、且資源叉默認塊組大小(rsrc Clump Size)等于0x10000、且數據叉默認塊組大小 (data ClumpSize)等于0x10000,則為卷頭,否則舍棄;文件邏輯大小判斷單元沈,用于判斷卷頭中的分配文件、域溢出文件、目錄文件、屬性文件和啟動文件,由于這些文件都使用的是叉數據結構(HFS Plus Fork Data結構),如果卷頭中的分配文件、域溢出文件、目錄文件、屬性文件和啟動文件均滿足邏輯大小(logical Size)等于分配塊大小乘以總塊數 (total Blocks)且域描述符(HFS Plus Extent Descriptor)的分配塊數(block Count) 的總和要等于總塊數(total Blocks)。當卷頭查找模塊20包括卷屬性判斷單元22、最后裝載版本判斷單元23、創建日期判斷單元M、分配塊大小判斷單元25以及文件邏輯大小判斷單元沈中的兩個以上時,各個單元的執行可與卷頭簽名判斷單元同步,相互之間沒有時間先后順序,可按照技術人員的需求自定義。當然,對卷頭的約束條件越多,所得到的卷頭也越準確,當同時判斷上述所有項,則可能得到文件中的所有卷頭。在進一步的實施例中,上述HFS+文件系統數據恢復裝置的頭節點查找模塊30包括頭節點判斷單元,用于判斷頭節點的節點描述符中的各字段和頭節點的頭檔案的各字段,如果頭節點的節點描述符中的上一個節點號等于0、節點類型等于1、節點高度等于0、 檔案數等于3以及保留字段等于0 ;且頭節點的頭檔案的根節點號大于0且小于節點總數、 未使用節點數小于節點總數、第一個葉節點號小于節點總數、最后一個葉節點號以及小于節點總數,則認為是頭節點。在更進一步的實施例中,上述頭節點判斷單元還進一步用于判斷節點大小(node Size),用字節表示必須是2的整數次冪,是否介于512與32768之間;節點類型(btree Type)是否為0 ;樹最大高度(tree Depth)是否大于0且小于16。以保證頭節點判斷更加準確,確保所恢復數據的完整性。本發明的HFS+文件系統數據恢復方法及裝置,通過掃描存儲介質中的文件,并查找到卷頭,再通過卷頭查找到頭節點,然后遍歷所有定位到的目錄文件頭節點中所包含的B-樹,得到其中的文件和目錄信息,恢復文件數據,采用這樣的數據恢復方式后,只要是存儲介質上曾經存在過HFS+格式的文件系統,就有可能將其中的HFS+ 格式文件恢復出來,即使是已經被刪除的HFS+格式文件也有可能會被恢復出來。解決了現有技術中由于某些原因導致無法識別是什么格式的文件系統,或者誤操作格式化為其他文件系統等原因,導致本來是HFS+文件系統的存儲介質,已經無法被識別的問題。應當理解的是,對本領域普通技術人員來說,可以根據上述說明加以改進或變換, 而所有這些改進和變換都應屬于本發明所附權利要求的保護范圍。
權利要求
1.一種HFS+文件系統數據恢復方法,其特征在于,包括以下步驟A、以扇區為單位對存儲介質中的文件進行掃描;B、從被掃描文件中查找卷頭,如果查找到所述卷頭,執行步驟C,否則執行步驟A,掃描下一扇區;C、根據頭節點的節點描述符中的各字段和頭檔案中的各字段,從所查找到的所述卷頭所對應的目錄文件中查找頭節點,如果查找到頭節點,則執行步驟F,否則執行步驟D ;D、判斷所述卷頭是否是備份卷頭,如果是備份卷頭,執行步驟E,否則執行步驟A,掃描下一扇區;E、根據所述備份卷頭的位置逆推出所述卷頭的位置,再根據所述卷頭位置和備份卷頭的各個字段定位頭節點,如果定位到頭節點,則執行步驟F,否則執行步驟A,掃描下一扇區;F、遍歷所有定位到的頭節點中所包含的B-樹,得到其中的文件和目錄信息,恢復文件數據。
2.根據權利要求1所述的HFS+文件系統數據恢復方法,其特征在于,所述步驟B中,查找所述卷頭時,判斷文件的卷頭簽名,如果所述文件的卷頭簽名16進制為0x482b、且版本等于4,或者所述文件的卷頭簽名16進制為0x4858、且版本等于5,則為所述卷頭。
3.根據權利要求2所述的HFS+文件系統數據恢復方法,其特征在于,所述步驟B還包括以下步驟的任意一個或并列多個步驟Bi、判斷文件的卷屬性,如果所述卷屬性等于0x80002000或者等于0x80000000, 則為所述卷頭,執行步驟C,否則執行步驟A,掃描下一扇區;步驟B2、判斷文件的最后裝載版本,如果所述最后裝載版本16進制為0x484653^或者 0x46534b21,則為所述卷頭,執行步驟C,否則執行步驟A,掃描下一扇區;步驟B3、判斷文件的創建日期,如果所述創建日期不等于0、且修改日期不等于0、且校驗日期不等于0,則為所述卷頭,執行步驟C,否則執行步驟A,掃描下一扇區;步驟B4、判斷文件的分配塊大小,如果所述分配塊大小等于0x1000、且資源叉默認塊組大小等于0x10000、且數據叉默認塊組大小等于0x10000,則為所述卷頭,執行步驟C,否則執行步驟A,掃描下一扇區;步驟B5、判斷文件中的分配文件、域溢出文件、目錄文件、屬性文件和啟動文件,如果所述分配文件、域溢出文件、目錄文件、屬性文件和啟動文件的邏輯大小等于分配塊大小乘以總塊數、且域描述符的分配塊數的總和等于總塊數。
4.根據權利要求1所述的HFS+文件系統數據恢復方法,其特征在于,所述步驟C中,查找所述頭節點方法為判斷所述頭節點的節點描述符中的各字段和所述頭節點的頭檔案的各字段,如果所述頭節點的節點描述符中的上一個節點號等于0、節點類型等于1、節點高度等于0、檔案數等于3以及保留字段等于0 ;且所述頭節點的頭檔案的根節點號大于0且小于節點總數、未使用節點數小于節點總數、第一個葉節點號小于節點總數、最后一個葉節點號以及小于節點總數,則認為是所述頭節點。
5.根據權利要求4所述的HFS+文件系統數據恢復方法,其特征在于,所述步驟C中,所述頭節點的頭檔案還需要滿足以下任意一個或多個條件節點大小介于512與32768之間;節點類型為0 ;樹最大高度大于0且小于16。
6.根據權利要求1所述的HFS+文件系統數據恢復方法,其特征在于,所述步驟F包括步驟F1、查找葉節點,從所述頭節點的開始偏移處讀出B-樹的每個節點,判斷所讀出節點的節點描述符的各字段,如果所讀出節點的節點描述符的節點類型等于-1、節點高度小于 16、且保留字段等于0,則判斷為所述葉節點,執行步驟F2;F2、恢復文件數據,解析所述葉節點中記錄的檔案信息,分解出目錄檔案項和文件檔案項,根據所述文件檔案項中的數據叉記錄的位置信息和大小信息恢復文件。
7.根據權利要求6所述的HFS+文件系統數據恢復方法,其特征在于,所述步驟Fl中, 查找所述葉節點還需滿足以下任意一個條件或兩個條件所讀出節點的節點描述符的下一個節點小于或等于頭節點的頭檔案的節點總數;所讀出節點的上一個節點號小于或等于頭節點的頭檔案的節點總數。
8.—種HFS+文件系統數據恢復裝置,其特征在于,包括扇區掃描模塊、卷頭查找模塊、 頭節點查找模塊、備份卷頭判斷模塊、頭節點定位模塊和文件恢復模塊其中,所述扇區掃描模塊,用于以扇區為單位對存儲介質中的文件進行掃描;所述卷頭查找模塊,用于從被掃描文件中查找卷頭,如果查找到所述卷頭,則觸發所述頭節點查找模塊,查找頭節點,否則觸發所述扇區掃描模塊,繼續掃描下一扇區;所述頭節點查找模塊,用于根據頭節點的節點描述符中的各字段和頭檔案中的各字段,從所查找到的所述卷頭所對應的目錄文件中查找頭節點,如果定位到所述頭節點,則觸發所述文件恢復模塊,恢復文件數據,否則觸發所述備份卷頭判斷模塊,判斷卷頭是否是備份卷頭;所述備份卷頭判斷模塊,用于判斷所述卷頭是否是備份卷頭,如果查找到所述備份卷頭,則觸發所述頭節點定位模塊,定位頭節點,否則觸發所述扇區掃描模塊,繼續掃描下一扇區;所述頭節點定位模塊,用于根據所述備份卷頭的位置逆推出所述卷頭的位置,再根據所述卷頭位置和備份卷頭的各個字段定位頭節點,如果定位到所述頭節點,則觸發所述文件恢復模塊,恢復文件數據,否則觸發所述扇區掃描模塊,繼續掃描下一扇區;所述文件恢復模塊,用于遍歷所有定位到的頭節點中所包含的B-樹,得到其中的文件和目錄信息,恢復文件數據。
9.根據權利要求8所述的HFS+文件系統數據恢復裝置,其特征在于,所述卷頭查找模塊包括卷頭簽名判斷單元,用于在查找所述卷頭時,判斷文件的卷頭簽名,如果所述文件的卷頭簽名16進制為0x482b、且版本等于4,或者所述文件的卷頭簽名16進制為0x4858、且版本等于5,則為所述卷頭。
10.根據權利要求8所述的HFS+文件系統數據恢復裝置,其特征在于,所述頭節點查找模塊包括頭節點判斷單元,用于判斷所述頭節點的節點描述符中的各字段和所述頭節點的頭檔案的各字段,如果所述頭節點的節點描述符中的上一個節點號等于0、節點類型等于1、節點高度等于0、檔案數等于3以及保留字段等于0,且所述頭節點的頭檔案的根節點號大于0 且小于節點總數、未使用節點數小于節點總數、第一個葉節點號小于節點總數、最后一個葉節點號以及小于節點總數,則認為是所述頭節點。
全文摘要
本發明涉及一種HFS+文件系統數據恢復方法及裝置,方法包括以下步驟A、以扇區為單位對存儲介質中的文件進行掃描;B、從被掃描文件中查找卷頭,如果查找到卷頭,執行步驟C,否則執行步驟A,掃描下一扇區;C、從所查找到的卷頭所對應的目錄文件中查找頭節點,如果查找到頭節點,則執行步驟F,否則執行步驟D;D、判斷所查找的卷頭是否是備份卷頭,如果是備份卷頭,執行步驟E,否則執行步驟A,掃描下一扇區;E、定位頭節點,如果定位到頭節點,則執行步驟F,否則執行步驟A,掃描下一扇區;F、遍歷所有定位到的頭節點中所包含的B-樹,恢復文件數據。采用上述方法可以恢復存儲介質上曾經存在過的HFS+格式文件系統中的文件。
文檔編號G06F17/30GK102289526SQ20111029336
公開日2011年12月21日 申請日期2011年9月29日 優先權日2011年9月29日
發明者范佳填 申請人:深圳市萬興軟件有限公司