次の方法で共有


ネットワーク プロバイダーの実装

ネットワーク プロバイダーは、Windows オペレーティング システムが特定のネットワーク プロトコルをサポートできるようにする DLL です。 これは、ネットワーク プロバイダー API を実装することによって行われます。 この API は、ネットワークと通信するための 複数プロバイダー ルーター (MPR) 呼び出しの関数のセットです。 その後、ネットワーク プロバイダーは、これらの呼び出しをネットワーク固有の API 呼び出しに変換して、MPR で指定されたアクションを実行します。 このようにして、Windows オペレーティング システムは、ネットワーク固有の API を理解しなくても、新しいネットワーク プロトコルと対話できます。

ネットワーク プロバイダーを作成するには、 NPGetCaps 関数をエクスポートする DLL を作成します。

ネットワーク プロバイダー API の他の関数のサポートは省略可能です。 ネットワーク プロバイダーに関数が必要ない場合、DLL はそれを実装したり、スタブ実装を提供したりする必要はありません。 詳細については、「 ネットワーク プロバイダー関数」の個々の関数に関するトピックを参照してください。

例外として、次のいずれかの列挙関数をサポートする場合は、他の 2 つの関数 ( NPOpenEnumNPEnumResourceNPCloseEnum) もサポートする必要があります。

次のガイドラインでは、MPR および Windows オペレーティング システムと適切に対話するネットワーク プロバイダーを作成する方法について説明します。 可能な限り、プロバイダーは速度、検証、ルーティングに関する次のガイドラインに従う必要があります。

速度

ネットワーク プロバイダーは、ネットワーク リソースがそれ自体であるかどうかを迅速に判断する必要があります。 これは、MPR がリソースの所有者を見つけるために、多くのプロバイダーを循環させる必要がある可能性があるためです。

ネットワーク プロバイダーがリソースを所有していない場合は、すぐにWN_BAD_NETNAME状態コードを返す必要があります。

また、NPGetDirectoryType をサポートするプロバイダーは、WinFile がディレクトリ ツリーを描画しているときに呼び出されるため、この関数の結果をすばやく返することも重要です。

検証

検証の順序は重要です。 ネットワーク プロバイダーは、最初にそのネットワークが開始されているかどうかを判断してから、ネットワークとネットワーク プロバイダーが操作をサポートしているかどうかを判断する必要があります。 これらのチェックの後、ネットワーク プロバイダーがネットワーク リソースを受け取った場合は、そのリソースを所有しているかどうかを判断する必要があります。 最後に、他のパラメーターを検証する必要があります。

ルーティング

MPR がネットワーク プロバイダーを循環する必要がある場合は、呼び出しを受け入れるまですべてのプロバイダーを試します。 つまり、MPR は常にネットワーク プロバイダーの検索を試み続けます。

ただし、プロバイダーによって報告された最初の重大なエラーをメモします。 ERROR_BAD_NETPATH、ERROR_BAD_NET_NAME、ERROR_INVALID_PARAMETER、ERROR_INVALID_LEVELなどのエラーは、単にプロバイダーがリソースを管理していないことを意味するため、重要でないと見なされます。 ただし、プロバイダーがエラー ERROR_INVALID_PASSWORDまたはその他の重大なエラーで失敗した場合、MPR はこのエラーを記録し、ネットワーク プロバイダーを循環し続けます。 一般に、ルーティング時に、プロバイダーが呼び出しを受け入れなかった場合、MPR は、ネットワーク プロバイダー間の循環中に発生した最初の重大なエラーを報告します。

ネットワーク プロバイダーは、返すエラー メッセージを決定するときに、MPR のこの動作を考慮する必要があります。

実装に関するメモ

ネットワーク プロバイダー DLL を実装する場合、プロバイダーは、MPR サブシステムへの再入を引き起こす可能性がある他の Windows ネットワーク関数シェル API、またはその他の UNC パスベースのクエリを呼び出してはなりません。 ネットワーク プロバイダー DLL、アプリケーション、またはその他のオペレーティング システム コンポーネントからこのような呼び出しを行うと、MPR サブシステム内で競合、パフォーマンスの低下、デッドロックが発生する可能性があります。