Vista以降で使用可能なWSCInstallProviderAndChainsを呼び出しました。今回は、従来のインストールを行うために必要となるWSCInstallProviderについて説明します。lpErrno);lpProviderIdは、LSPのGUIDを指定します。lpszProviderDllPathは、LSPのファイルパスを指定します。lpProtocolInfoListは、インストールするLSPの情報を格納したWSAPROTOCOL_INFO構造体の配列を指定します。WSCInstallProviderAndChainsのように、LSPの下に存在するエントリの情報を指定するわけではないので、注意してください。dwNumberOfEntriesは、lpProtocolInfoListの要素数を指定します。lpErrnoは、エラー情報を受け取る変数のアドレスを指定します。戻り値は、関数が成功した場合に0が返り、失敗した場合にSOCKET_ERRORが返ります。WSCInstallProviderによってインストールされたエントリは、オーダーの最後尾に設定されることになります。下に存在することになるエントリより前方に移動させる必要があります。新しくオーダーが決定されることになります。dwNumberOfEntries);lpwdCatalogEntryIdは、エントリIDの配列を指定します。dwNumberOfEntriesは、lpwdCatalogEntryIdの要素数を指定します。戻り値は、関数が成功した場合にERROR_SUCCESSが返ります。次に、前節で呼び出したInstallLspLegacyの内部を示します。新しいオーダーの設定の3つになります。各種処理を順に見ていきます。FALSE;このコードは、ダミーエントリをインストールする部分です。lpBaseEntryList[0]をコピーしています。lpBaseEntryListに指定するインデックスは、nEntryCountの範囲内ならばどれでも構いません。コピーが終了したら、ダミーエントリとしての情報を維持するように、dummyEntryの一部のメンバを書き換えます。ProtocolChain.ChainLenに0を指定する点です。0を指定することでダミーエントリとして認識されるようになります。新しく作成されたエントリのエントリIDは、自動で決定されます。FALSE;}}このコードは、実際のエントリをインストールする部分です。その中から先ほどインストールしたダミーエントリのエントリIDを取得します。これは、実際のエントリをインストールするために必要です。実際のエントリ用に適切に調整します。ChainEntriesに格納されている各エントリIDを1つ後方にずらします。ChainEntries[0]はChainEntries[1]に格納されます。することで、ChainEntries[0]に空きが生じるため、ここにダミーエントリのエントリIDを指定します。ChainEntries[1]には、実際のエントリの下に存在することになるエントリのIDを指定します。下に存在することになるエントリはlpBaseEntryListで表されますから、このエントリのIDを指定します。プロトコルチェーンの階層が1つ増えたことになるため、ChainLenの増加を忘れずに行っておきます。szProtocolには、szOverProtocolNameの書式通りの文字列を指定するようにします。この書式のおかけで、このエントリがどのエントリの上に存在するかが分かるようになります。ProviderIdは、CoCreateGuidで作成した新規のGUIDを指定します。LSPのGUIDは、guidProviderに格納されていますが、これはダミーエントリのGUIDとして指定します。nTotalEntryCount);このコードは、新しくオーダーを設定する部分です。lpEntryListを一度開放して、新しく初期化し直します。これは、lpEntryListに先ほどインストールしたエントリを含めるためです。1回目のループでオーダーの前方に移動させたいエントリのIDを配列に格納します。このエントリにはChainEntries[0]がダミーエントリのIDであるという特徴があります。lpdwEntryIdOrderに格納されることになります。ChainEntries[0]への参照を防ぐためです。1回目のループでlpdwEntryIdOrderに格納されなかった残りのエントリのIDを格納します。