IOCTL_MOUNTMGR_CREATE_POINT IOCTL (mountmgr.h)

Klien manajer pemasangan dapat menggunakan IOCTL ini untuk meminta agar manajer pemasangan membuat nama tautan simbolis persisten untuk volume yang ditunjukkan. Untuk diskusi tentang berbagai jenis tautan simbolis persisten yang dikelola oleh manajer pemasangan, lihat Mendukung Permintaan Mount Manager di Driver Kelas Penyimpanan.

Input ke permintaan ini adalah nama tautan simbolis persisten yang akan dibuat dan nama yang sudah valid untuk tujuan mengidentifikasi volume. Nama yang diberikan untuk tujuan mengidentifikasi volume dapat memiliki jenis apa pun: nama volume unik, nama tautan simbolis, atau nama perangkat yang tidak konsisten. Jika nama persisten baru belum digunakan, panggilan akan berhasil dan database manajer pemasangan akan dimodifikasi untuk mencerminkan bahwa nama persisten baru milik volume. Jika database manajer pemasangan sudah berisi nama persisten baru tetapi volume yang memiliki nama tersebut tidak ada dalam sistem, panggilan ini akan menimpa kepemilikan nama persisten yang diberikan.

Manajer pemasangan memungkinkan pembuatan nama tautan simbolis persisten baru meskipun belum diberi tahu tentang volume yang diberikan dalam pemberitahuan antarmuka perangkat MOUNTDEV_MOUNTED_DEVICE_GUID. Dalam kasus seperti itu, manajer pemasangan hanya membuat tautan simbolis dan memperbarui database manajer pemasangan.

Manajer pemasangan memberlakukan kebijakan paling banyak satu huruf drive persisten per volume. Jika permintaan IOCTL_MOUNTMGR_CREATE_POINT dikirim dengan huruf drive, permintaan akan gagal jika sudah ada huruf drive yang ditetapkan ke volume, kecuali manajer pemasangan belum diberi tahu tentang volume melalui pemberitahuan antarmuka perangkat MOUNTDEV_MOUNTED_DEVICE_GUID. Dalam kasus terakhir, panggilan berhasil dan manajer pemasangan menghapus menyeluruh database manajer pemasangan dari huruf drive lain yang sebelumnya ditetapkan ke volume.

Jika IOCTL_MOUNTMGR_CREATE_POINT menentukan huruf kandar, huruf kandar harus huruf besar.

Perhatikan bahwa klien dapat menemukan apakah manajer pemasangan telah menerima pemberitahuan antarmuka perangkat MOUNTDEV_MOUNTED_DEVICE_GUID untuk volumenya dengan mengkueri manajer pemasangan dengan IOCTL_MOUNTMGR_QUERY_POINTS.

Dalam sampel pseudocode ini, klien mount manager menggunakan IOCTL_MOUNTMGR_CREATE_POINT untuk mengirim nama objek perangkat kepada manajer pemasangan dan tautan simbolik yang sesuai:

    // 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);

Kode utama

IRP_MJ_DEVICE_CONTROL

Buffer input

Manajer titik pemasangan menempatkan header, yang didefinisikan sebagai struktur MOUNTMGR_CREATE_POINT_INPUT di Mountmgr.h, di awal buffer di Irp-AssociatedIrp.SystemBuffer>. Manajer pemasangan menyisipkan nama tautan simbolis persisten yang baru ditetapkan pada alamat yang ditujukan oleh anggota SymbolicLinkNameOffset dari struktur ini, dan menyisipkan nama perangkat yang tidak konsisten pada alamat yang diacu oleh anggota DeviceNameOffset dari struktur ini.

Panjang buffer input

Parameters.DeviceIoControl.InputBufferLength di lokasi tumpukan I/O IRP menunjukkan ukuran, dalam byte, dari buffer input, yang harus lebih besar dari atau sama dengan sizeof(MOUNTMGR_CREATE_POINT_INPUT).

Buffer output

Tidak ada

Panjang buffer output

Tidak ada

Blok status

Jika operasi berhasil, bidang Status diatur ke STATUS_SUCCESS.

Jika InputBufferLength kurang dari sizeof(MOUNTMGR_CREATE_POINT_INPUT), bidang Status diatur ke STATUS_INVALID_PARAMETER.

Persyaratan

Persyaratan Nilai
Header mountmgr.h (termasuk Mountmgr.h)

Lihat juga

MOUNTMGR_CREATE_POINT_INPUT