функция обратного вызова KSERVICE_ROUTINE (wdm.h)

Подпрограмма InterruptService (ISR) быстро обслуживает прерывание устройства и при необходимости планирует обработку полученных данных после прерывания.

Синтаксис

KSERVICE_ROUTINE KserviceRoutine;

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

Параметры

[in] Interrupt

Предоставленный вызывающим оператором указатель на структуру KINTERRUPT для прерывания.

[in] ServiceContext

Предоставленный вызывающим объектом указатель на сведения о контексте, указанные в предыдущем вызове IoConnectInterrupt или IoConnectInterruptEx.

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

Если подпрограмма определяет, что прерывание произошло не с одного из устройств драйвера, она должна возвращать значение FALSE. В противном случае подпрограмма должна обслуживать прерывание и возвращать значение TRUE.

Комментарии

Чтобы зарегистрировать ISR для определенного вектора прерываний и сходства процессора, драйвер должен вызвать IoConnectInterrupt или IoConnectInterruptEx.

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

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

ISR должен сначала определить, было ли прерывание вызвано одним из устройств драйвера, путем проверки контекстной информации, предоставленной context. Если прерывание происходит не на одном из устройств драйвера, подпрограмма должна немедленно возвращать значение FALSE , чтобы диспетчер ввода-вывода смог вызвать другие драйверы, зарегистрированные isr для того же процессора и вектора прерывания.

Дополнительные сведения о реализации ISR см. в разделе Подпрограммы службы прерываний.

Примеры

Чтобы определить подпрограмму обратного вызова Прерывания Службы , необходимо сначала предоставить объявление функции, определяющее тип определяемой процедуры обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с помощью типов функций обратного вызова помогает анализу кода для драйверов, средству проверки статических драйверов (SDV) и другим средствам проверки находить ошибки, и это требование для написания драйверов для операционной системы Windows.

Например, чтобы определить подпрограмму обратного вызова InterruptService с именем 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 (см. раздел "Примечания").