Спецификация файловой системы exFAT

1 Введение

Файловая система exFAT является преемником FAT32 в семействе файловых систем FAT. Эта спецификация описывает файловую систему exFAT и предоставляет все сведения, необходимые для реализации файловой системы exFAT.

1.1 Цели проектирования

Файловая система exFAT имеет три центральные цели проектирования (см. список ниже).

  1. сохранить простоту файловых систем на основе FAT.

    Два преимущества файловых систем на основе FAT являются их относительной простотой и простотой реализации. В духе своих предшественников разработчики должны найти exFAT относительно простой и простой для реализации.

  2. Включить очень большие файлы и устройства хранения.

    Файловая система exFAT использует 64 бита для описания размера файла, тем самым позволяя приложениям, которые зависят от очень больших файлов. Файловая система exFAT также позволяет кластерам размером до 32 МБ, эффективно обеспечивая очень большие устройства хранения.

  3. включить расширяемость для будущих инноваций.

    Файловая система exFAT включает расширяемость в свою структуру, что позволяет файловой системе поддерживать темпы инноваций в хранилище и изменениях в использовании.

1.2 Конкретная терминология

В контексте этой спецификации определенные термины (см. таблицу 1) имеют конкретное значение для разработки и реализации файловой системы exFAT.

таблице 1 определение терминов, которые имеют очень конкретное значение

термин определения
Вспомогательный глагол Эта спецификация использует термин "должен" для описания поведения, которое является обязательным.
Следует Эта спецификация использует термин "должен" для описания поведения, которое настоятельно рекомендуется, но не делает обязательным.
Май Эта спецификация использует термин "может" для описания поведения, которое является необязательным.
Обязательный Этот термин описывает поле или структуру, которая должна изменяться и интерпретируется как описанная в этой спецификации.
Необязательный Этот термин описывает поле или структуру, которую реализация может или не поддерживает. Если реализация поддерживает заданное необязательное поле или структуру, она должна изменяться и интерпретировать поле или структуру, как описано в этой спецификации.
Неопределенный Этот термин описывает содержимое поля или структуры, которое реализация может изменить при необходимости (т. е. очистить до нуля при настройке окружающих полей или структур) и не интерпретировать для хранения определенного значения.
Скрытный

Этот термин описывает содержимое поля или структуры, которые реализованы:

  1. Должен инициализировать до нуля и не должен использоваться для какой-либо цели

  2. Не следует интерпретировать, за исключением случаев, когда вычислительные контрольные суммы

  3. Должен сохраняться в операциях, которые изменяют окружающие поля или структуры

1.3 Полный текст общих акронимов

Эта спецификация использует акронимы в обычном использовании в личной компьютерной отрасли (см. таблицу 2).

таблице 2 Полный текст общих акронимов

акроним полнотекстовый
ASCII Американский стандартный код для обмена информацией
BIOS Базовая система вывода входных данных
ЦПУ Центральная единица обработки
exFAT Расширяемая таблица выделения файлов
ЖИР Таблица выделения файлов
FAT12 Таблица выделения файлов, 12-разрядные индексы кластера
FAT16 Таблица выделения файлов, 16-разрядные индексы кластера
FAT32 Таблица выделения файлов, 32-разрядные индексы кластера
GPT Таблица секционирования GUID
GUID Глобальный уникальный идентификатор (см. раздел раздел 10.1)
ИНТ Прерывать
MBR Главная загрузочная запись
texFAT Транзакциобезопасный exFAT
UTC Координированное универсальное время

1.4 Квалификаторы полей и структур по умолчанию

Поля и структуры в этой спецификации имеют следующие квалификаторы (см. список ниже), если в противном случае не указаны заметки спецификации.

  1. Неназначенные

  2. Используйте десятичную нотацию для описания значений, в которых не указано в противном случае; Эта спецификация использует букву "h" после исправления для обозначения шестнадцатеричных чисел и заключает идентификаторы GUID в фигурные скобки

  3. В маленьком формате

  4. Не требуется символ, завершающий значение NULL для строк

1.5 Windows CE и TexFAT

TexFAT — это расширение для exFAT, которое добавляет семантику операций, безопасную для транзакций, поверх базовой файловой системы. TexFAT используется Windows CE. Для использования в транзакциях требуется использование двух FAT и растровых карт выделения. Он также определяет несколько дополнительных структур, включая дескрипторы заполнения и дескрипторы безопасности.

Структура томов 2

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

структуры томов таблицы 3

имя подрегионов

смещения

(сектор)

размера

(секторы)

примечания
основной области загрузки
Основной загрузочный сектор 0 1 Этот подрегион является обязательным и раздела 3.1 определяет его содержимое.
Основные расширенные секторы загрузки 1 8 Этот подрегион является обязательным и раздела 3.2) определяет его содержимое.
Основные параметры OEM 9 1 Этот подрегион является обязательным и раздела 3.3 определяет его содержимое.
Основной зарезервированный 10 1 Этот подрегион является обязательным, а его содержимое зарезервировано.
Основная контрольная сумма загрузки 11 1 Этот подрегион является обязательным и раздела 3.4 определяет его содержимое.
регион загрузки резервного копирования
Загрузочный сектор резервного копирования 12 1 Этот подрегион является обязательным и раздела 3.1 определяет его содержимое.
Расширенные секторы загрузки резервного копирования 13 (тринадцать) 8 Этот подрегион является обязательным и раздела 3.2 определяет его содержимое.
Параметры OEM резервного копирования двадцать один 1 Этот подрегион является обязательным и раздела 3.3 определяет его содержимое.
Резервная копия зарезервирована двадцать два 1 Этот подрегион является обязательным, а его содержимое зарезервировано.
Контрольная сумма загрузки резервного копирования двадцать три 1 Этот подрегион является обязательным и раздела 3.4 определяет его содержимое.
регион FAT
Выравнивание FAT двадцать четыре FatOffset — 24

Этот подрегион является обязательным и его содержимое, если таковые имеются, не определены.

Примечание. Секторы основной и резервной загрузки содержат поле FatOffset.

Первый FAT FatOffset FatLength

Этот подрегион является обязательным и раздел 4.1 определяет его содержимое.

Примечание. Секторы основной и резервной загрузки содержат поля FatOffset и FatLength.

Второй FAT FatOffset + FatLength FatLength * (NumberOfFats – 1)

Этот подрегион является обязательным и раздел 4.1 определяет его содержимое, если таковые есть.

Примечание. Секторы основной и резервной загрузки содержат поля FatOffset, FatLength и NumberOfFats. Поле NumberOfFats может содержать только значения 1 и 2.

области данных
Выравнивание кучи кластера СмещениеЖира + ДлинаЖира * КоличествоЖиров ClusterHeapOffset — (FatOffset + FatLength * NumberOfFats)

Этот подрегион является обязательным и его содержимое, если таковые имеются, не определены.

Примечание. Основные и резервные секторы загрузки содержат поля FatOffset, FatLength, NumberOfFats и ClusterHeapOffset. Допустимые значения поля NumberOfFats : 1 и 2.

Куча кластера ClusterHeapOffset ClusterCount * 2SectorsPerClusterShift

Этот подрегион является обязательным и раздел 5.1 определяет его содержимое.

Примечание. Основные и резервные секторы загрузки содержат поля ClusterHeapOffset, ClusterCount и SectorsPerClusterShift.

Избыточное пространство ClusterHeapOffset + ClusterCount * 2SectorsPerClusterShift VolumeLength — (ClusterHeapOffset + ClusterCount * 2SectorsPerClusterShift)

Этот подрегион является обязательным и его содержимое, если таковые имеются, не определены.

Примечание. Основные и резервные секторы загрузки содержат поля ClusterHeapOffset, ClusterCount, SectorsPerClusterShift и VolumeLength.

3 Основные и резервные области загрузки

Основной регион загрузки предоставляет все необходимые инструкции по загрузочному обвязке, идентификации сведений и параметров файловой системы, чтобы обеспечить реализацию для выполнения следующих действий:

  1. Загрузочная ремешка компьютерной системы из тома exFAT.
  2. Определите файловую систему в томе как exFAT.
  3. Узнайте расположение структур файловой системы exFAT.

Область загрузки резервного копирования — это резервная копия основной области загрузки. Он помогает восстановить том exFAT в случае того, что основной регион загрузки в несогласованном состоянии. За исключением редких обстоятельств, таких как обновление инструкций по обвязке загрузки, реализации не должны изменять содержимое области загрузки резервного копирования.

3.1 Основной и резервный загрузочный сектор подрегиационные регионы

Основной загрузочный сектор содержит код для загрузочного обвязки из тома exFAT и основных параметров exFAT, описывающих структуру тома (см. таблицу 4). BIOS, MBR или другие агенты с загрузочными обвязками могут проверять этот сектор и загружать и выполнять все инструкции по загрузочному обвязке, содержащиеся в нем.

Сектор загрузки резервного копирования — это резервная копия основного загрузочного сектора и имеет ту же структуру (см. таблицу 4). Резервный загрузочный сектор может помочь в операциях восстановления; однако реализации должны рассматривать содержимое полей VolumeFlags и PercentInUse как устаревшие.

Перед использованием содержимого основного или резервного сектора загрузки реализация должна проверить их содержимое, проверяя соответствующую контрольную сумму загрузки и гарантируя, что все поля находятся в допустимом диапазоне значений.

