我目前正在试验自己的备份软件,只是想知道 NTFS 卷 GUID(即显示为 \?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 的卷 GUID)在分区上的偏移量上实际存储在哪里?它是否始终位于可计算的偏移量处,还是它是 $MFT 或 $Volume 记录的一部分或类似的东西?
答案1
我花了几个小时用十六进制编辑器对一个分区进行编辑,发现 $Volume 图元文件的 $VOLUME_NAME 属性实际上就是在“计算机”等中看到的文本卷名,即“我的磁盘”
事实证明,我上面询问的 GUID 样式仅存储在 MountedDevices 注册表中的安装管理器数据库中。最终让我想到这一点的原因是,如果您将同一块磁盘(其 NTFS 分区上的序列号相同)插入另一台机器,它将获得不同的 GUID。
答案2
我花了一些时间试图回答这个问题。
最终,我找到了 MBR 磁盘:
步骤1
GUID 的格式为{UUUUUUUU-0000-0000-PPPP-PPPPPPPPPPPP}
,其中
UUUUUUUU
是磁盘的 UNIQUEID(可以在 diskpart 的uniqueid disk
命令中查看/更改)0000-0000
始终为零PPPP-PPPPPPPPPPPP
是分区的字节偏移量(可以在 diskpart 的detail partition
命令中看到),以相反的字节顺序进行十六进制编码。
第2步
- 如果驱动程序支持
IOCTL_MOUNTDEV_QUERY_STABLE_GUID
,则返回的任何 GUID 都将用作卷 GUID。否则,ExUuidCreate()
将用于创建新的 GUID。 - Win10之前版本
IOCTL_MOUNTDEV_QUERY_STABLE_GUID
不支持MBR磁盘。 - 从 Win10 开始,对于 MBR 磁盘,如果它不可移动 + 其他一些未知情况,则使用步骤 1 中的 GUID 作为卷 GUID。因此,它将有很多零。
步骤3
生成的 GUID 存储在 中HKLM\SYSTEM\MountedDevices
。它将卷 GUID(值名称)映射到卷的标识符(由 返回IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
)。对于 MBR 磁盘,标识符与步骤 1 中的 GUID 匹配。
如果磁盘的 UNIQEID 发生更改,Windows 将无法启动(因为它无法再找到启动卷)。如果通过从bootrec /rebuildbcd
恢复运行修复了启动配置,Windows 启动和卷将具有新的 GUID,其中只有前 4 个字节将更改以匹配新磁盘的 UNIQUEID。
Windows 代码中的一些相关位置:
mountmgr!CreateNewVolumeName
mountmgr!QueryDeviceInformation
volmgr!VmpQueryStableGuid