Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

### Исправление ошибки 87 в Free Pascal при работе с ACL и структурой `EXPLICIT_ACCESS_A`

Delphi , Синтаксис , Справочник по API-функциям

Исправление ошибки 87 в Free Pascal при работе с ACL и структурой EXPLICIT_ACCESS_A

Вопрос разработчиков, использующих Free Pascal (FPC) и библиотеку JwaWinUtils для работы с компонентами безопасности Windows, часто связан с правильным использованием структур, предназначенных для управления доступом. В частности, при работе со структурой EXPLICIT_ACCESS_A и функцией SetEntriesInAclA может возникать ошибка 87, которая указывает на некорректный параметр. В данной статье мы рассмотрим, как можно решить эту проблему, учитывая специфику работы с данными типами в среде разработки Lazarus и FPC.

Объяснение проблемы

Пользователь столкнулся с ошибкой 87 при попытке создать новый ACL (Access Control List) с использованием массива структур EXPLICIT_ACCESS_A в Free Pascal. Ошибка возникает в функции SetEntriesInAclA, и, как выяснилось, проблема может быть связана с неправильным выравниванием структуры EXPLICIT_ACCESS_A.

Анализ кода

В приведенном коде пользователем используется функция SetupAccess, которая пытается создать новый ACL, заполняя массив структур EXPLICIT_ACCESS_A. Структуры инициализируются с определенными настройками доступа и указывают на SID (Security Identifier) для различных групп пользователей.

function SetupAccess(owner: jwawinnt.PSID; var acl: jwawinnt.PACL): boolean;
var
  sidAuthWorld: jwawinnt.SID_IDENTIFIER_AUTHORITY;
  sidAuthNT: jwawinnt.SID_IDENTIFIER_AUTHORITY;
  everyoneSID, adminSID: jwawinnt.PSID;
  ea: Array[0..EA_COUNT-1] of jwaaccctrl.EXPLICIT_ACCESS_A;
  status: jwawintype.DWORD;
begin
  // Инициализация SID и заполнение массива структур EXPLICIT_ACCESS_A
  // ...
  jwawinbase.ZeroMemory(@ea, EA_COUNT * SizeOf(EXPLICIT_ACCESS_A));

  // Заполнение структур параметрами доступа
  // ...
  status := jwaaclapi.SetEntriesInAclA(EA_COUNT - 1, @ea, nil, acl);
  // ...
end;

Подтвержденный ответ

Исходя из обсуждения на Stack Overflow, проблема заключается в размере структуры EXPLICIT_ACCESS_A. В соответствии с документацией Windows, размер этой структуры должен быть 32 байта для 32-битных приложений. Однако, в Jedi (интегрированной среде разработки Lazarus) структура объявляется как packed, что приводит к размеру в 20 байт.

Пользователь уже пытался изменить размер структуры, удалив ключевое слово packed, но это не привело к решению проблемы.

Альтернативное решение

После дополнительного исследования было обнаружено, что проблема не связана с выравниванием записей, а с размером перечислений внутри структуры. В Windows API предполагается, что все перечисления имеют размер 4 байта, что в сумме дает 32 байта для EXPLICIT_ACCESS_A в 32-битной системе.

Проблема заключалась в том, что в версии Jedi, предоставляемой FPC, размер перечислений был установлен в 1 байт из-за ошибки в файле JediAPILib.inc. Это было исправлено в главной ветке FPC (Revision 43608) и должно быть включено в следующее обновление.

Пока это исправление не доступно, можно использовать временное решение, заменив все перечисления на DWORD, что гарантирует корректный размер полей.

type
  TRUSTEE_FIX = packed record
    pMultipleTrustee: Pointer;
    MultipleTrusteeOperation: DWORD;
    TrusteeForm: DWORD;
    TrusteeType: DWORD;
    ptstrName: LPSTR;
  end;

  EXPLICIT_ACCESS_FIX = packed record
    grfAccessPermissions: DWORD;
    grfAccessMode: DWORD;
    grfInheritance: DWORD;
    Trustee: TRUSTEE_FIX;
  end;

И при заполнении структуры EXPLICIT_ACCESS следует использовать значения DWORD для перечислений.

ea[0].grfAccessPermissions := DWORD(GENERIC_ALL);
ea[0].grfAccessMode := DWORD(DENY_ACCESS);
ea[0].grfInheritance := NO_INHERITANCE;
ea[0].Trustee.MultipleTrusteeOperation := DWORD(NO_MULTIPLE_TRUSTEE);
// ...

Это решение позволяет избежать ошибки 87, пока не будет выпущено исправленное обновление FPC.

Заключение

В данной статье мы рассмотрели проблему, связанную с ошибкой 87 при работе с компонентами безопасности в Free Pascal, и предложили временное решение, которое позволяет продолжить разработку, не дожидаясь обновления FPC.

Создано по материалам из источника по ссылке.

Пользователь столкнулся с ошибкой 87 при работе с компонентами безопасности Windows в среде разработки Free Pascal из-за несоответствия размера структуры `EXPLICIT_ACCESS_A` требованиям Windows API.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:24:27/0.0034439563751221/0