вопрос по NTFS MFT парсингу
От: x76adf1  
Дата: 01.06.09 01:18
Оценка:
здрасте, господа.

делаю следующее:
bResult = DeviceIoControl(hVol,
FSCTL_GET_NTFS_VOLUME_DATA,
NULL, 0,
ntfs_vdb, sizeof(*ntfs_vdb),
&junk, (LPOVERLAPPED) NULL);
if (!bResult) return bResult;

size_t mftRecordSize = ntfs_vdb->BytesPerCluster / 4;
LONGLONG total_file_count = ntfs_vdb->MftValidDataLength.QuadPart/mftRecordSize;

затем для каждого из total_file_count читаю PNTFS_FILE_RECORD_OUTPUT_BUFFER, делаю из этого буфера PFILE_RECORD_HEADER и хожу по атрибутам записи в поисках AttributeFileName;
далее делаю PFILENAME_ATTRIBUTE name = PFILENAME_ATTRIBUTE((PATTRIBUTE)((char *)pAttribute + PRESIDENT_ATTRIBUTE(pAttribute)->ValueOffset));
и какого-то чёрта получаю для name имя файла в досовском формате, ну в смысле 8.3... не пойму почему
объясните пожалуйста.

И ещё, при выводе каждого такого имени из числа total_file_count попадается куча одинаковых подряд идущих имён, видимо один файл на несколько записей распределён. Как-нить можно это предотвратить? может какие-нить поля из структур атрибутов об этом могут сказать — не в курсе — уж больно мало инфы про нтфс. Делитесь опытом, господа...
Re: вопрос по NTFS MFT парсингу
От: x64 Россия  
Дата: 01.06.09 01:23
Оценка: 18 (1)
Возможно, этот документ чем-нибудь поможет. Удачи.
Re[2]: вопрос по NTFS MFT парсингу
От: x76adf1  
Дата: 01.06.09 01:31
Оценка:
Здравствуйте, x64, Вы писали:

x64>Возможно, этот документ чем-нибудь поможет. Удачи.



Спасибо конечно, но собсна этим доком я и пользовался :/
Как-то не очень он помог...или я туплю
Re: вопрос по NTFS MFT парсингу
От: De-Bugger  
Дата: 01.06.09 07:17
Оценка:
Здравствуйте, x76adf1, Вы писали:

X>здрасте, господа.


X>делаю следующее:

X>bResult = DeviceIoControl(hVol,
X> FSCTL_GET_NTFS_VOLUME_DATA,
X> NULL, 0,
X> ntfs_vdb, sizeof(*ntfs_vdb),
X> &junk, (LPOVERLAPPED) NULL);
X> if (!bResult) return bResult;

X> size_t mftRecordSize = ntfs_vdb->BytesPerCluster / 4;

X> LONGLONG total_file_count = ntfs_vdb->MftValidDataLength.QuadPart/mftRecordSize;

X>затем для каждого из total_file_count читаю PNTFS_FILE_RECORD_OUTPUT_BUFFER, делаю из этого буфера PFILE_RECORD_HEADER и хожу по атрибутам записи в поисках AttributeFileName;

X>далее делаю PFILENAME_ATTRIBUTE name = PFILENAME_ATTRIBUTE((PATTRIBUTE)((char *)pAttribute + PRESIDENT_ATTRIBUTE(pAttribute)->ValueOffset));
X>и какого-то чёрта получаю для name имя файла в досовском формате, ну в смысле 8.3... не пойму почему
X>объясните пожалуйста.

X>И ещё, при выводе каждого такого имени из числа total_file_count попадается куча одинаковых подряд идущих имён, видимо один файл на несколько записей распределён. Как-нить можно это предотвратить? может какие-нить поля из структур атрибутов об этом могут сказать — не в курсе — уж больно мало инфы про нтфс. Делитесь опытом, господа...


Ваша текушая реализация алгоритма напоминает алгоритм создания авианосца из куска железа и соплей.

Прочитайте пожалуйста еще раз информацию о реализации NTFS. Поверьте, сейчас ее просто море, не то что было несколько лет назад.

Как отправная точка:
1. Кто вам сказал, что первый резидентный атрибут — это атрибут имени файла да еще и в нужном формате.
2. Имен (атрибутов) у NTFS файла может быть несколько.
3. Атрибуты могут находиться в других записях MFT.
Re[2]: вопрос по NTFS MFT парсингу
От: x76adf1  
Дата: 01.06.09 07:43
Оценка:
Здравствуйте, De-Bugger, Вы писали:

