次の方法で共有


WSCInstallProviderAndChains64_32関数 (ws2spi.h)

WSCInstallProviderAndChains64_32関数は、指定されたトランスポート プロバイダーとその特定のプロトコル チェーンを、64 ビット コンピューター上の 32 ビットおよび 64 ビットの Winsock 2 システム構成データベースの両方にインストールします。 この関数により、トランスポート プロバイダー構成情報の先頭にプロトコル チェーンが順序付けされ、 WSCWriteProviderOrder を個別に呼び出す必要がなくなります。

構文

int WSCInstallProviderAndChains64_32(
  [in]            LPGUID              lpProviderId,
  [in]            const LPWSTR        lpszProviderDllPath,
  [in]            const LPWSTR        lpszProviderDllPath32,
  [in]            const LPWSTR        lpszLspName,
  [in]            DWORD               dwServiceFlags,
  [in]            LPWSAPROTOCOL_INFOW lpProtocolInfoList,
  [in]            DWORD               dwNumberOfEntries,
  [out, optional] LPDWORD             lpdwCatalogEntryId,
  [out]           LPINT               lpErrno
);

パラメーター

[in] lpProviderId

プロバイダーのグローバル一意識別子 (GUID) へのポインター。

[in] lpszProviderDllPath

プロバイダー 64 ビット DLL への読み込みパスを含む Unicode 文字列へのポインター。 この文字列は、パス解決の通常の規則を観察し、埋め込み環境文字列 ( %SystemRoot%など) を含めることができます。 このような環境文字列は、 Ws2_32.dll がアプリケーションの代わりにプロバイダー DLL を読み込む必要があるときに展開されます。 埋め込まれた環境文字列が展開されると、 Ws2_32.dll は結果の文字列を LoadLibrary 関数に渡し、プロバイダーをメモリに読み込みます。 詳細については、「 LoadLibrary」を参照してください。

**注** lpszProviderDllPath32 が **NULL** に設定されている場合、 lpszProviderDllPath%windir%\system32\<dllname> に設定する必要があります。 そうでない場合、呼び出しは失敗し、 WSAEINVAL エラー コードを返します。
 

[in] lpszProviderDllPath32

プロバイダー 32 ビット DLL への完全修飾パスを含む Unicode 文字列へのポインター。 この文字列は、パス解決の通常の規則を観察し、埋め込み環境文字列 ( %SystemRoot%など) を含めることができます。 このような環境文字列は、 Ws2_32.dll がアプリケーションの代わりにプロバイダー DLL を読み込むときに拡張されます。 埋め込まれた環境文字列が展開されると、 Ws2_32.dll は結果の文字列を LoadLibrary 関数に渡して、プロバイダーをメモリに読み込みます。 詳細については、「 LoadLibrary」を参照してください。

**注** このパラメーターが **NULL** に設定されている場合、64 ビット プロバイダーは %windir%\system32 フォルダーに存在し、32 ビット プロバイダーは %windir%\syswow64 フォルダーに存在する必要があります。
 

[in] lpszLspName

階層化サービス プロバイダー (LSP) の名前を含む Unicode 文字列へのポインター。

[in] dwServiceFlags

作成する階層化プロトコル カタログ エントリの種類に対するサービス フラグ。 階層化プロトコル エントリは、ChainLen メンバーが 0 に設定されたWSAProtocol_Info構造です。 LSP の実際のカタログ エントリは、 ProtocolChain メンバーのこの階層化されたプロトコル エントリの ID を参照します。

意味
XP1_IFS_HANDLES
カタログ エントリは、IFS 固有のソケット ハンドルを返すインストール可能ファイル システム (IFS) LSP 用です。 IFS LSP は Winsock 呼び出しの完了をインターセプトできず、すべての Winsock 関数を実装する必要はありません。

[in] lpProtocolInfoList

WSAProtocol_Info構造体の配列へのポインター。 各構造体は、プロバイダーによってサポートされるプロトコル、アドレス ファミリ、ソケットの種類を定義します。 検査される WSAPROTOCOL_INFO 構造体のメンバーは、 iProtocoliAddressFamilyおよび iSocketType です

