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 reemplaza a UMDF 1. Todos los nuevos controladores UMDF 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 Windows universales deben usar UMDF 2.

Para obtener más información, vea 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 en el espacio de puertos de E/S. Las rutinas de acceso de puerto/registro UMDF son muy similares a las rutinas DE LAN que usan los controladores en modo kernel. Una vez que un controlador ha asignado registros 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. Para 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 el espacio de memoria o en el espacio de puertos 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 memoria al 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. Vea Especificar directivas WDF en archivos INF para obtener una lista completa de directivas UMDF INF.

El controlador debe usar las rutinas read/WRITE_REGISTER_Xxx aunque haya asignado registros al modo de usuario. Estas rutinas validan la entrada del controlador y garantizan que el controlador no solicita acceso a ubicaciones no válidas. En raras ocasiones, es posible que un controlador tenga que 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 llamando 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.