IoConnectInterrupt 函数 (wdm.h)
IoConnectInterrupt 例程 (ISR) 注册设备驱动程序的 InterruptService 例程,以便在设备在任何指定的处理器集上中断时调用它。
语法
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
指定在CM_PARTIAL_RESOURCE_DESCRIPTOR的 u.Interrupt.Vector 成员处的中断资源中传递的中断向 量。
[in] Irql
指定在 CM_PARTIAL_RESOURCE_DESCRIPTOR 的 u.Interrupt.Level 成员处的中断资源中 传递的 DIRQL。
[in] SynchronizeIrql
指定运行 ISR 的 DIRQL。 如果 ISR 处理多个中断向量或驱动程序具有多个 ISR,则此值必须是每个中断资源中 u.Interrupt.Level 传递的 Irql 值的最高值。 否则, Irql 和 SynchronizeIrql 值是相同的。
[in] InterruptMode
指定设备中断是 LevelSensitive 还是 Latched。
[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 请求时,驱动程序将分别接收 IRP IO_STACK_LOCATION 结构的 Parameters.StartDevice.AllocatedResources 和 Parameters.StartDevice.AllocatedResourcesTranslated 成员中的原始 和 已转换的硬件资源。 为了连接其中断,驱动程序使用 AllocatedResourcesTranslated.List.PartialResourceList.PartialDescriptors[] 中的资源。 驱动程序必须扫描部分描述符数组中 CmResourceTypeInterrupt 类型的资源。
如果驱动程序为 SpinLock 提供存储,则必须先调用 KeInitializeSpinLock ,然后才能将其中断旋转锁传递给 IoConnectInterrupt。
从成功调用 IoConnectInterrupt 返回后,如果在驱动程序的设备上启用了中断,或者 ShareVector 设置为 TRUE,则可以调用调用方 ISR。 在 IoConnectInterrupt 返回之前,驱动程序不得启用中断。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 通用 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDDI (storport) 、 IrqlIoPassive2 (wdm) 、 PowerIrpDDis (wdm) |