Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

NTFS ADS (Alternative Data Streams) - поиск


AlexRush ©   (2003-08-04 15:24:00) 

Как осуществлять поиск subj ?


AlexRush   (2003-08-05 12:39:00) [1]

2ZZ © (05.08.03 12:18) - ну это, что касается PByte(Cardinal(Sid)+20).. это понял :) а первый раз 20 в nNumberOfBytesToRead ?


ZZ   (2003-08-05 12:18:00) [2]

Ну я пропустил первые 20 (DWORD*3 + LARGE_INTEGER*1) байт.. А это как раз будет cStreamName[0].. вроде так :))


AlexRush   (2003-08-05 12:05:00) [3]

2ZZ © (05.08.03 11:20) Ну про LARGE_INTEGER и LPWIN32_STREAM_ID я догадался :)


AlexRush   (2003-08-05 12:03:00) [4]

2ZZ
Действительно работает! :)
Но есть непонятки:
MSDN> nNumberOfBytesToRead
[in] Specifies the length of the buffer. The buffer size must be greater than the size of a WIN32_STREAM_ID structure.


sizeof(WIN32_STREAM_ID) == 24,так как структура выровненная, а ты передаешь 20(?)
...сюда же PByte(Cardinal(Sid) +20)


ZZ   (2003-08-05 11:20:00) [5]

Чуть не забыл
type
_WIN32_STREAM_ID = record
dwStreamId : Cardinal;
dwStreamAttributes : Cardinal;
Size : LARGE_INTEGER;
dwStreamNameSize : Cardinal;
cStreamName : array[0..0] of WideChar;
end;
LPWIN32_STREAM_ID = ^_WIN32_STREAM_ID;


ZZ   (2003-08-05 10:45:00) [6]

Вот накатал примерчик... вроде даже работает :))
procedure TForm1.Button1Click(Sender: TObject);
var
hFile : THandle;
Ptr : Pointer;
Sid : LPWIN32_STREAM_ID;
cbReaded: Cardinal;
dwLow,dwHigh: Cardinal;
begin
hFile:=CreateFile("C:\test1.txt",GENERIC_READ,0,nil,OPEN_EXISTING,0,0);
if hFile=INVALID_HANDLE_VALUE then ShowMessage(SysErrorMessage(getLastError));

GetMem(Sid,4096);

ptr:=nil;

while (true) do
begin
ZeroMemory(Sid,4096);

if (not BackupRead(hFile,Pointer(Sid),20,cbReaded,false,true,ptr))
then ShowMessage(SysErrorMessage(getLastError));

if (cbReaded=0) then break;

if (not BackupRead(hFile,PByte(Cardinal(Sid)+20),Sid.dwStreamNameSize,cbReaded,false,true,ptr))
then ShowMessage(SysErrorMessage(getLastError))
( 0,@Sid.cStreamName,"Stream",0)

Вот накатал примерчик... вроде даже работает :))
procedure TForm1.Button1Click(Sender: TObject);
var
hFile : THandle;
Ptr : Pointer;
Sid : LPWIN32_STREAM_ID;
cbReaded: Cardinal;
dwLow,dwHigh: Cardinal;
begin
hFile:=CreateFile("C:\test1.txt",GENERIC_READ,0,nil,OPEN_EXISTING,0,0);
if hFile=INVALID_HANDLE_VALUE then ShowMessage(SysErrorMessage(getLastError));

GetMem(Sid,4096);

ptr:=nil;

while (true) do
begin
ZeroMemory(Sid,4096);

if (not BackupRead(hFile,Pointer(Sid),20,cbReaded,false,true,ptr))
then ShowMessage(SysErrorMessage(getLastError));

if (cbReaded=0) then break;

if (not BackupRead(hFile,PByte(Cardinal(Sid)+20),Sid.dwStreamNameSize,cbReaded,false,true,ptr))
then ShowMessage(SysErrorMessage(getLastError))
else MessageBoxW(0,@Sid.cStreamName,"Stream",0);

BackupSeek(hFile,Sid.Size.LowPart,Sid.Size.HighPart,dwLow,dwHigh,@ptr);
end;
FreeMem(Sid);
CloseHandle(hFile);
end;


Alex Konshin   (2003-08-05 06:23:00) [7]

http://www.sysinternals.com/ntw2k/source/misc.shtml#Streams


AlexRush   (2003-08-04 20:31:00) [8]

2ZZ © (04.08.03 19:21)

BackupRead processes all of the data pertaining to an opened object as a series of discrete byte streams. Each stream is preceded by a 32-bit aligned WIN32_STREAM_ID structure.
- Я вот не понял: BackupRead возвращает массив(выровненный) структур WIN32_STREAM_ID за один вызов, или одну ?

Сколько не передай в nNumberOfBytesToRead, lpNumberOfBytesRead столько и содержит (вернет)...
и еще момент: If the function returns a nonzerovalue, and the variable pointed to by lpNumberOfBytesRead is zero, then all the data associated with the file handle has been read.- что-то у меня никогда она zero не бывает :(

Ежели не затруднит, объясни вышеозначенные моменты.


ZZ   (2003-08-04 19:21:00) [9]

А что, в msdn ничего? Например про BackupRead..
А :$DATA не самый умалчиваемый :)


AlexRush   (2003-08-04 19:01:00) [10]

Ставим вопрос более конкретно:
Можно ли с пом. стандартного набора API-функций (как документированных, так и нет) найти дополнительные ADS (кроме умалчиваемого :$DATA) не зная имен потоков ?
или же...
зная имя файла, определить, есть ли у него дополнительные ADS ?


AlexRush   (2003-08-04 18:56:00) [11]

2Reindeer Moss Eater (04.08.03 18:12), вообще-то Е-Моё имя © (04.08.03 18:53) прав.


Е-Моё имя   (2003-08-04 18:53:00) [12]

в доп. потоке можно спрятать несколько гиг, а файл будет трехбайтовый, с известными тремя буквами ;))


Е-Моё имя   (2003-08-04 18:52:00) [13]

размер файла не учитывает дополнительные потоки


Reindeer Moss Eater   (2003-08-04 18:12:00) [14]

Если да, то как их обнаружить ?

Косвенно. Например размер файла большой, а внутри какжется что пусто (Данные в доп. потоках)


AlexRush   (2003-08-04 17:04:00) [15]

2Reindeer Moss Eater > Хотя сами такие файлы найти возможно.- "такие файлы" -- это ( :$DATA)

2Reindeer Moss Eater > Хотя сами такие файлы найти возможно.- "такие файлы" -- это файлы, которые имеют более одного (:$DATA) потока ? Если да, то как их обнаружить ?

2All под "поиском" я понимаю поиск средствами API (документированного или нет) но не работы с файловой системой через драйвер.


Е-Моё имя   (2003-08-04 16:58:00) [16]

поищи в сети-есть утилиты для их поиска
у меня дома есть, но как называется-не помню


Reindeer Moss Eater   (2003-08-04 16:25:00) [17]

Никак не найти. Надо заранее знать имена потоков.
Хотя сами такие файлы найти возможно.


ZZ   (2003-08-04 16:12:00) [18]

Чего хочу моя есть никак не понять :)) Кого и где ты собрался искать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо