IOCTL_MOUNTMGR_CREATE_POINT IOCTL (mountmgr.h)
マウント・マネージャー・クライアントは、この IOCTL を使用して、マウント・マネージャーが指定されたボリュームの永続シンボリック・リンク名を作成するように要求できます。
メジャー コード
[入力バッファー]
マウント ポイント マネージャーは、Irp-AssociatedIrp.SystemBuffer> のバッファーの先頭にMOUNTMGR_CREATE_POINT_INPUT構造体を配置します。 マウント マネージャーは、この構造体の SymbolicLinkNameOffset メンバーが指すアドレスに新しく割り当てられた永続的なシンボリック リンク名を挿入し、この構造体の DeviceNameOffset メンバーが指すアドレスに非永続デバイス名を挿入します。
入力バッファーの長さ
IRP の I/O スタック位置の Parameters.DeviceIoControl.InputBufferLength は、入力バッファーのサイズ (バイト単位) を示します。このサイズは 以上であるsizeof(MOUNTMGR_CREATE_POINT_INPUT)
必要があります。
出力バッファー
[なし] :
出力バッファーの長さ
[なし] :
入力/出力バッファー
該当なし
入力/出力バッファーの長さ
該当なし
ステータス ブロック
操作が成功した場合、[ 状態] フィールドはSTATUS_SUCCESSに設定されます。
InputBufferLength が よりsizeof(MOUNTMGR_CREATE_POINT_INPUT)
小さい場合、Status フィールドは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);
詳細については、「 記憶域クラス ドライバーでのマウント マネージャー要求のサポート」を参照してください。
要件
要件 | 値 |
---|---|
Header | mountmgr.h (Mountmgr.h を含む) |