Спецификация файловой системы 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 Расширяемая таблица выделения файлов
FAT Таблица выделения файлов
FAT12 Таблица выделения файлов, 12-разрядные индексы кластера
FAT16 Таблица выделения файлов, 16-разрядные индексы кластера
FAT32 Таблица выделения файлов, 32-разрядные индексы кластера
GPT таблица разделов GUID.
GUID Глобальный уникальный идентификатор (см . раздел 10.1)
INT Прервать
MBR- основная загрузочная запись (MBR).
texFAT Транзакциобезопасный exFAT
Формат UTC. Время в формате UTC

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

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

  1. Неподписанные

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

  3. Имеют формат с маленьким байтом

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

1.5 Windows CE и TexFAT

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

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

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

Таблица 3. Структура тома

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

Offset

(сектор)

Размер

(секторы)

Комментарии
Основной регион загрузки
Основной загрузочный сектор 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 резервного копирования 21 1 Этот подрегион является обязательным, а его содержимое определяется в разделе 3.3 .
Резервная копия зарезервирована 22 1 Этот подрегион является обязательным, а его содержимое зарезервировано.
Контрольная сумма загрузки резервного копирования 23 1 Этот подрегион является обязательным, а его содержимое определяется в разделе 3.4 .
FAT Region
Выравнивание FAT 24 FatOffset — 24

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

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

Первый FAT FatOffset FatLength

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

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

Second FAT FatOffset + FatLength FatLength * (NumberOfFats – 1)

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

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

Область данных
Выравнивание кучи кластера FatOffset + FatLength * NumberOfFats 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 Основной и Резервный регионы загрузки

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

  1. Загрузочный ремешок компьютерной системы из тома exFAT.

  2. Определите файловую систему на томе как exFAT.

  3. Обнаружение расположения структур файловой системы exFAT.

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

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

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

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

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

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

Таблица 4. Структура сектора основной и резервной загрузки

Имя поля

Offset

(байт)

Размер

(байты)

Комментарии
JumpBoot 0 3 Это поле является обязательным, а его содержимое определяется в разделе 3.1.1 .
FileSystemName 3 8 Это поле является обязательным, а его содержимое определяется в разделе 3.1.2 .
MustBeZero 11 53 Это поле является обязательным, а его содержимое определяется в разделе 3.1.3 .
PartitionOffset 64 8 Это поле является обязательным, а его содержимое определяется в разделе 3.1.4 .
VolumeLength 72 8 Это поле является обязательным, а его содержимое определяется в разделе 3.1.5 .
FatOffset 80 4 Это поле является обязательным, а его содержимое определяется в разделе 3.1.6 .
FatLength 84 4 Это поле является обязательным, а его содержимое определяется в разделе 3.1.7 .
ClusterHeapOffset 88 4 Это поле является обязательным, а его содержимое определяется в разделе 3.1.8 .
ClusterCount 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 .
BytesPerSectorShift 108 1 Это поле является обязательным, а его содержимое определяется в разделе 3.1.14 .
SectorsPerClusterShift 109 1 Это поле является обязательным, а его содержимое определяется в разделе 3.1.15 .
NumberOfFats 110 1 Это поле является обязательным, а его содержимое определяется в разделе 3.1.16 .
ДискВыбор 111 1 Это поле является обязательным, а его содержимое определяется в разделе 3.1.17 .
PercentInUse 112 1 Это поле является обязательным, а его содержимое определяется в разделе 3.1.18 .
Зарезервировано 113 7 Это поле является обязательным и его содержимое зарезервировано.
BootCode 120 390 Это поле является обязательным, а его содержимое определяется в разделе 3.1.19 .
BootSignature 510 2 Это поле является обязательным, а его содержимое определяется в разделе 3.1.20 .
Избыточное пространство 512 2BytesPerSectorShift — 512

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

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

3.1.1. Поле JumpBoot

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

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

3.1.2. Поле fileSystemName

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

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

3.1.3 Поле MustBeZero

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

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

3.1.4. Поле PartitionOffset

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

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

3.1.5 Поле VolumeLength

Поле 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 округляется до ближайшего целого числа, что гарантирует существование FAT до кучи кластера

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

3.1.8. Поле ClusterHeapOffset

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

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

  • По крайней мере FatOffset + FatLength * NumberOfFats, чтобы учесть секторы, которые используют все предыдущие регионы

  • Не более 232- 1 или VolumeLength - (ClusterCount * 2SectorsPerClusterShift), в зависимости от того, какое вычисление меньше

3.1.9. Поле ClusterCount

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

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

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

  • 232-11, то есть максимальное число кластеров, которые может описать FAT.