Хотя начальная операция форматирования инициализирует содержимое основных и резервных загрузочных секторов, реализации могут обновлять эти секторы (а также обновлять соответствующие контрольные суммы загрузки) по мере необходимости. Однако реализации могут обновлять поля VolumeFlags или PercentInUse без обновления соответствующей контрольной суммы загрузки (контрольная сумма специально исключает эти два поля).

таблица 4 Main и структура загрузочного сектора резервного копирования

имени поля

смещения

(байт)

размера

(байты)

примечания
JumpBoot 0 3 Это поле является обязательным и раздел 3.1.1 определяет его содержимое.
ИмяФайловойСистемы 3 8 Это поле является обязательным и раздела 3.1.2 определяет его содержимое.
MustBeZero 11 53 Это поле является обязательным и раздела 3.1.3 определяет его содержимое.
СмещениеРаздела 64 8 Это поле является обязательным и раздел 3.1.4 определяет его содержимое.
ДлинаОбъема 72 8 Это поле является обязательным и раздел 3.1.5 определяет его содержимое.
FatOffset 80 4 Это поле является обязательным и раздел 3.1.6 определяет его содержимое.
FatLength 84 4 Это поле является обязательным и раздел 3.1.7 определяет его содержимое.
ClusterHeapOffset 88 4 Это поле является обязательным и раздел 3.1.8 определяет его содержимое.
КоличествоКластеров 92 4 Это поле является обязательным и раздела 3.1.9 определяет его содержимое.
FirstClusterOfRootDirectory 96 4 Это поле является обязательным и раздел 3.1.10 определяет его содержимое.
VolumeSerialNumber 100 4 Это поле является обязательным и раздел 3.1.11 определяет его содержимое.
FileSystemRevision 104 2 Это поле является обязательным и раздел 3.1.12 определяет его содержимое.
VolumeFlags 106 2 Это поле является обязательным и раздел 3.1.13 определяет его содержимое.
БайтыНаСекторСдвиг 108 1 Это поле является обязательным и раздел 3.1.14 определяет его содержимое.
SectorsPerClusterShift 109 1 Это поле является обязательным и раздел 3.1.15 определяет его содержимое.
NumberOfFats 110 1 Это поле является обязательным и раздел 3.1.16 определяет его содержимое.
DriveSelect 111 1 Это поле является обязательным и раздела 3.1.17 определяет его содержимое.
ПроцентИспользования 112 1 Это поле является обязательным и раздел 3.1.18 определяет его содержимое.
Скрытный 113 7 Это поле является обязательным и его содержимое зарезервировано.
Загрузочный код 120 390 Это поле является обязательным и раздел 3.1.19 определяет его содержимое.
BootSignature 510 2 Это поле является обязательным и раздела 3.1.20 определяет его содержимое.
Избыточное пространство 512 2BytesPerSectorShift – 512

Это поле является обязательным и его содержимое, если таковые имеются, не определены.

Примечание. Оба сектора загрузки основного и резервного копирования содержат поле BytesPerSectorShift.

3.1.1 JumpBoot Поле

Поле JumpBoot должно содержать инструкцию по переходу для ЦП, распространенных на персональных компьютерах, которые при выполнении ЦП прыгает цП для выполнения инструкций по загрузочному обвязке в поле BootCode.

Допустимое значение этого поля (в порядке низкого порядка байтов к байтам высокого порядка) EBh 76h 90h.

Поле FileSystemName 3.1.2

Поле FileSystemName должно содержать имя файловой системы в томе.

Допустимое значение этого поля в символах ASCII — EXFAT, включающее три конечных пробела.

3.1.3 Поле MustBeZero

Поле MustBeZero должно напрямую соответствовать диапазону байтов упакованный блок параметров BIOS, используемый в томах FAT12/16/32.

Допустимое значение этого поля равно 0, что помогает предотвратить ошибочное подключение тома EXFAT для FAT12/16/32.

Поле PartitionOffset 3.1.4

Поле PartitionOffset должно описать смещение относительного сектора мультимедиа секции, в которой размещается заданный том exFAT. Это поле помогает загрузочному обвязке из тома с помощью расширенного inT 13h на персональных компьютерах.

Допустимы все возможные значения этого поля; Однако значение 0 указывает, что реализации должны игнорировать это поле.

Поле VolumeLength 3.1.5

Поле VolumeLength должно описать размер заданного тома exFAT в секторах.

Допустимый диапазон значений для этого поля должен быть следующим:

  • По крайней мере 220/ 2BytesPerSectorShift, что гарантирует, что наименьший объем не меньше 1 МБ

  • Не более 264– 1, самое большое значение этого поля можно описать.

    Однако если размер подрегион избыточного пространства равен 0, то наибольшее значение этого поля — ClusterHeapOffset + (232–11) *2SectorsPerClusterShift.

3.1.6 Поле FatOffset

Поле FatOffset должно описать смещение относительного объема сектора первого FAT. Это поле позволяет реализовать реализацию для выравнивания первого FAT с характеристиками базового носителя хранения.

Допустимый диапазон значений для этого поля должен быть следующим:

  • По крайней мере 24, которые учитывают секторы, которые используют регионы основной загрузки и резервного копирования загрузки
  • По крайней мере ClusterHeapOffset — (FatLength * NumberOfFats), который учитывает секторы, которые используют кучу кластера.

3.1.7 Поле FatLength

Поле FatLength должно описать длину в секторах каждой таблицы FAT (объем может содержать до двух FAT).

Допустимый диапазон значений для этого поля должен быть следующим:

  • По крайней мере (ClusterCount + 2) * 22/ 2BytesPerSectorShiftокругляется до ближайшего целого числа, что гарантирует, что каждый FAT имеет достаточно места для описания всех кластеров в куче кластера.
  • В большинстве случаев (ClusterHeapOffset — FatOffset) / NumberOfFats округляется до ближайшего целого числа, что гарантирует, что fats существуют до кучи кластера

Это поле может содержать значение, превышающее его нижней границы (как описано выше), чтобы включить второй FAT, если он присутствует, также должен быть выровнен с характеристиками базового носителя хранилища. Содержимое пространства, превышающее то, что требуется для САМОГО FAT, если таковые имеются, не определены.

Поле ClusterHeapOffset 3.1.8

Поле ClusterHeapOffset должно описать смещение относительного объема кластера. Это поле позволяет реализовать реализацию для выравнивания кучи кластера с характеристиками базового носителя хранилища.

Допустимый диапазон значений для этого поля должен быть следующим:

  • По крайней мере FatOffset + FatLength * NumberOfFats, чтобы учитывать секторы всех предыдущих регионов потребляют
  • Не более 232- 1 или VolumeLength - (ClusterCount * 2SectorsPerClusterShift), в зависимости от того, какие вычисления меньше

Поле ClusterCount 3.1.9

Поле ClusterCount должно описать количество кластеров, содержащих кучу кластера.

Допустимое значение для этого поля должно быть меньше следующего:

  • (VolumeLength — ClusterHeapOffset) / 2SectorsPerClusterShiftокругляется до ближайшего целого числа, что именно количество кластеров, которые могут соответствовать началу кучи кластера и концу тома.
  • 232– 11, что является максимальным числом кластеров, которые могут описать FAT

Значение поля ClusterCount определяет минимальный размер FAT. Чтобы избежать чрезвычайно больших fats, реализации могут контролировать количество кластеров в куче кластера, увеличив размер кластера (с помощью поля SectorsPerClusterShift). Эта спецификация рекомендует не более 224— 2 кластера в куче кластера. Однако реализации должны обрабатывать тома до 232- 11 кластеров в куче кластера.

Поле FirstClusterOfRootDirectory

Поле FirstClusterOfRootDirectory должно содержать индекс кластера первого кластера корневого каталога. Корневой каталог всегда должен быть описан с цепочкой кластеров в активном FAT, как если бы он был описан с записью каталога, где флаг NoFatChain поля GeneralPrimaryFlags равным нулю (см. раздел 6.3.4.2). Длина данных корневого каталога всегда определяется путем загрузки цепочки кластеров. Реализации должны предпринять все усилия, чтобы разместить первый кластер корневого каталога в первом неисправном кластере после того, как кластеры используют растровое изображение выделения и таблицу up-case.

Допустимый диапазон значений для этого поля должен быть следующим:

  • По крайней мере 2 индекс первого кластера в куче кластера
  • В большинстве случаев ClusterCount + 1 индекс последнего кластера в куче кластера

Поле 3.1.11 VolumeSerialNumber

Поле VolumeSerialNumber должно содержать уникальный серийный номер. Это помогает реализовать различия между различными томами exFAT. Реализации должны создавать серийный номер, сочетая дату и время форматирования тома exFAT. Механизм объединения даты и времени для формирования серийного номера зависит от реализации.

Допустимы все возможные значения этого поля.

3.1.12 Поле FileSystemRevision

Поле FileSystemRevision должно описать основные и незначительные номера редакций структур exFAT в заданном томе.

Байт высокого порядка — это основной номер редакции, а байт низкого порядка — незначительный номер редакции. Например, если байт высокого порядка содержит значение 01h, а если байт низкого порядка содержит значение 05h, то поле FileSystemRevision описывает номер редакции 1.05. Аналогичным образом, если байт высокого порядка содержит значение 0Ah и если байт низкого порядка содержит значение 0Fh, то поле FileSystemRevision описывает номер редакции 10,15.

