Compartir a través de


Envío de datos desde un controlador de filtro

Los controladores de filtro pueden iniciar solicitudes de envío o filtrar solicitudes de envío que inician los controladores de forma excesiva. Cuando un controlador de protocolo llama a la función NdisSendNetBufferLists , NDIS envía la estructura de NET_BUFFER_LIST especificada al módulo de filtro superior de la pila de controladores.

Envío de solicitudes iniciadas por un controlador de filtro

En la ilustración siguiente se muestra una operación de envío iniciada por un controlador de filtro.

Diagrama que muestra una operación de envío iniciada por un controlador de filtro con la función NdisFSendNetBufferLists.

Los controladores de filtro llaman a la función NdisFSendNetBufferLists para enviar los datos de red definidos en una lista de estructuras de NET_BUFFER_LIST .

Un controlador de filtro debe establecer el miembro SourceHandle de cada estructura de NET_BUFFER_LIST que crea en el mismo valor que pasa al parámetro NdisFilterHandle de NdisFSendNetBufferLists. Los controladores NDIS no deben modificar el miembro SourceHandle para NET_BUFFER_LIST estructuras que el controlador no se originó.

Antes de llamar a NdisFSendNetBufferLists, un controlador de filtro puede establecer información que acompaña a la solicitud de envío con la macro NET_BUFFER_LIST_INFO . Los controladores subyacentes pueden recuperar esta información con la macro NET_BUFFER_LIST_INFO.

En cuanto un controlador de filtro llama a NdisFSendNetBufferLists, renuncia a la propiedad de las estructuras de NET_BUFFER_LIST y a todos los recursos asociados. NDIS puede controlar la solicitud de envío o pasar la solicitud a los controladores subyacentes.

NDIS llama a la función FilterSendNetBufferListsComplete para devolver las estructuras y los datos al controlador de filtro. NDIS puede recopilar las estructuras y los datos de varias solicitudes de envío en una sola lista vinculada de estructuras de NET_BUFFER_LIST antes de pasar la lista a FilterSendNetBufferListsComplete

Hasta que NDIS llama a FilterSendNetBufferListsComplete, se desconoce el estado actual de una solicitud de envío. Un controlador de filtro nunca debe intentar examinar las estructuras de NET_BUFFER_LIST o los datos asociados antes de que NDIS devuelva las estructuras a FilterSendNetBufferListsComplete.

FilterSendNetBufferListsComplete realiza cualquier postprocesamiento necesario para completar una operación de envío.

Cuando NDIS llama a FilterSendNetBufferListsComplete, el controlador de filtro recupera la propiedad de todos los recursos asociados a las estructuras de NET_BUFFER_LIST especificadas por el parámetro NetBufferLists . FilterSendNetBufferListsComplete puede liberar estos recursos (por ejemplo, llamando a las funciones NdisFreeNetBuffer y NdisFreeNetBufferList ) o prepararlos para reutilizarlos en una llamada posterior a NdisFSendNetBufferLists.

NDIS siempre envía los datos de red proporcionados por el filtro a los controladores subyacentes en el orden determinado por el controlador de filtro tal como se pasa a NdisFSendNetBufferLists. Sin embargo, después de enviar los datos en el orden especificado, los controladores subyacentes pueden devolver los búferes en cualquier orden.

Un controlador de filtro puede solicitar bucle invertido para las solicitudes de envío que origina. Para solicitar bucle invertido, el controlador establece la marca NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK en el parámetro SendFlags de NdisFSendNetBufferLists. NDIS indica un paquete recibido que contiene los datos de envío.

Nota Un controlador de filtro debe realizar un seguimiento de las solicitudes de envío que origina y asegurarse de que no llama a la función NdisFSendNetBufferListsComplete cuando se completen dichas solicitudes.

Filtrado de solicitudes de envío

En la ilustración siguiente se muestra el filtrado de una solicitud de envío iniciada por un controlador sobreamplido.

Diagrama que muestra el proceso de filtrado de una solicitud de envío iniciada por un controlador sobrepuesto mediante la función FilterSendNetBufferLists.

