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( ¶ms, 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(¶ms);
if (!NT_SUCCESS(status)) {
// Operation failed. Handle error.
...
}