Recepción de datos en un controlador de filtro
Los controladores de filtro pueden iniciar indicaciones de recepción o filtrar indicaciones de recepción de controladores subyacentes. Cuando un controlador de minipuerto llama a la función NdisMIndicateReceiveNetBufferLists , NDIS envía la estructura de NET_BUFFER_LIST especificada al módulo de filtro más bajo en la pila de controladores.
Recibir indicaciones iniciadas por un controlador de filtro
En la ilustración siguiente se muestra una indicación de recepción iniciada por un controlador de filtro.
Los controladores de filtro llaman a la función NdisFIndicateReceiveNetBufferLists para indicar los datos recibidos. La función NdisFIndicateReceiveNetBufferLists pasa la lista indicada de NET_BUFFER_LIST estructuras de la pila a controladores excesivamente inactivos. El controlador de filtro asigna las estructuras de los grupos que creó durante la inicialización.
Si un controlador de filtro establece la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags de NdisFIndicateReceiveNetBufferLists, esto indica que el controlador de filtro debe recuperar la propiedad de las estructuras de NET_BUFFER_LIST inmediatamente. En este caso, NDIS no llama a la función FilterReturnNetBufferLists del controlador de filtro para devolver las estructuras NET_BUFFER_LIST . El controlador de filtro recupera la propiedad inmediatamente después de que se devuelva NdisFIndicateReceiveNetBufferLists .
Si un controlador de filtro no establece la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags de NdisFIndicateReceiveNetBufferLists, NDIS devuelve las estructuras de NET_BUFFER_LIST indicadas a la función FilterReturnNetBufferLists del controlador de filtro. En este caso, el controlador de filtro renuncia a la propiedad de las estructuras indicadas hasta que NDIS los devuelve a FilterReturnNetBufferLists.
Nota Un controlador de filtro debe realizar un seguimiento de las indicaciones de recepción que inicia y asegurarse de que no llama a la función NdisFReturnNetBufferLists cuando se completa la operación de recepción.
Filtrado de indicaciones de recepción
En la ilustración siguiente se muestra una indicación de recepción filtrada iniciada por un controlador subyacente.
NDIS llama a la función FilterReceiveNetBufferLists del controlador de filtro para procesar las indicaciones de recepción de los controladores subyacentes. NDIS llama a FilterReceiveNetBufferLists después de que un controlador subyacente llame a una función de indicación de recepción (por ejemplo, NdisMIndicateReceiveNetBufferLists) para indicar los datos de red recibidos o los datos de bucle invertido.
Si no se establece la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags de FilterReceiveNetBufferLists , el controlador de filtro mantiene la propiedad de las estructuras NET_BUFFER_LIST hasta que llama a la función NdisFReturnNetBufferLists .
Si se establece la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags , el controlador de filtro no puede mantener la estructura de NET_BUFFER_LIST y los recursos asignados por el controlador subyacente asociados. Esta marca puede indicar que el controlador subyacente se está ejecutando poco en los recursos de recepción. La función FilterReceiveNetBufferLists debe devolver lo antes posible.
Nota Si se establece la marca NDIS_RECEIVE_FLAGS_RESOURCES , el controlador de filtro debe conservar el conjunto original de estructuras de NET_BUFFER_LIST en la lista vinculada. Por ejemplo, cuando se establece esta marca, el controlador puede procesar las estructuras e indicarles la pila de uno en uno, pero antes de que la función devuelva, debe restaurar la lista vinculada original.
Los controladores de filtro pueden realizar operaciones de filtro en los datos recibidos antes de indicar los datos a controladores demasiado excesivos. Para cada búfer enviado a su función FilterReceiveNetBufferLists , un controlador de filtro puede hacer lo siguiente:
Páselo al siguiente controlador de sobreaplicación llamando a NdisFIndicateReceiveNetBufferLists. El controlador puede modificar el contenido del búfer. NDIS garantiza la disponibilidad del espacio de contexto (consulte NET_BUFFER_LIST_CONTEXT estructura).
Un controlador de filtro puede cambiar el estado que NDIS pasó a FilterReceiveNetBufferLists o simplemente pasarlo a NdisFIndicateReceiveNetBufferLists.
Nota Un controlador de filtro puede pasar un búfer con NdisFIndicateReceiveNetBufferLists incluso si NDIS establece la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags de FilterReceiveNetBufferLists. En este caso, el controlador de filtro no debe devolver de FilterReceiveNetBufferLists hasta que recupere la propiedad del búfer.
Descarte el búfer. Si NDIS borra la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags de FilterReceiveNetBufferLists, llame a la función NdisFReturnNetBufferLists para descartar el búfer. Si NDIS establece la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags de FilterReceiveNetBufferLists, no realice ninguna acción y devuelva de FilterReceiveNetBufferLists para descartar el búfer.
Poner en cola el búfer en una estructura de datos local para su posterior procesamiento. Si NDIS establece la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags de FilterReceiveNetBufferLists, el controlador de filtro debe crear una copia antes de volver de FilterReceiveNetBufferLists.
Copie el búfer y origine una indicación de recepción con la copia. La indicación de recepción es similar a una indicación de recepción iniciada por el controlador de filtro. En este caso, el controlador debe devolver el búfer original al controlador subyacente.
La función NdisFIndicateReceiveNetBufferLists pasa la lista indicada de estructuras de NET_BUFFER_LIST hasta la pila de controladores a los controladores de exceso. La operación de recepción continúa de forma similar a una operación de recepción iniciada por filter-driver.
Si un controlador que sobrescribe conserva la propiedad del búfer, NDIS llama a la función FilterReturnNetBufferLists para el módulo de filtro. En su función FilterReturnNetBufferLists , el controlador de filtro deshará las operaciones que realizó en el búfer en la ruta de acceso de indicación de recepción.
Cuando el módulo de filtro de capa más bajo indica que se realiza con un búfer, NDIS devuelve el búfer al controlador de minipuerto. Si NDIS borra la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags de FilterReceiveNetBufferLists, el controlador de filtro llama a NdisFReturnNetBufferLists para devolver el búfer. Si NDIS establece la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags de FilterReceiveNetBufferLists, la devolución de FilterReceiveNetBufferLists devuelve el búfer.