サービスプロバイダ本章では、Winsockをこれまでとは別の角度から取り上げます。このAPIの本当の役割はサービスプロバイダにアプリケーションからの処理内容を伝えることです。mswsock.dllというサービスプロバイダです。ソケットを作成するといった具体的な実装を持っているわけではないのです。サービスプロバイダには、トランスポートサービスプロバイダと名前空間サービスプロバイダの2種類が存在します。基本的にWinsock関数と一対一で対応する関数を実装しています。Winsockのconnect関数を呼び出した場合、トランスポートサービスプロバイダのWSPConnectという関数が呼ばれることになります。名前空間サービスプロバイダは、ホスト名からIPアドレスの変換が必要な場合などに呼び出されることになります。本章では、トランスポートサービスプロバイダの開発について取り上げます。開発者にとって、トランスポートサービスプロバイダを開発する目的は主に2通り考えられます。1つは、新しいプロトコルを実装するという目的です。そのプロトコル独自の通信を行えるようになります。基本的に、こうしたサービスプロバイダは、ネットワークドライバと通信するためのコードを含むことになるでしょう。1つは、既存のサービスプロバイダへの要求を検出するという目的です。ws2_32.dllからの要求を代わりに検出するのです。ws2_32.dllはTCPプロトコルを実装するmswsock.dllを呼び出し側プロセスにロードします。サービスプロバイダはソケットを作成するコードを実行することになります。そのサービスプロバイダがsocketを呼び出したプロセスにロードされることになります。理由は、ws2_32.dllによるプロトコルの検索で、mswsock.dllよりも先に一致したからです。Provider)と呼ばれます。下に存在するサービスプロバイダの関数を明示的に呼び出す必要があります。逆に、本来の処理を行いたくない場合は、サービスプロバイダの関数を呼ばなければよいでしょう。この点については注意しておく必要があります。LSPで行えることは、非常に広範です。特定のIPアドレスに対する接続を遮断することが可能です。送信データの解析したり、ローカルコンピュータ上にキャッシュしたりするようなこともできるでしょう。次のようなファイルを作成しています。どのプロセスがどの関数を呼び出したのかが一目で分かるようになります。関数によっては引数の内容を記録するのもよいでしょう。1つ注意しなければならないのは、この記録された関数をプロセスが直接呼び出したかどうかは分からないという点です。内部でWinsockの関数を呼び出すことになっています。WSAStartupからrecvまでの関数が記録されることが分かります。内部的に呼び出すアプリケーションの動作も検出することができるのです。SPIと呼ばれています。SPIは、次のように種類分けすることができます。トランスポートサービスプロバイダが実装する関数。DLLにおけるエクスポート関数。サービスプロバイダから、ws2_32.dllの機能を利用したい場合に呼び出す関数。サービスプロバイダを操作するための関数。アプリケーションとサービスプロバイダの両方が呼び出すことができる。名前空間サービスプロバイダが実装する関数。DLLにおけるエクスポート関数。どのように実装すればよいかという点になります。WSC関数を利用したインストールの方法について見ていくことになります。