Lesen und Schreiben in Geräteregister in UMDF 1.x-Treibern

Warnung

UMDF 2 ist die neueste Version von UMDF und ersetzt UMDF 1. Alle neuen UMDF-Treiber sollten mit UMDF 2 geschrieben werden. UMDF 1 werden keine neuen Features hinzugefügt, und die Unterstützung für UMDF 1 für neuere Versionen von Windows 10 ist eingeschränkt. Universelle Windows-Treiber müssen UMDF 2 verwenden.

Die archivierten UMDF 1-Beispiele finden Sie im Windows 11, Version 22H2 – Mai 2022 Treiberbeispiele Update.

Weitere Informationen finden Sie unter Erste Schritte mit UMDF.

Ab UMDF-Version 1.11 stellt das Framework eine Reihe von Routinen für den Zugriff auf Register im Speicherplatz und im E/A-Portbereich bereit. Die UMDF-Register-/Portzugriffsroutinen ähneln den HAL-Routinen, die von Kernelmodustreibern verwendet werden. Nachdem ein Treiber Register zugeordnet hat, wie unter Suchen und Zuordnen von Hardwareressourcen in einem UMDF-Treiber beschrieben, verwendet der Treiber die READ/WRITE_REGISTER_Xxx-Routinen, um einzelne Register zu lesen und in einzelne Register zu schreiben. Für E/A-Ports ruft der Treiber die READ/WRITE_PORT_Xxx-Routinen auf.

In diesem Beispiel wird gezeigt, wie sie in ein speicherbezogenes Register schreiben.

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

Standardmäßig verwendet UMDF intern Systemaufrufe, um auf die Register zuzugreifen, die entweder im Speicherplatz oder im E/A-Port zugeordnet sind. Auf eine Registrierung im E/A-Portbereich wird immer über einen Systemaufruf zugegriffen. Beim Zugriff auf Speicherzuordnungsregister kann ein UMDF-Treiber jedoch dazu führen, dass das Framework die speicherzuordnungen Register dem Adressraum des Benutzermodus zuordnen kann, indem die INF-Anweisung UmdfRegisterAccessMode auf RegisterAccessUsingUserModeMapping festgelegt wird. Einige Treiber müssen dies möglicherweise aus Leistungsgründen tun. Eine vollständige Liste der UMDF-INF-Direktiven finden Sie unter Angeben von WDF-Direktiven in INF-Dateien .

Der Treiber sollte die READ/WRITE_REGISTER_Xxx-Routinen verwenden, auch wenn er Register im Benutzermodus zugeordnet hat. Diese Routinen überprüfen die Treibereingabe und stellen sicher, dass der Treiber keinen Zugriff auf ungültige Speicherorte angibt. In seltenen Fällen muss ein Treiber möglicherweise direkt auf zugeordnete Register im Benutzermodus zugreifen, ohne diese Routinen zu verwenden. Dazu ruft ein Treiber die zugeordnete Adresse des Benutzermodus ab, indem er IWDFDevice3::GetHardwareRegisterMappedAddress für die zugeordnete Basisadresse aufruft. Da UMDF lese- und schreibzugriffe auf diese Weise nicht überprüft, wird dieses Verfahren für den Registrierungszugriff nicht empfohlen.