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


Функция IoConnectInterrupt (wdm.h)

Подпрограмма IoConnectInterrupt регистрирует подпрограмму Прерывания (ISR) драйвера устройства, чтобы она вызывалась при прерывании устройства на любом из указанного набора процессоров.

Синтаксис

NTSTATUS IoConnectInterrupt(
  [out]          PKINTERRUPT       *InterruptObject,
  [in]           PKSERVICE_ROUTINE ServiceRoutine,
  [in, optional] PVOID             ServiceContext,
  [in, optional] PKSPIN_LOCK       SpinLock,
  [in]           ULONG             Vector,
  [in]           KIRQL             Irql,
  [in]           KIRQL             SynchronizeIrql,
  [in]           KINTERRUPT_MODE   InterruptMode,
  [in]           BOOLEAN           ShareVector,
  [in]           KAFFINITY         ProcessorEnableMask,
  [in]           BOOLEAN           FloatingSave
);

Параметры

[out] InterruptObject

Указатель на адрес хранилища, предоставленного драйвером, для указателя на набор объектов прерываний. Этот указатель должен передаваться в последующих вызовах KeSynchronizeExecution.

[in] ServiceRoutine

Указатель на точку входа для предоставленной драйвером подпрограммы InterruptService .

[in, optional] ServiceContext

Указатель на определенный драйвером контекст, который будет передан подпрограмме Прерывания Службы при ее вызове. Область ServiceContext должна находиться в резидентной памяти: в расширении устройства объекта устройства, созданного драйвером, в расширении контроллера созданного драйвером объекта контроллера или в неpaged пуле, выделенном драйвером устройства. Дополнительные сведения см. в разделе Предоставление сведений о контексте ISR .

[in, optional] SpinLock

Указатель на инициализированную блокировку спина, для которой драйвер предоставляет хранилище, которое будет использоваться для синхронизации доступа к определяемым драйвером данным, совместно используемым другими подпрограммами драйвера. Этот параметр является обязательным, если ISR обрабатывает несколько векторов или драйвер имеет несколько ISR. В противном случае драйверу не нужно выделять хранилище для блокировки спина прерывания, а входной указатель имеет значение NULL.

[in] Vector

Указывает вектор прерывания, переданный в ресурс прерывания в элементе u.Interrupt.VectorCM_PARTIAL_RESOURCE_DESCRIPTOR.

[in] Irql

Указывает DIRQL, переданный в ресурс прерывания в элементе u.Interrupt.LevelCM_PARTIAL_RESOURCE_DESCRIPTOR.

[in] SynchronizeIrql

Указывает DIRQL, по которому будет выполняться ISR. Если ISR обрабатывает несколько векторов прерываний или драйвер имеет несколько ISR, это значение должно быть самым высоким из значений Irql, переданных в u.Interrupt.Level в каждом ресурсе прерывания. В противном случае значения Irql и SynchronizeIrql идентичны.

[in] InterruptMode

Указывает, является ли прерывание устройства значением LevelSensitive или Latched.

[in] ShareVector

Указывает, является ли вектор прерывания совместно используемым.

[in] ProcessorEnableMask

Задает значение KAFFINITY , представляющее набор процессоров, на которых могут возникать прерывания устройства на этой платформе. Это значение передается в ресурс прерывания по адресу u.Interrupt.Affinity.

[in] FloatingSave

Указывает, следует ли сохранять стек с плавающей запятой при прерывании устройства драйвера. Для платформ на базе x86 и Itanium это значение должно быть равно FALSE. Дополнительные сведения о сохранении состояния с плавающей запятой и MMX см. в разделе Использование с плавающей запятой или MMX в драйвере WDM.

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

IoConnectInterrupt может возвращать одно из следующих значений NTSTATUS:

STATUS_SUCCESS

STATUS_INVALID_PARAMETER: процессоры не указаны.

STATUS_INSUFFICIENT_RESOURCES: Не было достаточно неоплаченного бассейна.

Комментарии

Новые драйверы должны использовать процедуру IoConnectInterruptEx , которая удобнее в использовании. Драйверы для устройств, поддерживающих прерывания с сигналом сообщения (MSI), должны использовать IoConnectInterruptEx.

Драйвер PnP должен вызвать IoConnectInterrupt при запуске устройства, прежде чем он завершит запрос IRP_MN_START_DEVICE PnP.

Когда драйвер получает запрос IRP_MN_START_DEVICE , драйвер получает необработанные и преобразованные аппаратные ресурсы в элементах Parameters.StartDevice.AllocatedResources и Parameters.StartDevice.AllocatedResourcesTranslated структуры IRP IO_STACK_LOCATION соответственно. Чтобы подключить прерывание, драйвер использует ресурсы в allocatedResourcesTranslated.List.PartialResourceList.PartialDescriptors[]. Драйвер должен проверить массив частичных дескрипторов на наличие ресурсов типа CmResourceTypeInterrupt.

Если драйвер предоставляет хранилище для SpinLock, он должен вызвать KeInitializeSpinLock перед передачей блокировки спина прерывания в IoConnectInterrupt.

При возвращении из успешного вызова IoConnectInterrupt можно вызвать ISR вызывающего объекта, если на устройстве драйвера включены прерывания или если для ShareVector задано значение TRUE. Драйверы не должны включать прерывания до тех пор, пока не будет возвращено значение IoConnectInterrupt .

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 2000.
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Правила соответствия DDI HwStorPortProhibitedDIs(storport), IrqlIoPassive2(wdm), PowerIrpDDis(wdm)

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

CM_PARTIAL_RESOURCE_DESCRIPTOR

IO_STACK_LOCATION

IoDisconnectInterrupt

KeInitializeSpinLock

KeSynchronizeExecution