次の方法で共有


UNC 名前付けと MUP のサポート

この記事では、ネットワーク リダイレクターが汎用名前付け規則 (UNC) の名前付けと複数 UNC プロバイダー (MUP) をサポートする方法について説明します。

MUP は、システムによって提供されるカーネルモード コンポーネントで、UNC パスを処理します。

  • UNC を使用していると識別されるネットワーク リソースを見つけるのに役立ちます。

  • UNC 名を使用してすべてのリモート ファイル システム アクセスを、リモート ファイル システム要求を処理できるネットワーク リダイレクターに伝達します。 ネットワーク リダイレクターは、UNC プロバイダーです。

MUP は、アプリケーションが UNC パス (次のようなコマンド ライン コマンドなど) を使用する場合に必要です。

notepad \\server\public\readme.txt

MUP は、アプリケーションから UNC 名を含むコマンドを受け取ります。 登録されている各 UNC プロバイダーと、インストールされているその他のネットワーク プロバイダーに名前を送信します。 UNC プロバイダーが UNC 名を自らの名前と識別すると、MUP はその名前の将来のインスタンスをそのプロバイダーに自動的にリダイレクトします。

マップされたドライブ文字 ("NET USE" コマンドなど) を作成する操作中は、MUP は必要とされません。 代わりに、ネットワーク リダイレクターの複数プロバイダー ルーター (MPR) とユーザーモードの Windows Networking (WNet) プロバイダー DLL でこの操作を処理します。 ただし、ユーザー モードの WNet プロバイダー DLL は、この操作中にカーネル モード ネットワーク リダイレクター ドライバーと直接通信できます。

Windows Vista に導入されたリダイレクター モデルに準拠するネットワーク リダイレクターの場合、マップされたネットワーク ドライブが使用されている場合でも MUP が必要です。 マップされたドライブで実行されるファイル操作は、MUP を経由してネットワーク リダイレクターに移動します。 このケースでは、MUP は関係するネットワーク リダイレクターに操作をただ渡します。

MUP は、DFS (分散ファイル システム) クライアントも含む、mup.sys バイナリの一部です。

カーネル ネットワーク リダイレクターには、通常、リモート リソースへの接続の確立をサポートするユーザーモードの WNet プロバイダー DLL もあります (ドライブ文字をリモート リソースにマッピングするなど)。 MPR は、WNet プロバイダーへのクエリに基づいてネットワーク接続を確立するユーザー モード DLL です。 MPR の呼び出しは、次のいずれかの操作の結果として行われます。

  • コマンド プロンプトから発行された net use x: \\server\share コマンド。

  • Windows Explorer から確立されたネットワーク ドライブ文字接続。

  • WNet 関数への直接呼び出し。

UNC 名を処理するには、ネットワーク リダイレクターを MUP に登録する必要があります。 複数の UNC プロバイダーが MUP に登録されている可能性があります。 これらの UNC プロバイダーには、次のリダイレクターのうち 1 つ以上を指定できます。

  • サーバー メッセージ ブロック (SMB) リダイレクターや WebDAV リダイレクターなど、RDBSS に基づくネットワーク ミニリダイレクター。
  • RDBSS に基づいていないレガシ リダイレクター。

プレフィックス解決

MUP は、名前ベースの操作 (通常はIRP_MJ_CREATE要求) で UNC パスを処理できるプロバイダーを決定します。 この決定は "プレフィックス解決" と呼ばれます。プレフィックス解決操作には次の 2 つの目的があります。

  • プレフィクス解決の結果として発生した名前ベースの操作は、プレフィクスを要求するプロバイダーにルーティングされます。 成功した場合、MUP は後続のハンドルベースの操作 (IRP_MJ_READ や IRP_MJ_WRITE など) が、MUP を完全にバイパスする同じプロバイダーに確実に移動します。

  • プロバイダーとプロバイダーが要求したプレフィックスは、MUP が保持するプレフィックス キャッシュに入力されます。 後続の名前ベースの操作では、MUP はこのプレフィックス キャッシュを使用して、プレフィックス解決を実行する前にプロバイダーが既にプレフィックスを要求しているかどうかを判断します。 このプレフィックス キャッシュ内の各エントリは、キャッシュに追加されるとタイムアウト (TTL と呼ばれます) の対象になります。 このタイムアウトが切れるとエントリはスローされます。その時点で、MUP は後続の名前ベースの操作でこのプレフィックスのプレフィックス解決を再度実行します。

