次の方法で共有


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・デバイス・インターフェース通知で特定のボリュームの通知をまだ受け取っていない場合でも、新しい永続的シンボリック・リンク名を作成できます。 このような場合、マウント・マネージャーはシンボリック・リンクを作成し、マウント・マネージャー・データベースを更新するだけです。

マウント マネージャーは、ボリュームごとに最大 1 つの永続ドライブ文字のポリシーを適用します。 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