Исправление ошибки 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 для перечислений.
Это решение позволяет избежать ошибки 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.