На страже файлов Фленов Михаил Хакер, номер #094, стр. 094-126-3 - указатель на список, в который нужно добавить запись; - уже знакомая нам ревизия, которая должна быть равна ACL_REVISION; - позиция, в которую нужно вставить запись. Если указать ноль, то вставка произойдет в начале списка, а если указать MAXWORD — в конце списка; - указатель на один или несколько ACE-записей; - общий размер добавляемых записей. Новая запись Все существующие записи мы уже скопировали в список. Если какую-то из них ты хочешь удалить, то нужно правильно пересчитать размер списка. Теперь нам предстоит добавить новую разрешающую запись, которая не существовала ранее. Для этого используется функция AddAccessAllowedAce, которой необходимо передать указатель на список ACL, ревизию, маску прав доступа и идентификатор SID пользователя, которому дается разрешение. В заголовочном файле windows.pas эта функция объявлена следующим образом: function AddAccessAllowedAce( var pAcl: TACL; dwAceRevision: DWORD; AccessMask: DWORD; pSid: PSID ): BOOL; stdcall; Маску прав доступа мы рассматривали в прошлый раз, когда учились читать записи. В нашем случае необходимо разрешить все, а значит, в третьем параметре указываем флаг GENERIC_ALL. SID пользователя Everyone мы уже нашли, и добавление новой записи в ACL-список будет выглядеть следующим образом: AddAccessAllowedAce(pNewDACL^, 2, GENERIC_ALL, sidValue) Для добавления запрещающей записи необходимо использовать функцию AddAccessDeniedAce. У нее параметры такие же, как и у AddAccessAllowedAce, разница только в том, что указанные флаги доступа действуют как запрещение. Функции очень похожи внешне и одинаковы при вызове, поэтому не будем тратить свое драгоценное время на их рассмотрение. Создание дескриптора Все, новый список готов, но он пока еще ни с чем не связан. Необходимо создать новый дескриптор для данного списка. Старый использовать не получится, потому что он занят. Для создания нового дескриптора заведем переменную pNewSD типа PSECURITY_DESCRIPTOR. Эта переменная является указателем, а значит, требует выделения памяти. Сколько памяти выделить? Вполне достаточно минимума, который равен значению константы SECURITY_DESCRIPTOR_MIN_LENGTH. В моем заголовочном файле windows.pas эта константа равна 20-ти. После выделения памяти инициализируем дескриптор с помощью функции InitializeSecurityDescriptor: // выделяем память под дескриптор pNewSD := PSECURITY_DESCRIPTOR( LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH)); //инициализируем дескриптор InitializeSecurityDescriptor(pNewSD, SECURITY_DESCRIPTOR_REVISION); Инициализация обязательна, иначе дескриптор будет недоступен и его нельзя будет связать с ACL-списком. У функции InitializeSecurityDescriptor два параметра: указатель на переменную дескриптор и ревизия, которая должна быть равна константе SECURITY_DESCRIPTOR_REVISION. В заголовочном файле эта константа равна единице. Теперь связываем дескриптор с нашим списком с помощью функции SetSecurityDescriptorDacl. У этой функции четыре параметра: - указатель на дескриптор, который нужно связать с ACL-списком; |