Обработка прерывания MSI

NDIS вызывает функцию MiniportMessageInterrupt, когда сетевой адаптер генерирует прерывание. Параметр MessageId в этой функции определяет сообщение MSI-X.

MiniportMessageInterrupt всегда должен возвращать TRUE после обработки прерывания, так как прерывания сообщения не являются общими.

Минипорт-драйвер должен выполнять как можно меньше работы в функции MiniportMessageInterrupt. Драйвер должен отложить операции ввода-вывода в функцию MiniportMessageInterruptDpc, которую NDIS вызывает для завершения отложенной обработки прерывания.

Чтобы поставить в очередь дополнительные отложенные вызовы процедур (DPC) после того, какMiniportMessageInterrupt вернёт управление, драйвер минипорта задаёт биты параметра TargetProcessors функции MiniportMessageInterrupt. Чтобы запросить дополнительные DPC из MiniportMessageInterrupt или MiniportMessageInterruptDPC, драйвер минипорта может вызывать функцию NdisMQueueDpc.

Драйвер минипорта может вызывать NdisMQueueDpc для запроса дополнительных DPC для других процессоров.

NDIS 6.1 и более поздних версий гарантирует, что отложенные вызовы процедур (DPC) для различных сообщений, которые запланированы для одного ЦП, помещаются в очередь отдельно. Например, если минипорт-драйвер планирует два DPC одновременно на ЦП 1 (один DPC для сообщения 0 и другой DPC для сообщения 1), два DPC помещаются в очередь для ЦП 1 (один DPC с сообщением 0 и другой DPC с сообщением 1).

NDIS также гарантирует, что DPC для одного сообщения, которые запланированы на разных ЦП, помещаются в очередь отдельно. Например, если драйвер мини-порта назначает два DPC (один DPC на процессоре 0 для сообщения 0 и один DPC на процессоре 1 для сообщения 0), в очередь на процессоре 0 и процессоре 1 помещаются два отдельных DPC, оба для сообщения 0.