[in] dwNumberOfEntries

lpProtocolInfoList 配列内のエントリの数。

[out, optional] lpdwCatalogEntryId

Winsock 2 システム構成データベース内のトランスポート プロバイダー用に新しくインストールされたレイヤード プロトコル エントリへのポインター。 これは、LSP のカタログにインストールされているプロトコル チェーン エントリの作成に使用される ID です。

[out] lpErrno

関数が失敗した場合に呼び出しによって生成されるエラー コードへのポインター。

戻り値

WSCInstallProviderAndChains64_32成功すると、0 が返されます。 それ以外の場合は 、SOCKET_ERRORを返し、 lpErrno パラメーターで特定のエラー コードが返されます。

エラー コード 意味
WSAEFAULT
1 つ以上の引数がユーザー・アドレス・スペースの有効な部分にありません。
WSAEINVAL
1 つ以上の引数が無効です。 lpProviderId パラメーターが **NULL**、lpszProviderDllPath パラメーターが無効であるか、パスの長さが大きすぎる (**MAX_PATH** を超えました)、lpszLspName パラメーターが無効であるか、名前の長さが大きすぎる (**WSAPROTOCOL_LEN** を超えています)、lpProtocolInfoList が非**NULL** に設定され、dwNumberOfEntries が返されます。パラメーターが 0 であるか、重複するプロバイダー ID または階層化されたサービス プロバイダー名がカタログに既に存在するか、指定されたプロトコル、アドレス ファミリ、ソケットの種類に一致するものが見つかりません。
WSAEINVALIDPROCTABLE
プロバイダーに必要な機能がありません。 IFS 以外のプロバイダーは、Winsock 2 のすべての拡張関数 (AcceptExConnectEx、DisconnectExTransmitFileTransmitPacketsLPFN_WSARECVMSG (WSARecvMsg)) を実装する必要があります。
WSAEINPROGRESS
プロバイダーのインストールは既に進行中です。
WSAENOBUFS
バッファーにメモリを割り当てることはできません。
WSANO_RECOVERY
回復不可能なエラーが発生しました。 このエラーは、プロバイダーが既にインストールされている、 lpProtocolInfoList パラメーターが **NULL** で、ベース プロバイダーが見つからなかった、プロトコル チェーンの最大長 (**MAX_PROTOCOL_CHAIN**) に達した、ユーザーが Winsock レジストリへの書き込みに必要な管理特権がない、カタログ エントリの作成またはインストール時にエラーが発生したなど、いくつかの条件で返されます。
WSASYSCALLFAILURE
失敗しないシステム呼び出しが失敗しました。

注釈

WSCInstallProviderAndChains64_32 は、1 つのトランスポート サービス プロバイダーをインストールするために使用される基本 WSCInstallProvider64_32 関数の拡張バージョンです。 レイヤード サービス プロバイダーがインストールされている場合は、 WSCInstallProviderAndChains64_32 を使用する必要があります。 WSCInstallProviderAndChains64_32 は、1 つの関数呼び出しで階層化されたプロトコルと 1 つ以上のプロトコル チェーンをインストールできます。 WSCInstallProvider64_32を使用して同じ作業を行うには、複数の関数呼び出しが必要です。

Winsock 2 は、階層化されたプロトコルに対応します。 階層化されたプロトコルは、リモート エンドポイントとのデータの実際の交換に基づくトランスポート スタックに依存しながら、より高いレベルの通信機能のみを実装するプロトコルです。 レイヤー化されたプロトコルの例としては、認証を実行し、相互に合意された暗号化スキームを確立するために、接続確立プロセスにプロトコルを追加するセキュリティ層があります。 このようなセキュリティ プロトコルでは、一般に、TCP や SPX などの基になる信頼性の高いトランスポート プロトコルのサービスが必要になります。 基本プロトコルという用語は、リモート エンドポイントとのデータ通信を実行できる TCP や SPX などのプロトコルを指します。 階層化プロトコルという用語は、スタンドアロンにできないプロトコルを記述するために使用されます。 その後、プロトコル チェーンは、1 つ以上の階層化されたプロトコルとして定義され、ベース プロトコルによって連結され、固定されます。 基本プロトコルには、WSAProtocol_Info 構造体の ChainLen メンバーが BASE_PROTOCOL に設定され、1 に定義されています。 階層化プロトコルでは、WSAPROTOCOL_INFO構造体の ChainLen メンバーが LAYERED_PROTOCOL に設定され、ゼロとして定義されます。 プロトコル チェーンには、WSAPROTOCOL_INFO構造体の ChainLen メンバーが 1 より大きく設定されています。

