为了确保与 内核 DMA 保护 和 DMAGuard 策略兼容,PCIe 设备驱动程序可以选择重新映射直接内存访问(DMA)。
设备驱动程序的 DMA 重新映射可防止内存损坏和恶意 DMA 攻击,并为设备提供更高级别的兼容性。 此外,具有 DMA 重新映射兼容驱动程序的设备可以启动和执行 DMA,而不考虑锁屏状态。
在启用了内核 DMA 保护的系统上,DMAGuard 策略可能会阻止设备,使用 DMA 重新映射不兼容的驱动程序连接到 外部/公开 的 PCIe 端口(例如 M.2,Thunderbolt),具体取决于系统管理员设置的策略值。
关于启用和选择加入 DMA 重新映射的驱动程序要求
驱动程序使用以下接口执行 DMA:
若要调整驱动程序的 DMA 重新映射策略,请添加 INF 指令。 有两种可能的方法:按设备(推荐和首选)机制和每驱动程序(旧版)机制。
按设备选择加入机制
对于 Windows 24H2 及更高版本,请使用此每设备方法。 如果存在,则按设备选择加入将替代旧的按驱动程序方法(例如,如果设置了 RemappingSupported,则忽略 DmaRemappingCompatible 密钥)。
将 INF 指令(如以下内容)添加到设备枚举部分:
[MyDriver_Device.NT.HW]
AddReg=DMA_Remapping_OptIn_AddReg
[DMA_Remapping_OptIn_AddReg]
HKR,"DMA Management","RemappingSupported",0x00010001,1
DMA Management\RemappingSupported 的有效值:
| 价值 | 意义 | 
|---|---|
| 0 | 选择退出,指示设备和驱动程序与 DMA 重新映射不兼容。 | 
| 1 | 选择加入,指示设备和驱动程序与 DMA 重新映射完全兼容。 | 
| 无注册表项 | 让系统确定策略。 | 
(可选)可以添加 RemappingFlags 以进一步控制行为:
[DMA_Remapping_OptIn_AddReg]
HKR,"DMA Management","RemappingSupported",0x00010001,1
HKR,"DMA Management","RemappingFlags",0x00010001,0x00000001
DMA Management\RemappingFlags 的有效值:
| 价值 | 意义 | 
|---|---|
| 0 | 如果 重新映射Supported 为 1,请无条件选择加入。 | 
| 1 | 如果 重新映射Supported 为 1,请选择加入,但仅当满足以下一个或多个条件时:A。设备是外部设备(例如 Thunderbolt):B.驱动程序验证程序中启用了 DMA 验证 | 
| 无注册表项 | 与 0 值相同。 | 
这些注册表项显示在枚举树下: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\<device instance path>\Device Parameters\DMA Management
按驱动程序选择加入机制
仅在 Windows 版本不高于 Windows 11 23H2 时使用此按驱动程序方法。 使用 每设备方法。
将 INF 指令(如以下内容)添加到服务安装部分:
[MyServiceInstall_AddReg]
HKR,Parameters,DmaRemappingCompatible,0x00010001,1    ; where 1 = opt in
DmaRemappingCompatible 的有效值:
| 价值 | 意义 | 
|---|---|
| 0 | 选择退出,指示驱动程序与 DMA 重新映射不兼容。 | 
| 1 | 选择加入,指示驱动程序与 DMA 重新映射完全兼容。 | 
| 2 | 选择加入,但前提是满足以下一个或多个条件:A。设备是外部设备(例如 Thunderbolt):B.驱动程序验证程序中启用了 DMA 验证 | 
| 3 | 选择加入 | 
| 无注册表项 | 让系统确定策略。 | 
测试驱动程序时,启用驱动程序验证程序。 为了在驱动程序验证程序下进行测试,用于选择外部设备的 INF 指令的值将提升为 1。
注册表项显示在服务安装树下: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<driver name>\Parameters。
警告
图形设备驱动程序不支持 DMA 重新映射。
注意
在 Windows 11 中添加了对值 3 的支持。 此功能设计为在 Windows 10 上正常降级,其中该支持不存在,在 Windows 10 设备上显示值 2 而不是 3。
验证是否为特定设备驱动程序实例启用了 DMA 重新映射
使用启用了 VT-d/AMD-Vi 的最新 Windows 版本在 Intel x64 和 AMD64 系统上测试驱动程序功能。
若要检查特定驱动程序是否选择重新映射 DMA,请在设备 详细信息选项卡中查找 与 DMA 重新映射策略属性对应的值。 驱动程序可以查询 DEVPKEY_Device_DmaRemappingPolicy 属性,以确定设备的 DMA 重新映射功能。 查看该页上的潜在返回值,并请注意,这些返回值与上一节中列出的 DmaRemappingCompatible 的值不同。
              
               
              
              
            
注意
对于 Windows 10 版本 1803 和 1809,Device Manager 中的属性字段使用 GUID {83da6326-97a6-4088-9453-a1923f573b29}[18]