Допустимый диапазон значений для этого поля должен быть следующим:

  • По крайней мере 0 для байтов низкого порядка и 1 для байтов высокого порядка
  • Не более 99 для байтов низкого порядка и 99 для байтов высокого порядка

Номер редакции exFAT, описывающий эту спецификацию, равен 1.00. Реализации этой спецификации должны подключать любой том exFAT с основным номером редакции 1 и не подключать любой том exFAT с любым другим основным номером редакции. Реализации должны учитывать незначительный номер редакции и не должны выполнять операции или создавать какие-либо структуры файловой системы, не описанные в соответствующей спецификации дополнительного номера редакции.

Поле VolumeFlags 3.1.13

Поле VolumeFlags должно содержать флаги, указывающие состояние различных структур файловой системы на томе exFAT (см. таблице 5).

Реализации не должны включать это поле при вычислении соответствующей контрольной суммы основной загрузки или резервной загрузки. При обращении к сектору загрузки резервного копирования реализация должна рассматривать это поле как устаревшее.

таблице 5 VolumeFlags Field Structure

имени поля

смещения

(бит)

размера

(биты)

примечания
ActiveFat 0 1 Это поле является обязательным и раздел 3.1.13.1 определяет его содержимое.
VolumeDirty 1 1 Это поле является обязательным и раздел 3.1.13.2 определяет его содержимое.
MediaFailure 2 1 Это поле является обязательным и раздел 3.1.13.3 определяет его содержимое.
ClearToZero 3 1 Это поле является обязательным и раздел 3.1.13.4 определяет его содержимое.
Скрытный 4 12 Это поле является обязательным и его содержимое зарезервировано.
Поле ActiveFat 3.1.1.1.1

Поле ActiveFat должно описать, какие растровые карты FAT и выделения являются активными (и реализации должны использоваться), как показано ниже.

  • 0, что означает, что первая растровая карта распределения и первый жир являются активными
  • 1, что означает, что вторая растровая карта распределения fat и второй выделений активна и возможна только в том случае, если поле NumberOfFats содержит значение 2

Реализации должны рассматривать неактивные растровые изображения FAT и выделения как устаревшие. Только реализации с поддержкой TexFAT должны переключать активные растровые карты FAT и выделения (см. раздел 7.1).

Поле VolumeDirty 3.1.13.2

Поле VolumeDirty должно описать, является ли том грязным или нет, как показано ниже.

  • 0, что означает, что объем, вероятно, находится в согласованном состоянии
  • 1, что означает, что объем, вероятно, находится в несогласованном состоянии

Реализации должны задать значение этого поля равным 1 при обнаружении несоответствий метаданных файловой системы, которые они не разрешают. Если при подключении тома значение этого поля равно 1, то только реализации, разрешающие несоответствия метаданных файловой системы, могут очистить значение этого поля до 0. Такие реализации должны очищать значение этого поля до 0 после обеспечения согласованного состояния файловой системы.

Если при подключении тома значение этого поля равно 0, реализации должны задать это поле равным 1, прежде чем обновлять метаданные файловой системы и очищать это поле до 0 после этого, аналогично рекомендуемой последовательности записи, описанной в разделе .8.1.

3.1.13.3 Поле MediaFailure

Поле MediaFailure должно описать, обнаружена ли реализация сбоев мультимедиа, как показано ниже.

  • 0, что означает, что носитель размещения не сообщил о сбоях или известных сбоях уже записаны в FAT как "плохие" кластеры
  • 1, что означает, что носитель размещения сообщил о сбоях (т. е. произошел сбой операций чтения или записи).

Реализация должна задать для этого поля значение 1, если:

  1. Не удается получить доступ к любому региону в томе.
  2. Реализация исчерпала алгоритмы повторных попыток доступа, если таковые имеются.

Если при подключении тома значение этого поля равно 1, реализации, которые сканируют весь том для сбоев мультимедиа и записывают все сбои как "плохие" кластеры в FAT (или в противном случае устраняют сбои мультимедиа) могут очистить значение этого поля до 0.

3.1.13.4 Поле ОчиститьДоНуля

Поле ClearToZero не имеет значительного значения в этой спецификации.

Допустимые значения для этого поля:

  • 0, который не имеет определенного значения
  • 1, что означает, что реализации должны очистить это поле до 0 до изменения любых структур файловой системы, каталогов или файлов.

3.1.14 Поле BytesPerSectorShift

Поле BytesPerSectorShift должно описать байты для каждого сектора, выраженные как журнал2(N), где N — это число байтов на сектор. Например, для 512 байт на сектор значение этого поля равно 9.

Допустимый диапазон значений для этого поля должен быть следующим:

  • По крайней мере 9 (размер сектора 512 байт), который является наименьшим сектором, возможным для тома exFAT
  • Не более 12 (размер сектора 4096 байт), который является размером страницы памяти ЦП, распространенных на персональных компьютерах

3.1.15 Поле SectorsPerClusterShift

Поле SectorsPerClusterShift должно описать секторы для каждого кластера, выраженные как журнал2(N), где N — число секторов на кластер. Например, для 8 секторов на кластер значение этого поля равно 3.

Допустимый диапазон значений для этого поля должен быть следующим:

  • По крайней мере 0 (1 сектор на кластер), что является самым маленьким кластером
  • Не более 25 — BytesPerSectorShift, который оценивается в размере 32 МБ кластера.

Поле 3.1.16 NumberOfFats

Поле NumberOfFats должно описать количество fats и растровых карт выделения, содержащихся в томе.

Допустимый диапазон значений для этого поля должен быть следующим:

  • 1, указывающее, что том содержит только первую растровую карту распределения FAT и первого выделения.
  • 2, указывающее, что том содержит первый FAT, второй FAT, растровое изображение первого выделения и растровое изображение второго выделения; это значение допустимо только для томов TexFAT

3.1.17 Поле выбора привода

Поле DriveSelect должно содержать расширенный номер диска INT 13h, который помогает загрузочному обвязке из этого тома с помощью расширенного INT 13h на персональных компьютерах.

Допустимы все возможные значения этого поля. Аналогичные поля в предыдущих файловых системах на основе FAT часто содержат значение 80h.

Поле 3.1.18 PercentInUse

Поле PercentInUse должно описать процент кластеров в куче кластера, которые выделены.

Допустимый диапазон значений для этого поля должен быть следующим:

  • От 0 до 100 включительно, что является процентом выделенных кластеров в куче кластера, округляя до ближайшего целого числа.
  • Точно FFh, указывающий процент выделенных кластеров в куче кластера недоступен

Реализации должны изменить значение этого поля, чтобы отразить изменения в выделении кластеров в куче кластера или изменить его на FFh.

Реализации не должны включать это поле при вычислении соответствующей контрольной суммы основной загрузки или резервной загрузки. При обращении к сектору загрузки резервного копирования реализация должна рассматривать это поле как устаревшее.

Поле начального кода 3.1.19

Поле BootCode должно содержать инструкции по загрузочному обвязке. Реализации могут заполнять это поле инструкциями ЦП, необходимыми для загрузочного привязывания к компьютерной системе. Реализации, которые не предоставляют инструкции по загрузочному обвязке, должны инициализировать каждый байт в этом поле до F4h (инструкция остановки для ЦП, распространенных на персональных компьютерах) в рамках их операции форматирования.

3.1.20 Поле BootSignature

Поле BootSignature должно описать, является ли намерение данного сектора для него загрузочным сектором или нет.

Допустимое значение этого поля — AA55h. Любое другое значение в этом поле делает недействительным соответствующий загрузочный сектор. Реализации должны проверять содержимое этого поля перед любым другим полем в соответствующем секторе загрузки.

3.2. Основные и резервные резервные секторы расширенных загрузочных секторов

Каждый сектор основных секторов расширенной загрузки имеет одинаковую структуру; однако каждый сектор может содержать отдельные инструкции по загрузочному обвязке (см. таблицу 6). Агенты обвязки загрузки, такие как инструкции по загрузочному обвязке в главном секторе загрузки, альтернативные реализации BIOS или встроенное ПО встроенного ПО системы, могут загружать эти секторы и выполнять содержащиеся в них инструкции.

Секторы расширенной загрузки резервного копирования — это резервная копия основных расширенных загрузочных секторов и имеет ту же структуру (см. таблицу 6).

Перед выполнением инструкций для секторов основной или резервной копии расширенных загрузочных секторов реализация должна проверить их содержимое, убедившись, что поле ExtendedBootSignature каждого сектора содержит его предписанное значение.

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

таблице 6 Расширенные структуры сектора загрузки

имени поля

смещения

(байт)

размера

(байты)

примечания
ExtendedBootCode 0 2BytesPerSectorShift – 4

Это поле является обязательным и раздела 3.2.1 определяет его содержимое.

Примечание. Оба сектора загрузки основного и резервного копирования содержат поле BytesPerSectorShift.

ExtendedBootSignature 2BytesPerSectorShift – 4 4

Это поле является обязательным и раздел 3.2.2.2 определяет его содержимое.

Примечание. Оба сектора загрузки основного и резервного копирования содержат поле BytesPerSectorShift.

Поле ExtendedBootCode 3.2.1

Поле ExtendedBootCode должно содержать инструкции по загрузочному обвязке. Реализации могут заполнять это поле инструкциями ЦП, необходимыми для загрузочного привязывания к компьютерной системе. Реализации, которые не предоставляют инструкции по загрузочному обвязке, должны инициализировать каждый байт в этом поле до 00h в рамках операции форматирования.