Значение поля ClusterCount определяет минимальный размер FAT. Чтобы избежать очень больших значений, реализации могут управлять количеством кластеров в куче кластера путем увеличения размера кластера (с помощью поля SectorsPerClusterShift). В этой спецификации рекомендуется не более24–2 кластеров в куче кластеров. Однако реализации должны иметь возможность обрабатывать тома с 2 кластерами32–11 в куче кластеров.

3.1.10 FirstClusterOfRootDirectory Field

Поле FirstClusterOfRootDirectory должно содержать индекс кластера первого кластера корневого каталога. Реализации должны приложить все усилия для размещения первого кластера корневого каталога в первом неисправном кластере после кластеров, которые используются растровым рисунком выделения и таблицей up-case.

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

  • По крайней мере 2 — индекс первого кластера в куче кластера.

  • Максимальное значение ClusterCount + 1 — индекс последнего кластера в куче кластера.

3.1.11 Поле VolumeSerialNumber

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

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

3.1.12 FileSystemRevision Field

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

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

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

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

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

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

3.1.13. Поле VolumeFlags

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

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

Таблица 5 Структура поля VolumeFlags

Имя поля

Offset

(бит)

Размер

(биты)

Комментарии
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 Это поле является обязательным и его содержимое зарезервировано.
3.1.13.1 Поле ActiveFat

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

  • 0, что означает, что точечные карты First FAT и First Allocation являются активными.

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

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

3.1.13.2 Поле VolumeDirty

Поле 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

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

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

  • 0, который не имеет никакого особого значения

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

3.1.14 Поле BytesPerSectorShift

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

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

  • Не менее 9 (размер сектора 512 байт), что является наименьшим возможным сектором для тома exFAT

  • Не более 12 (размер сектора 4096 байт), что является размером страницы памяти процессоров, распространенных на персональных компьютерах

3.1.15 SectorsPerClusterShift Field

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

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

  • По крайней мере 0 (1 сектор на кластер), что является наименьшим возможным кластером

  • Не более 25 — BytesPerSectorShift, который оценивается как размер кластера 32 МБ

3.1.16. Поле NumberOfFats

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

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

  • 1, который указывает, что том содержит только точечный рисунок First FAT и First Allocation Bitmap

  • 2, который указывает, что том содержит первый FAT, второй FAT, первый растровый рисунок выделения и второй растровый рисунок выделения; Это значение допустимо только для томов TexFAT

3.1.17 ДискВыбрать поле

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

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

Поле 3.1.18 PercentInUse

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

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

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

  • Точно FFh, который указывает, что процент выделенных кластеров в куче кластера недоступен

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

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

3.1.19. Поле BootCode

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

3.1.20. Поле bootSignature

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

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

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

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

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

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

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

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

Имя поля

Offset

(байт)

Размер

(байты)

Комментарии
ExtendedBootCode 0 2BytesPerSectorShift – 4

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

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

ExtendedBootSignature 2BytesPerSectorShift – 4 4

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

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

3.2.1. Поле ExtendedBootCode

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

3.2.2. Поле ExtendedBootSignature

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

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

3.3. Основное и резервное копирование параметров OEM Sub-regions

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

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

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

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

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

Таблица 7. Структура параметров OEM

Имя поля

Offset

(байт)

Размер

(байты)

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

.

.

.

.

.

.

.

.

.

.

.

.

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

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

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

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

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

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

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

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

Имя поля

Offset

(байт)

Размер

(байты)

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

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

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

3.3.3. Параметры NULL

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

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

Структура параметров NULL в таблице 9

Имя поля

Offset

(байт)

Размер

(байты)

Комментарии
ParametersGuid 0 16 Это поле является обязательным, а его содержимое определяется в разделе 3.3.3.1 .
Зарезервировано 16 32 Это поле является обязательным и его содержимое зарезервировано.
3.3.3.1 ParametersGuid Field

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

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

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

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

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

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

Имя поля

Offset

(байт)

Размер

(байты)

Комментарии
ParametersGuid 0 16 Это поле является обязательным, а его содержимое определяется в разделе 3.3.4.1 .
EraseBlockSize 16 4 Это поле является обязательным, и его содержимое определяется в разделе 3.3.4.2 .
PageSize 20 4 Это поле является обязательным, а его содержимое определяется в разделе 3.3.4.3 .
SpareSectors 24 4 Это поле является обязательным, а его содержимое определяется в разделе 3.3.4.4 .
RandomAccessTime 28 4 Это поле является обязательным, а его содержимое определяется в разделе 3.3.4.5 .
ProgrammingTime 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 Field

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

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

3.3.4.2 EraseBlockSize Field

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

