Поделиться через


функция обратного вызова 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 для планирования ЦП. Если QueueDefaultInterruptDpc имеет значение TRUE, NDIS запланирует DPC независимо от возвращаемого значения из MiniportInterrupt.

[out] TargetProcessors

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

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

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

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

Код возврата Description
ИСТИННЫЙ

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

ЛОЖНЫЙ

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

 
Заметка NDIS будет очереди DPCs на основе значений, указанных в параметрах QueueDefaultInterruptDpc и TargetProcessors независимо от значения, возвращаемого MiniportInterrupt . Однако MiniportInterrupt по-прежнему должен возвращать правильное значение.
 

Замечания

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

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

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

Все сетевые адаптеры могут совместно использовать прерывания на основе строк с другими устройствами на шине ввода-вывода. Если сетевой адаптер не создал прерывание, MiniportInterrupt должен немедленно вернуть значение FALSE , чтобы система может вызвать драйвер устройства, создающего прерывание. Если параметр QueueDefaultInterruptDpc имеет значение FALSE , а параметр TargetProcessors имеет значение нулю, NDIS не запланирует какие-либо ЦП. В противном случае NDIS запланирует DPCs независимо от значения переключенияMiniportInterruptиз MiniportInterrupt.

Если прерывание предназначено для сетевой карты, MiniportInterrupt закрывает прерывание сетевого адаптера, сохраняет любое состояние, которое должно быть связано с прерыванием, и откладывает столько обработки ввода-вывода, сколько возможно для функции MiniportInterruptDPC .

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

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

  • Сетевой адаптер создал прерывание, чтобы сигнализировать о завершении операции отправки или любом другом запросе, который не выполняется на других ЦП.
  • Сетевой адаптер создал прерывание для сигнала о полученных данных, а драйвер минипорта не может обрабатывать полученные пакеты в отдельных ЦП.
  • Прерывание указывает, что полученные пакеты и драйвер минипорта может обрабатывать полученные пакеты в отдельных ЦП, но масштабирование на стороне получения (RSS) не включено для мини-драйвера. Дополнительные сведения см. в разделе OID_GEN_RECEIVE_SCALE_CAPABILITIES и OID_GEN_RECEIVE_SCALE_PARAMETERS.
Если мини-драйвер обрабатывает полученные пакеты в отдельных ЦП, драйвер задает параметр QueueDefaultInterruptDpcзначение FALSE. Мини-драйвер должен задать бит TargetProcessors для ЦП, связанного с каждой очередью получения nonempty. NDIS запланирует DPC на каждом из указанных ЦП.
Заметка NDIS будет очереди DPCs на основе значений, указанных в параметрах QueueDefaultInterruptDpc и TargetProcessors независимо от значения, возвращаемого MiniportInterrupt . Однако MiniportInterrupt по-прежнему должен возвращать правильное значение.
 
Если MiniportInterrupt использует ресурсы, такие как регистры сетевого адаптера или переменные состояния, с другой функцией MiniportXxx, которая выполняется в более низкой среде IRQL, эта функция MiniportXx должна вызвать функцию MiniportXxxФункция NdisMSynchronizeWithInterruptEx. Это гарантирует, что функция MiniportSynchronizeInterrupt драйвера обращается к общим ресурсам в синхронизированном и многопроцессорном режиме.

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

NDIS вызывает MiniportInterrupt на DIRQL прерывания, зарегистрированного в предыдущем вызове NdisMRegisterInterruptEx. Таким образом, MiniportInterrupt должен вызывать подмножество функций NDIS, таких как функции NdisRawXxx или NdisRead/WriteRegister Xxx, которые безопасно вызывать на любой 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 (include 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

Масштабирование на стороне получения (RSS)