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


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

На следующем рисунке показана базовая операция отправки, которая включает драйвер протокола, 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 также может разделять MDL в структуре NET_BUFFER. Однако драйвер должен всегда возвращать структуры NET_BUFFER_LIST со структурами NET_BUFFER и MDL в исходной форме. Например, промежуточный драйвер может разделить NET_BUFFER_LIST на две новые структуры NET_BUFFER_LIST и передать часть исходных данных следующему драйверу. Однако, когда промежуточный драйвер завершает обработку исходного NET_BUFFER_LIST, он должен вернуть полный NET_BUFFER_LIST с исходными структурами NET_BUFFER и списками дескрипторов памяти MDL.

Драйверы протокола устанавливают элемент 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, которую он сохранил.