Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

DeviceIoControl c кодом FSCTL_FIND_FILES_BY_SID   Найти похожие ветки 

 
Семен Сорокин ©   (2005-05-23 14:45) [0]

Добрый день мастера, есть вопросик:
Имеется следующий код для "быстрого" сканирования папки, однако результат DeviceIoControl всегда равен 1784 (ERROR_INVALID_USER_BUFFER) какие бы параметры я не пытался туда передать :(

type
 TFIND_BY_SID_DATA = record
                      Restart : DWORD;
                      Sid     : PSID;
                     end;

 TFIND_BY_SID_OUTPUT = array [0..1024] of record
                   FileNameLength: ULONG;
                   FileName: array [0..MAX_PATH-1] of WCHAR;
                  end;
const
 FSCTL_FIND_FILES_BY_SID: cardinal = $9008F;


procedure ScanFiles(ADrive: THandle; const APath: PAnsiChar);
var
 _in: TFIND_BY_SID_DATA;
 _out: TFIND_BY_SID_OUTPUT;
 _bytes: cardinal;
 _sd: pointer;
 _own: pointer;
 _default: LongBool;
 _size: cardinal;
 _err: cardinal;
 _dir: THandle;
 _res: boolean;

...
if (GetNamedSecurityInfo(APath, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION, @_own, nil, nil, nil, _sd) = ERROR_SUCCESS) and
   IsValidSid(_own) then begin
 _in.Restart := 1;
 _size := GetLengthSid(_own);
 _in.Sid := SysGetMem(_size);
 if CopySid(_size, _in.Sid, _own) and  IsValidSid(_in.Sid) then begin
  _dir := CreateFile(APath, FILE_READ_ATTRIBUTES, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
  if _dir = INVALID_HANDLE_VALUE then
   _dir := CreateFile(APath, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
  if _dir = INVALID_HANDLE_VALUE then begin
   //
  end
  else begin
   _err := ERROR_MORE_DATA;                
   while _err = ERROR_MORE_DATA do begin
    _err := NO_ERROR;
    _bytes := 0;
    _res := DeviceIoControl(_dir, FSCTL_FIND_FILES_BY_SID, @_in, SizeOf(DWORD) + _size, @_out, SizeOf(_out), @_bytes, nil);
    if not _res then begin
     _err := GetLastError;
     if _err <> ERROR_MORE_DATA then
      Break
    end;
    FreeMem(__out, __sz);
    _in.Restart := 0
   end;
  end;
  CloseHandle(_dir)
 end;
 FreeMem(_in.Sid, _size)
end
end;


Если кто работал в этом направлении - может быть натолкнет на путь истинный.

С Уважением, Семен.


 
False_Delirium ©   (2005-05-23 15:43) [1]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/find_by_sid_output.asp


 
Семен Сорокин ©   (2005-05-23 16:15) [2]


> False_Delirium ©   (23.05.05 15:43) [1]

хм. видать у меня устаревшая версия MSDN :( однако добавление этих параметров все равно проблемы не решило, я пробовал выделять память вручную (FreeMem(__out, __sz); - вот это лишнее в коде осталось) - всё равно эта же ошибка.

ЗЫ. Спасибо за помощь.


 
False_Delirium ©   (2005-05-23 17:12) [3]

Можно на код с исправлениями взглянуть ?


 
Семен Сорокин ©   (2005-05-23 17:35) [4]

вот:
type
 TFIND_BY_SID_OUTPUT = array [0..1024] of record
               NextEntryOffset: DWORD;
               FileIndex      : DWORD;
               FileNameLength : DWORD;
               FileName       : array [0..MAX_PATH-1] of WCHAR;
              end;


пробовал через указатель задавать выходной буфер:
var
 __out: Pointer;
 __sz: cardinal;

...
__sz := 1024;
__out := SysGetMem(__sz);
_res := DeviceIoControl(_dir, FSCTL_FIND_FILES_BY_SID, @_in, SizeOf(DWORD) + _size, __out{@_out}, __sz{SizeOf(_out)}, _bytes, nil);
...
FreeMem(__out, __sz);


тот же результат, это наводит меня на мысли что проблема во входном буфере.


 
Семен Сорокин ©   (2005-05-23 17:54) [5]

нашел проблему, действительно во входном буфере :) сам дурак:
type
 TFIND_BY_SID_DATA = record
                      Restart : DWORD;
                      Sid     : array [0..1023] of byte;
                     end;


память выделялась не в стеке а в куче:
_in.Sid := SysGetMem(_size);

теперь результат - true, но _bytes почему-то всегда = 0 :(


 
False_Delirium ©   (2005-05-23 18:32) [6]

typedef struct _FIND_BY_SID_OUTPUT
{  
 DWORD NextEntryOffset;  
 DWORD FileIndex;  
 DWORD FileNameLength;  
 WCHAR FileName[1];
} FIND_BY_SID_OUTPUT,
*PFIND_BY_SID_OUTPUT;

это тоже самое, что и ?

TFIND_BY_SID_OUTPUT = array [0..1024] of record
              NextEntryOffset: DWORD;
              FileIndex      : DWORD;
              FileNameLength : DWORD;
              FileName       : array [0..MAX_PATH-1] of WCHAR;
             end;


 
NikNet ©   (2005-05-23 21:22) [7]

Друг может даш полный код? Просто тоже хочу так :)

Вот делал файловый менеджер но он плохо сканировал
вообщем работал с функциями FindFirst,Find...
и плохо сканировал большие каталоги как например System32

Может даш? (Или кто разобрался скиньте пожалуйста =) )


 
NikNet ©   (2005-05-24 15:35) [8]

Удалено модератором
Примечание: Создание пустых сообщений


 
Семен Сорокин ©   (2005-05-25 15:49) [9]


> False_Delirium ©   (23.05.05 18:32) [6]

правильнее будет вот так:
type
 PFIND_BY_SID_OUTPUT = ^TFIND_BY_SID_OUTPUT;
 TFIND_BY_SID_OUTPUT = record
                        NextEntryOffset: DWORD;
                        FileIndex      : DWORD;
                        FileNameLength : DWORD;
                        FileName       : array [0..0] of WCHAR;
                       end;


NikNet ©   (23.05.05 21:22) [7]
стучись в Асю или на мыло.

2 All:
спасибо, вопрос закрыт.


 
n0name   (2005-05-25 17:42) [10]

Нашёл решение, или забил?


 
Семен Сорокин ©   (2005-05-25 19:07) [11]

в данной интерпретации нашел


 
n0name   (2005-05-25 19:15) [12]

То есть пошёл другим путём?
Без FSCTL_FIND_FILES_BY_SID?


 
NikNet ©   (2005-05-25 20:30) [13]

Я её передал вроде быстрее на много рабоает чем ты предлогал...

Я тебе на MAIL скину...

--------------------------------------
Увы она работает на уровне драйвера.
Я думаю драйвер ты сможешь найти...


 
vidiv ©   (2005-05-26 13:11) [14]


> Увы она работает на уровне драйвера

Выход за абстракцию... :)



Страницы: 1 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.064 c
3-1118065913
Андрей (гость)
2005-06-06 17:51
2005.07.18
Создание отчета из DBGrid а


8-1111581394
Alexey A.
2005-03-23 15:36
2005.07.18
Изменение размера JPEG-изображения


3-1114412379
Суслик
2005-04-25 10:59
2005.07.18
ms sql enterpise manager


1-1120045416
KorD
2005-06-29 15:43
2005.07.18
Как получить сокращенный путь к каталогу?


1-1119886394
Sage(Guest)
2005-06-27 19:33
2005.07.18
Получение кода символа в ineger