RangeCheckError в JEDI WSCL - PullRequest
       11

RangeCheckError в JEDI WSCL

2 голосов
/ 16 декабря 2009

Я использую JEDI WSCL , чтобы изменить разрешения для папки во время установки. При компиляции без оптимизации и с проверкой диапазона я получаю проверку диапазона при настройке нового списка контроля доступа.

procedure SetFilePermissions(const folder: string);
var
  FileObject: TJwSecureFileObject;
  DACL: TJwDAccessControlList;
begin
  FileObject := TJwSecureFileObject.Create(folder);
  try
     DACL := FileObject.DACL;
     JwInitWellknownSIDs;
     DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(nil, [afObjectInheritAce],   GENERIC_ALL, JwWorldSID, false));
     FileObject.SetDACL(DACL);
  finally
    FileObject.Free;
  end;
end;

Похоже, что это происходит от функции TJwSecurityId.CreateCopyOfSID () в JwsclSid.pas, но я не могу понять, почему.

У кого-нибудь есть подсказка?

Я использую Delphi 2007, кстати, и код wscl является последним из sourceforge.

С уважением,
-Vegar

1 Ответ

9 голосов
/ 16 декабря 2009

Причиной является объявление структуры PSID. У него есть член под названием SubAuthority это определяется следующим образом:

SubAuthority: массив [0..ANYSIZE_ARRAY - 1] из DWORD;

ANYSIZE_ARRAY - это константа, которая установлена ​​в 1, и, таким образом, диапазон массива составляет от 0 до 0. Это конструкция c, преобразованная в Delphi, но Delphi не знает этого. Структура создается безопасно, выделяя достаточно места, чтобы в массиве было больше одного DWORD.

Это исключение случается довольно часто, если вы используете структуры переменных c в Delphi с активированной ошибкой проверки диапазона.

Однако в качестве решения вы можете отключить переключатель для JWSCL, открыв файл jwscl.inc и добавив {$ R-}. AFAIK переключатель действует только до конца каждого блока, а затем используется значение по умолчанию. Файл inc включен в каждый файл jwscl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...