Winapi NtQueryInformationFile(FileBothDirectoryInformation)间歇性地报告某些子目录的非零大小(EndOfFile/AllocationSize)
我有一个简单的实用程序,可以递归地扫描目录(使用Winapi NtQueryInformationFile(FileBothDirectoryInformation)间歇性地报告某些子目录的非零大小(EndOfFile/AllocationSize),winapi,driver,windows-kernel,nt-native-api,Winapi,Driver,Windows Kernel,Nt Native Api,我有一个简单的实用程序,可以递归地扫描目录(使用NtQueryInformationFile(FileBothDirectoryInformation))并计算各种统计数据。它通常针对各种SMB共享(托管在Win12服务器上)执行 特别是它计算总字节数(使用文件\u目录\u信息::endofile字段) 通常情况下,所有子磁盘的大小都报告为0,但如果我在5秒内重新运行我的实用程序(自上次运行以来),则会报告某些子磁盘的大小为4096。如果我在重新运行实用程序之前数到5,一切都正常。这会导致不稳定
NtQueryInformationFile(FileBothDirectoryInformation)
)并计算各种统计数据。它通常针对各种SMB共享(托管在Win12服务器上)执行
特别是它计算总字节数
(使用文件\u目录\u信息::endofile
字段)
通常情况下,所有子磁盘的大小都报告为0,但如果我在5秒内重新运行我的实用程序(自上次运行以来),则会报告某些子磁盘的大小为4096。如果我在重新运行实用程序之前数到5,一切都正常。这会导致不稳定的结果和不必要的警报
所有受影响的DIR似乎都有相同的共同点——每一个:
- 包含
文件Thumbs.db
- 或者是包含
文件的目录的父目录Thumbs.db
- 。。。但并非总是如此——有时父目录大小稳定为0
p.S.
FILE\u BOTH\u DIR\u INFORMATION::AllocationSize
字段也会发生同样的情况。我认为SMB客户端正在对目录进行一些本地缓存,并使用“默认数据流”存储与缓存相关的信息,这就是您看到的
我认为您应该忽略目录上的分配大小。什么是“默认数据流”?名为“:$DATA”的备用流?是的,它是。分配大小字段由未命名/默认数据流的大小决定。