FILE_OBJECT結構 (wdm.h)
系統會使用 FILE_OBJECT 結構來表示檔案物件。 對於使用者模式保護的子系統,檔案物件代表檔案、裝置、目錄或磁碟區的開啟實例。 對裝置和中繼驅動程式,檔案物件通常代表裝置物件。 至文件系統堆疊中的驅動程式,檔案物件通常代表目錄或檔案。
檔案物件部分不透明。 某些類型的驅動程式,例如檔案系統驅動程式和網路傳輸驅動程式,請使用檔案物件的一些欄位。
語法
typedef struct _FILE_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
PVPB Vpb;
PVOID FsContext;
PVOID FsContext2;
PSECTION_OBJECT_POINTERS SectionObjectPointer;
PVOID PrivateCacheMap;
NTSTATUS FinalStatus;
struct _FILE_OBJECT *RelatedFileObject;
BOOLEAN LockOperation;
BOOLEAN DeletePending;
BOOLEAN ReadAccess;
BOOLEAN WriteAccess;
BOOLEAN DeleteAccess;
BOOLEAN SharedRead;
BOOLEAN SharedWrite;
BOOLEAN SharedDelete;
ULONG Flags;
UNICODE_STRING FileName;
LARGE_INTEGER CurrentByteOffset;
__volatile ULONG Waiters;
__volatile ULONG Busy;
PVOID LastLock;
KEVENT Lock;
KEVENT Event;
__volatile PIO_COMPLETION_CONTEXT CompletionContext;
KSPIN_LOCK IrpListLock;
LIST_ENTRY IrpList;
__volatile _IOP_FILE_OBJECT_EXTENSION *FileObjectExtension;
struct _IOP_FILE_OBJECT_EXTENSION;
} FILE_OBJECT, *PFILE_OBJECT;
成員
Type
系統用來指出對象為檔案物件的唯讀成員。 如果對像是檔案物件,則這個成員的值是 5。
Size
唯讀成員,指定檔案物件的大小,以位元組為單位。 如果檔案對象擴展名存在,這個大小就不會包含這個大小。
DeviceObject
開啟檔案之裝置物件的指標。
Vpb
與檔案對象相關聯的 volume 參數區塊指標。
請注意,如果 Vpb 成員是非NULL,檔案會位於掛接的磁碟區上。
FsContext
驅動程式維護檔案物件之任何選擇性狀態的指標;否則,NULL。 對於檔案系統驅動程式,這個成員必須指向文件系統特定結構中包含的 FSRTL_ADVANCED_FCB_HEADER 標頭結構;否則系統不穩定可能會導致。 通常,這個標頭結構會內嵌在檔案控制區塊 (FCB) 中。 不過,在某些支援多個數據流的文件系統上,例如NTFS,此標頭結構是數據流控制區塊(SCB)。
在 WDM 裝置堆疊中,只有功能性裝置物件 (FDO) 可以使用兩個內容指標。 檔系統驅動程式會跨多個開啟共用此成員至相同的數據流。
FsContext2
驅動程式對於檔案物件所維護之任何其他狀態的指標;否則,NULL。
此成員對於文件系統堆疊中的驅動程式而言是不透明的,因為基礎文件系統會利用這個成員。
SectionObjectPointer
檔案物件的唯讀區段物件的指標。 這個成員只會由文件系統設定,並用於快取管理員互動。
PrivateCacheMap
不透明成員,僅由文件系統設定,指向處理特定資訊,並用於快取管理員互動。
FinalStatus
在特定同步案例中,用來指出檔案物件 I/O 要求的最終狀態的唯讀成員。
RelatedFileObject
FILE_OBJECT 結構的指標,用來指出目前檔案物件已相對於已開啟的檔案對象開啟。 這個成員所指向的檔案物件通常是目錄(這表示目前檔案已相對於此目錄開啟)。 不過,檔案可以相對於本身重新開啟,而檔案的替代數據流可以相對於該相同檔案已開啟的主要數據流開啟。 RelatedFileObject 成員只有在處理 IRP_MJ_CREATE 要求時才有效。
LockOperation
唯讀成員。 如果 FALSE,則從未在檔案對象上執行鎖定作業(NtLockFile)。 如果 TRUE,則至少有一個鎖定作業已在檔案物件上執行。 一旦設定為 TRUE,這個成員一律會保持 TRUE (例如,釋放檔案物件的檔案鎖定不會將此成員重設為 FALSE)。
DeletePending
唯讀成員。 如果 TRUE,則與檔案對象相關聯的檔案刪除作業存在。 如果 FALSE,則檔案物件目前沒有暫止的刪除作業。
ReadAccess
唯讀成員。 如果 TRUE,則與檔案對象相關聯的檔案已開啟以供讀取存取。 如果 FALSE,則檔案已開啟而不具有讀取許可權。 檢查和/或設定檔案的共用存取權時,會使用這項資訊。
WriteAccess
唯讀成員。 如果 TRUE,則與檔案對象相關聯的檔案已開啟以進行寫入存取。 如果 FALSE,則檔案已開啟而不具有寫入許可權。 檢查和/或設定檔案的共用存取權時,會使用這項資訊。
DeleteAccess
唯讀成員。 如果 TRUE,則與檔案對象相關聯的檔案已開啟以供刪除存取。 如果 FALSE,則檔案已開啟而不刪除存取權。 檢查和/或設定檔案的共用存取權時,會使用這項資訊。
SharedRead
唯讀成員。 如果 TRUE,則與檔案對象相關聯的檔案已開啟以供讀取共用存取。 如果 FALSE,則檔案已開啟而不具有讀取共用存取權。 檢查和/或設定檔案的共用存取權時,會使用這項資訊。
SharedWrite
唯讀成員。 如果 TRUE,則與檔案對象相關聯的檔案已開啟以供寫入共用存取。 如果 FALSE,則檔案已開啟而不具有寫入共用存取權。 檢查和/或設定檔案的共用存取權時,會使用這項資訊。
SharedDelete
唯讀成員。 如果 TRUE,則與檔案對象相關聯的檔案已開啟以刪除共用存取權。 如果 FALSE,則檔案已開啟而不刪除共用存取權。 檢查和/或設定檔案的共用存取權時,會使用這項資訊。
Flags
系統用來保存下列私用旗標值的一或多個(位內含 OR 組合)的唯讀成員。
旗 | 意義 |
---|---|
FO_FILE_OPEN | 荒廢的。 |
FO_SYNCHRONOUS_IO | 檔案物件會針對同步 I/O 開啟。 |
FO_ALERTABLE_IO | I/O 管理員中的任何等候,由於對這個檔案物件提出的要求,都是可警示的。 |
FO_NO_INTERMEDIATE_BUFFERING | 與檔案對象相關聯的檔案無法在驅動程式的內部緩衝區中快取或緩衝處理。 |
FO_WRITE_THROUGH | 將數據寫入檔案的系統服務、檔案系統驅動程式和驅動程式,必須先將數據傳輸到檔案,才能將任何要求的寫入作業視為完成。 |
FO_SEQUENTIAL_ONLY | 僅針對循序 I/O 作業開啟與檔案對象相關聯的檔案。 |
FO_CACHE_SUPPORTED | 與檔案對象相關聯的檔案是可快取的。 這個旗標應該只由文件系統驅動程式設定,而且只有當 FsContext 成員指向有效的 FSRTL_ADVANCED_FCB_HEADER 結構時。 |
FO_NAMED_PIPE | 檔案物件代表命名管道。 |
FO_STREAM_FILE | 檔案物件代表檔案數據流。 |
FO_MAILSLOT | 檔案物件代表mailslot。 |
FO_GENERATE_AUDIT_ON_CLOSE | 荒廢的。 |
FO_QUEUE_IRP_TO_THREAD | IRP 將不會排入此檔案物件。 |
FO_DIRECT_DEVICE_OPEN | 此檔案對象的目標裝置已直接開啟。 |
FO_FILE_MODIFIED | 已修改與檔案對象相關聯的檔案。 |
FO_FILE_SIZE_CHANGED | 與檔案對象相關聯的檔案大小已變更。 |
FO_CLEANUP_COMPLETE | 檔案系統已完成此檔案物件的清除。 |
FO_TEMPORARY_FILE | 與檔案對象相關聯的檔案是臨時檔。 |
FO_DELETE_ON_CLOSE | 與檔案物件相關聯的檔案將會在關閉時由文件系統刪除。 |
FO_OPENED_CASE_SENSITIVE | 會遵守與檔案對象相關聯之檔案的檔名大小寫。 |
FO_HANDLE_CREATED | 檔案物件已建立檔句柄。 |
FO_FILE_FAST_IO_READ | 已在此檔案物件上執行快速 I/O 讀取。 |
FO_RANDOM_ACCESS | 與檔案對象相關聯的檔案已開啟以供隨機存取。 |
FO_FILE_OPEN_CANCELLED | 完成之前,已取消此檔案物件的建立要求。 |
FO_VOLUME_OPEN | 檔案物件代表磁碟區開啟的要求。 |
FO_REMOTE_ORIGIN | 與遠端電腦上之檔案對象相關聯的檔案建立要求。 |
FO_SKIP_COMPLETION_PORT | 針對與埠相關聯的檔案對象,判斷當 IRP 以非錯誤狀態傳回值同步完成時,系統是否應該略過佇列到完成埠。 |
FO_SKIP_SET_EVENT | 在 IRP 完成時略過設定檔案物件的事件。 |
FO_SKIP_SET_FAST_IO | 當快速 I/O 路徑成功時,略過提供給系統服務的事件。 |
FileName
UNICODE_STRING 結構,其 Buffer 成員指向唯讀 Unicode 字串,此字串會保存磁碟區上開啟的檔名。 如果磁碟區正在開啟,UNICODE_STRING 結構的 Length 成員會是零。 請注意,此字串中的檔名只有在 IRP_MJ_CREATE 要求的初始處理期間才有效。 文件系統開始處理 IRP_MJ_CREATE 要求之後,不應將此檔名視為有效。 UNICODE_STRING 結構 緩衝區 成員所指向之字元串的記憶體會配置於分頁系統記憶體中。 如需取得檔名的詳細資訊,請參閱 FltGetFileNameInformation。
CurrentByteOffset
唯讀成員,指定與檔案對象相關聯的檔案位移,以位元組為單位。
Waiters
系統使用的只讀成員,用來計算開啟以供同步存取之檔案物件上未處理的等候程式數目。
Busy
系統所使用的只讀成員,用來指出開啟供同步存取之檔案物件目前是否忙碌中。
LastLock
套用至檔案物件之最後一個鎖定的不透明指標。
Lock
系統用來保存檔案物件事件鎖定的不透明成員。 事件鎖定可用來控制檔案物件的同步存取。 僅適用於針對同步存取開啟的檔案物件。
Event
系統用來保存檔案物件之事件物件的不透明成員。 事件對像是用來在未提供使用者事件或呼叫同步 API 時,向檔案對象發出 I/O 要求完成的訊號。
CompletionContext
與檔案對象相關聯的完成埠資訊(埠指標和索引鍵)的不透明指標,如果有的話。
IrpListLock
KSPIN_LOCK 結構的不透明指標,做為同步處理檔案物件 IRP 清單存取權的微調鎖定。
IrpList
與檔案對象相關聯的 IRP 清單前端不透明指標。
FileObjectExtension
檔案物件擴展名的不透明指標(FOBX) 結構。 FOBX 結構包含內部使用的各種不透明內容,以及透過 FsRtlXxx 例程提供的個別檔案物件內容。
_IOP_FILE_OBJECT_EXTENSION
_IOP_FILE_OBJECT_EXTENSION 結構。
言論
驅動程式可以使用 FsContext 和 FsContext2 成員來維護開啟檔案物件的相關驅動程式決定狀態。 除非檔案物件可在 IRP 的驅動程式 I/O 堆疊位置中存取,否則驅動程式無法使用這些成員。
檔案物件中的所有剩餘成員都是不透明或唯讀的:
檔案物件中的不透明成員應該視為無法存取。 在物件欄位位置上具有相依性的驅動程式,或存取不透明的成員可能無法隨著時間保持可攜式且與其他驅動程式互通。
驅動程式可以使用只讀成員來取得相關信息,但不得修改只讀成員,如果指標,則成員指向的物件。
在處理 IRP_MJ_CREATE 要求期間,文件系統驅動程式會呼叫 IoSetShareAccess 例程(如果用戶端是第一個開啟檔案的用戶端),或 IoCheckShareAccess 例程(針對想要共用檔案的後續用戶端)。 IoSetShareAccess 和 IoCheckShareAccess 更新 ReadAccess、WriteAccess,以及 DeleteAccess 成員,以指出如果用戶端具有檔案的獨佔存取權,則會授與客戶端的訪問許可權。 此外,IoCheckShareAccess 會更新 sharedRead、SharedWrite,以及 SharedDelete 成員,以指出同時授與兩個以上的用戶端共用檔案的訪問許可權。 如果文件系統以外的裝置驅動程式必須監視用戶端的存取權,此驅動程式通常會將訪問許可權資訊儲存在 FsContext 所指向的內容緩衝區中,FsContext2 成員。
指定檔案物件所代表的物件類型(例如,檔案、目錄或磁碟區),只能檢查檔案對象結構的內容來判斷。 如需如何判斷檔案物件所代表之物件類型的資訊,請參閱 ZwQueryInformationFile。
通用記錄檔系統 (CLFS) 會使用 LOG_FILE_OBJECT 結構來表示記錄。 ClfsCreateLogFile 函式會傳回 LOG_FILE_OBJECT 結構的指標,客戶端接著會傳遞至其他 CLFS 函式。
CLFS 用戶端不會直接存取 LOG_FILE_OBJECT 結構的成員。
typedef FILE_OBJECT LOG_FILE_OBJECT, *PLOG_FILE_OBJECT, **PPLOG_FILE_OBJECT;
要求
要求 | 價值 |
---|---|
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Fltkernel.h) |