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


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

Подпрограмма InterruptMessageService обслуживает прерывание по сигналу сообщения.

Синтаксис

KMESSAGE_SERVICE_ROUTINE KmessageServiceRoutine;

BOOLEAN KmessageServiceRoutine(
  [in] _KINTERRUPT *Interrupt,
  [in] PVOID ServiceContext,
       ULONG MessageID
)
{...}

Параметры

[in] Interrupt

Указатель на структуру KINTERRUPT для прерывания. Драйвер получил этот указатель в вызове процедуры IoConnectInterruptEx , которая зарегистрировала подпрограмму InterruptMessageService драйвера.

[in] ServiceContext

Значение ServiceContext , переданное драйвером в IoConnectInterruptEx при регистрации подпрограммы InterruptMessageService .

MessageID

Идентификатор сообщения для прерывания. Это значение является индексом для записи прерывания в массиве элементов MessageInfo в структуре IO_INTERRUPT_MESSAGE_INFO , описывающей прерывания драйвера, сигнализированные сообщением.

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

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

Комментарии

Драйверы используют IoConnectInterruptEx для регистрации подпрограммы InterruptMessageService для обработки прерываний, сигнальных сообщением. Впоследствии драйвер может отменить регистрацию подпрограммы, вызвав IoDisconnectInterruptEx. Прерывания с сигналом сообщения поддерживаются, начиная с Windows Vista.

Система может вызывать подпрограмму InterruptMessageService , даже если прерывания подпрограммы не произошло. Например, если прерывание, по сигналу о сообщении, является общим, можно вызвать InterruptMessageService для прерываний, принадлежащих другим устройствам. Подпрограмма должна проверка, совпадает ли значение параметра ServiceContext со значением, переданным в IoConnectInterruptEx. Если значение совпадает, функция InterruptMessageService обрабатывает прерывание и возвращает значение TRUE. В противном случае функция InterruptMessageService не обрабатывает прерывание и возвращает значение FALSE.

Драйвер, использующий MSI (PCI 2.2), должен проверять параметр MessageID , чтобы различать различные сообщения, созданные устройством, так как все они используют один и тот же ресурс прерывания (и, следовательно, один и тот же обратный вызов InterruptMessageService> ).

Обратите внимание, что если система получает несколько одинаковых прерываний в течение короткого интервала времени, она может объединить их в один вызов InterruptMessageService. Подпрограмма должна быть записана для обработки нескольких одинаковых прерываний в одном вызове.

Прерывания, по сигналу сообщения, по поведению аналогичны прерываниям, инициированным ребрами. Устройство отправляет запрос прерывания, но не получает аппаратного подтверждения того, что запрос был получен.

InterruptMessageService выполняется в irQL, превышающем максимальное значение IRQL устройства (DIRQL) для каждого прерывания, выполняемого подпрограммой.

Примеры

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

Например, чтобы определить подпрограмму обратного вызова InterruptMessageService с именем MyInterruptMessageService, используйте тип KMESSAGE_SERVICE_ROUTINE, как показано в следующем примере кода:

KMESSAGE_SERVICE_ROUTINE MyInterruptMessageService;

Затем реализуйте процедуру обратного вызова следующим образом:

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

Тип функции KMESSAGE_SERVICE_ROUTINE определен в файле заголовка Wdm.h. Чтобы более точно определить ошибки при запуске средств анализа кода, не забудьте добавить заметку Use_decl_annotations в определение функции. Заметка Use_decl_annotations гарантирует, что будут использоваться заметки, которые применяются к типу функции KMESSAGE_SERVICE_ROUTINE в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в статье Объявление функций с помощью типов ролей функций для драйверов WDM. Сведения о Use_decl_annotationsсм. в статье Поведение функции с заметками.

Требования

Требование Значение
Минимальная версия клиента См. раздел "Примечания".
Целевая платформа Персональный компьютер
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
IRQL См. раздел "Примечания".

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

Использование дескрипторов ресурсов прерывания

IO_INTERRUPT_MESSAGE_INFO

IoConnectInterruptEx

IoDisconnectInterruptEx