Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Advertencia
UMDF 2 es la versión más reciente de UMDF y sustituye a UMDF 1. Todos los nuevos controladores UMDF deben escribirse mediante 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 archivados de UMDF 1 se pueden encontrar en la Actualización de ejemplos de controladores de Windows 11, versión 22H2 - mayo de 2022.
Para obtener más información, consulta Introducción a UMDF.
Todo el código de controlador que tiene acceso 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 manual de interrupciones o la serialización automática de callbacks.
Bloqueo manual de interrupciones
UMDF adquiere el bloqueo de interrupción antes de llamar a los callbacks OnInterruptIsr, OnInterruptDisableo OnInterruptEnable.
Si un controlador necesita sincronizar cualquier código mediante el bloqueo de interrupción, llama a IWDFInterrupt::AcquireInterruptLock y 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 callbacks de E/S de distribución (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 hilo para evitar posibles interbloqueos. Para ver un ejemplo de un escenario de interbloqueo causado por llamar a IWDFInterrupt::AcquireInterruptLock desde un contexto de hilo arbitrario, consulte la sección de Comentarios de IWDFInterrupt::AcquireInterruptLock.
Si IWDFInterrupt::TryToAcquireInterruptLock devuelve TRUE, el controlador ha adquirido el bloqueo de interrupción en el mismo hilo. En este caso, el controlador realiza el trabajo que requería ese bloqueo y, a continuación, llama a ReleaseInterruptLock. Si IWDFInterrupt::TryToAcquireInterruptLock retorna FALSE, el controlador añade un elemento de trabajo a la cola y ejecuta la tarea en su callback 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 WUDF_INTERRUPT_CONFIG en TRUE antes de llamar a CreateInterrupt.
Como resultado, UMDF serializa el onInterruptWorkItem del controlador devoluciones de llamada con cola de E/S, cancelación de solicitudes y rutinas de devolución de llamada de objeto de archivo. En este escenario, UMDF utiliza el bloqueo de devolución de llamada en lugar de un bloqueo de objeto para cada interrupción.