【发布时间】:2020-01-24 19:29:02
【问题描述】:
我有一个在 Windows 10 上运行的 32 位可执行文件。系统 DEP 设置为 OptIn。
我调用 GetProcessDEPPolicy 并返回:
dwFlags == 0 // DEP is disabled
bPermanent == 184 // which means TRUE, so permanent
这意味着我不应该改变它。但是,这是在启动时正确的,所以我应该能够更改它。
在任何情况下,如果我忽略 bPermanent 并使用 PROCESS_DEP_ENABLE 调用 SetProcessDEPPolicy,然后再次调用 GetProcessDEPPolicy,它就会返回:
dwFlags == 1 // DEP is enabled
bPermanent == 1 // Also TRUE, so supposedly still permanent
如果我再次调用 SetProcessDEPPolicy,那么它会开始失败,我无法将其更改回来。
所以我的问题是:为什么 GetProcessDEPPolicy 在第一次调用时返回 bPermanent?它确实看起来像一个错误/回归,我认为这是行为上的变化,因为这段代码已经存在了十年,我确信它在 Windows 7 和 8 中可以正常工作。
【问题讨论】:
-
它会返回
bPermanent == 184- 当然不是。更快GetProcessDEPPolicy返回 false 和垃圾bPermanent或者你看起来很糟糕 -
GetPRocessDEPPolicy 返回 1,所以成功,所以 bPermanent 应该是正确的。从情况的不准确性判断,184 很可能是垃圾,但 Windows API 使用 1 以外的标志和值来指示 TRUE 的情况并不少见。
-
我绝对确定你的代码是错误的或者你看起来很糟糕
-
@RbMm,请参阅以下 Microsoft 的回复。您应该谨慎对待绝对确定性。
-
GetProcessMitigationPolicynot clearPROCESS_MITIGATION_DEP_POLICY.Permanent如果选项不是永久性的,因为这里的堆栈是垃圾。但如果选项是永久性的 - api 正确地说Permanent为 true