在 UMDF 1.x 驅動程式中讀取和寫入裝置暫存器

警告

UMDF 2 是最新版的 UMDF,並取代 UMDF 1。 所有新的 UMDF 驅動程式都應該使用 UMDF 2 來撰寫。 未將新功能新增至 UMDF 1,而且較新版本的 Windows 10 上不支援 UMDF 1。 通用 Windows 驅動程式必須使用 UMDF 2。

封存的 UMDF 1 範例可在Windows 11 22H2 版 - 2022 年 5 月驅動程式範例更新中找到。

如需詳細資訊,請參閱使用 UMDF 消費者入門

從 UMDF 1.11 版開始,架構會提供一組常式來存取記憶體空間和 I/O 埠空間中的暫存器。 UMDF 暫存器/埠存取常式非常類似于核心模式驅動程式所使用的 HAL 常式。 驅動程式對應暫存器之後,如 在 UMDF 驅動程式中尋找和對應硬體資源中所述,驅動程式會使用 READ/WRITE_REGISTER_Xxx常式來讀取和寫入個別暫存器。 針對 I/O 埠,驅動程式會呼叫 READ/WRITE_PORT_Xxx 常式。

此範例示範如何寫入記憶體對應暫存器。

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

根據預設,UMDF 會在內部使用系統呼叫來存取記憶體空間或 I/O 埠空間中對應的暫存器。 I/O 埠空間中的暫存器一律會透過系統呼叫來存取。 不過,存取記憶體對應暫存器時,UMDF 驅動程式可能會讓架構藉由將 INF 指示詞 UmdfRegisterAccessMode 設定為 RegisterAccessUsingUserModeMapping,將記憶體對應暫存器對應到使用者模式位址空間。 某些驅動程式可能需要基於效能考慮來執行此動作。 如需 UMDF INF 指示詞的完整清單,請參閱 在 INF 檔案中指定 WDF 指示 詞。

即使驅動程式已將暫存器對應到使用者模式,驅動程式也應該使用 READ/WRITE_REGISTER_Xxx常式。 這些常式會驗證驅動程式輸入,並確保驅動程式不會要求存取不正確位置。 驅動程式很少需要直接存取使用者模式對應暫存器,而不使用這些常式。 若要這樣做,驅動程式會在對應的基底位址上呼叫 IWDFDevice3::GetHardwareRegisterMappedAddress 來擷取使用者模式的對應位址。 由於 UMDF 不會驗證以這種方式執行的讀取和寫入存取,因此不建議使用這項技術進行註冊存取。