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


Отправка сетевых данных

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

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

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

Все операции отправки на основе NET_BUFFER являются асинхронными. По завершении драйвер мини-порта вызывает функцию NdisMSendNetBufferListsComplete с соответствующим кодом состояния. Отправка каждой структуры NET_BUFFER_LIST может выполняться по отдельности. NDIS вызывает функцию ProtocolSendNetBufferListsComplete драйвера протокола каждый раз, когда драйвер минипорта вызывает NdisMSendNetBufferListsComplete.

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

Драйвер мини-порта или NDIS может возвращать NET_BUFFER_LIST структуры в любом порядке. Драйверы протокола гарантируют, что список NET_BUFFER структур, присоединенных к каждой NET_BUFFER_LIST структуре, не был изменен.

Любой драйвер NDIS может разделять структуры NET_BUFFER в NET_BUFFER_LIST структуре. Любой драйвер NDIS также может разделять многомерные списки в NET_BUFFER структуре. Однако драйвер всегда должен возвращать NET_BUFFER_LIST структуры с NET_BUFFER структурами и многомерными выражениями в исходной форме. Например, промежуточный драйвер может разделить NET_BUFFER_LIST на две новые структуры NET_BUFFER_LIST и передать часть исходных данных следующему драйверу. Однако когда промежуточный драйвер завершает обработку исходного NET_BUFFER_LIST он должен вернуть полный NET_BUFFER_LIST с исходными NET_BUFFER структурами и многомерными списками.

Драйверы протокола задают элемент SourceHandle в структуре NET_BUFFER_LIST NdisBindingHandle , предоставленный NDIS в вызове функции NdisOpenAdapterEx . NDIS использует элемент SourceHandle для возврата структур NET_BUFFER_LIST в драйвер протокола, отправляющий NET_BUFFER_LIST структуры.

Промежуточные драйверы также устанавливают для элемента SourceHandle в структуре NET_BUFFER_LIST значение NdisBindingHandle , предоставленное NDIS при вызове NdisOpenAdapterEx. Если промежуточный драйвер перенаправит запрос на отправку, драйвер должен сохранить значение SourceHandle , предоставленное вышедшему драйверу перед записью в элемент SourceHandle . Когда NDIS возвращает переадресованную структуру NET_BUFFER_LIST в промежуточный драйвер, промежуточный драйвер должен восстановить сохраненный объект SourceHandle .