CCB ContextControlBlock 是存Private信息的,這個FO的特殊信息緩存
FCB FileControlBlock 是存全局信息的數據結構
FO FileObject 表明一個文件打開實例.net
之間關係:指針
FO 與 CCB 是1:1的對象
即一個FO有一個CCB根着blog
FCB 與 CCB 是1:n的 (n >= 1)進程
即一個FCB可能有n個CCB和它關聯.內存
FO->FsContext2指向CCBit
FO->FsContext指向CommFCBclass
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
文件卷中的對象即磁盤上的對象,只要是打開着的,就在內存中有個「文件控制塊」即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