3.3.4.3 PageSize Field

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

3.3.4.4 Поле "Запасные сепараторы"

Поле SpareSectors должно описывать количество секторов, доступных флэш-носителю для внутренних щадяющих операций.

3.3.4.5 Поле RandomAccessTime

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

3.3.4.6 Поле ProgrammingTime

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

3.3.4.7 ReadCycle Field

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

3.3.4.8 WriteCycle Field

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

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

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

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

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

Рис. 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 описывает, сколько fat содержит этот регион. Допустимые значения для поля NumberOfFats: 1 и 2. Таким образом, подрегион First FAT всегда содержит FAT. Если поле NumberOfFats равно двум, то второй подрегион FAT также содержит FAT.

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

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

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

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

Имя поля

Offset

(байт)

Размер

(байты)

Комментарии
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. Важно отметить, что первый кластер кучи кластера имеет индекс 2, который напрямую соответствует индексу FatEntry[2].

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

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

Имя поля

Offset

(сектор)

Размер

(секторы)

Комментарии
Кластер[2] ClusterHeapOffset 2SectorsPerClusterShift

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

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

.

.

.

.

.

.

.

.

.

.

.

.

Кластер[ClusterCount+1] ClusterHeapOffset + (ClusterCount – 1) * 2SectorsPerClusterShift 2SectorsPerClusterShift

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

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

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

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

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

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

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

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

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

Таблица 13. Структура каталогов

Имя поля

Offset

(байт)

Размер

(байт)

Комментарии
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. Шаблон универсального каталога

Имя поля

Offset

(байт)

Размер

(байт)

Комментарии
EntryType 0 1 Это поле является обязательным, а его содержимое определяется в разделе 6.2.1 .
CustomDefined 1 19 Это поле является обязательным, и структуры, производные от этого шаблона, могут определять его содержимое.
FirstCluster 20 4 Это поле является обязательным, а его содержимое определяется в разделе 6.2.2 .
DataLength 24 8 Это поле является обязательным, а его содержимое определяется в разделе 6.2.3 .

6.2.1. Поле EntryType

Поле 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

Имя поля

Offset

(бит)

Размер

(биты)

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

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

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

