Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.199 c
3-1118267577
highlander
2005-06-09 01:52
2005.07.18
Работа с БД Firebird, Interbase в Делфи


8-1111300604
dimon__
2005-03-20 09:36
2005.07.18
Как получить изображение с web -камеры!


14-1119531872
kaif
2005-06-23 17:04
2005.07.18
Голосование: кто порождает СПАМ, заказчики или рассыльщики?


3-1118211442
Iova
2005-06-08 10:17
2005.07.18
Запрос по вставке данных в таблицу с участием полей BLOB


4-1116185395
volser
2005-05-15 23:29
2005.07.18
Перехватить обновление рабочего стола





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский