Compartir a través de


Consideraciones de programación del controlador de llamada

Tenga en cuenta los temas siguientes al programar un controlador de llamada de la Plataforma de filtrado de Windows.

Modo de usuario frente al modo kernel

Si el filtrado deseado se puede realizar mediante la funcionalidad de filtrado estándar integrada en la Plataforma de filtrado de Windows, los proveedores de software independientes (ISV) deben escribir aplicaciones de administración en modo de usuario para configurar el motor de filtro en lugar de escribir controladores de llamada en modo kernel. Un controlador de llamada en modo kernel solo debe escribirse cuando deba procesar los datos de red de maneras que no se pueden controlar mediante la funcionalidad de filtrado integrada estándar. Para obtener información sobre cómo escribir una aplicación de administración de la plataforma de filtrado de Windows en modo de usuario, consulte la documentación de la Plataforma de filtrado de Windows en la Microsoft Windows SDK.

Elección de la capa de filtrado

Un controlador de llamada debe filtrar los datos de red en la capa de filtrado más alta posible en la pila de red. Por ejemplo, si la tarea de filtrado deseada se puede controlar en la capa de flujo, no debe implementarse en la capa de red. Para obtener más información sobre las recomendaciones de las capas de filtrado que el controlador debe usar para garantizar la compatibilidad con IPsec en Windows, consulte Developing IPsec-Compatible Callout Drivers(Desarrollo de controladores de llamadas de IPsec-Compatible).

Bloqueo en las capas establecidas de cumplimiento de la capa de aplicación (ALE)

Normalmente, si se ha agregado una llamada al motor de filtros en una de las capas de filtrado establecidas por el flujo de ALE (FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4 o FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6), su función de llamada classifyFn nunca debe devolver FWP_ACTION_BLOCK para la acción. No se debe tomar una decisión de autorizar o rechazar una conexión en una de las capas de filtrado establecidas por el flujo de ALE. Esta decisión siempre debe tomarse en una de las otras capas de filtrado de ALE.

La única razón válida para que una función de llamada de classifyFn devuelva FWP_ACTION_BLOCK para la acción es si se produce un error que podría suponer un riesgo de seguridad potencial si no finaliza la conexión establecida. En este caso, la devolución de FWP_ACTION_BLOCK para la acción cierra la conexión para evitar que se aproveche el riesgo de seguridad potencial.

Tiempo de ejecución de la función de llamada

Dado que el motor de filtro normalmente llama a las funciones de llamada de una llamada en IRQL = DISPATCH_LEVEL, asegúrese de que estas funciones completen su ejecución lo más rápido posible para mantener el sistema en funcionamiento de forma eficaz. La ejecución extendida en IRQL = DISPATCH_LEVEL puede afectar negativamente al rendimiento general del sistema.

Insertar en la ruta de acceso de recepción de datos

Las llamadas deben recalcular las sumas de comprobación de IP antes de llamar a funciones de inyección de paquetes que insertan en la ruta de acceso de datos de recepción porque es posible que la suma de comprobación del paquete original no sea correcta cuando el paquete se vuelva a ensamblar de fragmentos de paquetes IP. No hay ningún mecanismo confiable que indique si se vuelve a ensamblar una lista de búferes netos de fragmentos.

Inserción insertada de paquetes TCP de capas de transporte

Debido al comportamiento de bloqueo de la pila TCP, una llamada en la capa de transporte no puede insertar un paquete TCP nuevo o clonado desde la función de llamada classifyFn . Si se desea la inyección insertada, la llamada debe poner en cola un DPC para realizar la inyección.

Alineación de encabezados IP salientes

El MDL que describe el encabezado IP de una lista de búferes netos (NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(netBufferList)) debe estar alineado con el puntero cuando se usa una de las funciones de inyección de paquetes para insertar datos de paquetes en una ruta de acceso saliente. Dado que el MDL del encabezado IP de un paquete entrante puede estar alineado con el puntero, una llamada debe recompilar el encabezado IP (si aún no está alineado) al insertar un paquete entrante en una ruta de acceso saliente.

Controladores de llamada de la plataforma de filtrado de Windows