Функция NdisMIndicateReceiveNetBufferLists (ndis.h)
Драйверы минипорта вызывают функцию NdisMIndicateReceiveNetBufferLists, чтобы указать получение данных из сети.
Синтаксис
void NdisMIndicateReceiveNetBufferLists(
[in] NDIS_HANDLE MiniportAdapterHandle,
PNET_BUFFER_LIST NetBufferList,
[in] NDIS_PORT_NUMBER PortNumber,
[in] ULONG NumberOfNetBufferLists,
[in] ULONG ReceiveFlags
);
Параметры
[in] MiniportAdapterHandle
Минипорт-дескриптор, передаваемый NDIS в функция MiniportInitializeEx.
NetBufferList
Связанный список структур NET_BUFFER_LIST, выделенных мини-драйвером.
[in] PortNumber
Номер порта, определяющий порт мини-порта. Чтобы назначить номер порта минипорта, вызовите функцию NdisMAllocatePort. Нулевое значение определяет порт по умолчанию мини-адаптера. Используйте порт по умолчанию, если драйвер мини-порта не выделяет порты для указанного адаптера.
[in] NumberOfNetBufferLists
Количество структур NET_BUFFER_LIST, которые находятся в связанном списке структур в NetBufferLists.
[in] ReceiveFlags
Флаги, определяющие атрибуты для операции отправки. Флаги можно объединить с операцией OR. Чтобы очистить все флаги, установите для этого элемента значение нулю. Эта функция поддерживает следующие флаги:
NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL
Указывает, что текущий IRQL DISPATCH_LEVEL. Дополнительные сведения об этом флаге см. в отслеживания IRQL.
NDIS_RECEIVE_FLAGS_RESOURCES
Указывает, что драйвер минипорта освобождает владение структурами NET_BUFFER_LIST и всеми присоединенными NET_BUFFER структурами сразу после вызова NdisMIndicateReceiveNetBufferLists.
NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE
Указывает, что все структуры NET_BUFFER_LIST в списке в NetBufferLists имеют одинаковый тип протокола (EthereumType).
драйверов Минипорта
NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE при необходимости задаются драйверами минипорта, которые уверены, что все NBL в цепочке NBL имеют один и тот же EthereumType. Задав этот флаг, драйвер минипорта сообщает NDIS и протоколам верхнего слоя, что они не должны проверять каждый пакет для его EtherType, что повышает производительность. Драйверы минипорта никогда не требуются для установки этого флага.
фильтры легкого веса (LWFs)
При указании новых приемов фильтр легкого веса (LWF) также может при необходимости задать NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE, если он уверен, что все NBL в цепочке NBL имеют один и тот же EthereumType. Однако, как и драйверы минипорта, LWFs никогда не требуются для установки этого флага в этом случае и всегда могут выбирать для очистки флага.
При передаче через получение от нижнего слоя, если LWF изменяет EthereumType NBLs, LWF должен очистить флаг, если NBLs больше не имеют того же EthereumType.
При передаче из нижнего слоя, если LWF изменяет EthereumType NBLs, LWF может задать при необходимости этот флаг, если он уверен, что все NBL в цепочке NBL имеют один и тот же EthereumType. В этом случае LWF никогда не требуется для установки этого флага и всегда может выбрать его очистку.
При использовании из нижнего слоя, если этот флаг задан, LWF может предположить, что каждый NBL в цепочке имеет тот же EthereumType. LWF никогда не требуется для чтения этого флага и вместо этого может всегда читать ЭфирТип из каждого NBL.
При объединении нескольких цепей NBL LWF должен очистить этот флаг, если не уверен, что новая цепочка NBL имеет однородный ЭфирТип.
драйверы протокола
При использовании из нижнего слоя, если задано NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE, протокол может предположить, что каждый NBL в цепочке имеет тот же EthereumType. Протокол никогда не требуется для чтения этого флага и вместо этого может всегда читать ЭфирТип из каждого NBL.
NDIS_RECEIVE_FLAGS_SINGLE_VLAN
Указывает, что все структуры NET_BUFFER_LIST в списке по NetBufferLists принадлежат одной виртуальной локальной сети.
NDIS_RECEIVE_FLAGS_PERFECT_FILTERED
Указывает, что все структуры NET_BUFFER_LIST в списке в NetBufferLists включают только данные, соответствующие фильтру пакетов и списку адресов многоадресной рассылки, назначенные мини-адаптеру.
NDIS_RECEIVE_FLAGS_SINGLE_QUEUE
Указывает, что все структуры NET_BUFFER_LIST в списке NetBufferLists принадлежат одной очереди виртуальных машин. Минипорт-драйвер должен задать этот флаг для всех признаков получения в очереди, если флаг NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION был установлен в элементе Flags NDIS_RECEIVE_QUEUE_PARAMETERS структуру при выделении этой очереди.
NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID
Указывает, что все структуры NET_BUFFER_LIST в списке по NetBufferLists содержат допустимые сведения о общей памяти. Если этот флаг установлен на полученном NET_BUFFER_LIST, NDIS обрабатывает общую память как допустимые. Если этот флаг не задан, NDIS и драйверы игнорируют сведения о общей памяти. Например, промежуточные драйверы, изменяющие данные пакета, могут использовать этот флаг для определения необходимости копирования данных. Мини-порты могут использовать флаг, чтобы определить, как освободить память, связанную с очередью виртуальной машины при удалении очереди.
NDIS_RECEIVE_FLAGS_MORE_NBLS
Скрытный.
Возвращаемое значение
Никакой
Замечания
Минипорт-драйвер обычно вызывает функцию NdisMIndicateReceiveNetBufferLists из функции MiniportInterruptDPC. Когда драйвер минипорта вызывает NdisMIndicateReceiveNetBufferLists, он задает список структур NET_BUFFER_LIST в параметре NetBufferLists. NDIS передает NET_BUFFER_LIST структуры в ProtocolReceiveNetBufferLists функцию драйверов привязанного протокола.
Драйверы минипорта должны задать элемент SourceHandle каждой NET_BUFFER_LIST структуры таким же значением, что и параметр MiniportAdapterHandle.
Если драйвер минипорта вызывает NdisMIndicateReceiveNetBufferLists и очищает флаг NDIS_RECEIVE_FLAG_RESOURCES в параметре ReceiveFlags, NDIS возвращает указанные NET_BUFFER_LIST структуры в драйвер минипорта функция MiniportReturnNetBufferLists. В этом случае драйвер минипорта не должен возвращать структуры NET_BUFFER_LIST, пока NDIS не возвращает NET_BUFFER_LIST структуры в минипорта miniportReturnNetBufferLists функции.
Если мини-драйвер вызывает NdisMIndicateReceiveNetBufferLists и задает флаг NDIS_RECEIVE_FLAG_RESOURCES в параметре ReceiveFlags, это означает, что драйвер минипорта должен немедленно восстановить владение NET_BUFFER_LIST структур. В этом случае NDIS не вызывает функцию miniport driver MiniportReturnNetBufferLists для возврата структур NET_BUFFER_LIST. Вместо этого NDIS возвращает NET_BUFFER_LIST структуры минипорту при возвращении из NdisMIndicateReceiveNetBufferLists. Минипорт-драйвер должен восстановить структуры NET_BUFFER_LIST сразу после возврата NdisMIndicateReceiveNetBufferLists. Чтобы освободить структуры NET_BUFFER_LIST, минипорт-драйвер может вызвать свой собственный функция MiniportReturnNetBufferLists.
Задание флага NDIS_RECEIVE_FLAG_RESOURCES в параметре ReceiveFlags заставляет драйверы протокола копировать сетевые данные и освобождать структуры NET_BUFFER_LIST в минипорт-драйвер. Авторы драйверов должны разработать свои минипорт-драйверы с достаточной предварительной NET_BUFFER_LIST структур, чтобы избежать ненужных копирований.
Вызывающий объект NdisMIndicateReceiveNetBufferLists должен правильно инициализировать структуры NET_BUFFER_LIST, присоединенные NET_BUFFER структуры и все присоединенные mdls.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Поддерживается в NDIS 6.0 и более поздних версиях. |
целевая платформа | Всеобщий |
заголовка | ndis.h (include Ndis.h) |
библиотеки | Ndis.lib |
IRQL | <= DISPATCH_LEVEL |
правил соответствия DDI | Irql_SendRcv_Function(ndis) |