中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
深入解析NTFS文件系統(tǒng)

NTFS 結(jié)構(gòu)說明


關(guān)鍵字:Windows NT NTFS 文件系統(tǒng) MFT


在Windows NT?中,Microsoft使用了一種新型的文件系統(tǒng)NTFS,它針對FAT/FAT32文件系統(tǒng)安全性差、容易產(chǎn)生碎片、難以恢復(fù)等缺點作了重大改進,使得系統(tǒng)總能保持較好的性能。不過使用NTFS的分區(qū)只能被Windows NT?系統(tǒng)識別和操作,而且它的結(jié)構(gòu)是Microsoft的內(nèi)部機密,沒有任何官方文檔。因此給各位需要在非Windows NT?環(huán)境讀寫NTFS分區(qū)的編程人員帶來了巨大不便。不過好在還有很多人在研究分析它,現(xiàn)在結(jié)合網(wǎng)上搞到的一些資料和我自己的分析對NTFS作一個說明(可惜還是有很多東西沒能搞明白)。


一、 概述


在NTFS中一改FAT/FAT32中將文件分配表等系統(tǒng)數(shù)據(jù)放在分區(qū)最前面,然后接著才是數(shù)據(jù)區(qū)的做法,把所有的信息都組織起來以文件的形式存放,包括扇區(qū)分配表,引導(dǎo)記錄等數(shù)據(jù)都是作為文件存在于磁盤中。其中只有$Boot(分區(qū)引導(dǎo)記錄)文件的位置是固定存放在分區(qū)首部,其他的文件都可以隨意存在于分區(qū)中的任何一個位置。這樣使得對所有數(shù)據(jù)的讀寫都有一個較為統(tǒng)一的方法,而且使得改變分區(qū)的尺寸和碎片整理變得非常容易。


在NTFS分區(qū)中,存儲分區(qū)信息的文件被稱為系統(tǒng)文件。在每個NTFS分區(qū)中都有十個這樣的系統(tǒng)文件,它們分別是:


$MFT


$MFTMirr


$LogFile


$Volume


$AttrDef


. (分區(qū)根目錄)


$Bitmap


$Boot


$BadClus


$Secure


$UpCase


$Extend


下面分別對每個系統(tǒng)文件的作用及所保存的信息作一個說明:


$MFT(Master File Table)文件。這個文件是NTFS分區(qū)中最重要的文件,它記錄了分區(qū)中所有文件(包括$MFT自身)的基本信息。通過$MFT就可以訪問分區(qū)中的所有文件和系統(tǒng)數(shù)據(jù)。$MFT由多個MFT記錄單元組成,每一個文件的描述占用一到多個(一個不夠的情況下)$MFT記錄單元。其中前十二個記錄單元中記錄著上面的十二個系統(tǒng)文件的信息。每個記錄單元記錄著文件的建立時間、在分區(qū)中的位置、長度、屬性、文件名等信息。信息在MFT單元中用各種屬性來表示,不同的屬性代表著不同的信息,而文件或目錄中的內(nèi)容則表現(xiàn)為屬性中的外部或內(nèi)部(取決于數(shù)據(jù)的長度)附加數(shù)據(jù)。其記錄格式見下面的MFT格式說明。


$MFTMirr(Mirror of Master File Table) 文件。這個文件是$MFT文件的一個備份,它保存著$MFT文件前4個記錄單元的信息。格式同$MFT。


$LogFile文件。記錄中對分區(qū)的操作的日志信息。(日志記錄具體格式不明)


$Volume文件。保存著分區(qū)建立時間,分區(qū)版本等信息。


$AttrDef文件。記錄的MFT單元中的屬性的基本信息,包括屬性的名字,最大最小尺寸等


. (分區(qū)根目錄)文件。作用同F(xiàn)AT/FAT32中的根目錄,但記錄格式有所變化。關(guān)于記錄格式的描述請參考目錄項存儲區(qū)格式。


$Bitmap文件。記錄著分區(qū)中存儲單元(簇)使用狀況。類似于FAT/FAT32中的FAT表,但不以索引的形式記錄,而是每一個Bit表示一個簇。其值為1表示該簇已被使用,為0則表示空閑。