DB>Здравствуйте, x76adf1, Вы писали:


X>>здрасте, господа.


X>>...


DB>Ваша текушая реализация алгоритма напоминает алгоритм создания авианосца из куска железа и соплей.

Воу воу воу, сударь, вот только не надо подобного бреда. После прочтения вашего поста создаётся впечатление, что свои мысли из соплей лепите именно ВЫ...

DB>Прочитайте пожалуйста еще раз информацию о реализации NTFS. Поверьте, сейчас ее просто море, не то что было несколько лет назад.

быть голословным очень удобно, я понимаю...

DB>Как отправная точка:

DB>1. Кто вам сказал, что первый резидентный атрибут — это атрибут имени файла да еще и в нужном формате.
кто-то говорил про первый атрибут? кто? где? уж точно не я...
DB>2. Имен (атрибутов) у NTFS файла может быть несколько.
безусловно
DB>3. Атрибуты могут находиться в других записях MFT.
безусловно

прошу читать чужие посты внимательнее и не писать чуши, основанной на собственном недопонимании вопроса.
Всего доброго.
Re[3]: вопрос по NTFS MFT парсингу
От: De-Bugger  
Дата: 01.06.09 08:09
Оценка:
Здравствуйте, x76adf1, Вы писали:

X>Здравствуйте, De-Bugger, Вы писали:


DB>>Здравствуйте, x76adf1, Вы писали:


X>>>здрасте, господа.


X>>>...


DB>>Ваша текушая реализация алгоритма напоминает алгоритм создания авианосца из куска железа и соплей.

X>Воу воу воу, сударь, вот только не надо подобного бреда. После прочтения вашего поста создаётся впечатление, что свои мысли из соплей лепите именно ВЫ...

Нехилый въезд на белом носороге. Удачи на РСДН, нервный вы наш

DB>>Прочитайте пожалуйста еще раз информацию о реализации NTFS. Поверьте, сейчас ее просто море, не то что было несколько лет назад.

X>быть голословным очень удобно, я понимаю...

А что, вам все разжевать и в пасть положить? Или вы считаете что я вам сейчас кину исходники своего проекта где осуществляется работа с NTFS?

X>прошу читать чужие посты внимательнее и не писать чуши, основанной на собственном недопонимании вопроса.


прошу пользоваться поиском, пить новопассит и учиться задавать более конкретные вопросы.
Re[3]: вопрос по NTFS MFT парсингу
От: De-Bugger  
Дата: 01.06.09 08:14
Оценка:
Здравствуйте, x76adf1, Вы писали:

DB>>1. Кто вам сказал, что первый резидентный атрибут — это атрибут имени файла да еще и в нужном формате.

X>кто-то говорил про первый атрибут? кто? где? уж точно не я...

А вот по этому куску да, согласен, прочел невнимательно вот этот момент

и хожу по атрибутам записи в поисках


Хотя в дальнейшем это не оправдывает вашей лжи, когда сначала вы пишете что

...видимо один файл на несколько записей распределён.


А потом отвечаете "безусловно" на утверждение, что атрибуты могут находиться в других записях MFT.
Re[4]: вопрос по NTFS MFT парсингу
От: x76adf1  
Дата: 01.06.09 08:31
Оценка:
Здравствуйте, De-Bugger, Вы писали:

DB>Здравствуйте, x76adf1, Вы писали:


DB>>>1. Кто вам сказал, что первый резидентный атрибут — это атрибут имени файла да еще и в нужном формате.

X>>кто-то говорил про первый атрибут? кто? где? уж точно не я...

DB>А вот по этому куску да, согласен, прочел невнимательно вот этот момент

DB>

DB>и хожу по атрибутам записи в поисках


DB>Хотя в дальнейшем это не оправдывает вашей лжи, когда сначала вы пишете что


DB>

DB>...видимо один файл на несколько записей распределён.


DB>А потом отвечаете "безусловно" на утверждение, что атрибуты могут находиться в других записях MFT.


этот момент я как раз и хотел уточнить из-за нехватки информации

пс: после того, как пособачишься, как-то интереснее общаться, разве нет?
Re: вопрос по NTFS MFT парсингу
От: MShura  
Дата: 01.06.09 09:51
Оценка:
X> size_t mftRecordSize = ntfs_vdb->BytesPerCluster / 4;

