您的位置  > 互联网

创建新的文件或目录,或打开现有文件、设备、目录或卷

创建新文件或目录,或打开现有文件、设备、目录或卷。

该函数在用户模式下相当于驱动程序工具包 (WDK) 中描述的函数。

语法

__kernel_entry NTSTATUS NtCreateFile(
  [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              CreateDisposition,
  [in]           ULONG              CreateOptions,
  [in]           PVOID              EaBuffer,
  [in]           ULONG              EaLength
);

范围

[出去]

指向变量的指针,如果调用成功,该变量将接收文件句柄。

[在]

表示调用者所需的文件或目录访问类型的值。 系统定义的一组标志确定文件对象的以下特定访问权限。

价值含义

该文件可以被删除。

可以从文件中读取数据。

可以读取后面描述的标志。

可以读取与文件关联的扩展属性。 该标志与设备和中间驱动程序无关。

可以读取与文件关联的访问控制列表 (ACL) 和所有权信息。

数据可以写入文件。

S

可以写入标志。

与文件关联的扩展属性()可以写入。 该标志与设备和中间驱动程序无关。

数据可以附加到文件中。

可以写入与该文件关联的 DACL(自由访问控制列表)。

可以写入与文件关联的所有权信息。

返回可以等待与 I/O 操作完成同步。 如果未打开同步 I/O,则忽略该值。

您可以使用系统分页 I/O 将文件中的数据读入内存。 该标志与设备和中间驱动程序无关。

创建或打开目录时,请勿指定 、 或 。

的调用者可以为不表示目录文件的任何文件对象指定以下一项或多项组合,可能使用按位或以及前面标志列表中的其他兼容标志。

价值含义

| | | |

电子| |S | | |

UTE | | |

值与设备和中间驱动程序无关。

是一个预定义的系统值,用于增强系统对象的安全性。

要打开或创建目录文件,如参数所示,调用者可以指定以下一项或多项的组合,可能使用按位或以及上述标志列表中的一个或多个兼容性标志。

价值含义

可以列出目录中的文件。

目录可以被遍历:也就是说,它可以是文件路径名的一部分。

[在]

指向已初始化的结构的指针。 文件对象的该结构的成员包括以下内容。

价值含义

超长长度

指定提供的数据的字节数。 该值的大小必须至少为 ()。

(可选)指定通过先前调用获得的目录的句柄。 如果该值为 NULL,则该成员必须是包含目标文件完整路径的完全限定文件规范。 如果该值非 NULL,则该成员指定相对于该目录的文件名。

指向命名要创建或打开的文件的缓冲区字符串的指针。 该值必须是完全限定的文件规范或设备对象的名称,除非它是相对于指定目录的文件的名称。 例如,\\\.dat 或 \? ? \B:\.dat 可以是完全限定的文件规范,前提是加载软盘驱动程序并覆盖文件系统。 有关详细信息,请参阅文件名、路径和命名空间。

乌龙属性

控制文件对象属性的一组标志。 该值可以为零或 ,这表明名称查找代码应忽略成员的大小写,而不是执行精确匹配搜索。 该值与设备和中间驱动程序无关。

(可选)指定要应用于文件的安全描述符。 此类安全描述符指定的 ACL 仅适用于创建文件时的文件。 如果创建文件时该值为 NULL,则放置在该文件上的 ACL 取决于文件系统; 大多数文件系统从父目录文件传播此类 ACL 的某些部分,并结合调用者的默认 ACL。 设备和中间驱动程序可以将此成员设置为 NULL。

指定服务器应授予对客户端安全上下文的访问权限。 仅当与受保护服务器建立连接时,该值才为非 NULL,从而允许调用者控制将调用者安全上下文的哪些部分提供给服务器,以及是否允许服务器模拟调用者。

[出去]

指向接收最终完成状态和有关请求操作的信息的变量的指针。 返回时,该成员包含以下值之一:

[在, ]

文件的初始分配大小(以字节为单位)。 除非正在创建、覆盖或替换文件,否则非零值没有任何作用。

[在]

文件属性。 显式指定的属性仅在创建、替换或在某些情况下覆盖文件时应用。 默认情况下,该值为 L,并且可以由 Wdm.h 和 NtDdk.h 中定义的一个或多个标志的 OR 组合覆盖。 请参阅 参考资料 获取可与 一起使用的标志列表。

[在]

调用者想要在文件中使用的共享访问类型,可以是零、一或以下值的组合。

价值含义

可以通过来自其他线程的调用打开该文件以进行读访问。

可以通过来自其他线程的调用打开该文件以进行写访问。

可以通过其他线程的调用打开该文件以进行删除访问。

详情请参见SDK。

[在]

根据文件是否已存在,将操作指定为以下值之一。

价值含义

如果该文件已存在,则将其替换为给定文件。 如果没有,则创建给定的文件。

如果文件已存在,则导致请求失败并且不会创建或打开给定文件。 如果没有,则创建给定的文件。

如果该文件已存在,请打开它而不是创建新文件。 如果不是,则请求失败并且不会创建新文件。

如果该文件已存在,请打开它。 如果没有,则创建给定的文件。

如果该文件已存在,请打开它并覆盖它。 如果不是,则请求失败。

如果该文件已存在,请打开它并覆盖它。 如果没有,则创建给定的文件。

[在]

创建或打开文件时应用的选项,作为以下标志的兼容组合。

价值含义

正在创建或打开的文件是目录文件。 使用此标志时,参数必须设置为 、 、 或 。 使用此标志,其他兼容标志仅包括以下标志:ALERT、 、 和 。

ILE

正在打开的文件不能是目录文件,否则调用失败。 正在打开的文件对象可以表示数据文件、逻辑、虚拟或物理设备或卷。

将数据写入文件的应用程序必须实际将数据传输到文件,然后才能认为任何请求的写入操作已完成。 如果设置了该标志,则自动设置该标志。

对文件的所有访问都是顺序的。

对文件的访问可以是随机的,因此 FSD 或系统不应对文件执行顺序预读操作。

该文件无法在驱动程序的内部缓冲区中进行缓存或缓冲。 该标志与标志不兼容。

警报

对文件执行的所有操作都是同步执行的。 任何代表呼叫者的等待都可能提前终止警报。 该标志还导致 I/O 系统维护文件位置上下文。 如果设置了该标志,则还必须设置 NIZE 标志。

对文件执行的所有操作都是同步执行的。 等待系统中的同步 I/O 队列和完成不受警报影响。 该标志还导致 I/O 系统维护文件位置上下文。 如果设置了该标志,则还必须设置 NIZE 标志。

为此文件创建树连接以通过网络打开它。 设备和中间驱动程序不使用此标志。

如果正在打开的现有文件的扩展属性指示调用者必须理解 EA 才能正确解释该文件,则请求将失败,因为调用者不理解如何处理 EA。 该标志与设备和中间驱动程序无关。

INT

打开带有重分析点的文件并绕过文件的正常重分析点处理。 详情请参阅“备注”部分。

当将最后一个句柄传递给文件时,删除该文件。 如果设置了该标志,则必须在参数中设置该标志。

参数指定的文件名包括文件的 8 字节文件参考号。 该编号由特定文件系统分配并特定于特定文件系统。 如果文件是重分析点,则文件名还将包含设备的名称。 请注意,FAT 文件系统不支持此标志。 设备和中间驱动程序不使用此标志。

打开文件进行备份。 因此,系统应该在根据文件的安全描述符检查参数之前检查某些访问权限并授予调用者对文件的适当访问权限。 设备和中间驱动程序不使用此标志。

该标志允许应用程序请求过滤器 () 以防止其他应用程序的共享冲突。 如果已经有一个打开的句柄,则创建请求将失败并显示 ANTED。 详情请参阅“备注”部分。

正在打开一个文件,并以单个原子操作的形式请求对该文件的机会锁( lock)。 文件系统在执行创建操作之前进行检查,如果结果会破坏现有操作,则会导致创建失败并返回代码。 欲了解更多信息,请参阅“备注”部分。 2008、Vista、2003 和 XP:不支持此标志。

以下文件系统支持此标志:NTFS、FAT 和 exFAT。

锁定

如果目标文件被锁定,则会使用备用成功代码立即完成此操作,而不是阻塞调用者线程。 如果文件被锁定,则另一个调用者已经可以访问该文件。 设备和中间驱动程序不使用此标志。

[在]

指向用于传输扩展属性的 EA 缓冲区的指针。

请注意,某些文件系统可能不支持 EA 缓冲区。

[在]

EA 缓冲区的长度。

返回值

返回或适当的错误状态。 如果返回错误状态,调用者可以检查以查找有关失败原因的详细信息。 为了简化此检查,应用程序可以使用 , 和 宏。

注解

后续调用可以使用提供的句柄来操作文件中的数据或文件对象的状态或属性。

有两种替代方法可以指定要创建或打开的文件的名称:

某些标志和标志组合具有以下效果: 参数确定单独的线程是否可以同时访问同一文件。 如果两个文件打开程序都具有以指定方式访问该文件的权限,则可以成功打开和共享该文件。 如果原始调用者未指定 、 或 ,则无法对该文件执行其他打开操作; 也就是说,原始调用者被授予对该文件的独占访问权限。

要成功打开共享文件,文件请求的参数必须与所有以前未使用的打开和规范版本兼容。 也就是说,为给定文件指定的参数不得与打开该文件的其他程序禁止的访问冲突。

Value 要求调用者有权访问现有文件对象。 如果是这样,如果调用成功并且检索到现有文件,则该文件将被有效删除,然后重新创建。 这意味着如果文件已被另一个线程打开,它将通过指定参数来打开文件并设置标志。 请注意,这种类型的处理与覆盖文件的 POSIX 风格一致。 价值观相似。 如果使用现有文件和任何这些值调用,则该文件将被替换。

覆盖文件在语义上等同于替换操作,但以下情况除外:

该值指定要创建或打开的文件是目录文件。 创建目录文件时,文件系统会在磁盘上创建适当的结构来表示该特定文件系统的磁盘结构的空目录。 如果指定此选项并且要打开的给定文件不是目录文件,或者调用者指定了不一致的 OR 值,则调用将失败。

ING 标志防止文件系统代表调用者执行任何中间缓冲。 指定此值会对其他 NtXXX 文件例程的调用者参数施加某些限制,包括:

flag(顾名思义)指定文件上的所有 I/O 操作只要通过返回的引用文件对象发生,都将是同步的。 此类文件上的所有 I/O 均使用返回的句柄跨所有线程进行序列化。 对于上述任一情况,必须设置 NIZE 标志,以便 I/O 管理器使用文件对象作为同步对象。 当设置以上任一选项时,I/O 管理器将维护文件对象的“文件位置上下文”,即内部当前文件位置偏移量。 该偏移量可用于调用 and 。 您还可以使用 le 并查询或设置其位置。

如果参数指定 INT 标志,并且打开带有重分析点的文件,则不会发生正常的重分析处理,并且将尝试直接打开重分析点文件。 如果未指定 INT 标志,则文件将进行正常的重分析点处理。 无论哪种情况,如果打开操作成功,都会返回; 否则为错误代码。 该函数永远不会返回。

该参数的标志消除了打开文件和请求文件之间的时间,因为可能允许第三方打开文件,从而导致共享冲突。 应用程序可以使用该标志来请求任何内容。 这可确保所有者收到导致共享冲突的任何后续打开请求的通知。

在 7 中,如果应用程序使用此标志时文件上存在另一个句柄,则创建操作将失败并出现 ANTED。 从8开始,这个限制不再存在。

如果此创建操作会中断文件中已存在的内容,则设置该标志将导致创建操作失败并显示一条消息。 此创建操作不会破坏现有的。

使用此标志的应用程序必须在此调用成功后发出请求,否则所有后续打开文件的尝试都将被阻止,而无法进行正常处理。 同样,如果此调用成功但后续请求失败,则使用此标志的应用程序必须在检测到请求失败后关闭其句柄。

请注意,该标志适用于 7、2008 R2 及更高版本操作系统中的以下文件系统:NTFS、FAT 和 exFAT。

该参数的 R 标志允许应用程序请求 Level 1、Batch 或 Batch,以防止与其他应用程序发生共享冲突。 然而,实际上,R 只适用于过滤器。 要使用它,您必须完成以下步骤:

发出创建请求,其中 R 是 、 是 、 是 。 ( | | ) 可能失败如下: 如果创建请求成功,则请求。 打开文件的另一个句柄以执行 I/O。 步骤 3 使此功能仅适用于过滤器。 步骤 3 中打开的句柄可以具有最大值 ( | S | | | | | ) 并且仍然不会破坏过滤器。 但是,任何大于 (|S|) 的值都会破坏级别 1 或批次,并使 R 标志对这些类型无用。

NTFS 是唯一用 R 实现的文件系统。

有关详细信息,请参阅语义。

请注意,许多常量定义和宏都需要 WDK 头文件 NtDef.h。 您还可以使用 和 函数动态链接到 NtDll.dll。

所需值

目标平台

标头

。H

ntdll库

DLL

dll文件