You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 1709中调用CreateEnclave创建VBS Enclave失败(错误0x32)求助

解决Windows 1709中CreateEnclave返回ERROR_NOT_SUPPORTED(0x32)的问题

你遇到的0x32错误对应ERROR_NOT_SUPPORTED,这个问题通常和系统配置、权限或者API参数的不正确使用有关。下面一步步帮你排查和解决:

1. 先确认系统是否真的满足VBS Enclave的运行条件

虽然IsEnclaveTypeSupported返回了TRUE,但这只是说明CPU和系统版本支持VBS类型的Enclave,还需要确保系统已经启用了Virtualization-Based Security (VBS):

  • 检查BIOS/UEFI设置:确保启用了Intel VT-x/AMD-V、SLAT(Second Level Address Translation),以及VBS相关的选项(不同厂商的BIOS选项名称可能不同,比如"Virtualization-Based Security"或"Device Guard")。
  • 验证系统VBS状态:打开命令提示符,运行systeminfo,查看"Virtualization-Based Security"条目是否显示为"Enabled";或者用PowerShell执行:
    Get-WindowsOptionalFeature -Online -FeatureName VirtualizationBasedSecurity
    
    确保状态是Enabled。如果未启用,需要通过组策略开启(组策略路径:计算机配置 > 管理模板 > 系统 > Device Guard > 打开基于虚拟化的安全)。

2. 修正OpenProcess的调用问题

你的代码里用OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessPid())来获取当前进程句柄,这既没必要又可能导致权限问题:

  • 当前进程本身就拥有创建Enclave的权限,直接用GetCurrentProcess()即可,无需额外打开。
  • PROCESS_ALL_ACCESS权限过高,在UAC启用的环境下可能会被拒绝,即使是当前进程。如果一定要打开进程,只需请求PROCESS_CREATE_ENCLAVE权限。

3. 调整CreateEnclave的参数

你的代码里几个参数可能需要调整:

  • 初始内存大小:0x10000(64KB)太小了,VBS Enclave需要足够的内存来加载DLL和运行代码,建议至少设为0x100000(1MB),或者根据你要加载的DLL大小调整。
  • ENCLAVE_VBS_FLAG_DEBUG_ENABLED:你设置vci.Flags = 1,这对应ENCLAVE_VBS_FLAG_DEBUG_ENABLED,如果不是在调试场景下,建议设为0;如果确实需要调试,要确保系统允许调试Enclave(需要开启相关的调试权限或组策略)。
  • 基地址参数:设为NULL让系统自动分配是正确的,无需手动指定。

修正后的代码示例

#include <windows.h>
#include <stdio.h>

int main() {
    // 直接使用当前进程句柄,无需额外打开
    HANDLE hProcess = GetCurrentProcess();

    // 确认VBS Enclave类型支持
    BOOL vbsSupport = IsEnclaveTypeSupported(ENCLAVE_TYPE_VBS);
    if (!vbsSupport) {
        printf("VBS Enclave is not supported on this system.\n");
        return 1;
    }

    ENCLAVE_CREATE_INFO_VBS vci = { 0 };
    // 非调试场景下Flags设为0
    vci.Flags = 0;

    // 初始分配1MB内存,可根据实际需求调整
    SIZE_T initialSize = 0x100000;
    LPVOID lpEnclaveBase = CreateEnclave(
        hProcess,
        NULL,               // 让系统自动分配Enclave基地址
        initialSize,
        NULL,               // VBS Enclave不需要零页参数
        ENCLAVE_TYPE_VBS,
        &vci,
        sizeof(ENCLAVE_CREATE_INFO_VBS),
        NULL                // 不需要返回实际分配的大小
    );

    if (lpEnclaveBase == NULL) {
        DWORD err = GetLastError();
        printf("CreateEnclave failed with error: 0x%X\n", err);
        return 1;
    }

    printf("Enclave created successfully at base address: 0x%p\n", lpEnclaveBase);

    // 接下来加载DLL到Enclave内存
    // 示例:加载test.dll
    BOOL loadResult = LoadEnclaveImage(
        hProcess,
        lpEnclaveBase,
        L"test.dll",       // 替换为你的DLL路径
        NULL,
        0,
        NULL
    );

    if (!loadResult) {
        DWORD err = GetLastError();
        printf("LoadEnclaveImage failed with error: 0x%X\n", err);
        // 清理Enclave
        CloseEnclave(hProcess, lpEnclaveBase, 0);
        return 1;
    }

    // 后续可以调用Enclave内的函数,记得先获取函数地址
    // ...

    // 用完后关闭Enclave
    CloseEnclave(hProcess, lpEnclaveBase, 0);
    return 0;
}

额外注意事项

  • 确保进程以管理员身份运行:创建VBS Enclave需要管理员权限,否则可能会返回权限相关的错误。
  • 检查DLL的兼容性:要加载的DLL必须是兼容Enclave的(比如不能包含某些未被Enclave支持的系统API),否则LoadEnclaveImage会失败。

内容的提问来源于stack exchange,提问作者AK87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:13:56