Получение сетевых данных

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

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

Драйверы минипорта вызывают функцию NdisMIndicateReceiveNetBufferLists, чтобы передать структуры NET_BUFFER драйверам более высокого уровня. Каждая NET_BUFFER структура обычно должна быть присоединена к отдельной NET_BUFFER_LIST структуре. Это позволяет драйверам протокола создавать подмножество исходного списка структур NET_BUFFER_LIST и пересылать их на разные клиенты. Некоторые драйверы, например родные драйверы miniport IEEE 802.11, могут подключать более чем одну структуру NET_BUFFER к структуре NET_BUFFER_LIST.

После связывания всех структур NET_BUFFER_LIST драйвер минипорта передает указатель на первую структуру NET_BUFFER_LIST в списке в функцию NdisMIndicateReceiveNetBufferLists. NDIS проверяет структуры NET_BUFFER_LIST и вызывает функцию ProtocolReceiveNetBufferLists каждого драйвера протокола, связанного со структурами NET_BUFFER_LIST. NDIS передает подмножество списка, которое включает только структуры NET_BUFFER_LIST, связанные с правильной привязкой к каждому драйверу протокола. NDIS сопоставляет значение NetBufferListFrameType, указанное в структуре NET_BUFFER_LIST, с типом кадра, который регистрирует каждый драйвер протокола.

Если в параметре ReceiveFlags, передаваемом функции ProtocolReceiveNetBufferLists драйвера протокола, установлен флаг NDIS_RECEIVE_FLAGS_RESOURCES, NDIS возвращает себе владение структурами NET_BUFFER_LIST сразу после возврата вызова ProtocolReceiveNetBufferLists.

Примечание Если установлен флаг NDIS_RECEIVE_FLAGS_RESOURCES, драйвер протокола должен сохранить исходный набор структур NET_BUFFER_LIST в связанном списке. Например, если этот флаг установлен, драйвер может обработать структуры и указать их по одному в стеке, но прежде чем функция завершит работу, необходимо восстановить исходный связанный список.

Если флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlags, который передается в функцию ProtocolReceiveNetBufferLists драйвера протокола, не установлен, драйвер протокола может сохранить владение структурами NET_BUFFER_LIST. В этом случае драйвер протокола должен возвращать структуры NET_BUFFER_LIST путем вызова функции NdisReturnNetBufferLists.

Если мини-драйвер испытывает нехватку ресурсов для приема, он может задать флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlags в вызове NdisMIndicateReceiveNetBufferLists. В этом случае драйвер может восстановить владение всеми указанными NET_BUFFER_LIST структурами и внедренными NET_BUFFER структурами, как только NdisMIndicateReceiveNetBufferLists возвращается. Указание структур NET_BUFFER с установленным флагом NDIS_RECEIVE_FLAGS_RESOURCES заставляет драйверы протокола копировать данные, поэтому этого следует избегать. Минипорт-драйвер должен обнаружить, когда ресурсы на прием данных подходят к концу, и предпринять все необходимые действия, чтобы избежать этой ситуации.

NDIS вызывает функцию минипорт-драйвера MiniportReturnNetBufferLists после того, как драйвер протокола вызывает NdisReturnNetBufferLists.

Примечание Если драйвер минипорта указывает структуру NET_BUFFER_LIST с установленным флагом NDIS_RECEIVE_FLAGS_RESOURCES, это не означает, что NDIS будет указывать структуру NET_BUFFER_LIST драйверу протокола с тем же состоянием. Например, NDIS может скопировать структуру NET_BUFFER_LIST с установленным флагом NDIS_RECEIVE_FLAGS_RESOURCES и передать копию в драйвер протокола с флагом снятым.

NDIS может возвращать структуры NET_BUFFER_LIST минипорт-драйверу в произвольном порядке и сочетании. То есть связанный список структур NET_BUFFER_LIST, возвращаемых драйверу минипорта вызовом функции MiniportReturnNetBufferLists, может иметь структуры NET_BUFFER_LIST из различных предыдущих вызовов NdisMIndicateReceiveNetBufferLists.

Драйверы минипорта должны установить элемент SourceHandle в структурах NET_BUFFER_LIST в значение MiniportAdapterHandle, который NDIS предоставил драйверу минипорта в функции MiniportInitializeEx. Драйверы фильтров должны устанавливать для элемента SourceHandle каждой структуры NET_BUFFER_LIST, созданной драйвером фильтра, значение NdisFilterHandle фильтра, который NDIS предоставил драйверу фильтра в функции FilterAttach. Драйверы фильтров не должны изменять элемент SourceHandle в каких-либо NET_BUFFER_LIST структурах, которые не были созданы драйвером фильтра.

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