$Boot文件。NTFS分區(qū)的引導(dǎo)記錄。在NTFS分區(qū)引導(dǎo)系統(tǒng)時負責將NTLDR裝入內(nèi)存并將控制權(quán)交給它。其中記錄著分區(qū)的總扇區(qū)數(shù),分區(qū)中每個存儲單元(簇)包含的扇區(qū)數(shù),$MFT所在的簇的簇號,$MFTMirr所在的簇的簇號和分區(qū)引導(dǎo)例程等重要信息。其格式見后面的$Boot文件格式說明。注意:在NTFS分區(qū)中$Boot文件的位置固定在分區(qū)開始處。


$BadClus文件。似乎是記錄著分區(qū)中有效(可以正常使用)的簇的個數(shù)和分區(qū)有效容量(以字節(jié)為單位)。因為我手里沒有有壞道的硬盤,所以不敢肯定。


$Secure文件。就其名而言似乎是系統(tǒng)安全描述,不過沒有研究過。


$UpCase文件。Unicode編碼下的大寫字母表(?)。


$Extend文件。用于和HPFS兼容的信息(?)。


二、 讀寫操作流程


在非NT的系統(tǒng)中對NTFS分區(qū)中的文件進行自由的讀寫操作才是我們研究NTFS分區(qū)格式的最終目標。下面我就對整個讀操作的流程來一個說明:


首先從硬盤的分區(qū)表中計算出分區(qū)開始的位置,再讀取分區(qū)數(shù)據(jù)區(qū)中的第一個扇區(qū)($Boot文件的第一個扇區(qū))從中取得隱藏扇區(qū)數(shù)目,$MFT開始的簇號,每簇扇區(qū)數(shù),每個MFT記錄的尺寸。通過這些數(shù)據(jù)計算出$MFT所在的位置,讀取第一個MFT記錄,然后按照記錄中描述的$MFT文件的存放位置讀出文件名為“.”的MFT記錄(根目錄文件)。然后在該記錄中搜索要求的目錄項。找到以后,獲得它的描述在$MFT中的索引,再在其中尋找下級目錄的索引……直到找到為止。


三、 改變分區(qū)尺寸操作流程


NTFS分區(qū)的尺寸只與四個記錄有關(guān):


1、$Boot文件的第一個扇區(qū)中的分區(qū)扇區(qū)數(shù)。


2、分區(qū)最后一個扇區(qū)中的$Boot文件第一扇區(qū)的備份。


3、系統(tǒng)文件$Bitmap的尺寸。


4、系統(tǒng)文件$BadClus中的有效簇描述。


因此修改NTFS分區(qū)的尺寸就比修改FAT/FAT32分區(qū)的尺寸要容易得多。只需要改變前兩處的分區(qū)扇區(qū)數(shù),再調(diào)整$Bitmap文件的尺寸即可。因為前兩處的修改十分容易,這里就只講解一下如何修改后兩處。


首先在$MFT文件中找到分區(qū)根目錄的位置,讀取根目錄記錄,從中找到$Bitmap文件所在的項,修改其占用的存儲器空間和實際尺寸并保存。然后按照該項的描述讀出$MFT中描述$Bitmap文件的記錄,修改其文件屬性中的VCN結(jié)束段的索引號、占用空間數(shù)、數(shù)據(jù)尺寸、有效數(shù)據(jù)尺寸并適當?shù)卦?減$Bitmap文件的數(shù)據(jù)流描述,如需要的話還要調(diào)整它的$Ddata屬性的尺寸。再修改$Bitmap文件的內(nèi)容以標志出文件中新添/縮減的簇。


其次是修改$BadClus文件中第二個$Data屬性中的VCN結(jié)束段索引、占用空間數(shù)、數(shù)據(jù)尺寸、有效數(shù)據(jù)尺寸及數(shù)據(jù)流描述。但要注意!在$BadClus文件中記錄的是整個分區(qū)中沒有問題的簇數(shù)及其描述,與$Bitmap文件中修改的值不同。


然后……天下太平了。


記錄格式說明


一、 MFT記錄頭


偏移地址占用字節(jié)數(shù)描述


0H4MFT記錄標志,ASCII字符串:“FILE”


4H2修正值的偏移地址(關(guān)于修正值請參考修正值技術(shù))


6H2修正值個數(shù)+1 S


10H2序列號(?)


