共用方式為


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)

輸出緩衝區

無。

輸出緩衝區長度

無。

輸入/輸出緩衝區

N/A

輸入/輸出緩衝區長度

N/A

狀態區塊

如果作業成功,[ 狀態 ] 字段會設定為 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