Попытка установить ProcessStrictHandleCheckPolicy возвращает 87 - Неверная функция
Я пытаюсь использовать SetProcessMitigationPolicy
в Windows 10 для включения ProcessStrictHandleCheckPolicy:
Процесс получит фатальную ошибку, если манипулирует недопустимым дескриптором.
Как правило, строгая проверка дескрипторов не может быть отключена после включения. Следовательно, при вызове функции SetProcessMitigationPolicy с этой политикой значения элементов подструктуры RaiseExceptionOnInvalidHandleReference и HandleExceptionsPermanentlyEnabled должны совпадать. Невозможно разрешить недопустимые исключения дескриптора только временно.
Я могу включить ряд других смягчений:
ProcessDynamicCodePolicy
: Политика динамического кода процесса. При включении процесс не может генерировать динамический код или изменять существующий исполняемый код.ProcessExtensionPointDisablePolicy
Содержит параметры политики смягчения процессов для устаревших библиотек точек расширения.ProcessSignaturePolicy
: Политика процесса, которая может ограничивать загрузку изображений теми изображениями, которые подписаны Microsoft, Магазином Windows или Microsoft, Магазином Windows и Лабораториями качества оборудования Windows (WHQL).ProcessFontDisablePolicy
: Политика в отношении загрузки шрифтов для процесса. При включении процесс не может загружать несистемные шрифты.ProcessImageLoadPolicy
: Политика в отношении загрузки изображений для процесса, которая определяет типы исполняемых изображений, которые разрешено отображать в процессе. Когда включено, изображения не могут быть загружены из некоторых мест, таких как удаленные устройства или файлы, которые имеют обязательную низкую метку.
Но ProcessStrictHandleCheckPolicy:
PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY policy;
policy.RaiseExceptionOnInvalidHandleReference = 1;
policy.HandleExceptionsPermanentlyEnabled = 1;
BOOL res = SetProcessMitigationPolicy(ProcessStrictHandleCheckPolicy, policy, sizeof(policy));
if (!res)
RaiseLastWin32Error();
не удается с кодом ошибки 87:
ERROR_INVALID_PARAMETER
Неверный параметр
Что случилось?
Бонус Болтовня
Политика ProcessDynamicCodePolicy не позволяет встроенному веб-браузеру запускать Javascript:
ProhibitDynamicCode
: Установите (0x1), чтобы запретить процессу генерировать динамический код или изменять существующий исполняемый код; в противном случае оставьте неустановленным (0x0).AllowThreadOptOut
: Установите (0x1), чтобы позволить потокам отказаться от ограничений динамической генерации кода, вызвав функцию SetThreadInformation с параметром ThreadInformation, равным ThreadDynamicCodePolicy; в противном случае оставьте неустановленным (0x0). Не следует использовать параметры AllowThreadOptOut и ThreadDynamicCodePolicy вместе для обеспечения высокой безопасности. Эти настройки предназначены только для того, чтобы приложения могли легче адаптировать свой код для ограничения полного динамического кода.
Больше Bonuser
Я на самом деле в Delphi, поэтому синтаксис отличается от приведенного выше псевдокода C/C++/C#:
type
//ProcessStrictHandleCheckPolicy - The process will receive a fatal error if it manipulates an invalid handle. Useful for preventing downstream problems in a process due to handle misuse.
PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY = record
Flags: DWORD;
//DWORD RaiseExceptionOnInvalidHandleReference : 1;
//DWORD HandleExceptionsPermanentlyEnabled : 1;
//DWORD ReservedFlags : 30;
end;
procedure SetMitigationPolicy;
var
policy: PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY;
res: BOOL;
begin
policy.Flags := $00000002;
res := SetProcessMitigationPolicy(ProcessStrictHandleCheckPolicy, @policy, sizeof(policy));
if not res then
RaiseLastWin32Error;
end;
Это не меняет вопрос:
- иногда, когда я публикую код Delphi, и он не связан исключительно с Delphi, я получаю комментарии, которые я должен был включить тег Delphi
- иногда, когда я публикую код Delphi, и он не связан исключительно с Delphi, я получаю комментарии, которые не должны были включать тег Delphi
бросает кости
Не включайте теги delphi delphi-xe6.
Бонус Чтение
1 ответ
От PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY
документация:
Как правило, строгая проверка дескрипторов не может быть отключена после включения. Следовательно, при вызове функции SetProcessMitigationPolicy с этой политикой значения элементов подструктуры RaiseExceptionOnInvalidHandleReference и HandleExceptionsPermanentlyEnabled должны совпадать. Невозможно разрешить недопустимые исключения дескриптора только временно.
Когда вы написали:
policy.Flags := $00000002;
Вы только установите HandleExceptionsPermanentlyEnabled
флаг, но не RaiseExceptionOnInvalidHandleReference
флаг. Это должно быть вместо этого, который устанавливает оба флага:
policy.Flags := $00000003;
Я уверен, что вы никогда не запускали свой код C++, потому что он не компилируется. Если вы исправите очевидные ошибки компиляции, то он будет работать успешно.
#define _WIN32_WINNT 0x0602
#include <Windows.h>
#include <Processthreadsapi.h>
#include <iostream>
int main()
{
PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY policy = { 0 };
policy.RaiseExceptionOnInvalidHandleReference = 1;
policy.HandleExceptionsPermanentlyEnabled = 1;
BOOL res = SetProcessMitigationPolicy(ProcessStrictHandleCheckPolicy, &policy,
sizeof(policy));
DWORD err = 0;
if (!res)
err = GetLastError();
std::cout << res << ", " << err;
}
Эта программа выводит 1, 0
как и ожидалось. Если вы добавите
policy.Flags = 0x00000002;
непосредственно перед звонком SetProcessMitigationPolicy
то вывод 0, 87
,