12H2鏈接計數(shù)(?)


14H2屬性數(shù)據(jù)的偏移地址


16H2(1?)數(shù)據(jù)標志,Bit0為1表示有外部數(shù)據(jù),Bit1為1表示當前記錄是一個目錄項


18H4本MFT記錄用到的存儲空間(包括記錄頭和數(shù)據(jù))


1CH4本MFT記錄占用的存儲空間


20H8(?)如果本MFT記錄是從MFT記錄,則存放主MFT記錄在$MFT中的位置,否則為0


28H2不一個自由屬性的ID(?)


2AHS*2修正值表


二、 屬性記錄頭


偏移地址占用字節(jié)數(shù)描述


0H4屬性類型,關(guān)于屬性類型請參考屬性類型描述


4H2本記錄尺寸


8H1外部數(shù)據(jù)標志,為0則表示數(shù)據(jù)是內(nèi)部數(shù)據(jù),就根在記錄頭后面,為1則表示屬性數(shù)據(jù)是外部數(shù)據(jù),需要另外讀取


9H1記錄名(如果有的話)或內(nèi)部數(shù)據(jù)尺寸


0AH2記錄名(如果有的話)或內(nèi)部數(shù)據(jù)相對于記錄開始位置的偏移地址


0CH2壓縮標志,為1表示文件被壓縮


0EH2屬性ID(?)


對于內(nèi)部數(shù)據(jù)或記錄名


10H4數(shù)據(jù)尺寸


14H2數(shù)據(jù)相對于記錄開始位置的偏移地址


16H2屬性索引標志(?)


對于外部數(shù)據(jù)


10H8本段數(shù)據(jù)起始簇號(注:這里的簇不同于分區(qū)存儲單元的簇)


18H8本段數(shù)據(jù)結(jié)束簇號


20H2數(shù)據(jù)存儲位置描述區(qū)相對于記錄開始位置的偏移


22H2壓縮引擎序號(?)


28H8本段數(shù)據(jù)占用的存儲空間


30H8本段數(shù)據(jù)的尺寸


38H8已初始化的數(shù)據(jù)的尺寸


40H8數(shù)據(jù)壓縮后的尺寸


記錄格式:首先是記錄名(如果有記錄名),緊接著就是內(nèi)部數(shù)據(jù)或外部數(shù)據(jù)索引。關(guān)于外部數(shù)據(jù)索引請參考:外部數(shù)據(jù)索引格式


三、 屬性類型


屬性名屬性值描述


$Standard_Information10H基本信息



$Attribute_List20H擴展數(shù)據(jù)屬性描述(用于在一個MFT記錄中裝不下文件的描述時指出附加的MFT)


$File_Name30H存放文件名,建立時間,修改時間,最后一次操作時間,文件尺寸等信息


$Object_ID40H不詳


$Security_Descriptor50H不詳


$Volume_Name60H分區(qū)卷標信息


$Volume_Information70H分區(qū)版本信息


$Data80H附加數(shù)據(jù)


$Index_Root90H目錄項


$Index_Allocation0A0H目錄項數(shù)據(jù)


$Bitmap0B0H存儲單元位圖(注:這里的存儲單元位圖的作用域僅限于本MFT記錄,而$Bitmap文件的作用域是整個分區(qū))


$Reparse_Point0C0H不詳


$EA_Information0D0H不詳


$EA0E0H不詳


$Logged_Untility_Stream0F0H不詳


四、 屬性數(shù)據(jù)格式


1、$Standard_Information


偏移地址占用字節(jié)數(shù)描述


0H8文件創(chuàng)建時間


8H8文件最后一次修改的時間


10H8文件記錄最后一次修改的時間


18H8最后一次操作文件的時間


20H4DOS文件屬性


24H0CH+不詳,似乎總為0


其中DOS文件屬性字各Bit的意義描述如下:


Bit描述


0只讀


1隱藏


2系統(tǒng)


5歸檔


18符號鏈接(?)


19壓縮(?)



2、$Attribute_List


3、$File_Name


偏移地址占用字節(jié)數(shù)描述


0H4包含該文件的文件記錄在$MFT中的索引


6H2不詳


8H8(?)時間


10H8(?)時間


18H8(?)時間


20H8(?)時間


28H8文件占用的存儲器空間


