Vista以降で使用可能なWSCInstallProviderAndChainsについて説明します。この関数の引数に注目すれば、インストールに必要な情報がより明確になります。lpErrno);lpProviderIdは、インストールしたいLSPのGUIDを指定します。lpszProviderDllPathは、インストールしたいLSPのファイルパスを指定します。lpszLspNameは、LSPに設定したい名前を指定します。dwServiceFlagsは、原則としてXP1_IFS_HANDLESを指定します。lpProtocolInfoListは、WSAPROTOCOL_INFO構造体の配列を指定します。LSPは、これらのエントリの上にインストールされることになります。dwNumberOfEntriesは、lpProtocolInfoListの要素数を指定します。lpdwCatalogEntryIdは、作成されたダミーエントリのIDを受け取る変数のアドレスを指定します。不要な場合は、NULLを指定して問題ありません。lpErrnoは、エラー情報を受け取る変数のアドレスを指定します。戻り値は、関数が成功した場合に0が返り、失敗した場合にSOCKET_ERRORが返ります。次に示すInstallLspは、インストールを実行するための準備を行います。TEXT("同一プロトコル名のエントリが既に存在します。TEXT("ダミーエントリが選択されています。TEXT("LSPのインストールに成功しました。TEXT("LSPのインストールに失敗しました。TEXT("管理者として実行してください。bResult;}InstallLspの第1引数はLSPのファイルパスであり、第2引数はプロトコル名です。LSPはこのエントリIDで識別されるエントリの上にインストールすることになります。第4引数は、第3引数の配列の要素数です。各種処理を順に見ていきます。FALSE;}このコードは、LSPからGUIDを取得する部分です。この関数を呼び出すことでLSPのGUIDを取得しています。TEXT("同一プロトコル名のエントリが既に存在します。FALSE;}}このコードは、現在システムに存在する全てのエントリを取得する部分です。全てのエントリがあれば、その中からlpdwEntryArray[i]のエントリIDを持つエントリを発見できますから、この処理は必要となります。新しくインストールするLSPのプロトコル名が既存のエントリによって使用されていないかも確認しておきます。nEntryCount);このコードは、インストール対象となるエントリのメモリを確保する部分です。LSPは、lpBaseEntryListで識別されるエントリの上にインストールされることになります。TEXT("ダミーエントリが選択されています。それをlpBaseEntryListにコピーする部分です。このエントリをインストール対象として許可しないようにしています。&nError);このコードは、Windowsのバージョンによって呼び出すべき変化させる部分です。InstallLspVistaLaterという関数を呼び出すことになります。6より低い場合は、従来のインストールを行うためにInstallLspLegacyという関数を呼び出します。この関数については、次節で取り上げます。LSPがWindows9xから利用できる点を考慮して、GetVersionExを呼び出しています。TEXT("LSPのインストールに成功しました。TEXT("LSPのインストールに失敗しました。TEXT("管理者として実行してください。MB_ICONWARNING);}このコードは、インストールが成功したかを確認する部分です。インストールに失敗した場合は、nErrorにエラー情報が格納されているためこれを確認することになります。これが原因で失敗した場合はWSANO_RECOVERYが返されることになっています。InstallLspVistaLaterの内部は、次のようになっています。LoadLibraryとGetProcAddressを使用して動的にリンクすることになります。LSPとカテゴリLSPをプロセスのアドレス空間にロードするというのは、ある意味でセキュリティ的な問題を抱えているといえます。このプロセスがシステムプロセスである場合は事態が深刻になります。したことから、アプリケーションは、特定のカテゴリが設定されているLSPのみをロードするようなことが可能になっています。次に、定義されているカテゴリの種類を示します。データを暗号化または圧縮する。ファイアウォールとして機能する。データをキャッシュする。外部から送られてきたデータを修正する。データを解析またはフィルタする。外部へ送信するデータを修正する。プロキシとして機能する。リダイレクタとして機能する。サービスやシステムプロセス内で機能する。LSPのカテゴリがLSP_FIREWALLでなければなりません。LSP_FIREWALL以外のカテゴリが設定されている場合も失敗します。失敗することになります。LSP_PROXYのLSPもロードされます。アプリケーションに設定されていないカテゴリを一切LSPが含まないことになります。LSPにカテゴリを設定するには、管理者として実行してWSCSetProviderInfoを呼び出すことになります。次に、カテゴリをLSP_FIREWALLに設定する例を示します。&nError);第1引数は、LSPのGUIDを指定します。これは、ダミーエントリに設定されたGUIDでもあり、既にダミーエントリがインストールされている必要があります。第2引数は、ProviderInfoLspCategoriesを指定します。第3引数は、カテゴリを格納した変数のアドレスを指定します。第4引数は第3引数のサイズを指定し、第5引数は0、第6引数はエラー情報を受け取る変数のアドレスを指定します。何もカテゴリが設定されていないアプリケーションになります。アプリケーションにカテゴリを設定するには、管理者として実行してWSCSetApplicationCategoryを呼び出すことになります。次に、カテゴリをLSP_FIREWALLに設定する例を示します。&nError);第1引数は、アプリケーションのパスを指定します。この関数の呼び出しの時点で、ファイルが存在している必要はありません。第2引数は、第1引数のサイズを指定します。第3引数と第4引数は、NULLと0で問題ありません。第5引数は、設定したいカテゴリを指定します。第6引数は、NULLで問題ありません。第7引数は、エラー情報を受け取る変数のアドレスを指定します。LSP_FIREWALLが設定されているものに限られることになります。ちなみに、カテゴリが設定されているアプリケーションは、次のレジストリキー以下に列挙されます。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_CatalogこのレジストリキーのサブキーのAppFullPathを確認すれば、アプリケーションのパスを特定することができます。設定されているカテゴリは、PermittedLspCategoriesに格納されています。