2

我正在使用FSCTL_ENUM_USN_DATA枚举 NTFS MFT,以便我可以基于 USN_RECORD FileReferenceNumbers 构建目录数据库。我正在构建这个数据库,以便我可以通过使用 NTFS USN 更改日志并读取 USN_RECORD(使用引用目录数据库的 FileReferenceNumber 和 ParentFileReferenceNumber)来监视 NTFS 驱动器上的文件更改。有关执行此操作的信息,请参见此处

我的问题与 USN Record 版本有关。如果您看一下,USN_RECORD_V2支持的 FileReferenceNumbers (DWORDLONG) 数据类型与USN_RECORD_V3 (FILE_ID_128) 不同。这很好,如果 FSCTL_ENUM_USN_DATA 支持 USN_RECORD_V3。问题是在 Windows 10 中使用了 USN_RECORD_V3,而在 Windows 7 中使用了 USN_RECORD_V2。

FSCTL_ENUM_USN_DATA 将MFT_ENUM_DATA_V1MFT_ENUM_DATA_V0作为其输入缓冲区。我假设 V1 支持 FILE_ID_128 FileReferenceNumbers,但事实证明这个假设是不正确的。似乎不支持 USN_RECORD_V3 及其关联的 FileReferenceNumber 数据类型。因此,在使用 USN_RECORD_V3 或更高版本的 Windows 版本上使用 NTFS 更改日志监视 NTFS 驱动器上的更改现在是一个大问题。

我找到了一个临时解决方案!在 Windows 10 上枚举 MFT 时,FSCTL_READ_ENUM_DATA 仅返回 USN_RECORD_V2,给出 DWORDLONG 类型的 FileReferenceNumbers。反过来,我被迫将这些 DWORDLONG FileReferenceNumbers 移位到 128 位缓冲区中,以便目录缓存与FSCTL_READ_USN_JOURNAL调用返回的 USN_RECORD_V3 匹配。

然而,我不禁觉得我错过了一些东西。有没有人对此问题有任何其他解决方案,或者可以采取任何替代方法?请记住,监视程序未运行时对驱动器所做的更改对于我的项目至关重要。

4

0 回答 0