NDIS llama a la función FilterSendNetBufferLists de un controlador de filtro para filtrar la solicitud de envío de un controlador de exceso.

El controlador de filtro no debe modificar el miembro SourceHandle en las estructuras de NET_BUFFER_LIST que recibe de otros controladores.

El controlador de filtro puede filtrar los datos y enviar los datos filtrados a los controladores subyacentes. Para cada estructura de NET_BUFFER enviada a FilterSendNetBufferLists, un controlador de filtro puede hacer lo siguiente:

  • Pase el búfer al siguiente controlador subyacente llamando a la función NdisFSendNetBufferLists . NDIS garantiza la disponibilidad del espacio de contexto (consulte NET_BUFFER_LIST_CONTEXT estructura) para los controladores de filtro. El controlador de filtro puede modificar el contenido del búfer antes de llamar a NdisFSendNetBufferLists. El procesamiento de los datos filtrados continúa como con una operación de envío iniciada por un controlador de filtro.

  • Quite el búfer llamando a la función NdisFSendNetBufferListsComplete .

  • Poner en cola el búfer en una estructura de datos local para su posterior procesamiento. El diseño del controlador de filtro determina lo que hace que el controlador procese un búfer en cola. Algunos ejemplos incluyen el procesamiento después de un tiempo de espera o un procesamiento después de recibir un búfer específico.

    Nota Si las colas de controladores envían solicitudes para su procesamiento posterior, debe admitir solicitudes de cancelación de envío. Para obtener más información sobre el envío de solicitudes de cancelación, vea Cancelar solicitudes de envío en un controlador de filtro.

  • Copie el búfer y origine una solicitud de envío con la copia. La operación de envío es similar a una solicitud de envío iniciada por el controlador de filtro. En este caso, el controlador debe devolver el búfer original al controlador de sobreslización llamando a la función NdisFSendNetBufferListsComplete .

La finalización de las solicitudes de envío continúa en la pila de controladores. Cuando el controlador de minipuerto llama a la función NdisMSendNetBufferListsComplete , NDIS llama a la función FilterSendNetBufferListsComplete para el módulo de filtro con exceso más bajo.

Una vez completada la operación de envío, el controlador de filtro invierte las modificaciones en los descriptores de búfer del controlador sobrepuestos que el controlador de filtro realizó en FilterSendNetBufferLists. El controlador llama a la función NdisFSendNetBufferListsComplete para devolver la lista vinculada de estructuras de NET_BUFFER_LIST a los controladores de sobreslización y devolver el estado final de la solicitud de envío.

Cuando el módulo de filtro superior llama a NdisFSendNetBufferListsComplete, NDIS llama a la función ProtocolSendNetBufferListsComplete del controlador de protocolo de origen.

Un controlador de filtro que no proporciona una función FilterSendNetBufferLists todavía puede iniciar una solicitud de envío. Si este controlador inicia una solicitud de envío, debe proporcionar una función FilterSendNetBufferListsComplete y no debe pasar el evento completo a la pila de controladores.

Un controlador de filtro puede pasar o filtrar la solicitud de bucle invertido de un controlador de sobrescritura. Para pasar una solicitud de bucle invertido, si NDIS establece NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK en el parámetro SendFlags de FilterSendNetBufferLists, el controlador de filtro establece NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK en el parámetro SendFlags cuando llama a NdisFSendNetBufferLists. NDIS indica un paquete recibido que contiene los datos de envío.

En general, si un controlador de filtro modifica cualquier comportamiento de forma que NDIS no pueda proporcionar un servicio estándar (como bucle invertido), el controlador de filtro debe proporcionar ese servicio para NDIS. Por ejemplo, un controlador de filtro que modifica una solicitud para la dirección de hardware (consulte OID_802_3_CURRENT_ADDRESS), debe controlar el bucle invertido de los búferes dirigidos a la nueva dirección de hardware. En este caso, NDIS no puede proporcionar el servicio de bucle invertido que normalmente proporciona porque el filtro modificó la dirección. Además, si el controlador de filtro establece el modo promiscuo (consulte OID_GEN_CURRENT_PACKET_FILTER), no debe pasar los datos adicionales que recibe a los controladores de exceso.