Compartir a través de


código de control de SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT

Descripción

El código de control SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT recupera el contexto de redireccionamiento de un registro de redireccionamiento usado por un servicio de redirección de la Plataforma de filtrado de Windows (PMA).

Para realizar esta operación, llame a la función WSAIoctl o WSPIoctl con los parámetros siguientes.

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

Parámetros

s

Descriptor que identifica un socket.

dwIoControlCode

Código de control de la operación. Use SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT para esta operación.

lpvInBuffer

Puntero al búfer de entrada. Este parámetro no se usa para esta operación.

cbInBuffer

Tamaño, en bytes, del búfer de entrada. Este parámetro no se usa para esta operación.

lpvOutBuffer

Puntero al búfer de salida. Este parámetro debe apuntar a un tipo de datos ULONG si los parámetros lpOverlapped y lpCompletionRoutine son NULL.

cbOutBuffer

Tamaño, en bytes, del búfer de salida. Este parámetro debe ser al menos el tamaño de un tipo de datos ULONG .

lpcbBytesReturned

Puntero a una variable que recibe el tamaño, en bytes, de los datos almacenados en el búfer de salida.

Si el búfer de salida es demasiado pequeño, se produce un error en la llamada, WSAGetLastError devuelve WSAEINVAL y el parámetro lpcbBytesReturned apunta a un valor DWORD de cero.

Si lpOverlapped es NULL, el valor DWORD al que apunta el parámetro lpcbBytesReturned devuelto en una llamada correcta no puede ser cero.

Si el parámetro lpOverlapped no es NULL para sockets superpuestos, las operaciones que no se pueden completar inmediatamente se iniciarán y la finalización se indicará en un momento posterior. El valor DWORD al que apunta el parámetro lpcbBytesReturned que se devuelve puede ser cero, ya que el tamaño de los datos almacenados no se puede determinar hasta que se haya completado la operación superpuesta. El estado de finalización final se puede recuperar cuando se señala el método de finalización adecuado cuando se ha completado la operación.

lpvOverlapped

Puntero a una estructura WSAOVERLAPPED .

Si el socket s se creó sin el atributo superpuesto, se omite el parámetro lpOverlapped .

Si se abrió s con el atributo superpuesto y el parámetro lpOverlapped no es NULL, la operación se realiza como una operación superpuesta (asincrónica). En este caso, el parámetro lpOverlapped debe apuntar a una estructura WSAOVERLAPPED válida.

Para las operaciones superpuestas, la función WSAIoctl o WSPIoctl devuelve inmediatamente y el método de finalización adecuado se señala cuando se ha completado la operación. De lo contrario, la función no devuelve hasta que se haya completado la operación o se produzca un error.

lpCompletionRoutine

Tipo: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Puntero a la rutina de finalización a la que se llama cuando se ha completado la operación (se omite para sockets no superpuestos).

lpThreadId

Puntero a una estructura WSATHREADID que usará el proveedor en una llamada posterior a WPUQueueApc. El proveedor debe almacenar la estructura WSATHREADID a la que se hace referencia (no el puntero a la misma) hasta después de que la función WPUQueueApc devuelva.

Nota Este parámetro solo se aplica a la función WSPIoctl .

lpErrno

Puntero al código de error.

Nota Este parámetro solo se aplica a la función WSPIoctl .

Valor devuelto

Si la operación se completa correctamente, la función WSAIoctl o WSPIoctl devuelve cero.

Si se produce un error en la operación o está pendiente, la función WSAIoctl o WSPIoctl devuelve SOCKET_ERROR. Para obtener información de error extendida, llame a WSAGetLastError.

Código de error Significado
WSA_IO_PENDING Una operación superpuesta se inició correctamente y la finalización se indicará en un momento posterior.
WSA_OPERATION_ABORTED Se canceló una operación superpuesta debido al cierre del socket o a la ejecución del comando SIO_FLUSH IOCTL.
WSAEFAULT El parámetro lpvOutBuffer, lpcbBytesReturned, lpOverlapped o lpCompletionRoutine no está totalmente incluido en una parte válida del espacio de direcciones del usuario.
WSAEINPROGRESS La función se invoca cuando una devolución de llamada está en curso.
WSAEINTR Se interrumpió una operación de bloqueo.
WSAEINVAL El parámetro dwIoControlCode no es un comando válido o un parámetro de entrada especificado no es aceptable o el comando no es aplicable al tipo de socket especificado. Este error se devuelve si el parámetro cbOutBuffer es menor que el tamaño de un tipo de datos ULONG .
WSAENETDOWN Error en el subsistema de red.
WSAENOPROTOOPT La opción socket no se admite en el protocolo especificado.
WSAENOTCONN El socket s no está conectado.
WSAENOTSOCK El descriptor s no es un socket.
WSAEOPNOTSUPP No se admite el comando IOCTL especificado. Este error se devuelve si el proveedor de transporte no admite el SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL.

Observaciones

El SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL se admite en Windows 8 y Windows Server 2012 y versiones posteriores del sistema operativo.

EL PMA permite el acceso a la ruta de procesamiento de paquetes TCP/IP, donde los paquetes salientes y entrantes se pueden examinar o cambiar antes de permitirles procesarlos más. Al pulsar en la ruta de procesamiento tcp/IP, los proveedores de software independientes (ISV) pueden crear más fácilmente firewalls, software antivirus, software de diagnóstico y otros tipos de aplicaciones y servicios. EL PMA proporciona componentes en modo de usuario y modo kernel para que los ISV de terceros puedan participar en las decisiones de filtrado que tienen lugar en varias capas de la pila de protocolos TCP/IP y en todo el sistema operativo. La característica de redirección de conexión DE PMA permite que un controlador de kernel de llamada DE PMA redirija una conexión localmente a un proceso en modo de usuario, realice la inspección de contenido en modo de usuario y reenvíe el contenido inspeccionado mediante una conexión diferente al destino original.

El SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL y otros IOCTLS relacionados son componentes en modo de usuario que se usan para permitir que varias aplicaciones proxy de conexión basadas en EL PMA inspeccionen el mismo flujo de tráfico de forma cooperativa. Cada agente de inspección puede volver a inspeccionar de forma segura el tráfico de red que ya ha sido inspeccionado por otro agente de inspección. Con la presencia de varios servidores proxy (desarrollados por diferentes ISV, por ejemplo), la conexión usada por un proxy para comunicarse con el destino final podría redirigirse a su vez por un segundo proxy y esa nueva conexión podría ser redirigida de nuevo por el proxy original. Sin el seguimiento de conexiones, es posible que la conexión original nunca llegue a su destino final, ya que se bloquea en un bucle proxy infinito.

El SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL se usa para permitir que varias aplicaciones proxy de conexión basadas en EL PMA inspeccionen el mismo flujo de tráfico de forma cooperativa. Cada agente de inspección puede volver a inspeccionar de forma segura el tráfico de red que ya ha sido inspeccionado por otro agente de inspección. Con la presencia de varios servidores proxy (desarrollados por diferentes ISV, por ejemplo), la conexión usada por un proxy para comunicarse con el destino final podría redirigirse a su vez por un segundo proxy y esa nueva conexión podría ser redirigida de nuevo por el proxy original. Sin el seguimiento de conexiones, es posible que la conexión original nunca llegue a su destino final, ya que se bloquea en un bucle proxy infinito. El SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL se usa para proporcionar un seguimiento de la conexión proxy en las conexiones de socket redirigidas. Esta característica del PMA facilita el seguimiento de los registros de redireccionamiento desde el redireccionamiento inicial de una conexión a la conexión final al destino.

El SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL lo usa un servicio de redireccionamiento basado en PMA para recuperar el registro de redireccionamiento de la conexión de paquetes TCP/IP aceptada (el socket conectado para un socket TCP o un socket UDP, por ejemplo) redirigido a él por su llamada en modo kernel complementario registrada en ALE_CONNECT_REDIRECT capas en un controlador en modo kernel. El SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL es utilizado por un servicio de redireccionamiento basado en EL PMA para recuperar el contexto de redireccionamiento de un registro de redireccionamiento de la conexión de paquete TCP/IP aceptada (el socket conectado para un socket TCP o un socket UDP, por ejemplo) redirigido a él por su llamada complementaria registrada en capas de ALE_CONNECT_REDIRECT . El contexto de redireccionamiento es opcional y se usa si el estado de redirección actual de una conexión es que el servicio de redirección de llamada redireccionó la conexión o que el servicio de redireccionamiento de llamada redirigió anteriormente, pero más tarde lo redirigió de nuevo un servicio de redireccionamiento diferente. El servicio de redireccionamiento transfiere el registro de redireccionamiento recuperado al socket TCP que usa para proxy del contenido original mediante el SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS IOCTL.

Dado que el contexto de redirección del PMA es un blob de datos de longitud variable establecido por el servicio de redirección, el autor de la llamada puede proporcionar un búfer de salida grande (un búfer de 1K al que apunta el parámetro lpvOutBuffer , por ejemplo) o puede pasar como un tamaño de búfer de salida en el parámetro cbOutBuffer de 0 para consultar el tamaño del búfer necesario para contener el blob devuelto. Si el tamaño del búfer de salida no es suficiente con los datos, las funciones WSAIoctl o WSPIoctl devolverán ERROR_INSUFFICIENT_BUFFER y el tamaño de búfer necesario se devolverá en el valor al que apunta el parámetro lpcbBytesReturned .

La aplicación que llama al SIO_QUERY_WF\P_CONNECTION_REDIRECT_RECORDS IOCTL no necesita comprender el blob que contiene los registros de redireccionamiento recuperados. Se trata de un blob opaco de datos que la aplicación necesita para recuperar y volver al nuevo socket.

Consulte también

Opciones de socket de IPPROTO_IP

SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS

SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS

socket

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW