CCB ContextControlBlock 是存Private資訊的,這個FO的特殊資訊
FCB FileControlBlock 是存全域資訊的
FO FileObject 代表一個檔案開啟執行個體
之間關係:
FO 與 CCB 是1:1的
即一個FO有一個CCB根著
FCB 與 CCB 是1:n的 (n >= 1)
即一個FCB可能有n個CCB和它關聯.
FO->FsContext2指向CCB
FO->FsContext指向CommFCB
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
FCB
檔案卷中的對象即磁碟上的對象,只要是開啟著的,就在記憶體中有個“檔案控制區”即FCB作為其代表。FCB代表著檔案卷的目標對象(不一定是檔案),而檔案對象FILE_OBJECT結構則代表著這個目標對象的一次開啟,或者說代表著這個目標對象與某個進程的一個串連。一個目標對象最多隻有一個FCB,如果沒有開啟就沒有FCB,但是卻可以有多個檔案對象,因為可以被多次開啟。
可想而知,檔案對象中一定有指標指向目標對象的FCB。DeviceObject指向目標對象所在的裝置即磁碟裝置。指標FsContext(驅動程式為檔案對象維護的狀態資訊)用來指向代表著目標對象的FCB。對於FAT檔案系統而言這是一個VFATFCB資料結構。另一個指標指向FsContext2,就磁碟檔案和目錄來說,則用來指向一個“內容控制區塊”即CCB。
目標對象的每次開啟都有個檔案對象即FILE_OBJECT結構作為代表,同時又有個CCB。不過有時候CCB不是必要的。資料結構“檔案參數區塊”VPB把抽象意義上的“檔案卷”更物理意義上的磁碟聯絡在一起了。VPB中有兩個指標,一個是DeviceObject,他指向代表著檔案卷的裝置對象,就是相應FSD所建立的裝置對象。這決定了檔案卷中的資訊時如何組織的;另一個指標是RealDevice,它指向代表著具體(邏輯)磁碟的裝置對象,這決定了資訊是如何儲存的。FILE_OBJECT結構中的指標指向一個VPB,這一方面表明目標卷存在於哪個邏輯磁碟上,另一方面表明這個磁碟承載著什麼樣的檔案卷屬於哪一種檔案系統。
/*
儘管FsContext所指的FCB、DCB或VCB對象可以由檔案系統驅動程式自行定義,
但是,Windows的緩衝管理器需要依賴於這些對象中的一個公用頭部才可以工作,
此公用頭部稱為//PFSRTL_COMMON_FCB_HEADER,如果檔案系統驅動程式要使用緩衝管理器提供的
緩衝功能,那麼,他必須確保這些對象都以//PFSRTL_COMMON_FCB_HEADER作為頭部成員
*/
PFSRTL_COMMON_FCB_HEADER pFcb;
/*
FsContext域表示此檔案對象所代表的實際對象的資料結構,如果檔案對象代表一個磁碟目錄,則它指向FCB
FsContext2域指向CCB結構,代表檔案對象的已開啟執行個體。
CCB:Context Control Block
FCB針對每個檔案而唯一存在,而CCB針對每一次開啟檔案而存在
例如,兩個應用程式共用訪問同一個檔案,他們的CCB不同,但它們的CCB中所指向的FCB是相同的,
而且,CCB中記錄了相應的應用程式正在操作該檔案的位移位置。在這種情況下,每個CCB關聯不同的
檔案對象(FILE_OBJECT)
*/
pFcb = (PFSRTL_COMMON_FCB_HEADER)pFileObject->FsContext;
轉自:http://blog.csdn.net/redchairman/article/details/7018063