Lettura e scrittura nei registri dei dispositivi in driver UMDF 1.x
Avviso
UMDF 2 è la versione più recente di UMDF e sostituisce UMDF 1. Tutti i nuovi driver UMDF devono essere scritti usando UMDF 2. Nessuna nuova funzionalità viene aggiunta a UMDF 1 ed è disponibile un supporto limitato per UMDF 1 nelle versioni più recenti di Windows 10. I driver di Windows universali devono usare UMDF 2.
Gli esempi di UMDF 1 archiviati sono disponibili nell'Windows 11, versione 22H2 - Aggiornamento degli esempi di driver di maggio 2022.
Per altre informazioni, vedere Introduzione con UMDF.
A partire dalla versione 1.11 di UMDF, il framework fornisce un set di routine per accedere ai registri nello spazio di memoria e nello spazio delle porte di I/O. Le routine di registrazione/accesso alle porte di UMDF sono molto simili alle routine HAL usate dai driver in modalità kernel. Dopo che un driver ha eseguito il mapping dei registri come descritto in Ricerca e mapping delle risorse hardware in un driver UMDF, il driver usa le routine READ/WRITE_REGISTER_Xxx per leggere e scrivere nei singoli registri. Per le porte di I/O, il driver chiama le routine READ/WRITE_PORT_Xxx.
In questo esempio viene illustrato come scrivere in un registro mappato alla 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);
}
Per impostazione predefinita, UMDF usa internamente chiamate di sistema per accedere ai registri mappati nello spazio di memoria o nello spazio delle porte di I/O. Viene sempre eseguito l'accesso a un registro nello spazio delle porte di I/O tramite una chiamata di sistema. Tuttavia, quando si accede ai registri mappati alla memoria, un driver UMDF può causare il mapping dei registri mappati alla memoria nello spazio degli indirizzi in modalità utente impostando la direttiva INF UmdfRegisterAccessMode su RegisterAccessUsingUserModeMapping. Alcuni driver potrebbero dover eseguire questa operazione per motivi di prestazioni. Vedere Specifica delle direttive WDF nei file INF per un elenco completo delle direttive INF UMDF.
Il driver deve usare le routine READ/WRITE_REGISTER_Xxx anche se ha eseguito il mapping dei registri in modalità utente. Queste routine convalidano l'input del driver e assicurano che il driver non richieda l'accesso alle posizioni non valide. Raramente, un driver potrebbe dover accedere direttamente ai registri mappati in modalità utente, senza usare queste routine. A tale scopo, un driver recupera l'indirizzo mappato in modalità utente chiamando IWDFDevice3::GetHardwareRegisterMappedAddress sull'indirizzo di base mappato. Poiché UMDF non convalida l'accesso in lettura e scrittura eseguito in questo modo, questa tecnica non è consigliata per registrare l'accesso.