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


Использование версии CONNECT_MESSAGE_BASED IoConnectInterruptEx

Для Операционных систем Windows Vista и более поздних версий драйвер может использовать CONNECT_MESSAGE_BASED версию IoConnectInterruptEx для регистрации ISR для прерываний драйвера, сигнализуемых сообщением. Драйвер задает значение CONNECT_MESSAGE_BASED для Parameters-Version> и использует члены Parameters-MessageBased> для указания других параметров операции.

  • Parameters-MessageBased.PhysicalDeviceObject> указывает PDO для устройства, которое обслуживает ISR. Система использует объект устройства для автоматической идентификации прерываний устройства, сигнальных сообщением.

  • Parameters-MessageBased.MessageServiceRoutine> указывает на подпрограмму InterruptMessageService, а Parameters-MessageBased.ServiceContext> указывает значение, которое система передает в качестве параметра ServiceContext в InterruptMessageService. Драйвер может использовать его для передачи контекстных сведений. Дополнительные сведения о передаче сведений о контексте см. в статье Предоставление сведений о контексте ISR.

  • Драйвер также может указать резервную подпрограмму InterruptMessageService в Parameters-MessageBased.FallBackServiceRoutine>. Если на устройстве есть прерывания на основе строк, но нет прерываний по сигналу сообщения, система будет регистрировать подпрограмму InterruptMessageService для обслуживания прерываний на основе строк. В этом случае система передает Parameters-MessageBased.ServiceContext> в качестве параметра ServiceContextв файл InterruptService. IoConnectInterruptEx обновляет Parameters-Version>, чтобы CONNECT_LINE_BASED, если она зарегистрировала резервную подпрограмму.

  • Parameters-MessageBased.ConnectionContext> указывает на переменную, которая получает указатель на структуру IO_INTERRUPT_MESSAGE_INFO (для InterruptMessageService) или структуру KINTERRUPT (для InterruptService). Драйвер может использовать полученный указатель для удаления ISR. Дополнительные сведения см. в разделе Удаление ISR.

  • При необходимости драйверы могут указать спин-блокировку в Parameters-MessageBased.SpinLock> для использования системой при синхронизации с ISR. Большинство драйверов могут просто указать значение NULL , чтобы система могла выделить спин-блокировку от имени драйвера. Дополнительные сведения о синхронизации с ISR см. в разделе Синхронизация доступа к данным устройства.

В следующем примере кода показано, как зарегистрировать подпрограмму InterruptMessageService с помощью CONNECT_MESSAGE_BASED.

IO_CONNECT_INTERRUPT_PARAMETERS params;

// deviceExtension is a pointer to the driver's device extension. 
//     deviceExtension->IntInfo is a PVOID.
//     deviceExtension->IntType is a ULONG.
// deviceInterruptService is a pointer to the driver's InterruptService routine.
// deviceInterruptMessageService is a pointer to the driver's InterruptMessageService routine.
// PhysicalDeviceObject is a pointer to the device's PDO. 
// ServiceContext is a pointer to driver-specified context for the ISR.

RtlZeroMemory( &params, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_MESSAGE_BASED;
params.MessageBased.PhysicalDeviceObject = PhysicalDeviceObject;
params.MessageBased.MessageServiceRoutine = deviceInterruptMessageService;
params.MessageBased.ServiceContext = ServiceContext;
params.MessageBased.SpinLock = NULL;
params.MessageBased.SynchronizeIrql = 0;
params.MessageBased.FloatingSave = FALSE;
params.MessageBased.FallBackServiceRoutine = deviceInterruptService;

status = IoConnectInterruptEx(&params);

if (NT_SUCCESS(status)) {
    // We record the type of ISR registered.
    devExt->IsrType = params.Version;
} else {
    // Operation failed. Handle error.
    ...
}