NTFS 卷 GUID

NTFS 卷 GUID

我目前正在试验自己的备份软件,只是想知道 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

相关内容