WSCInstallProviderAndChains64_32 は、 WSCInstallProviderAndChains の 64 ビット バージョンです。 プロバイダーは、64 ビット プラットフォーム上の 32 ビットと 64 ビットの両方のカタログにインストールされます。 つまり、64 ビット プラットフォームでは、2 つの Winsock カタログが維持され、32 ビットプロセスと 64 ビット プロセスの両方で、この関数でインストールされている LSP を読み込むことができます。

64 ビット コンピューターでは、32 ビット用に特別に設計されていないすべての呼び出し (たとえば、"32" で終わっていないすべての関数) は、ネイティブの 64 ビット カタログで動作します。 64 ビット コンピューターで実行されるプロセスは、互換性を維持するために 、WSCInstallProviderAndChains64_32 を使用して 32 ビット カタログと 64 ビット カタログの両方で動作する必要があります。 特定の 32 ビット呼び出しの定義とセマンティクスは、ネイティブの呼び出しと同じです。

**注** 64 ビット プラットフォームでは、64 ビット カタログにのみインストールする **WSCInstallProviderAndChains** 関数はありません。 64 ビット プラットフォームでは、LSP の 32 ビットバージョンと 64 ビット バージョンの両方がインストールされている必要があります。 64 ビット Winsock カタログにのみインストールする必要があるプロバイダーの場合は、 WSCInstallProvider 関数を使用できます。
 

lpProtocolInfoListNULL に設定されている場合、この関数はプロトコル チェーンを作成します。プロバイダーは、アドレス ファミリ、ソケットの種類、プロトコルで定義されている一意のプロトコルの種類ごとにベース プロトコルを介して階層化されます。 これにより、アクセスできない重複するプロバイダー エントリが作成されなくなります。

lpProtocolInfoListNULL 以外の値に設定されている場合、この関数は、指定された配列内の各要素から {address family、socket type、protocol} タプルと一致する構成情報の最上位のエントリを取得することで、プロトコル チェーンを作成します。 ここでも、 {address family, socket type, protocol} タプルのみが考慮されます。他のすべてのメンバーと重複は無視されます。

この呼び出しが正常に完了すると、 以降に WSAEnumProtocolsWSCEnumProtocols、または WSCEnumProtocols32 を呼び出すと、新しく作成されたプロトコル チェーン エントリが返されます。 Windows 環境では、WSCInstallProviderAndChains64_32が正常に完了した後に WSAStartup を呼び出して作成された Ws_32.dll のインスタンスにのみ、WSAEnumProtocols、WSCEnumProtocolsWSCEnumProtocols32 が返されるときに新しいエントリが含まれることに注意してください。

メモWSAEnumProtocols 関数は、WSCEnumProtocols および WSCEnumProtocols32 が実行している間、階層化されたプロトコル エントリを列挙しません。

 

成功すると、 WSCInstallProviderAndChains64_32、WSAProviderConfigChange を呼び出して、変更の通知を登録したすべての関心のあるアプリケーションにアラートを送信しようとします。

WSCInstallProviderAndChains64_32関数は、Administrators グループのメンバーとしてログオンしているユーザーのみが呼び出すことができます。 Administrators グループのメンバーではないユーザーによってWSCInstallProviderAndChains64_32が呼び出された場合、関数呼び出しは失敗し、lpErrno パラメーターでWSANO_RECOVERYが返されます。 Windows Vista または Windows Server 2008 を実行しているコンピューターの場合、ユーザー アカウント制御 (UAC) が原因でこの関数が失敗する可能性もあります。 この関数を含むアプリケーションが、組み込みの Administrator 以外の Administrators グループのメンバーとしてログオンしているユーザーによって実行された場合、 requestedExecutionLevelrequireAdministrator に設定されたマニフェスト ファイルでアプリケーションがマークされていない限り、この呼び出しは失敗します。 Windows Vista または Windows Server 2008 上のアプリケーションにこのマニフェスト ファイルがない場合、組み込みの Administrator 以外の Administrators グループのメンバーとしてログオンしたユーザーは、この関数を成功させるために、拡張シェルで組み込みの Administrator (RunAs 管理者) としてアプリケーションを実行する必要があります。

