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 结构。
言论
驱动程序可以使用 FsContext 和 FsContext2 成员来维护有关打开的文件对象的驱动程序确定状态。 除非文件对象在 IRP 的 I/O 堆栈位置可访问,否则驱动程序无法使用这些成员。
文件对象中的所有剩余成员都是不透明或只读的:
文件对象中的不透明成员应被视为不可访问。 依赖于对象字段位置或访问不透明成员的驱动程序可能无法在一段时间内保持可移植性且与其他驱动程序互作。
驱动程序可以使用只读成员获取相关信息,但不能修改只读成员,如果指针指向该成员的对象,则不能修改只读成员。
在处理 IRP_MJ_CREATE 请求期间,文件系统驱动程序调用 IoSetShareAccess 例程(如果客户端是第一个打开文件)或 IoCheckShareAccess 例程(对于想要共享文件的后续客户端)。 IoSetShareAccess 和 IoCheckShareAccess 更新 ReadAccess、WriteAccess,DeleteAccess 成员,以指示客户端有权访问该文件时授予客户端的访问权限。 此外,IoCheckShareAccess 更新 SharedRead、SharedWrite,以及 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) |