Попытка установить 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,

Другие вопросы по тегам