30H8文件的實際尺寸


38H8文件屬性,其具體描述請參考$Standard_Information


40H1文件名字符串長度(Unicode)


41H1文件名類型


42H[40H]*2Unicode碼文件名


其中文件名類型的說明如下:


值描述


0POSIX


1Unicode


2DOS(8.3)


3Unicode、DOS通用



4、$Object_ID


5、$Security_Descriptor


6、$Volume_Name


$Volume_Name屬性的數(shù)據(jù)就是Unicode編碼的分區(qū)卷標。 7、$Volume_Information


7、$Volume_Information


$Volume_Information屬性中記錄了分區(qū)的版本號等信息。


偏移地址占用字節(jié)數(shù)描述


8H1主版本號


9H1子版本號


0AH1磁盤查錯標志,為1表示需要在啟動時運行磁盤查錯程序


8、$Data


$Data屬性的數(shù)據(jù)由用戶自己定義。關(guān)于系統(tǒng)常用的VCN和LCN的格式請參考數(shù)據(jù)流描述。


9、$Index_Root


$Index_Root屬性中記錄著目錄中的文件或子目錄的目錄項信息,


偏稱地址占用字節(jié)數(shù)描述


0H4


4H4


8H4


0CH4目錄項存儲區(qū)尺寸


10H4


14H4


18H4


1CH2是否使用目錄項存儲區(qū)標志


1EH2


10、$Index_Allocation


其數(shù)據(jù)是描述目錄項數(shù)據(jù)位置的數(shù)據(jù)流描述。


11、$Bitmap


其數(shù)據(jù)是以一Bit代表一個分配單元的存儲狀態(tài)位圖。為1則表示該簇已經(jīng)被使用,為0則表示該簇空閑。


12、$Reparse_Point


作用不明


13、$EA_Information


作用不明


14、$EA


作用不明


15、$Logged_Untility_Stream


作用不明


五、 目錄項存儲區(qū)格式


偏移地址占用字節(jié)數(shù)描述


0H4目錄項存儲區(qū)標識:“INDX”


4H2修正值表相對于存儲區(qū)開始處的偏移


6H2修正項個數(shù)+1


10H8


18H2記錄頭尺寸


1CH4存儲區(qū)中有效數(shù)據(jù)的尺寸


20H4存儲區(qū)最大可用尺寸(除去記錄頭18H字節(jié))


24H4


28HA+修正值表


18H+ 目錄項記錄


其中目錄項記錄的格式如下:


偏移地址占用字節(jié)數(shù)描述


0H4包含該文件的文件記錄在$MFT中的索引


6H2不詳


8H2本記錄尺寸


0AH2該文件的文件名屬性記錄尺寸(?)


10H8存放此記錄的目錄在_MFT中的索引(父目錄索引)


18H8


20H8


28H8


30H8修改時間


38H8文件占用的存儲空間


40H8文件的實際尺寸


48H8


50H1文件名字符串長度(Unicode)


51H1文件名類型。關(guān)于文件名類型的描述請參考前面的$File_Name屬性的說明


52H[50H]*2Unicode編碼的文件名



修正值技術(shù):


使用修正值技術(shù)的目的是用來確定記錄是否被完全正確地寫入存儲設(shè)備。所有的重要數(shù)據(jù)都使用的這項技術(shù)。這些重要數(shù)據(jù)包括MFT記錄,目錄項記錄和日志記錄。


修正值技術(shù)是通過往每個記錄的最末兩個字節(jié)寫入一個特定的校驗值來實現(xiàn)寫操作檢驗的,但一個記錄通常會多于一個扇區(qū),而且在進行寫操作時我們并不知道扇區(qū)寫入時的順序,因此只好在每個扇區(qū)的最后兩個字節(jié)都寫入校驗值。


它的操作流程如下:


1、 寫操作


首先在內(nèi)存中將修正值加1,然后用它替換緩沖區(qū)中每個扇區(qū)最后兩個字節(jié)處的數(shù)據(jù),把被替換的數(shù)據(jù)存放到修正值表中;再把所有數(shù)據(jù)寫入存儲設(shè)備。


2、 讀操作