6.2.1.2 Поле typeImportance

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

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

  • 0, что означает, что указанная запись каталога является критической (см . раздел 6.3.1.2.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, если выделение кластера несовместимо с производной структурой.

6.2.3. Поле DataLength

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

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

  • Не менее 0; Если поле FirstCluster содержит значение 0, то только допустимое значение этого поля равно 0.

  • Максимум ClusterCount * 2SectorsPerClusterShift* 2BytesPerSectorShift

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

6.3. Универсальный первичный каталогШаблоны

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

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

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

Таблица 16 Универсальный первичный каталогШаблоны

Имя поля

Offset

(байт)

Размер

(байт)

Комментарии
EntryType 0 1 Это поле является обязательным, а его содержимое определяется в разделе 6.3.1 .
SecondaryCount 1 1 Это поле является обязательным, а его содержимое определяется в разделе 6.3.2 .
SetChecksum 2 2 Это поле является обязательным, а его содержимое определяется в разделе 6.3.3 .
GeneralPrimaryFlags 4 2 Это поле является обязательным, а его содержимое определяется в разделе 6.3.4 .
CustomDefined 6 14 Это поле является обязательным, и его содержимое определяется структурами, производными от этого шаблона.
FirstCluster 20 4 Это поле является обязательным, а его содержимое определяется в разделе 6.3.5 .
DataLength 24 8 Это поле является обязательным, и его содержимое определяется в разделе 6.3.6 .

6.3.1. Поле EntryType

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

6.3.1.1 Поле TypeCode

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

6.3.1.2 Поле typeImportance

Поле 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.

6.3.3. Поле SetChecksum

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

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

Рис. 2 EntrySetChecksum Computation

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 Field

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

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

Таблица 17. Общая структура поляPrimaryFlags

Имя поля

Offset

(бит)

Размер

(биты)

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

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

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

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

  • 1, что означает, что возможно связанное выделение кластеров и поля FirstCluster и DataLength определены

6.3.4.2 Поле NoFatChain

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

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

  • 0, что означает, что соответствующие записи FAT для цепочки кластеров выделения являются допустимыми, и реализации должны интерпретировать их; Если поле AllocationPossible содержит значение 0 или поле AllocationPossible содержит значение 1, а поле FirstCluster содержит значение 0, то только допустимое значение этого поля равно 0.

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

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

6.3.5 FirstCluster Field

Поле 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 является обязательной.

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

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

Таблица 18. Универсальный вторичный каталог Шаблон

Имя поля

Offset

(байт)

Размер

(байт)

Комментарии
EntryType 0 1 Это поле является обязательным, а его содержимое определяет раздел 6.4.1 .
GeneralSecondaryFlags 1 1 Это поле является обязательным, а его содержимое определяется в разделе 6.4.2 .
CustomDefined 2 18 Это поле является обязательным, и структуры, производные от этого шаблона, определяют его содержимое.
FirstCluster 20 4 Это поле является обязательным, а его содержимое определяется в разделе 6.4.3 .
DataLength 24 8 Это поле является обязательным, а его содержимое определяется в разделе 6.4.4 .

6.4.1. Поле EntryType

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

6.4.1.1 Поле TypeCode

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

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 Field

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

Таблица 19. Структура поля Generic GeneralSecondaryFlags

Имя поля

Offset

(бит)

Размер

(биты)

Комментарии
AllocationPossible 0 1 Это поле является обязательным, а его содержимое определяется в разделе 6.4.2.1 .
NoFatChain 1 1 Это поле является обязательным, а его содержимое определяется в разделе 6.4.2.2 .
CustomDefined 2 6 Это поле является обязательным, и его могут определять структуры, производные от этого шаблона.
6.4.2.1 AllocationPossible Field

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

6.4.2.2 Поле NoFatChain

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

6.4.3. Поле FirstCluster

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

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

6.4.4. Поле DataLength

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

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

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

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

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

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

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

Таблица 20. Каталог растрового рисунка выделенияСхемая структура

Имя поля

Offset

(байт)

Размер

(байт)

Комментарии
EntryType 0 1 Это поле является обязательным, а его содержимое определяется в разделе 7.1.1 .
BitmapFlags 1 1 Это поле является обязательным, а его содержимое определяется в разделе 7.1.2 .
Зарезервировано 2 18 Это поле является обязательным и его содержимое зарезервировано.
FirstCluster 20 4 Это поле является обязательным, а его содержимое определяется в разделе 7.1.3 .
DataLength 24 8 Это поле является обязательным, а его содержимое определяется в разделе 7.1.4 .

7.1.1. Поле EntryType

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

7.1.1.1.1 Поле TypeCode

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

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

7.1.1.2 Поле typeImportance

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

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

7.1.1.3 Поле TypeCategory

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

7.1.1.4 InUse Field

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

7.1.2. BitmapFlags Field

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

Таблица 21. Структура поля BitmapFlags

Имя поля

Offset

(бит)

Размер

(биты)

Комментарии
BitmapIdentifier 0 1 Это поле является обязательным, и его содержимое определяется в разделе 7.1.2.1 .
Зарезервировано 1 7 Это поле является обязательным и его содержимое зарезервировано.
7.1.2.1 BitmapIdentifier Field

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

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

  • 0, что означает, что указанная запись каталога описывает точечного рисунка первого выделения.

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

7.1.3. Поле FirstCluster

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

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

7.1.4. Поле DataLength

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

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

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

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

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

Имя поля

Offset

(бит)

Размер

(биты)

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

.

.

.

.

.

.

.

.

.

.

.

.

BitmapEntry[ClusterCount+1] ClusterCount — 1 1

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

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

Зарезервировано ClusterCount (DataLength * 8) — ClusterCount

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

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

7.1.5.1 BitmapEntry[2] ... BitmapEntry[ClusterCount+1] Fields

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

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

  • 0, описывающий соответствующий кластер как доступный для выделения.

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

7.2. Вход в каталог таблицы в верхнем регистре

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

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

Таблица 23. Структура каталогов таблиц с учетом регистра

Имя поля

Offset

(байт)

Размер

(байт)

Комментарии
EntryType 0 1 Это поле является обязательным, а его содержимое определяется в разделе 7.2.1 .
Reserved1 1 3 Это поле является обязательным и его содержимое зарезервировано.
TableChecksum 4 4 Это поле является обязательным, а его содержимое определяется в разделе 7.2.2 .
Reserved2 8 12 Это поле является обязательным и его содержимое зарезервировано.
FirstCluster 20 4 Это поле является обязательным, а его содержимое определяется в разделе 7.2.3 .
DataLength 24 8 Это поле является обязательным, а его содержимое определяется в разделе 7.2.4 .

7.2.1. Поле EntryType

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

7.2.1.1 Поле TypeCode

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

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

7.2.1.2 Поле typeImportance

Поле 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 ТаблицаПроверка вычислений

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 Field

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

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

7.2.4. Поле DataLength

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

7.2.5. Таблица с регистром

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

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

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

Таблица 24 Обязательные первые 128 записей таблицы с регистром

Индекс таблицы + 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

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

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

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

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

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

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

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

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