А таки тормоз, да. Ведь обычный сценарий работы с этой функцией таков:
//
// STEP 2: Get security descriptor (SD) of the file specified.
//
fAPISuccess = GetFileSecurity(lpszFileName,
secInfo, pFileSD, 0, &cbFileSD);
// API should have failed with insufficient buffer.
if (fAPISuccess)
__leave;
else if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
_tprintf(TEXT("GetFileSecurity() failed. Error %d\\n"),
GetLastError());
__leave;
}
pFileSD = myheapalloc(cbFileSD);
if (!pFileSD) {
_tprintf(TEXT("HeapAlloc() failed. Error %d\\n"), GetLastError());
__leave;
}
fAPISuccess = GetFileSecurity(lpszFileName,
secInfo, pFileSD, cbFileSD, &cbFileSD);
if (!fAPISuccess) {
_tprintf(TEXT("GetFileSecurity() failed. Error %d\\n"),
GetLastError());
__leave;
}
То есть, вначале гарантировано оно падает с сообщением "мало памяти" но при этом говорит сколько памяти ей нужно, мы создаем буфер, второй раз вызываем уже с созданым буфером и оно уже должно отработать как надо (при условии что при втором вызове требуемый размер еще не увеличился).
Впрочем, я не вижу необходимости менять язык для поддержки массивов неизвестной на этапе компиляции длины.
Делается это очень просто:
CONST
unknown = 0;
...
VAR
arr : POINTER TO ARRAY unknown OF CHAR;
...
arr := MALLOC(len); (* :-) *)