在C#应用程序中实施数据执行预防(DEP)

在C#应用程序中实施数据执行预防(DEP),c#,.net,security,dep,C#,.net,Security,Dep,我有一个C#应用程序将以管理员权限运行。我想强迫DEP去做这件事。为进程设置DEP On或在DEP被禁用时终止应用程序 但我在这两方面都失败了。 我的代码是: private static void CheckDEP() { var dep = SetProcessDEPPolicy(3); var handle = Process.GetCurrentProcess().Handle; var res = GetProcessDEPPolicy(handle, out

我有一个C#应用程序将以管理员权限运行。我想强迫DEP去做这件事。为进程设置DEP On或在DEP被禁用时终止应用程序

但我在这两方面都失败了。 我的代码是:

private static void CheckDEP()
{
    var dep = SetProcessDEPPolicy(3);

    var handle = Process.GetCurrentProcess().Handle;
    var res = GetProcessDEPPolicy(handle, out var flags, out var permanent);
}

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool SetProcessDEPPolicy(uint dwFlags);

[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
static extern bool GetProcessDEPPolicy(IntPtr hProcess, out uint lpFlags, out bool lpPermanent);
调用函数SetProcessDEPPolicy(3)总是失败,出现错误50(文档说明,只有在从64位进程调用函数时,它才应返回此错误,但事实并非如此)


我可能在GetProcessDEPPolicy中有一些bug,因为调用失败,出现错误87(参数不正确)。可能句柄有误?

因此,解决方案是将configuration Manager中的构建配置从任意CPU更改为x86。现在这两种方法都如预期的那样工作


任何CPU的错误与x64的错误相同(默认情况下,DEP是强制的,这些方法应该返回提到的错误)。

几乎所有现代机器都使用选择AlwaysOn的Boot.ini运行。正如它所说,在代码中更改它是不受支持的