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

NDIS вызывает функцию MiniportInterrupt , когда сетевой адаптер или другое устройство, которое совместно использует прерывание с сетевой картой, создает прерывание.

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

Синтаксис

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.

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

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

MiniportInterrupt возвращает одно из следующих значений:

Код возврата Описание
ИСТИННЫЙ

MiniportInterrupt определил, что базовое сетевое адаптер создало прерывание.

ЛОЖНЫХ

MiniportInterrupt определил, что базовый сетевой адаптер не создавал прерывание.

 
Примечание NDIS будет ставить В очередь DPC на основе значений, указанных в параметрах QueueDefaultInterruptDpc и TargetProcessors , независимо от значения, возвращаемого 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.
Если драйвер мини-порта обрабатывает полученные пакеты в отдельных DPC, драйвер устанавливает для параметра QueueDefaultInterruptDpc значение FALSE. Драйвер мини-порта должен задать бит TargetProcessors для ЦП, связанного с каждой очередью непустого получения. NDIS запланирует DPC на каждом из указанных ЦП.
Примечание NDIS будет ставить В очередь DPC на основе значений, указанных в параметрах QueueDefaultInterruptDpc и TargetProcessors , независимо от значения, возвращаемого MiniportInterrupt . Однако MiniportInterrupt по-прежнему должен возвращать правильное значение.
 
Если MiniportInterrupt совместно использует ресурсы, такие как регистры сетевого адаптера или переменные состояния, с другой функцией MiniportXxx, которая выполняется на более низком уровне IRQL, эта функция MiniportXxx должна вызвать Функция NdisMSynchronizeWithInterruptEx . Это гарантирует, что функция MiniportSynchronizeInterrupt драйвера будет обращаться к общим ресурсам синхронизированным и многопроцессорным способом.

Драйвер мини-порта может вызватьФункция 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 См. раздел "Примечания"

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

MiniportHaltEx

MiniportInitializeEx

MiniportInterruptDPC

MiniportSynchronizeInterrupt NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

Receive Side Scaling (RSS)