Форум: "Система";
Текущий архив: 2003.10.20;
Скачать: [xml.tar.bz2];
ВнизNTFS ADS (Alternative Data Streams) - поиск Найти похожие ветки
← →
AlexRush (2003-08-04 15:24) [0]Как осуществлять поиск subj ?
← →
ZZ (2003-08-04 16:12) [1]Чего хочу моя есть никак не понять :)) Кого и где ты собрался искать?
← →
Reindeer Moss Eater (2003-08-04 16:25) [2]Никак не найти. Надо заранее знать имена потоков.
Хотя сами такие файлы найти возможно.
← →
Е-Моё имя (2003-08-04 16:58) [3]поищи в сети-есть утилиты для их поиска
у меня дома есть, но как называется-не помню
← →
AlexRush (2003-08-04 17:04) [4]2Reindeer Moss Eater > Хотя сами такие файлы найти возможно. - "такие файлы" -- это ( :$DATA) 2Reindeer Moss Eater > Хотя сами такие файлы найти возможно. - "такие файлы" -- это файлы, которые имеют более одного (:$DATA) потока ? Если да, то как их обнаружить ?
2All под "поиском" я понимаю поиск средствами API (документированного или нет) но не работы с файловой системой через драйвер.
← →
Reindeer Moss Eater (2003-08-04 18:12) [5]Если да, то как их обнаружить ?
Косвенно. Например размер файла большой, а внутри какжется что пусто (Данные в доп. потоках)
← →
Е-Моё имя (2003-08-04 18:52) [6]размер файла не учитывает дополнительные потоки
← →
Е-Моё имя (2003-08-04 18:53) [7]в доп. потоке можно спрятать несколько гиг, а файл будет трехбайтовый, с известными тремя буквами ;))
← →
AlexRush (2003-08-04 18:56) [8]2Reindeer Moss Eater (04.08.03 18:12), вообще-то Е-Моё имя © (04.08.03 18:53) прав.
← →
AlexRush (2003-08-04 19:01) [9]Ставим вопрос более конкретно:
Можно ли с пом. стандартного набора API-функций (как документированных, так и нет) найти дополнительные ADS (кроме умалчиваемого :$DATA) не зная имен потоков ?
или же...
зная имя файла, определить, есть ли у него дополнительные ADS ?
← →
ZZ (2003-08-04 19:21) [10]А что, в msdn ничего? Например про BackupRead..
А :$DATA не самый умалчиваемый :)
← →
AlexRush (2003-08-04 20:31) [11]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 nonzero value, and the variable pointed to by lpNumberOfBytesRead is zero, then all the data associated with the file handle has been read. - что-то у меня никогда она zero не бывает :(
Ежели не затруднит, объясни вышеозначенные моменты.
← →
Alex Konshin (2003-08-05 06:23) [12]http://www.sysinternals.com/ntw2k/source/misc.shtml#Streams
← →
ZZ (2003-08-05 10:45) [13]Вот накатал примерчик... вроде даже работает :))
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;
← →
ZZ (2003-08-05 11:20) [14]Чуть не забыл
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;
← →
AlexRush (2003-08-05 12:03) [15]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)
← →
AlexRush (2003-08-05 12:05) [16]2ZZ © (05.08.03 11:20) Ну про LARGE_INTEGER и LPWIN32_STREAM_ID я догадался :)
← →
ZZ (2003-08-05 12:18) [17]Ну я пропустил первые 20 (DWORD*3 + LARGE_INTEGER*1) байт.. А это как раз будет cStreamName[0].. вроде так :))
← →
AlexRush (2003-08-05 12:39) [18]2ZZ © (05.08.03 12:18) - ну это, что касается PByte(Cardinal(Sid)+20).. это понял :) а первый раз 20 в nNumberOfBytesToRead ?
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.10.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c