Поделиться через


Отмена операции отправки

На следующем рисунке показана отмена операции отправки.

Схема, показывающая процесс отмены операции отправки.

Драйвер вызывает макрос 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 с устаревшим идентификатором отмены.