LPWSCINSTALLPROVIDER
コールバックシグネチャ
INT LPWSCINSTALLPROVIDER(
GUID* lpProviderId,
LPWSTR lpszProviderDllPath,
WSAPROTOCOL_INFOW* lpProtocolInfoList,
DWORD dwNumberOfEntries,
INT* lpErrno
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| lpProviderId | GUID* | プロバイダーのグローバル一意識別子 (GUID) へのポインターです。 |
| lpszProviderDllPath | LPWSTR | プロバイダー DLL のロードパスを格納した Unicode 文字列へのポインターです。この文字列は通常のパス解決規則に従い、環境文字列 (%SystemRoot% など) を埋め込むことができます。これらの環境文字列は、Ws2_32.dll がアプリケーションの代わりにプロバイダー DLL を後から読み込む際に展開されます。埋め込まれた環境文字列が展開された後、Ws2_32.dll はその結果の文字列を LoadLibrary 関数に渡し、この関数がプロバイダーをメモリーに読み込みます。詳細については、LoadLibrary を参照してください。 |
| lpProtocolInfoList | WSAPROTOCOL_INFOW* | WSAProtocol_Info 構造体の配列へのポインターです。各構造体は、そのプロバイダーがサポートするプロトコル、アドレスファミリ、ソケットの種類を定義します。 |
| dwNumberOfEntries | DWORD | lpProtocolInfoList 配列内のエントリ数です。 |
| lpErrno | INT* | 関数が失敗した場合のエラーコードへのポインターです。 |
公式ドキュメント
戻り値
WSCInstallProvider が成功した場合は 0 を返します。それ以外の場合は SOCKET_ERROR を返し、lpErrno パラメーターに固有のエラーコードが返されます。
| エラーコード | 意味 |
|---|---|
| 引数の 1 つ以上が、ユーザーアドレス空間の有効な範囲内にありません。 | |
| 引数の 1 つ以上が無効です。 | |
| バッファー用のメモリーを割り当てられません。 | |
| 回復不能なエラーが発生しました。このエラーは、プロバイダーがすでにインストールされている、Winsock のレジストリに書き込むために必要な管理者権限をユーザーが持っていない、カタログエントリの作成またはインストール時に障害が発生したなど、いくつかの条件で返されます。 | |
| 決して失敗しないはずのシステム呼び出しが失敗しました。 | |
| 使用できるメモリーが不足しています。このエラーは、新しいカタログエントリを割り当てるのに十分なメモリーがない場合に返されます。 |
解説(Remarks)
WSCInstallProvider は、単一のトランスポートサービスプロバイダーをインストールするために使用します。このルーチンは、指定されたプロバイダーに必要な Windows Sockets 2 共通の構成情報を作成します。ベースプロトコル、レイヤードプロトコル、プロトコルチェーンのいずれにも適用できます。レイヤードサービスプロバイダーをインストールする場合は、WSCInstallProviderAndChains を使用してください。WSCInstallProviderAndChains は、1 回の関数呼び出しでレイヤードプロトコルと 1 つ以上のプロトコルチェーンをインストールできます。同じ作業を WSCInstallProvider で行うには、複数回の関数呼び出しが必要になります。
Winsock 2 はレイヤードプロトコルに対応しています。レイヤードプロトコルとは、上位レベルの通信機能だけを実装し、リモートエンドポイントとの実際のデータ交換は下位のトランスポートスタックに依存するプロトコルです。レイヤードプロトコルの例としては、認証を行い、相互に合意した暗号化方式を確立するために接続確立処理にプロトコルを追加するセキュリティレイヤーが挙げられます。このようなセキュリティプロトコルは、一般に TCP や SPX などの信頼性のある下位トランスポートプロトコルのサービスを必要とします。ベースプロトコルという用語は、TCP や SPX のようにリモートエンドポイントとのデータ通信を行えるプロトコルを指します。レイヤードプロトコルという用語は、単独では成立しないプロトコルを表すために使われます。そしてプロトコルチェーンは、1 つ以上のレイヤードプロトコルを連結し、ベースプロトコルで終端したものとして定義されます。 ベースプロトコルでは、WSAProtocol_Info 構造体の ChainLen メンバーに、1 と定義されている BASE_PROTOCOL が設定されます。レイヤードプロトコルでは、WSAPROTOCOL_INFO 構造体の ChainLen メンバーに、0 と定義されている LAYERED_PROTOCOL が設定されます。プロトコルチェーンでは、WSAPROTOCOL_INFO 構造体の ChainLen メンバーに 1 より大きい値が設定されます。
lpProtocolInfoList パラメーターには、インストールするプロトコルエントリの一覧を指定します。WSCInstallProvider の呼び出し側は、適切なプロトコルエントリを設定する責任を負います。lpProtocolInfoList パラメーターに NULL を指定することはできません。
この呼び出しが正常に完了すると、以降の WSAEnumProtocols または WSCEnumProtocols の呼び出しでは、新しく作成されたプロトコルエントリが返されます。なお、Windows 環境では、WSAEnumProtocols と WSCEnumProtocols が新しいエントリを返すのは、WSCInstallProvider が正常に完了した後に WSAStartup を呼び出して作成された Ws_32.dll のインスタンスに限られます。
成功した場合、WSCInstallProvider は WSAProviderConfigChange を呼び出して変更の通知を登録しているすべての関連アプリケーションに通知しようとします。
WSCInstallProvider 関数を呼び出せるのは、Administrators グループのメンバーとしてログオンしているユーザーだけです。Administrators グループのメンバーでないユーザーが WSCInstallProvider を呼び出した場合、関数呼び出しは失敗し、lpErrno パラメーターに WSANO_RECOVERY が返されます。 Windows Vista または Windows Server 2008 が動作しているコンピューターでは、ユーザーアカウント制御 (UAC) によってもこの関数が失敗することがあります。この関数を含むアプリケーションを、組み込み Administrator 以外の Administrators グループのメンバーとしてログオンしたユーザーが実行する場合、マニフェストファイルで requestedExecutionLevel に requireAdministrator が指定されていない限り、この呼び出しは失敗します。Windows Vista または Windows Server 2008 上のアプリケーションにこのマニフェストファイルがない場合、組み込み Administrator 以外の Administrators グループのメンバーとしてログオンしたユーザーは、組み込み Administrator として拡張されたシェル (管理者として実行) でアプリケーションを実行しなければ、この関数は成功しません。
ファイルのインストールやサービスプロバイダー固有の構成は、すべて呼び出し側で行う必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)