IoCreateFileEx 函数 (ntddk.h)
IoCreateFileEx 例程会导致创建新文件或目录,或者打开现有文件、设备、目录或卷,并为调用方提供文件对象的句柄。 文件系统筛选器驱动程序 (旧版筛选器驱动程序) 调用此例程。
语法
NTSTATUS IoCreateFileEx(
[out] PHANDLE FileHandle,
[in] ACCESS_MASK DesiredAccess,
[in] POBJECT_ATTRIBUTES ObjectAttributes,
[out] PIO_STATUS_BLOCK IoStatusBlock,
[in, optional] PLARGE_INTEGER AllocationSize,
[in] ULONG FileAttributes,
[in] ULONG ShareAccess,
[in] ULONG Disposition,
[in] ULONG CreateOptions,
[in, optional] PVOID EaBuffer,
[in] ULONG EaLength,
[in] CREATE_FILE_TYPE CreateFileType,
[in, optional] PVOID InternalParameters,
[in] ULONG Options,
[in, optional] PIO_DRIVER_CREATE_CONTEXT DriverContext
);
参数
[out] FileHandle
指向变量的指针,如果调用成功,该变量接收文件句柄。 驱动程序必须在不再使用句柄后立即关闭 ZwClose 的句柄。
[in] DesiredAccess
标志的位掩码 (看到 ACCESS_MASK) 指定调用方需要对文件或目录的访问类型。 这组系统定义的 DesiredAccess 标志确定文件对象的以下特定访问权限。
DesiredAccess 标志 | 含义 |
---|---|
DELETE | 可以删除该文件。 |
FILE_READ_DATA | 可从文件中读取数据。 |
FILE_READ_ATTRIBUTES | 可以读取下面所述的 FileAttributes 标志。 |
FILE_READ_EA | 可以读取与文件关联的扩展属性 (CA) 。 |
READ_CONTROL | 可以读取与文件关联的 (ACL) 和所有权信息的访问控制列表。 |
FILE_WRITE_DATA | 可将数据写入文件。 |
FILE_WRITE_ATTRIBUTES | 可以写入 FileAttributes 标志。 |
FILE_WRITE_EA | 可以写入与文件关联的 CA。 |
FILE_APPEND_DATA | 可将数据追加到文件。 |
WRITE_DAC | 可以编写与该文件关联的 DACL) (任意访问控制列表。 |
WRITE_OWNER | 可以写入与文件关联的所有权信息。 |
SYNCHRONIZE | 调用方可以通过等待返回的 FileHandle 设置为“已信号”状态来同步 I/O 操作的完成。 如果设置了 CreateOptions FILE_SYNCHRONOUS_IO_ALERT 或 FILE_SYNCHRONOUS_IO_NONALERT 标志,则必须设置此标志。 |
FILE_EXECUTE | 可以使用系统分页 I/O 将数据从文件读取到内存中。 |
或者,对于不表示目录的任何文件对象,可以指定以下一个或多个泛型ACCESS_MASK标志。 STANDARD_RIGHTS_XXX标志是预定义的系统值,用于在系统对象上强制实施安全性。 还可以将这些泛型标志与上表中的其他标志组合在一起。
对文件值的所需访问权限 | 映射到 DesiredAccess 标志 |
---|---|
GENERIC_READ | STANDARD_RIGHTS_READ、FILE_READ_DATA、FILE_READ_ATTRIBUTES、FILE_READ_EA、SYNCHRONIZE。 |
GENERIC_WRITE | STANDARD_RIGHTS_WRITE、FILE_WRITE_DATA、FILE_WRITE_ATTRIBUTES、FILE_WRITE_EA、FILE_APPEND_DATA、SYNCHRONIZE。 |
GENERIC_EXECUTE | STANDARD_RIGHTS_EXECUTE、SYNCHRONIZE、FILE_READ_ATTRIBUTES、FILE_EXECUTE。 |
对于 (FILE_DIRECTORY_FILE CreateOptions 标志设置为) 的目录,可以指定以下一个或多个ACCESS_MASK标志,也可以将其与前面所述的任何兼容标志组合使用。
对目录值的所需访问权限 | 含义 |
---|---|
FILE_LIST_DIRECTORY | 可以列出目录中的文件。 |
FILE_TRAVERSE | 可以遍历目录;也就是说,它可以是文件路径名的一部分。 |
FILE_READ_DATA、FILE_WRITE_DATA、FILE_EXECUTE 和 FILE_APPEND_DATA DesiredAccess 标志与创建或打开目录文件不兼容。
[in] ObjectAttributes
指向已由 InitializeObjectAttributes 例程初始化的OBJECT_ATTRIBUTES结构的指针。 如果调用方在系统进程上下文中运行,则此参数可以为 NULL。 否则,调用方必须在 对 InitializeObjectAttributes 的调用中设置 OBJ_KERNEL_HANDLE 属性。 文件对象的此结构的成员包括以下内容。
成员 | Value |
---|---|
ULONG 长度 | 提供的 ObjectAttributes 数据的字节数。 此值必须至少 sizeof(OBJECT_ATTRIBUTES) 为 。 |
PUNICODE_STRING ObjectName | 指向缓冲 Unicode 字符串的指针,该字符串包含要创建或打开的文件的名称。 此值必须是完全限定的文件规范,除非它是相对于 RootDirectory 指定的目录的文件的名称。 例如,“\Device\Floppy1\myfile.dat”或“??\B:\myfile.dat“可以是完全限定的文件规范,前提是已加载软盘驱动器驱动程序和过度文件系统。 (注意:“??”将“\DosDevices”替换为 Win32 对象命名空间的名称。“\DosDevices”仍然有效,但对象管理器可以更快地转换“??”) |
HANDLE RootDirectory | 以前调用 IoCreateFileEx 获取的目录的可选句柄。 如果此值为 NULL, 则 ObjectName 成员必须是包含目标文件的完整路径的完全限定文件规范。 如果此值为非 NULL, 则 ObjectName 成员指定相对于此目录的文件名。 |
PSECURITY_DESCRIPTOR SecurityDescriptor | 要应用于文件的可选安全描述符。 由此类安全描述符指定的 ACL 仅在创建文件时应用于该文件。 如果创建文件时的值为 NULL ,则文件上放置的 ACL 依赖于文件系统;大多数文件系统从父目录文件传播此类 ACL 的某一部分,同时传播调用方的默认 ACL。 |
ULONG 属性 | 一组控制文件对象属性的标志。 如果调用方在系统进程上下文中运行,则此参数可以为零。 否则,调用方必须设置 OBJ_KERNEL_HANDLE 标志。 调用方还可以选择性地设置 OBJ_CASE_INSENSITIVE 标志,该标志指示名称查找代码应忽略 ObjectName 的事例,而不是执行完全匹配的搜索。 |
[out] IoStatusBlock
指向 类型为 IO_STATUS_BLOCK 的变量的指针,该变量接收最终完成状态和有关所请求操作的信息。 从 IoCreateFileEx 返回时,变量 的 Information 成员包含以下值之一:
FILE_CREATED
FILE_OPENED
FILE_OVERWRITTEN
FILE_SUPERSEDED
FILE_EXISTS
FILE_DOES_NOT_EXIST
[in, optional] AllocationSize
(可选)指定文件的初始分配大小(以字节为单位)。 除非正在创建、覆盖或取代文件,否则非零值不起作用。
[in] FileAttributes
仅当创建、取代文件或在某些情况下被覆盖时,才会应用显式指定的属性。 默认情况下,此值为FILE_ATTRIBUTE_NORMAL,可由任何其他标志重写,也可以通过按位 OR 操作) 兼容标志的组合 (重写该值。 可能的 FileAttributes 标志包括以下内容。
FileAttributes 标志 | 含义 |
---|---|
FILE_ATTRIBUTE_NORMAL | 应创建具有标准属性的文件。 |
FILE_ATTRIBUTE_READONLY | 应创建只读文件。 |
FILE_ATTRIBUTE_HIDDEN | 应创建隐藏文件。 |
FILE_ATTRIBUTE_SYSTEM | 应创建系统文件。 |
FILE_ATTRIBUTE_ARCHIVE | 应标记文件,以便将其存档。 |
FILE_ATTRIBUTE_TEMPORARY | 应创建一个临时文件。 |
[in] ShareAccess
指定调用方希望的对文件的共享访问类型(为零或 1,或以下标志的组合)。 若要请求独占访问权限,请将此参数设置为零。 如果在 Options 参数中指定了IO_IGNORE_SHARE_ACCESS_CHECK标志,则 I/O 管理器将忽略 ShareAccess 参数。 但是,文件系统可能仍会执行访问检查。 因此,为此参数指定所需的共享模式非常重要,即使使用 IO_IGNORE_SHARE_ACCESS_CHECK 标志也是如此。 若要帮助避免共享冲突错误,请指定以下所有共享访问标志。
ShareAccess 标志 | 含义 |
---|---|
FILE_SHARE_READ | 可以通过其他线程的文件创建调用打开该文件进行读取访问。 |
FILE_SHARE_WRITE | 可以通过其他线程的文件创建调用打开该文件以进行写入访问。 |
FILE_SHARE_DELETE | 可以通过其他线程的文件创建调用打开文件进行删除访问。 |
设备驱动程序和中间驱动程序通常将 ShareAccess 设置为零,这为调用方提供了对打开的文件的独占访问权限。
[in] Disposition
确定文件已存在时应如何处理文件的值。 处置 可以是以下其中一种。
值 | 含义 |
---|---|
FILE_SUPERSEDE | 如果文件已存在,请将它替换为给定的文件。 如果不存在,请创建给定的文件。 |
FILE_CREATE | 如果文件已存在,请失败请求,并且不要创建或打开给定的文件。 如果不存在,请创建给定的文件。 |
FILE_OPEN | 如果文件已存在,请打开它,而不是创建新文件。 如果不存在,请失败请求,并且不创建新文件。 |
FILE_OPEN_IF | 如果文件已存在,请将其打开。 如果不存在,请创建给定的文件。 |
FILE_OVERWRITE | 如果文件已存在,请打开它并覆盖它。 如果不存在,请使请求失败。 |
FILE_OVERWRITE_IF | 如果文件已存在,请打开它并覆盖它。 如果不存在,请创建给定的文件。 |
[in] CreateOptions
指定在创建或打开文件时要应用的选项,作为以下标志的兼容组合。
CreateOptions 标志 | 含义 |
---|---|
FILE_DIRECTORY_FILE (0x00000001) | 正在创建或打开的文件是目录文件。 使用此标志时, 处置 参数必须设置为FILE_CREATE、FILE_OPEN或FILE_OPEN_IF之一。 与此标志兼容的 CreateOptions 标志如下所示:FILE_SYNCHRONOUS_IO_ALERT、FILE_SYNCHRONOUS_IO_NONALERT、FILE_WRITE_THROUGH、FILE_OPEN_FOR_BACKUP_INTENT和FILE_OPEN_BY_FILE_ID。 |
FILE_WRITE_THROUGH (0x00000002) | 将数据写入文件的系统服务、文件系统和驱动程序必须实际将数据传输到文件,然后才能被视为完成任何请求的写入操作。 |
FILE_SEQUENTIAL_ONLY (0x00000004) | 对文件的所有访问都是按顺序进行的。 |
FILE_NO_INTERMEDIATE_BUFFERING (0x00000008) | 文件不能在驱动程序的内部缓冲区中缓存或缓冲。 此标志与 DesiredAccessFILE_APPEND_DATA 标志不兼容。 |
FILE_SYNCHRONOUS_IO_ALERT (0x00000010) | 对文件执行的所有操作都是同步执行的。 代表调用方的任何等待都可能提前终止警报。 此标志还会导致 I/O 系统维护文件位置上下文。 如果设置了此标志,还必须设置 DesiredAccess SYNCHRONIZE 标志,以便 I/O 管理器将文件对象用作同步对象。 |
FILE_SYNCHRONOUS_IO_NONALERT (0x00000020) | 对文件执行的所有操作都是同步执行的。 在系统中等待同步 I/O 队列和完成不受警报约束。 此标志还会导致 I/O 系统维护文件位置上下文。 如果设置了此标志,还必须设置 DesiredAccess SYNCHRONIZE 标志,以便 I/O 管理器将文件对象用作同步对象。 |
FILE_NON_DIRECTORY_FILE (0x00000040) | 打开的文件不能是目录文件,否则此调用将失败。 正在打开的文件对象可以表示数据文件;逻辑、虚拟或物理设备;或卷。 |
FILE_CREATE_TREE_CONNECTION (0x00000080) | 为此文件创建树连接,以便通过网络打开它。 |
FILE_COMPLETE_IF_OPLOCKED (0x00000100) | 如果目标文件已锁定,则立即使用备用成功代码完成此操作,而不是阻止调用方线程。 如果文件已锁定,则另一个调用方已通过网络访问该文件。 |
FILE_NO_EA_KNOWLEDGE (0x00000200) | 如果打开的现有文件上的扩展属性指示调用方必须理解扩展属性才能正确解释文件,则此请求失败,因为调用方不了解如何处理扩展属性。 |
FILE_OPEN_REMOTE_INSTANCE (0x00000400) | 保留供系统使用;请勿使用。 |
FILE_RANDOM_ACCESS (0x00000800) | 对文件的访问可以是随机的,因此文件系统或操作系统不应对文件执行顺序读取操作。 |
FILE_DELETE_ON_CLOSE (0x00001000) | 在文件的最后一个句柄传递给 FltClose 时删除该文件。 |
FILE_OPEN_BY_FILE_ID (0x00002000) | 文件正按 ID 打开。 文件名包含设备名称和用于打开该文件的 64 位 ID。 |
FILE_OPEN_FOR_BACKUP_INTENT (0x000004000) | 正在为备份意向打开文件;因此,系统应检查某些访问权限,并在根据文件的安全描述符检查输入 DesiredAccess 之前,向调用方授予对该文件的适当访问权限。 |
FILE_NO_COMPRESSION (0x00008000) | 禁止从父目录继承FILE_ATTRIBUTE_COMPRESSED。 这允许在标记为已压缩的目录中创建非压缩文件。 |
FILE_OPEN_REQUIRING_OPLOCK (0x00010000) | 正在打开文件,并且正在以单个原子操作的形式请求对文件 (oplock) 的机会锁。 文件系统在执行创建操作之前检查 oplock,如果创建操作会中断现有的 oplock,则创建操作将失败并返回STATUS_CANNOT_BREAK_OPLOCK代码。 此标志在 Windows 7、Windows Server 2008 R2 和更高版本的 Windows 操作系统中可用。 |
FILE_DISALLOW_EXCLUSIVE (0x00020000) | 打开现有文件时,如果未指定FILE_SHARE_READ,并且文件系统访问检查不会向调用方授予对该文件的写入访问权限,则无法打开此文件并STATUS_ACCESS_DENIED。 这是 Windows 7 之前的默认行为。 |
FILE_SESSION_AWARE (0x00040000) | 正在使用会话感知打开文件或设备。 如果未指定此标志,则会话 0 中运行的进程无法打开每个会话 (设备,例如使用 RemoteFX USB 重定向) 的设备。 此标志对不在会话 0 中的调用方无效。 此标志仅在服务器版本的 Windows 上受支持。 在Windows Server 2012之前,不支持此标志。 |
FILE_RESERVE_OPFILTER (0x00100000) | 此标志允许应用程序请求筛选器机会锁 (oplock) ,以防止其他应用程序发生共享冲突。 如果已有打开的句柄,则创建请求将失败并STATUS_OPLOCK_NOT_GRANTED。 有关更多信息,请参见下面的“备注”部分。 |
FILE_OPEN_REPARSE_POINT (0x00200000) | 打开具有重分析点的文件,并绕过该文件的正常重分析点处理。 有关更多信息,请参见下面的“备注”部分。 |
FILE_OPEN_NO_RECALL (0x00400000) | 指示执行脱机存储或虚拟化的任何筛选器不因此打开而撤回文件的内容。 |
FILE_OPEN_FOR_FREE_SPACE_QUERY (0x00800000) | 此标志指示文件系统捕获与调用线程关联的用户。 使用返回的句柄对 FltQueryVolumeInformation 或 ZwQueryVolumeInformationFile 的任何后续调用都将假定捕获的用户,而不是当时的调用用户,以便计算调用方可用的可用空间。 这适用于以下 FsInformationClass 值:FileFsSizeInformation、FileFsFullSizeInformation 和 FileFsFullSizeInformationEx。 |
[in, optional] EaBuffer
指向调用方提供的 FILE_FULL_EA_INFORMATION 类型的变量的指针,该变量包含要应用于文件的扩展属性 (EA) 信息。 对于设备和中间驱动程序,此参数必须为 NULL。
[in] EaLength
EaBuffer 的长度(以字节为单位)。 对于设备驱动程序和中间驱动程序,此参数必须为零。
[in] CreateFileType
驱动程序必须将此参数设置为 CreateFileTypeNone。
[in, optional] InternalParameters
驱动程序必须将此参数设置为 NULL。
[in] Options
指定在生成创建请求期间要使用的选项。 可以使用以下零个或多个位标志值。
选项 标志 | 含义 |
---|---|
IO_FORCE_ACCESS_CHECK | I/O 管理器必须针对文件的安全描述符检查创建请求。 有关详细信息,请参阅“备注”。 |
IO_IGNORE_SHARE_ACCESS_CHECK | 创建文件对象后,I/O 管理器不应对其执行共享访问检查。 但是,文件系统可能仍会执行这些检查。 |
IO_STOP_ON_SYMLINK | 如果在打开或创建文件时遇到交接点、符号链接或全局重分析点,I/O 管理器将返回STATUS_STOPPED_ON_SYMLINK。 此外,IoStatusBlock-Information> 中将返回REPARSE_DATA_BUFFER结构。 调用方负责释放 REPARSE_DATA_BUFFER 结构。 |
IO_OPEN_TARGET_DIRECTORY | 打开文件的父目录。 |
[in, optional] DriverContext
指向之前由 IoInitializeDriverCreateContext 例程初始化的 IO_DRIVER_CREATE_CONTEXT 结构的可选指针。 IO_DRIVER_CREATE_CONTEXT 结构可用于将其他参数传递给 IoCreateFileEx 和 FltCreateFileEx2 例程。 有关详细信息,请参阅以下“备注”部分。
返回值
IoCreateFileEx 返回STATUS_SUCCESS或适当的 NTSTATUS 值,例如以下值之一。
返回代码 | 说明 |
---|---|
STATUS_INVALID_DEVICE_OBJECT_PARAMETER | 如果 DriverContext 参数不为 NULL,并且指定的设备对象未附加到文件或目录名称中指定的卷的文件系统驱动程序堆栈,IoCreateFileEx 将返回此状态值。 此设备对象由 IO_DRIVER_CREATE_CONTEXT 结构的 DeviceObjectHint 成员指定。 有关详细信息,请参阅 IO_DRIVER_CREATE_CONTEXT。 |
STATUS_MOUNT_POINT_NOT_RESOLVED | 如果 DriverContext 参数不为 NULL,并且文件或目录名称包含的装入点解析为指定设备对象所附加到的卷以外的卷,IoCreateFileEx 将返回此状态值。 此设备对象由 IO_DRIVER_CREATE_CONTEXT 结构的 DeviceObjectHint 成员指定。 有关详细信息,请参阅 IO_DRIVER_CREATE_CONTEXT。 |
STATUS_OBJECT_PATH_SYNTAX_BAD | 如果 ObjectAttributes 参数不包含 RootDirectory 成员,但 OBJECT_ATTRIBUTES 结构中的 ObjectName 成员为空字符串或不包含OBJECT_NAME_PATH_SEPARATOR字符,IoCreateFileEx 将返回此状态值。 这表示对象路径的语法不正确。 |
STATUS_STOPPED_ON_SYMLINK | 如果设置了 Options 参数标志IO_STOP_ON_SYMLINK,并且打开或创建文件时遇到符号链接,IoCreateFileEx 将返回此状态值。 |
如果 IoCreateFileEx 例程返回错误状态,则调用方可以通过检查 IoStatusBlock 参数查找有关失败原因的其他信息。
IoCreateFileEx 可能会返回STATUS_FILE_LOCK_CONFLICT作为返回值,或者在 IoStatusBlock 参数指向的 IO_STATUS_BLOCK 结构的 Status 成员中返回。 仅当 NTFS 日志文件已满且 IoCreateFileEx 尝试处理这种情况时发生错误时,才会发生这种情况。
注解
IoCreateFileEx 例程与 IoCreateFile 例程和 IoCreateFileSpecifyDeviceObjectHint 例程类似,但提供了其他功能,包括通过 IoCreateFileEx 例程的 DriverContext 参数访问额外创建参数 (E) CP、设备对象提示和事务信息。 有关这些基于结构的参数的详细信息,请参阅 IO_DRIVER_CREATE_CONTEXT。
文件系统筛选器驱动程序调用 IoCreateFileEx 以仅向指定的设备对象、其下方附加的筛选器和文件系统发送创建请求。 驱动程序堆栈中指定设备对象上方附加的筛选器不会接收创建请求。 但是,如果通过 DriverContext 参数) 传递的 IO_DRIVER_CREATE_CONTEXT 结构的 DeviceObjectHint 成员 (为 NULL,则请求将转到堆栈顶部,并由所有筛选器和文件系统接收。
如果 I/O 请求未转到驱动程序堆栈的顶部,即 DriverContext 参数不为 NULL ,并且有效的设备对象由 IO_DRIVER_CREATE_CONTEXT 结构的 DeviceObjectHint 成员指定,则以下限制适用:
- 如果传递给 IoCreateFileEx 例程的文件名路径包含装入点,则装入点必须解析为文件或目录所在的同一卷。
IoCreateFileEx 获取的句柄可由后续调用用于操作文件中的数据或文件对象的状态或属性。 最终必须通过调用 ZwClose 释放从 IoCreateFileEx 获取的任何句柄。
可通过两种替代方法指定要使用 IoCreateFileEx 创建或打开的文件的名称:
作为完全限定的路径名,在输入 ObjectAttributes 参数的 ObjectName 成员中提供。
作为相对于输入 ObjectAttributes 参数的 RootDirectory 成员中的句柄的路径名。 (此句柄可以表示目录文件。)
在系统进程以外的进程上下文中运行的驱动程序例程必须为 IoCreateFileEx 的 ObjectAttributes 参数设置 OBJ_KERNEL_HANDLE 属性。 这会将 IoCreateFileEx 返回的句柄的使用限制为在内核模式下运行的进程。 否则,运行驱动程序的上下文中的进程可以访问句柄。 驱动程序可以调用 InitializeObjectAttributes 来设置 OBJ_KERNEL_HANDLE 属性。
某些 DesiredAccess 标志和标志的组合具有以下效果:
要使调用方等待返回 的 FileHandle 设置为“已信号”状态来同步 I/O 完成,则必须设置 SYNCHRONIZE 标志。 否则,作为设备或中间驱动程序的调用方必须使用事件对象同步 I/O 完成。
如果仅设置了FILE_APPEND_DATA和 SYNCHRONIZE 标志,则调用方只能写入文件末尾,并且有关写入文件的任何偏移量信息将被忽略。 但是,对于此类写入操作,文件将根据需要自动扩展。
为文件设置FILE_WRITE_DATA标志还允许在文件末尾之外进行写入。 文件也会自动扩展,以便进行此类写入。
如果只设置了FILE_EXECUTE和 SYNCHRONIZE 标志,则调用方无法使用返回的 FileHandle 直接读取或写入文件中的任何数据:也就是说,针对文件的所有操作都通过系统寻呼程序进行,以响应指令和数据访问。 设备和中间驱动程序不应在 DesiredAccess 中设置FILE_EXECUTE标志。
ShareAccess 参数确定单独的线程是否可以同时访问同一文件。 如果两个文件打开程序都有权以指定的方式访问文件,则可以成功打开和共享该文件。 如果 IoCreateFileEx 的原始调用方未指定FILE_SHARE_READ、FILE_SHARE_WRITE或FILE_SHARE_DELETE,则无法对文件执行其他打开操作:即,原始调用方被授予对该文件的独占访问权限。
若要成功打开共享文件,该文件的请求 DesiredAccess 值必须与之前尚未使用 ZwClose 发布的所有打开请求的 DesiredAccess 和 ShareAccess 规范兼容。 也就是说,指定给给定文件的 IoCreateFileEx 的 DesiredAccess 值不得与文件的其他打开程序禁止的访问发生冲突。
如果在 Options 参数中指定了IO_IGNORE_SHARE_ACCESS_CHECK,则 I/O 管理器将忽略 ShareAccess 参数。 但是,文件系统可能仍会执行访问检查。 因此,请务必为 ShareAccess 参数指定所需的共享模式,即使使用 IO_IGNORE_SHARE_ACCESS_CHECK 标志也是如此。
“处置”值FILE_SUPERSEDE要求调用方对现有文件对象具有 DELETE 访问权限。 如果是这样,如果成功调用 IoCreateFileEx 并FILE_SUPERSEDE现有文件,则会有效地删除该文件,然后重新创建该文件。 这意味着,如果文件已被另一个线程打开,则线程通过指定 ShareAccess 参数来打开文件,并设置了FILE_SHARE_DELETE标志。 请注意,这种类型的处置与覆盖文件的 POSIX 样式一致。
处置值FILE_OVERWRITE_IF和FILE_SUPERSEDE相似。 如果 IoCreateFileEx 是使用现有文件和这些 Disposition 值之一调用的,则将替换该文件。
覆盖文件在语义上等效于取代操作,但以下情况除外:
调用方必须具有对文件的写入访问权限,而不是删除访问权限。 这意味着,如果文件已由另一个线程打开,它将在输入 ShareAccess 中设置FILE_SHARE_WRITE标志打开文件。
指定的文件属性在逻辑上与文件上已有的属性一起为 ORed。 这意味着,如果文件已被另一个线程打开, IoCreateFileEx 的后续调用方无法禁用现有的 FileAttributes 标志,但可以为同一文件启用其他标志。 请注意,这种覆盖文件的样式与 MS-DOS、Windows 3.1 和 OS/2 一致。
CreateOptions FILE_DIRECTORY_FILE 值指定要创建或打开的文件是目录文件。 创建目录文件时,文件系统会在磁盘上创建适当的结构,以表示该特定文件系统的磁盘上结构的空目录。 如果指定了此选项,并且要打开的给定文件不是目录文件,或者调用方指定的 CreateOptions 或 Disposition 值不一致,则对 IoCreateFileEx 的调用将失败。
CreateOptions FILE_NO_INTERMEDIATE_BUFFERING 标志阻止文件系统代表调用方执行任何中间缓冲。 指定此值会对 Zw 的调用方参数进行某些限制 。文件 例程,包括以下内容:
传递给 ZwReadFile 或 ZwWriteFile 的任何可选 ByteOffset 必须是扇区大小的整数 (整数) 。
传递给 ZwReadFile 或 ZwWriteFile 的 Length 必须是扇区大小的整数。 请注意,如果在传输过程中到达文件的末尾,则指定对长度正好为扇区大小的缓冲区的读取操作可能会导致传输到该缓冲区的重要字节数减少。
缓冲区必须根据基础设备的对齐要求进行对齐。 可以通过调用 IoCreateFileEx 获取表示物理设备的文件对象的句柄,然后使用该句柄调用 ZwQueryInformationFile 来获取此信息。 有关系统FILE_XXX_ALIGNMENT值的列表,请参阅 DEVICE_OBJECT。
对 FileInformationClass 参数设置为 FilePositionInformation 的 ZwSetInformationFile 的调用必须指定作为扇区大小的整数的偏移量。
互斥 的 CreateOptions(FILE_SYNCHRONOUS_IO_ALERT和FILE_SYNCHRONOUS_IO_NONALERT标志)指定,只要通过返回的 FileHandle 引用的文件对象执行,文件上的所有 I/O 操作都将是同步的。 使用返回的句柄跨所有线程序列化此类文件上的所有 I/O。 对于上述任一 CreateOptions 值,必须设置 DesiredAccess SYNCHRONIZE 标志,以便 I/O 管理器将文件对象用作同步对象。 设置上述任一 CreateOptions 值后,I/O 管理器将维护文件对象的“文件位置上下文”,即内部的当前文件位置偏移量。 此偏移量可用于对 ZwReadFile 和 ZwWriteFile 的调用。 还可以通过调用 ZwQueryInformationFile 或通过调用 ZwSetInformationFile 来查询其位置。
如果未指定 CreateOptions FILE_OPEN_REPARSE_POINT 标志,并且 IoCreateFileEx 尝试使用重新分析点打开文件,则文件将进行正常的重新分析点处理。 另一方面,如果指定了FILE_OPEN_REPARSE_POINT标志, 则不会 进行正常的重新分析处理, 并且 IoCreateFileEx 会尝试直接打开重新分析点文件。 在任一情况下,如果打开操作成功, IoCreateFileEx 将返回STATUS_SUCCESS;否则,例程将返回 NTSTATUS 错误代码。 IoCreateFileEx 从不返回STATUS_REPARSE。
CreateOptions FILE_OPEN_REQUIRING_OPLOCK 标志消除了打开文件和请求 oplock 之间的时间,oplock 可能会使第三方打开文件并发生共享冲突。 应用程序可以在 IoCreateFileEx 上使用 FILE_OPEN_REQUIRING_OPLOCK 标志,然后请求任何 oplock。 这可确保 oplock 所有者收到导致共享冲突的任何后续打开请求的通知。
在 Windows 7 中,如果应用程序使用 FILE_OPEN_REQUIRING_OPLOCK 标志时文件上存在其他句柄,则创建操作将失败并出现STATUS_OPLOCK_NOT_GRANTED。 从Windows 8开始,此限制不再存在。
如果此创建操作会中断文件上已存在的 oplock,则设置FILE_OPEN_REQUIRING_OPLOCK标志将导致创建操作失败并出现STATUS_CANNOT_BREAK_OPLOCK。 此创建操作不会破坏现有的 oplock。
使用此标志的应用程序必须在此调用成功后请求 oplock,否则将阻止以后打开该文件的所有尝试,而没有典型 oplock 处理的好处。 同样,如果此调用成功,但后来的 oplock 请求失败,则使用此标志的应用程序必须在检测到 oplock 请求失败后关闭其句柄。
FILE_OPEN_REQUIRING_OPLOCK标志在 Windows 7、Windows Server 2008 R2 及更高版本的 Windows 操作系统中可用。 实现此标志的 Microsoft 文件系统为 NTFS、FAT 和 exFAT。
CreateOptions 标志(FILE_RESERVE_OPFILTER)允许应用程序请求级别 1、批处理或筛选器 oplock,以防止其他应用程序发生共享冲突。 但是,FILE_RESERVE_OPFILTER实际上只对筛选器 oplock 有用。 若要使用它,必须执行以下步骤:
使用 createOptions FILE_RESERVE_OPFILTER、DesiredAccess 为 exactly FILE_READ_ATTRIBUTES 和 ShareAccess 发出创建请求FILE_SHARE_READ |FILE_SHARE_WRITE |FILE_SHARE_DELETE。
如果已打开句柄,则创建请求会失败并STATUS_OPLOCK_NOT_GRANTED,下一个请求的 oplock 也会失败。
如果以更多访问权限或更少的共享打开也会导致STATUS_OPLOCK_NOT_GRANTED失败。
如果创建请求成功,请请求 oplock。
打开文件的另一个句柄以执行 I/O。
步骤 3 使此功能仅适用于筛选器 oplock。 步骤 3 中打开的句柄可以包含最多FILE_READ_ATTRIBUTES的 DesiredAccess |FILE_WRITE_ATTRIBUTES |FILE_READ_DATA |FILE_READ_EA |FILE_EXECUTE |SYNCHRONIZE |READ_CONTROL,但仍未中断筛选器 oplock。 但是,任何大于 FILE_READ_ATTRIBUTES 的 DesiredAccess |FILE_WRITE_ATTRIBUTES |SYNCHRONIZE 会中断级别 1 或批处理 oplock,并使FILE_RESERVE_OPFILTER标志对这些 oplock 类型无用。
对于源自用户模式的创建请求,如果驱动程序在 IoCreateFileEx 的 Options 参数中设置IO_FORCE_ACCESS_CHECK,则它还应在 ObjectAttributes 参数中设置OBJ_FORCE_ACCESS_CHECK。 有关此标志的信息,请参阅 OBJECT_ATTRIBUTES 的 Attributes 成员。
NTFS 是唯一实现FILE_RESERVE_OPFILTER的 Microsoft 文件系统。
IoCreateFileEx 可用于获取卷的句柄。
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
标头 | ntddk.h (包括 Ntddk.h、Ntifs.h、FltKernel.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
另请参阅
FltAllocateExtraCreateParameter
FltAllocateExtraCreateParameterList