Cancelación de una operación de envío
En la ilustración siguiente se muestra cómo cancelar una operación de envío.
Un controlador llama a la macro NDIS_SET_NET_BUFFER_LIST_CANCEL_ID para cada estructura de NET_BUFFER_LIST que pasa a los controladores de nivel inferior para la transmisión. La función NDIS_SET_NET_BUFFER_LIST_CANCEL_ID marca el paquete especificado con un identificador de cancelación.
Antes de asignar identificadores de cancelación a paquetes, un controlador 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 duplica los identificadores de cancelación asignados por otros controladores del sistema. Los controladores suelen llamar 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 más de una vez.
Para cancelar la transmisión pendiente de datos en una estructura de NET_BUFFER_LIST marcada, un controlador pasa el identificador de cancelación a la función NdisCancelSendNetBufferLists . 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 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 NdisCancelSendNetBufferLists. Si un controlador 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 NdisCancelSendNetBufferLists.
NDIS llama a la función MiniportCancelSend del controlador de nivel inferior adecuado en el enlace. Después de anular la transmisión pendiente, el controlador de miniport subyacente llama a la función NdisMSendNetBufferListsComplete , para devolver las estructuras de NET_BUFFER_LIST y un estado de finalización de NDIS_STATUS_SEND_ABORTED. NDIS, a su vez, llama a la función ProtocolSendNetBufferListsComplete del controlador adecuado.
En su función ProtocolSendNetBufferListsComplete , un controlador de protocolo puede llamar a NDIS_SET_NET_BUFFER_LIST_CANCEL_ID con CancelId establecido en NULL. Esto evita que el NET_BUFFER_LIST se vuelva a usar accidentalmente con un identificador de cancelación obsoleto.