Конференция "WinAPI" » NtReadFile NtFsControlFile. Разница возвращаемых данных.
 
  • Riply © (04.04.08 21:34) [0]
    Здравствуйте !
    Давным давно я поднимала этот вопрос. Тогда ответа не нашли.
    Может сейчас у кого-нибудь будут идеи, как объяснить(понять) следующий факт:

    Читаем файловую запись двумя способами: NtReadFile и NtFsControlFile(..., FSCTL_GET_NTFS_FILE_RECORD, ...).
    В первом случае получаем мусор, во втором корректные данные.
    (какой именно FileRecord прочитала NtFsControlFile - проверяется).
    Эффект довольно трудно, но воиспроизводим (я приводила диск в "непотребное" состояние :)

    Когда я столкнулась с разницой между прямым чтением и чтении через API, подумла
    что вот она - причина и списала этот вопрос на всевозможные "кеширования" и "буферизации".

    Но сейчас, похоже, это объяснение не проходит.
    Во всяком случае, эффект наблюдается (на тех одних и тех же файловых объектах)
    как после длительной работы, так и сразу после холодного рестарта.

    Очень бы хотелось понять происходящее. Кто что думает: какие могут быть причины ?
  • Riply © (04.04.08 21:36) [1]
    > [0] Riply ©   (04.04.08 21:34)
    > Читаем файловую запись двумя способами: NtReadFile и NtFsControlFile

    NtReadFile - имеется ввиду "прямое" чтение.
  • guav © (05.04.08 00:11) [2]
    > Кто что думает: какие могут быть причины ?

    Я думаю что причина в том что в программе ошибка :)
    Пришли образ где явление наблюдается.
  • Riply © (05.04.08 00:24) [3]
    > [2] guav ©   (05.04.08 00:11)
    > Я думаю что причина в том что в программе ошибка :)

    Я понимаю, что ошибка может быть везде, но перепроверила сто раз.
    Вынесла все в отдельную процедуру.
    Передаю в нее номер рекода, читаю так и так и сравниваю результат.
    Что может быть проще ?

    > Пришли образ где явление наблюдается.
    Образ чего прислать ?

    Ты учитывай, что у меня Dual-up :)
  • Riply © (05.04.08 00:42) [4]
    Может это поможет ?
    Здесь выдержка атрибутов сканируемой директории (сожержит только файлы).
    Пробегаюсь по ее Lcn-ам.
    И при чтении Lcn`а 221544 вылетаю из цикла с ошибкой несовпадения MagicType у рекорда.
    Передаю этот Lcn в вынесенную процедуру и убеждаюсь, что читается по-разному.
    Если в основном блоке заменить ReadFile на ControlFile, то все работает.

    \??\D:\DestDir_46\0
    MultiSectorHeader
    NTFS_RECORD_HEADER
    cbType  FILE
    UpdateSequenceArrayOffset 48
    UpdateSequenceArraySize 3
    _Usn64 108368966
    SequenceNumber 1
    LinkCount  1
    AttributesOffset 56
    Flags  Dir
    BytesInUse 808
    BytesAllocated 1024
    BaseFileRecordSegment
    SegmentNumberLowPart 0
    SegmentNumberHighPart 0
    SequenceNumber 0
    NextAttributeNumber 8
    SelfRecord 88986

    TypeCode AT_STANDARD_INFORMATION
    RecordLength 96
    FormCode RESIDENT
    Name  
    Flags  STANDART
    Instance 0
    ValueLength 72
    ValueOffset 24
    _Flags Not Indexed: 0
    CreationTime 2008.04.03 22.05.50
    ChangeTime 2008.04.03 22.06.29
    LastWriteTime 2008.04.03 22.06.29
    LastAccessTime 2008.04.05 00.28.20
    FileAttributes $0
    MaxVersionsNum 0
    VersionNum 0
    ClassId 0
    OwnerId  0
    SecurityId 260
    QuotaCharge 0
    Usn64  0

    TypeCode AT_FILE_NAME
    RecordLength 96
    FormCode RESIDENT
    Name  
    Flags  STANDART
    Instance 2
    ValueLength 68
    ValueOffset 24
    _Flags Indexed: 1
    ParentDirectory
    SegmentNumberLowPart 57290
    SegmentNumberHighPart 0
    SequenceNumber 1
    CreationTime 2008.04.03 22.05.50
    ChangeTime 2008.04.03 22.05.50
    LastWriteTime 2008.04.03 22.05.50
    LastAccessTime 2008.04.03 22.05.50
    AllocatedSize 0
    DataSize  0
    FileAttributes $10000000I30
    AlignmentOrReserved 0
    FILE_NAME_WIN32_AND_DOS = 0

    TypeCode AT_INDEX_ROOT
    RecordLength 88
    FormCode RESIDENT
    Name  $I30
    Flags  STANDART
    Instance 7
    ValueLength 56
    ValueOffset 32
    _Flags Not Indexed: 0
    cbType AT_FILE_NAME
    CollationRule 1
    BytesPerIndexBlock 4096
    ClustersPerIndexBlock 2
    DirectoryIndex
    EntriesOffset 16
    IndexBlockLength 40
    AllocatedSize 40
    Flags  Large
    Enum Dir Entries

    TypeCode AT_INDEX_ALLOCATION
    RecordLength 416
    FormCode NONRESIDENT
    Name  $I30
    Flags  STANDART
    Instance 3
    LowestVcn 0
    HighestVcn 231
    MappingPairsOffset 72
    _CompressionUnit 0
    AllocatedLength  475136
    FileSize  475136
    ValidDataLength 475136
    TotalAllocated 13511017930227748

    TypeCode AT_BITMAP
    RecordLength 48
    FormCode RESIDENT
    Name  $I30
    Flags  STANDART
    Instance 4
    ValueLength 16
    ValueOffset 32
    _Flags Not Indexed: 0

    RETRIEVAL_POINTERS_BUFFER
    ExtentCount 111
    Index 0 Lcn 228215 Count 2
    Index 1 Lcn 228291 Count 2
    Index 2 Lcn 228348 Count 2
    Index 3 Lcn 228393 Count 2
    Index 4 Lcn 228444 Count 2
    Index 5 Lcn 228468 Count 4
    Index 6 Lcn 228522 Count 2
    Index 7 Lcn 228565 Count 2
    Index 8 Lcn 228639 Count 2
    Index 9 Lcn 228673 Count 2
    Index 10 Lcn 228720 Count 2
    Index 11 Lcn 228743 Count 2
    Index 12 Lcn 228787 Count 2
    Index 13 Lcn 228835 Count 2
    Index 14 Lcn 228901 Count 2
    Index 15 Lcn 228975 Count 2
    Index 16 Lcn 229023 Count 2
    Index 17 Lcn 229085 Count 2
    Index 18 Lcn 229129 Count 2
    Index 19 Lcn 229173 Count 2
    Index 20 Lcn 229235 Count 2
    Index 21 Lcn 229269 Count 2
    Index 22 Lcn 229334 Count 2
    Index 23 Lcn 229372 Count 2
    Index 24 Lcn 229403 Count 2
    Index 25 Lcn 229447 Count 2
    Index 26 Lcn 229490 Count 2
    Index 27 Lcn 229561 Count 2
    Index 28 Lcn 229623 Count 2
    Index 29 Lcn 222468 Count 2
    Index 30 Lcn 222518 Count 2
    Index 31 Lcn 222581 Count 2
    Index 32 Lcn 222631 Count 2
    Index 33 Lcn 222676 Count 2
    Index 34 Lcn 222729 Count 4
    Index 35 Lcn 222795 Count 2
    Index 36 Lcn 222852 Count 2
    Index 37 Lcn 222908 Count 2
    Index 38 Lcn 222949 Count 2
    Index 39 Lcn 222999 Count 2
    Index 40 Lcn 223050 Count 2
    Index 41 Lcn 223115 Count 2
    Index 42 Lcn 223187 Count 2
    Index 43 Lcn 223262 Count 2
    Index 44 Lcn 223309 Count 2
    Index 45 Lcn 223363 Count 2
    Index 46 Lcn 223412 Count 2
    Index 47 Lcn 223464 Count 2
    Index 48 Lcn 223559 Count 2
    Index 49 Lcn 223615 Count 2
    Index 50 Lcn 223649 Count 2
    Index 51 Lcn 223700 Count 4
    Index 52 Lcn 223741 Count 2
    Index 53 Lcn 223792 Count 2
    Index 54 Lcn 223876 Count 2
    Index 55 Lcn 223931 Count 2
    Index 56 Lcn 223993 Count 2
    Index 57 Lcn 224068 Count 2
    Index 58 Lcn 224108 Count 2
    Index 59 Lcn 224148 Count 2
    Index 60 Lcn 224233 Count 2
    Index 61 Lcn 224290 Count 2
    Index 62 Lcn 224327 Count 2
    Index 63 Lcn 224387 Count 2
    Index 64 Lcn 224429 Count 2
    Index 65 Lcn 224473 Count 2
    Index 66 Lcn 224532 Count 2
    Index 67 Lcn 224577 Count 2
    Index 68 Lcn 224619 Count 6
    Index 69 Lcn 224641 Count 2
    Index 70 Lcn 224661 Count 2
    Index 71 Lcn 221544 Count 2
    Index 72 Lcn 221588 Count 2
    Index 73 Lcn 221657 Count 2
    Index 74 Lcn 221709 Count 2
    Index 75 Lcn 221758 Count 2
    Index 76 Lcn 221808 Count 2
    Index 77 Lcn 221845 Count 2
    Index 78 Lcn 221878 Count 2
    Index 79 Lcn 221925 Count 2
    Index 80 Lcn 221952 Count 2
    Index 81 Lcn 222022 Count 2
    Index 82 Lcn 222059 Count 2
    Index 83 Lcn 222094 Count 2
    Index 84 Lcn 222114 Count 2
    Index 85 Lcn 222151 Count 4
    Index 86 Lcn 222200 Count 2
    Index 87 Lcn 222245 Count 2
    Index 88 Lcn 222273 Count 2
    Index 89 Lcn 222304 Count 2
    Index 90 Lcn 222340 Count 2
    Index 91 Lcn 222394 Count 2
    Index 92 Lcn 222431 Count 1
    Index 93 Lcn 221120 Count 1
    Index 94 Lcn 221155 Count 2
    Index 95 Lcn 221193 Count 2
    Index 96 Lcn 221236 Count 2
    Index 97 Lcn 221267 Count 2
    Index 98 Lcn 221311 Count 2
    Index 99 Lcn 221335 Count 2
    Index 100 Lcn 221380 Count 2
    Index 101 Lcn 221419 Count 2
    Index 102 Lcn 221446 Count 2
    Index 103 Lcn 221502 Count 2
    Index 104 Lcn 220992 Count 2
    Index 105 Lcn 221030 Count 2
    Index 106 Lcn 221051 Count 2
    Index 107 Lcn 221085 Count 2
    Index 108 Lcn 221115 Count 2
    Index 109 Lcn 220962 Count 2
    Index 110 Lcn 220914 Count 2
  • Германн © (05.04.08 02:16) [5]

    > Riply ©   (05.04.08 00:24) [3]


    > Ты учитывай, что у меня Dual-up :)
    >

    Это что? Такая "шутка юмора"?
  • Riply © (05.04.08 09:48) [6]
    > [5] Германн ©   (05.04.08 02:16)
    > Это что? Такая "шутка юмора"?

    Нет. Это просто ачепятка :)
  • guav © (05.04.08 11:31) [7]
    > Пробегаюсь по ее Lcn-ам.

    То есть, ты смотришь содержимое :$I30:$INDEX_ALLOCATION этой директории, и потом проходишь по всем файлреференсам оттуда ?
    Или это R.P. для её ::$Data ?

    Давай не так. Приведи пример с одним файлом, у которого известен:
    1. Результат чтения через FSCTL_GET_NTFS_FILE_RECORD
    2. Результат прямого чтения (с указанием читаемого смещения)
    3. Результат FSCTL_GET_RETRIEVAL_POINTERS для $Mft, именно результат FSCTL_GET_RETRIEVAL_POINTERS а не своей работы (открывать можно с правами 0, тогда откроется)
    4. Параметры ФС: размер кластера, размер сектора, размер файлрекорда

    После этого можно внимательно сопоставить RETRIEVAL_POINTERS для $Mft с читаемым кластером, думаю тут и будет ошибка.
  • Riply © (05.04.08 15:02) [8]
    > [7] guav © (05.04.08 11:31)
    > То есть, ты смотришь содержимое :$I30:$INDEX_ALLOCATION этой директории,
    > и потом проходишь по всем файлреференсам оттуда ?

    Именно так.

    > Или это R.P. для её ::$Data ?

    Нет.

    > Давай не так.

    Давай :)

    (Сканируется та же директория, только я ошиблась указывая "сбойный" LCN
    На самом деле он - 221120 )

    Вот первые данные:

    Сам диск:

    FSCTL_GET_NTFS_VOLUME_DATA
    VolumeSerialNumber  7 967 016 108 593 429 977
    NumberSectors   2 104 451
    TotalClusters   526 112
    FreeClusters   104
    TotalReserved   0
    BytesPerSector   512
    BytesPerCluster   2048
    BytesPerFileRecordSegment 1024
    ClustersPerFileRecordSegment 0
    MftValidDataLength  135 168 000
    MftStartLcn   175 371
    Mft2StartLcn   263 056
    MftZoneStart   438 432
    MftZoneEnd   438 560
    ExtendedData 3.1


    Часть атрибутов его MFT:

    \??\D:\$MFT
    MultiSectorHeader
    NTFS_RECORD_HEADER
    cbType  FILE
    UpdateSequenceArrayOffset 48
    UpdateSequenceArraySize 3
    _Usn64 100853279
    SequenceNumber 1
    LinkCount  1
    AttributesOffset 56
    Flags  File
    BytesInUse 472
    BytesAllocated 1024
    BaseFileRecordSegment
    SegmentNumberLowPart 0
    SegmentNumberHighPart 0
    SequenceNumber 0
    NextAttributeNumber 6
    SelfRecord 0

    TypeCode AT_STANDARD_INFORMATION
    RecordLength 96
    FormCode RESIDENT
    Name  
    Flags  STANDART
    Instance 0
    ValueLength 72
    ValueOffset 24
    _Flags Not Indexed: 0
    CreationTime 2008.04.03 20.34.01
    ChangeTime 2008.04.03 20.34.01
    LastWriteTime 2008.04.03 20.34.01
    LastAccessTime 2008.04.03 20.34.01
    FileAttributes HS
    MaxVersionsNum 0
    VersionNum 0
    ClassId 0
    OwnerId  0
    SecurityId 256
    QuotaCharge 0
    Usn64  0

    TypeCode AT_FILE_NAME
    RecordLength 104
    FormCode RESIDENT
    Name  
    Flags  STANDART
    Instance 3
    ValueLength 74
    ValueOffset 24
    _Flags Indexed: 1
    ParentDirectory
    SegmentNumberLowPart 5
    SegmentNumberHighPart 0
    SequenceNumber 5
    CreationTime 2008.04.03 20.34.01
    ChangeTime 2008.04.03 20.34.01
    LastWriteTime 2008.04.03 20.34.01
    LastAccessTime 2008.04.03 20.34.01
    AllocatedSize 16 384
    DataSize  16 384
    FileAttributes HS
    AlignmentOrReserved 0
    FILE_NAME_WIN32_AND_DOS = $MFT

    TypeCode AT_DATA
    RecordLength 112
    FormCode NONRESIDENT
    Name  
    Flags  STANDART
    Instance 1
    LowestVcn 0
    HighestVcn 65999
    MappingPairsOffset 64
    _CompressionUnit 0
    AllocatedLength  135168000
    FileSize  135168000
    ValidDataLength 135168000
    TotalAllocated 3531575320579784755

    TypeCode AT_BITMAP
    RecordLength 96
    FormCode NONRESIDENT
    Name  
    Flags  STANDART
    Instance 5
    LowestVcn 0
    HighestVcn 9
    MappingPairsOffset 64
    _CompressionUnit 0
    AllocatedLength  20480
    FileSize  16504
    ValidDataLength 16504
    TotalAllocated 8575189053052944689

    RETRIEVAL_POINTERS_BUFFER
    ExtentCount 8
    Index 0 Lcn 175371 Count 45504
    Index 1 Lcn 220883 Count 8
    Index 2 Lcn 305974 Count 8697
    Index 3 Lcn 453599 Count 8696
    Index 4 Lcn 403347 Count 2639
    Index 5 Lcn 406065 Count 8
    Index 6 Lcn 406123 Count 440
    Index 7 Lcn 406577 Count 8


    Насчет самого объекта не поняла:
    тебя интересуют данные того на кого указывает "сбойный" LCN
    или данные того объекта, который выдает "сбойный" LCN ?
  • Riply © (05.04.08 15:06) [9]
    > [8] Riply ©   (05.04.08 15:02)

    Опять форматирование "съехало" :)
    Кодом надо было выделять, наверное.
  • Riply © (05.04.08 15:10) [10]
    >  [9] Riply ©   (05.04.08 15:06)

    Смайлик не тот. Должен быть :(
  • guav © (05.04.08 15:36) [11]
    Файлы нумеруются не через LCN, т.к. в одном кластере находятся несколько файлрекордов. Ссылка на файл - это то, что в MSDN называется MTF_SEGMENT_REFERENCE, или File Reference в документации линукса.

    Вот есть у тебя File Reference, передаваемый в FSCTL_GET_NTFS_FILE_RECORD. Из него же ты получаешь смещение в MFT и соответственно смещение на диске. Приведи значение этого File Reference, значение смещения, по которому читаешь и результат что прочитывается в обоих случаях.
  • Riply © (05.04.08 15:58) [12]
    > [11] guav ©   (05.04.08 15:36)
    > Файлы нумеруются не через LCN
    > Ссылка на файл - это то, что в MSDN называется MTF_SEGMENT_REFERENCE,
    > или File Reference в документации линукса.

    Sorry. Просто оговорилась.

    > т.к. в одном кластере находятся несколько файлрекордов.

    Это не всегда так.
    Может быть что в одном файлрекорде несколько кластеров :)

    Я сейчас за компьютером, у которого есть диск (NTFS)
    с такими характеристиками :
    BytesPerSector   512
    BytesPerCluster   512
    BytesPerFileRecordSegment 1024
    ClustersPerFileRecordSegment 2

    > Приведи значение этого File Reference
    Хорошо. Только доберусь до компьютера, где Delphi установлена.
  • guav © (05.04.08 16:04) [13]
    > Может быть что в одном файлрекорде несколько кластеров :)

    Может. Но я про конкретный случай.
    В любом случае, 221120 на File Reference не похож, где тут последовательный номер ?

    > TypeCode AT_DATA


    > TotalAllocated 3531575320579784755

    Кстати ни разу это ни TotalAllocated
    переводим в 0x это 3102AD0B00B1C033
    00B1C0 = 45504
    02AD0B = 175371
    , т.е.

    > Index 0 Lcn 175371 Count 45504
  • Riply © (05.04.08 16:10) [14]
    > [13] guav ©   (05.04.08 16:04)
    > Кстати ни разу это ни TotalAllocated

    Совершенно верно.
    Значание TotalAllocated, при _CompressionUnit = 0 неопределено.
    Руки не доходят подправить функцию парсинга,
    чтобы она не выводила TotalAllocated при нулевом CompressionUnit
  • Riply © (05.04.08 16:13) [15]
    > [13] guav ©   (05.04.08 16:04)
    > В любом случае, 221120 на File Reference не похож, где тут последовательный номер ?
    Для получения "абсолютного смещения на диске" его надо умножить на BytesPerCluster
  • Riply © (05.04.08 17:44) [16]
    Выскажу я одно предположение, только чур не смеяться.
    Бывает несу чушь. Это от недосыпа :)

    Трактовка Lcn`ов, возвращаемых FSCTL_GET_RETRIEVAL_POINTERS,
    и, соответственно, алгоритм их чтения могут зависеть от состояния MFT.

    Например, если пользователь так загнал MFT, что та аж вся форматированная
    да еще и вынужденная хранить в себе данные, которые должны быть не резидентными. :)
  • guav © (05.04.08 18:11) [17]
    > Значание TotalAllocated, при _CompressionUnit = 0 неопределено.

    Я бы не так сказал, не неопределено, а его просто нет, структура на него меньше. Разница между "не определно" и "нет" может быть важна.


    > [15] Riply ©   (05.04.08 16:13)


    > Для получения "абсолютного смещения на диске" его надо умножить
    > на BytesPerCluster

    Т.е. это действиетльно LCN принадлежащий $Mft по твоему ?
    Ок.
    Берём R.P. $Mft из [8] и пытаемся найти его номер. Даже Dephi под рукой не надо, используем Calc:

    lastLcn = fisrtLcn + count – 1
    _221120_in = (fisrtLcn<=221120) AND (221120<=lastLcn)

    firstLcn count lastLcn _221120_in
    175371 45504 220874 ЛОЖЬ
    220883 8 220890 ЛОЖЬ
    305974 8697 314670 ЛОЖЬ
    453599 8696 462294 ЛОЖЬ
    403347 2639 405985 ЛОЖЬ
    406065 8 406072 ЛОЖЬ
    406123 440 406562 ЛОЖЬ
    406577 8 406584 ЛОЖЬ



    Какой же тогда MFT номер у 221120 ?
    У кого в программе ошибка ?
  • Riply © (05.04.08 19:47) [18]
    [17] guav © (05.04.08 18:11)
    > > Значание TotalAllocated, при _CompressionUnit = 0 неопределено.

    > Я бы не так сказал, не неопределено, а его просто нет, структура на него меньше.
    > Разница между "не определно" и "нет" может быть важна.

    Спасибо, учту. То что "не определено" я стырила у линуксоидов.
    Скорее всего, не сумела правильно перевести.

    > Т.е. это действиетльно LCN принадлежащий $Mft по твоему ?

    Я уже не знаю что и думать :(
    В программе я поступаю так: высчитываю
    FileRefNumber := ((221120 - MftStartLcn) * BytesPerCluster) div BytesPerFileRecordSegment;
    Кстати 221120 попадает в диапазон
    [MftStartLcn < 221120 < MftStartLcn + MftValidDataLength div BytesPerCluster]
    Т.е. если забыть про фрагментацию MFT, то он ей принадлежит.
    Далее, по FileRef успешно считываю валидный FSCTL_GET_NTFS_FILE_RECORD
    из которого получаю список, примерно из 80 файлов,
    причем именно тех, которые и были "потеряны" .
    Ни одним больше, ни одним меньше.

    > Какой же тогда MFT номер у 221120 ?

    Получается, что FileRefNumber...
    Возможно нерезидентные данные, которые она вынуждена в себе
    хранить учитываются каким-то особым образом ?
  • guav © (05.04.08 20:08) [19]
    > В программе я поступаю так: высчитываю
    > FileRefNumber := ((221120 - MftStartLcn) * BytesPerCluster)
    > div BytesPerFileRecordSegment;

    Это что ? Где ты это взяла ?
    И более интересный вопрос - откуда взялось 221120 ?


    > Кстати 221120 попадает в диапазон
    > [MftStartLcn < 221120 < MftStartLcn + MftValidDataLength
    > div BytesPerCluster]

    И что ?


    > Получается, что FileRefNumber...

    Нет, не получается.

    Не знаю как тебе ещё объяснить...
    Что по-твоему значат поля File Reference ?
  • 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
  • guav © (05.04.08 23:14) [40]
    Ага, таки понял. Ты рассматриваешь каждый Lcn отдельно и ищешь INDX в каждом. Это нверено, рассматривай весь аттрибут как целое.
  • Riply © (05.04.08 23:19) [41]
    > [40] guav ©   (05.04.08 23:14)
    > Ага, таки понял.
    > Ты рассматриваешь каждый Lcn отдельно и ищешь INDX в каждом.
    > Это нверено, рассматривай весь аттрибут как целое.

    А вот теперь я не поняла. Что ты имеешь ввиду ?
  • Riply © (05.04.08 23:20) [42]
    Я их рассматриваю группами по Count
  • guav © (05.04.08 23:25) [43]
    > Я их рассматриваю группами по Count

    А надо рассматривать группами по Clusters per Index Record из $INDEX_ROOT.
  • Riply © (05.04.08 23:30) [44]
    >  [43] guav ©   (05.04.08 23:25)
    > А надо рассматривать группами по Clusters per Index Record из $INDEX_ROOT.

    Даже и не знаю как объяснить, какое ОГРОМНОЕ СПАСИБО я тебе хочу сказать :)
    Пойду проверять и переделывать код. Если сон не сморит :)
    Спасибо !
 
Конференция "WinAPI" » NtReadFile NtFsControlFile. Разница возвращаемых данных.
Есть новые Нет новых   [134433   +22][b:0.001][p:0.002]