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 VirtualizationBasedSecurityEnabled。如果未启用,需要通过组策略开启(组策略路径:计算机配置 > 管理模板 > 系统 > 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
相关产品推荐
相关产品推荐

