Получение данных в драйверах протокола

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

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

NDIS вызывает функцию ProtocolReceiveNetBufferLists драйвера протокола для обработки сигналов получения, поступающих из базовых драйверов. NDIS вызывает ProtocolReceiveNetBufferLists после того, как базовый драйвер вызывает функцию индикации получения (например, NdisMIndicateReceiveNetBufferLists) для указания полученных сетевых данных или данных обратной связи.

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

Примечание NDIS может изменить флаги, которые указывает базовый драйвер. Например, если мини-драйвер задает флаг NDIS_RECEIVE_FLAGS_RESOURCES в параметре ReceiveFlags функции NdisMIndicateReceiveNetBufferLists, NDIS может скопировать указанные данные и передать копию в ProtocolReceiveNetBufferLists с очищенным флагом NDIS_RECEIVE_FLAGS_RESOURCES.

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

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