IOCTL_MOUNTMGR_CREATE_POINT IOCTL (mountmgr.h)

Os clientes do gerenciador de montagem podem usar esse IOCTL para solicitar que o gerenciador de montagem crie um nome de link simbólico persistente para o volume indicado. Para obter uma discussão sobre os vários tipos de links simbólicos persistentes gerenciados pelo gerenciador de montagem, consulte Suporte a solicitações do Gerenciador de Montagem em um Driver de Classe de Armazenamento.

A entrada para essa solicitação é o nome de link simbólico persistente a ser criado e um nome que já é válido para fins de identificação do volume. O nome fornecido para identificar o volume pode ser de qualquer tipo: um nome de volume exclusivo, um nome de link simbólico ou um nome de dispositivo não persistente. Se o novo nome persistente ainda não estiver em uso, a chamada terá êxito e o banco de dados do gerenciador de montagem será modificado para refletir que o novo nome persistente pertence ao volume. Se o banco de dados do gerenciador de montagem já contiver o novo nome persistente, mas o volume que possui esse nome não estiver no sistema, essa chamada substituirá a propriedade do nome persistente fornecido.

O gerenciador de montagem permite a criação de um novo nome de link simbólico persistente, mesmo que ainda não tenha sido notificado sobre o volume fornecido na notificação da interface do dispositivo MOUNTDEV_MOUNTED_DEVICE_GUID. Nesse caso, o gerenciador de montagem simplesmente cria o link simbólico e atualiza o banco de dados do gerenciador de montagem.

O gerenciador de montagem impõe uma política de no máximo uma letra de unidade persistente por volume. Se uma solicitação de IOCTL_MOUNTMGR_CREATE_POINT for enviada com uma letra da unidade, a solicitação falhará se já houver uma letra da unidade atribuída ao volume, a menos que o gerenciador de montagem ainda não tenha sido notificado sobre o volume por meio da notificação da interface do dispositivo MOUNTDEV_MOUNTED_DEVICE_GUID. No último caso, a chamada é bem-sucedida e o gerenciador de montagem limpa o banco de dados do gerenciador de montagem de quaisquer outras letras de unidade atribuídas anteriormente ao volume.

Se IOCTL_MOUNTMGR_CREATE_POINT especificar uma letra da unidade, a letra da unidade deverá ser maiúscula.

Observe que um cliente pode descobrir se o gerenciador de montagem recebeu a notificação de interface do dispositivo MOUNTDEV_MOUNTED_DEVICE_GUID para seu volume consultando o gerenciador de montagem com IOCTL_MOUNTMGR_QUERY_POINTS.

Neste exemplo de pseudocódigo, um cliente do gerenciador de montagem usa IOCTL_MOUNTMGR_CREATE_POINT para enviar ao gerenciador de montagem um nome de objeto de dispositivo e seu link simbólico correspondente:

    // 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);

Código principal

IRP_MJ_DEVICE_CONTROL

Buffer de entrada

O gerenciador do ponto de montagem coloca um cabeçalho, definido como a estrutura MOUNTMGR_CREATE_POINT_INPUT em Mountmgr.h, no início do buffer em Irp-AssociatedIrp.SystemBuffer>. O gerenciador de montagem insere o nome de link simbólico persistente recém-atribuído no endereço apontado pelo membro SymbolicLinkNameOffset dessa estrutura e insere o nome do dispositivo não persistente no endereço apontado pelo membro DeviceNameOffset dessa estrutura.

Comprimento do buffer de entrada

Parameters.DeviceIoControl.InputBufferLength no local da pilha de E/S do IRP indica o tamanho, em bytes, do buffer de entrada, que deve ser maior ou igual a sizeof(MOUNTMGR_CREATE_POINT_INPUT).

Buffer de saída

Nenhum

Comprimento do buffer de saída

Nenhum

Bloco de status

Se a operação for bem-sucedida, o campo Status será definido como STATUS_SUCCESS.

Se InputBufferLength for menor que sizeof(MOUNTMGR_CREATE_POINT_INPUT), o campo Status será definido como STATUS_INVALID_PARAMETER.

Requisitos

Requisito Valor
Cabeçalho mountmgr.h (inclua Mountmgr.h)

Confira também

MOUNTMGR_CREATE_POINT_INPUT