Uso de la versión CONNECT_LINE_BASED de IoConnectInterruptEx

En el caso de Windows Vista y sistemas operativos posteriores, un controlador puede usar la versión CONNECT_LINE_BASED de IoConnectInterruptEx para registrar una rutina de InterruptService para las interrupciones basadas en línea del controlador. (El controlador para sistemas operativos anteriores puede usar la versión CONNECT_FULLY_SPECIFIED de IoConnectInterruptEx).

Nota Puede usar este método solo para los controladores que registren una única rutina de servicio de interrupción (ISR) para todas sus interrupciones basadas en líneas. Si el controlador puede recibir varias interrupciones, debe usar la versión CONNECT_FULLY_SPECIFIED de IoConnectInterruptEx.

El controlador especifica un valor de CONNECT_LINE_BASED para Parameters-Version> y usa los miembros deParameters-LineBased> para especificar los demás parámetros de la operación:

  • Parameters-LineBased.PhysicalDeviceObject> especifica el objeto de dispositivo físico (PDO) para el dispositivo que los servicios ISR. El sistema usa el objeto de dispositivo para identificar automáticamente las interrupciones basadas en línea del dispositivo.

  • Parameters-LineBased.ServiceRoutine> apunta a la rutina InterruptService, mientras que Parameters-LineBased.> ServiceContext especifica el valor que el sistema pasa como parámetro ServiceContext a InterruptService. El controlador puede usarlo para pasar información de contexto. Para obtener más información sobre cómo pasar información de contexto, vea Proporcionar información de contexto de ISR.

  • El controlador proporciona un puntero a una variable PKINTERRUPT en Parameters-LineBased.InterruptObject>. IoConnectInterruptEx establece esta variable para que apunte al objeto de interrupción de la interrupción, que se puede usar al quitar el ISR. Para obtener más información, consulte Eliminación de un ISR.

  • Opcionalmente, los controladores pueden especificar un bloqueo de número en Parameters-LineBased.SpinLock> para que el sistema lo use al sincronizar con el ISR. La mayoría de los controladores solo pueden especificar NULL para permitir que el sistema asigne un bloqueo de número en nombre del controlador. Para obtener más información sobre la sincronización con un ISR, consulte Sincronizar el acceso a los datos del dispositivo.

En el ejemplo de código siguiente se muestra cómo registrar una rutina de InterruptService mediante 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.
    ...
}