IOCTL_MOUNTMGR_CREATE_POINT IOCTL(mountmgr.h)
탑재 관리자 클라이언트는 이 IOCTL을 사용하여 탑재 관리자가 표시된 볼륨에 대한 영구 기호 링크 이름을 만들도록 요청할 수 있습니다.
주 코드
입력 버퍼
탑재 지점 관리자는 버퍼의 시작 부분에 MOUNTMGR_CREATE_POINT_INPUT 구조를 Irp-AssociatedIrp.SystemBuffer>에 배치합니다. 탑재 관리자는 이 구조체의 SymbolicLinkNameOffset 멤버가 가리키는 주소에 새로 할당된 영구 기호 링크 이름을 삽입하고 이 구조체의 DeviceNameOffset 멤버가 가리키는 주소에 존재하지 않는 디바이스 이름을 삽입합니다.
입력 버퍼 길이
IRP의 I/O 스택 위치에 있는 Parameters.DeviceIoControl.InputBufferLength는 입력 버퍼의 크기(바이트)를 나타내며, 이 크기는 보다 크거나 같sizeof(MOUNTMGR_CREATE_POINT_INPUT)
아야 합니다.
출력 버퍼
없음
출력 버퍼 길이
없음
입력/출력 버퍼
해당 없음
입력/출력 버퍼 길이
해당 없음
상태 블록
작업이 성공하면 상태 필드가 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 드라이브 문자를 지정하는 경우 드라이브 문자는 대문자여야 합니다.
클라이언트는 IOCTL_MOUNTMGR_QUERY_POINTS 탑재 관리자를 쿼리하여 탑재 관리자가 볼륨에 대한 MOUNTDEV_MOUNTED_DEVICE_GUID 디바이스 인터페이스 알림을 받았는지 여부를 검색할 수 있습니다.
이 의사 코드 샘플에서 탑재 관리자 클라이언트는 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(Mountmgr.h 포함) |