Función WdfInterruptAcquireLock (wdfinterrupt.h)

[Se aplica a KMDF y UMDF]

El método WdfInterruptAcquireLock comienza una secuencia de código que se ejecuta en el nivel de solicitud de interrupción de dispositivo (DIRQL) del dispositivo mientras mantiene el bloqueo de número de un objeto de interrupción.

En el caso de los objetos de interrupción de nivel pasivo, el método comienza una secuencia de código que se ejecuta en el nivel pasivo mientras mantiene el bloqueo pasivo de un objeto de interrupción.

Sintaxis

void WdfInterruptAcquireLock(
  [in] WDFINTERRUPT Interrupt
);

Parámetros

[in] Interrupt

Identificador de un objeto de interrupción de marco.

Comentarios

Se produce una comprobación de errores si el controlador proporciona un identificador de objeto no válido.

Cuando un controlador llama a WdfInterruptAcquireLock en un objeto de interrupción DIRQL, el sistema eleva el IRQL del procesador al DIRQL del dispositivo y adquiere el bloqueo de giro que el controlador especificó en la estructura de WDF_INTERRUPT_CONFIG del objeto de interrupción. Como resultado, las funciones de devolución de llamada EvtInterruptIsr y EvtInterruptSynchronize del objeto de interrupción (y cualquier otro código que llame a WdfInterruptAcquireLock para el mismo objeto de interrupción) no se puede ejecutar.

Cuando el controlador llama a WdfInterruptReleaseLock, el sistema devuelve el IRQL del procesador a su nivel anterior y libera el bloqueo de número.

Cuando un controlador llama a WdfInterruptAcquireLock en un objeto de interrupción de nivel pasivo, el sistema adquiere el bloqueo de interrupción de nivel pasivo que el controlador configurado en la estructura de WDF_INTERRUPT_CONFIG del objeto de interrupción.

Cuando el controlador llama a WdfInterruptReleaseLock, el sistema libera el bloqueo de interrupción.

Para interrupciones de nivel pasivo, el controlador debe llamar a WdfInterruptAcquireLock en IRQL = PASSIVE_LEVEL.

No llame a WdfInterruptAcquireLock desde un contexto de subproceso arbitrario, como un controlador de solicitudes.

Puede usar WdfInterruptAcquireLock y WdfInterruptReleaseLock si el controlador debe ejecutar algunas líneas de código sin adelantarse y con el mantenimiento de interrupciones del dispositivo deshabilitadas de forma eficaz. Para secciones más grandes del código, el controlador debe proporcionar una función de devolución de llamada EvtInterruptSynchronize .

El controlador no puede llamar a WdfInterruptAcquireLock antes de que el marco haya llamado a la función de devolución de llamada EvtInterruptEnable del controlador o después de que el marco haya llamado a la función de devolución de llamada EvtInterruptDisable del controlador.

Después de que el controlador llame a WdfInterruptAcquireLock, no debe llamar al método de nuevo para el mismo objeto de interrupción antes de llamar a WdfInterruptReleaseLock.

Para obtener más información sobre el método WdfInterruptAcquireLock , vea Sincronizar código de interrupción.

Para obtener más información sobre el control de interrupciones en controladores basados en marcos, consulte Control de interrupciones de hardware.

Para los objetos de interrupción de nivel pasivo, los controladores deben llamar a WdfInterruptTryToAcquireLock en lugar de WdfInterruptAcquireLock, cuando se ejecuta en un subproceso arbitrario, como una función de devolución de llamada de objeto de cola. Por ejemplo, el controlador podría llamar a WdfInterruptTryToAcquireLock desde EvtIoRead.

Al hacerlo, se evita la posibilidad de interbloqueo, como se describe en el escenario siguiente.

  1. Para determinar si se interrumpió su dispositivo, el controlador de función de un dispositivo periférico SPB envía E/S a su bus desde su ISR, con el bloqueo de interrupción de nivel pasivo mantenido.
  2. El controlador de autobús completa una segunda solicitud en el mismo subproceso en el que recibió la solicitud anterior.
  3. La rutina de finalización de la segunda solicitud envía una solicitud al controlador periférico.
  4. La rutina de distribución de E/S del controlador periférico llama a WdfInterruptAcquireLock, que luego interbloqueo intenta adquirir el bloqueo pasivo del objeto de interrupción.

Requisitos

Requisito Value
Plataforma de destino Universal
Versión mínima de KMDF 1.0
Versión mínima de UMDF 2.0
Encabezado wdfinterrupt.h (incluya Wdf.h)
IRQL <= DIRQL
Reglas de cumplimiento de DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), WdfInterruptLock(kmdf), WdfInterruptLockRelease(kmdf)

Consulte también