次の方法で共有


ドライバーの登録と開始/停止制御

オペレーティング システムが起動するとき、Windows はレジストリの設定に基づいて RDBSS とネットワーク ミニリダイレクター ドライバーを読み込みます。 rdbsslib.lib に静的にリンクされているモノリシック ネットワーク ミニリダイレクター ドライバーの場合は、ドライバーが RxDriverEntry ルーチンを DriverEntry ルーチンから呼び出して、ネットワーク ドライバーにリンクされている RDBSSLIB ライブラリのコピーを初期化する必要があります。 このケースでは、他の RDBSS ルーチンが呼び出されて使用される前に、RxDriverEntry ルーチンを呼び出す必要があります。 モノリシックでないネットワーク ミニリダイレクター ドライバー (Microsoft SMB リダイレクター) の場合、rdbss.sys デバイス ドライバーが読み込まれるときに自らの DriverEntry ルーチン内で初期化されます。

ネットワーク ミニリダイレクターは、ドライバーがカーネルによって読み込まれるときに RDBSS に登録され、ドライバーがアンロードされるときに RDBSS の登録が解除されます。 ネットワーク ミニリダイレクターは、RxRegisterMinirdr (RDBSS からエクスポートされた登録ルーチン) を呼び出すことで、読み込まれたことを RDBSS に通知します。 この登録プロセスの一環として、ネットワーク ミニリダイレクターは、大きな構造体 MINIRDR_DISPATCH へのポインターであるパラメーターを RxRegisterMinirdr に渡します。 この構造体には、ネットワーク ミニリダイレクターの構成情報と、ネットワーク ミニリダイレクター カーネル ドライバーによって実装されるコールバック ルーチンへのポインターのディスパッチ テーブルが含まれています。 RDBSS は、このコールバック ルーチンの一覧を使用して、ネットワーク ミニリダイレクター ドライバーの呼び出しを行います。

RxRegisterMinirdr ルーチンは、ネットワーク ミニリダイレクター ドライバーのすべてのドライバー ディスパッチ ルーチンが、最上位の RDBSS ディスパッチ ルーチン RxFsdDispatch を指すように設定します。 ネットワーク ミニリダイレクターは、RxRegisterMinirdr の呼び出しが戻った後で、独自のエントリ ポイントを保存し、独自のエントリ ポイントを使用してドライバー ディスパッチを記述しなおすか、RxRegisterMinirdr を呼び出すときに特別なパラメーターを設定することで、この動作をオーバーライドできます。

ネットワーク ミニリダイレクター ドライバーが実際に操作を行うのは、MRxStart ルーチンの呼び出しを受け取ってからです。 MrxStart コールバック ルーチンを、ネットワーク ミニリダイレクター ドライバーが実装する必要があるのは、操作のコールバック ルーチンを受け取ることを望むが、ネットワーク ミニリダイレクターが独自のドライバー ディスパッチ エントリ ポイントを保持していない場合です。 それ以外の場合、MrxStart が正常に返されるまで、RDBSS はドライバーに対して次の I/O 要求パケットしか許可しません。

  • デバイスの作成とデバイスの操作のための IRP 要求 (IRPSP での FileObject->FileName.Length がゼロで、FileObject->RelatedFileObject が NULL の場合)。

その他の IRP 要求の場合、RDBSS ディスパッチ ルーチン RxFsdDispatch は、STATUS_REDIRECTOR_NOT_STARTED の状態を返します。

また、RDBSS ディスパッチ ルーチンでは、次の I/O 要求パケットに対するすべての要求も処理できません。

  • IRP_MJ_CREATE_MAILSLOT

  • IRP_MJ_CREATE_NAMED_PIPE

ネットワーク ミニリダイレクターによって実装された MrxStart コールバック ルーチンが RDBSS によって呼び出されるのは、RxStartMinirdr ルーチンが呼び出されるときです。 通常、RDBSS RxStartMinirdr ルーチンは、ファイル システム制御コード (FSCTL) または I/O 制御コード (IOCTL) 要求の結果として、ネットワーク ミニリダイレクターを開始するユーザー モード アプリケーションまたはサービスから呼び出されます。 RxStartMinirdr の呼び出しは、RxRegisterMinirdr の呼び出しが成功した後に、ネットワーク ミニリダイレクターの DriverEntry ルーチンから行うことはできません。開始処理の一部ではドライバーの初期化が完了していることが必要であるためです。 RxStartMinirdr 呼び出しが受信されると、RDBSS は、ネットワーク ミニリダイレクターの MrxStart ルーチンを呼び出して開始プロセスを完了します。 MrxStart の呼び出しで成功が返されると、RDBSS は、RDBSS 内のミニリダイレクターの内部状態を RDBSS_STARTED に設定します。

