在 C# 应用程序中实施数据执行保护 (DEP)
Enforce Data Execution Prevention (DEP) in C# app
我有一个要 运行 具有管理员权限的 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(文档说它应该 return 只有在从 64 位进程调用时才会出现此错误,但事实并非如此)。
而且我可能在 GetProcessDEPPolicy 中有一些错误,因为调用失败并出现错误 87(参数不正确)。可能句柄有误?
因此,解决方案是 更改 Configuration Manager 中的 build 配置 从 AnyCPU 到 x86.现在这两种方法都按预期工作。
AnyCPU 的错误与 x64 相同(默认情况下强制执行 DEP,这些方法应该 return 提到的错误)。
我有一个要 运行 具有管理员权限的 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(文档说它应该 return 只有在从 64 位进程调用时才会出现此错误,但事实并非如此)。
而且我可能在 GetProcessDEPPolicy 中有一些错误,因为调用失败并出现错误 87(参数不正确)。可能句柄有误?
因此,解决方案是 更改 Configuration Manager 中的 build 配置 从 AnyCPU 到 x86.现在这两种方法都按预期工作。
AnyCPU 的错误与 x64 相同(默认情况下强制执行 DEP,这些方法应该 return 提到的错误)。