Поле ExtendedBootSignature 3.2.2

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

Допустимое значение этого поля — AA550000h. Любое другое значение в этом поле недействительно определяет соответствующий сектор главного или расширенного загрузки резервного копирования. Реализации должны проверять содержимое этого поля перед любым другим полем в соответствующем расширенном секторе загрузки.

3.3 Основные и резервные параметры OEM-регионов

Подрегион основных параметров OEM содержит десять структур параметров, которые могут содержать сведения о производителях (см. таблицу 7). Каждая из десяти структур параметров является производным от шаблона универсальных параметров (см. раздел 3.3.2). Производители могут наследовать собственные пользовательские структуры параметров из шаблона универсальных параметров. Эта спецификация определяет две структуры параметров: Null Parameters (см. раздел 3.3.3) и параметры флэш-памяти (см. раздел 3.3.4).

Параметры OEM резервного копирования — это резервная копия основных параметров OEM и имеет ту же структуру (см. таблицу 7).

Перед использованием содержимого параметров основного или резервного копирования OEM реализация должна проверить их содержимое, проверяя соответствующую контрольную сумму загрузки.

Производители должны заполнять параметры основного и резервного копирования OEM собственными настраиваемыми структурами параметров, если таковые имеются, и любыми другими структурами параметров. Последующие операции форматирования должны сохранять содержимое параметров основного и резервного копирования OEM.

Реализации могут обновлять параметры основного и резервного копирования OEM по мере необходимости (а также обновлять соответствующую контрольную сумму загрузки).

таблица 7 параметров OEM

имени поля

смещения

(байт)

размера

(байты)

примечания
Параметры[0] 0 48 Это поле является обязательным и раздел 3.3.1 определяет его содержимое.

.

.

.

.

.

.

.

.

.

.

.

.

Параметры[9] 432 48 Это поле является обязательным и раздел 3.3.1 определяет его содержимое.
Скрытный 480 2BytesPerSectorShift – 480

Это поле является обязательным и его содержимое зарезервировано.

Примечание. Оба сектора загрузки основного и резервного копирования содержат поле BytesPerSectorShift.

3.3.1 Параметры[0] ... Параметры[9]

Каждое поле "Параметры" в этом массиве содержит структуру параметров, которая является производным от шаблона универсальных параметров (см. раздел раздел 3.3.2). Любое поле неиспользуемых параметров должно быть описано как содержащее структуру null параметров (см. разделе 3.3.3).

Шаблон универсальных параметров 3.3.2

Шаблон универсальных параметров предоставляет базовое определение структуры параметров (см. таблицу 8). Все структуры параметров являются производными от этого шаблона. Поддержка этого шаблона универсальных параметров является обязательной.

шаблона универсальных параметров таблицы 8

имени поля

смещения

(байт)

размера

(байты)

примечания
ParametersGuid 0 16 Это поле является обязательным и раздела 3.3.2.1 определяет его содержимое.
ПользовательскоеОпределение 16 32 Это поле является обязательным и структуры, производные от этого шаблона, определяют его содержимое.
3.3.2.1 Поле ParametersGuid

Поле ParametersGuid должно описать GUID, который определяет макет оставшейся части заданной структуры параметров.

Допустимы все возможные значения этого поля; Однако производители должны использовать средство создания GUID, например GuidGen.exe, для выбора GUID при создании пользовательских структур параметров из этого шаблона.

3.3.3 Пустые параметры

Структура null параметров является производным от шаблона универсальных параметров (см. раздел 3.3.3.2) и описывает поле неиспользуемых параметров (см. таблицу 9). При создании или обновлении структуры параметров OEM реализация должна заполнять поля неиспользуемых параметров структурой null Parameters. Кроме того, при создании или обновлении структуры параметров OEM реализация должна консолидировать структуры NULL Parameters в конце массива, тем самым оставляя все другие структуры параметров в начале структуры параметров OEM.

Поддержка структуры параметров NULL является обязательной.

таблице 9 Null Parameters Structure

имени поля

смещения

(байт)

размера

(байты)

примечания
ParametersGuid 0 16 Это поле является обязательным и раздел 3.3.3.1 определяет его содержимое.
Скрытный 16 32 Это поле является обязательным и его содержимое зарезервировано.
3.3.3.1 Поле ParametersGuid

Поле ParametersGuid должно соответствовать определению, предоставленному шаблоном универсальных параметров (см. раздел 3.3.3.2.1).

Допустимое значение этого поля в нотации GUID {00000000-0000-0000-0000-000000000000}.

Параметры флэш-памяти 3.3.4

Структура параметра Flash является производным от шаблона универсальных параметров (см. раздел 3.3.3.2) и содержит параметры для флэш-носителя (см. таблицу 10 ). Производители устройств хранения на основе флэш-памяти могут заполнять поле "Параметры" (предпочтительно поле "Параметры[0] этой структурой параметров. Реализации могут использовать сведения в структуре параметров Flash для оптимизации операций доступа во время операций чтения и записи и выравнивания структур файловой системы во время форматирования носителя.

Поддержка структуры параметров Flash является необязательной.

Структура параметров флэш-памяти таблицы 10

имени поля

смещения

(байт)

размера

(байты)

примечания
ParametersGuid 0 16 Это поле является обязательным и раздел 3.3.4.1 определяет его содержимое.
EraseBlockSize 16 4 Это поле является обязательным и раздел 3.3.4.2 определяет его содержимое.
РазмерСтраницы 20 4 Это поле является обязательным и раздел 3.3.4.3 определяет его содержимое.
Запасные секторы двадцать четыре 4 Это поле является обязательным и раздел 3.3.4.4 определяет его содержимое.
время выборочного доступа 28 4 Это поле является обязательным и раздел 3.3.4.5 определяет его содержимое.
ПрограммированиеTime 32 4 Это поле является обязательным и раздел 3.3.4.6 определяет его содержимое.
ReadCycle 36 4 Это поле является обязательным и раздел 3.3.4.7 определяет его содержимое.
WriteCycle 40 4 Это поле является обязательным и раздел 3.3.4.8 определяет его содержимое.
Скрытный 44 4 Это поле является обязательным и его содержимое зарезервировано.

Допустимы все возможные значения для всех полей Flash Parameters, кроме поля ParametersGuid. Однако значение 0 указывает, что поле на самом деле бессмысленно (реализации должны игнорировать заданное поле).

Поле параметров 3.3.4.1

Поле ParametersGuid должно соответствовать определению, указанному в шаблоне универсальных параметров (см. раздел 3.3.2.1).

Допустимое значение этого поля в нотации GUID — {0A0C7E46-3399-4021-90C8-FA6D389C4BA2}.

3.3.4.2 Поле EraseBlockSize

Поле EraseBlockSize должно описать размер в байтах блока удаления флэш-носителя.

3.3.4.3 Поле PageSize

Поле PageSize должно описать размер страницы флэш-носителя в байтах.

Поле запасных элементов 3.3.4.4

Поле SpareSectors должно описать количество секторов, доступных для внутренних операций с разрежением.

Поле 3.3.4.5 RandomAccessTime

Поле RandomAccessTime должно описать среднее время случайного доступа флэш-носителя в наносекундах.

Поле программирования 3.3.4.6

Поле ProgrammingTime должно описать среднее время программирования флэш-носителя в наносекундах.

Поле чтения 3.3.4.7

Поле ReadCycle должно описать среднее время цикла чтения флэш-носителя в наносекундах.

3.3.4.8 Поле WriteCycle

Поле WriteCycle должно описать среднее время цикла записи в наносекундах.

3.4 Основные и резервные области контрольной суммы загрузки резервного копирования

Контрольные суммы главного и резервного копирования содержат повторяющийся шаблон четырехбайтовой контрольной суммы содержимого всех остальных вложенных регионов в соответствующих регионах загрузки. Вычисление контрольной суммы не должно содержать поля VolumeFlags и PercentInUse в соответствующем секторе загрузки (см. рис. 1). Повторяющийся шаблон четырехбайтовой контрольной суммы заполняет соответствующий подрегион контрольной суммы загрузки с начала до конца подрегион.

Перед использованием содержимого любого из других вложенных регионов в регионах Main или Backup Boot реализация должна проверить их содержимое, проверяя соответствующую контрольную сумму загрузки загрузки.

Хотя начальная операция форматирования заполняет как основные, так и резервные суммы контрольных сумм повторяющимся шаблоном контрольной суммы, реализации должны обновлять эти секторы как содержимое других секторов в соответствующих регионах загрузки.

рис. 1 Вычисление контрольной суммы загрузки

UInt32 BootChecksum
(
    UCHAR  * Sectors,        // points to an in-memory copy of the 11 sectors
    USHORT   BytesPerSector
)
{
    UInt32 NumberOfBytes = (UInt32)BytesPerSector * 11;
    UInt32 Checksum = 0;
    UInt32 Index;

    for (Index = 0; Index < NumberOfBytes; Index++)
    {
        if ((Index == 106) || (Index == 107) || (Index == 112))
        {
            continue;
        }
        Checksum = ((Checksum&1) ? 0x80000000 : 0) + (Checksum>>1) + (UInt32)Sectors[Index];
    }

    return Checksum;
}

4 области таблицы выделения файлов

Область "Таблица выделения файлов" (FAT) может содержать до двух FAT, один в первом подрегионе FAT и другой во втором подрегионе FAT. Поле NumberOfFats описывает, сколько fats этого региона содержит. Допустимые значения поля NumberOfFats: 1 и 2. Поэтому первый подрегион FAT всегда содержит FAT. Если поле NumberOfFats равно двум, второй подрегион FAT также содержит FAT.

Поле ActiveFat поля VolumeFlags описывает, какая функция FAT активна. Текущей является только поле VolumeFlags в основном секторе загрузки. Реализации должны относиться к ЖИРу, который не активен как устаревший. Использование неактивного FAT и переключения между FATs является конкретной реализацией.

4.1 Первый и Второй подрегиаторы FAT

FAT должен описывать цепочки кластеров в куче кластера (см. таблицу 11). Цепочка кластеров представляет собой ряд кластеров, которые предоставляют пространство для записи содержимого файлов, каталогов и других структур файловой системы. FAT представляет цепочку кластеров в виде последовательно связанного списка индексов кластера. За исключением первых двух записей каждая запись в FAT представляет ровно один кластер.

таблице 11 Структура таблицы выделения файлов

имени поля

смещения

(байт)

размера

(байты)

примечания
FatEntry[0] 0 4 Это поле является обязательным и раздел 4.1.1 определяет его содержимое.
FatEntry[1] 4 4 Это поле является обязательным и раздел 4.1.2 определяет его содержимое.
FatEntry[2] 8 4 Это поле является обязательным и раздел 4.1.3 определяет его содержимое.

.

.

.

.

.

.

.

.

.

.

.

.

FatEntry[ClusterCount+1] (ClusterCount + 1) * 4 4

Это поле является обязательным и раздел 4.1.3 определяет его содержимое.

ClusterCount + 1 не может превышать FFFFFFF6h.

Примечание. Основные и резервные секторы загрузки содержат поле ClusterCount.

Избыточное пространство (ClusterCount + 2) * 4 (FatLength * 2BytesPerSectorShift) — ((ClusterCount + 2) * 4)

Это поле является обязательным и его содержимое, если таковые имеются, не определены.

Примечание. Основные и резервные секторы загрузки содержат поля ClusterCount, FatLength и BytesPerSectorShift.

4.1.1 FatEntry[0] Поле

Поле FatEntry[0] должно описать тип носителя в первом байте (наименьшем порядке байта) и должен содержать FFh в оставшихся трех байтах.

Тип носителя (первый байт) должен быть F8h.

4.1.2 FatEntry[1] Поле

Поле FatEntry[1] существует только из-за исторического приоритета и не описывает ничего интересного.

Допустимое значение этого поля — FFFFFFFFh. Реализации должны инициализировать это поле в заданное значение и не должны использовать это поле для какой-либо цели. Реализации не должны интерпретировать это поле и сохранять его содержимое в операциях, которые изменяют окружающие поля.

4.1.3 FatEntry[2] ... Поля FatEntry[ClusterCount+1]

Каждое поле FatEntry в этом массиве должно представлять кластер в куче кластера. FatEntry[2] представляет первый кластер в куче кластера и FatEntry[ClusterCount+1] представляет последний кластер в куче кластера.

Допустимый диапазон значений для этих полей должен быть следующим:

  • От 2 до ClusterCount + 1 включительно, что указывает на следующий FatEntry в данной цепочке кластеров; Данный FatEntry не должен указывать на fatEntry, который предшествует ему в данной цепочке кластеров
  • Именно FFFFFFF7h, который обозначает соответствующий кластер FatEntry как "плохой"
  • Именно FFFFFFFFh, который помечает соответствующий кластер FatEntry в качестве последнего кластера цепочки кластеров; Это единственное допустимое значение для последней fatEntry из любой заданной цепочки кластеров.

5 Регион данных

Регион данных содержит кучу кластера, которая предоставляет управляемое пространство для структур файловой системы, каталогов и файлов.

5.1 Подрегион кластера

Структура кучи кластера очень простая (см. таблицу 12 ); каждый последовательный ряд секторов описывает один кластер, как определяет поле SectorsPerClusterShift. Важно, что первый кластер кучи кластера имеет индекс два, который напрямую соответствует индексу FatEntry[2].

В томе exFAT растровое изображение выделения (см. раздел 7.1.1.5) сохраняет запись состояния выделения всех кластеров. Это значительное различие от предшественников exFAT (FAT12, FAT16 и FAT32), в которых FAT сохраняет запись состояния выделения всех кластеров в куче кластера.

таблице 12 кучи кластера

имени поля

смещения

(сектор)

размера

(секторы)

примечания
Кластер[2] ClusterHeapOffset 2СектораНаСдвигКластера

Это поле является обязательным и раздел 5.1.1 определяет его содержимое.

Примечание. Основные и резервные секторы загрузки содержат поля ClusterHeapOffset и SectorsPerClusterShift.

.

.

.

.

.

.

.

.

.

.

.

.

Кластер[ClusterCount+1] ClusterHeapOffset + (ClusterCount – 1) * 2SectorsPerClusterShift 2СектораНаСдвигКластера

Это поле является обязательным и раздел 5.1.1 определяет его содержимое.

Примечание. Основные и резервные секторы загрузки содержат поля ClusterCount, ClusterHeapOffset и SectorsPerClusterShift.

5.1.1 Кластер[2] ... Поля Cluster[ClusterCount+1]

Каждое поле кластера в этом массиве представляет собой ряд смежных секторов, размер которых определяется полем SectorsPerClusterShift.

Структура каталогов 6

В файловой системе exFAT используется подход дерева каталогов для управления структурами файловой системы и файлами, которые существуют в куче кластера. Каталоги имеют связь "один ко многим" между родительским и дочерним в дереве каталогов.

Каталог, к которому ссылается поле FirstClusterOfRootDirectory, является корнем дерева каталогов. Все остальные каталоги спускаются из корневого каталога в последовательно связанном виде.

Каждый каталог состоит из ряда записей каталога (см. таблицу 13).

Одна или несколько записей каталога объединяются в набор записей каталога, описывающий что-то интересное, например структуру файловой системы, вложенный каталог или файл.

таблица 13 структура каталогов

имени поля

смещения

(байт)

размера

(байт)

примечания
DirectoryEntry[0] 0 32 Это поле является обязательным и раздел 6.1 определяет его содержимое.

.

.

.

.

.

.

.

.

.

.

.

.

DirectoryEntry[N–1] (N – 1) * 32 32

Это поле является обязательным и раздел 6.1 определяет его содержимое.

N, число полей DirectoryEntry — это размер в байтах цепочки кластеров, содержащей указанный каталог, разделенный размером поля DirectoryEntry, 32 байта.

6.1 DirectoryEntry[0] ... DirectoryEntry[N--1]

Каждое поле DirectoryEntry в этом массиве является производным от шаблона Generic DirectoryEntry (см. разделе 6.2).

Шаблон 6.2 Generic DirectoryEntry

Шаблон Generic DirectoryEntry предоставляет базовое определение записей каталога (см. таблице 14). Все структуры записи каталогов являются производными от этого шаблона и допустимы только структуры входа в каталог, определенные корпорацией Майкрософт(exFAT не имеют положений для структур входа каталога, определенных производителем, за исключением того, что определено в разделе 7.8 и раздела 7.9). Возможность интерпретации шаблона Generic DirectoryEntry является обязательной.

таблице 14 Generic DirectoryEntry Template

имени поля

смещения

(байт)

размера

(байт)

примечания
Тип записи 0 1 Это поле является обязательным и раздел 6.2.1 определяет его содержимое.
ПользовательскоеОпределение 1 19 Это поле является обязательным, и структуры, производные от этого шаблона, могут определять его содержимое.
FirstCluster 20 4 Это поле является обязательным и раздел 6.2.2.2 определяет его содержимое.
ДлинаДанных двадцать четыре 8 Это поле является обязательным и раздела 6.2.3 определяет его содержимое.

Поле записи 6.2.1

Поле EntryType имеет три режима использования, которое определяет значение поля (см. список ниже).

  • 00h, который представляет собой маркер конца каталога, и применяются следующие условия:
    • Все остальные поля в заданном DirectoryEntry фактически зарезервированы
    • Все последующие записи каталога в данном каталоге также являются маркерами конца каталога.
    • Маркеры конечных каталогов допустимы только вне наборов записей каталога
    • Реализации могут перезаписать маркеры конца каталога по мере необходимости
  • В диапазоне от 01h до 7Fh включительно, который является маркером неиспользуемой записи каталога, применяются следующие условия:
    • Все остальные поля в заданном DirectoryEntry фактически не определены
    • Неиспользуемые записи каталога допустимы только за пределами наборов записей каталогов.
    • Реализации могут перезаписать неиспользуемые записи каталога по мере необходимости
    • Этот диапазон значений соответствует полю InUse (см. раздел 6.2.1.4), содержащий значение 0
  • Между 81h и FFh включительно, что соответствует регулярной записи каталога при следующих условиях:
    • Содержимое поля EntryType (см. таблицу 15) определяет макет остальной части структуры DirectoryEntry.
    • Этот диапазон значений и только этот диапазон значений является допустимым внутри набора записей каталога.
    • Этот диапазон значений напрямую соответствует полю InUse (см. раздел 6.2.1.4), содержащий значение 1

Чтобы предотвратить изменения в поле InUse (см. раздел раздел 6.2.1.4) ошибочно, что приводит к ошибке маркера конца каталога, значение 80h недопустимо.

таблице 15 Generic EntryType Field Structure

имени поля

смещения

(бит)

размера

(биты)

примечания
Код типа 0 5 Это поле является обязательным и раздел 6.2.1.1 определяет его содержимое.
ТипВажности 5 1 Это поле является обязательным и раздел раздел 6.2.1.2 определяет его содержимое.
ТипКатегория 6 1 Это поле является обязательным и раздел 6.2.1.3 определяет его содержимое.
В использовании 7 1 Это поле является обязательным и раздел 6.2.1.4 определяет его содержимое.
Поле TypeCode 6.2.1.1

Поле TypeCode частично описывает конкретный тип заданной записи каталога. Это поле, а также поля TypeImportance и TypeCategory (см. раздел 6.2.1.2 и раздел 6.2.1.3соответственно) однозначно идентифицирует тип заданной записи каталога.

Допустимы все возможные значения этого поля, если только поля TypeImportance и TypeCategory не содержат значение 0; В этом случае значение 0 недопустимо для этого поля.

Поле TypeImportance 6.2.1.2

Поле TypeImportance должно описать важность заданной записи каталога.

Допустимые значения этого поля должны быть:

  • 0, что означает, что указанная запись каталога имеет решающее значение (см. раздел раздел 6.3.1.1 и раздел 6.4.1.2.1 для критически важных записей основного и критического вторичного каталога соответственно)
  • 1, что означает, что указанная запись каталога является доброкачественной (см. раздел 6.3.1.2.2 и раздел 6.4.1.2.2 для доброкачественных первичных и доброкачественных записей вторичных каталогов соответственно)
6.2.1.3 Поле TypeCategory

Поле TypeCategory должно описать категорию заданной записи каталога.

Допустимые значения этого поля должны быть:

  • 0, что означает, что указанная запись каталога является основной (см. раздел 6.3)
  • 1, что означает, что указанная запись каталога является вторичной (см. раздел 6.4)
6.2.1.4 InUse Field

Поле InUse должно описать, используется ли указанная запись каталога.

Допустимые значения этого поля должны быть:

  • 0, что означает, что указанная запись каталога не используется; Это означает, что данная структура фактически является неиспользуемой записью каталога
  • 1, что означает, что указанная запись каталога используется; Это означает, что данная структура является обычной записью каталога

6.2.2 Поле FirstCluster

Поле FirstCluster должно содержать индекс первого кластера выделения в куче кластера, связанной с указанной записью каталога.

Допустимый диапазон значений для этого поля должен быть следующим:

  • Ровно 0, что означает, что выделение кластера не существует
  • От 2 до ClusterCount + 1, который является диапазоном допустимых индексов кластера

Структуры, производные от этого шаблона, могут переопределить поля FirstCluster и DataLength, если выделение кластера несовместимо с производной структурой.

Поле DataLength 6.2.3

Поле DataLength описывает размер в байтах данных, содержащихся в связанном выделении кластера.

Допустимый диапазон значений для этого поля:

  • По крайней мере 0; Если поле FirstCluster содержит значение 0, допустимое значение этого поля равно 0.
  • По крайней мере ClusterCount * 2SectorsPerClusterShift* 2BytesPerSectorShift

Структуры, производные от этого шаблона, могут переопределить поля FirstCluster и DataLength, если выделение кластера невозможно для производной структуры.

Шаблон 6.3 Generic Primary DirectoryEntry

Первая запись каталога в наборе записей каталога должна быть основной записью каталога. Все последующие записи каталога, если таковые есть, в наборе записей каталога должны быть вторичными записями каталога (см. раздел 6.4).

Возможность интерпретировать шаблон Generic Primary DirectoryEntry является обязательным.

Все структуры записи основного каталога являются производными от шаблона Generic Primary DirectoryEntry (см. раздел таблица 16), производный от шаблона Generic DirectoryEntry (см. раздел 6.2).

таблице 16 Универсальный шаблон primary DirectoryEntry

имени поля

смещения

(байт)

размера

(байт)

примечания
Тип записи 0 1 Это поле является обязательным и раздел 6.3.1 определяет его содержимое.
SecondaryCount 1 1 Это поле является обязательным и раздела 6.3.2 определяет его содержимое.
SetChecksum 2 2 Это поле является обязательным и раздела 6.3.3 определяет его содержимое.
ОсновныеФлаги (GeneralPrimaryFlags) 4 2 Это поле является обязательным и раздел 6.3.4 определяет его содержимое.
ПользовательскоеОпределение 6 14 Это поле является обязательным и структуры, производные от этого шаблона, определяют его содержимое.
FirstCluster 20 4 Это поле является обязательным и раздел 6.3.5 определяет его содержимое.
ДлинаДанных двадцать четыре 8 Это поле является обязательным и раздел 6.3.6 определяет его содержимое.

Поле entryType 6.3.1

Поле EntryType должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.1).

Поле TypeCode 6.3.1.1

Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1.1).

Поле TypeImportance 6.3.1.2

Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1.2).

6.3.1.2.1 Критически важные записи основного каталога

Критически важные записи основного каталога содержат сведения, критически важные для правильного управления томом exFAT. Только корневой каталог содержит критически важные записи основного каталога (записи каталога файлов являются исключением, см. разделе 7.4).

Определение критически важных записей основного каталога сопоставляется с основным номером редакции exFAT. Реализации должны поддерживать все критически важные записи первичного каталога и записывать только критически важные структуры записи основного каталога, которые определяются этой спецификацией.

6.3.1.2.2 Доброкачественные записи первичного каталога

Доброкачественные записи первичного каталога содержат дополнительные сведения, которые могут быть полезны для управления томом exFAT. Любой каталог может содержать доброкачественные записи первичного каталога.

Определение доброкачественных записей первичного каталога сопоставляется с дополнительным номером редакции exFAT. Поддержка любой доброкачественной записи первичного каталога этой спецификации или любой последующей спецификации определяется необязательно. Нераспознанная неопознанная запись первичного каталога отображает весь набор записей каталога как нераспознанный (помимо определения применимых шаблонов записей каталогов).

6.3.1.3 Поле TypeCategory

Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1.3).

Для этого шаблона допустимое значение для этого поля должно иметь значение 0.

6.3.1.4 InUse Field

Поле InUse должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.1.4).

Поле 6.3.2 SecondaryCount

Поле SecondaryCount должно описать количество записей вторичного каталога, которые немедленно следуют заданной записи первичного каталога. Эти записи вторичного каталога вместе с заданной записью первичного каталога составляют набор записей каталога.

Допустимый диапазон значений для этого поля должен быть следующим:

  • По крайней мере 0, это означает, что эта запись первичного каталога является единственной записью в наборе записей каталога.
  • Не более 255, что означает следующие 255 записей каталога, а эта запись основного каталога состоит из набора записей каталога.

Критически важные структуры записи основного каталога, производные от этого шаблона, могут переопределить поля SecondaryCount и SetChecksum.

Поле SetChecksum 6.3.3

Поле SetChecksum должно содержать контрольную сумму всех записей каталога в заданном наборе записей каталога. Однако контрольная сумма исключает это поле (см. рис. 2). Реализации должны проверить, является ли содержимое этого поля допустимым перед использованием любой другой записи каталога в заданном наборе записей каталога.

Критически важные структуры записи основного каталога, производные от этого шаблона, могут переопределить поля SecondaryCount и SetChecksum.

рис. 2. Вычисление EntrySetChecksum

UInt16 EntrySetChecksum
(
    UCHAR * Entries,       // points to an in-memory copy of the directory entry set
    UCHAR   SecondaryCount
)
{
    UInt16 NumberOfBytes = ((UInt16)SecondaryCount + 1) * 32;
    UInt16 Checksum = 0;
    UInt16 Index;

    for (Index = 0; Index < NumberOfBytes; Index++)
    {
        if ((Index == 2) || (Index == 3))
        {
            continue;
        }
        Checksum = ((Checksum&1) ? 0x8000 : 0) + (Checksum>>1) +  (UInt16)Entries[Index];
    }
    return Checksum;
}

6.3.4 Поле GeneralPrimaryFlags

Поле GeneralPrimaryFlags содержит флаги (см. таблицу 17).

Критически важные структуры записи основного каталога, производные от этого шаблона, могут переопределить это поле.

таблице 17 GenericPrimaryFlags Field Structure

имени поля

смещения

(бит)

размера

(биты)

примечания
Возможное распределение 0 1 Это поле является обязательным и раздел 6.3.4.1 определяет его содержимое.
NoFatChain 1 1 Это поле является обязательным и раздел 6.3.4.2 определяет его содержимое.
ПользовательскоеОпределение 2 14 Это поле является обязательным и структуры, производные от этого шаблона, могут определять это поле.
Поле 6.3.4.1 AllocationPossible

Поле AllocationPossible должно описать, возможно ли выделение в куче кластера для указанной записи каталога.

Допустимые значения этого поля должны быть:

  • 0, что означает, что связанное выделение кластеров невозможно, а поля FirstCluster и DataLength фактически не определены (структуры, производные от этого шаблона, могут переопределить эти поля).
  • 1. Это означает, что возможно связанное выделение кластеров, а поля FirstCluster и DataLength определены.
6.3.4.2 Поле NoFatChain

Поле NoFatChain должно указывать, описывает ли активный FAT цепочку кластеров данного выделения.

Допустимые значения этого поля должны быть:

  • 0, что означает, что соответствующие записи FAT для цепочки кластеров выделения являются допустимыми, и реализации должны интерпретировать их; Значение 0, если поле AllocationPossible содержит значение 0 или если поле AllocationPossible содержит значение 1, а поле FirstCluster содержит значение 0, допустимое значение этого поля равно 0.
  • 1, что означает, что связанное выделение является одним непрерывным рядом кластеров; Соответствующие записи FAT для кластеров недопустимы, а реализации не интерпретируют их; Реализации могут использовать следующее уравнение для вычисления размера связанного выделения: DataLength / (2SectorsPerClusterShift* 2BytesPerSectorShift) округляется до ближайшего целого числа.

Если критически важные структуры записи основного каталога, производные от этого шаблона, переопределяют поле GeneralPrimaryFlags, то допустимы соответствующие записи FAT для любой связанной цепочки кластеров.

6.3.5 Поле FirstCluster

Поле FirstCluster должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.2).

Если бит NoFatChain равен 1, FirstCluster должен указывать на допустимый кластер в куче кластера.

Критически важные структуры записи основного каталога, производные от этого шаблона, могут переопределить поля FirstCluster и DataLength. Другие структуры, производные от этого шаблона, могут переопределить поля FirstCluster и DataLength, только если поле AllocationPossible содержит значение 0.

6.3.6 Поле DataLength

Поле DataLength должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.3).

Если бит NoFatChain равен 1, DataLength не должен быть нулевым. Если поле FirstCluster равно нулю, DataLength также должно быть равно нулю.

Критически важные структуры записи основного каталога, производные от этого шаблона, могут переопределить поля FirstCluster и DataLength. Другие структуры, производные от этого шаблона, могут переопределить поля FirstCluster и DataLength, только если поле AllocationPossible содержит значение 0.

Шаблон 6.4 Generic Secondary DirectoryEntry

Основной целью записей вторичного каталога является предоставление дополнительных сведений о наборе записей каталога. Возможность интерпретировать шаблон Generic Secondary DirectoryEntry является обязательным.

Определение критически важных и доброкачественных записей вторичного каталога коррелирует с дополнительным номером редакции exFAT. Поддержка любой критической или доброкачественной записи вторичного каталога этой спецификации или последующих спецификаций определяется необязательно.

Все структуры записи вторичного каталога являются производными от шаблона Generic Secondary DirectoryEntry (см. таблицу 18), которая является производным от шаблона Generic DirectoryEntry (см. раздел 6.2).

таблице 18 Generic Secondary DirectoryEntry Template

имени поля

смещения

(байт)

размера

(байт)

примечания
Тип записи 0 1 Это поле является обязательным, и раздел раздел 6.4.1 определяет его содержимое.
GeneralSecondaryFlags 1 1 Это поле является обязательным и раздел 6.4.2 определяет его содержимое.
ПользовательскоеОпределение 2 18 Это поле является обязательным и структуры, производные от этого шаблона, определяют его содержимое.
FirstCluster 20 4 Это поле является обязательным и раздел 6.4.3 определяет его содержимое.
ДлинаДанных двадцать четыре 8 Это поле является обязательным и раздел 6.4.4 определяет его содержимое.

Поле entryType 6.4.1

Поле EntryType должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1)

Поле TypeCode 6.4.1.1

Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1.1).

Поле TypeImportance 6.4.1.2

Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1.2).

6.4.1.2.1 Критически важные записи вторичного каталога

Критически важные записи вторичного каталога содержат сведения, критически важные для правильного управления его содержащим набором записей каталога. Хотя поддержка любой определенной критической записи вторичного каталога является необязательной, нераспознанная запись критического каталога отображает весь набор записей каталога как неузнанный (за пределами определения применимых шаблонов записей каталогов).

Однако если набор записей каталога содержит по крайней мере одну критически важную запись вторичного каталога, которая не распознает реализацию, то реализация должна в большинстве случаев интерпретировать шаблоны записей каталога в наборе записей каталога, а не данные, связанные с любой записью каталога в наборе записей каталогов, содержащих (записи каталога файлов являются исключением, см. раздел 7.4).

6.4.1.2.2 Доброкачественные записи вторичного каталога

Доброкачественные записи вторичного каталога содержат дополнительные сведения, которые могут быть полезны для управления его содержащим набором записей каталога. Поддержка любой конкретной неопасной записи вторичного каталога является необязательной. Нераспознанные неопознанные записи вторичного каталога не отображают весь набор записей каталога как нераспознанные.

Реализации могут игнорировать любую неопасную вторичную запись, не распознаваемую.

6.4.1.3 Поле TypeCategory

Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1.3).

Для этого шаблона допустимое значение этого поля равно 1.

6.4.1.4 InUse Field

Поле InUse должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.1.4).

6.4.2 Поле GeneralSecondaryFlags

Поле GeneralSecondaryFlags содержит флаги (см. таблицу 19).

таблице 19 GenericSecondaryFlags Field Structure

имени поля

смещения

(бит)

размера

(биты)

примечания
Возможное распределение 0 1 Это поле является обязательным и раздел 6.4.2.1 определяет его содержимое.
NoFatChain 1 1 Это поле является обязательным и раздел 6.4.2.2.2 определяет его содержимое.
ПользовательскоеОпределение 2 6 Это поле является обязательным и структуры, производные от этого шаблона, могут определять это поле.
Поле 6.4.2.1 AllocationPossible

Поле AllocationPossible должно иметь то же определение, что и поле с тем же именем в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.4.1).

6.4.2.2 NoFatChain Field

Поле NoFatChain должно иметь то же определение, что и в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.4.2).

6.4.3 Поле FirstCluster

Поле FirstCluster должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.2).

Если бит NoFatChain равен 1, FirstCluster должен указывать на допустимый кластер в куче кластера.

Поле DataLength 6.4.4

Поле DataLength должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.3).

Если бит NoFatChain равен 1, DataLength не должен быть нулевым. Если поле FirstCluster равно нулю, DataLength также должно быть равно нулю.

Определения записей каталога 7

Версия 1.00 файловой системы exFAT определяет следующие записи каталога:

  • Критически важный вспомогательный
  • Доброкачественный вторичный

Запись каталога растрового изображения выделения 7.1

В файловой системе exFAT FAT не описывает состояние выделения кластеров; скорее, растровое изображение выделения выполняется. Растровые карты выделения существуют в куче кластера (см. раздел раздел 7.1.5) и имеют соответствующие критически важные записи основного каталога в корневом каталоге (см. таблицу 20).

Поле NumberOfFats определяет количество допустимых записей каталога Bitmap выделения в корневом каталоге. Если поле NumberOfFats содержит значение 1, то единственное допустимое число записей каталога bitmap выделения равно 1. Кроме того, запись каталога bitmap выделения действительна только в том случае, если она описывает первую растровую карту выделения (см. раздел раздел 7.1.2.1). Если поле NumberOfFats содержит значение 2, то единственным допустимым числом записей каталога bitmap выделения является 2. Кроме того, два записи каталога растровых карт выделения допустимы только в том случае, если один описывает первую растровую карту выделения, а другой — второй растровый рисунок выделения.

таблица 20 Структура точечных карт выделения directoryEntry

имени поля

смещения

(байт)

размера

(байт)

примечания
Тип записи 0 1 Это поле является обязательным и раздел 7.1.1 определяет его содержимое.
BitmapFlags 1 1 Это поле является обязательным и раздел 7.1.2 определяет его содержимое.
Скрытный 2 18 Это поле является обязательным и его содержимое зарезервировано.
FirstCluster 20 4 Это поле является обязательным и раздел 7.1.3 определяет его содержимое.
ДлинаДанных двадцать четыре 8 Это поле является обязательным и раздел 7.1.4 определяет его содержимое.

Поле entryType 7.1.1

Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел раздел 6.3.1).

7.1.1.1 Поле TypeCode

Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.1).

Для записи каталога bitmap выделения допустимое значение для этого поля равно 1.

Поле TypeImportance 7.1.1.2

Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.2).

Для записи каталога растрового изображения выделения допустимое значение для этого поля равно 0.

7.1.1.3 Поле TypeCategory

Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.3).

7.1.1.4 InUse Field

Поле InUse должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.1.4).

7.1.2 Поле BitmapFlags

Поле BitmapFlags содержит флаги (см. таблицу 21).

таблице 21 BitmapFlags Field Structure

имени поля

смещения

(бит)

размера

(биты)

примечания
BitmapIdentifier 0 1 Это поле является обязательным и раздел 7.1.2.1 определяет его содержимое.
Скрытный 1 7 Это поле является обязательным и его содержимое зарезервировано.
7.1.2.1 Поле BitmapIdentifier

Поле BitmapIdentifier должно указывать, какой растровый рисунок выделения описывает указанную запись каталога. Реализации должны использовать растровое изображение первого выделения в сочетании с первым FAT и использовать второе растровое изображение выделения в сочетании со вторым FAT. Поле ActiveFat описывает, какие растровые изображения FAT и выделения активны.

Допустимые значения этого поля должны быть:

  • 0, что означает, что указанная запись каталога описывает растровое изображение первого выделения
  • 1, что означает, что указанная запись каталога описывает вторую растровую карту выделения и возможна только в том случае, если NumberOfFats содержит значение 2.

7.1.3 Поле FirstCluster

Поле FirstCluster должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.5).

Это поле содержит индекс первого кластера цепочки кластеров, как описываетСЯ FAT, на котором размещена растровая карта выделения.

Поле DataLength 7.1.4

Поле DataCluster должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел раздел 6.3.6).

7.1.5 Растровое изображение выделения

Битовое изображение выделения записывает состояние выделения кластеров в куче кластера. Каждый бит в растровом рисунке выделения указывает, доступен ли соответствующий кластер для выделения.

Растровое изображение выделения представляет кластеры от самого низкого до самого высокого индекса (см. таблице 22). По историческим причинам первый кластер имеет индекс 2.

Замечание

Первый бит в растровом рисунке — это самый низкий порядок первого байта.

таблице 22 Структура растрового изображения выделения

имени поля

смещения

(бит)

размера

(биты)

примечания
BitmapEntry[2] 0 1 Это поле является обязательным, а раздел раздел 7.1.5.1 определяет его содержимое.

.

.

.

.

.

.

.

.

.

.

.

.

BitmapEntry[ClusterCount+1] ClusterCount — 1 1

Это поле является обязательным и раздел 7.1.5.1 определяет его содержимое.

Примечание. Основные и резервные секторы загрузки содержат поле ClusterCount.

Скрытный КоличествоКластеров (DataLength * 8) — ClusterCount

Это поле является обязательным и его содержимое, если таковые имеются, зарезервированы.

Примечание. Основные и резервные секторы загрузки содержат поле ClusterCount.

7.1.5.1 BitmapEntry[2] ... BitmapEntry[ClusterCount+1] Поля

Каждое поле BitmapEntry в этом массиве представляет кластер в куче кластера. BitmapEntry[2] представляет первый кластер в куче кластера и BitmapEntry[ClusterCount+1] представляет последний кластер в куче кластера.

Допустимые значения этих полей должны быть:

  • 0, описывающий соответствующий кластер как доступный для выделения
  • 1, описывающий соответствующий кластер как недоступный для выделения (выделение кластера может уже использовать соответствующий кластер или активный FAT может описать соответствующий кластер как плохой)

7.2 Запись каталога таблиц up-case

Таблица up-case определяет преобразование из нижнего регистра в символы верхнего регистра. Это важно из-за записи каталога имени файла (см. раздел 7.7) с использованием символов Юникода, а файловая система exFAT не учитывает регистр и сохраняет регистр. Таблица up-case существует в куче кластера (см. раздел раздел 7.2.5) и имеет соответствующую запись критического первичного каталога в корневом каталоге (см. таблицу 23). Допустимое число записей каталога таблицы up-case — 1.

Из-за связи между именами таблицы up-case и файлов реализация не должна изменять таблицу up-case, за исключением операций форматирования.

таблице 23 up-case Table DirectoryEntry Structure

имени поля

смещения

(байт)

размера

(байт)

примечания
Тип записи 0 1 Это поле является обязательным и раздел 7.2.1 определяет его содержимое.
Зарезервировано1 1 3 Это поле является обязательным и его содержимое зарезервировано.
TableChecksum 4 4 Это поле является обязательным и раздел 7.2.2 определяет его содержимое.
Зарезервировано2 8 12 Это поле является обязательным и его содержимое зарезервировано.
FirstCluster 20 4 Это поле является обязательным и раздел 7.2.3 определяет его содержимое.
ДлинаДанных двадцать четыре 8 Это поле является обязательным и раздел 7.2.4 определяет его содержимое.

Поле записи 7.2.1

Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел раздел 6.3.1).

Поле TypeCode 7.2.1.1

Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.1).

Для записи каталога таблицы up-case допустимое значение для этого поля равно 2.

Поле TypeImportance 7.2.2.2

Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.2).

Для записи каталога таблицы up-case допустимое значение для этого поля равно 0.

7.2.1.3 Поле TypeCategory

Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.3).

7.2.1.4 InUse Field

Поле InUse должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.1.4).

7.2.2 Поле TableChecksum

Поле TableChecksum содержит контрольную сумму таблицы up-case (описываемой поля FirstCluster и DataLength). Реализации должны проверить, что содержимое этого поля допустимо до использования таблицы up-case.

рис. 3 Вычисление TableChecksum

UInt32 TableChecksum
(
    UCHAR  * Table,    // points to an in-memory copy of the up-case table
    UInt64   DataLength
)
{
    UInt32 Checksum = 0;
    UInt64 Index;

    for (Index = 0; Index < DataLength; Index++)
    {
        Checksum = ((Checksum&1) ? 0x80000000 : 0) + (Checksum>>1) + (UInt32)Table[Index];
    }

    return Checksum;
}

7.2.3 Поле FirstCluster

Поле FirstCluster должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.5).

Это поле содержит индекс первого кластера цепочки кластеров, как описываетСЯ FAT, в котором размещается таблица up-case.

Поле DataLength 7.2.4

Поле DataCluster должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел раздел 6.3.6).

Таблица up-case 7.2.5

Таблица up-case — это ряд сопоставлений символов Юникода. Сопоставление символов состоит из 2-байтового поля с индексом поля в таблице up-case, представляющей символ Юникода, который будет регистрироваться, и 2-байтовое поле, представляющее символ Юникода, регистрируемый в формате Юникода.

Первые 128 символов Юникода имеют обязательные сопоставления (см. таблице 24). Таблица up-case, которая имеет любое другое сопоставление символов для любого из первых 128 символов Юникода является недопустимым.

Реализации, которые поддерживают только символы из обязательного диапазона сопоставления, могут игнорировать сопоставления остальной части таблицы up-case. Такие реализации должны использовать только символы из обязательного диапазона сопоставления при создании или переименовании файлов (с помощью записи каталога имени файла см. разделе 7.7). При вставке существующих имен файлов такие реализации не должны регистрируемые символы из диапазона не обязательного сопоставления, но не должны оставлять их неизменными в результирующем имени файла (это частичное регистрирование). При сравнении имен файлов такие реализации должны рассматривать имена файлов, которые отличаются от имени при сравнении только символами Юникода от диапазона не обязательного сопоставления как эквивалентного. Хотя такие имена файлов являются только потенциально эквивалентными, такие реализации не могут гарантировать, что полное имя файла, регистрируемого в соответствии с именем в сравнении.

таблице 24 Обязательные первые 128 записей таблицы up-case

Индекс таблицы + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7
0000h 0000h 0001h 0002h 0003h 0004h 0005h 0006h 0007h
0008h 0008h 0009h 000Ah 000Bh 000Ch 000Dh 000Eh 000Fh
0010h 0010h 0011h 0012h 0013h 0014h 0015h 0016h 0017h
0018h 0018h 0019h 001Ah 001Bh 001Ch 001Dh 001Eh 001Fh
0020h 0020h 0021h 0022h 0023h 0024h 0025h 0026h 0027h
0028h 0028h 0029h 002Ah 002Bh 002Ch 002Dh 002Eh 002Fh
0030h 0030h 0031h 0032h 0033h 0034h 0035h 0036h 0037h
0038h 0038h 0039h 003Ah 003Bh 003Ch 003Dh 003Eh 003Fh
0040h 0040h 0041h 0042h 0043h 0044h 0045h 0046h 0047h
0048h 0048h 0049h 004Ah 004Bh 004Ch 004Dh 004Eh 004Fh
0050h 0050h 0051h 0052h 0053h 0054h 0055h 0056h 0057h
0058h 0058h 0059h 005Ah 005Bh 005Ch 005Dh 005Eh 005Fh
0060h 0060h 0041h 0042h 0043h 0044h 0045h 0046h 0047h
0068h 0048h 0049h 004Ah 004Bh 004Ch 004Dh 004Eh 004Fh
0070h 0050h 0051h 0052h 0053h 0054h 0055h 0056h 0057h
0078h 0058h 0059h 005Ah 007Bh 007Ch 007Dh 007Eh 007Fh

(Примечание. Записи с сопоставлениями без удостоверений в полужирном шрифте)

При форматировании тома реализация может создать таблицу up-case в сжатом формате с помощью сжатия сопоставления удостоверений, так как большая часть пространства символов Юникода не имеет понятия регистра (это означает, что символы нижнего регистра и "верхний регистр" эквивалентны). Реализации сжимают таблицу up-case, представляющую ряд сопоставлений удостоверений со значением FFFFh, за которым следует число сопоставлений удостоверений.

Например, реализация может представлять первые 100 (64h) сопоставления символов со следующими восемью записями сжатой таблицы регистра:

FFFFh, 0061h, 0041h, 0042h, 0043h

Первые две записи указывают на первые 97 (61h) символов (от 0000h до 0060h) имеют сопоставления удостоверений. Последующие символы, 0061h–0063h, сопоставляется с символами 0041h до 0043h соответственно.

Возможность предоставления сжатой таблицы с регистром при форматировании тома является необязательной. Однако возможность интерпретировать как несжатую, так и сжатую таблицу регистра является обязательной. Значение поля TableChecksum всегда соответствует тому, как в томе существует таблица up-case, которая может находиться в сжатом или несжатом формате.

При форматировании тома реализации должны записывать рекомендуемую таблицу up-case в сжатом формате (см. таблицу 25), для которой значение поля TableChecksum равно E619D30Dh.

Если реализация определяет собственную таблицу up-case( сжатые или несжатые), то эта таблица должна охватывать полный диапазон символов Юникода (от кодов символов до FFFFH включительно).