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

指向与文件对象关联的卷参数块的指针。

请注意,如果 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 例程提供的每个文件对象上下文。

注解

驱动程序可以使用 FsContextFsContext2 成员来维护有关打开文件对象的驱动程序确定的状态。 驱动程序不能使用这些成员,除非可以在驱动程序的 I/O 堆栈位置(IRP)中访问文件对象。

文件对象中的所有剩余成员都是不透明的或只读的:

  • 文件对象中的不透明成员应被视为不可访问。 依赖于对象字段位置或访问不透明成员的驱动程序在一段时间内可能无法保持可移植性并与其他驱动程序互操作。

  • 驱动程序可以使用只读成员来获取相关信息,但不得修改只读成员以及成员指向的对象(如果为指针)。

在处理IRP_MJ_CREATE请求期间,如果客户端是第一个打开文件 () 或 IoCheckShareAccess 例程 (,则文件系统驱动程序调用 IoSetShareAccess 例程,以便) 共享文件。 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;

要求

要求
Header 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