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 結構的 Buffer 成員所指向的字串記憶體會配置在分頁系統記憶體中。 如需取得檔名的詳細資訊,請參閱 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。
COMMON Log File System (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) |