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

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

请注意,如果 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

系统用来保存以下私有标志值的一个或多个(按位非独占或组合)的只读成员。

意义
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 结构。

言论

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

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

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

  • 驱动程序可以使用只读成员获取相关信息,但不能修改只读成员,如果指针指向该成员的对象,则不能修改只读成员。

在处理 IRP_MJ_CREATE 请求期间,文件系统驱动程序调用 IoSetShareAccess 例程(如果客户端是第一个打开文件)或 IoCheckShareAccess 例程(对于想要共享文件的后续客户端)。 IoSetShareAccessIoCheckShareAccess 更新 ReadAccessWriteAccessDeleteAccess 成员,以指示客户端有权访问该文件时授予客户端的访问权限。 此外,IoCheckShareAccess 更新 SharedReadSharedWrite,以及 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)

另请参阅

DEVICE_OBJECT

FOBX

FSRTL_ADVANCED_FCB_HEADER

IRP_MJ_CREATE

IoCheckShareAccess

IoGetDeviceObjectPointer

IoSetShareAccess

ObDereferenceObject

ZwQueryInformationFile