Код элемента управления SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT
Описание
Код элемента управления SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT извлекает контекст перенаправления для записи перенаправления, используемой службой перенаправления платформы фильтрации Windows (WFP).
Для выполнения этой операции вызовите функцию WSAIoctl или WSPIoctl со следующими параметрами.
(socket) s, // descriptor identifying a socket
SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT, // 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 WSPIoctl(
(socket) s, // descriptor identifying a socket
SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT, // 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
(LPWSATHREADID) lpThreadId, // a WSATHREADID structure
(LPINT) lpErrno // a pointer to the error code.
);
Параметры
s
Дескриптор, определяющий сокет.
dwIoControlCode
Код элемента управления для операции. Используйте SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT для этой операции.
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.
Код ошибки | Значение |
---|---|
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_CONTEXT IOCTL. |
Комментарии
IOCTL SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT поддерживается в Windows 8, а также Windows Server 2012 и более поздних версиях операционной системы.
ВПП разрешает доступ к пути обработки пакетов TCP/IP, где исходящие и входящие пакеты могут быть проверены или изменены, прежде чем разрешить их дальнейшую обработку. Если вы используете путь обработки TCP/IP, независимые поставщики программного обеспечения (ISV) могут легко создавать брандмауэры, антивирусные программы, диагностические программы и другие типы приложений и служб. ВПП предоставляет компоненты в пользовательском режиме и режиме ядра, чтобы сторонние поставщики программного обеспечения могли участвовать в решениях о фильтрации, которые принимаются на нескольких уровнях в стеке протоколов TCP/IP и во всей операционной системе. Функция перенаправления подключений ВПП позволяет драйверу ядра выноски ВПП перенаправлять подключение локально в процесс пользовательского режима, выполнять проверку содержимого в пользовательском режиме и пересылать проверенное содержимое с помощью другого подключения в исходное место назначения.
SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL и несколько других связанных компонентов IOCTLS являются компонентами пользовательского режима, которые позволяют нескольким прокси-приложениям подключения на основе МПП совместно проверять один и тот же поток трафика. Каждый агент проверки может безопасно повторно проверять сетевой трафик, который уже был проверен другим агентом проверки. При наличии нескольких прокси-серверов (например, разработанных разными независимыми поставщиками программного обеспечения) подключение, используемое одним прокси-сервером для связи с конечным назначением, в свою очередь, может быть перенаправлено вторым прокси-сервером, а новое подключение может снова быть перенаправлено исходным прокси-сервером. Без отслеживания подключения исходное подключение может никогда не достичь конечного пункта назначения, так как оно зависает в бесконечном цикле прокси-сервера.
SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL используется для того, чтобы несколько прокси-приложений подключения на основе МПП могли совместно проверять один и тот же поток трафика. Каждый агент проверки может безопасно повторно проверять сетевой трафик, который уже был проверен другим агентом проверки. При наличии нескольких прокси-серверов (например, разработанных разными независимыми поставщиками программного обеспечения) подключение, используемое одним прокси-сервером для связи с конечным назначением, в свою очередь, может быть перенаправлено вторым прокси-сервером, а новое подключение может снова быть перенаправлено исходным прокси-сервером. Без отслеживания подключения исходное подключение может никогда не достичь конечного пункта назначения, так как оно зависает в бесконечном цикле прокси-сервера. SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT 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, который используется для прокси-сервера исходного содержимого с помощью SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS IOCTL.
Так как контекст перенаправления ВПП представляет собой большой двоичный объект переменной длины, заданный службой перенаправления, вызывающий объект может либо предоставить большой выходной буфер (например, буфер размером 1K, на который указывает параметр lpvOutBuffer ), либо передать в качестве размера выходного буфера в параметре cbOutBuffer значение 0, чтобы запросить размер буфера, необходимый для хранения возвращаемого BLOB-объекта. Если размер выходного буфера недостаточно для хранения данных, функции WSAIoctl или WSPIoctl возвращают ERROR_INSUFFICIENT_BUFFER и требуемый размер буфера будет возвращен в значении, указанном параметром lpcbBytesReturned .
Приложению, вызывающей SIO_QUERY_WF\P_CONNECTION_REDIRECT_RECORDS IOCTL, не нужно понимать большой двоичный объект, содержащий извлеченные записи перенаправления. Это непрозрачный большой двоичный объект данных, который приложение должно получить и передать обратно в новый сокет.
См. также раздел
SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS