在 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 驱动程序中查找和映射硬件资源中所述映射寄存器后,驱动程序使用读取/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 不会验证以这种方式执行的读取和写入访问,因此不建议将此方法用于注册访问。