WSCSetApplicationCategory 関数 (ws2spi.h)
構文
int WSCSetApplicationCategory(
[in] LPCWSTR Path,
[in] DWORD PathLength,
[in] LPCWSTR Extra,
[in] DWORD ExtraLength,
[in] DWORD PermittedLspCategories,
[out] DWORD *pPrevPermLspCat,
[out] LPINT lpErrno
);
パラメーター
[in] Path
アプリケーションの実行可能イメージへの読み込みパスを含む Unicode 文字列へのポインター。 この文字列は、パス解決の通常の規則を監視し、埋め込み環境文字列 ( %SystemRoot%など) を含めることができます。
[in] PathLength
Path パラメーターの長さ (文字数)。 この長さには、終端の NULL は含まれません。
[in] Extra
Path パラメーターで指定されたアプリケーションを起動するときに使用されるコマンド ライン引数を表す Unicode 文字列へのポインター。 Extra パラメーターは、一貫性のあるコマンド ラインを使用して起動するときに、アプリケーションの複数の個別のインスタンスを区別するために使用されます。 これは、Svchost.exe または Rundll32.exe のインスタンスごとに異なるアプリケーション分類をサポートするためです。 Path パラメーターのみが必要で、アプリケーションのインスタンスをさらに区別するためにコマンド ライン引数が必要ない場合は、Extra パラメーターを NULL に設定する必要があります。
[in] ExtraLength
Extra パラメーターの長さ (文字数)。 この長さには、終端の NULL は含まれません。
[in] PermittedLspCategories
このアプリケーションのすべてのインスタンスで許可される LSP カテゴリの DWORD 値。 アプリケーションは、 Path パラメーターと Extra パラメーターの値の組み合わせによって識別されます。
[out] pPrevPermLspCat
このアプリケーションのすべてのインスタンスで許可された、許可された LSP カテゴリの以前のセットを受け取るためのポインター。 このパラメーターは省略可能です 。NULL を指定できます。
[out] lpErrno
関数が失敗した場合のエラー コードへのポインター。
戻り値
エラーが発生しない場合、 WSCSetApplicationCategory は ERROR_SUCCESS (ゼロ) を返します。 それ以外の場合は 、SOCKET_ERRORを返し、 lpErrno パラメーターに特定のエラー コードが返されます。
エラー コード | 意味 |
---|---|
1 つ以上の引数が、ユーザー・アドレス・スペースの有効な部分にありません。 | |
1 つ以上の引数が無効です。 | |
回復不可能なエラーが発生しました。 このエラーは、ユーザーが Winsock レジストリにアクセスするために必要な管理特権がない、または Winsock カタログ エントリまたはアプリケーション ID エントリを開くときにエラーが発生したなど、いくつかの条件で返されます。 |
解説
WSCSetApplicationCategory は、アプリケーション インスタンスに関連付けられている LSP カテゴリ フラグを設定するために使用されます。 アプリケーションは、アプリケーションのコンテキスト内で許容できる LSP 動作を決定できます。 したがって、許可される LSP カテゴリを指定することで、アプリケーションでは、許容可能な動作を実装する階層化されたサービス プロバイダーのみを読み込むことができます。
同じ実行可能ファイル内でホストされているアプリケーションまたはサービスの異なるインスタンスを区別するためにコマンド ラインを使用する場合は 、Extra パラメーターが必要です。 各インスタンスには、アプリケーションの分類のニーズが異なる場合があります。 Svchost.exe と Rundll32.exe は、異なるプロセス インスタンスを区別するためにコマンド ラインが必要な 2 つの例です。 SvcHost.exe の場合、 -k <svcinstance> スイッチによってプロセス インスタンスが定義されます。
サービスの場合、Winsock カタログは特定のプロセスに対してグローバルであり、プロセスが複数のサービスをホストする可能性があるため、サービス名を使用するだけでは十分ではありません。
WSCSetApplicationCategory 関数が同じアプリケーション (同じ fullpath、EXE 名、およびパラメーター) で複数回呼び出される場合、カテゴリは一緒に ORed になります。 たとえば、"c:\foo.exe -param" を LSP_SYSTEM で分類し、LSP_REDIRECTORを使用して WSCSetApplicationCategory 関数をもう一度呼び出した場合、このアプリケーションの結果のエントリには LSP_SYSTEM |LSP_REDIRECTOR。 この動作は、1 つの EXE で複数のアプリケーションをホストする 1 つの実行可能ファイル (Windows システム サービス svchost.exe など) をサポートするように設計されています。
ウィンドウ ソケットは、アプリケーションの ID を決定し、 WSAStartup の最初の呼び出し中に許可された LSP カテゴリを取得します。 これは、アプリケーション インスタンスの期間中に許可される LSP カテゴリのセットです。 特定のアプリケーション ID に対して許可されている LSP カテゴリに対する後続の変更は、アプリケーションの次のインスタンスまで取得されません。 許可されている LSP カテゴリは、アプリケーション インスタンスの有効期間中は変更できません。
Winsock 2 は、階層化されたプロトコルに対応しています。 階層型プロトコルは、より高いレベルの通信機能のみを実装するプロトコルであり、リモート エンドポイントとのデータの実際の交換には基になるトランスポート スタックに依存します。 レイヤー化されたプロトコルまたは階層化されたサービス プロバイダーの例としては、認証を実行し、相互に合意された暗号化スキームを確立するために、接続確立プロセスにプロトコルを追加するセキュリティ層があります。 このようなセキュリティ プロトコルでは、一般に、TCP や SPX などの基になる信頼性の高いトランスポート プロトコルのサービスが必要になります。 基本プロトコルという用語は、リモート エンドポイントとのデータ通信を実行できる TCP や SPX などのプロトコルを指します。 階層化プロトコルという用語は、単独で立つことができないプロトコルを記述するために使用されます。
LSP の初期化中に、LSP は多数の Winsock SPI 関数へのポインターを提供する必要があります。 これらの関数は、LSP のすぐ上のレイヤー (別の LSP または Ws2_32.dll) によって通常の処理中に呼び出されます。
インストール可能なファイル システム (IFS) を実装する LSP は、単独で実装される関数へのポインターを選択的に提供するか、レイヤーによって提供されるポインターを LSP のすぐ下に戻すかを選択できます。 IFS 以外の LSP は独自のハンドルを提供するため、すべての Winsock SPI 関数を実装する必要があります。 これは、各 SPI では、作成したすべてのソケット ハンドルを下位プロバイダー (別の LSP または基本プロトコル) のソケット ハンドルにマップするために LSP が必要になるためです。
ただし、すべての LSP は、Winsock SPI 関数のサブセットに対してのみ追加の処理を行うことで、特定の作業を実行します。
LSP が実装する SPI 関数のサブセットと、それらの各関数に対して実行される追加処理の性質に基づいて、LSP カテゴリを定義できます。
LSP を分類し、Winsock ソケットを使用するアプリケーションを分類することで、実行時に特定のプロセスに LSP を関与させる必要があるかどうかを選択的に判断できるようになります。
Windows Vista 以降では、LSP は Windows ソケットの呼び出しとデータとの対話方法に基づいて分類できます。 LSP カテゴリは、Winsock SPI 関数のサブセットに対する特定可能な動作のグループです。 たとえば、HTTP コンテンツ フィルターはデータインスペクター ( LSP_INSPECTOR カテゴリ) として分類されます。 LSP_INSPECTOR カテゴリは、データ転送 SPI 関数のパラメーターを検査します (ただし、変更は行いません)。 アプリケーションは、LSP のカテゴリに対してクエリを実行し、LSP カテゴリとアプリケーションの許可された LSP カテゴリのセットに基づいて LSP を読み込まないことを選択できます。
次の表に、LSP を分類できるカテゴリを示します。
LSP カテゴリ | 説明 |
---|---|
**LSP_CRYPTO_COMPRESS** | LSP は、暗号化またはデータ圧縮プロバイダーです。 |
**LSP_FIREWALL** | LSP はファイアウォール プロバイダーです。 |
**LSP_LOCAL_CACHE** | LSP はローカル キャッシュ プロバイダーです。 |
**LSP_INBOUND_MODIFY** | LSP は受信データを変更します。 |
**LSP_INSPECTOR** | LSP はデータを検査またはフィルター処理します。 |
**LSP_OUTBOUND_MODIFY** | LSP は送信データを変更します。 |
**LSP_PROXY** | LSP はプロキシとして機能し、パケットをリダイレクトします。 |
**LSP_REDIRECTOR** | LSP はネットワーク リダイレクターです。 |
**LSP_SYSTEM** | LSP は、サービスおよびシステム プロセスで使用できます。 |
LSP は、複数のカテゴリに属している可能性があります。 たとえば、ファイアウォール/セキュリティ LSP は、インスペクター (LSP_INSPECTOR) カテゴリとファイアウォール (LSP_FIREWALL) カテゴリの両方に属している可能性があります。
LSP にカテゴリ が設定されていない場合は、その他のすべてのカテゴリに属していると見なされます。 この LSP カテゴリは、サービスまたはシステム プロセス (lsass、winlogon、多くの svchost プロセスなど) には読み込まれません。
WSCSetApplicationCategory 関数は、Administrators グループのメンバーとしてログオンしているユーザーのみが呼び出すことができます。 Administrators グループのメンバーではないユーザーによって WSCSetApplicationCategory が呼び出された場合、関数呼び出しは失敗し、 WSANO_RECOVERYlpErrno パラメーターで返されます。 この関数は、ユーザー アカウント制御 (UAC) が原因で失敗する場合もあります。 この関数を含むアプリケーションが、組み込みの Administrator 以外の Administrators グループのメンバーとしてログオンしているユーザーによって実行された場合、 requestedExecutionLevel が requireAdministrator に設定されたマニフェスト ファイルでアプリケーションがマークされていない限り、この呼び出しは失敗します。 Windows Vista または Windows Server 2008 上のアプリケーションにこのマニフェスト ファイルがない場合、組み込みの Administrator 以外の Administrators グループのメンバーとしてログオンしたユーザーは、この関数を成功させるために、拡張シェルで組み込みの Administrator (RunAs 管理者) としてアプリケーションを実行する必要があります。
ファイルのインストールまたはサービス プロバイダー固有の構成は、呼び出し元によって実行する必要があります。
要件
サポートされている最小のクライアント | Windows Vista [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows Server 2008 [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | ws2spi.h |
Library | Ws2_32.lib |
[DLL] | Ws2_32.dll |