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

Драйвер мини-порта должен предоставить обработчик MiniportMessageInterruptDPC , если драйвер вызывает функцию NdisMRegisterInterruptEx для регистрации прерывания.

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

Синтаксис

MINIPORT_MESSAGE_INTERRUPT_DPC MiniportMessageInterruptDpc;

void MiniportMessageInterruptDpc(
  [in] NDIS_HANDLE MiniportInterruptContext,
  [in] ULONG MessageId,
  [in] PVOID MiniportDpcContext,
  [in] PVOID ReceiveThrottleParameters,
       PVOID NdisReserved2 PULONG NdisReserved1,
  [in] PULONG NdisReserved2
)
{...}

Параметры

[in] MiniportInterruptContext

Дескриптор для блока сведений о контексте прерывания. Драйвер мини-порта предоставил этот дескриптор в параметре MiniportInterruptContext , который драйвер мини-порта передал вФункция NdisMRegisterInterruptEx.

[in] MessageId

Идентификатор сообщения с сигналом о прерывании (MSI). MessageId является индексом для структура IO_INTERRUPT_MESSAGE_INFO_ENTRY внутри структура IO_INTERRUPT_MESSAGE_INFO . NDIS передает указатель на связанную структуру IO_INTERRUPT_MESSAGE_INFO в элементе MessageInfoTable , когда драйвер успешно регистрируется для MSI с помощью функции NdisMRegisterInterruptEx .

[in] MiniportDpcContext

Указатель на контекстную область, которую драйвер мини-порта предоставил при вызове функции NdisMQueueDpcEx или NdisMQueueDpc . Если NDIS вызвал MiniportMessageInterruptDPC , так как драйвер минипорта вернул битовую маску в параметре TargetProcessors объектаФункция MiniportMessageInterrupt, то MiniportDpcContext имеет значение NULL.

[in] ReceiveThrottleParameters

Указатель на NDIS_RECEIVE_THROTTLE_PARAMETERS структура указывает максимальное число NET_BUFFER_LIST структур, которые драйвер мини-порта должен указать в DPC.

Примечание В NDIS 6.1 и более ранних версиях этот параметр называется NdisReserved1, его тип данных — PULONG и зарезервирован для NDIS.
 

NdisReserved1

Зарезервировано для NDIS.

[in] NdisReserved2

Зарезервировано для NDIS.

Примечание В NDIS 6.1 и более ранних версиях этот параметр имеет тип данных PULONG.
 

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

None

Remarks

Драйверы miniport, которые регистрируют прерывание с сигналом сообщения с помощью функции NdisMRegisterInterruptEx , должны предоставлять функцию MiniportMessageInterruptDPC .

NDIS вызывает MiniportMessageInterruptDPC для завершения отложенной обработки прерывания. Драйвер мини-порта может вызывать функцию NdisMQueueDpcEx или NdisMQueueDpc для запроса дополнительных отложенных вызовов процедур (DPCs) для других процессоров.

Драйверы минипорта определяют источник каждого прерывания и принимают соответствующие меры. Например, если прерывание указывает на завершение операции передачи, драйвер мини-порта завершает ожидающий отправки запрос. Если причиной прерывания является изменение состояния связи, драйвер минипорта указывает новое состояние связи для NDIS. При наличии невыполненных пакетов получения драйвер минипорта указывает пакеты в NDIS.

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

MiniportMessageInterruptDPC вызываетФункция NdisMIndicateReceiveNetBufferLists, указывающая пакеты на текущем процессоре. MiniportMessageInterruptDPC может определить обработку, необходимую для других ЦП, и запросить NDIS для планирования DPC на ЦП, где DPC не является невыполненным.

Если текущий DPC работает на том же ЦП, что иФункция MiniportMessageInterrupt, драйвер miniport должен указывать все пакеты, которые не удалось сопоставить с ЦП. Если этот DPC является последним запланированным DPC и он не будет запрашивать дополнительные DPC, MiniportMessageInterruptDPC должен повторно включить прерывания на сетевом адаптере для указанного сообщения перед возвратом.

Перед вызовом NDIS MiniportMessageInterruptDPC прерывания для указанного сообщения на сетевом адаптере, как правило, были отключены вФункция MiniportMessageInterrupt. Перед возвратом элемента управления MiniportMessageInterruptDPC может повторно вбивать прерывания. Если драйвер мини-порта помещал в очередь дополнительные DPC, пока прерывания были отключены, драйвер должен включить прерывания после последнего выполнения DPC.

Примечание Для повышения производительности драйверы мини-портов должны отключать прерывания только для определенных сообщений. Они не должны отключать все прерывания с сигналом сообщения.
 
Драйверы минипорта должны ограничивать количество буферов получения, которые они указывают при обработке пакета DPC прерывания , чтобы завершить в течение требуемого ограничения времени. Пакет DPC прерываний — это коллекция всех DPC, которые выполняются после ISR и перед повторной записью прерываний.

Драйвер мини-порта может вызывать NdisMDeregisterInterruptEx из функции MiniportInitializeEx или MiniportHaltEx , чтобы освободить ресурсы, выделенные с помощью NdisMRegisterInterruptEx. После возврата NdisMDeregisterInterruptEx NDIS не вызывает функцию MiniportMessageInterrupt или MiniportMessageInterrupt Драйвера минипорта.

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

Примеры

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

Например, чтобы определить функцию MiniportMessageInterruptDPC с именем MyMessageInterruptDPC, используйте тип MINIPORT_MESSAGE_INTERRUPT_DPC , как показано в следующем примере кода:

MINIPORT_MESSAGE_INTERRUPT_DPC MyMessageInterruptDPC;

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

_Use_decl_annotations_
VOID
 MyMessageInterruptDPC(
    NDIS_HANDLE  MiniportInterruptContext,
    ULONG  MessageId,
    PVOID  MiniportDpcContext,
    PVOID  ReceiveThrottleParameters,
    PVOID  NdisReserved2
    )
  {...}

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

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

Требования

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

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

IO_INTERRUPT_MESSAGE_INFO

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterrupt

NDIS_RECEIVE_THROTTLE_PARAMETERS NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NET_BUFFER_LIST

NdisMDeregisterInterruptEx

NdisMIndicateReceiveNetBufferLists

NdisMQueueDpc

NdisMQueueDpcEx

NdisMRegisterInterruptEx

Receive Side Scaling (RSS)