NtQueryDirectoryFile 函数 (ntifs.h)

NtQueryDirectoryFile 例程返回有关给定文件句柄指定的目录中文件的各种信息。

语法

__kernel_entry NTSYSCALLAPI NTSTATUS NtQueryDirectoryFile(
  [in]           HANDLE                 FileHandle,
  [in, optional] HANDLE                 Event,
  [in, optional] PIO_APC_ROUTINE        ApcRoutine,
  [in, optional] PVOID                  ApcContext,
  [out]          PIO_STATUS_BLOCK       IoStatusBlock,
  [out]          PVOID                  FileInformation,
  [in]           ULONG                  Length,
  [in]           FILE_INFORMATION_CLASS FileInformationClass,
  [in]           BOOLEAN                ReturnSingleEntry,
  [in, optional] PUNICODE_STRING        FileName,
  [in]           BOOLEAN                RestartScan
);

参数

[in] FileHandle

NtCreateFileNtOpenFile 返回的文件对象的句柄,该对象表示要为其请求信息的目录。 如果调用方为 事件ApcRoutine指定非 NULL 值,则必须为异步 I/O 打开文件对象。

[in, optional] Event

调用方创建的事件的可选句柄。 如果提供了此参数,则调用方将进入等待状态,直到请求的作完成并且给定的事件设置为 Signaled 状态。 此参数是可选的,可以是 NULL。 如果调用方将等待 FileHandle 设置为 Signaled 状态,则该参数必须为 NULL。

[in, optional] ApcRoutine

请求的作完成时要调用的可选调用方提供的 APC 例程的地址。 此参数是可选的,可以是 NULL。 如果存在与文件对象关联的 I/O 完成对象,此参数必须为 NULL。

[in, optional] ApcContext

如果调用方提供 APC 或 I/O 完成对象与文件对象关联,则为调用方确定的上下文区域的可选指针。 作完成后,如果指定了上下文,或作为 I/O 管理器发布到关联的 I/O 完成对象的完成消息的一部分,则此上下文将传递到 APC。

此参数是可选的,可以是 NULL。 如果 ApcRoutine 为 NULL,并且没有与文件对象关联的 I/O 完成对象,则该参数必须为 NULL。

[out] IoStatusBlock

指向 IO_STATUS_BLOCK 结构的指针,该结构接收最终完成状态和有关作的信息。 对于返回数据的成功调用,在结构的 信息 成员中返回写入 FileInformation 缓冲区的字节数。

[out] FileInformation

指向接收有关文件的所需信息的缓冲区的指针。 缓冲区中返回的信息的结构由 FileInformationClass 参数定义。

[in] Length

FileInformation指向的缓冲区的大小(以字节为单位)。 调用方应根据给定 FileInformationClass设置此参数。

[in] FileInformationClass

要返回的有关目录中文件的信息类型。 要返回的有关目录中文件的信息类型。 有关可能值列表,请参阅 NtQueryDirectoryFileExFileInformationClass 参数。

[in] ReturnSingleEntry

如果只返回单个条目,则设置为 TRUE,否则 FALSE。 如果此参数 TRUENtQueryDirectoryFile 仅返回找到的第一个条目。

[in, optional] FileName

