Использование версии 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( ¶ms, 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(¶ms);
if (NT_SUCCESS(status)) {
// We record the type of ISR registered.
devExt->IsrType = params.Version;
} else {
// Operation failed. Handle error.
...
}