Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах / 11 сообщений из 11, страница 1 из 1
28.05.2018, 17:21
    #39651247
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах
Привет всем,

при копировании прав в окнах через GetFileSecurity нужно выделить достаточный объём памяти под структуру дескриптора безопасности копируемого файла/папки. Дабы потом через GetMem или HeapAlloc её выделить и передать в GetFileSecurity.
В Delphi есть такая константа SECURITY_DESCRIPTOR_MIN_LENGTH, но она задаёт минимальный размер и годится только для сброса настроек безопасности. Есть так же GetSecurityDescriptorLength но она работает с уже заполненной структурой и толка от неё мало.
Посоветуйте как определить необходимый объём памяти в этом случае?


Спасибо.
...
Рейтинг: 0 / 0
28.05.2018, 17:24
    #39651251
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах
hlopotunПосоветуйте как определить необходимый объём памяти в этом случае?
Дам шикарный совет. Только без обид. Документация обычно содержит необходимые ответы.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
BOOL WINAPI GetFileSecurity(
  _In_      LPCTSTR              lpFileName,
  _In_      SECURITY_INFORMATION RequestedInformation,
  _Out_opt_ PSECURITY_DESCRIPTOR pSecurityDescriptor,
  _In_      DWORD                nLength,
  _Out_     LPDWORD              lpnLengthNeeded
);
...
Рейтинг: 0 / 0
28.05.2018, 17:26
    #39651256
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах
последний параметр GetFileSecurity возвращает сколько ему нужно.
если нужно больше чем ты задал, то дескриптор в буфер не передаётся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.05.2018, 17:42
    #39651265
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах
Мимопроходящий,

GetLastError вываливает ошибку 122 (не хватает выделенного места)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
……
    oSecurityInformation :=  OWNER_SECURITY_INFORMATION
                            + GROUP_SECURITY_INFORMATION
                            + DACL_SECURITY_INFORMATION
                            + SACL_SECURITY_INFORMATION;
…..
var dwSize: DWord;
oSecurityInformation: SECURITY_INFORMATION;
……
    if not GetFileSecurity(PChar(inFile), oSecurityInformation, Pointer(1), 0,
      dwSize) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
begin
…..
     GetMem(psd,dwSize);
            if psd <> nil then
              begin
                if not(GetFileSecurity(PChar(inFile), oSecurityInformation, psd,
                  dwSize, dwSize)) then
                  begin
                    // сюда не попадает из чего можно сделать вывод что памяти все таки хватило, но
                    result := false;
                  end
                  else
                  begin
                    nLE := GetLastError; // = вываливает 122 ю ошибку. Получается и GetFileSecurity отработал и вернул True и ошибка при этом есть.
                  end;
……………..



как то это не совсем понятно, ошибка и есть и нет
...
Рейтинг: 0 / 0
28.05.2018, 17:43
    #39651267
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах
да, понятно что
psd: PSECURITY_DESCRIPTOR;
...
Рейтинг: 0 / 0
28.05.2018, 17:53
    #39651274
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах
hlopotun,

Если он вернул TRUE - значит отработал, GetLastError в этом случае может вообще не устанавливаться, и 122я ошибка остаётся от предыдущего вызова, например.
...
Рейтинг: 0 / 0
28.05.2018, 18:00
    #39651284
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах
alekcvphlopotun,

Если он вернул TRUE - значит отработал, GetLastError в этом случае может вообще не устанавливаться, и 122я ошибка остаётся от предыдущего вызова, например.

по доке GetLastError вроде сбрасывает последнее состояние ошибки. И он там явно вызывается. Что то тут не так.
...
Рейтинг: 0 / 0
28.05.2018, 18:09
    #39651288
Tactical Nuclear Penguin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах
hlopotunпо доке GetLastError вроде сбрасывает последнее состояние ошибки.

а мужики то не знают!!
можно ссылочку на доку?
...
Рейтинг: 0 / 0
28.05.2018, 18:12
    #39651291
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах
var
SD: PSECURITY_DESCRIPTOR;
Len: Cardinal;
begin
GetFileSecurity(PChar('12345.txt'), DACL_SECURITY_INFORMATION, nil, 0, Len);
SD := HeapAlloc(GetProcessHeap, 8, Len);
GetFileSecurity(PChar('12345.txt'), DACL_SECURITY_INFORMATION, SD, Len, Len);
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.05.2018, 18:40
    #39651308
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах
Tactical Nuclear Penguinhlopotunпо доке GetLastError вроде сбрасывает последнее состояние ошибки.

а мужики то не знают!!
можно ссылочку на доку?

тут вроде.

Код: pascal
1.
 Calling this function usually resets the operating system error state. 
...
Рейтинг: 0 / 0
28.05.2018, 18:45
    #39651309
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах
hlopotun,

1. Документацию на API-функции лучше смотреть тут .
2. Там, кстати, прямо написано:
MSDNHowever, some functions also set the last-error code when they succeed.;Т.е. далеко не все функции сбрасывают код ошибки при успешном завершении.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выделение необходимой памяти под дескриптор безопасности в 32/64 окнах / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]