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


Использование версии 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.> Система использует объект устройства для автоматического определения линейных прерываний устройства.

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

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

  • Драйверы могут дополнительно указать spin lock в 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.
    ...
}