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


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

Для операционных систем Windows Vista и более поздних версий драйвер может использовать CONNECT_LINE_BASED версию IoConnectInterruptEx , чтобы зарегистрировать подпрограмму InterruptService для прерываний драйвера на основе строки. (Драйвер для более ранних операционных систем может использовать CONNECT_FULLY_SPECIFIED версию IoConnectInterruptEx.)

Примечание Этот метод можно использовать только для драйверов, которые регистрируют одну подпрограмму обслуживания прерываний (ISR) для всех ее прерываний на основе строк. Если драйвер может получать несколько прерываний, он должен использовать CONNECT_FULLY_SPECIFIED версию IoConnectInterruptEx.

Драйвер задает значение CONNECT_LINE_BASED в параметре Parameters-Version> и использует членыParameters-LineBased> для указания других параметров операции:

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

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

  • Драйвер предоставляет указатель на переменную PKINTERRUPT в Parameters-LineBased.InterruptObject>. IoConnectInterruptEx задает эту переменную, указывающую на объект прерывания для прерывания, который можно использовать при удалении ISR. Дополнительные сведения см. в разделе Удаление ISR.

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

В следующем примере кода показано, как зарегистрировать подпрограмму InterruptService с помощью CONNECT_LINE_BASED:

IO_CONNECT_INTERRUPT_PARAMETERS params;

// deviceExtension is a pointer to the driver's device extension. 
//     deviceExtension->IntObj is a PKINTERRUPT.
// deviceInterruptService is a pointer to the driver's InterruptService 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_LINE_BASED;
params.LineBased.PhysicalDeviceObject = PhysicalDeviceObject;
params.LineBased.InterruptObject = &deviceExtension->IntObj;
params.LineBased.ServiceRoutine = deviceInterruptService;
params.LineBased.ServiceContext = ServiceContext;
params.LineBased.SpinLock = NULL;
params.LineBased.SynchronizeIrql = 0;
params.LineBased.FloatingSave = FALSE;

status = IoConnectInterruptEx(&params);

if (!NT_SUCCESS(status)) {
    // Operation failed. Handle error.
    ...
}