如何使用 WinApi / USN / MasterFileTable 为所有磁盘中的所有文件设置唯一 ID?

How to have a unique ID for all files in all disks, using WinApi / USN / MasterFileTable?

我正在使用一些disk/partitions(C:、D:、E:、F: 等)的 NTFS MasterFileTable / USN 日志,并且我想为每个 file/directory.

使用唯一的 ID

当我阅读 USN_RECORD(也称为 PUSN_RECORD)时,有一个 int64:

DWORDLONG     FileReferenceNumber;

这是一个唯一的 file/directory 标识符,至少在当前分区中是唯一的。

但可能会发生冲突:

我想避免必须使用像 int128 这样大的东西(那将是 FileReferenceNumber 的 64 位 + 驱动器盘符 C:、D: 的 5 位, E:, ..., Z:).

我也想避免使用一对 (char DriveLetter, DWORDLONG FileReferenceNumber) 来识别计算机中的文件。

如何用一个64位的int来编码FileReferenceNumber+盘符?

可能是因为FileReferenceNumber有一些空闲未使用的位?

如果没有,你会怎么处理?

您必须使用一对 FileReferenceNumber/FileID 和 "volume something"。你可以mount a volume in a folder所以你不能真正使用驱动器号。

理想情况下 "volume something" 是 volume GUID path,但如果大小很重要,您可以使用卷序列号。注意:并非所有卷都有 GUID。

对于 NTFS,您可以从 GetFileInformationByHandle and build a 32-bit+64-bit pair. For ReFS you need GetFileInformationByHandleEx 获取它并构建一个 64 位 +128 位对。