Compartir a través de


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 del dispositivo (DIRQL) del dispositivo mientras mantiene el bloqueo de giro 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 del marco.

Valor devuelto

Ninguno

Observaciones

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 WDF_INTERRUPT_CONFIG del objeto de interrupción. Como resultado, el del objeto de interrupción EvtInterruptIsr y EvtInterruptSynchronize funciones de devolución de llamada (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 giro.

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 configuró en la estructura 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 que se adelante y con el mantenimiento de interrupciones del dispositivo deshabilitadas de forma eficaz. Para secciones más grandes del código, el controlador debe proporcionar un EvtInterruptSynchronize función de devolución de llamada.

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

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 de, vea Sincronización del 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 de . 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 para 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 bus 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 del controlador periférico WdfInterruptAcquireLock, que luego interbloqueo intenta adquirir el bloqueo pasivo del objeto de interrupción.

Requisitos

Requisito Valor
de la plataforma de destino de 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