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


функция обратного вызова PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS (ndis.h)

Процессы функции ProtocolCoReceiveNetBufferLists получают указания от базовых драйверов.

Примечание Функцию необходимо объявить с помощью типа PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS . Дополнительные сведения см. в следующем разделе Примеры.
 

Синтаксис

PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS ProtocolCoReceiveNetBufferLists;

void ProtocolCoReceiveNetBufferLists(
  [in] NDIS_HANDLE ProtocolBindingContext,
  [in] NDIS_HANDLE ProtocolVcContext,
  [in] PNET_BUFFER_LIST NetBufferLists,
  [in] ULONG NumberOfNetBufferLists,
  [in] ULONG ReceiveFlags
)
{...}

Параметры

[in] ProtocolBindingContext

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

[in] ProtocolVcContext

Дескриптор области контекста, выделенной драйвером протокола, в которой этот драйвер хранит сведения о состоянии выполнения для каждого виртуального подключения (VC). Клиент или автономный диспетчер вызовов предоставил этот дескриптор либо при вызове функции NdisCoCreateVc , либо из функции ProtocolCoCreateVc .

[in] NetBufferLists

Связанный список NET_BUFFER_LIST структур, выделенных базовым драйвером. Каждая NET_BUFFER_LIST структура обычно связана с одной NET_BUFFER структурой.

[in] NumberOfNetBufferLists

Количество NET_BUFFER_LIST структур, которые находятся в связанном списке структур, указанных в NetBufferLists .

[in] ReceiveFlags

Флаги, определяющие атрибуты для операции отправки. Флаги можно объединить с побитовой операцией ИЛИ. Чтобы удалить все флаги, задайте для этого параметра значение 0. ProtocolCoReceiveNetBufferLists поддерживает следующие флаги:

NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL

Текущий irQL DISPATCH_LEVEL. Дополнительные сведения об этом флаге см. в разделе Dispatch IRQL Tracking.

NDIS_RECEIVE_FLAGS_RESOURCES

NDIS освобождает права владения NET_BUFFER_LIST структурами и любыми присоединенными NET_BUFFER структурами сразу после возврата вызова ProtocolCoReceiveNetBufferLists .

Возвращаемое значение

None

Remarks

Для драйверов протокола CoNDIS требуется функция ProtocolCoReceiveNetBufferLists . NDIS вызывает ProtocolCoReceiveNetBufferLists после вызова связанного драйвера минипорта Функция NdisMCoIndicateReceiveNetBufferLists . Вызов ProtocolCoReceiveNetBufferLists также может произойти в результате замыкания на себя.

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

В многопроцессорной системе ProtocolCoReceiveNetBufferLists может выполняться одновременно на нескольких процессорах. В этом случае следует применять защиту (например, использовать спин-блокировки) к критически важным структурам данных, к которым обращается ProtocolCoReceiveNetBufferLists .

NDIS вызывает ProtocolCoReceiveNetBufferLists по адресу IRQL<= DISPATCH_LEVEL.

Примеры

Чтобы определить функцию ProtocolCoReceiveNetBufferLists , необходимо сначала предоставить объявление функции, определяющее тип определяемой функции. Windows предоставляет набор типов функций для драйверов. Объявление функции с помощью типов функций помогает анализу кода для драйверов, средству проверки статических драйверов (SDV) и другим средствам проверки находить ошибки, и это требование для написания драйверов для операционной системы Windows.

Например, чтобы определить функцию ProtocolCoReceiveNetBufferLists с именем MyCoReceiveNetBufferLists, используйте тип PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS , как показано в этом примере кода:

PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS MyCoReceiveNetBufferLists;

Затем реализуйте функцию следующим образом:

_Use_decl_annotations_
VOID
 MyCoReceiveNetBufferLists(
    NDIS_HANDLE  ProtocolBindingContext,
    NDIS_HANDLE  ProtocolVcContext,
    INPNET_BUFFER_LIST  NetBufferLists,
    ULONG  NumberOfNetBufferLists,
    ULONG  ReceiveFlags
    )
  {...}

Тип функции PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS определен в файле заголовка Ndis.h. Чтобы более точно определить ошибки при запуске средств анализа кода, обязательно добавьте заметку Use_decl_annotations в определение функции. Заметка Use_decl_annotations гарантирует использование заметок, которые применяются к типу функции PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в разделе Объявление функций с помощью типов ролей функций для драйверов NDIS.

Сведения о Use_decl_annotations см. в статье О поведении функции.

Требования

Требование Значение
Минимальная версия клиента Поддерживается в NDIS 6.0 и более поздних версиях.
Целевая платформа Windows
Header ndis.h (включая Ndis.h)
IRQL <= DISPATCH_LEVEL

См. также раздел

Функции отправки и получения драйвера протокола CoNDIS

MiniportReturnNetBufferLists

NET_BUFFER

NET_BUFFER_LIST

NdisCoCreateVc

NdisMCoIndicateReceiveNetBufferLists

NdisOpenAdapterEx

NdisReturnNetBufferLists

ProtocolCoCreateVc

ProtocolCoSendNetBufferListsComplete