首先把整個記錄讀入內(nèi)存中,檢查記錄標志(如FILE或INDX等)是否正確;然后檢查每個扇區(qū)的最后兩字節(jié)是否與修正值相同,如不同則表明在上次寫操作時發(fā)生了錯誤;如果修正值檢查通過,就將修正值表中的原始數(shù)據(jù)還原到相應(yīng)的位置,然后就可以進行其他操作了。


數(shù)據(jù)流描述


在NTFS分區(qū)中最基本的存儲單元是數(shù)據(jù)流,每個數(shù)據(jù)流由它的起始簇號和尺寸來描述。一個數(shù)據(jù)流的起始簇號是相對于上一簇的開始位置的偏移而不是絕對簇號,而且描述流起始簇號和尺寸的域都是可變長度的。流描述的第一個字節(jié)指明了它們兩者的尺寸,其中高4Bit指明描述起始簇的域的尺寸,低4Bit則指明了流尺寸域的尺寸。當一個流描述的第一個字節(jié)為0里就表示該流已經(jīng)結(jié)束。


現(xiàn)舉例如下。


設(shè)有一段數(shù)據(jù)流描述:21 20 ED 05 22 48 07 48 22 21 28 C8 DB


第一個數(shù)據(jù)流:開始于簇5EDH的20H個簇(5EDH-60CH)


第二個數(shù)據(jù)流:開始于簇2835H的748H個簇(2835H=5EDH+2248H)


第三個數(shù)據(jù)流:開始于簇3FDH的28H個簇(3FDH=2835H+0DBC8H)



注意:這里的數(shù)據(jù)流偏移值是一個有符號數(shù)!


$Boot文件結(jié)構(gòu)


作為分區(qū)引導(dǎo)時被執(zhí)行的第一段代碼,$Boot有著為整個系統(tǒng)開路的重要作用,它是NTFS分區(qū)中唯一一個位置固定不變的文件;在它里面又存儲著$MFT的位置,分區(qū)尺寸等重要數(shù)據(jù)。文件系統(tǒng)驅(qū)動程序必須讀取其中的數(shù)據(jù)才能定位$MFT,才能對整個分區(qū)進行操作。因此在這里也需要將它的結(jié)構(gòu)作一個說明。


偏移地址占用字節(jié)數(shù)描述


0H 3跳轉(zhuǎn)到啟動例程的指令


3H 34NTFS分區(qū)標志:“NTFS”


BH 72每扇區(qū)字節(jié)數(shù)


DH 91每簇扇區(qū)數(shù)


EH 102保留扇區(qū)數(shù)


10H 121FAT個數(shù)(為了與FAT/FAT32的BPB兼容,值為0)


11H 132根目錄項數(shù),值為0


13H 152分區(qū)扇區(qū)數(shù),值為0


15H 171存儲介質(zhì)(硬盤為F8)


16H 182每個FAT占用扇區(qū)數(shù),值為0


18H 202每道扇區(qū)數(shù)


1AH 222磁頭數(shù)


1CH 244隱藏扇區(qū)數(shù)


20H 284分區(qū)扇區(qū)數(shù),值為0


24H 321物理設(shè)備號(每一個硬盤為80H)


25H 331未用


26H 342保留,值為80H


28H 368分區(qū)扇區(qū)數(shù)-1


30H 448$MFT第一簇簇號


38H 528$MFTMirr第一簇簇號


40H 531每個文件記錄占用的簇數(shù),具體描述請見表后注釋


44H 544每個目錄項存儲區(qū)占用的簇數(shù),具體描述同上


48H 588分區(qū)序列號


分區(qū)引導(dǎo)例程


注:每個文件記錄占用的簇數(shù)如果為否值則表明記錄尺寸小于簇尺寸,此時計算文件記錄尺寸的方法應(yīng)該是:記錄占用的字節(jié)數(shù)=1<<(~每文件記錄占用簇數(shù))。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
NTFS文件系統(tǒng)+NTFS文件系統(tǒng)結(jié)構(gòu)解析+NTFS文件系統(tǒng)規(guī)范
解讀NTFS
NTFS格式化為FAT32的數(shù)據(jù)恢復(fù)
詳解NTFS文件系統(tǒng)
NTFS手工恢復(fù)
NTFS文件系統(tǒng)結(jié)構(gòu)總覽 | 數(shù)據(jù)恢復(fù)迷
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服