Compartilhar via


Usando a versão CONNECT_LINE_BASED de IoConnectInterruptEx

Para o Windows Vista e sistemas operacionais posteriores, um driver pode usar a versão CONNECT_LINE_BASED de IoConnectInterruptEx para registrar uma rotina InterruptService para interrupções baseadas em linha do driver. (O driver para sistemas operacionais anteriores pode usar a versão CONNECT_FULLY_SPECIFIED de IoConnectInterruptEx.)

Nota Você pode usar esse método apenas para drivers que registram uma única ISR (rotina de serviço de interrupção) para todas as interrupções baseadas em linha. Se o driver puder receber várias interrupções, ele deverá usar a versão CONNECT_FULLY_SPECIFIED de IoConnectInterruptEx.

O driver especifica um valor de CONNECT_LINE_BASED para Parameters-Version> e usa os membros deParameters-LineBased> para especificar os outros parâmetros da operação:

  • Parameters-LineBased.PhysicalDeviceObject especifica o PDO (objeto de dispositivo físico) para o dispositivo que o ISR serviços.> O sistema usa o objeto de dispositivo para identificar automaticamente as interrupções baseadas em linha do dispositivo.

  • Parameters-LineBased.ServiceRoutine> aponta para a rotina InterruptService, enquanto Parameters-LineBased.> ServiceContext especifica o valor que o sistema passa como o parâmetro ServiceContext para InterruptService. O driver pode usar isso para passar informações de contexto. Para obter mais informações sobre como passar informações de contexto, consulte Fornecendo informações de contexto do ISR.

  • O driver fornece um ponteiro para uma variável PKINTERRUPT em Parameters-LineBased.InterruptObject>. IoConnectInterruptEx define essa variável para apontar para o objeto de interrupção da interrupção, que pode ser usado ao remover o ISR. Para obter mais informações, consulte Removendo um ISR.

  • Opcionalmente, os drivers podem especificar um bloqueio de rotação em Parameters-LineBased.SpinLock> para o sistema usar ao sincronizar com o ISR. A maioria dos drivers pode apenas especificar NULL para permitir que o sistema aloque um bloqueio de rotação em nome do driver. Para obter mais informações sobre como sincronizar com um ISR, consulte Sincronizando o acesso aos dados do dispositivo.

O exemplo de código a seguir demonstra como registrar uma rotina InterruptService usando 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.
    ...
}