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


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

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

Если установлен флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlags , который передается функции ProtocolReceiveNetBufferLists драйвера протокола, 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.

Драйверы miniport должны задать элемент 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 .