Función FwpsStreamInjectAsync0 (fwpsk.h)
La función FwpsStreamInjectAsync0 inserta segmentos de datos TCP en un flujo de datos TCP.
Sintaxis
NTSTATUS FwpsStreamInjectAsync0(
[in] HANDLE injectionHandle,
[in, optional] HANDLE injectionContext,
[in] UINT32 flags,
[in] UINT64 flowId,
[in] UINT32 calloutId,
[in] UINT16 layerId,
[in] UINT32 streamFlags,
[in, out] NET_BUFFER_LIST *netBufferList,
[in] SIZE_T dataLength,
[in] FWPS_INJECT_COMPLETE0 completionFn,
[in, optional] HANDLE completionContext
);
Parámetros
[in] injectionHandle
Identificador de inyección creado anteriormente por una llamada a . Función FwpsInjectionHandleCreate0 .
[in, optional] injectionContext
Identificador opcional para el contexto de inyección.
[in] flags
Reservado. Los controladores de llamada deben establecer este parámetro en cero.
[in] flowId
Identificador en tiempo de ejecución que especifica el flujo de datos en el que se insertan los datos. El identificador en tiempo de ejecución de un flujo de datos se proporciona a un controlador de llamada a través del valor de metadatos de FWPS_METADATA_FIELD_FLOW_HANDLE que el motor de filtro proporcionó a la función de llamada classifyFn del controlador de llamada.
[in] calloutId
Identificador en tiempo de ejecución de la llamada en el motor de filtro. Este identificador se devolvió cuando el controlador de llamada llamó a las funciones FwpsCalloutRegister0 o FwpsCalloutRegister1 para registrar la llamada con el motor de filtro.
[in] layerId
Identificador en tiempo de ejecución de la capa de filtrado en la que se está procesando el flujo de datos. Este valor debe ser FWPS_LAYER_STREAM_V4 o FWPS_LAYER_STREAM_V6. El identificador en tiempo de ejecución de la capa en la que se está procesando el flujo de datos se proporciona a una llamada en el miembro layerId de la estructura FWPS_INCOMING_VALUES0 que el motor de filtros pasó a la función de llamada classifyFn del controlador de llamada.
[in] streamFlags
Marcas que especifican las características del flujo de datos en las que se van a insertar los datos.
Al insertar datos en un flujo de datos entrante, un controlador de llamada especifica una o varias de las marcas siguientes:
FWPS_STREAM_FLAG_RECEIVE
Especifica que los datos se van a insertar en el flujo de datos entrante. Esta marca es necesaria al insertar datos en un flujo de datos entrante.
FWPS_STREAM_FLAG_RECEIVE_DISCONNECT
Especifica que la marca FIN se va a establecer en el encabezado TCP de los datos que se insertan en el flujo de datos entrante.
FWPS_STREAM_FLAG_RECEIVE_EXPEDITED
Especifica que los datos que se insertan en el flujo de datos entrantes son datos de prioridad alta y fuera de banda.
FWPS_STREAM_FLAG_RECEIVE_PUSH
Especifica que los datos entrantes han llegado con la marca PUSH establecida en el encabezado TCP, lo que indica que el remitente solicita una transferencia de datos inmediata. Los retrasos no deseados en la transferencia de datos pueden producirse si no se establece esta marca. Esta marca está disponible a partir de Windows Vista con SP1.
Al insertar datos en un flujo de datos saliente, un controlador de llamada especifica una o varias de las marcas siguientes:
FWPS_STREAM_FLAG_SEND
Especifica que los datos se van a insertar en el flujo de datos de salida. Esta marca es necesaria al insertar datos en un flujo de datos saliente.
FWPS_STREAM_FLAG_SEND_EXPEDITED
Especifica que los datos que se insertan en el flujo de datos de salida son datos de prioridad alta y fuera de banda.
FWPS_STREAM_FLAG_SEND_NODELAY
Especifica que el controlador de llamada solicita que no haya ningún almacenamiento en búfer de los datos que se insertan en el flujo de datos de salida.
FWPS_STREAM_FLAG_SEND_DISCONNECT
Especifica que la secuencia se va a desconectar después de enviar los datos que se insertan en el flujo de datos de salida. La pila de red establecerá la marca FIN en el encabezado TCP del último paquete que se envía.
[in, out] netBufferList
Puntero a una estructura NET_BUFFER_LIST que describe los datos que se insertan en el flujo de datos. Un controlador de llamada asigna una estructura de NET_BUFFER_LIST que se va a usar para insertar datos en un flujo de datos mediante una llamada a . FwpsAllocateCloneNetBufferList0, FwpsAllocateNetBufferAndNetBufferList0 o FwpsCloneStreamData0 funciones. La estructura NET_BUFFER_LIST puede describir una cadena de listas de búferes de red. Si el parámetro streamFlags es FWPS_STREAM_FLAG_RECEIVE_DISCONNECT o FWPS_STREAM_FLAG_SEND_DISCONNECT, netBufferList puede ser NULL.
[in] dataLength
Número de bytes de datos que se insertan en el flujo de datos.
[in] completionFn
Puntero a una función de llamada completionFn proporcionada por el controlador de llamada. El motor de filtros llama a esta función después de los datos del paquete, descritos por el parámetro netBufferList , se ha insertado en la pila de red.
Si el parámetro netBufferList describe una cadena de NET_BUFFER_LIST , se llamará a completionFn una vez por cada NET_BUFFER_LIST de la cadena.
Si el parámetro netBufferList es NULL y el parámetro streamFlags tiene FWPS_STREAM_FLAG_RECEIVE_DISCONNECT o FWPS_STREAM_FLAG_SEND_DISCONNECT establecido, no se llamará a la función completionFn .
Este parámetro es obligatorio y no puede ser NULL. Si es NULL, se devolverá STATUS_FWP_NULL_POINTER .
[in, optional] completionContext
Puntero a un contexto proporcionado por el controlador de llamada que se pasa a la función de llamada a la que apunta el parámetro completionFn . Este parámetro es opcional y puede ser NULL.
Valor devuelto
La función FwpsStreamInjectAsync0 es un código NTSTATUS, como uno de los siguientes.
Código devuelto | Descripción |
---|---|
|
La inserción en el flujo de datos se inició correctamente. El motor de filtros llamará a la función de finalización que se especificó cuando se asignó la estructura de NET_BUFFER_LIST después de que el motor de filtros haya terminado de insertar los datos en el flujo de datos. |
|
La pila de red TCP/IP no está lista para aceptar la inyección de datos de flujo. |
|
El controlador de inyección se está cerrando. |
|
Se produjo un error. |
Comentarios
Un controlador de llamada llama a la función FwpsStreamInjectAsync0 desde dentro de la función de llamada classifyFn de una llamada para insertar datos nuevos o clonados en el flujo de datos que se está procesando actualmente. Un controlador de llamada puede llamar a la función FwpsStreamInjectAsync0 solo si está procesando un flujo de datos en la capa de flujo.
Un controlador de llamada también puede llamar a la función FwpsStreamInjectAsync0 desde fuera de la función de llamada classifyFn de una llamada de llamada para insertar datos en un flujo de datos que se aplaza actualmente. Un flujo de datos se aplaza cuando la función de llamada classifyFn de una llamada establece el miembro streamAction del FWPS_STREAM_CALLOUT_IO_PACKET0 estructura que se va a FWPS_STREAM_ACTION_DEFER.
Además, un controlador de llamada puede llamar a la función FwpsStreamInjectAsync0 desde fuera de la función de llamada classifyFn de una llamada para insertar datos en un flujo de datos después de que se haya escrito una indicación FIN.
Como alternativa, un controlador de llamada puede llamar a la función FwpsStreamInjectAsync0 desde un contexto de subproceso arbitrario fuera de la función de llamada classifyFn de una llamada si el controlador de llamada clona y bloquea todos los datos indicados para el procesamiento fuera de banda. Un controlador de llamada que redirige todos los datos indicados al modo de usuario para su procesamiento puede llamar a la función FwpsStreamInjectAsync0 de esta manera.
Una llamada puede crear un segmento de datos clonando primero con una llamada a la función FwpsCloneStreamData0 , seguida de bloquear el segmento de datos estableciendo FWP_ACTION_BLOCK en el miembro actionType de la estructura FWPS_CLASSIFY_OUT0 .
Los datos de flujo insertados no se volverán a indicar a la llamada, pero estarán disponibles para transmitir llamadas de subcapas de menor peso.
Si el valor devuelto no es STATUS_SUCCESS, no se llamará a la función de finalización. En este caso, la lista de búferes de red a la que apunta netBufferList debe liberarse mediante una llamada a FwpsFreeNetBufferList0 o FwpsFreeCloneNetBufferList0.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Disponible a partir de Windows Vista. |
Plataforma de destino | Universal |
Encabezado | fwpsk.h (incluya Fwpsk.h) |
Library | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |