функция обратного вызова MINIPORT_ISR (ndis.h)
NDIS вызывает функцию MiniportInterrupt , когда сетевой адаптер или другое устройство, которое совместно использует прерывание с сетевой картой, создает прерывание.
Синтаксис
MINIPORT_ISR MiniportIsr;
BOOLEAN MiniportIsr(
[in] NDIS_HANDLE MiniportInterruptContext,
[out] PBOOLEAN QueueDefaultInterruptDpc,
[out] PULONG TargetProcessors
)
{...}
Параметры
[in] MiniportInterruptContext
Дескриптор для блока сведений о контексте прерывания. Драйвер мини-порта предоставил этот дескриптор в параметре MiniportInterruptContext , который драйвер мини-порта передал вФункция NdisMRegisterInterruptEx.
[out] QueueDefaultInterruptDpc
Указатель на переменную BOOLEAN, которую драйвер мини-порта задает перед возвратом из этого вызова. Драйвер мини-порта устанавливает для этого значения значение TRUE , чтобы указать, что драйверу требуется DPC на ЦП по умолчанию (текущий). Если для этого значения задано значение TRUE, NDIS игнорирует значение параметра TargetProcessors . Если задано значение FALSE, NDIS использует значение параметра TargetProcessors для планирования DPC. Если параметр QueueDefaultInterruptDpc имеет значение TRUE, NDIS запланирует DPC независимо от возвращаемого значения miniportInterrupt.
[out] TargetProcessors
Битовая маска, указывающая целевые процессоры, для которых NDIS должен запланировать DPC. Эта битовая маска представляет первые 32 процессора в группе процессоров 0. Каждый бит в битовой маске идентифицирует ЦП. Если вызывающий объект задает бит 0, NDIS планирует DPC для ЦП 0. Если вызывающий объект задает бит 1, NDIS планирует DPC для ЦП 1 и т. д. Если параметр QueueDefaultInterruptDpc имеет значение FALSE , а targetProcessors — нулевое значение, NDIS не будет планировать какие-либо DPC. В противном случае NDIS будет планировать DPC независимо от возвращаемого значения miniportInterrupt.
Возвращаемое значение
MiniportInterrupt возвращает одно из следующих значений:
Код возврата | Описание |
---|---|
|
MiniportInterrupt определил, что базовое сетевое адаптер создало прерывание. |
|
MiniportInterrupt определил, что базовый сетевой адаптер не создавал прерывание. |
Комментарии
Драйверы минипорта, которые регистрируют прерывание с помощью функции NdisMRegisterInterruptEx, должны предоставлять функцию MiniportInterrupt .
Драйвер мини-порта должен выполнять как можно меньше работы в своей функции MiniportInterrupt . Он должен отложить операции ввода-вывода для прерываний, создаваемых сетевым адаптером, для функции MiniportInterruptDPC .
Когда прерывание происходит в строке прерывания сетевого адаптера, NDIS вызывает функцию MiniportInterrupt драйвера miniport.
Все сетевые адаптеры могут совместно использовать прерывания на основе строк с другими устройствами в шине ввода-вывода. Если сетевой адаптер не создал прерывание, MiniportInterrupt должен немедленно вернуть значение FALSE , чтобы система пустила вызов драйвера устройства, создающего прерывание. Если параметр QueueDefaultInterruptDpc имеет значение FALSE , а параметр TargetProcessors имеет значение 0, NDIS не будет планировать какие-либо DPC. В противном случае NDIS запланирует DPC независимо от значения поворачиванияre MiniportInterruptиз MiniportInterrupt.
Если прерывание предназначено для сетевого адаптера, MiniportInterrupt закрывает прерывание в сетевом адаптере, сохраняет состояние прерывания и откладывает как можно больше операций ввода-вывода на функцию MiniportInterruptDPC .
Если базовый сетевой адаптер создал указанное прерывание и драйвер минипорта запросит отложенные вызовы процедур (DPC), драйвер мини-порта должен отключить все дальнейшие прерывания сетевого адаптера и повторно включить прерывания после завершения всех DPC.
Драйвер мини-порта должен установить для параметра QueueDefaultInterruptDpc значение TRUE , чтобы запланировать DPC только для ЦП по умолчанию. Драйвер может сделать это, например, если:
- Сетевой адаптер создал прерывание, чтобы сообщить о завершении операции отправки или любого другого запроса, который не выполняется на других ЦП.
- Сетевой адаптер создал прерывание для передачи сигналов о полученных данных, и драйвер мини-порта не может обработать полученные пакеты в отдельных DPC.
- Прерывание указывает, что полученные пакеты и драйвер минипорта может обрабатывать полученные пакеты в отдельных DPC, но масштабирование на стороне приема (RSS) не включено для драйвера минипорта. Дополнительные сведения см. в разделе OID_GEN_RECEIVE_SCALE_CAPABILITIES и OID_GEN_RECEIVE_SCALE_PARAMETERS.
Драйвер мини-порта может вызватьФункция NdisMDeregisterInterruptEx из функции MiniportInitializeEx или MiniportHaltEx для освобождения ресурсов, выделенных с помощью NdisMRegisterInterruptEx. После возврата NdisMDeregisterInterruptEx NDIS не вызывает функцию MiniportInterrupt или MiniportInterruptDPC драйвера мини-порта.
NDIS вызывает MiniportInterrupt в DIRQL прерывания, зарегистрированного драйвером мини-порта в предыдущем вызове NdisMRegisterInterruptEx. Таким образом, MiniportInterrupt должен вызывать подмножество функций NDIS, таких как функции NdisRawXxx или NdisRead/WriteRegisterXxx , которые можно безопасно вызывать в любой IRQL.
Примеры
Чтобы определить функцию MiniportInterrupt , необходимо сначала предоставить объявление функции, определяющее тип определяемой функции. Windows предоставляет набор типов функций для драйверов. Объявление функции с помощью типов функций помогает анализу кода для драйверов, средству проверки статических драйверов (SDV) и другим средствам проверки находить ошибки, и это требование для написания драйверов для операционной системы Windows.Например, чтобы определить функцию MiniportInterrupt с именем MyInterrupt, используйте тип MINIPORT_ISR , как показано в этом примере кода:
MINIPORT_ISR MyInterrupt;
Затем реализуйте функцию следующим образом:
_Use_decl_annotations_
BOOLEAN
MyInterrupt(
NDIS_HANDLE MiniportInterruptContext,
PBOOLEAN QueueDefaultInterruptDpc,
PULONG TargetProcessors
)
{...}
Тип функции MINIPORT_ISR определен в файле заголовка Ndis.h. Чтобы более точно определить ошибки при запуске средств анализа кода, обязательно добавьте заметку Use_decl_annotations в определение функции. Заметка Use_decl_annotations гарантирует использование заметок, которые применяются к типу функции MINIPORT_ISR в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в разделе Объявление функций с помощью типов ролей функций для драйверов NDIS.
Сведения о Use_decl_annotations см. в статье О поведении функции.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Поддерживается в NDIS 6.0 и более поздних версиях. |
Целевая платформа | Windows |
Header | ndis.h (включая Ndis.h) |
IRQL | См. раздел "Примечания" |