WPUModifyIFSHandle 関数 (ws2spi.h)
WPUModifyIFSHandle 関数は、(場合によっては) 変更された IFS ハンドルを Ws2_32.dll から受け取ります。
構文
SOCKET WPUModifyIFSHandle(
[in] DWORD dwCatalogEntryId,
[in] SOCKET ProposedHandle,
[out] LPINT lpErrno
);
パラメーター
[in] dwCatalogEntryId
呼び出し元サービス プロバイダーを識別する記述子。
[in] ProposedHandle
プロバイダーによって割り当てられた IFS ハンドル。
[out] lpErrno
エラー コードへのポインター。
戻り値
エラーが発生しない場合、 WPUModifyIFSHandle は変更されたソケット ハンドルを返します。 それ以外の場合は、INVALID_SOCKETを返し、 lpErrno で特定のエラー コードを使用できます。
エラー コード | 意味 |
---|---|
提案されたハンドルが無効です。 |
注釈
WPUModifyIFSHandle ハンドルを使用すると、WS2_32.dll は、指定された IFS ハンドルの変更されたバージョンを返すことによって、内部操作を効率化できます。 返されるハンドルは、オペレーティング システムに関する限り、提案されたハンドルと区別できないことが保証されます。 IFS プロバイダーは、新しく作成されたソケット記述子をサービス プロバイダーに返す前に、この関数を呼び出す必要があります。 サービス プロバイダーは、後続のソケット操作に対してのみ変更されたハンドルを使用します。 このルーチンは、ソケット記述子が実際の IFS ハンドルである IFS プロバイダーでのみ使用されます。
また、このプロシージャは、ベース IFS プロバイダーの上に階層化され、 WPUCreateSocketHandle 呼び出しで作成するのではなく、ベース プロバイダーのソケット ハンドルを独自のものとして公開する階層化されたプロバイダーによって使用される場合もあります。 チェーン内の次のレイヤーから受信した IFS ソケット ハンドルを "パススルー" するレイヤープロバイダーは 、WPUModifyIFSHandle を呼び出し、独自のカタログ エントリ ID を dwCatalogEntryId として渡すことができます。 これにより、次のレイヤーではなく、このレイヤーがそのソケット ハンドルを含む SPI 呼び出しのターゲットである必要があることを Windows ソケット DLL に通知します。
この方法を使用する場合、階層化されたプロバイダーが観察する必要がある制限がいくつかあります。
- プロバイダーは、WSPStartup の時点で返されるプロシージャ ディスパッチ テーブルで LPWSPSend および LPWSPRecv の基本プロバイダー エントリ ポイントを公開して、Windows ソケット SPI クライアントによるこれらの関数へのアクセスが可能な限り効率的であることを確認する必要があります。
- プロバイダーは、すべての I/O (特に I/O システム関数 ReadFile および WriteFile の場合) に対して呼び出される LPWSPSend 関数と LPWSPRecv 関数に依存できません。 これらの関数は、階層化されたプロバイダーをバイパスし、階層化されたプロバイダーがプロシージャ ディスパッチ テーブルにこれらの関数の独自のエントリ ポイントを配置した場合でも、ベース IFS プロバイダーの実装を直接呼び出します。
- プロバイダーは、LPWSPSend、LPWSPSendTo、LPWSPRecv、LPWSPRecvFrom、または LPWSPIoctl を使用して、重複した I/O を後処理する機能に依存できません。 処理後の通知は、完了ポートを介して発生し、階層化されたプロバイダーを完全にバイパスする場合があります。 階層化されたプロバイダーは、完了ポートが使用されたことを確認したり、それがどのポートであるかを判断したりする方法はありません。 階層化されたプロバイダーには、通知シーケンスに自身を挿入する方法はありません。
- プロバイダーは、元の重複したパラメーター ( WSAOVERLAPPED 構造体や完了ルーチン ポインターなど) を使用して、重複するすべての I/O 要求をベース プロバイダーに直接渡す必要があります。 プロバイダーは 、WSPGetOverlappedResult の基本プロバイダー エントリ ポイントを公開する必要があります。 一部の重複した I/O 要求では、階層化されたプロバイダーを完全にバイパスできるため、階層化されたプロバイダーは、結果を報告できる構造と、基になるプロバイダーの WSPGetOverlappedResult に渡す必要がある構造を判断するために、WSAOVERLAPPED 構造体を確実にマークすることはできません。 つまり、 LPWSPIoctl は基になるプロバイダーへのパススルー操作である必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | ws2spi.h |