调用SetProcessMitigationPolicy设置ProcessDEPPolicy时遇错误50(不支持)
解决SetProcessMitigationPolicy设置ProcessDEPPolicy返回错误50的问题
问题场景
调用SetProcessMitigationPolicy设置ProcessDEPPolicy时返回错误代码50(ERROR_NOT_SUPPORTED),自查已满足官方文档要求,调整Enable和Permanent字段取值后问题仍存在。
相关代码:
PROCESS_MITIGATION_DEP_POLICY PMDP{}; PMDP.Enable = 1; PMDP.Permanent = 1; if (!SetProcessMitigationPolicy(ProcessDEPPolicy, &PMDP, sizeof(PMDP))) { DWORD error = GetLastError(); spdlog::critical("Failed to apply ProcessDEPPolicy! Error code: {}", error); return false; }
执行输出:
Failed to apply ProcessDEPPolicy! Error code: 50
排查与解决方法
1. 检查Permanent字段的设置时机
Permanent=1要求进程处于初始化极早期——如果进程已经执行了大量代码、加载了第三方模块,或者分配过可写可执行的内存区域,此时再设置Permanent会直接返回错误50。
解决:将这段DEP设置代码移到程序最开始执行的位置(比如main函数的第一行,或全局初始化代码中),确保在任何其他模块加载、内存分配前执行。
2. 拆分测试Enable与Permanent
先单独设置Enable=1、Permanent=0,测试是否能成功:
PROCESS_MITIGATION_DEP_POLICY PMDP{}; PMDP.Enable = 1; PMDP.Permanent = 0; if (!SetProcessMitigationPolicy(ProcessDEPPolicy, &PMDP, sizeof(PMDP))) { // 处理错误逻辑 }
如果此代码能成功,说明问题完全出在Permanent字段的设置限制上,需回到步骤1调整执行时机,或改用进程创建时设置的方案。
3. 验证系统全局DEP配置
系统全局DEP关闭会导致进程级设置失败:
- 打开管理员命令提示符,执行:
bcdedit /enum {current} - 查看
nx项的取值,需为OptIn/OptOut/AlwaysOn,不能是AlwaysOff。 - 若为
AlwaysOff,执行以下命令开启后重启系统:bcdedit /set nx AlwaysOn
4. 改用进程创建时设置DEP(适用于必须开启Permanent的场景)
如果必须启用Permanent且无法调整现有进程的执行时机,可通过CreateProcess创建进程时直接指定DEP策略,避免后续设置失败:
STARTUPINFOEX si = { sizeof(STARTUPINFOEX) }; PROCESS_MITIGATION_DEP_POLICY depPolicy = { 0 }; depPolicy.Enable = 1; depPolicy.Permanent = 1; SIZE_T bufferSize = 0; InitializeProcThreadAttributeList(nullptr, 1, 0, &bufferSize); si.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)malloc(bufferSize); InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &bufferSize); UpdateProcThreadAttribute(si.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY, &depPolicy, sizeof(depPolicy), nullptr, nullptr); PROCESS_INFORMATION pi; BOOL result = CreateProcessW(L"你的程序路径.exe", nullptr, nullptr, nullptr, FALSE, EXTENDED_STARTUPINFO_PRESENT, nullptr, nullptr, &si.StartupInfo, &pi); if (!result) { DWORD err = GetLastError(); // 处理错误逻辑 } else { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } DeleteProcThreadAttributeList(si.lpAttributeList); free(si.lpAttributeList);
内容的提问来源于stack exchange,提问作者Smux
相关产品推荐
相关产品推荐

