SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS コントロール コード
説明
SIO_SET_WFP_CONNECTION_REDIRECT_RECORDSコントロール コードは、Windows フィルタリング プラットフォーム (WFP) リダイレクト サービスで使用する最終的な宛先への接続に使用される新しい TCP ソケットにリダイレクト レコードを設定します。
この操作を実行するには、次のパラメーターを使用して WSAIoctl または WSPIoctl 関数を呼び出します。
int WSAIoctl(
(socket) s, // descriptor identifying a socket
SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS, // dwIoControlCode
(LPVOID) lpvInputBuffer, // lpvInBuffer
(DWORD) cbInputBuffer, // cbInBuffer
NULL, // output buffer
0, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
);
int WSPIoctl(
(socket) s, // descriptor identifying a socket
SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS, // dwIoControlCode
(LPVOID) lpvInputBuffer, // lpvInBuffer
(DWORD) cbInputBuffer, // cbInBuffer
NULL, // output buffer
0, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
(LPWSATHREADID) lpThreadId, // a WSATHREADID structure
(LPINT) lpErrno // a pointer to the error code.
);
パラメーター
s
ソケットを識別する記述子。
dwIoControlCode
操作の制御コード。 この操作 にはSIO_SET_WFP_CONNECTION_REDIRECT_RECORDS を使用します。
lpvInBuffer
入力バッファーへのポインター。 このパラメーターには、ソケットに関連付けられている WFP リダイレクト レコードへのポインターが含まれています。
cbInBuffer
入力バッファーのサイズ (バイト単位)。
lpvOutBuffer
出力バッファーへのポインター。 このパラメーターは、この操作では使用されません。
cbOutBuffer
出力バッファーのサイズ (バイト単位)。 このパラメーターは 0 に設定する必要があります。
lpcbBytesReturned
出力バッファーに格納されているデータのサイズをバイト単位で受け取る変数へのポインター。
出力バッファーが小さすぎると、呼び出しは失敗し、 WSAGetLastError はWSAEINVAL を返し、 lpcbBytesReturned パラメーターはDWORD 値 0 を指します。
lpOverlapped が NULL の場合、正常な呼び出しで返される lpcbBytesReturned パラメーターが指す DWORD 値を 0 にすることはできません。
重複するソケットに 対して lpOverlapped パラメーターが NULL でない場合、すぐに完了できない操作が開始され、完了は後で示されます。 返される lpcbBytesReturned パラメーターが指す DWORD 値は、重複する操作が完了するまで格納されているデータのサイズを決定できないため、0 になる場合があります。 最終的な完了状態は、操作が完了したときに適切な完了メソッドが通知されたときに取得できます。
lpvOverlapped
WSAOVERLAPPED 構造体へのポインター。
重複する属性なしでソケット s が作成された場合、 lpOverlapped パラメーターは無視されます。
重複した属性を使用して s を開き、 lpOverlapped パラメーターが NULL でない場合、操作は重複 (非同期) 操作として実行されます。 この場合、 lpOverlapped パラメーターは有効な WSAOVERLAPPED 構造体を指している必要があります。
重複する操作の場合、 WSAIoctl または WSPIoctl 関数は直ちにを返し、操作が完了すると適切な完了メソッドが通知されます。 それ以外の場合、操作が完了するかエラーが発生するまで、関数は を返しません。
lpCompletionRoutine
種類: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
操作が完了したときに呼び出される完了ルーチンへのポインター (重複していないソケットの場合は無視されます)。
lpThreadId
WPUQueueApc への後続の呼び出しでプロバイダーによって使用される WSATHREADID 構造体へのポインター。 プロバイダーは、WPUQueueApc 関数が返されるまで、参照先の WSATHREADID 構造体 (同じへのポインターではない) を格納する必要があります。
メモ このパラメーターは 、WSPIoctl 関数にのみ適用されます。
lpErrno
エラー コードへのポインター。
メモ このパラメーターは 、WSPIoctl 関数にのみ適用されます。
戻り値
操作が正常に完了すると、 WSAIoctl または WSPIoctl 関数は 0 を返します。
操作が失敗した場合、または保留中の場合、 WSAIoctl または WSPIoctl 関数は SOCKET_ERRORを返します。 拡張エラー情報を取得するには、 WSAGetLastError を呼び出します。
エラー コード | 意味 |
---|---|
WSA_IO_PENDING | 重複した I/O 操作が進行中です。 この値は、重複した操作が正常に開始され、完了が後で示される場合に返されます。 |
WSA_OPERATION_ABORTED | スレッドの終了またはアプリケーションの要求が原因で、I/O 操作が中止されました。 このエラーは、ソケットのクローズまたはSIO_FLUSH IOCTL コマンドの実行により、重複した操作が取り消された場合 に 返されます。 |
WSAEACCES | アクセス許可によって禁止されている方法でソケットにアクセスしようとしました。 このエラーは、次のようないくつかの条件で返されます。ユーザーがローカル コンピューターで必要な管理特権を持っていないか、アプリケーションが組み込みの Administrator (RunAs administrator ) として拡張シェルで実行されていません。 |
WSAEFAULT | 呼び出しでポインター引数を使用しようとしたときに、システムによって無効なポインター アドレスが検出されました。 このエラーは、 lpvInBuffer、 lpvoutBuffer、 lpcbBytesReturned、 lpOverlapped または lpCompletionRoutine パラメーターが、ユーザー アドレス空間の有効な部分に完全に含まれていない場合に返されます。 |
WSAEINPROGRESS | 現在、ブロック操作を実行中です。 このエラーは、コールバックの進行中に関数が呼び出された場合に返されます。 |
WSAEINTR | WSACancelBlockingCall の呼び出しによってブロック操作が中断されました。 このエラーは、ブロック操作が中断された場合に返されます。 |
WSAEINVAL | 無効な引数が指定されました。 このエラーは、 dwIoControlCode パラメーターが有効なコマンドではない場合、または指定した入力パラメーターが受け入れられない場合、または指定されたソケットの型にコマンドが適用されない場合に返されます。 |
WSAENETDOWN | ソケット操作によりネットワークの停止が検出されました。 このエラーは、ネットワーク サブシステムが失敗した場合に返されます。 |
WSAENOTSOCK | ソケットではない何かに対して操作が試行されました。 記述子 s がソケットでない場合、このエラーが返されます。 |
WSAEOPNOTSUPP | 参照されるオブジェクトの種類に対して、試行された操作はサポートされていません。 このエラーは、指定された IOCTL コマンドがサポートされていない場合に返されます。 このエラーは、 SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS IOCTL がトランスポート プロバイダーでサポートされていない場合にも返されます。 |
注釈
SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS IOCTL は、Windows 8およびWindows Server 2012以降のバージョンのオペレーティング システムでサポートされています。
WFP を使用すると、TCP/IP パケット処理パスにアクセスできます。送信パケットと受信パケットは、さらに処理する前に検査または変更できます。 TCP/IP 処理パスをタップすると、独立系ソフトウェア ベンダー (ISV) は、ファイアウォール、ウイルス対策ソフトウェア、診断ソフトウェア、その他の種類のアプリケーションやサービスをより簡単に作成できます。 WFP には、ユーザー モードとカーネル モードのコンポーネントが用意されているため、サードパーティの ISV は、TCP/IP プロトコル スタック内およびオペレーティング システム全体の複数のレイヤーで行われるフィルター処理の決定に参加できます。 WFP 接続リダイレクト機能を使用すると、WFP コールアウト カーネル ドライバーは、接続をローカルでユーザー モード プロセスにリダイレクトし、ユーザー モードでコンテンツ検査を実行し、別の接続を使用して検査されたコンテンツを元の宛先に転送できます。
SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS IOCTL とその他の関連する IOCTL は、複数の WFP ベースの接続プロキシ アプリケーションが同じトラフィック フローを協調的に検査できるようにするために使用されるユーザー モード コンポーネントです。 各検査エージェントは、別の検査エージェントによって既に検査されているネットワーク トラフィックを安全に再検査できます。 (異なる ISV によって開発された) 複数のプロキシが存在する場合、1 つのプロキシが最終的な宛先と通信するために使用する接続を 2 つ目のプロキシによってリダイレクトし、新しい接続を元のプロキシによって再びリダイレクトできます。 接続を追跡しないと、元の接続が無限プロキシ ループでスタックしているため、最終的な宛先に到達しない可能性があります。
SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS IOCTL は、リダイレクトされたソケット接続でプロキシ接続追跡を提供するために使用されます。 この WFP 機能により、接続の最初のリダイレクトから宛先への最終的な接続へのリダイレクト レコードの追跡が容易になります。
SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL は、WFP ベースのリダイレクト サービスによって使用され、受け入れられた TCP/IP パケット接続 (TCP ソケットまたは UDP ソケット用の接続されたソケットなど) からリダイレクト レコードを取得し、カーネル モード ドライバーのALE_CONNECT_REDIRECTレイヤーに登録されたコンパニオン カーネル モードの吹き出しによってリダイレクトされます。 SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL は、使用されるリダイレクト レコードのリダイレクト コンテキストを取得します。 リダイレクト コンテキストは省略可能であり、接続の現在のリダイレクト状態が呼び出し元のリダイレクト サービスによってリダイレクトされた場合、または接続が呼び出し元のリダイレクト サービスによって以前にリダイレクトされたが、後で別のリダイレクト サービスによって再びリダイレクトされた場合に使用されます。リダイレクト サービスは、取得したリダイレクト レコードを、 SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS IOCTL を使用して元のコンテンツをプロキシするために使用する TCP ソケットに転送します。
SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS IOCTL を呼び出すアプリケーションは、設定されているリダイレクト レコードを含む BLOB を理解する必要はありません。 これは、アプリケーションが新しいソケットに戻す必要があるデータの不透明な BLOB です。
こちらもご覧ください
SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT