затем для каждого из 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 попадается куча одинаковых подряд идущих имён, видимо один файл на несколько записей распределён. Как-нить можно это предотвратить? может какие-нить поля из структур атрибутов об этом могут сказать — не в курсе — уж больно мало инфы про нтфс. Делитесь опытом, господа...
Здравствуйте, 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.
Здравствуйте, De-Bugger, Вы писали:
DB>Здравствуйте, x76adf1, Вы писали:
X>>здрасте, господа.
X>>...
DB>Ваша текушая реализация алгоритма напоминает алгоритм создания авианосца из куска железа и соплей.
Воу воу воу, сударь, вот только не надо подобного бреда. После прочтения вашего поста создаётся впечатление, что свои мысли из соплей лепите именно ВЫ...
DB>Прочитайте пожалуйста еще раз информацию о реализации NTFS. Поверьте, сейчас ее просто море, не то что было несколько лет назад.
быть голословным очень удобно, я понимаю...
DB>Как отправная точка: DB>1. Кто вам сказал, что первый резидентный атрибут — это атрибут имени файла да еще и в нужном формате.
кто-то говорил про первый атрибут? кто? где? уж точно не я... DB>2. Имен (атрибутов) у NTFS файла может быть несколько.
безусловно DB>3. Атрибуты могут находиться в других записях MFT.
безусловно
прошу читать чужие посты внимательнее и не писать чуши, основанной на собственном недопонимании вопроса.
Всего доброго.
Здравствуйте, x76adf1, Вы писали:
X>Здравствуйте, De-Bugger, Вы писали:
DB>>Здравствуйте, x76adf1, Вы писали:
X>>>здрасте, господа.
X>>>...
DB>>Ваша текушая реализация алгоритма напоминает алгоритм создания авианосца из куска железа и соплей. X>Воу воу воу, сударь, вот только не надо подобного бреда. После прочтения вашего поста создаётся впечатление, что свои мысли из соплей лепите именно ВЫ...
Нехилый въезд на белом носороге. Удачи на РСДН, нервный вы наш
DB>>Прочитайте пожалуйста еще раз информацию о реализации NTFS. Поверьте, сейчас ее просто море, не то что было несколько лет назад. X>быть голословным очень удобно, я понимаю...
А что, вам все разжевать и в пасть положить? Или вы считаете что я вам сейчас кину исходники своего проекта где осуществляется работа с NTFS?
X>прошу читать чужие посты внимательнее и не писать чуши, основанной на собственном недопонимании вопроса.
прошу пользоваться поиском, пить новопассит и учиться задавать более конкретные вопросы.
Здравствуйте, x76adf1, Вы писали:
DB>>1. Кто вам сказал, что первый резидентный атрибут — это атрибут имени файла да еще и в нужном формате. X>кто-то говорил про первый атрибут? кто? где? уж точно не я...
А вот по этому куску да, согласен, прочел невнимательно вот этот момент
и хожу по атрибутам записи в поисках
Хотя в дальнейшем это не оправдывает вашей лжи, когда сначала вы пишете что
...видимо один файл на несколько записей распределён.
А потом отвечаете "безусловно" на утверждение, что атрибуты могут находиться в других записях MFT.
Здравствуйте, De-Bugger, Вы писали:
DB>Здравствуйте, x76adf1, Вы писали:
DB>>>1. Кто вам сказал, что первый резидентный атрибут — это атрибут имени файла да еще и в нужном формате. X>>кто-то говорил про первый атрибут? кто? где? уж точно не я...
DB>А вот по этому куску да, согласен, прочел невнимательно вот этот момент DB>
DB>и хожу по атрибутам записи в поисках
DB>Хотя в дальнейшем это не оправдывает вашей лжи, когда сначала вы пишете что
DB>
DB>...видимо один файл на несколько записей распределён.
DB>А потом отвечаете "безусловно" на утверждение, что атрибуты могут находиться в других записях MFT.
этот момент я как раз и хотел уточнить из-за нехватки информации
пс: после того, как пособачишься, как-то интереснее общаться, разве нет?
Неправильно. Размер записи никак не связан с размером кластера. Разве только с размером сектора.
Насколько я помню на томах с сектором 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
Здравствуйте, x76adf1, Вы писали:
X>И ещё, при выводе каждого такого имени из числа total_file_count попадается куча одинаковых подряд идущих имён, видимо один файл на несколько записей распределён. Как-нить можно это предотвратить? может какие-нить поля из структур атрибутов об этом могут сказать — не в курсе — уж больно мало инфы про нтфс. Делитесь опытом, господа...
Остальное отвечено выше, а насчёт этого — фича у FSCTL_GET_NTFS_FILE_RECORD такая, что если дать несуществующий номер записи, прочитается существующая, в NTFS_FILE_RECORD_OUTPUT_BUFFER::FileReferenceNumber будет номер отличный от заданного, там в Remarks ещё написано.
Файл на несколько записей распределён — такое тоже бывает, но редко, такие записи идут не всегда подряд, и все имена обычно в одной записи.
Здравствуйте, MShura, Вы писали:
MS>возьмите 'BytesPerFileRecordSegment'
взял
MS>Имена с типом 1,2 всегда идут парами.
что значит "парами"? Лонг и Шорт имена друг за другом идут для каждой записи или я вас неверно понял?
MS>Если запись состоит из нескольких сегментов, то для перечисления атрибутов нужно руководствоваться исключительно атрибутом 0x20
учту, спасибо
MS>>Имена с типом 1,2 всегда идут парами. X>что значит "парами"? Лонг и Шорт имена друг за другом идут для каждой записи или я вас неверно понял?
Если есть имя с типом 1, то обязательно должно быть имя с типом 2 и наоборот.
Если удаляешь одно имя, то удалять надо и парное
Тип имени участвует в сортировке атрибутов так как он часть резидентного индексного атрибута.
Индексные атрибуты (атрибут имени таков) сравниваются бинарно побайтово — читай с помощью memcmp.
Будут ли они идти последовательно друг за другом, если помещаются в одну запись? Скорее да, но без гарантий и я бы на это не закладывался.