Код элемента управления SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS
Описание
Код элемента управления SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS извлекает запись перенаправления для принятого подключения TCP/IP для использования службой перенаправления платформы фильтрации Windows (WFP).
Для выполнения этой операции вызовите функцию 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
Указатель на выходной буфер. Этот параметр должен указывать на тип данных ULONG , если параметры lpOverlapped и lpCompletionRoutine имеют значение NULL.
cbOutBuffer
Размер выходного буфера в байтах. Этот параметр должен быть не ниже размера типа данных ULONG .
lpcbBytesReturned
Указатель на переменную, которая получает размер в байтах данных, хранящихся в выходном буфере.
Если выходной буфер слишком мал, вызов завершается ошибкой, WSAGetLastError возвращает WSAEINVAL, а параметр lpcbBytesReturned указывает на значение DWORD , равное нулю.
Если lpOverlapped имеет значение NULL, значение DWORD , на которое указывает параметр lpcbBytesReturned , возвращаемое при успешном вызове, не может быть равным нулю.
Если параметр lpOverlapped не равен NULL для перекрывающихся сокетов, будут инициированы операции, которые не могут быть завершены немедленно, а завершение будет указано позже. Значение DWORD , на которое указывает возвращаемый параметр lpcbBytesReturned , может быть равным нулю, так как размер хранимых данных не может быть определен до завершения перекрывающейся операции. Окончательное состояние завершения можно получить, когда соответствующий метод завершения получает сигнал о завершении операции.
lpvOverlapped
Указатель на структуру WSAOVERLAPPED .
Если сокеты были созданы без перекрываемого атрибута, параметр lpOverlapped игнорируется.
Если объект был открыт с перекрывающимся атрибутом, а параметр lpOverlapped не равен NULL, операция выполняется как перекрываемая (асинхронная) операция. В этом случае параметр lpOverlapped должен указывать на допустимую структуру WSAOVERLAPPED .
Для перекрывающихся операций функция WSAIoctl или WSPIoctl возвращается немедленно, а соответствующий метод завершения получает сигнал о завершении операции. В противном случае функция не возвращается, пока операция не будет завершена или не возникнет ошибка.
lpCompletionRoutine
Тип: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
Указатель на подпрограмму завершения, вызываемую при завершении операции (игнорируется для неперекрывающихся сокетов).
lpThreadId
Указатель на структуру WSATHREADID , которая будет использоваться поставщиком в последующем вызове WPUQueueApc. Поставщик должен хранить указанную структуру WSATHREADID (не указатель на нее), пока не будет возвращена функция WPUQueueApc .
Примечание Этот параметр применяется только к функции WSPIoctl .
lpErrno
Указатель на код ошибки.
Примечание Этот параметр применяется только к функции WSPIoctl .
Возвращаемое значение
Если операция завершается успешно, функция WSAIoctl или WSPIoctl возвращает ноль.
Если операция завершается сбоем или находится в состоянии ожидания, функция WSAIoctl или WSPIoctl возвращает SOCKET_ERROR. Чтобы получить расширенные сведения об ошибке, вызовите WSAGetLastError.
Код ошибки | Значение |
---|---|
ERROR_INSUFFICIENT_BUFFER | Область данных, переданная в системный вызов, слишком мала. Эта ошибка возвращается, если буфер, на который указывает параметр lpvOutBuffer с размером буфера, переданным в параметре cbOutBuffer , слишком мал. Требуемый размер буфера будет возвращен в параметре lpcbBytesReturned . |
WSA_IO_PENDING | Перекрываемая операция была успешно инициирована, и ее завершение будет указано позже. |
WSA_OPERATION_ABORTED | Перекрываемая операция была отменена из-за закрытия сокета или выполнения команды IOCTL SIO_FLUSH . |
WSAEFAULT | Параметр lpvOutBuffer, lpcbBytesReturned, lpOverlapped или lpCompletionRoutine не полностью содержится в допустимой части адресного пространства пользователя. |
WSAEINPROGRESS | Функция вызывается при выполнении обратного вызова. |
WSAEINTR | Блокирующая операция была прервана. |
WSAEINVAL | Параметр dwIoControlCode не является допустимой командой, или указанный входной параметр недопустим, либо команда не применима к указанному типу сокета. Эта ошибка возвращается, если параметр cbOutBuffer меньше размера типа данных ULONG . |
WSAENETDOWN | Произошел сбой сетевой подсистемы. |
WSAENOPROTOOPT | Параметр сокета не поддерживается в указанном протоколе. |
WSAENOTCONN | Сокет не подключен. |
WSAENOTSOCK | Дескриптор не является сокетом. |
WSAEOPNOTSUPP | Указанная команда IOCTL не поддерживается. Эта ошибка возвращается, если поставщик транспорта не поддерживает SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL. |
Комментарии
IOCTL SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS поддерживается в Windows 8, Windows Server 2012 и более поздних версиях операционной системы.
ВПП разрешает доступ к пути обработки пакетов TCP/IP, где исходящие и входящие пакеты могут быть проверены или изменены, прежде чем разрешить их дальнейшую обработку. Если вы используете путь обработки TCP/IP, независимые поставщики программного обеспечения (ISV) могут легко создавать брандмауэры, антивирусные программы, диагностические программы и другие типы приложений и служб. ВПП предоставляет компоненты в пользовательском режиме и режиме ядра, чтобы сторонние поставщики программного обеспечения могли участвовать в решениях о фильтрации, которые принимаются на нескольких уровнях в стеке протоколов TCP/IP и во всей операционной системе. Функция перенаправления подключений ВПП позволяет драйверу ядра выноски ВПП перенаправлять подключение локально в процесс пользовательского режима, выполнять проверку содержимого в пользовательском режиме и пересылать проверенное содержимое с помощью другого подключения в исходное место назначения.
SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL и несколько других связанных компонентов IOCTLS являются компонентами пользовательского режима, которые позволяют нескольким приложениям прокси-сервера подключения на основе МПП совместно проверять один и тот же поток трафика. Каждый агент проверки может безопасно повторно проверять сетевой трафик, который уже был проверен другим агентом проверки. При наличии нескольких прокси-серверов (например, разработанных разными независимыми поставщиками программного обеспечения) подключение, используемое одним прокси-сервером для связи с конечным назначением, в свою очередь, может быть перенаправлено вторым прокси-сервером, а новое подключение может снова быть перенаправлено исходным прокси-сервером. Без отслеживания подключения исходное подключение может никогда не достичь конечного пункта назначения, так как оно зависает в бесконечном цикле прокси-сервера.
SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL используется для обеспечения отслеживания прокси-подключений для перенаправленных подключений сокетов. Эта функция ВПП упрощает отслеживание записей перенаправления от первоначального перенаправления подключения к окончательному подключению к месту назначения.
SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL используется службой перенаправления на основе МПП для получения записи перенаправления из принятого пакетного подключения TCP/IP (например, подключенного сокета TCP или сокета UDP), перенаправленного на него с помощью соответствующей выноски режима ядра, зарегистрированной на ALE_CONNECT_REDIRECT уровнях в драйвере режима ядра. SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL используется службой перенаправления на основе МПП для получения контекста перенаправления для записи перенаправления из принятого подключения к пакету TCP/IP (например, подключенного сокета TCP или сокета UDP), перенаправленного на него дополнительной выноской, зарегистрированной на ALE_CONNECT_REDIRECT уровнях. Контекст перенаправления — это необязательный контекст, выделенный драйвером, используемый, если текущее состояние перенаправления подключения заключается в том, что подключение было перенаправлено вызывающей службой перенаправления или подключение ранее было перенаправлено вызывающей службой перенаправления, но позже перенаправляется другой службой перенаправления. Для прокси-подключения TCP служба перенаправления передает полученную запись перенаправления в сокет TCP, который используется для прокси-сервера исходного содержимого с помощью SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS IOCTL.
Когда служба перенаправления перенаправляет сокет, отличный от TCP (например, UDP), записи перенаправления, возвращаемые SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL, указывают на это в службу перенаправления с помощью структуры WSAMSG, используемой с функцией LPFN_WSARECVMSG (WSARecvMsg). Элемент Control структуры WSAMSG будет иметь cmsg_type в структуре WSACMSGHDR , равный IP_CONNECTION_REDIRECT_RECORD. Параметр LPFN_WSARECVMSG (WSARecvMsg) должен быть предоставлен службой перенаправления при принятии перенаправлений, отличных от TCP.
Для трафика, отличного от TCP, запись перенаправления перенаправляется с помощью структуры WSAMSG с функцией WSASendMsg .
Обратите внимание, что для трафика, отличного от TCP, IP_CONNECTION_REDIRECT_RECORD будет содержать только пакет, создающий поток. В результате только первый прокси-пакет должен включать эти сведения с помощью функции LPFN_WSARECVMSG (WSARecvMsg).
Так как запись перенаправления МПП является BLOB-объектом данных переменной длины, вызывающий объект может либо предоставить большой выходной буфер (например, буфер размером 1024 байта, на который указывает параметр lpvOutBuffer ), либо передать размер выходного буфера в параметре cbOutBuffer 0 для запроса размера буфера, необходимого для хранения возвращаемого большого двоичного объекта. Если размер выходного буфера не достаточен для хранения данных, функции WSAIoctl или WSPIoctl будут возвращать ERROR_INSUFFICIENT_BUFFER , а требуемый размер буфера будет возвращен в значении, указанном параметром lpcbBytesReturned .
Приложению, вызывающей SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT , не нужно понимать большой двоичный объект, содержащий полученный контекст перенаправления. Это непрозрачный большой двоичный объект данных, который приложение должно получить и передать обратно в новый сокет.