IOCTL_MOUNTMGR_CREATE_POINT IOCTL(mountmgr.h)

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

주 코드

IRP_MJ_DEVICE_CONTROL

입력 버퍼

탑재 지점 관리자는 버퍼의 시작 부분에 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 포함)

추가 정보

MOUNTMGR_CREATE_POINT_INPUT