一个可选指针,指向调用方分配的 Unicode 字符串的可选指针,该字符串包含文件的名称(或使用多个文件(如果使用通配符),FileHandle指定的目录中。 此参数是可选的,可以是 NULL。

如果 FileName 不为 NULL,则目录扫描中仅包含名称与 FileName 字符串匹配的文件。 如果 FileName 为 NULL,则包括所有文件。

FileName 用作搜索表达式,并在首次调用 NtQueryDirectoryFile 时捕获给定句柄。 对 NtQueryDirectoryFile 的后续调用将使用第一次调用中设置的搜索表达式。 将忽略传递给后续调用的 FileName 参数。

[in] RestartScan

如果扫描从目录中的第一个条目开始,则设置为 TRUE。 如果从上一个调用恢复扫描,则设置为 FALSE

当为特定句柄调用 NtQueryDirectoryFile 例程时,RestartScan 参数将被视为设置为 TRUE,而不考虑其值。 在后续 NtQueryDirectoryFile 调用中,将遵循 RestartScan 参数的值。

返回值

NtQueryDirectoryFile例程返回STATUS_SUCCESS或适当的错误状态。 可以返回的错误状态值集特定于文件系统。 NtQueryDirectoryFile还返回实际写入到 IoStatusblockInformation 成员中给定的 FileInformation 缓冲区的字节数。 有关一些可能的错误代码的列表,请参阅 NtQueryDirectoryFileEx

言论

NtQueryDirectoryFile 例程返回由 FileHandle表示的目录中包含的文件的相关信息。

如果提供,则 FileName 参数的值将确定目录扫描中包含的条目,以扫描给定 FileHandle的所有后续调用 NtQueryDirectoryFile

如果至少有一个匹配项,NtQueryDirectoryFile 为每个条目创建 FILE_XXX_INFORMATION 结构,并将其存储在缓冲区中。

假设找到至少一个匹配的目录项,则返回其信息的条目数是以下项的 *最小:

  • 如果 ReturnSingleEntry 的条目为 TRUEFileName 为 NULL,则为一个条目。
  • 如果 FileName 不是 NULL,则与 FileName 字符串匹配的条目数。 (请注意,如果字符串不包含通配符,则最多可以有一个匹配项。
  • 其信息适合指定缓冲区的条目数。
  • 目录中包含的条目数。

在首次调用 NtQueryDirectoryFile时,如果为找到的第一个条目创建的结构太大而无法容纳到输出缓冲区中,则例程会将结构的固定部分写入输出缓冲区。 然后,例程将写入输出缓冲区,就像 FileName 字符串一样适合。 (结构的固定部分包含除最终 FileName 字符串以外的所有字段。在第一次调用(而不是后续调用)时,I/O 系统可确保缓冲区足够大,足以容纳适当 FILE_XXX_INFORMATION 结构的固定部分。发生这种情况时,NtQueryDirectoryFile 返回适当的状态值,例如STATUS_BUFFER_OVERFLOW。

每次调用时,NtQueryDirectoryFile 返回尽可能多的 FILE_XXX_INFORMATION 结构(每个目录条目一个),就像 FileInformation指向的缓冲区中一样。 在第一次调用中,仅当输出缓冲区包含至少一个完整的结构时,NtQueryDirectoryFile 才会返回STATUS_SUCCESS。 在后续调用中,如果输出缓冲区不包含任何结构,NtQueryDirectoryFile 返回STATUS_SUCCESS,但设置 IoStatusblock->信息 = 0 以通知调用方此条件。 在这种情况下,调用方应分配更大的缓冲区,并再次调用 NtQueryDirectoryFile。 不会报告任何剩余条目的相关信息。 因此,除了上面列出的只返回一个条目的情况下,NtQueryDirectoryFile 必须至少调用两次才能枚举整个目录的内容。

调用 NtQueryDirectoryFile时,你可能会看到对与 NtQueryDirectoryFile 调用并行发生的目录所做的更改。 此行为取决于基础文件系统的实现。

NtQueryDirectoryFile 的最终调用将返回空输出缓冲区,并报告相应的状态值,例如STATUS_NO_MORE_FILES。

如果在同一目录中多次调用 NtQueryDirectoryFile,而其他一些作会更改该目录的内容,则可能会看到任何更改,具体取决于作的时间。

NtQueryDirectoryFile在文件系统不支持的 FILE_XXX_INFORMATION 结构的任何成员中返回零。

NtQueryDirectoryFile 的调用方必须在 IRQL = PASSIVE_LEVEL 上运行,并且 启用了特殊内核 APC

有关其他文件信息查询例程的信息,请参阅 文件对象

注意

如果在用户模式下调用 NtQueryDirectoryFile 函数,则应使用名称“NtQueryDirectoryFile”而不是“ZwQueryDirectoryFile”。

对于内核模式驱动程序的调用,NtXXXZwXXX 版本的 Windows 本机系统服务例程的行为方式可能以处理和解释输入参数的方式不同。 有关 NtXXXZwXXX 例程版本之间的关系的详细信息,请参阅 使用 Nt 和 Zw 版本的本机系统服务例程

要求

要求 价值
最低支持的客户端 Windows XP
目标平台 普遍
标头 ntifs.h (include Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL(请参阅“备注”部分)
DDI 符合性规则 HwStorPortProhibitedDDI、PowerIrpDDis

另请参阅

FILE_BOTH_DIR_INFORMATION

FILE_DIRECTORY_INFORMATION

FILE_FULL_DIR_INFORMATION

FILE_ID_BOTH_DIR_INFORMATION

FILE_ID_FULL_DIR_INFORMATION

FILE_NAMES_INFORMATION

FILE_OBJECTID_INFORMATION

FILE_REPARSE_POINT_INFORMATION

IO_STATUS_BLOCK

UNICODE_STRING

NtCreateFile

NtOpenFile