![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]
Чего хочу моя есть никак не понять :)) Кого и где ты собрался искать?