MUP は、MUP に登録されているネットワーク リダイレクターに IOCTL_REDIR_QUERY_PATH 要求を発行することで、プレフィックス解決を実行します。 IOCTL_REDIR_QUERY_PATH の入力バッファーと出力バッファーは、非ページ プールから割り当てられます。

ネットワーク リダイレクターは、IRP 構造体の RequesterMode メンバーが KernelMode であることを確認することによって、この IOCTL のカーネル モードの送信者のみを許可する必要があります。

MUP は、要求情報に QUERY_PATH_REQUEST 構造体を使用します。

UNC プロバイダーは、応答情報に QUERY_PATH_RESPONSE 構造体を使用する必要があります。

FsRtlRegisterUncProvider を呼び出して MUP に UNC プロバイダーとして登録するレガシ ネットワーク リダイレクター (RDBSS を使用しない) は、IOCTL_REDIR_QUERY_PATH 要求を受信します。

UNC プロバイダーとしてのサポートを示すネットワーク ミニリダイレクターは、IRP_MJ_CREATE 呼び出しであるかのようにこのプレフィックス要求を受信します。 この作成要求は、FILE_CREATE_TREE_CONNECTION フラグが設定されたユーザー モードの CreateFile 呼び出しに似ています。 ネットワーク ミニリダイレクターは MRxLowIOSubmit[LOWIO_OP_IOCTL] の呼び出しとしてプレフィックス要求を受信しません。 プレフィックス要求の場合、RDBSS は MRxCreateSrvCall 要求をネットワーク ミニリダイレクターに送信し、その後に MRxSrvCallWinnerNotifyMRxCreateVNetRoot の呼び出しを送信します。 ネットワーク ミニリダイレクターが RDBSS に登録されると、RDBSS は、内部 RDBSS エントリ ポイントを指すネットワーク ミニリダイレクターのドライバー ディスパッチ テーブルコピーします。 RDBSS は、ネットワーク ミニリダイレクターの内部でこの IOCTL_REDIR_QUERY_PATH を受信し、MRxCreateSrvCallMRxSrvCallWinnerNotify、および MRxCreateVNetRoot を呼び出します。 元の IOCTL_REDIR_QUERY_PATH IRP は、MRxCreateSrvCall ルーチンに渡される RX_CONTEXT 構造体に含まれます。 さらに、MRxCreateSrvCall に渡される RX_CONTEXT 内の次のメンバーが変更されます。

  • MajorFunction メンバーは、元の IRP が IRP_MJ_DEVICE_CONTROL された場合でも、IRP_MJ_CREATE に設定されます。
  • PrefixClaim.SuppliedPathName.Buffer メンバーは、QUERY_PATH_REQUEST 構造体の FilePathName メンバーに設定されます。
  • PrefixClaim.SuppliedPathName.Length メンバーは、QUERY_PATH_REQUEST 構造体の PathNameLength メンバーに設定されます。
  • Create.NtCreateParameters.SecurityContext メンバーは、QUERY_PATH_REQUEST 構造体の SecurityContext メンバーに設定されます。
  • Create.ThisIsATreeConnectOpen メンバーは TRUE に設定されています。
  • Create.Flags メンバーには、RX_CONTEXT_CREATE_FLAG_UNC_NAME ビットが設定されています。

ネットワーク ミニ リダイレクターがプレフィックス要求の詳細を表示する場合は、 MRxCreateSrvCall に渡された RX_CONTEXT でこれらのメンバーを読み取ることができます。 それ以外の場合は、サーバー共有への接続を試み、 MRxCreateSrvCall 呼び出しが成功した場合に STATUS_SUCCESS を返すことができます。 RDBSS は、ネットワーク ミニリダイレクターに代わってプレフィックス要求を行います。

