Sincronización del código de interrupción (UMDF 1)
Advertencia
UMDF 2 es la versión más reciente de UMDF y sustituye a UMDF 1. Todos los controladores UMDF nuevos deben escribirse con UMDF 2. No se agregan nuevas características a UMDF 1 y hay compatibilidad limitada con UMDF 1 en versiones más recientes de Windows 10. Los controladores universales de Windows deben usar UMDF 2.
Los ejemplos de UMDF 1 archivados se pueden encontrar en la Windows 11, versión 22H2 : actualización de ejemplos de controladores de mayo de 2022.
Para obtener más información, consulta Introducción con UMDF.
Todo el código de controlador que accede al búfer de datos de interrupción debe sincronizarse para que solo una rutina acceda a los datos a la vez.
Puede sincronizar el código de interrupción mediante el bloqueo de interrupción manual o la serialización automática de devolución de llamada.
Bloqueo manual de interrupciones
UMDF adquiere el bloqueo de interrupción antes de llamar a las devoluciones de llamada OnInterruptIsr, OnInterruptDisable o OnInterruptEnable .
Si un controlador necesita sincronizar cualquier código mediante el bloqueo de interrupción, llama a IWDFInterrupt::AcquireInterruptLock e IWDFInterrupt::ReleaseInterruptLock. Por ejemplo, un controlador adquiere y libera el bloqueo de interrupción en su rutina de devolución de llamada OnInterruptWorkItem mediante estos métodos. Sin embargo, en devoluciones de llamada de distribución de E/S (como OnRead y OnWrite), el controlador llama primero a IWDFInterrupt::TryToAcquireInterruptLock para decidir si poner en cola un elemento de trabajo o realizar el trabajo en el mismo subproceso para evitar posibles interbloqueos. Para obtener un ejemplo de un escenario de interbloqueo que puede deberse a una llamada a IWDFInterrupt::AcquireInterruptLock desde un contexto de subproceso arbitrario, vea la sección Comentarios de IWDFInterrupt::AcquireInterruptLock.
Si IWDFInterrupt::TryToAcquireInterruptLock devuelve TRUE, el controlador ha adquirido el bloqueo de interrupción en el mismo subproceso. En este caso, el controlador realiza el trabajo necesario para ese bloqueo y, a continuación, llama a ReleaseInterruptLock. Si IWDFInterrupt::TryToAcquireInterruptLock devuelve FALSE, el controlador pone en cola un elemento de trabajo y realiza el trabajo en su devolución de llamada OnWorkItem . En este caso, el elemento de trabajo no debe usar la serialización automática.
Uso de la serialización automática
Un controlador UMDF puede solicitar la sincronización automática de devolución de llamada llamando a IWDFDeviceInitialize::SetLockingConstraint con el parámetro LockType establecido en WdfDeviceLevel.
A continuación, el controlador establece el miembro AutomaticSerialization de su estructura de WUDF_INTERRUPT_CONFIG en TRUE antes de llamar a CreateInterrupt.
Como resultado, UMDF serializa las devoluciones de llamada OnInterruptWorkItem del controlador con cola de E/S, cancelación de solicitudes y rutinas de devolución de llamada de objeto de archivo. En este escenario, UMDF usa el bloqueo de devolución de llamada en lugar de un bloqueo de objeto por interrupción.