Конференция "WinAPI" » NtReadFile NtFsControlFile. Разница возвращаемых данных.
 
  • Riply © (05.04.08 20:49) [20]
    >  [19] guav ©   (05.04.08 20:08)
    > И более интересный вопрос - откуда взялось 221120 ?
    Как откуда ? Мы об этом "сбойном" Lcn`е толко и говорим. :)

    Просто, пока я не добралась до Delphi,
    пыталась "на пальцах" показать, что я делала в программе для проверки.
  • guav © (05.04.08 21:09) [21]
    > [20] Riply ©   (05.04.08 20:49)

    Каким образом получено значение 221120 ?
    Тебе приснилось что этот LCN соотвествует каким-то файлрекордам ?

    "Подтверждение" вроде
    > FileRefNumber := ((221120 - MftStartLcn) * BytesPerCluster)
    > div BytesPerFileRecordSegment;

    читается - не годится, т.к. формула предполагает то чего нету - непрерывность MFT.
  • guav © (05.04.08 21:20) [22]
    Ещё раз, на всякий случай:
    1. 221120 судя по R.P. $Mft не принадлежит MFT. Ошибка уже совершена когда это значение получено.
    2. Формула, позволяющая получить из него номер в MFT - ошибочна.
    3. Для нумерации файлов и файлрекордов LCN не используется, используется MFT_SEGMENT_REFERENCE.
  • guav © (05.04.08 21:36) [23]
    Если я не ошибся в анализе твоих заблуждений, то то что ты хочешь найти в 221120 находится в 306221 :)
  • Riply © (05.04.08 21:41) [24]
    > [22] guav © (05.04.08 21:20)
    > 1. 221120 судя по R.P. $Mft не принадлежит MFT.
    Не принадлежит, учитывая фрагментированность. Если бы ее не было, то принадлежал бы.
    Конечно это мало что значит, но всеже.
    > Ошибка уже совершена когда это значение получено.
    Это один из большого списка Lcn-ов, который так себя ведет.
    К тому же этот список я получала как "законным" способом, так и "своим".
    Они (списки) совпадают.
    > 2. Формула, позволяющая получить из него номер в MFT - ошибочна.
    Это не формула (как формула, она конечно ошибочна) а только
    описание того что я с ним, кроме всего прочего, пыталась делать.
    > 3. Для нумерации файлов и файлрекордов LCN не используется, используется MFT_SEGMENT_REFERENCE.
    Это я знаю, но какого черта, если на него посмотреть
    как на MFT_SEGMENT_REFERENCE, то получим то что нужно ?

    Попробую еще раз описать, что происходит:
    Сканируется "подпорченый" диск.
    На директории, описание которой выше, при переборе Lcn-ов
    на Lcn равным 221120 спотыкаемся (считываемая структура не валидна).
    Начинаем изучать этот чертов 221120-ый. Почему именно на нем и чем он отличается от других ?
    В ходе этого дела, выясняется, что если предпринять попытки из [18]
    то мы получаем именно то, что и должны были получить, если бы этот LCN
    "считывался" так же как и все остальные его собратья :)
  • Riply © (05.04.08 21:43) [25]
    > [23] guav ©   (05.04.08 21:36)
    > Если я не ошибся в анализе твоих заблуждений,
    > то то что ты хочешь найти в 221120 находится в 306221 :)

    А это еще кто такой ?
  • guav © (05.04.08 21:44) [26]
    > Это один из большого списка Lcn-ов, который так себя ведет.
    > К тому же этот список я получала как "законным" способом,
    > так и "своим".
    > Они (списки) совпадают.

    Не верю. Приведи код получения Lcn.
  • guav © (05.04.08 21:47) [27]
    > при переборе Lcn-ов

    таки откуда в директории взялись Lcnы её файлов, не перевела ли ты полученные из директории файлреференсы в Lcnы ?
  • Riply © (05.04.08 21:55) [28]
    > [26] guav ©   (05.04.08 21:44)
    > Не верю. Приведи код получения Lcn.

    Какой из двух ? "Спертый" у линуксоидов или через FSCTL_GET_RETRIEVAL_POINTERS ?

    > таки откуда в директории взялись Lcnы её файлов,
    > не перевела ли ты полученные из директории файлреференсы в Lcnы ?

    Это Lcn`ы из INDEX_ALLOCATION атрибута директории
  • guav © (05.04.08 22:01) [29]
    > [28] Riply ©   (05.04.08 21:55)

    Да любой.
    Дело в том что в директории вообще не хранятся Lcnы содержащихся в ней файлов.
  • guav © (05.04.08 22:06) [30]
    > Это Lcn`ы из INDEX_ALLOCATION атрибута директории

    Стоп. Ты что ли получаешь Retriveal Pointers у :$I30:$INDEX_ALLOCATION директории и пытаешься в этих Lcn искать файлрекорды ?
  • guav © (05.04.08 22:24) [31]
    > [28] Riply ©   (05.04.08 21:55)

    Кстати спёртый у линуксоидов скрывать вообще не надо, там же GPL.
  • Riply © (05.04.08 22:35) [32]
    >  [29] guav ©   (05.04.08 22:01)
    > Дело в том что в директории вообще не хранятся Lcnы содержащихся в ней файлов.

    Да. Терминологоия у меня сильно страдает. Который раз замечаю.
    Sorry.

    Как все это получается:
    Берем директорию, читаем ее атрибуты.
    Из атрибута AT_INDEX_ALLOCATION получаем Run-ы.
    "Декомрессируем" их и получаем вот этот наш километровый список Lcn-ов с одним бракованным :)
    Начинаем их считывать и разбирать по косточкам.
    Когда, например, получаем MAGIC_INDX, воспринимаем это хозяйство как INDEX_BLOCK_HEADER,
    и начинаем перебирать объекты, которые она описывает. Это я и называю "файлами в директории" :)
  • guav © (05.04.08 22:38) [33]
    > Когда, например, получаем MAGIC_INDX, воспринимаем это хозяйство
    > как INDEX_BLOCK_HEADER,

    А какие другие Magic могут получится ?


    > и начинаем перебирать объекты, которые она описывает

    Ну, а дальше? Где там LCNы, в частности 221120 ?
  • Riply © (05.04.08 22:38) [34]
    > [31] guav ©   (05.04.08 22:24)
    > Кстати спёртый у линуксоидов скрывать вообще не надо, там же GPL.

    А никто ничего и не скрывает.
    Только там от оригинала остались разве что названия переменных да констант.
    А все остальное искарежено вашей покорной слугой :)
  • Riply © (05.04.08 22:44) [35]
    >  [33] guav ©   (05.04.08 22:38)
    > А какие другие Magic могут получится ?

    Саш, я сейчас заплачу :)
    Я ж тебе целый день толкую о том, что у этого (удалено модератором) 221120 - все не так. :)
    Он не настоящий, а липовый :)
    у него вообще Magic`а равен 12354, (если мне не изменяет память). Не занаю я таких Magic`ов.
    Хоть бы нули там были что-ли.
  • guav © (05.04.08 22:57) [36]
    1. Других MAGIC, кроме IDNX у :$I30:$INDEX_ALLOCATION не может быть.
    2. Индексные структуры вообще-то обходятся по ссылкам в них, начиная с $INDEX_ROOT.
    3. Даже если с 221120 не получилось как с частью индекса, на каком основании предпринимается попытка считать его частью MFT ??
  • Riply © (05.04.08 23:02) [37]
    > [33] guav ©   (05.04.08 22:38)
    > Ну, а дальше? Где там LCNы, в частности 221120 ?

    Вот примерный код, возвращающий Lcn`ы из RETRIEVAL_POINTERS_BUFFER
    Среди них и 221120 :)

    with pRetPointers^ do
    if ExtentCount > 0 then
     begin
      PrevVcn := StartingVcn.QuadPart;
      i := 0;
      while i < integer(ExtentCount) do
       with Extents[i] do
        begin
         aCount := NextVcn.QuadPart - PrevVcn;
         // Что то делаем, например парсим "индекс i, Lcn = Lcn, Count = aCount
         PrevVcn := NextVcn.QuadPart;
         inc(i);
        end;
     end;

  • Riply © (05.04.08 23:08) [38]
    > [36] guav ©   (05.04.08 22:57)

    Да знаю я первые два пункта :)

    > 3. Даже если с 221120 не получилось как с частью индекса,
    > на каком основании предпринимается попытка считать его частью MFT ??

    Ни на каком. Он не валидный. Все последующие действия с ним
    это ни что иное, как попытка понять откуда он такой у нас взялся, почему взялся,
    с чем его едят, и где тогда нажодиться нужная нам информация ?
  • guav © (05.04.08 23:10) [39]
    Уже понял, только не понял почему этот Lcn интерпретируется как файл-рекорд, если это чать $INDEX_ALLOCATION.

    там будет сигнатура IDNX или не будет - в зависимости от того является ли он началом нового индекса или продолжением индекса начатого в предыдущем Lcn
 
Конференция "WinAPI" » NtReadFile NtFsControlFile. Разница возвращаемых данных.
Есть новые Нет новых   [134433   +22][b:0][p:0.001]