支持存储类驱动程序中的装入管理器请求

装载管理器 (MM) 负责管理卷名称。 对于每个卷,它存储一个唯一且与卷永久标识的名称,即使卷已从系统中删除也是如此。 它还管理在重新启动后保留的较少永久性名称,例如驱动器号,但随着卷添加到系统或从系统中删除卷,其分配可能会更改。

装载管理器通过创建指向卷的设备对象的符号链接,为系统中的每个卷提供唯一的接口。 由于符号链接本身及其目标设备对象在系统重启时不会保留,因此装载管理器会将符号链接 的名称 保留在注册表的 持久名称数据库中

此符号链接名称称为唯一 卷名称。 与传统卷标签一样,它在系统重启时保持不变,但与驱动器号一样,与卷标签不同,它是唯一的。 唯一卷名称的格式为:

"\??\Volume{GUID}\

其中 GUID 是标识卷的全局唯一标识符。

装载管理器的永久性名称数据库位于 注册表的 SYSTEM 配置单元 (HKLM/SYSTEM/MountedDevices) 的 MountedDevices 注册表项中。 除了唯一的卷名称外,装载管理器还会将 装入点 名称存储在其永久性名称数据库中。 装入点名称可以进一步细分为两类:用作已装载卷文件系统根目录的 Win32 样式的路径名和驱动器号。

数据库中的每个持久符号链接名称都显示为 MountedDevices 项下注册表值的名称,并附带 唯一 ID。 唯一 ID 是卷的另一个唯一标识符, (不同于唯一卷名称) 。 它有助于识别可能为数众多的永久性符号链接名称中的哪一个引用同一卷。

例如,具有唯一卷名称 为“\\?\Volume{7603f260-142a-11d4-ac67-806d6172696f }\\” 可能附带一个驱动器号“\DosDevices\D:”和两个装入点“\DosDevices\C:\mymount”和“\DosDevices\E:\FilesysD\mnt”。 这将在装载管理器的永久性符号链接名称数据库中生成四个条目:一个用于唯一卷名称,一个用于驱动器号,两个用于两个装入点名称。 所有四个条目将共享同一个唯一 ID。因此,查看 MountedDevices 注册表项的人将能够检测到所有四个永久性名称都指向同一卷。

以下快照演示了永久性名称在 MountedDevices 注册表项中的显示方式。

说明持久名称在装载设备注册表项中的显示方式的屏幕截图。

装载管理器依赖于即插即用设备接口通知机制来提醒其卷到达和删除。 因此,每个客户端 (,即,每个卷驱动程序(通常是类驱动程序) 都必须通过调用 IoRegisterDeviceInterface 在MOUNTDEV_MOUNTED_DEVICE_GUID接口类中创建接口,以通知装载管理器其所管理的卷到达系统中。 MOUNTDEV_MOUNTED_DEVICE_GUID接口类 GUID 在 mountmgr.h 中定义。

收到卷接口到达即插即用通知后,装载管理器会向客户端发送三个设备控制 IRP:

为了响应这三个 IOCTL,客户端应返回卷的非永久性设备对象名称 (或目标名称) 位于系统对象树 的“设备 ”目录 (,例如:“\Device\HarddiskVolume1”) 、唯一卷 ID 和建议的永久性符号链接名称。 尽管客户端可以选择忽略 IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME,但它们在接收 IOCTL_MOUNTDEV_QUERY_DEVICE_NAME 或IOCTL_MOUNTDEV_QUERY_UNIQUE_ID时必须提供唯一的卷 ID。 装载管理器完全依赖客户端来提供唯一的卷 ID,如果客户端未提供该 ID,则装载管理器无法将装入点(如驱动器号)分配给卷。

有关这些 IOCTL 的详细信息,请参阅 装载管理器发送的 I/O 控制代码

如果客户端在其卷到达时向装载管理器发出警报,但在查询时未能为卷提供唯一 ID,则会将卷置于 已装载的死设备 列表中。 发生这种情况时,客户端可以将 IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES IOCTL 发送到装载管理器,以请求装载管理器重新扫描其死装载的设备列表,并再次尝试在列表中查询客户端,以查找其各自卷的唯一 ID。 有关IOCTL_MOUNTMGR_xxx IOCTL 的详细信息,请参阅 由装载管理器客户端发送的 I/O 控制代码

装载管理器收到新引入的卷的唯一卷 ID 后,它会在其数据库中搜索分配给该唯一 ID 的所有永久性名称,并为每个永久性符号链接名称创建指向该卷的符号链接。

当装载管理器检测到卷已下线时,它会删除指向设备对象的符号链接,而不会删除装载管理器数据库中相应的符号链接名称。

有关装载管理器客户端如何创建永久性符号名称的信息,请参阅 IOCTL_MOUNTMGR_CREATE_POINT