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

NDIS вызывает функцию MiniportMessageInterrupt , когда сетевой адаптер создает прерывание на основе сообщений.

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

Синтаксис

MINIPORT_MESSAGE_INTERRUPT MiniportMessageInterrupt;

BOOLEAN MiniportMessageInterrupt(
  [in]  NDIS_HANDLE MiniportInterruptContext,
  [in]  ULONG MessageId,
  [out] PBOOLEAN QueueDefaultInterruptDpc,
  [out] PULONG TargetProcessors
)
{...}

Параметры

[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 .

[out] QueueDefaultInterruptDpc

Указатель на логическую переменную, которую драйвер мини-порта задает перед возвратом из этого вызова. Драйвер мини-порта устанавливает для этого значения значение TRUE , чтобы указать, что драйверу требуется DPC на ЦП по умолчанию (текущий). Если задано значение TRUE, NDIS игнорирует значение параметра TargetProcessors . Если задано значение FALSE, NDIS использует значение параметра TargetProcessors для планирования DPC.

[out] TargetProcessors

Битовая маска, указывающая целевые процессоры, для которых NDIS должен запланировать DPC. Эта битовая маска представляет первые 32 процессора в группе процессоров 0. Каждый бит в битовой маске идентифицирует ЦП. Если вызывающий объект задает бит 0, NDIS планирует DPC для ЦП 0. Если вызывающий объект задает бит 1, NDIS планирует DPC для ЦП 1 и т. д.

Примечание Драйверы NDIS 6.20 и более поздних версий не должны использовать этот параметр для планирования DPC. Вместо этого они должны задать для этого параметра нулевое значение и использовать функцию NdisMQueueDpcEx для планирования DPC.
 

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

MiniportMessageInterrupt возвращает значение TRUE , если основной сетевой адаптер создал прерывание; в противном случае возвращается значение FALSE.

Комментарии

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

Драйвер минипорта должен выполнять как можно меньше работы в своей функции MiniportMessageInterrupt . Он должен отложить операции ввода-вывода для прерываний, создаваемых сетевым адаптером, в Функция MiniportMessageInterruptDPC .

Когда сетевой адаптер создает MSI, NDIS вызывает функцию MiniportMessageInterrupt драйвера мини-порта.

MiniportMessageInterrupt сохраняет необходимые сведения о состоянии прерывания и откладывает как можно больше операций ввода-вывода в Функция MiniportMessageInterruptDPC .

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

Драйвер мини-порта должен установить для параметра QueueDefaultInterruptDpc значение TRUE , чтобы запланировать DPC только для ЦП по умолчанию. Драйвер может сделать это, например, если:

  • Сетевой адаптер создал прерывание, чтобы сообщить о завершении операции отправки или любого другого запроса, который не выполняется на других ЦП.
  • Сетевой адаптер создал прерывание для передачи сигналов о полученных данных, и драйвер мини-порта не может обработать полученные пакеты в отдельных DPC.
  • Прерывание указывает, что полученные пакеты и драйвер минипорта может обрабатывать полученные пакеты в отдельных DPC, но масштабирование на стороне приема (RSS) не включено для драйвера минипорта. Дополнительные сведения см. в разделе OID_GEN_RECEIVE_SCALE_CAPABILITIES и OID_GEN_RECEIVE_SCALE_PARAMETERS.
  • Для драйвера мини-порта включено масштабирование на стороне приема, и драйвер минипорта может создавать различные сообщения в каждой очереди получения.
Если драйвер мини-порта обрабатывает полученные пакеты в отдельных DPC, драйвер мини-порта устанавливает для параметра QueueDefaultInterruptDpc значение FALSE. Драйвер мини-порта должен задать бит TargetProcessors для ЦП, связанного с каждой очередью непустого получения. NDIS запланирует DPC на каждом из указанных ЦП в группе процессоров 0.

Если MiniportMessageInterrupt использует ресурсы для указанного сообщения, например регистры сетевой карты или переменные состояния, с другой функцией MiniportXxx, которая выполняется на более низком уровне IRQL, эта функция MiniportXxx должна вызвать Функция NdisMSynchronizeWithInterruptEx . Это гарантирует, что функция MiniportSynchronizeMessageInterrupt драйвера будет обращаться к общим ресурсам синхронизированным и многопроцессорным способом.

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

NDIS вызывает MiniportMessageInterrupt в DIRQL MSI, зарегистрированном драйвером miniport в предыдущем вызове NdisMRegisterInterruptEx. Таким образом, MiniportMessageInterrupt должен вызывать подмножество функций NDIS, таких как NdisRawXxx или NdisRead/WriteRegisterXxx , которые можно безопасно вызывать в любом IRQL.

Примеры

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

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

MINIPORT_MESSAGE_INTERRUPT MyMessageInterrupt;

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

_Use_decl_annotations_
BOOLEAN
 MyMessageInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    ULONG  MessageId,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

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

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

Требования

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

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

IO_INTERRUPT_MESSAGE_INFO

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterruptDPC

MiniportSynchronizeMessageInterrupt

NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

Receive Side Scaling (RSS)