ファイルのインストールまたはプロバイダー固有の構成は、呼び出し元のアプリケーションによって実行する必要があります。

IFS プロバイダーと IFS 以外のプロバイダー

IFS プロバイダーは、ネイティブ オペレーティング システム ハンドルを返すプロバイダーです。 通常、これらのハンドルはカーネル モード プロトコル ドライバーに関連付けられます。 たとえば、ベース TCP/IPv4、UDP/IPv4、TCP/IPv6、UDP/IPv6 は、これらのエントリがカーネル モード コンポーネントに対応するため、IFS プロバイダーです。 IFS ハンドルは、**ReadFile**、**WriteFile**、および **CancelIo** 関数呼び出しで使用できます。 IFS プロバイダーである階層型サービス プロバイダーは、下位プロバイダー (IFS プロバイダーである必要もあります) から作成されたソケット ハンドルを呼び出し元のアプリケーションに直接返すだけです。 IFS LSP は、Winsock 呼び出しの完了通知をインターセプトできません。

IFS 以外のプロバイダーは、 WPUCreateSocketHandle を使用して中間ハンドルを作成し、このハンドルを呼び出し元に返すプロバイダーです。 これにより、IFS 以外の LSP は、呼び出し元アプリケーションの前に送信イベントと受信完了イベントをインターセプトして、後処理 (受信したデータのチャンクの暗号化解除など) を可能にします。 IFS 以外のソケット ハンドルは 、ReadFileWriteFile の呼び出しで使用できますが、 CancelIo では使用できません。 IFS 以外のハンドルで操作を取り消す唯一の保証メソッドは、 closesocket を使用してソケットを閉じることです。

32 ビットおよび 64 ビット プロバイダー DLL のパス

lpszProviderDllPath は、プロバイダー DLL の 64 ビット バージョンへの完全修飾パスを表します。 このパラメーターには、埋め込み環境文字列 ( %SystemRoot%など) を含めることができます。

lpszProviderDllPath32 は、プロバイダー DLL の 32 ビット バージョンへの完全修飾パスを表します。 このパラメーターには、埋め込み環境文字列 ( %SystemRoot%など) を含めることができます。

lpszProviderDllPath32NULL の場合、lpszProviderDllPath は 32 ビット プロバイダーと 64 ビット プロバイダーの両方のパスです。 64 ビット コンピューターで 32 ビット プロセスが実行されている場合 (たとえば、Winsock アプリケーションが 32 ビット バージョンの LSP を読み込む場合)、 lpszProviderDllPath で指定された 32 ビット プロバイダーの読み込みを試みます。 lpszProviderDllPath32NULL の場合、lpszProviderDllPath パラメーターを %windir%\system32< に設定する必要があります。dllname>。 そうでない場合、呼び出しは WSAEINVAL で失敗します。 lpszProviderDllPath のパスが %windir%\system32< の場合。dllname>lpszProviderDllPath32NULL の場合、呼び出しは (ファイル システム リダイレクターを使用して) 32 ビット LSP が存在する必要がある GetSystemWow64Directory によって返されるディレクトリにリダイレクトされます。 Windows XP 64 ビット エディション、Windows Server 2003、Windows Vista の場合、このディレクトリは %windir%\syswow64 です

要件

   
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー ws2spi.h
Library Ws2_32.lib
[DLL] Ws2_32.dll

こちらもご覧ください

LoadLibrary

トランスポートの構成とインストール

トランスポート サービス プロバイダー

WPUCreateSocketHandle

WSAStartup

WSCEnumProtocols

WSCEnumProtocols32

WSCInstallProvider64_32

WSCInstallProviderAndChains

WSCWriteProviderOrder