Поделиться через


IOCTL_MOUNTMGR_CREATE_POINT IOCTL (mountmgr.h)

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

Основной код

IRP_MJ_DEVICE_CONTROL

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

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

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

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

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

Никакой.

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

Никакой.

Буфер входных и выходных данных

N/A

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

N/A

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

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

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

Замечания

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

Диспетчер подключений позволяет создавать новое имя постоянной символьной ссылки, даже если оно еще не было уведомлено о заданном томе в уведомлении об 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);

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

Требования

Требование Ценность
заголовка mountmgr.h (include Mountmgr.h)

См. также

MOUNTMGR_CREATE_POINT_INPUT