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


Отправка данных из драйвера протокола

На следующем рисунке показана операция отправки драйвера протокола, которая включает драйвер протокола, NDIS и базовые драйверы в стеке драйверов.

Схема, показывающая операцию отправки драйвера протокола с драйвером протокола, NDIS и базовыми драйверами в стеке драйверов.

Драйверы протокола вызывают функцию NdisSendNetBufferLists для отправки сетевых данных, определенных в списке структур NET_BUFFER_LIST .

Драйвер протокола должен задать элемент SourceHandle каждой структуры NET_BUFFER_LIST в то же значение, которое передается в параметр NdisBindingHandle. Дескриптор привязки предоставляет сведения, необходимые NDIS для возврата структуры NET_BUFFER_LIST драйверу протокола после вызова NdisMSendNetBufferListsComplete.

Перед вызовом NdisSendNetBufferLists драйвер протокола может задать сведения, сопровождающие запрос отправки с помощью макроса NET_BUFFER_LIST_INFO . Базовые драйверы могут получить эти сведения с помощью макроса NET_BUFFER_LIST_INFO.

Как только драйвер протокола вызывает NdisSendNetBufferLists, он откажется от владения структурами NET_BUFFER_LIST и всеми связанными ресурсами. NDIS вызывает функцию ProtocolSendNetBufferListsComplete , чтобы вернуть структуры и данные драйверу протокола. NDIS может собирать структуры и данные из нескольких запросов отправки в один связанный список структур NET_BUFFER_LIST перед передачей списка в ProtocolSendNetBufferListsComplete.

Пока NDIS не вызывает ProtocolSendNetBufferListsComplete, текущее состояние отправки, инициированной драйвером протокола, неизвестно. Драйвер протокола временно освобождает владение всеми ресурсами, выделенными для запроса отправки при вызове NdisSendNetBufferLists. Драйвер протокола никогда не должен пытаться проверить структуры NET_BUFFER_LIST или любые связанные данные, пока NDIS не вернет структуры в ProtocolSendNetBufferListsComplete.

ProtocolSendNetBufferListsComplete выполняет необходимое постобработку для завершения операции отправки. Например, драйвер протокола может уведомить клиентов, запрашивающих драйвер протокола для отправки сетевых данных, что операция отправки завершена.

Когда NDIS вызывает ProtocolSendNetBufferListsComplete, драйвер протокола восстанавливает владение всеми ресурсами, связанными с NET_BUFFER_LIST структурами, указанными параметром NetBufferLists . ProtocolSendNetBufferListsComplete может освободить эти ресурсы (например, вызвав NdisFreeNetBuffer и NdisFreeNetBufferList) или подготовить их к повторному использованию в последующем вызове NdisSendNetBufferLists.

Хотя NDIS всегда передаёт сетевые данные, предоставленные протоколом, минипорт-драйверу в порядке, установленном протоколом и переданном через NdisSendNetBufferLists, минипорт-драйвер может завершать обработку запросов на отправку в произвольном порядке. То есть каждый драйвер привязанного протокола может полагаться на NDIS для отправки сетевых данных, которые драйвер протокола передает в функцию NdisSendNetBufferLists в порядке FIFO к низлежащему драйверу. Однако драйвер протокола не может полагаться на базовый драйвер для вызова NdisMSendNetBufferListsComplete в том же порядке.