GetProcessDEPPolicy говорит, что постоянно, но это не так - PullRequest
2 голосов
/ 24 января 2020

У меня есть 32-битный исполняемый файл, работающий на Windows 10. Системный DEP установлен в OptIn.

Я вызываю GetProcessDEPPolicy, и он возвращает:

dwFlags ==  0   // DEP is disabled
bPermanent == 184   // which means TRUE, so permanent

Это означает, что я не должно быть в состоянии изменить это. Тем не менее, это правильно при запуске, поэтому я ДОЛЖЕН иметь возможность изменить его.

В любом случае, если я проигнорирую bPermanent и вызову SetProcessDEPPolicy с PROCESS_DEP_ENABLE, а затем снова вызовет GetProcessDEPPolicy, тогда он вернет:

dwFlags == 1 // DEP is enabled
bPermanent == 1   // Also TRUE, so supposedly still permanent

И если я снова вызову SetProcessDEPPolicy, ТОГДА он начинает отказывать, и я не могу изменить его обратно.

Итак, мой вопрос: почему GetProcessDEPPolicy возвращает bPermanent для первого вызова? Это похоже на ошибку / регрессию, и я думаю, что это изменение в поведении, так как этот код существует уже десять лет, и я уверен, что он работал правильно в Windows 7 & 8.

1 Ответ

4 голосов
/ 25 января 2020

Это дефект в функции GetProcessDEPPolicy. Вы можете обойти это, используя вместо этого функцию GetProcesMitigationPolicy.

PROCESS_MITIGATION_DEP_POLICY policy = { 0 }; // important to preinitialize with 0
GetProcessMitigationPolicy(hProcess, ProcessDEPPolicy, &policy, sizeof(policy));

Извините.

...