Поддержка запросов диспетчера подключений в драйвере класса служба хранилища

Диспетчер подключений (MM) отвечает за управление именами томов. Для каждого тома оно хранит уникальное имя и постоянно идентифицируется с томом даже после удаления тома из системы. Он также управляет менее постоянными именами, такими как буквы диска, которые сохраняются во время перезагрузки, но назначения которых могут изменяться при добавлении или удалении томов из системы.

Диспетчер подключения предоставляет уникальный интерфейс для каждого тома в системе, создав символьную ссылку на объект устройства тома. Так как символические связи и целевые объекты устройств не сохраняются при перезапуске системы, диспетчер подключений сохраняет имя символьной ссылки в базе данных постоянного имени в реестре.

Это символьное имя ссылки называется уникальным именем тома. Как и традиционная метка тома, она сохраняется при перезапуске системы, но как буква диска, и в отличие от метки тома, она уникальна. Формат уникальных имен томов:

"\?? \Volume{GUID}\

где GUID — это глобальный уникальный идентификатор, который идентифицирует том.

База данных постоянного имени диспетчера подключения находится в разделе реестра MountDevices куста SYSTEM (HKLM/SYSTEM/MountDevices) реестра. Помимо уникальных имен томов диспетчер подключений также хранит имена точек подключения в базе данных постоянного имени. Имена точек подключения можно разделить на две категории: имена путей в стиле Win32, которые служат корневым каталогом файловой системы подключенного тома и буквами диска.

Каждое постоянное символьное имя ссылки в базе данных отображается как имя значения реестра в разделе MountedDevices , сопровождаемое уникальным идентификатором. Уникальный идентификатор — это другой уникальный идентификатор тома (отличается от уникального имени тома). Он помогает определить, какие из потенциально многочисленных постоянных символических ссылок ссылаются на один и тот же том.

Например, один том с уникальным именем тома "\\?\Volume{7603f260-142a-11d4-ac67-806d6172696f }\" Может содержать сопровождающую букву диска "\DosDevices\D:" и две точки подключения "\DosDevices\C:\mymount" и "\DosDevices\E:\FilesysD\mnt". Это приведет к созданию четырех записей в базе данных постоянного символьного имени канала диспетчера подключения: одна для уникального имени тома, одна для буквы диска и две для двух имен точек подключения. Все четыре записи будут совместно использовать один и тот же уникальный идентификатор. Таким образом, кто-то просматривает раздел реестра MountedDevices , сможет обнаружить, что все четыре постоянных имена указывают на один том.

На следующем снимке акров показано, как постоянные имена отображаются в разделе реестра MountedDevices .

screen shot illustrating how persistent names appear in the mounteddevices registry key.

Диспетчер подключений использует механизм уведомления интерфейса устройства Plug and Play для оповещения о поступлении и удалении тома. Поэтому каждый клиент (то есть каждый драйвер тома, обычно драйвер класса) должен создать интерфейс в классе интерфейса MOUNTDEV_MOUNTED_DEVICE_GUID путем вызова IoRegisterDeviceInterface , чтобы уведомить диспетчер подключений о поступлении в систему управляемого тома. Guid класса интерфейса MOUNTDEV_MOUNTED_DEVICE_GUID определен в mountmgr.h.

Получив Plug and Play уведомление о прибытии интерфейса тома, диспетчер подключений отправляет клиенту три irP управления устройствами:

В ответ на эти три IOCTL клиент должен вернуть неперечисленное имя объекта устройства тома (или целевое имя), расположенное в каталоге устройства дерева системных объектов (например, "\Device\HarddiskVolume1"), уникальный идентификатор тома и предлагаемое постоянное символьное имя ссылки для тома соответственно. Хотя клиенты могут игнорировать IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME, они должны предоставить уникальный идентификатор тома при получении IOCTL_MOUNTDEV_QUERY_DEVICE_NAME или IOCTL_MOUNTDEV_QUERY_UNIQUE_ID. Диспетчер подключений полностью полагается на клиента для предоставления уникального идентификатора тома, и если клиент не предоставляет его, диспетчер подключения не может назначать точки подключения, такие как буквы диска, тому.

Дополнительные сведения об этих ioCTLs см. в разделе коды управления ввода-вывода, отправленные диспетчером подключений.

Если клиент оповещает диспетчер подключения о поступлении тома, но не удается указать уникальный идентификатор тома при запросе, том помещается в список неработавших устройств . В этом случае клиенты могут отправить IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES IOCTL диспетчеру подключений, чтобы запросить повторное сканирование диспетчера подключения списка устройств и выполнить другую попытку запросить клиентов в списке для уникальных идентификаторов соответствующих томов. Дополнительные сведения о IOCTL_MOUNTMGR_xxx IOCTLs см. в разделе "Коды управления ввода-вывода, отправленные клиентами диспетчера подключений"

После того как диспетчер подключений получит уникальный идентификатор тома для вновь введенного тома, он выполняет поиск в базе данных всех постоянных имен, назначенных данному уникальному идентификатору, и создает символические ссылки на том для каждого постоянного символьного имени.

Когда диспетчер подключения обнаруживает, что том отключен, он удаляет символьные ссылки, указывающие на объект устройства, не удаляя соответствующие символические имена ссылок в базе данных диспетчера подключений.

Сведения о том, как клиенты диспетчера подключений создают постоянные символьные имена, см. в IOCTL_MOUNTMGR_CREATE_POINT.