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

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

标志 含义
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 以非错误状态返回值同步完成 IRP 时,系统是否应跳过排队到完成端口。
FO_SKIP_SET_EVENT 跳过在 IRP 完成后为文件对象设置事件。
FO_SKIP_SET_FAST_IO 当快速 I/O 路径成功时,跳过为系统服务提供的事件设置。

FileName

一个 UNICODE_STRING 结构,其 缓冲区 成员指向只读 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 成员来维护有关打开的文件对象的驱动程序确定状态。 除非文件对象在 IRP 的 I/O 堆栈位置可访问,否则驱动程序无法使用这些成员。

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

  • 文件对象中的不透明成员应被视为不可访问。 依赖于对象字段位置或访问不透明成员的驱动程序可能无法在一段时间内保持可移植且与其他驱动程序互操作。
  • 驱动程序可以使用只读成员获取相关信息,但不得修改只读成员;如果指针,则成员指向的对象。
处理IRP_MJ_CREATE 请求期间,文件系统驱动程序会调用 IoSetShareAccess 例程 (,如果客户端是第一个打开文件) 或 IoCheckShareAccess 例程 (,则为想要共享文件) 的后续客户端调用 IoSetShareAccess 例程。 IoSetShareAccessIoCheckShareAccess 更新 ReadAccessWriteAccessDeleteAccess 成员,以指示如果客户端具有对文件的独占访问权限,则向客户端授予的访问权限。 此外, IoCheckShareAccess 更新 SharedReadSharedWriteSharedDelete 成员,以指示同时授予两个或多个共享文件的客户端的访问权限。 如果除文件系统以外的设备驱动程序必须监视客户端的访问权限,此驱动程序通常将访问权限信息存储在 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;

要求

   
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