【发布时间】:2018-01-26 18:19:25
【问题描述】:
情况:
我正在使用NtQueryDirectoryFile(..., FileBothDirectoryInformation, ...) 扫描目录。除了此调用返回的数据之外,我还需要安全数据(通常由 GetKernelObjectSecurity 返回)和备用流列表 (NtQueryInformationFile(..., FileStreamInformation))。
问题:
要检索安全和备用流信息,我需要打开(和关闭)每个文件。在我的测试中,它会使操作减慢 3 倍。添加 GetKernelObjectSecurity 和 NtQueryInformationFile 会使它减慢 4 倍(使其成为 12 倍)。
问题: 是否有更好/更快的方法来获取此信息(通过更快地打开文件或完全避免打开文件)?
想法: 如果目标文件系统是本地的,我可以直接访问它并且(知道 NTFS/FAT/etc 详细信息从原始数据中提取信息)。但它不适用于远程文件系统。
【问题讨论】:
-
GetNamedSecurityInfo()呢,还是在内部打开文件? -
@zett42 - 当然。
GetNamedSecurityInfo只是GetKernelObjectSecurity的外壳,它是NtQuerySecurityObject的外壳。打开对象的句柄,对于查询,用户模式下它的安全性是强制性的。别无他法 -
也许有办法批量获取这些信息?即一个请求中的一堆文件
-
不,您需要为每个文件单独打开文件句柄。没有别的办法。没有批量打开。喜欢和扫描文件夹 - 您还需要打开它处理(直接或间接)。但是您可以进行异步扫描(以异步模式打开文件)并且在查询某些文件夹后不等待结果(在回调中处理它)而是继续扫描另一个文件夹/文件。在 ssd 上,这可以非常加快进程
-
@RbMm 所以,唯一的方法是重叠这些请求。但问题是
NtOpenFile/NtQueryInformationFile/NtQuerySecurityObject都是同步的(不像NtQueryDirectoryFile)。我怀疑可以自己发出底层 IRP,但我不知道该怎么做(我的代码在用户模式下运行)。
标签: winapi filesystems nt-native-api