Lecture et écriture dans les registres d’appareils dans les pilotes UMDF 1.x

Avertissement

UMDF 2 est la dernière version d’UMDF et remplace UMDF 1. Tous les nouveaux pilotes UMDF doivent être écrits à l’aide d’UMDF 2. Aucune nouvelle fonctionnalité n’est ajoutée à UMDF 1 et la prise en charge d’UMDF 1 est limitée sur les versions plus récentes de Windows 10. Les pilotes Windows universels doivent utiliser UMDF 2.

Les exemples UMDF 1 archivés se trouvent dans la Windows 11, version 22H2 - Mise à jour des exemples de pilotes de mai 2022.

Pour plus d’informations, consultez Prise en main avec UMDF.

À compter de la version 1.11 d’UMDF, l’infrastructure fournit un ensemble de routines permettant d’accéder aux registres dans l’espace mémoire et l’espace de port d’E/S. Les routines d’accès aux ports/registres UMDF sont très similaires aux routines HAL utilisées par les pilotes en mode noyau. Une fois qu’un pilote a mappé des registres comme décrit dans Recherche et mappage de ressources matérielles dans un pilote UMDF, le pilote utilise les routines READ/WRITE_REGISTER_Xxx pour lire et écrire dans des registres individuels. Pour les ports d’E/S, le pilote appelle les routines READ/WRITE_PORT_Xxx.

Cet exemple montre comment écrire dans un registre mappé en mémoire.

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);
}

Par défaut, UMDF utilise en interne les appels système pour accéder aux registres mappés dans l’espace mémoire ou dans l’espace du port d’E/S. Un enregistrement dans l’espace de port d’E/S est toujours accessible via un appel système. Toutefois, lors de l’accès aux registres mappés en mémoire, un pilote UMDF peut amener l’infrastructure à mapper les registres mappés en mémoire dans l’espace d’adressage en mode utilisateur en définissant la directive INF UmdfRegisterAccessMode surRegisterAccessUsingUserModeMapping. Certains pilotes peuvent avoir besoin de le faire pour des raisons de performances. Pour obtenir la liste complète des directives INF UMDF, consultez Spécification de directives WDF dans les fichiers INF .

Le pilote doit utiliser les routines READ/WRITE_REGISTER_Xxx même s’il a mappé des registres en mode utilisateur. Ces routines valident l’entrée du pilote et s’assurent que le pilote ne demande pas l’accès à des emplacements non valides. Rarement, un pilote peut avoir besoin d’accéder directement aux registres mappés en mode utilisateur, sans utiliser ces routines. Pour ce faire, un pilote récupère l’adresse mappée en mode utilisateur en appelant IWDFDevice3::GetHardwareRegisterMappedAddress sur l’adresse de base mappée. Étant donné qu’UMDF ne valide pas les accès en lecture et en écriture effectués de cette façon, cette technique n’est pas recommandée pour l’accès d’inscription.