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 PVOID                  FileObjectExtension;
} 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 例程提供的個別檔案物件內容。

備註

驅動程式可以使用 FsContext 和 FsContext2 成員來維護開啟檔案對象的相關驅動程式決定狀態。 除非檔案物件可在 IRP 的驅動程式 I/O 堆疊位置中存取,否則驅動程式無法使用這些成員。

檔案物件中的所有剩餘成員都是不透明或唯讀的:

  • 檔案物件內的不透明成員應該視為無法存取。 具有物件欄位位置相依性或不透明成員存取權的驅動程式可能無法在一段時間內保持可攜且可與其他驅動程式互通。

  • 驅動程式可以使用只讀成員來取得相關信息,但不得修改只讀成員,如果指標,則成員指向的物件。

在處理 IRP_MJ_CREATE 要求期間,文件系統驅動程式會呼叫 IoSetShareAccess 例程 (,如果用戶端是第一次開啟檔案) 或 IoCheckShareAccess 例程 (,以供想要共用檔案的後續用戶端) 。 IoSetShareAccessIoCheckShareAccess 會更新 ReadAccessWriteAccessDeleteAccess 成員,以指出如果用戶端具有檔案的獨佔存取權,則授與用戶端的訪問許可權。 此外, IoCheckShareAccess 會更新 SharedReadSharedWriteSharedDelete 成員,以指出同時授與兩個或多個共用檔案的用戶端的訪問許可權。 如果文件系統以外的裝置驅動程式必須監視用戶端的訪問許可權,此驅動程式通常會將訪問許可權資訊儲存在 FsContextFsContext2 成員所指向的內容緩衝區中。

例如,指定檔案物件所代表的物件類型 (檔案、目錄或磁碟區) 只能檢查檔案對象結構的內容來決定。 如需如何判斷檔案物件所代表之物件類型的資訊,請參閱 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)

另請參閱

DEVICE_OBJECT

FOBX

FSRTL_ADVANCED_FCB_HEADER

IRP_MJ_CREATE

IoCheckShareAccess

IoGetDeviceObjectPointer

IoSetShareAccess

ObDereferenceObject

ZwQueryInformationFile