Windows 图形显示驱动开发-WDDM 2.4功能-GPU 半虚拟化(三)

用于容器的主机 DriverStore

对于容器,Hyper-V 将主机中的完整主机驱动程序存储目录映射到容器中的 <%windir%\HostDriverStore。

用于完整 VM 的主机 DriverStore

当虚拟 GPU 适配器在 VM 中启动时,驱动程序存储文件将复制到 VM。 在作系统的已发布版本中禁用此功能。

以下注册表项和可用值控制复制操作。 默认情况下,密钥不存在。

复制代码
DWORD RTL_REGISTRY_CONTROL\GraphicsDrivers\DriverStoreCopyMode

|----|---------------------------|
| 价值 | 描述 |
| 0 | 禁用复制驱动程序存储。 |
| 1 | 正常运行(启用复制驱动存储文件,不覆盖现有文件)。 |
| 2 | 启动复制驱动程序存储并覆盖现有文件。 |

从 UMD 访问注册表

KMD 注册表项存在于主机上,不会反映到 VM。 因此,UMD 无法直接读取此类驱动程序注册表项。 pfnQueryAdapterInfoCb2 回调将添加到 D3D 运行时的 D3DDDI_ADAPTERCALLBACKS 结构体中。 UMD 可以调用 pfnQueryAdapterInfoCb2 并设置 D3DDDICB_QUERYADAPTERINFO2 以读取某些注册表项:

  • D3DDDICB_QUERYADAPTERINFO2::QueryType 设置为 D3DDDI_QUERYADAPTERTYPE_QUERYREGISTRY。
  • pPrivateDriverData 指向具有返回注册表信息的 D3DDDI_QUERYREGISTRY_INFO 结构的缓冲区。 UMD 填补了以下成员的空缺:
  1. D3DDDI_QUERYREGISTRY_INFO::QueryType 指定注册表访问的类型;例如,服务密钥、适配器密钥或驱动程序存储路径。
  2. D3DDDI_QUERYREGISTRY_FLAGS::QueryFlags 指定查询的标志。
  3. ValueName 标识要读取的值的名称。
  4. ValueType 指定要读取的值的类型。
  • PrivateDriverDataSize 是 sizeof(D3DDDI_QUERYREGISTRY_INFO) 加上动态大小输出值的缓冲区大小。

UMD 还可以直接调用 D3DKMTQueryAdapterInfo。 此调用对来宾中的 UMD 非常有用,因为它是向主机调用的,并提供了一种将某些名称转换为来宾名称空间的方法。

D3DKMTQueryAdapterInfo 被调用,D3DKMT_QUERYADAPTERINFO 被设置为如下,以读取某些注册表键:

  • Type 设置为 KMTQAITYPE_QUERYREGISTRY
  • pPrivateDriverData 指向 D3DKMT_ADAPTERREGISTRYINFO 结构体
  • PrivateDriverDataSize 是 sizeof(D3DKMT_ADAPTERREGISTRYINFO) 加上动态大小输出值的缓冲区大小。

示例 1:从服务密钥读取值

cpp 复制代码
WCHAR ValueName = L"EnableDebug";
    D3DDDI_QUERYREGISTRY_INFO Args = {};
    Args.QueryType = D3DDDI_QUERYREGISTRY_SERVICEKEY;
    Args.QueryFlags.TranslatePath = FALSE or TRUE;
    Args.ValueType = Supported registry value type;
    wcscpy_s(Args.ValueName, ARRAYSIZE(Args.ValueName), ValueName);

    D3DKMT_QUERYADAPTERINFO Args1 = {};
    Args1.hAdapter = hAdapter;
    Args1.Type = KMTQAITYPE_QUERYREGISTRY;
    Args1.pPrivateDriverData = &Args;
    Args1.PrivateDriverDataSize = sizeof(Args);
    NTSTATUS Status = D3DKMTQueryAdapterInfo(&Args1);
    if (NT_SUCCESS(Status) &&
        Args.Status == D3DDDI_QUERYREGISTRY_STATUS_SUCCESS)
    {
       if (ValueType == REG_SZ || ValueType == REG_EXPAND_SZ) {

wprintf(L"Value: \"%s\"\n", Args.OutputString);
       } else
       if (ValueType == REG_MULTI_SZ) {
          wprintf(L"Value: ");
          for (UINT i = 0; i < Args.OutputValueSize; i++) {
             if (Args.OutputString[i] == 0) {
                wprintf(L" ");
             } else {
                wprintf(L"%c", Args.OutputString[i]);
             }
          }
          wprintf(L"\n");
       } else
       if (ValueType == REG_DWORD) {
          wprintf(L"Value: %d\n", Args.OutputDword);
       } else
       if (ValueType == REG_QWORD) {
          wprintf(L"Value: 0x%I64x\n", Args.OutputQword);
       } else
       if (ValueType == REG_BINARY) {
          wprintf(L"Num bytes: %d\n", Args.OutputValueSize);

for (UINT i = 0; i < Args.OutputValueSize; i++) {
             wprintf(L"%d ", Args.OutputBinary[i]);
          }
          wprintf(L"\n");
       }
    }

示例 2:读取驱动程序存储路径

cpp 复制代码
D3DDDI_QUERYREGISTRY_INFO Args = {};
    Args.QueryType = D3DDDI_QUERYREGISTRY_DRIVERSTOREPATH;

    D3DKMT_QUERYADAPTERINFO Args1 = {};
    Args1.hAdapter = hAdapter;
    Args1.Type = KMTQAITYPE_QUERYREGISTRY;
    Args1.pPrivateDriverData = &Args;
    Args1.PrivateDriverDataSize = sizeof(Args);
    NTSTATUS Status = D3DKMTQueryAdapterInfo(&Args1);
    if (NT_SUCCESS(Status) &&
        Args.Status == D3DDDI_QUERYREGISTRY_STATUS_SUCCESS)
    {
        Args.OutputString holds the output NULL terminated string.
        Args.OutputValueSize holds the number of characters in the string
    }
相关推荐
路由侠内网穿透1 天前
本地部署 GPS 跟踪系统 Traccar 并实现外部访问
运维·服务器·网络·windows·tcp/ip
研华嵌入式1 天前
如何在高通跃龙QCS6490 Arm架构上使用Windows 11 IoT企业版?
arm开发·windows·嵌入式硬件
cxr8281 天前
SPARC方法论在Claude Code基于规则驱动开发中的应用
人工智能·驱动开发·claude·智能体
带娃的IT创业者1 天前
Windows 平台上基于 MCP 构建“文心一言+彩云天气”服务实战
人工智能·windows·文心一言·mcp
csdn_aspnet2 天前
Windows Node.js 安装及环境配置详细教程
windows·node.js
摇滚侠2 天前
java语言中,list<String>转成字符串,逗号分割;List<Integer>转字符串,逗号分割
java·windows·list
Source.Liu2 天前
【Pywinauto库】12.2 pywinauto.element_info 后端内部实施模块
windows·python·自动化
Source.Liu2 天前
【Pywinauto库】12.1 pywinauto.backend 后端内部实施模块
开发语言·windows·python·自动化
sukalot2 天前
window显示驱动开发—显示适配器的子设备
驱动开发
私人珍藏库2 天前
[Windows] FileOptimizer v17.1.0_一款文件批量压缩工具
windows·批量压缩