RDBSS は、メールスロット ブロードキャストのドメインを設定するためのルーチン RxSetDomainForMailslotBroadcast をエクスポートします。 このルーチンは、ネットワーク ミニリダイレクターがメールスロットをサポートしている場合、登録時に使用されます。

RDBSS によってエクスポートされる便利なルーチン __RxFillAndInstallFastIoDispatch を使用すると、I/O 要求を処理するためのすべての IRP_MJ_XXX ドライバー ルーチン ポインターを同等の高速 I/O ディスパッチ ベクターにコピーできます。ただし、このルーチンはモノリシックではないドライバーでのみ機能します。

RDBSS は、ネットワーク ミニリダイレクターが開始または停止していることを RDBSS に通知するためのルーチンもエクスポートします。 これらの呼び出しが使用されるのは、リダイレクターを開始および停止するユーザーモード管理サービスまたはユーティリティ アプリケーションがネットワーク ミニリダイレクターに含まれている場合です。 このユーザーモード サービスまたはアプリケーションは、カスタムの FSCTL または IOCTL 要求をネットワーク ミニリダイレクター ドライバーに送信し、開始または停止する必要があると示すことができます。 リダイレクターは、RDBSS RxStartMinirdr または RxStopMinirdr ルーチンを呼び出して、このネットワーク ミニリダイレクターを開始または停止するように RDBSS に通知できます。

次の表に、ドライバーの登録および開始/停止制御のための RDBSS ルーチンの一覧を示します。

ルーチンによって返される値 説明

RxDriverEntry

このルーチンは、RDBSS を初期化するために DriverEntry ルーチンからモノリシック ネットワーク ミニリダイレクター ドライバーによって呼び出されます。

モノリシックではないドライバーの場合、この初期化ルーチンは、rbss.sys デバイス ドライバーの DriverEntry ルーチンと同じです。

RxRegisterMinirdr

このルーチンは、RDBSS にドライバーを登録するネットワーク ミニリダイレクター ドライバーによって呼び出されます。これにより、登録情報が内部登録テーブルに追加されます。 RDBSS は、ネットワーク ミニリダイレクター用のデバイス オブジェクトも構築します。

RxSetDomainForMailslotBroadcast

このルーチンは、ネットワーク ミニリダイレクター ドライバーによって呼び出されて、メールスロットがドライバーでサポートされている場合にメールスロット ブロードキャストに使用されるドメインを設定します。

RxStartMinirdr

このルーチンは、自身を登録するために呼び出されたネットワーク ミニリダイレクターを起動します。 また、RDBSS は、ネットワーク ミニリダイレクター ドライバーを UNC プロバイダーとして MUP に登録します (ドライバーが UNC 名のサポートを示している場合)。

RxStopMinirdr

このルーチンは、ネットワーク ミニリダイレクター ドライバーを停止します。 停止したドライバーは、IOCTL または FSCTL 要求を除いて新しいコマンドを受信しなくなります。

RxpUnregisterMinirdr

このルーチンは、RDBSS を使用してドライバーの登録を解除し、内部 RDBSS 登録テーブルから登録情報を削除するために、ネットワーク ミニリダイレクター ドライバーによって呼び出されます。

RxUnregisterMinirdr

このルーチンは、RDBSS でドライバーの登録を解除し、内部 RDBSS 登録テーブルから登録情報を削除するネットワーク ミニ リダイレクター ドライバーによって呼び出される rxstruc.h で定義されているインライン関数です。 RxUnregisterMinirdr インライン関数は、RxpUnregisterMinirdr を内部的に呼び出します。

__RxFillAndInstallFastIoDispatch

このルーチンは、高速 I/O ディスパッチ ベクターを通常のディスパッチ I/O ベクターと同じに入力し、渡されたデバイス オブジェクトに関連付けられているドライバー オブジェクトにインストールします。

次のマクロは mrx.h ヘッダー ファイルに定義されており、これらのルーチンのいずれかを呼び出します。 通常、__RxFillAndInstallFastIoDispatch ルーチンを直接呼び出す代わりに、このマクロが使用されます。

マクロ 説明

RxFillAndInstallFastIoDispatch(__devobj, __fastiodisp)

このマクロは __RxFillAndInstallFastIoDispatch を呼び出し、通常のディスパッチ I/O ベクターと同一になるように高速 I/O ディスパッチ ベクターを入力し、渡されたデバイス オブジェクトに関連付けられたドライバー オブジェクトにインストールします。