FltQueryDirectoryFile 函数 (fltkernel.h)

FltQueryDirectoryFile 例程返回有关给定文件对象指定的目录中文件的各种信息。 使用 FltQueryDirectoryFileEx 进行更高的查询控制。

语法

NTSTATUS FLTAPI FltQueryDirectoryFile(
  [in]            PFLT_INSTANCE          Instance,
  [in]            PFILE_OBJECT           FileObject,
  [out]           PVOID                  FileInformation,
  [in]            ULONG                  Length,
  [in]            FILE_INFORMATION_CLASS FileInformationClass,
  [in]            BOOLEAN                ReturnSingleEntry,
  [in, optional]  PUNICODE_STRING        FileName,
  [in]            BOOLEAN                RestartScan,
  [out, optional] PULONG                 LengthReturned
);

参数

[in] Instance

指向启动 I/O 的筛选器驱动程序实例的不透明指针。

[in] FileObject

指向表示要扫描的目录的文件对象的指针。

[out] FileInformation

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

[in] Length

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

[in] FileInformationClass

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

[in] ReturnSingleEntry

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

[in, optional] FileName

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

如果 FileNameNULL,则目录扫描中仅包含与 FileName 字符串匹配的文件。 如果 FileNameNULL,则包括所有文件。 如果 RestartScanFALSE,则忽略 FileName 的值。

[in] RestartScan

如果扫描从目录中的第一个条目开始,则设置为 TRUE。 如果从上一个调用恢复扫描,则设置为 FALSE。 调用方首次 调用 fltQueryDirectoryFile 时,调用方必须将此参数设置为 TRUE

[out, optional] LengthReturned

接收实际写入给定 FileInformation 缓冲区的字节数。

返回值

FltQueryDirectoryFile 返回STATUS_SUCCESS或适当的错误状态。 请注意,可以返回的错误状态值集特定于文件系统。

言论

FltQueryDirectoryFile 返回有关由 fileObject 表示的目录中的文件的信息。

FltQueryDirectoryFile 的第一次调用 根据 ReturnSingleEntryFileNameRestartScan的值来确定目录扫描中要包括的所有条目集。 如果至少有一个匹配项,FltQueryDirectoryFile 为每个条目创建FILE_XXX_INFORMATION 结构(请参阅上表),并将结构存储到缓冲区中。

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

  • 如果 ReturnSingleEntryTRUE,并且 FileNameNULL,则返回一个条目。

  • 如果 FileNameNULL,则与 FileName 字符串匹配的条目数。 (请注意,如果字符串不包含通配符,则最多可以有一个匹配项。

  • 其信息适合指定缓冲区的条目数。

  • 目录中包含的条目数。

在第一次调用 FltQueryDirectoryFile时,如果为第一个条目创建的结构太大而无法容纳到输出缓冲区中,则只返回结构的固定部分。 固定部分包含结构的所有字段,但最终 FileName 字符串除外。 在第一次调用(而不是后续调用中)时,I/O 系统可确保缓冲区足够大,足以容纳适当FILE_XXX_INFORMATION 结构的固定部分。 发生这种情况时,FltQueryDirectoryFile 返回适当的状态值,例如STATUS_BUFFER_OVERFLOW。 此外,在首次调用 FltQueryDirectoryFile时,如果 FileObject 目录中没有与 FileName 参数匹配的文件,FltQueryDirectoryFile 将返回适当的状态值,例如STATUS_NO_SUCH_FILE。

每次调用时,FltQueryDirectoryFile 返回尽可能多的 FILE_XXX_INFORMATION 结构(每个目录条目一个),就像 FileInformation指向的缓冲区中一样。 只要输出缓冲区至少包含一个完整的结构,则返回的状态值STATUS_SUCCESS。 不会报告任何剩余条目的相关信息。 因此,除了上面列出的只返回一个条目的情况下,FltQueryDirectoryFile 必须至少调用两次才能枚举整个目录的内容(例如,当 FileName 参数包含一个或多个通配符或 NULL时)。

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

注意

在同一目录中多次调用 FltQueryDirectoryFile 时,可能会返回信息的条目数小于预期。 这是因为在首次调用 fltQueryDirectoryFile 时,目录扫描中包含的条目集是固定的。 在后续调用中,FltQueryDirectoryFile 恢复目录扫描,无论它在此相同的枚举中离开的位置。 但是,在调用 FltQueryDirectoryFile之间,实际的目录条目可以更改,以便它们不再与原始枚举同步。

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

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

FltQueryDirectoryFile 的调用方必须在 IRQL = PASSIVE_LEVEL 且启用了 APC 的情况下运行。 有关详细信息,请参阅 禁用 APC

要求

要求 价值
最低支持的客户端 Windows Vista
目标平台 普遍
标头 fltkernel.h (包括 Fltkernel.h)
FltMgr.lib
DLL Fltmgr.sys
IRQL PASSIVE_LEVEL(请参阅“备注”部分)

另请参阅

FILE_BOTH_DIR_INFORMATION

FILE_DIRECTORY_INFORMATION

FILE_FULL_DIR_INFORMATION

FILE_ID_BOTH_DIR_INFORMATION

FILE_ID_EXTD_BOTH_DIR_INFORMATION

FILE_ID_EXTD_DIR_INFORMATION

FILE_ID_FULL_DIR_INFORMATION

FILE_ID_GLOBAL_TX_DIR_INFORMATION

FILE_NAMES_INFORMATION

FILE_OBJECTID_INFORMATION

FILE_QUOTA_INFORMATION

FILE_REPARSE_POINT_INFORMATION

FltCreateFile

FltCreateFileEx

FltCreateFileEx2

FltQueryDirectoryFileEx

IRP_MJ_DIRECTORY_CONTROL IRP

UNICODE_STRING

ZwQueryDirectoryFile