IOCTL_MOUNTMGR_CREATE_POINT IOCTL (mountmgr.h)

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

Входными данными для этого запроса является постоянное имя создаваемой символьной ссылки и имя, которое уже является допустимым для идентификации тома. Имя, заданное для идентификации тома, может иметь любой тип: уникальное имя тома, символическое имя ссылки или имя неперсистентного устройства. Если новое постоянное имя еще не используется, вызов будет выполнен успешно, и база данных диспетчера подключений будет изменена, чтобы отразить, что новое постоянное имя принадлежит тому. Если база данных диспетчера подключений уже содержит новое постоянное имя, но том, которому принадлежит это имя, отсутствует в системе, этот вызов перезапишет владение данным постоянным именем.

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

Диспетчер подключения применяет политику не более одной постоянной буквы диска на том. Если запрос IOCTL_MOUNTMGR_CREATE_POINT отправляется с буквой диска, запрос завершится ошибкой, если тому уже назначена буква диска, если диспетчер подключения еще не получил уведомления о томе с помощью уведомления MOUNTDEV_MOUNTED_DEVICE_GUID интерфейса устройства. В последнем случае вызов выполняется успешно, и диспетчер подключений очищает базу данных диспетчера подключений от всех других букв дисков, ранее назначенных тому.

Если IOCTL_MOUNTMGR_CREATE_POINT указывает букву диска, буква диска должна быть прописной.

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

В этом примере псевдокода клиент диспетчера подключений использует IOCTL_MOUNTMGR_CREATE_POINT для отправки диспетчеру подключения имени объекта устройства и соответствующей символьной ссылки:

    // The persistent symbolic link is a drive letter in
    // this case:
    wsprintf(dosBuffer, L"\\DosDevices\\%C:", DriveLetter);
    RtlInitUnicodeString(&dosName, dosBuffer);
    // The nonpersistent volume (device) object name is
    // formed using the volume number as a suffix
    wsprintf(ntBuffer, L"\\Device\\HarddiskVolume%D", 
                       Extension->VolumeNumber);
    RtlInitUnicodeString(&ntName, ntBuffer);
    createPointSize = sizeof(MOUNTMGR_CREATE_POINT_INPUT) +
                      dosName.Length + ntName.Length;
    // Allocate a header with length and offset information
    createPoint = (PMOUNTMGR_CREATE_POINT_INPUT)
                  ExAllocatePool(PagedPool, 
                  createPointSize);
    createPoint->SymbolicLinkNameOffset = 
                  sizeof(MOUNTMGR_CREATE_POINT_INPUT);
    createPoint->SymbolicLinkNameLength = dosName.Length;
    createPoint->DeviceNameOffset = 
        createPoint -> SymbolicLinkNameOffset +
        createPoint -> SymbolicLinkNameLength;
    createPoint->DeviceNameLength = ntName.Length;
    RtlCopyMemory((PCHAR) createPoint + 
                  createPoint -> SymbolicLinkNameOffset,
                  dosName.Buffer, dosName.Length);
    RtlCopyMemory((PCHAR) createPoint + 
                  createPoint->DeviceNameOffset,
                  ntName.Buffer, ntName.Length);
    // Use the name of the mount manager device object
    // defined in mountmgr.h (MOUNTMGR_DEVICE_NAME) to
    // obtain a pointer to the mount manager.
    RtlInitUnicodeString(&name, MOUNTMGR_DEVICE_NAME);
    status = IoGetDeviceObjectPointer(&name,
                              FILE_READ_ATTRIBUTES, 
                              &fileObject, &deviceObject);
    KeInitializeEvent(&event, NotificationEvent, FALSE);
    irp = IoBuildDeviceIoControlRequest(
            IOCTL_MOUNTMGR_CREATE_POINT,
            deviceObject, createPoint, createPointSize, 
            NULL, 0, FALSE, &event, &ioStatus);
    // Send the irp to the mount manager requesting
    // that a new mount point (persistent symbolic link)
    // be created for the indicated volume.
    status = IoCallDriver(deviceObject, irp);

Основной код

IRP_MJ_DEVICE_CONTROL

Входной буфер

Диспетчер точек подключения помещает заголовок , определенный как структура MOUNTMGR_CREATE_POINT_INPUT в Mountmgr.h, в начале буфера в Irp-AssociatedIrp.SystemBuffer>. Диспетчер подключений вставляет только что назначенное имя постоянной символьной ссылки по адресу, на который указывает член SymbolicLinkNameOffset этой структуры, и вставляет неперсистентное имя устройства по адресу, указанному элементом DeviceNameOffset этой структуры.

Длина входного буфера

Parameters.DeviceIoControl.InputBufferLength в расположении стека ввода-вывода IRP указывает размер входного буфера в байтах, который должен быть больше или равен sizeof(MOUNTMGR_CREATE_POINT_INPUT).

Выходной буфер

None

Длина выходного буфера

None

Блок состояния

Если операция выполнена успешно, в поле Состояние устанавливается значение STATUS_SUCCESS.

Если параметр InputBufferLength меньше sizeof(MOUNTMGR_CREATE_POINT_INPUT), для поля Состояние задано значение STATUS_INVALID_PARAMETER.

Требования

Требование Значение
Заголовок mountmgr.h (включая Mountmgr.h)

См. также раздел

MOUNTMGR_CREATE_POINT_INPUT