IOCTL_MOUNTMGR_CREATE_POINT IOCTL (mountmgr.h)
Os clientes do mount manager podem usar esse IOCTL para solicitar que o gerenciador de montagem crie um nome de link simbólico persistente para o volume indicado.
Código principal
Buffer de entrada
O gerenciador do ponto de montagem coloca uma estrutura MOUNTMGR_CREATE_POINT_INPUT no início do buffer em Irp-AssociatedIrp.SystemBuffer>. O gerenciador de montagem insere o nome do 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.
Buffer de entrada/saída
N/D
Comprimento do buffer de entrada/saída
N/D
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.
Comentários
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 mount manager 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 mount manager.
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 de unidade, a solicitação falhará se já houver uma letra de 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);
Para obter mais informações, consulte Suporte a solicitações do Mount Manager em um driver de classe de armazenamento.
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | mountmgr.h (inclua Mountmgr.h) |