【问题标题】:The Uniqueness of IOCTL_MOUNTDEV_QUERY_UNIQUE_IDIOCTL_MOUNTDEV_QUERY_UNIQUE_ID 的唯一性
【发布时间】:2011-07-31 04:59:10
【问题描述】:

IOCTL_MOUNTDEV_QUERY_UNIQUE_ID 上的文档有点混乱……究竟应该在MOUNTDEV_UNIQUE_ID 结构中返回什么类型的 ID?

文档

typedef struct _MOUNTDEV_UNIQUE_ID {
  USHORT  UniqueIdLength;
  UCHAR  UniqueId[1];
} MOUNTDEV_UNIQUE_ID, *PMOUNTDEV_UNIQUE_ID;

说:

UniqueIdLength

  • 包含唯一卷 ID 的长度。

UniqueId

  • 包含唯一的卷 ID。唯一卷名的格式为 "\??\Volume{GUID}\",其中 GUID 是标识卷的全局唯一标识符。

但是,这里有些奇怪:UniqueId 的确切格式应该是什么?如果它打算采用\??\Volume{GUID}\ 格式,那么UniqueIdLength 字段的意义何在——它们的大小不都一样吗?否则,设备ID需要采用什么格式?

此外,这是 device ID 还是 volume ID?换句话说,这应该是每个媒介(例如CD)还是每个设备(CD驱动器)都是唯一的?

【问题讨论】:

  • 这里对UniqueId 的定义是错误的。当前文档具有正确的定义:“包含唯一卷 ID 作为字节数组”。在某些情况下,卷 GUID 名称直接基于唯一卷 ID,但在其他情况下,唯一 ID 必须映射到“MountedDevices”键中的卷 GUID 名称。

标签: winapi ioctl mount-point


【解决方案1】:

这种结构在 MS API 中很常见 - UniqueID[1] 变量只是一个占位符,实际上它用作 UniqueId[UniqueIdLength] 变量。

ID 对于每个介质和每个设备都是唯一的 - 这取决于您是在与音量驱动程序还是设备类驱动程序通信。该 ID 旨在识别“可以安装的东西” - 例如CD-ROM 设备、固定磁盘分区或未分区的可移动磁盘。挂载管理器使用 ID a.o。查找之前安装此特定卷的位置,然后在同一点重新安装它。

【讨论】:

  • @Eric:抱歉,我认为我的问题具有误导性。 fixed-size 我指的不是[1](我知道 C 是如何工作的!),而是 \??\Volume{GUID}\ 字符串始终具有相同的事实长度(我认为大约 35 个字符?)...那么为什么需要另一个长度字段?另外,关于唯一性:对于像 ImDisk 这样的程序,它会是每个虚拟磁盘吗?
  • @Mehrdad:目前该名称大约有 35 个字符 - 但修复它会破坏扩展安装管理器的任何可能性,因此 IMO 使用计数字符串非常有意义。据我所知,对于任何可以作为驱动器号挂载的东西,该 ID 都是持久且唯一的——无论是固定磁盘上的分区、CD-ROM 驱动器还是未分区但已格式化的 USB 记忆棒。我不知道 ImDisk - 但应该遵守相同的规则,唯一 ID 标识可以安装为驱动器的内容。
  • 嗯,好的,谢谢你的信息。 :)(顺便说一句,刚刚注意到我上次拼错了你的名字……:[)
【解决方案2】:

来自MSDN

可能对这个结构有误解。

我调用DeviceIoControl(IOCTL_MOUNTDEV_QUERY_UNIQUE_ID)得到了一个与Device Interface Path格式类似的字符串,只是前缀4个字符不同,然后保存在注册表\HKLM\SYSTEM\MountedDevices中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多