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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:27:39