SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS コントロール コード
説明
SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS制御コードは、Windows フィルタリング プラットフォーム (WFP) リダイレクト サービスで使用するために受け入れられた TCP/IP 接続のリダイレクト レコードを取得します。
この操作を実行するには、次のパラメーターを指定して WSAIoctl または WSPIoctl 関数を呼び出します。
int WSAIoctl(
(socket) s, // descriptor identifying a socket
SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS, // dwIoControlCode
NULL, // lpvInBuffer
0, // cbInBuffer
(LPVOID) lpvOutBuffer, // output buffer
(DWORD) cbOutBuffer, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
);
int WSAIoctl(
(socket) s, // descriptor identifying a socket
SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS, // dwIoControlCode
NULL, // lpvInBuffer
0, // cbInBuffer
(LPVOID) lpvOutBuffer, // output buffer
(DWORD) cbOutBuffer, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
);
パラメーター
s
ソケットを識別する記述子。
dwIoControlCode
操作の制御コード。 この操作 にはSIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS を使用します。
lpvInBuffer
入力バッファーへのポインター。 このパラメーターは、この操作では使用されません。
cbInBuffer
入力バッファーのサイズ (バイト単位)。 このパラメーターは、この操作では使用されません。
lpvOutBuffer
出力バッファーへのポインター。 lpOverlapped パラメーターと lpCompletionRoutine パラメーターが NULL の場合、このパラメーターは ULONG データ型を指す必要があります。
cbOutBuffer
出力バッファーのサイズ (バイト単位)。 このパラメーターは、 少なくとも ULONG データ型のサイズである必要があります。
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 を呼び出します。
エラー コード | 意味 |
---|---|
ERROR_INSUFFICIENT_BUFFER | システム呼び出しに渡されるデータ域が小さすぎます。 このエラーは、cbOutBuffer パラメーターで渡されたバッファー サイズが lpvOutBuffer パラメーターによって指されるバッファーが小さすぎる場合に返されます。 必要なバッファー サイズは、 lpcbBytesReturned パラメーターで返されます。 |
WSA_IO_PENDING | 重複した操作が正常に開始され、後で完了が示されます。 |
WSA_OPERATION_ABORTED | ソケットのクローズまたは SIO_FLUSH IOCTL コマンドの実行により、重複した操作が取り消されました。 |
WSAEFAULT | lpvOutBuffer、lpcbBytesReturned、lpOverlapped、または lpCompletionRoutine パラメーターは、ユーザー アドレス空間の有効な部分に完全には含まれていません。 |
WSAEINPROGRESS | 関数は、コールバックが進行中のときに呼び出されます。 |
WSAEINTR | ブロック操作が中断されました。 |
WSAEINVAL | dwIoControlCode パラメーターが有効なコマンドではないか、指定した入力パラメーターが受け入れられないか、指定されたソケットの型にコマンドが適用されません。 cbOutBuffer パラメーターが ULONG データ型のサイズより小さい場合、このエラーが返されます。 |
WSAENETDOWN | ネットワーク サブシステムが失敗しました。 |
WSAENOPROTOOPT | ソケット オプションは、指定されたプロトコルではサポートされていません。 |
WSAENOTCONN | ソケット s が接続されていません。 |
WSAENOTSOCK | 記述子 s はソケットではありません。 |
WSAEOPNOTSUPP | 指定された IOCTL コマンドはサポートされていません。 このエラーは、 SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL がトランスポート プロバイダーでサポートされていない場合に返されます。 |
注釈
SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL は、オペレーティング システムの Windows 8 および Windows Server 2012 以降のバージョンでサポートされています。
WFP は TCP/IP パケット処理パスへのアクセスを許可します。送信パケットと受信パケットは、さらに処理される前に検査または変更できます。 TCP/IP 処理パスを利用することで、独立系ソフトウェア ベンダー (ISV) は、ファイアウォール、ウイルス対策ソフトウェア、診断ソフトウェア、その他の種類のアプリケーションやサービスをより簡単に作成できます。 WFP は、TCP/IP プロトコル スタック内およびオペレーティング システム全体の複数のレイヤーで行われるフィルター処理の決定にサードパーティの ISV が参加できるように、ユーザー モードとカーネル モードのコンポーネントを提供します。 WFP 接続リダイレクト機能を使用すると、WFP コールアウト カーネル ドライバーは、接続をローカルでユーザー モード プロセスにリダイレクトし、ユーザー モードでコンテンツ検査を実行し、別の接続を使用して検査されたコンテンツを元の宛先に転送できます。
SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL とその他の関連する IOCTLS は、複数の WFP ベースの接続プロキシ アプリケーションが同じトラフィック フローを協調的に検査できるようにするために使用されるユーザー モード コンポーネントです。 各検査エージェントは、別の検査エージェントによって既に検査されているネットワーク トラフィックを安全に再検査できます。 複数のプロキシ (たとえば、異なる ISV によって開発) が存在する場合、1 つのプロキシが最終的な宛先と通信するために使用する接続は、2 つ目のプロキシによってリダイレクトされ、新しい接続が元のプロキシによって再びリダイレクトされる可能性があります。 接続を追跡しないと、元の接続が無限のプロキシ ループでスタックしているため、最終的な宛先に到達しない可能性があります。
SIO_QUERY_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 は、WFP ベースのリダイレクト サービスによって使用され、受け入れられた TCP/IP パケット接続 (TCP ソケットまたは UDP ソケットの接続されたソケットなど) からリダイレクト レコードのリダイレクト コンテキストを取得し、ALE_CONNECT_REDIRECT レイヤーに登録されたコンパニオン コールアウトによってリダイレクトされます。 リダイレクト コンテキストは、接続の現在のリダイレクト状態が呼び出し元のリダイレクト サービスによってリダイレクトされたか、接続が呼び出し元のリダイレクト サービスによって以前にリダイレクトされたが、後で別のリダイレクト サービスによって再びリダイレクトされた場合に使用される、オプションのドライバー割り当てコンテキストです。 TCP プロキシ接続の場合、リダイレクト サービスは、取得したリダイレクト レコードを、 SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS IOCTL を使用して元のコンテンツをプロキシするために使用する TCP ソケットに転送します。
リダイレクト サービスが TCP 以外のソケット (UDP など) をリダイレクトする場合、SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL によって返されるリダイレクト レコードは、LPFN_WSARECVMSG (WSARecvMsg) 関数で使用される WSAMSG 構造体を使用してリダイレクト サービスにこれを示します。 WSAMSG 構造体の Control メンバーは、WSACMSGHDR 構造体のcmsg_typeを IP_CONNECTION_REDIRECT_RECORD に設定します。 TCP 以外のリダイレクトを受け入れる場合は、リダイレクト サービスによって LPFN_WSARECVMSG (WSARecvMsg) パラメーターを指定する必要があります。
TCP 以外のトラフィックの場合、リダイレクト レコードは WSASendMsg 関数と共に WSAMSG 構造体を使用して転送されます。
TCP 以外のトラフィックの場合、フロー作成パケットのみがIP_CONNECTION_REDIRECT_RECORDを伝送することに注意 してください。 その結果、 LPFN_WSARECVMSG (WSARecvMsg) 関数を使用してこの情報を含める必要があるのは、最初のプロキシパケットだけです。
WFP リダイレクト レコードは可変長データ BLOB であるため、呼び出し元は大きな出力バッファー ( たとえば、lpvOutBuffer パラメーターによって指される 1,024 バイト バッファー) を指定するか、 cbOutBuffer パラメーター 0 の出力バッファー サイズを渡して、返される BLOB を保持するために必要なバッファー サイズを照会できます。 出力バッファー サイズがデータを保持するのに十分でない場合、 WSAIoctl 関数または WSPIoctl 関数は ERROR_INSUFFICIENT_BUFFER を返し、必要なバッファー サイズは lpcbBytesReturned パラメーターによって指される値で返されます。
SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXTを呼び出すアプリケーションは、取得されたリダイレクト コンテキストを含む BLOB を理解する必要はありません。 これは、アプリケーションが取得して新しいソケットに戻すために必要なデータの不透明な BLOB です。