다음을 통해 공유


스토리지 클래스 드라이버에서 Mount Manager 요청 지원

MM(탑재 관리자)은 볼륨 이름을 관리합니다. 각 볼륨에 대해 시스템에서 볼륨이 제거된 후에도 고유한 이름을 저장하고 볼륨으로 영구적으로 식별됩니다. 또한 드라이브 문자와 같이 재부팅 간에 유지되지만 볼륨이 시스템에 추가되거나 시스템에서 제거될 때 할당이 변경될 수 있는 영구 이름이 덜 관리됩니다.

탑재 관리자는 볼륨의 디바이스 개체에 대한 기호 링크를 만들어 시스템의 각 볼륨에 고유한 인터페이스를 제공합니다. 시스템이 다시 시작될 때 기호 링크 자체와 대상 디바이스 개체가 유지되지 않으므로 탑재 관리자는 레지스트리의 영구 이름 데이터베이스에 기호 링크의 이름을 유지합니다.

이 기호화된 링크 이름을 고유한 볼륨 이름이라고 합니다. 기존 볼륨 레이블과 마찬가지로 시스템이 다시 시작될 때 유지되지만 드라이브 문자처럼 볼륨 레이블과 달리 고유합니다. 고유한 볼륨 이름의 형식은 다음과 같습니다.

"\?? \Volume{GUID}\

여기서 GUID 는 볼륨을 식별하는 전역적으로 고유한 식별자입니다.

탑재 관리자의 영구 이름 데이터베이스는 레지스트리의 SYSTEM 하이브(HKLM/SYSTEM/MountedDevices)의 MountedDevices 레지스트리 키에 있습니다. 탑재 관리자는 고유한 볼륨 이름 외에도 탑재 지점 이름을 영구 이름 데이터베이스에 저장합니다. 탑재 지점 이름은 탑재된 볼륨의 파일 시스템의 루트 디렉터리 역할을 하는 Win32 스타일 경로 이름과 드라이브 문자의 두 가지 범주로 더 세분화할 수 있습니다.

데이터베이스의 각 영구 기호 링크 이름은 고유 ID와 함께 MountedDevices 키 아래에 있는 레지스트리 값의 이름으로 표시됩니다. 고유 ID는 볼륨의 또 다른 고유 식별자입니다(고유한 볼륨 이름과 다름). 잠재적으로 수많은 영구 기호 링크 이름 중 동일한 볼륨을 참조하는 이름을 식별하는 데 도움이 됩니다.

예를 들어 고유한 볼륨 이름이 "\\?\Volume{7603f260-142a-11d4-ac67-806d6172696f }\인 단일 볼륨 " 에는 함께 제공되는 드라이브 문자 "\DosDevices\D:"와 두 개의 탑재 지점 "\DosDevices\C:\mymount" 및 "\DosDevices\E:\FilesysD\mnt"가 있을 수 있습니다. 이렇게 하면 탑재 관리자의 영구 기호 링크 이름 데이터베이스에 4개의 항목이 생성됩니다. 하나는 고유한 볼륨 이름, 하나는 드라이브 문자, 두 개의 탑재 지점 이름은 2개입니다. 네 항목 모두 동일한 고유 ID를 공유합니다. 따라서 MountedDevices 레지스트리 키를 보는 사용자는 네 개의 영구 이름이 모두 동일한 볼륨을 가리키는 것을 감지할 수 있습니다.

다음 스크린샷은 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를 제공하기 위해 클라이언트에 전적으로 의존하며, 클라이언트가 이를 제공하지 않으면 탑재 관리자는 드라이브 문자와 같은 탑재 지점을 볼륨에 할당할 수 없습니다.

이러한 IOCTL에 대한 자세한 내용은 Mount Manager에서 보낸 I/O 제어 코드를 참조하세요.

클라이언트가 볼륨 도착에 대해 탑재 관리자에게 경고하지만 쿼리할 때 볼륨에 대한 고유 ID를 제공하지 못하는 경우 볼륨은 탑재되지 않은 디바이스 목록에 배치됩니다. 이 경우 클라이언트는 IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES IOCTL을 탑재 관리자로 보내 탑재 관리자가 탑재된 디바이스 목록을 다시 검사하도록 요청하고 해당 볼륨의 고유 ID에 대해 목록에 있는 클라이언트를 쿼리하도록 다시 시도할 수 있습니다. IOCTL_MOUNTMGR_xxx IOCTL에 대한 자세한 내용은 Mount Manager 클라이언트에서 보낸 I/O 제어 코드를 참조 하세요.

탑재 관리자가 새로 도입된 볼륨에 대한 고유한 볼륨 ID를 받은 후 해당 데이터베이스에서 해당 고유 ID에 할당된 모든 영구 이름을 검색하고 각 영구 기호 링크 이름에 대한 볼륨에 대한 기호 링크를 만듭니다.

탑재 관리자가 볼륨이 줄에서 벗어난 것을 감지하면 탑재 관리자의 데이터베이스에서 해당 기호 링크 이름을 삭제하지 않고 디바이스 개체를 가리키는 기호 링크를 삭제합니다.

탑재 관리자 클라이언트가 영구 기호 이름을 만드는 방법에 대한 자세한 내용은 IOCTL_MOUNTMGR_CREATE_POINT 참조하세요.