次の方法で共有


RxStartMinirdr 関数 (mrx.h)

rxStartMinirdr 、RDBSS に登録するために以前に呼び出されたネットワーク ミニ リダイレクターを起動するために呼び出されます。 RxStartMinirdr の一部として、RDBSS は、ネットワーク ミニ リダイレクター ドライバーを汎用名前付け規則 (UNC) プロバイダーとして複数の UNC プロバイダー (MUP) に登録します (ドライバーが UNC 名のサポートを示している場合)。

構文

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 要求の場合、RxFsdDispatch RDBSS ディスパッチ ルーチンは、STATUS_REDIRECTOR_NOT_STARTEDの状態を返します。

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

  • IRP_MJ_CREATE_MAILSLOT
  • IRP_MJ_CREATE_NAMED_PIPE

MrxStart ルーチン ネットワーク ミニ リダイレクターは、RxStartMinirdr ルーチンが呼び出されたときに RDBSS によって呼び出されます。 RDBSS RxStartMinirdr ルーチンは、通常、ネットワーク ミニ リダイレクターを開始するユーザー モード アプリケーションまたはサービスからの FSCTL または IOCTL 要求の結果として呼び出されます。 RxRegisterMinirdr 呼び出しは、一部の開始処理でドライバーの初期化が完了する必要があるため、RxRegisterMinirdr 正常に呼び出された後、ネットワーク ミニリダイレクターの DriverEntry ルーチンから行うことはできません。

RDBSS がユーザー モードからネットワーク ミニ リダイレクター ドライバーに送信された FSCTL または IOCTL 要求を受信すると、RDBSS はRX_CONTEXT構造体を作成し、この呼び出しをネットワーク ミニ リダイレクターの MRxLowIOSubmit[LOWIO_OP_FSCTL] または MRxLowIOSubmit[LOWIO_OP_IOCTL] に渡、MINIRDR_DISPATCH構造体で定義されたルーチンをコールバックします。 このコールバック ルーチンのネットワーク ミニ リダイレクターの実装は、RxStartMinirdr 開始および呼び出す要求を認識します。 イベントのこの通常のプロセスの詳細を以下に示します。

  1. ユーザー モード アプリケーションは、ネットワーク ミニ リダイレクターを開始するプライベート FSCTL または IOCTL 要求を発行します。

  2. RDBSS カーネル ドライバーは、RDBSS 内部ルーチンを指すミニ リダイレクター ドライバーのドライバー ディスパッチ エントリ ポイントを置き換えたため、ネットワーク ミニ リダイレクターの代わりに FSCTL または IOCTL 要求を受信します。 これは、RxRegisterMinirdr を呼び出すときに、ネットワーク ミニ リダイレクターが Controls パラメーターのRX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCH設定しなかったことを前提としています。 RxRegisterMinirdr に渡されるこのオプションは通常とは異なっており、ネットワーク ミニ リダイレクターが RDBSS のドライバー ディスパッチ エントリ ポイントを置き換えることを望まないことを示します。

  3. RDBSS は、ネットワーク リダイレクターの代わりに FSCTL または IOCTL 要求を内部的に受信します。 RDBSS ディスパッチャーは、RX_CONTEXT構造体を割り当てて初期化します。 RDBSS は、このネットワーク ミニ リダイレクターのMINIRDR_DISPATCH構造体で定義されている MRxLowIOSubmit[LOW_OP_FSCTL] または MRxLowIOSubmit[LOW_OP_IOCTL] ルーチンを ネットワーク ミニ リダイレクターを呼び出し、初期化されたRX_CONTEXT構造体をパラメーターとして渡します。

  4. このコールバック ルーチンのネットワーク ミニ リダイレクターの実装は、RXStartMinirdr 起動して呼び出すプライベート FSCTL または IOCTL 要求を認識し、RDBSS から受信したRX_CONTEXT構造体をポインターで渡します。 RxContext パラメーター、および PostToFsp パラメーターとして rxContext PostToFSP メンバーのアドレス。

  5. この呼び出しはユーザー モードから開始されたため、RxStartMinirdr はSTATUS_PENDINGを返し、PostToFsp TRUE に設定します。

  6. ネットワーク ミニ リダイレクター MRxLowIOSubmit[LOW_OP_FSCTL] または MRxLowIOSubmit[LOW_OP_IOCTL] ルーチンはこの戻り値を受け取り、RDBSS ディスパッチャーに渡します。

  7. 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 (RxRegisterMinirdr する Controls パラメーター) に登録するときに UNC のサポートを示している場合、RxStartMinirdr ネットワーク ミニ リダイレクターの DeviceName パラメーターを UNC プロバイダーとして MUP に登録します (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 テーブルの更新など、これらの操作を元に戻そうとします。

必要条件

要件 価値
ターゲット プラットフォーム デスクトップ
ヘッダー mrx.h (Mrx.h を含む)
IRQL <= APC_LEVEL

関連項目

、RxpUnregisterMinirdr

DriverEntry

FsRtlRegisterUncProvider

IoRegisterFileSystem

MRxLowIOSubmit[LOWIO_OP_FSCTL]

MRxLowIOSubmit[LOWIO_OP_IOCTL]

MRxStart

RxFsdDispatch

RxRegisterMinirdr

RxSetDomainForMailslotBroadcast

RxStopMinirdr

RxUnregisterMinirdr

__RxFillAndInstallFastIoDispatch