Share via


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
);

매개 변수

소켓을 식별하는 설명자입니다.

dwIoControlCode

작업을 위한 제어 코드입니다. 이 작업에 는 SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS 사용합니다.

lpvInBuffer

입력 버퍼에 대한 포인터입니다. 이 매개 변수는 이 작업에 사용되지 않습니다.

cbInBuffer

입력 버퍼의 크기(바이트)입니다. 이 매개 변수는 이 작업에 사용되지 않습니다.

lpvOutBuffer

출력 버퍼에 대한 포인터입니다. lpOverlappedlpCompletionRoutine 매개 변수가 NULL인 경우 이 매개 변수는 ULONG 데이터 형식을 가리킵니다.

cbOutBuffer

출력 버퍼의 크기(바이트)입니다. 이 매개 변수는 ULONG 데이터 형식의 크기 이상이어야 합니다.

lpcbBytesReturned

출력 버퍼에 저장된 데이터의 크기(바이트)를 수신하는 변수에 대한 포인터입니다.

출력 버퍼가 너무 작으면 호출이 실패하고 WSAGetLastErrorWSAEINVAL을 반환하고 lpcbBytesReturned 매개 변수가 DWORD 값 0을 가리킵니다.

lpOverlappedNULL인 경우 성공적인 호출에서 반환되는 lpcbBytesReturned 매개 변수가 가리키는 DWORD 값은 0일 수 없습니다.

lpOverlapped 매개 변수가 겹치는 소켓에 대해 NULL이 아닌 경우 즉시 완료할 수 없는 작업이 시작되고 나중에 완료가 표시됩니다. 겹치는 작업이 완료될 때까지 저장된 데이터의 크기를 확인할 수 없으므로 반환되는 lpcbBytesReturned 매개 변수가 가리키는 DWORD 값은 0일 수 있습니다. 작업이 완료되면 적절한 완료 메서드가 신호를 받으면 최종 완료 상태 검색할 수 있습니다.

lpvOverlapped

WSAOVERLAPPED 구조체에 대한 포인터입니다.

소켓 겹치는 특성 없이 만들어진 경우 lpOverlapped 매개 변수는 무시됩니다.

겹치는 특성으로 열렸고 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 소켓 연결되어 있지 않습니다.
WSAENOTSOCK 설명자 소켓이 아닙니다.
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는 타사 ISV가 TCP/IP 프로토콜 스택 및 운영 체제 전체의 여러 계층에서 발생하는 필터링 결정에 참여할 수 있도록 사용자 모드 및 커널 모드 구성 요소를 제공합니다. WFP 연결 리디렉션 기능을 사용하면 WFP 설명선 커널 드라이버가 로컬로 연결을 사용자 모드 프로세스로 리디렉션하고, 사용자 모드에서 콘텐츠 검사를 수행하고, 다른 연결을 사용하여 검사된 콘텐츠를 원래 대상으로 전달할 수 있습니다.

SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL 및 기타 여러 관련 IOCTLS는 여러 WFP 기반 연결 프록시 애플리케이션이 협력 방식으로 동일한 트래픽 흐름을 검사할 수 있도록 하는 데 사용되는 사용자 모드 구성 요소입니다. 각 검사 에이전트는 다른 검사 에이전트에서 이미 검사한 네트워크 트래픽을 안전하게 다시 검사할 수 있습니다. 여러 프록시가 있는 경우(예: 다른 ISV에서 개발) 한 프록시가 최종 대상과 통신하는 데 사용하는 연결은 다시 두 번째 프록시에 의해 리디렉션될 수 있으며 원래 프록시에서 새 연결을 다시 리디렉션할 수 있습니다. 연결 추적이 없으면 원래 연결이 무한 프록시 루프에서 중단되므로 최종 대상에 도달하지 못할 수 있습니다.

SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL은 리디렉션된 소켓 연결에서 프록시 연결 추적을 제공하는 데 사용됩니다. 이 WFP 기능을 사용하면 대상에 대한 최종 연결에 대한 연결의 초기 리디렉션에서 리디렉션 레코드를 쉽게 추적할 수 있습니다.

SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL은 WFP 기반 리디렉션 서비스에서 커널 모드 드라이버의 ALE_CONNECT_REDIRECT 계층에 등록된 도우미 커널 모드 설명선에 의해 리디렉션된 허용된 TCP/IP 패킷 연결(예: TCP 소켓 또는 UDP 소켓에 대한 연결된 소켓)에서 리디렉션 레코드를 검색하는 데 사용됩니다. SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL은 WFP 기반 리디렉션 서비스에서 ALE_CONNECT_REDIRECT 계층에 등록된 도우미 설명선에 의해 리디렉션된 허용된 TCP/IP 패킷 연결(예: TCP 소켓 또는 UDP 소켓에 대한 연결된 소켓)에서 리디렉션 레코드에 대한 리디렉션 컨텍스트를 검색하는 데 사용됩니다. 리디렉션 컨텍스트는 연결의 현재 리디렉션 상태가 연결이 호출 리디렉션 서비스에 의해 리디렉션되었거나 연결이 이전에 호출 리디렉션 서비스에 의해 리디렉션되었지만 나중에 다른 리디렉션 서비스에 의해 다시 리디렉션된 경우에 사용되는 선택적 드라이버 할당 컨텍스트입니다. 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가 아닌 리디렉션을 수락할 때 리디렉션 서비스에서 WSARecvMsg(LPFN_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입니다.

추가 정보

IPPROTO_IP 소켓 옵션

SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT

소켓

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAMSG

WSAOVERLAPPED

LPFN_WSARECVMSG (WSARecvMsg)

WSASendMsg

WSASocketA

WSASocketW