다음을 통해 공유


IOCTL_MOUNTMGR_CREATE_POINT IOCTL(mountmgr.h)

탑재 관리자 클라이언트는 이 IOCTL을 사용하여 탑재 관리자가 표시된 볼륨에 대한 영구 기호 링크 이름을 만들도록 요청할 수 있습니다.

주 코드

IRP_MJ_DEVICE_CONTROL

입력 버퍼

탑재 지점 관리자는 Irp->AssociatedIrp.SystemBuffer버퍼의 시작 부분에 MOUNTMGR_CREATE_POINT_INPUT 구조를 배치합니다. 탑재 관리자는 이 구조의 SymbolicLinkNameOffset 멤버가 가리키는 주소에 새로 할당된 영구 기호 링크 이름을 삽입하고 이 구조의 DeviceNameOffset 멤버가 가리키는 주소에 존재하지 않는 디바이스 이름을 삽입합니다.

입력 버퍼 길이

IRP의 I/O 스택 위치에 있는 parameters.DeviceIoControl.InputBufferLength 입력 버퍼의 크기(바이트)를 나타내며 이는 sizeof(MOUNTMGR_CREATE_POINT_INPUT)보다 크거나 같아야 합니다.

출력 버퍼

없음.

출력 버퍼 길이

없음.

입력/출력 버퍼

해당(N/A)

입력/출력 버퍼 길이

해당(N/A)

상태 블록

작업이 성공하면 상태 필드가 STATUS_SUCCESS 설정됩니다.

InputBufferLengthsizeof(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 포함)

참고 항목

MOUNTMGR_CREATE_POINT_INPUT