Отмена запроса на отправку в драйвере фильтра
Драйверы фильтров могут отменять запросы на отправку, которые были созданы драйвером фильтра или которые были получены из-за слишком избыточных драйверов.
Отмена запросов на отправку драйвера фильтра
На следующем рисунке показана отмена запроса на отправку, созданного драйвером фильтра.
Драйвер фильтра вызывает макрос NDIS_SET_NET_BUFFER_LIST_CANCEL_ID для каждой структуры NET_BUFFER_LIST , создаваемой для операций отправки. Функция NDIS_SET_NET_BUFFER_LIST_CANCEL_ID помечает указанные данные идентификатором отмены.
Перед назначением идентификаторов отмены сетевым данным драйвер фильтра должен вызвать NdisGeneratePartialCancelId , чтобы получить байт в высоком порядке каждого назначенного ему идентификатора отмены. Это гарантирует, что драйвер не будет дублировать идентификаторы отмены, назначенные другими драйверами в системе. Драйверы обычно вызывают NdisGeneratePartialCancelId один раз из подпрограммы DriverEntry . Однако драйверы могут получить несколько идентификаторов частичной отмены, вызывая NdisGeneratePartialCancelId несколько раз.
Чтобы отменить ожидающие передачи данных в помеченной NET_BUFFER_LIST структуре, драйвер фильтра передает идентификатор отмены функции NdisFCancelSendNetBufferLists . Драйверы могут получить идентификатор отмены NET_BUFFER_LIST структуры, вызвав макрос NDIS_GET_NET_BUFFER_LIST_CANCEL_ID .
Если драйвер фильтра помечает все NET_BUFFER_LIST структуры одинаковым идентификатором отмены, он может отменить все ожидающие передачи одним вызовом NdisFCancelSendNetBufferLists. Если драйвер фильтра помечает все NET_BUFFER_LIST структуры в подгруппе структур NET_BUFFER_LIST уникальным идентификатором, он может отменить все ожидающие передачи в этой подгруппе одним вызовом NdisFCancelSendNetBufferLists.
NDIS вызывает функцию отмены отправки базовых драйверов. После прерывания ожидающей передачи базовые драйверы вызывают функцию send complete (например , NdisMSendNetBufferListsComplete), чтобы вернуть NET_BUFFER_LIST структуры с состоянием завершения NDIS_STATUS_SEND_ABORTED. NDIS, в свою очередь, вызывает функцию FilterSendNetBufferListsComplete драйвера фильтра.
В FilterSendNetBufferListsComplete драйвер фильтра может вызывать NDIS_SET_NET_BUFFER_LIST_CANCEL_ID с параметром CancelId , имеющим значение NULL. Это предотвращает случайное использование NET_BUFFER_LIST с устаревшим идентификатором отмены.
Отмена запросов на отправку из-за превышения драйверов
На следующем рисунке показана отмена запроса на отправку, созданного драйвером с превышением.
Переопределяющие драйверы вызывают функцию отмены отправки ( NdisFCancelSendNetBufferLists или NdisCancelSendNetBufferLists) для отмены невыполненных запросов на отправку. Перед отправкой запроса на отправку эти драйверы должны пометить данные отправки идентификатором отмены.
NDIS вызывает функцию FilterCancelSendNetBufferLists драйвера фильтра, чтобы отменить передачу всех NET_BUFFER_LIST структур, помеченных указанным идентификатором отмены.
FilterCancelSendNetBufferLists выполняет следующие операции:
Просматривает список NET_BUFFER_LIST структур NET_BUFFER_LIST драйвера фильтра для указанного модуля фильтра и вызывает макрос NDIS_GET_NET_BUFFER_LIST_CANCEL_ID для получения идентификатора отмены для каждой структуры. Драйвер фильтра сравнивает идентификатор отмены, возвращаемый NDIS_GET_NET_BUFFER_LIST_CANCEL_ID, с идентификатором отмены, переданным NDIS в FilterCancelSendNetBufferLists.
Удаляет из очереди отправки (отменяет связь) все NET_BUFFER_LIST структуры, идентификаторы отмены которых соответствуют указанному идентификатору отмены.
Вызывает функцию NdisFSendNetBufferListsComplete для всех несвязанных структур NET_BUFFER_LIST для возврата структур. Драйвер фильтра задает для поля состояния структур NET_BUFFER_LIST значение NDIS_STATUS_SEND_ABORTED.
Вызывает функцию NdisFCancelSendNetBufferLists для передачи запроса отмены отправки базовым драйверам. Драйвер фильтра передает идентификатор отмены, полученный от вышедшей драйвера. Операция отмены выполняется так же, как и операция отмены отправки, инициированная драйвером фильтра.