Отмена операции отправки
На следующем рисунке показана отмена операции отправки.
Драйвер вызывает макрос NDIS_SET_NET_BUFFER_LIST_CANCEL_ID для каждой структуры NET_BUFFER_LIST , которая передается драйверам более низкого уровня для передачи. Функция NDIS_SET_NET_BUFFER_LIST_CANCEL_ID помечает указанный пакет идентификатором отмены.
Перед назначением идентификаторов отмены пакетам драйвер должен вызвать NdisGeneratePartialCancelId , чтобы получить байт высокого порядка каждого назначенного идентификатора отмены. Это гарантирует, что драйвер не будет дублировать идентификаторы отмены, назначенные другими драйверами в системе. Драйверы обычно вызывают NdisGeneratePartialCancelId один раз из подпрограммы DriverEntry ; Однако драйверы могут получить несколько идентификаторов частичной отмены, вызывая NdisGeneratePartialCancelId несколько раз.
Чтобы отменить ожидающие передачи данных в помеченной NET_BUFFER_LIST структуре, драйвер передает идентификатор отмены функции NdisCancelSendNetBufferLists . Драйверы могут получить идентификатор отмены структуры NET_BUFFER_LIST, вызвав макрос NDIS_GET_NET_BUFFER_LIST_CANCEL_ID .
Если драйвер помечает все NET_BUFFER_LIST структуры одинаковым идентификатором отмены, он может отменить все ожидающие передачи с помощью одного вызова NdisCancelSendNetBufferLists. Если драйвер помечает все NET_BUFFER_LIST структуры в подгруппе NET_BUFFER_LIST структур уникальным идентификатором, он может отменить все ожидающие передачи в этой подгруппе одним вызовом NdisCancelSendNetBufferLists.
NDIS вызывает функцию MiniportCancelSend соответствующего драйвера нижнего уровня в привязке. После прерывания ожидающей передачи базовый драйвер минипорта вызывает функцию NdisMSendNetBufferListsComplete , чтобы вернуть NET_BUFFER_LIST структуры и состояние завершения NDIS_STATUS_SEND_ABORTED. NDIS, в свою очередь, вызывает функцию ProtocolSendNetBufferListsComplete соответствующего драйвера.
В функции ProtocolSendNetBufferListsComplete драйвер протокола может вызывать NDIS_SET_NET_BUFFER_LIST_CANCEL_ID с параметром CancelId , равным NULL. Это предотвращает случайное использование NET_BUFFER_LIST с устаревшим идентификатором отмены.