функция обратного вызова MINIPORT_MESSAGE_INTERRUPT (ndis.h)
NDIS вызывает функцию MiniportMessageInterrupt , когда сетевой адаптер создает прерывание на основе сообщений.
Синтаксис
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 и т. д.
Возвращаемое значение
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.
- Для драйвера мини-порта включено масштабирование на стороне приема, и драйвер минипорта может создавать различные сообщения в каждой очереди получения.
Если 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_ENTRYMiniportSynchronizeMessageInterrupt
NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS