RxStartMinirdr 関数 (mrx.h)
RxStartMinirdr は、RDBSS に登録するために以前に呼び出されたネットワーク ミニ リダイレクターを起動するために呼び出されます。 RxStartMinirdr の一部として、ドライバーが UNC 名のサポートを示している場合、RDBSS はネットワーク ミニ リダイレクター ドライバーを汎用名前付け規則 (UNC) プロバイダーとして複数 UNC プロバイダー (MUP) に登録します。
構文
NTSTATUS RxStartMinirdr(
[in] IN PRX_CONTEXT RxContext,
[out] OUT PBOOLEAN PostToFsp
);
パラメーター
[in] RxContext
デバイス オブジェクトを取得し、これがファイル システム プロセスであるかどうかを判断するために使用するRX_CONTEXT構造体へのポインター。
[out] PostToFsp
ファイル システム プロセスによって後で処理するために要求をポストする必要がある場合は、戻り値として TRUE に設定された論理値へのポインター。
戻り値
RxStartMinirdr は、スタートアップ シーケンスが成功した場合、または次のいずれかのエラー値がSTATUS_SUCCESSを返します。
リターン コード | 説明 |
---|---|
STATUS_ACCESS_DENIED | アクセスが拒否されたため、UNC プロバイダーとして登録する要求が失敗しました。 |
STATUS_ACCESS_VIOLATION | UNC プロバイダーとして登録する要求がアクセス違反で失敗しました。 |
STATUS_INSUFFICIENT_RESOURCES | このルーチンを完了するにはリソースが不足していました。 |
STATUS_PENDING | RDBSS とネットワーク ミニ リダイレクターのスタートアップ シーケンスは、ユーザー モードのアプリケーション プロセスではなく、システム プロセスのコンテキストで完了する必要があります。 RxStartMinirdr の呼び出しがユーザー モード プロセス (ユーザー モード サービス要求など) から送信された場合、要求は RDBSS 内で後で処理するためにポストされ、STATUS_PENDINGが返されます。 このエラーは、特定の内部 RDBSS ロックを待機せずに取得できない場合にも返すことができます。 呼び出しは、後でシステム スレッドから完了します。 |
STATUS_REDIRECTOR_STARTED | ネットワーク ミニ リダイレクターは既に開始されています。 |
注釈
ネットワーク ミニ リダイレクターは、ドライバーがカーネルによって読み込まれるたびに RDBSS に登録し、ドライバーがアンロードされたときに RDBSS で登録を解除します。 ネットワーク ミニ リダイレクターは、RDBSS からエクスポートされた登録ルーチン RxRegisterMinirdr を呼び出すことによって読み込まれたことを RDBSS に通知します。 この登録プロセスの一環として、ネットワーク ミニ リダイレクターは、ネットワーク ミニ リダイレクターの構成情報と、ネットワーク ミニ リダイレクター ドライバーによって実装されたコールバック ルーチンへのポインターのテーブルを含む、大きな構造のMINIRDR_DISPATCHへのポインターである RxRegisterMinirdr にパラメーターを渡します。 RDBSS では、この構造体で渡されたコールバック ルーチンを使用して、ネットワーク ミニ リダイレクターと通信します。
ネットワーク ミニ リダイレクターは、MINIRDR_DISPATCH構造体で渡されたコールバック ルーチンの 1 つである MRxStart ルーチンの呼び出しを受け取るまで、実際には操作を開始しません。 MrxStart コールバック ルーチンは、ネットワーク ミニ リダイレクターが独自のドライバー ディスパッチ エントリ ポイントを保持しない限り、操作のコールバック ルーチンを受信する場合は、ネットワーク ミニ リダイレクター ドライバーによって実装する必要があります。 それ以外の場合、RDBSS では、 MrxStart が正常に返されるまで、ドライバーへの次の I/O 要求パケットのみが許可されます。
- IRPSP の FileObject-FileName.Length パラメーターが 0 で、FileObject-RelatedFileObject>> パラメーターが NULL であるデバイス作成操作とデバイス操作に対する IRP 要求。
その他の 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 または IOCTL 要求の結果として呼び出されます。 RxRegisterMinirdr の呼び出しが成功した後、ネットワーク ミニ リダイレクターの DriverEntry ルーチンから RxStartMinirdr を呼び出すことはできません。これは、一部の開始処理でドライバーの初期化が完了する必要があるためです。
RDBSS がユーザー モードからネットワーク ミニ リダイレクター ドライバーに送信された FSCTL または IOCTL 要求を受信すると、RDBSS はRX_CONTEXT構造体を作成し、この呼び出しをネットワーク ミニリダイレクターの MRxLowIOSubmit[LOWIO_OP_FSCTL] または MRxLowIOSubmit[LOWIO_OP_IOCTL] MINIRDR_DISPATCH構造体で定義されたコールバック ルーチンに渡します。 このコールバック ルーチンのネットワーク ミニ リダイレクターの実装は、 RxStartMinirdr を開始して呼び出す要求を認識します。 イベントのこの通常のプロセスの詳細を以下に示します。
ユーザー モード アプリケーションは、プライベート FSCTL または IOCTL 要求を発行して、ネットワーク ミニ リダイレクターを開始します。
RDBSS カーネル ドライバーは、RDBSS が RDBSS 内部ルーチンを指すミニ リダイレクター ドライバーのドライバー ディスパッチ エントリ ポイントを置き換えたため、ネットワーク ミニ リダイレクターに代わって FSCTL または IOCTL 要求を受け取ります。 これは、ネットワーク ミニ リダイレクターが RxRegisterMinirdr を呼び出すときに Controls パラメーターにRX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCHを設定しなかったことを前提としています。 RxRegisterMinirdr に渡されるこのオプションは通常とは異なるものであり、ネットワーク ミニ リダイレクターが RDBSS でドライバー ディスパッチ エントリ ポイントを置き換えることを望まないことを示します。
RDBSS は、ネットワーク リダイレクターに代わって、FSCTL または IOCTL 要求を内部的に受信します。 RDBSS ディスパッチャーは、RX_CONTEXT構造体を割り当てて初期化します。 次に、RDBSS は、このネットワーク ミニ リダイレクターのMINIRDR_DISPATCH構造で定義されているネットワーク ミニ リダイレクター MRxLowIOSubmit[LOW_OP_FSCTL] または MRxLowIOSubmit[LOW_OP_IOCTL] ルーチンを呼び出し、初期化されたRX_CONTEXT構造体をパラメーターとして渡します。
このコールバック ルーチンのネットワーク ミニ リダイレクターの実装では、RxStartMinirdr を開始および呼び出すためのプライベート FSCTL または IOCTL 要求を認識し、RDBSS から受信したRX_CONTEXT構造体を RxContext パラメーターとして渡し、RxContext の PostToFSP メンバーのアドレスを PostToFsp パラメーターとして渡します。
この呼び出しはユーザー モードから開始されたため、 RxStartMinirdr はSTATUS_PENDINGを返し 、PostToFsp を TRUE に設定します。
ネットワーク ミニ リダイレクター MRxLowIOSubmit[LOW_OP_FSCTL] または MRxLowIOSubmit[LOW_OP_IOCTL] ルーチンは、この戻り値を受け取り、RDBSS ディスパッチャーに返します。
RDBSS ディスパッチャーは、STATUS_PENDING戻り値を受け取り 、PostToFsp を TRUE に設定し、ワーカー スレッドに要求を送信して、ネットワーク ミニ リダイレクターへの呼び出しを再実行します。
この時点以降、FSCTL または IOCTL が非同期操作または同期操作として要求されたかどうかに基づいて、2 つの結果が得られます。
これが非同期要求の場合は、次の処理が行われます。
- ユーザー モードの呼び出し元は、呼び出しからSTATUS_PENDING応答を受け取ります。 ポストされたワーカー スレッドは、最終的にファイル システム スレッドから RxStartMinirdr を呼び出し、呼び出しが処理されます。 RxStartMinirdr ルーチンは、要求された場合、ネットワーク ミニ リダイレクターを UNC プロバイダーとして登録しようとします。 Windows Vista より前のバージョンの Windows では、RDBSS はネットワーク ミニ リダイレクターをファイル システムとして I/O マネージャーに登録しようとします。 これらの呼び出しが成功した場合、 RxStartMinirdr は、ネットワーク ミニ リダイレクターによって実装された MrxStart コールバック ルーチンを呼び出します。 MrxStart からの戻り値は、最終的に、呼び出しシーケンス プロセスを非同期操作として開始したユーザー モード アプリケーションに返されます。
これが同期要求の場合は、次の処理が行われます。
- ユーザー モードの呼び出し元は、STATUS_PENDING応答を受け取りませんが、ポストされたワーカー スレッドから呼び出しが返されるまで強制的に待機します。 ポストされたワーカー スレッドは、最終的にファイル システム スレッドから RxStartMinirdr を呼び出し、呼び出しが処理されます。 RxStartMinirdr ルーチンは、要求された場合、ネットワーク ミニ リダイレクターを UNC プロバイダーとして登録しようとします。 Windows Vista より前のバージョンの Windows では、RDBSS はネットワーク ミニ リダイレクターをファイル システムとして I/O マネージャーに登録しようとします。 これらの呼び出しが成功した場合、 RxStartMinirdr は、ネットワーク ミニ リダイレクターによって実装された MrxStart コールバック ルーチンを呼び出します。 MrxStart からの戻り値は、呼び出しシーケンス プロセスを開始したユーザー モード アプリケーションに返されます。
ネットワーク ミニ リダイレクターが RDBSS (Controls パラメーターを RxRegisterMinirdr に対する Controls パラメーター) に登録するときに UNC のサポートを示す場合、RxStartMinirdr は、ネットワーク ミニ リダイレクターの DeviceName パラメーターを MUP を持つ UNC プロバイダーとして登録しようとします (RDBSS は、ネットワーク ミニ リダイレクターの代わりに FsRtlRegisterUncProvider を呼び出します)。
Windows Vista より前のバージョンの Windows では、 RxStartMinirdr によってファイル システムが I/O マネージャーに登録されます (RDBSS は、ネットワーク ミニ リダイレクターの代わりに IoRegisterFileSystem を呼び出します)。
呼び出しが成功した場合、 RxStartMinirdr はネットワーク ミニ リダイレクター MrxStart ルーチンを 呼び出します。 MrxStart が成功を返した場合、RDBSS のミニ リダイレクターの内部状態は RDBSS_STARTED に設定されます。 ミニ リダイレクター デバイス オブジェクトの StartStopContext.Version メンバーもインクリメントされます。
RDBSS とネットワーク ミニ リダイレクターのスタートアップ シーケンスは、非同期操作が要求された場合、システム プロセスのコンテキストで完了する必要があります。 RxStartMinirdr の呼び出しがユーザー モード プロセス (ユーザー モード サービス要求など) から送信された場合、要求は RDBSS によって内部的に作業キューにポストされ、後で処理するためにSTATUS_PENDINGが返され、PostToFsp パラメーターが TRUE に設定されます。 また、待機せずに特定の内部 RDBSS ロックを取得できない場合は、STATUS_PENDINGが返され 、PostToFsp が TRUE に設定されます。 STATUS_PENDINGが返されると、 RxStartMinirdr がシステム プロセス内から再度呼び出されます。 RxStartMinirdr への呼び出しを開始した FSCTL または IOCTL 要求が非同期操作に設定されている場合、RDBSS は呼び出しチェーンをユーザー モードから元の FSCTL または IOCTL 要求にSTATUS_PENDINGバックアップします。 一方、FSCTL または IOCTL 要求が同期操作用の場合、呼び出しは後で実行するために作業スレッドにもポストされますが、FSCTL または IOCTL 呼び出しは、 RxStartMinirdr がファイル システム プロセスのコンテキストで実行されるまでユーザー モードに戻りません。 この場合、FSCTL または IOCTL の呼び出し元にSTATUS_PENDINGエラーが返されることはありません。 より一般的な動作は、ユーザー モード のアプリケーション コードを簡略化するために、これらの開始/停止操作の同期要求を開始することです。
異常終了またはその他の障害が発生した場合、 RxStartMinirdr は、UNC プロバイダーの MUP への登録解除、ファイル システムの登録解除、mailslot ブロードキャストで使用されるドメイン名の格納に割り当てられたメモリの解放、内部 RDBSS テーブルの更新など、これらの操作を元に戻そうとします。
要件
要件 | 値 |
---|---|
対象プラットフォーム | デスクトップ |
Header | mrx.h (Mrx.h を含む) |
IRQL | <= APC_LEVEL |
こちらもご覧ください
MRxLowIOSubmit[LOWIO_OP_FSCTL]
MRxLowIOSubmit[LOWIO_OP_IOCTL]