Lectura y escritura en registros de dispositivos en controladores UMDF 1.x

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 actualización de ejemplos de controladores de Windows 11, versión 22H2 - mayo de 2022.

Para obtener más información, consulta Introducción con UMDF.

A partir de la versión 1.11 de UMDF, el marco proporciona un conjunto de rutinas para acceder a los registros en el espacio de memoria y el espacio de puertos de E/S. Las rutinas de acceso al registro o puerto de UMDF son muy similares a las rutinas HAL usadas por los controladores de modo kernel. Una vez que un controlador ha asignado los registros tal y como se describe en Búsqueda y asignación de recursos de hardware en un controlador UMDF, el controlador usa las rutinas read/WRITE_REGISTER_Xxx para leer y escribir en registros individuales. En el caso de los puertos de E/S, el controlador llama a las rutinas read/WRITE_PORT_Xxx.

En este ejemplo se muestra cómo escribir en un registro asignado a memoria.

VOID
CMyQueue::WriteToDevice(
    __in IWDFDevice3* pWdfDevice,
    __in UCHAR Value
    )
{
    //
    // Write the UCHAR value at offset 2 from register base
    //
    WRITE_REGISTER_UCHAR(pWdfDevice, 
                      (m_MyDevice->m_RegBase)+2, 
                       Value);
}

De forma predeterminada, UMDF usa internamente llamadas del sistema para acceder a los registros asignados en espacio de memoria o en espacio de puerto de E/S. Siempre se accede a un registro en el espacio de puertos de E/S a través de una llamada del sistema. Sin embargo, al acceder a los registros asignados a memoria, un controlador UMDF puede hacer que el marco asigne los registros asignados a la memoria en el espacio de direcciones en modo de usuario estableciendo la directiva INF UmdfRegisterAccessMode en RegisterAccessUsingUserModeMapping. Es posible que algunos controladores deba hacerlo por motivos de rendimiento. Consulte Especificación de directivas WDF en archivos INF para obtener una lista completa de las directivas INF de UMDF.

El controlador debe usar las rutinas READ/WRITE_REGISTER_Xxx incluso si ha asignado registros en modo de usuario. Estas rutinas validan la entrada del controlador y garantizan que el controlador no solicita acceso a ubicaciones no válidas. Rara vez, es posible que un controlador necesite acceder directamente a los registros asignados en modo de usuario, sin usar estas rutinas. Para ello, un controlador recupera la dirección asignada en modo de usuario mediante una llamada a IWDFDevice3::GetHardwareRegisterMappedAddress en la dirección base asignada. Dado que UMDF no valida los accesos de lectura y escritura realizados de esta manera, esta técnica no se recomienda para el acceso de registro.