【问题标题】:fastest way to retrieve CIFS file metadata检索 CIFS 文件元数据的最快方法
【发布时间】:2018-01-26 18:19:25
【问题描述】:

情况: 我正在使用NtQueryDirectoryFile(..., FileBothDirectoryInformation, ...) 扫描目录。除了此调用返回的数据之外,我还需要安全数据(通常由 GetKernelObjectSecurity 返回)和备用流列表 (NtQueryInformationFile(..., FileStreamInformation))。

问题: 要检索安全和备用流信息,我需要打开(和关闭)每个文件。在我的测试中,它会使操作减慢 3 倍。添加 GetKernelObjectSecurityNtQueryInformationFile 会使它减慢 4 倍(使其成为 12 倍)。

问题: 是否有更好/更快的方法来获取此信息(通过更快地打开文件或完全避免打开文件)?

想法: 如果目标文件系统是本地的,我可以直接访问它并且(知道 NTFS/FAT/etc 详细信息从原始数据中提取信息)。但它不适用于远程文件系统。

【问题讨论】:

  • GetNamedSecurityInfo() 呢,还是在内部打开文件?
  • @zett42 - 当然。 GetNamedSecurityInfo 只是 GetKernelObjectSecurity 的外壳,它是 NtQuerySecurityObject 的外壳。打开对象的句柄,对于查询,用户模式下它的安全性是强制性的。别无他法
  • 也许有办法批量获取这些信息?即一个请求中的一堆文件
  • 不,您需要为每个文件单独打开文件句柄。没有别的办法。没有批量打开。喜欢和扫描文件夹 - 您还需要打开它处理(直接或间接)。但是您可以进行异步扫描(以异步模式打开文件)并且在查询某些文件夹后不等待结果(在回调中处理它)而是继续扫描另一个文件夹/文件。在 ssd 上,这可以非常加快进程
  • @RbMm 所以,唯一的方法是重叠这些请求。但问题是NtOpenFile/NtQueryInformationFile/NtQuerySecurityObject 都是同步的(不像NtQueryDirectoryFile)。我怀疑可以自己发出底层 IRP,但我不知道该怎么做(我的代码在用户模式下运行)。

标签: winapi filesystems nt-native-api


【解决方案1】:

自定义 SMB 客户端似乎就是答案。跳过 Windows/NT API 层打开了所有大门。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2018-08-12
    • 1970-01-01
    • 2011-02-17
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多