Cancelación de una solicitud de envío en un controlador de filtro
Los controladores de filtro pueden cancelar las solicitudes de envío originadas por el controlador de filtro o que se originaron mediante controladores excesivos.
Cancelación de solicitudes de envío del controlador de filtro
En la ilustración siguiente se muestra cómo cancelar una solicitud de envío originada por un controlador de filtro.
Un controlador de filtro llama a la macro NDIS_SET_NET_BUFFER_LIST_CANCEL_ID para cada estructura de NET_BUFFER_LIST que crea para las operaciones de envío. La función NDIS_SET_NET_BUFFER_LIST_CANCEL_ID marca los datos especificados con un identificador de cancelación.
Antes de asignar identificadores de cancelación a los datos de red, un controlador de filtro debe llamar a NdisGeneratePartialCancelId para obtener el byte de orden superior de cada identificador de cancelación que asigne. Esto garantiza que el controlador no duplique los identificadores de cancelación asignados por otros controladores del sistema. Normalmente, los controladores llaman a NdisGeneratePartialCancelId una vez desde la rutina DriverEntry . Sin embargo, los controladores pueden obtener más de un identificador de cancelación parcial llamando a NdisGeneratePartialCancelId varias veces.
Para cancelar la transmisión pendiente de datos en una estructura de NET_BUFFER_LIST marcada, un controlador de filtro pasa el identificador de cancelación a la función NdisFCancelSendNetBufferLists . Los controladores pueden obtener el identificador de cancelación de una estructura de NET_BUFFER_LIST llamando a la macro NDIS_GET_NET_BUFFER_LIST_CANCEL_ID .
Si un controlador de filtro marca todas las estructuras de NET_BUFFER_LIST con el mismo identificador de cancelación, puede cancelar todas las transmisiones pendientes con una sola llamada a NdisFCancelSendNetBufferLists. Si un controlador de filtro marca todas las estructuras NET_BUFFER_LIST dentro de un subgrupo de NET_BUFFER_LIST estructuras con un identificador único, puede cancelar todas las transmisiones pendientes dentro de ese subgrupo con una sola llamada a NdisFCancelSendNetBufferLists.
NDIS llama a la función cancel send de los controladores subyacentes. Después de anular la transmisión pendiente, los controladores subyacentes llaman a una función de envío completa (por ejemplo , NdisMSendNetBufferListsComplete) para devolver las estructuras de NET_BUFFER_LIST con un estado de finalización de NDIS_STATUS_SEND_ABORTED. NDIS, a su vez, llama a la función FilterSendNetBufferListsComplete del controlador de filtro.
En FilterSendNetBufferListsComplete, un controlador de filtro puede llamar a NDIS_SET_NET_BUFFER_LIST_CANCEL_ID con CancelId establecido en NULL. Esto impide que el NET_BUFFER_LIST se vuelva a usar accidentalmente con un identificador de cancelación obsoleto.
Cancelación de solicitudes de envío originadas por controladores excesivos
En la ilustración siguiente se muestra la cancelación de una solicitud de envío originada por un controlador demasiado excesivo.
Los controladores demasiado grandes llaman a una función de envío de cancelación ( NdisFCancelSendNetBufferLists o NdisCancelSendNetBufferLists) para cancelar las solicitudes de envío pendientes. Estos controladores que se sobreponen deben marcar los datos de envío con un identificador de cancelación antes de realizar una solicitud de envío.
NDIS llama a la función FilterCancelSendNetBufferLists del controlador de filtro para cancelar la transmisión de todas las estructuras de NET_BUFFER_LIST marcadas con un identificador de cancelación especificado.
FilterCancelSendNetBufferLists realiza las siguientes operaciones:
Recorre la lista del controlador de filtro de estructuras de NET_BUFFER_LIST en cola para el módulo de filtro especificado y llama a la macro NDIS_GET_NET_BUFFER_LIST_CANCEL_ID para obtener el identificador de cancelación de cada estructura. El controlador de filtro compara el identificador de cancelación que NDIS_GET_NET_BUFFER_LIST_CANCEL_ID devuelve con el identificador de cancelación que NDIS pasó a FilterCancelSendNetBufferLists.
Quita de la cola de envío (desvincula) todas las estructuras de NET_BUFFER_LIST cuyos identificadores de cancelación coinciden con el identificador de cancelación especificado.
Llama a la función NdisFSendNetBufferListsComplete para que todas las estructuras de NET_BUFFER_LIST desvinculadas devuelvan las estructuras. El controlador de filtro establece el campo de estado de las estructuras de NET_BUFFER_LIST en NDIS_STATUS_SEND_ABORTED.
Llama a la función NdisFCancelSendNetBufferLists para pasar la solicitud de envío de cancelación a los controladores subyacentes. El controlador de filtro pasa el identificador de cancelación que recibió del controlador de sobreaprovisionamiento. La operación de cancelación continúa como con una operación de envío de cancelación originada por filter-driver.