PMRX_CREATE_SRVCALL コールバック関数 (mrx.h)
MRxCreateSrvCall ルーチンは RDBSS によって呼び出され、ネットワーク ミニ リダイレクターがSRV_CALL構造を作成し、サーバーとの接続を確立するように要求します。
構文
PMRX_CREATE_SRVCALL PmrxCreateSrvcall;
NTSTATUS PmrxCreateSrvcall(
IN OUT PMRX_SRV_CALL SrvCall,
IN OUT PMRX_SRVCALL_CALLBACK_CONTEXT SrvCallCallBackContext
)
{...}
パラメーター
SrvCall
[入力、出力]作成するSRV_CALL構造体へのポインター。
SrvCallCallBackContext
[入力、出力] MRxCreateSrvCall 要求が最終的に完了したときに RDBSS に通知するためにネットワーク ミニ リダイレクターによって使用されるコールバック コンテキストへのポインター。 SrvCallCallBackContext パラメーターは、この要求のRX_CONTEXT構造体と、MRxCreateSrvCall 要求が最終的に完了したときにミニリダイレクターが呼び出すコールバック ルーチンを含むMRX_SRVCALLDOWN_STRUCTURE構造体を指します。
戻り値
RDBSS では、成功または失敗時に MRxCreateSrvCall がSTATUS_PENDINGを返す必要があります。 RDBSS では、この呼び出しが非同期的に完了することが想定されているため、この動作が発生します。 ネットワーク ミニ リダイレクターは、 MRxCreateSrvCall の戻り値としてSTATUS_PENDINGにSTATUS_SUCCESSをマップする必要があります。
呼び出しが完了すると、SrvCallCallBackContext-Status> メンバーで最終的な完了状態が返され、MRX_SRVCALLDOWN_STRUCTURE構造体の Callback メンバー内のルーチンがネットワーク ミニ リダイレクターによって呼び出されます。 このメンバーには、ネットワーク ミニ リダイレクターが完了時にこの値を変更するまで、最初はSTATUS_BAD_NETWORK_PATHが含まれています。
SrvCallCallBackContext-Status> メンバーには、呼び出しが完了した後の成功時のSTATUS_SUCCESS、または失敗時の次の一般的なエラー コードのいずれかが含まれます (ただし、他のエラー コードが考えられます)。
リターン コード | 説明 |
---|---|
STATUS_BAD_NETWORK_PATH | 指定されたネットワーク パスが正しくありません。 |
STATUS_NETWORK_UNREACHABLE | ネットワークに到達できませんでした。 |
注釈
RDBSS とネットワーク ミニ リダイレクター間のインターフェイスで使用される 2 つの重要な抽象化は、SRV_CALL構造とNET_ROOT構造です。 SRV_CALL構造体は、接続が確立されると、サーバーに関連付けられているコンテキストに対応します。 NET_ROOT構造体は、サーバー上の共有に対応します (これは、ネットワーク ミニ リダイレクターによって要求された名前空間の一部と見なすこともできます)。
通常、SRV_CALL構造の作成には、少なくとも 1 つのネットワーク ラウンド トリップが含まれます。 リモート リソースとのネットワーク接続を確立する必要があるため、この操作の完了にはかなりの時間がかかる場合があります。 非同期操作を確実に続行するために、SRV_CALL構造体の作成は 2 フェーズ アクティビティとしてモデル化されます。 SRV_CALL構造を作成するためのネットワーク ミニ リダイレクターへの各呼び出しには、要求の完了状態を指定する RDBSS へのネットワーク ミニ リダイレクターからの呼び出しが伴います。 RDBSS では、 MRxCreateSrvCall が非同期的に完了することを前提としています。 そのため、RDBSS では MRxCreateSrvCall がSTATUS_PENDINGを返す必要があります。 RDBSS は、呼び出しが最終的に完了すると、コールバック ルーチンを使用して通知されます。
MRxCreateSrvCall のネットワーク ミニ リダイレクターの実装は、最初の呼び出しにSTATUS_PENDINGを返す必要があります。 処理が完了すると、ネットワーク ミニ リダイレクターは 、SrvCallCallBackContext パラメーターの一部として渡されるコールバック ルーチンを呼び出して、呼び出しが完了したことを RDBSS に通知し、完了状態を返します。 ネットワーク ミニ リダイレクターが呼び出すコールバック ルーチンは、SrvCallCallBackContext パラメーターのMRX_SRVCALLDOWN_STRUCTUREの Callback メンバーとして指定されます。 呼び出しの最終的な完了状態は、SrvCallCallBackContext パラメーターの Status メンバーに格納する必要があります。
成功した場合、ネットワーク ミニ リダイレクターは、SrvCallCallBackContext の RecommunicateContext メンバーにいくつかの値を格納する必要もあります。 RecommunicateContext メンバーに格納されている値は、MRxCreateSrvCall が成功した場合に RecommunicateContext パラメーターで RDBSS が MRxSrvCallWinnerNotify に渡す値です。 また、ネットワーク ミニ リダイレクターは、作成されたSRV_CALL構造体の SrvCall パラメーターに適切なデータを入力する必要があります。 MRxCreateSrvCall に渡される SrvCall パラメーターは、SrvCallCallBackContext パラメーターのMRX_SRVCALLDOWN_STRUCTUREの SrvCall メンバーと同じであることに注意してください。 この同じ SrvCall パラメーターは、SrvCall パラメーターの MRxSrvCallWinnerNotify にも渡されます。
ネットワーク ミニ リダイレクターでの MRxCreateSrvCall の実装も、トランスポート ハンドルの必要性によって複雑になります。 特定のトランスポート関連インターフェイスでは、すべての通信にハンドルを作成して使用する必要があります。 SRV_CALL構造を作成するには、ネットワーク通信用のトランスポート関連ハンドルを確立する必要がある場合があります。 ネットワーク接続を確立するプロセスには時間がかかる場合があるため、接続が確立されたら、可能な限り通信に接続を使用するのが理にかなっています。 リモート ネットワーク リソースへのトランスポート ハンドルが確立されると、他の任意の数のアプリケーション要求で再利用できます。 ユーザー アプリケーションが終了すると、プロセスに関連付けられているハンドルが削除されます。 このため、有効期間が短い可能性がある一時的なユーザー モード プロセスのコンテキストでトランスポート ハンドルを確立しても意味がありません。 そのため、通常、これらのトランスポート ハンドルが通信に使用されている間は消えない既知のプロセスのコンテキストで、SRV_CALL構造体を初期化する必要があります。
トランスポート ハンドルに関する潜在的な問題を回避するために使用される方法の 1 つは、RDBSS システム プロセスにトランスポート ハンドルを割り当てることです。 これは、 MRxCreateSrvCall ルーチンの実行方法に影響します。 MRxCreateSrvCall への要求が RDBSS システム プロセスのコンテキストで発行された場合、この呼び出しは直ちに実行でき、作業キューにポストする必要はありません。 ただし、問題を回避するために、 MRxCreateSrvCall への要求が他のプロセスからの場合、要求は後で実行するために RxDispatchToWorkerThread を使用してシステム作業キューにポストされます。 RDBSS は、後でシステム スレッドの 1 つを使用して作業キュー要求を処理し、 MRxCreateSrvCall を実行します。 これにより、すべてのトランスポート ハンドルがシステム プロセスによって所有されるようになります。
ネットワーク ミニ リダイレクターは、RxGetRDBSSProcess を呼び出すことによって、MRxCreateSrvCall の呼び出しが RDBSS から直接受信されたかどうかを判断できます。 RxGetRDBSSProcess は RDBBS プロセスを返します。この値は 、IoGetCurrentProcess を使用して返される現在のプロセスと比較できます。 MRxCreateSrvCall の呼び出しが RDBSS システム プロセスのコンテキストで開始されなかった場合、MRxCreateSrvCall はSTATUS_PENDINGを返し、RDBSS による後で実行するために RxDispatchToWorkerThreadを使用して作業キューへの呼び出しをポストできます。 通常、これらの呼び出しは DelayedWorkQueue に投稿されます。
ネットワーク ミニ リダイレクターの開発者は、 MRxCreateSrvCall の実装方法を決定する必要があります。 SRV_CALLを作成するプロセスにかなりの時間がかかる場合は、 MRxCreateSrvCall を非同期的に完了する必要があります。 トランスポート ハンドルが必要な場合、ネットワーク ミニ リダイレクターは、これらのハンドルを確立するために有効期間が長いシステム プロセスを見つける必要があります。
この呼び出しが完了したら、 SrvCall パラメーターを、ネットワーク ミニ リダイレクターから更新されたSRV_CALL構造体情報で変更する必要があります。
UNC プロバイダーとしてのサポートを示すネットワーク ミニ リダイレクターは、 MRxCreateSrvCall の呼び出しとして、マルチ UNC プロバイダー (MUP) からプレフィックス要求を受け取ります。 UNC の名前付けと MUP の詳細については、「 UNC の名前付けと MUP のサポート」を参照してください。
要件
要件 | 値 |
---|---|
対象プラットフォーム | デスクトップ |
Header | mrx.h (Mrx.h を含む) |