KSERVICE_ROUTINE回调函数 (wdm.h)

InterruptService 例程(ISR)可根据需要快速处理设备中断并计划接收数据的中断后处理。

语法

KSERVICE_ROUTINE KserviceRoutine;

BOOLEAN KserviceRoutine(
  [in] _KINTERRUPT *Interrupt,
  [in] PVOID ServiceContext
)
{...}

参数

[in] Interrupt

调用方提供的指向中断 KINTERRUPT 结构的指针。

[in] ServiceContext

调用方提供的指向上下文信息的指针,在上一次调用 ioConnectInterruptIoConnectInterruptEx中指定的上下文信息。

返回值

如果例程确定中断不是来自某个驱动程序的设备,则必须返回 FALSE。 否则,例程必须服务中断并返回 true

言论

若要为特定的中断向量和处理器相关性注册 ISR,驱动程序必须调用 IoConnectInterruptIoConnectInterruptEx

驱动程序的 InterruptService 例程 (ISR) 在中断上下文中(在某些系统分配的 DIRQL)中执行,由 SynchronizeIrql 参数指定的 IoConnectInterrupt。 (其他具有较高 DIRQL 值的设备可能会中断 ISR。

在系统调用 ISR 之前,它会获取中断的旋转锁(SpinLock 参数 IoConnectInterrupt),因此 ISR 不能同时在另一个处理器上执行。 ISR 返回后,系统将释放旋转锁。

ISR 必须首先通过检查 上下文提供的上下文信息来确定中断是否来自某个驱动程序的设备。 如果中断不是来自某个驱动程序的设备,则例程必须立即返回 FALSE,以便 I/O 管理器可以调用已注册同一处理器和中断向量的其他驱动程序。

有关实现 ISR 的详细信息,请参阅 中断服务例程

例子

若要定义 InterruptService 回调例程,必须先提供一个函数声明,用于标识要定义的回调例程的类型。 Windows 为驱动程序提供一组回调函数类型。 使用回调函数类型声明函数有助于 驱动程序代码分析静态驱动程序验证程序(SDV)和其他验证工具查找错误,这是为 Windows作系统编写驱动程序的要求。

例如,若要定义名为 MyInterruptService 回调例程,请使用KSERVICE_ROUTINE类型,如以下代码示例所示:

KSERVICE_ROUTINE MyInterruptService;

然后,按如下所示实现回调例程:

_Use_decl_annotations_
BOOLEAN
  MyInterruptService(
    struct _KINTERRUPT  *Interrupt,
    PVOID  ServiceContext
    )
  {
      // Function body
  }

KSERVICE_ROUTINE函数类型在 Wdm.h 头文件中定义。 若要在运行代码分析工具时更准确地识别错误,请务必将 _Use_decl_annotations_ 注释添加到函数定义。 _Use_decl_annotations_ 批注可确保使用应用于头文件中KSERVICE_ROUTINE函数类型的注释。 有关函数声明要求的详细信息,请参阅 使用 WDM 驱动程序的函数角色类型来声明函数。 有关 _Use_decl_annotations_的信息,请参阅 批注函数行为

要求

要求 价值
目标平台 桌面
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
IRQL 在 DIRQL 中调用(请参阅“备注”部分)。