ネットワーク ミニリダイレクターがこの IOCTL を直接受信するケースが 1 つあります。 ネットワーク ミニ リダイレクターは、RDBSS を初期化して登録する前に、ドライバー ディスパッチ テーブルのコピーを保存できます。 RxRegisterMinirdr を呼び出して RDBSS に登録した後、ネットワーク ミニ リダイレクターは、RDBSS によってインストールされた新しいドライバー ディスパッチ テーブル エントリ ポイントのコピーを保存し、元のドライバー ディスパッチ テーブルを復元できます。 復元されたドライバー ディスパッチ テーブルは、受信した IRP でネットワーク ミニリダイレクターに関係する IRP をチェックした後、呼び出しが RDBSS ドライバー ディスパッチ エントリ ポイントに転送されるように変更する必要があります。 RDBSS は、ドライバーが RDBSS を初期化して RxRegisterMinrdr を呼び出すときに、ネットワーク ミニリダイレクターのドライバー ディスパッチ テーブルをコピーします。 rdbsslib.lib にリンクす るネットワーク ミニ リダイレクターは、その DriverEntry ルーチンから RxDriverEntry を呼び出す前に、元のドライバー ディスパッチ テーブルを保存して RDBSS スタティック ライブラリを初期化し、 RxRegisterMinrdr を呼び出した後にドライバー ディスパッチ テーブルを復元する必要があります。 この要件は、RDBSS が RxDriverEntry ルーチンと RxRegisterMinrdr ルーチンの両方のネットワーク ミニリダイレクター ディスパッチ テーブルを介してコピーされるためです。

REG_SZ ProviderOrder レジストリ値は、プレフィックス解決中にプロバイダーのクエリが実行される順序を制御します。 この値は、次のキーの下に格納されます。

HKLM\System\CurrentControlSet\Control\NetworkProvider\Order

ProviderOrder レジストリ値の個々のプロバイダー名は、先頭または末尾に空白を付けずにコンマで区切られます。

たとえば、この値には次の文字列が含まれる場合があります。

RDPNP,LanmanWorkstation,WebClient

UNC パス \\<server>\<share>\<path> を指定すると、MUP プレフィックス キャッシュにプレフィックス (\\server\share や \\server など) が見つからない場合、MUP はプレフィックス解決要求を発行します。 MUP は、プロバイダーがプレフィックスを要求するまで (またはすべてのプロバイダーのクエリが実行されるまで) プレフィックス解決要求を次の順序で各プロバイダーに送信します。

  1. TS クライアント (RDPNP)

  2. SMB リダイレクター (LanmanWorkstation)

  3. WebDAV リダイレクター (WebClient)

ProviderOrder レジストリ値の変更を MUP で有効にするには、再起動が必要です。

MUP では、一覧表示されている各プロバイダー名を使用して、次のレジストリ キーの下にあるプロバイダーのレジストリ キーを検索します。

HKLM\System\CurrentControlSet\Services\<ProviderName>

その後、MUP は NetworkProvider サブキーの下の DeviceName 値を読み取り、プロバイダーが登録するデバイス名を見つけます。 プロバイダーが実際に登録すると、MUP は渡されたデバイス名を既知のプロバイダーのデバイス名の一覧と照合します。 次に、プレフィックス解決のためにプロバイダーをリストの順序に配置します。 この一覧のプロバイダーの順序は、先ほど説明した ProviderOrder レジストリ値で指定された順序に基づいています。

WNet プロバイダーへのクエリに基づいてネットワーク接続を確立するユーザーモード DLL であるマルチ プロバイダー ルーター (MPR) でも、このプロバイダー順序が守られます。

MUP はプレフィックス解決要求を順次発行し、最初のプロバイダーがプレフィックスを要求するとすぐに停止します。 したがって、先ほど例では、RDPNP がプレフィックスを要求した場合、MUP は SMB (メガバイト) または WebDAV リダイレクターを呼び出しません。

"シリアル プレフィックス解決" (並列ではない) により、ProviderOrder 優先度が低いネットワーク リダイレクターが、ProviderOrder 優先度が高いネットワーク リダイレクターにパフォーマンスの問題を引き起こすことがなくなります。 たとえば、特定の種類の TCP/IP パケット (HTTP へのアクセスなど) をブロックし、他のサーバー (SMB (メガバイト) アクセスなど) を許可するように構成された、ファイアウォールが設定されたリモート サーバーについて考えます。 この場合、SMB (メガバイト) ネットワーク リダイレクターが ProviderOrder 値の最初のプロバイダーとして構成され、プレフィックスを迅速に要求した場合でも、WebDAV リダイレクターは TCP 接続のタイムアウトを待機することでプレフィックス解決の完了を大幅に遅らせる可能性があります。