IoConnectInterrupt 函数 (wdm.h)

IoConnectInterrupt 例程注册设备驱动程序的 InterruptService 例程(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

指向驱动程序确定的上下文的指针,该上下文将在调用时提供给 InterruptService 例程。 ServiceContext 区域必须位于驻留内存中:在驱动程序创建的设备对象的设备扩展、驱动程序创建的控制器对象的控制器扩展或设备驱动程序分配的非分页池中。 有关详细信息,请参阅 提供 ISR 上下文信息

[in, optional] SpinLock

指向驱动程序提供存储的初始化旋转锁的指针,该锁将用于同步对其他驱动程序例程共享的驱动程序确定数据的访问。 如果 ISR 处理多个向量或驱动程序有多个 ISR,则此参数是必需的。 否则,驱动程序不需要为中断旋转锁分配存储,输入指针 NULL

[in] Vector

指定在 u.Interrupt.Vector 成员 CM_PARTIAL_RESOURCE_DESCRIPTOR的中断资源中传递的中断向量。

[in] Irql

指定在 CM_PARTIAL_RESOURCE_DESCRIPTORu.Interrupt.Level 成员处传入的中断资源中的 DIRQL。

[in] SynchronizeIrql

指定 ISR 将在其上运行的 DIRQL。 如果 ISR 处理多个中断向量或驱动程序具有多个 ISR,则此值必须是每个中断资源中 u.Interrupt.Level 传递的 Irql 值中最高的值。 否则,IrqlSynchronizeIrql 值相同。

[in] InterruptMode

指定设备中断是 LevelSensitive 还是 闩锁

[in] ShareVector

指定中断向量是否可共享。

[in] ProcessorEnableMask

指定一个 KAFFINITY 值,该值表示在此平台上可能发生设备中断的处理器集。 此值在 u.Interrupt.Affinity传入中断资源。

[in] FloatingSave

指定驱动程序的设备中断时是否保存浮点堆栈。 对于基于 x86 的平台和基于 Itanium 的平台,此值必须设置为 FALSE。 有关保存浮点和 MMX 状态的详细信息,请参阅 在 WDM 驱动程序中使用浮点或 MMX。

返回值

IoConnectInterrupt 可以返回以下 NTSTATUS 值之一:

STATUS_SUCCESS

STATUS_INVALID_PARAMETER:未指定处理器。

STATUS_INSUFFICIENT_RESOURCES:没有足够的非分页池。

言论

新驱动程序应使用 IoConnectInterruptEx 例程,这更易于使用。 支持消息信号中断(MSI)的设备驱动程序必须使用 IoConnectInterruptEx

在完成 PnP IRP_MN_START_DEVICE 请求之前,PnP 驱动程序应调用 IoConnectInterrupt 作为设备启动的一部分。

当驱动程序收到 IRP_MN_START_DEVICE 请求时,驱动程序将分别接收 Parameters.StartDevice.AllocatedResourcesParameters.StartDevice.AllocatedResourcesTranslated IRP IO_STACK_LOCATION 结构的成员中的原始硬件资源。 为了连接中断,驱动程序使用 AllocatedResourcesTranslated.List.PartialResourceList.PartialDescriptors[]的资源。 驱动程序必须扫描部分描述符数组,以获取类型为 CmResourceTypeInterrupt的资源。

如果驱动程序为 SpinLock提供存储,则必须先调用 KeInitializeSpinLock,然后再将其中断旋转锁传递给 IoConnectInterrupt

从成功调用 IoConnectInterrupt返回时,如果驱动程序设备上启用了中断,或者 ShareVector 设置为 TRUE,则可以调用调用者的 ISR。 驱动程序在 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