Неправильно. Размер записи никак не связан с размером кластера. Разве только с размером сектора.
Насколько я помню на томах с сектором 4К размер записи также 4К
возьмите 'BytesPerFileRecordSegment'


X>затем для каждого из total_file_count читаю PNTFS_FILE_RECORD_OUTPUT_BUFFER, делаю из этого буфера PFILE_RECORD_HEADER и хожу по атрибутам записи в поисках AttributeFileName;

X>далее делаю PFILENAME_ATTRIBUTE name = PFILENAME_ATTRIBUTE((PATTRIBUTE)((char *)pAttribute + PRESIDENT_ATTRIBUTE(pAttribute)->ValueOffset));
X>и какого-то чёрта получаю для name имя файла в досовском формате, ну в смысле 8.3... не пойму почему
X>объясните пожалуйста.
Тип имени указывается в самом атрибуте имени по смещению 0x41 от 'name', прямо перед самим именем.
Возможные значения 0, 1, 2, 3
Что они означают надеюсь найдете сами.
Имена с типом 1,2 всегда идут парами.

X>И ещё, при выводе каждого такого имени из числа total_file_count попадается куча одинаковых подряд идущих имён, видимо один файл на несколько записей распределён. Как-нить можно это предотвратить? может какие-нить поля из структур атрибутов об этом могут сказать — не в курсе — уж больно мало инфы про нтфс. Делитесь опытом, господа...


Если запись состоит из нескольких сегментов, то для перечисления атрибутов нужно руководствоваться исключительно атрибутом 0x20
Re[5]: вопрос по NTFS MFT парсингу
От: x64 Россия  
Дата: 01.06.09 16:58
Оценка: +1 :)
X>пс: после того, как пособачишься, как-то интереснее общаться, разве нет?

Нет.
Re: вопрос по NTFS MFT парсингу
От: Alexander G Украина  
Дата: 02.06.09 22:01
Оценка:
Здравствуйте, x76adf1, Вы писали:

X>И ещё, при выводе каждого такого имени из числа total_file_count попадается куча одинаковых подряд идущих имён, видимо один файл на несколько записей распределён. Как-нить можно это предотвратить? может какие-нить поля из структур атрибутов об этом могут сказать — не в курсе — уж больно мало инфы про нтфс. Делитесь опытом, господа...


Остальное отвечено выше, а насчёт этого — фича у FSCTL_GET_NTFS_FILE_RECORD такая, что если дать несуществующий номер записи, прочитается существующая, в NTFS_FILE_RECORD_OUTPUT_BUFFER::FileReferenceNumber будет номер отличный от заданного, там в Remarks ещё написано.

Файл на несколько записей распределён — такое тоже бывает, но редко, такие записи идут не всегда подряд, и все имена обычно в одной записи.
Русский военный корабль идёт ко дну!
Re[2]: вопрос по NTFS MFT парсингу
От: x76adf1  
Дата: 08.06.09 08:26
Оценка:
Здравствуйте, MShura, Вы писали:

MS>возьмите 'BytesPerFileRecordSegment'

взял

MS>Имена с типом 1,2 всегда идут парами.

что значит "парами"? Лонг и Шорт имена друг за другом идут для каждой записи или я вас неверно понял?

MS>Если запись состоит из нескольких сегментов, то для перечисления атрибутов нужно руководствоваться исключительно атрибутом 0x20

учту, спасибо
Re[3]: вопрос по NTFS MFT парсингу
От: MShura  
Дата: 08.06.09 10:53
Оценка:
MS>>Имена с типом 1,2 всегда идут парами.
X>что значит "парами"? Лонг и Шорт имена друг за другом идут для каждой записи или я вас неверно понял?

Если есть имя с типом 1, то обязательно должно быть имя с типом 2 и наоборот.
Если удаляешь одно имя, то удалять надо и парное
Тип имени участвует в сортировке атрибутов так как он часть резидентного индексного атрибута.
Индексные атрибуты (атрибут имени таков) сравниваются бинарно побайтово — читай с помощью memcmp.
Будут ли они идти последовательно друг за другом, если помещаются в одну запись? Скорее да, но без гарантий и я бы на это не закладывался.
Re[4]: вопрос по NTFS MFT парсингу
От: x64 Россия  
Дата: 08.06.09 10:59
Оценка:
MS>Если есть имя с типом 1, то обязательно должно быть имя с типом 2 и наоборот.

А ещё может быть, что есть имя с типом 0, но нет имён других типов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.