ドライバーの登録と開始/停止コントロール

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

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

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

ネットワーク ミニ リダイレクター ドライバーは、MINIRDR_DISPATCH構造体で渡されたコールバック ルーチンの 1 つである MRxStart ルーチンの呼び出しを受け取るまで、実際には操作を開始しません。 MrxStart コールバック ルーチンは、ネットワーク ミニ リダイレクターが独自のドライバー ディスパッチ エントリ ポイントを保持しない限り、操作のコールバック ルーチンを受信する場合は、ネットワーク ミニ リダイレクター ドライバーによって実装する必要があります。 それ以外の場合、RDBSS では、MrxStart が正常に返されるまで、ドライバーへの次の I/O 要求パケット 許可されます。

  • デバイス作成およびデバイス操作に関する IRP 要求で、IRPSP の FileObject->FileName.Length が 0 であり、かつ FileObject->RelatedFileObject が NULL である場合。

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

RDBSS ディスパッチ ルーチンは、次の I/O 要求パケットに対するすべての要求も失敗します。

  • IRP_MJ_CREATE_MAILSLOT

  • IRP_MJ_CREATE_NAMED_PIPE

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

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

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

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

次の表に、RDBSS ドライバーの登録と開始/停止コントロール ルーチンの一覧を示します。

Routine 説明

RxDriverEntry

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

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

RxRegisterMinirdr

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

RxSetDomainForMailslotBroadcast

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

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 ベクトルと同じにして、渡されたデバイス オブジェクトに関連付けられているドライバー オブジェクトにインストールします。