Спецификация файловой системы exFAT
1. Введение
Файловая система exFAT является преемником FAT32 в семействе файловых систем FAT. Эта спецификация описывает файловую систему exFAT и предоставляет все сведения, необходимые для реализации файловой системы exFAT.
1.1. Цели проектирования
Файловая система exFAT имеет три центральные цели проектирования (см. список ниже).
Сохраняйте простоту файловых систем на основе FAT.
Двумя преимуществами файловых систем на основе FAT являются их относительная простота и простота реализации. В духе своих предшественников, разработчики должны найти exFAT относительно простым и простым в реализации.
Включите очень большие файлы и устройства хранения.
Файловая система exFAT использует 64 бита для описания размера файла, что позволяет приложениям, зависящим от очень больших файлов. Файловая система exFAT также позволяет использовать кластеры размером до 32 МБ, что позволяет эффективно использовать очень большие запоминающие устройства.
Внедрение расширяемости для будущих инноваций.
Файловая система exFAT включает в свою структуру расширяемость, позволяя файловой системе идти в ногу с инновациями в хранилище и изменениями в использовании.
1.2 Конкретная терминология
В контексте этой спецификации некоторые термины (см . таблицу 1) имеют конкретное значение для проектирования и реализации файловой системы exFAT.
Таблица 1. Определение терминов, которые имеют весьма конкретное значение
Термин | Определение |
---|---|
Должны | В этой спецификации термин "должен" используется для описания поведения, которое является обязательным. |
Обычное значение | В этой спецификации термин "должен" используется для описания поведения, которое настоятельно рекомендуется, но не является обязательным. |
Май | В этой спецификации термин "может" используется для описания поведения, которое является необязательным. |
Обязательный | Этот термин описывает поле или структуру, которые реализация должна изменить и должна интерпретироваться так, как описано в этой спецификации. |
Необязательно | Этот термин описывает поле или структуру, которые реализация может поддерживать или не поддерживать. Если реализация поддерживает данное необязательное поле или структуру, она должна изменить и интерпретировать поле или структуру так, как описано в этой спецификации. |
Не определено. | Этот термин описывает содержимое поля или структуры, которое реализация может изменить по мере необходимости (т. е. очистить до нуля при задании окружающих полей или структур), и не должно интерпретироваться, чтобы иметь какое-либо конкретное значение. |
Зарезервировано | Этот термин описывает содержимое поля или структуры, реализации которых:
|
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 Квалификаторы полей и структур по умолчанию
Поля и структуры в этой спецификации имеют следующие квалификаторы (см. список ниже), если в спецификации не указано иное.
Неподписанные
Используйте десятичную нотацию для описания значений, где не указано иное; В этой спецификации используется буква "h" после исправления для обозначения шестнадцатеричных чисел и заключает идентификаторы GUID в фигурные скобки
Имеют формат с маленьким байтом
Не требуется завершающий символ 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 предоставляет все необходимые инструкции по обвязке при загрузке, сведения об идентификации и параметры файловой системы, чтобы реализация могла выполнять следующие действия:
Загрузочный ремешок компьютерной системы из тома exFAT.
Определите файловую систему на томе как exFAT.
Обнаружение расположения структур файловой системы 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, реализации, которые сканируют весь том на наличие сбоев мультимедиа и записывают все сбои как "плохие" кластеры в 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)
Таблица с регистрами (раздел 7.2)
Метка тома (раздел 7.3)
Файл (раздел 7.4)
Доброкачественный первичный
GUID тома (раздел 7.5)
Заполнение TexFAT (раздел 7.10)
Критический вторичный
Расширение Stream (раздел 7.6)
Имя файла (раздел 7.7)
Доброкачественный вторичный
Расширение vendor (раздел 7.8)
Распределение поставщиков (раздел 7.9)
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 всегда соответствует тому, как существует таблица с регистром в томе, который может иметь сжатый или несжатый формат.
7.2.5.1 Рекомендуемая таблица вариантов
При форматировании тома реализации должны записывать рекомендуемую таблицу с регистром в сжатом формате (см . таблицу 25), для которой значение поля TableChecksum равно E619D30Dh.
Если реализация определяет собственную таблицу с регистром, либо сжатую, то эта таблица должна охватывать полный диапазон символов Юникода (от кодов символов 0000h до FFFFh включительно).
Таблица 25. Рекомендуемая таблица в сжатом формате
Необработанное смещение | + 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 |
0080h | 0080h | 0081h | 0082h | 0083h | 0084h | 0085h | 0086h | 0087h |
0088h | 0088h | 0089h | 008Ah | 008Bh | 008Ch | 008Dh | 008Eh | 008Fh |
0090h | 0090h | 0091h | 0092h | 0093h | 0094h | 0095h | 0096h | 0097h |
0098h | 0098h | 0099h | 009Ah | 009Bh | 009Ch | 009Dh | 009Eh | 009Fh |
00A0h | 00A0h | 00A1h | 00A2h | 00A3h | 00A4h | 00A5h | 00A6h | 00A7h |
00A8h | 00A8h | 00A9h | 00AAh | 00ABh | 00ACh | 00ADh | 00AEh | 00AFh |
00B0h | 00B0h | 00B1h | 00B2h | 00B3h | 00B4h | 00B5h | 00B6h | 00B7h |
00B8h | 00B8h | 00B9h | 00BAh | 00BBh | 00BCh | 00BDh | 00BEh | 00BFh |
00C0h | 00C0h | 00C1h | 00C2h | 00C3h | 00C4h | 00C5h | 00C6h | 00C7h |
00C8h | 00C8h | 00C9h | 00CAh | 00CBh | 00CCh | 00CDh | 00CEh | 00CFh |
00D0h | 00D0h | 00D1h | 00D2h | 00D3h | 00D4h | 00D5h | 00D6h | 00D7h |
00D8h | 00D8h | 00D9h | 00DAh | 00DBh | 00DCh | 00DDh | 00DEh | 00DFh |
00E0h | 00C0h | 00C1h | 00C2h | 00C3h | 00C4h | 00C5h | 00C6h | 00C7h |
00E8h | 00C8h | 00C9h | 00CAh | 00CBh | 00CCh | 00CDh | 00CEh | 00CFh |
00F0h | 00D0h | 00D1h | 00D2h | 00D3h | 00D4h | 00D5h | 00D6h | 00F7h |
00F8h | 00D8h | 00D9h | 00DAh | 00DBh | 00DCh | 00DDh | 00DEh | 0178h |
0100h | 0100h | 0100h | 0102h | 0102h | 0104h | 0104h | 0106h | 0106h |
0108h | 0108h | 0108h | 010Ah | 010Ah | 010Ch | 010Ch | 010Eh | 010Eh |
0110h | 0110h | 0110h | 0112h | 0112h | 0114h | 0114h | 0116h | 0116h |
0118h | 0118h | 0118h | 011Ah | 011Ah | 011Ch | 011Ch | 011Eh | 011Eh |
0120h | 0120h | 0120h | 0122h | 0122h | 0124h | 0124h | 0126h | 0126h |
0128h | 0128h | 0128h | 012Ah | 012Ah | 012Ch | 012Ch | 012Eh | 012Eh |
0130h | 0130h | 0131h | 0132h | 0132h | 0134h | 0134h | 0136h | 0136h |
0138h | 0138h | 0139h | 0139h | 013Bh | 013Bh | 013Dh | 013Dh | 013Fh |
0140h | 013Fh | 0141h | 0141h | 0143h | 0143h | 0145h | 0145h | 0147h |
0148h | 0147h | 0149h | 014Ah | 014Ah | 014Ch | 014Ch | 014Eh | 014Eh |
0150h | 0150h | 0150h | 0152h | 0152h | 0154h | 0154h | 0156h | 0156h |
0158h | 0158h | 0158h | 015Ah | 015Ah | 015Ch | 015Ch | 015Eh | 015Eh |
0160h | 0160h | 0160h | 0162h | 0162h | 0164h | 0164h | 0166h | 0166h |
0168h | 0168h | 0168h | 016Ah | 016Ah | 016Ch | 016Ch | 016Eh | 016Eh |
0170h | 0170h | 0170h | 0172h | 0172h | 0174h | 0174h | 0176h | 0176h |
0178h | 0178h | 0179h | 0179h | 017Bh | 017Bh | 017Dh | 017Dh | 017Fh |
0180h | 0243h | 0181h | 0182h | 0182h | 0184h | 0184h | 0186h | 0187h |
0188h | 0187h | 0189h | 018Ah | 018Bh | 018Bh | 018Dh | 018Eh | 018Fh |
0190h | 0190h | 0191h | 0191h | 0193h | 0194h | 01F6h | 0196h | 0197h |
0198h | 0198h | 0198h | 023Dh | 019Bh | 019Ch | 019Dh | 0220h | 019Fh |
01A0h | 01A0h | 01A0h | 01A2h | 01A2h | 01A4h | 01A4h | 01A6h | 01A7h |
01A8h | 01A7h | 01A9h | 01AAh | 01ABh | 01ACh | 01ACh | 01AEh | 01AFh |
01B0h | 01AFh | 01B1h | 01B2h | 01B3h | 01B3h | 01B5h | 01B5h | 01B7h |
01B8h | 01B8h | 01B8h | 01BAh | 01BBh | 01БЧ | 01БЧ | 01BEh | 01F7h |
01C0h | 01C0h | 01C1h | 01C2h | 01C3h | 01C4h | 01C5h | 01C4h | 01C7h |
01C8h | 01C8h | 01C7h | 01CAh | 01CBh | 01CAh | 01CDh | 01CDh | 01CFh |
01D0h | 01CFh | 01D1h | 01D1h | 01D3h | 01D3h | 01D5h | 01D5h | 01D7h |
01D8h | 01D7h | 01D9h | 01D9h | 01DBh | 01DBh | 018Eh | 01DEh | 01DEh |
01E0h | 01E0h | 01E0h | 01E2h | 01E2h | 01E4h | 01E4h | 01E6h | 01E6h |
01E8h | 01E8h | 01E8h | 01EAh | 01EAh | 01ECh | 01ECh | 01EEh | 01EEh |
01F0h | 01F0h | 01F1h | 01F2h | 01F1h | 01F4h | 01F4h | 01F6h | 01F7h |
01F8h | 01F8h | 01F8h | 01FAh | 01FAh | 01FCh | 01FCh | 01FEh | 01FEh |
0200h | 0200h | 0200h | 0202h | 0202h | 0204h | 0204h | 0206h | 0206h |
0208h | 0208h | 0208h | 020Ah | 020Ah | 020Ch | 020Ch | 020Eh | 020Eh |
0210h | 0210h | 0210h | 0212h | 0212h | 0214h | 0214h | 0216h | 0216h |
0218h | 0218h | 0218h | 021Ah | 021Ah | 021Ch | 021Ch | 021Eh | 021Eh |
0220h | 0220h | 0221h | 0222h | 0222h | 0224h | 0224h | 0226h | 0226h |
0228h | 0228h | 0228h | 022Ah | 022Ah | 022Ch | 022Ch | 022Eh | 022Eh |
0230h | 0230h | 0230h | 0232h | 0232h | 0234h | 0235h | 0236h | 0237h |
0238h | 0238h | 0239h | 2C65h | 023Bh | 023Bh | 023Dh | 2C66h | 023Fh |
0240h | 0240h | 0241h | 0241h | 0243h | 0244h | 0245h | 0246h | 0246h |
0248h | 0248h | 0248h | 024Ah | 024Ah | 024Ch | 024Ch | 024Eh | 024Eh |
0250h | 0250h | 0251h | 0252h | 0181h | 0186h | 0255h | 0189h | 018Ah |
0258h | 0258h | 018Fh | 025Ah | 0190h | 025Ch | 025Dh | 025Eh | 025Fh |
0260h | 0193h | 0261h | 0262h | 0194h | 0264h | 0265h | 0266h | 0267h |
0268h | 0197h | 0196h | 026Ah | 2C62h | 026ch | 026Dh | 026Eh | 019Ch |
0270h | 0270h | 0271h | 019Dh | 0273h | 0274h | 019Fh | 0276h | 0277h |
0278h | 0278h | 0279h | 027Ah | 027Bh | 027ch | 2C64h | 027Eh | 027Fh |
0280h | 01A6h | 0281h | 0282h | 01A9h | 0284h | 0285h | 0286h | 0287h |
0288h | 01AEh | 0244h | 01B1h | 01B2h | 0245h | 028Dh | 028Eh | 028Fh |
0290h | 0290h | 0291h | 01B7h | 0293h | 0294h | 0295h | 0296h | 0297h |
0298h | 0298h | 0299h | 029Ah | 029Bh | 029ch | 029Dh | 029Eh | 029Fh |
02A0h | 02A0h | 02A1h | 02A2h | 02A3h | 02A4h | 02A5h | 02A6h | 02A7h |
02A8h | 02A8h | 02A9h | 02AAh | 02ABh | 02ACh | 02ADh | 02AEh | 02AFh |
02B0h | 02B0h | 02B1h | 02B2h | 02B3h | 02B4h | 02B5h | 02B6h | 02B7h |
02B8h | 02B8h | 02B9h | 02Б/с | 02BBh | 02БЧ | 02BDh | 02BEh | 02BFh |
02C0h | 02C0h | 02C1h | 02C2h | 02C3h | 02C4h | 02C5h | 02C6h | 02C7h |
02C8h | 02C8h | 02C9h | 02CAh | 02CBh | 02CCh | 02CDh | 02CEh | 02CFh |
02D0h | 02D0h | 02D1h | 02D2h | 02D3h | 02D4h | 02D5h | 02D6h | 02D7h |
02D8h | 02D8h | 02D9h | 02DAh | 02DBh | 02DCh | 02DDh | 02DEh | 02DFh |
02E0h | 02E0h | 02E1h | 02E2h | 02E3h | 02E4h | 02E5h | 02E6h | 02E7h |
02E8h | 02E8h | 02E9h | 02EAh | 02EBh | 02ECh | 02EDh | 02EEh | 02EFh |
02F0h | 02F0h | 02F1h | 02F2h | 02F3h | 02F4h | 02F5h | 02F6h | 02F7h |
02F8h | 02F8h | 02F9h | 02FAh | 02FBh | 02FCh | 02FDh | 02FEh | 02FFh |
0300h | 0300h | 0301h | 0302h | 0303h | 0304h | 0305h | 0306h | 0307h |
0308h | 0308h | 0309h | 030Ah | 030Bh | 030Ch | 030Dh | 030Eh | 030Fh |
0310h | 0310h | 0311h | 0312h | 0313h | 0314h | 0315h | 0316h | 0317h |
0318h | 0318h | 0319h | 031Ah | 031Bh | 031Ch | 031Dh | 031Eh | 031Fh |
0320h | 0320h | 0321h | 0322h | 0323h | 0324h | 0325h | 0326h | 0327h |
0328h | 0328h | 0329h | 032Ah | 032Bh | 032Ch | 032Dh | 032Eh | 032Fh |
0330h | 0330h | 0331h | 0332h | 0333h | 0334h | 0335h | 0336h | 0337h |
0338h | 0338h | 0339h | 033Ah | 033Bh | 033Ch | 033Dh | 033Eh | 033Fh |
0340h | 0340h | 0341h | 0342h | 0343h | 0344h | 0345h | 0346h | 0347h |
0348h | 0348h | 0349h | 034Ah | 034Bh | 034Ch | 034Dh | 034Eh | 034Fh |
0350h | 0350h | 0351h | 0352h | 0353h | 0354h | 0355h | 0356h | 0357h |
0358h | 0358h | 0359h | 035Ah | 035Bh | 035Ch | 035Dh | 035Eh | 035Fh |
0360h | 0360h | 0361h | 0362h | 0363h | 0364h | 0365h | 0366h | 0367h |
0368h | 0368h | 0369h | 036Ah | 036Bh | 036ch | 036Dh | 036Eh | 036Fh |
0370h | 0370h | 0371h | 0372h | 0373h | 0374h | 0375h | 0376h | 0377h |
0378h | 0378h | 0379h | 037Ah | 03FDh | 03FEh | 03FFh | 037Eh | 037Fh |
0380h | 0380h | 0381h | 0382h | 0383h | 0384h | 0385h | 0386h | 0387h |
0388h | 0388h | 0389h | 038Ah | 038Bh | 038Ch | 038Dh | 038Eh | 038Fh |
0390h | 0390h | 0391h | 0392h | 0393h | 0394h | 0395h | 0396h | 0397h |
0398h | 0398h | 0399h | 039Ah | 039Bh | 039Ch | 039Dh | 039Eh | 039Fh |
03A0h | 03A0h | 03A1h | 03A2h | 03A3h | 03A4h | 03A5h | 03A6h | 03A7h |
03A8h | 03A8h | 03A9h | 03AAh | 03ABh | 0386h | 0388h | 0389h | 038Ah |
03B0h | 03B0h | 0391h | 0392h | 0393h | 0394h | 0395h | 0396h | 0397h |
03B8h | 0398h | 0399h | 039Ah | 039Bh | 039Ch | 039Dh | 039Eh | 039Fh |
03C0h | 03A0h | 03A1h | 03A3h | 03A3h | 03A4h | 03A5h | 03A6h | 03A7h |
03C8h | 03A8h | 03A9h | 03AAh | 03ABh | 038Ch | 038Eh | 038Fh | 03CFh |
03D0h | 03D0h | 03D1h | 03D2h | 03D3h | 03D4h | 03D5h | 03D6h | 03D7h |
03D8h | 03D8h | 03D8h | 03DAh | 03DAh | 03DCh | 03DCh | 03DEh | 03DEh |
03E0h | 03E0h | 03E0h | 03E2h | 03E2h | 03E4h | 03E4h | 03E6h | 03E6h |
03E8h | 03E8h | 03E8h | 03EAh | 03EAh | 03ECh | 03ECh | 03EEh | 03EEh |
03F0h | 03F0h | 03F1h | 03F9h | 03F3h | 03F4h | 03F5h | 03F6h | 03F7h |
03F8h | 03F7h | 03F9h | 03FAh | 03FAh | 03FCh | 03FDh | 03FEh | 03FFh |
0400h | 0400h | 0401h | 0402h | 0403h | 0404h | 0405h | 0406h | 0407h |
0408h | 0408h | 0409h | 040Ah | 040Bh | 040Ch | 040Dh | 040Eh | 040Fh |
0410h | 0410h | 0411h | 0412h | 0413h | 0414h | 0415h | 0416h | 0417h |
0418h | 0418h | 0419h | 041Ah | 041Bh | 041Ch | 041Dh | 041Eh | 041Fh |
0420h | 0420h | 0421h | 0422h | 0423h | 0424h | 0425h | 0426h | 0427h |
0428h | 0428h | 0429h | 042Ah | 042Bh | 042Ch | 042Dh | 042Eh | 042Fh |
0430h | 0410h | 0411h | 0412h | 0413h | 0414h | 0415h | 0416h | 0417h |
0438h | 0418h | 0419h | 041Ah | 041Bh | 041Ch | 041Dh | 041Eh | 041Fh |
0440h | 0420h | 0421h | 0422h | 0423h | 0424h | 0425h | 0426h | 0427h |
0448h | 0428h | 0429h | 042Ah | 042Bh | 042Ch | 042Dh | 042Eh | 042Fh |
0450h | 0400h | 0401h | 0402h | 0403h | 0404h | 0405h | 0406h | 0407h |
0458h | 0408h | 0409h | 040Ah | 040Bh | 040Ch | 040Dh | 040Eh | 040Fh |
0460h | 0460h | 0460h | 0462h | 0462h | 0464h | 0464h | 0466h | 0466h |
0468h | 0468h | 0468h | 046Ah | 046Ah | 046Ch | 046Ch | 046Eh | 046Eh |
0470h | 0470h | 0470h | 0472h | 0472h | 0474h | 0474h | 0476h | 0476h |
0478h | 0478h | 0478h | 047Ah | 047Ah | 047Ch | 047Ch | 047Eh | 047Eh |
0480h | 0480h | 0480h | 0482h | 0483h | 0484h | 0485h | 0486h | 0487h |
0488h | 0488h | 0489h | 048Ah | 048Ah | 048Ch | 048Ch | 048Eh | 048Eh |
0490h | 0490h | 0490h | 0492h | 0492h | 0494h | 0494h | 0496h | 0496h |
0498h | 0498h | 0498h | 049Ah | 049Ah | 049Ch | 049Ch | 049Eh | 049Eh |
04A0h | 04A0h | 04A0h | 04A2h | 04A2h | 04A4h | 04A4h | 04A6h | 04A6h |
04A8h | 04A8h | 04A8h | 04AAh | 04AAh | 04ACh | 04ACh | 04AEh | 04AEh |
04B0h | 04B0h | 04B0h | 04B2h | 04B2h | 04B4h | 04B4h | 04B6h | 04B6h |
04B8h | 04B8h | 04B8h | 04BAh | 04BAh | 04BCh | 04BCh | 04BEh | 04BEh |
04C0h | 04C0h | 04C1h | 04C1h | 04C3h | 04C3h | 04C5h | 04C5h | 04C7h |
04C8h | 04C7h | 04C9h | 04C9h | 04CBh | 04CBh | 04CDh | 04CDh | 04C0h |
04D0h | 04D0h | 04D0h | 04D2h | 04D2h | 04D4h | 04D4h | 04D6h | 04D6h |
04D8h | 04D8h | 04D8h | 04DAh | 04DAh | 04DCh | 04DCh | 04DEh | 04DEh |
04E0h | 04E0h | 04E0h | 04E2h | 04E2h | 04E4h | 04E4h | 04E6h | 04E6h |
04E8h | 04E8h | 04E8h | 04EAh | 04EAh | 04ECh | 04ECh | 04EEh | 04EEh |
04F0h | 04F0h | 04F0h | 04F2h | 04F2h | 04F4h | 04F4h | 04F6h | 04F6h |
04F8h | 04F8h | 04F8h | 04FAh | 04FAh | 04FCh | 04FCh | 04FEh | 04FEh |
0500h | 0500h | 0500h | 0502h | 0502h | 0504h | 0504h | 0506h | 0506h |
0508h | 0508h | 0508h | 050Ah | 050Ah | 050Ch | 050Ch | 050Eh | 050Eh |
0510h | 0510h | 0510h | 0512h | 0512h | 0514h | 0515h | 0516h | 0517h |
0518h | 0518h | 0519h | 051Ah | 051Bh | 051Ch | 051Dh | 051Eh | 051Fh |
0520h | 0520h | 0521h | 0522h | 0523h | 0524h | 0525h | 0526h | 0527h |
0528h | 0528h | 0529h | 052Ah | 052Bh | 052Ch | 052Dh | 052Eh | 052Fh |
0530h | 0530h | 0531h | 0532h | 0533h | 0534h | 0535h | 0536h | 0537h |
0538h | 0538h | 0539h | 053Ah | 053Bh | 053Ch | 053Dh | 053Eh | 053Fh |
0540h | 0540h | 0541h | 0542h | 0543h | 0544h | 0545h | 0546h | 0547h |
0548h | 0548h | 0549h | 054Ah | 054Bh | 054Ch | 054Dh | 054Eh | 054Fh |
0550h | 0550h | 0551h | 0552h | 0553h | 0554h | 0555h | 0556h | 0557h |
0558h | 0558h | 0559h | 055Ah | 055Bh | 055ch | 055Dh | 055Eh | 055Fh |
0560h | 0560h | 0531h | 0532h | 0533h | 0534h | 0535h | 0536h | 0537h |
0568h | 0538h | 0539h | 053Ah | 053Bh | 053Ch | 053Dh | 053Eh | 053Fh |
0570h | 0540h | 0541h | 0542h | 0543h | 0544h | 0545h | 0546h | 0547h |
0578h | 0548h | 0549h | 054Ah | 054Bh | 054Ch | 054Dh | 054Eh | 054Fh |
0580h | 0550h | 0551h | 0552h | 0553h | 0554h | 0555h | 0556h | FFFFh |
0588h | 17F6h | 2C63h | 1D7Eh | 1D7Fh | 1D80h | 1D81h | 1D82h | 1D83h |
0590h | 1D84h | 1D85h | 1D86h | 1D87h | 1D88h | 1D89h | 1D8Ah | 1D8Bh |
0598h | 1D8Ch | 1D8Dh | 1D8Eh | 1D8Fh | 1D90h | 1D91h | 1D92h | 1D93h |
05A0h | 1D94h | 1D95h | 1D96h | 1D97h | 1D98h | 1D99h | 1D9Ah | 1D9Bh |
05A8h | 1D9Ch | 1D9Dh | 1D9Eh | 1D9Fh | 1DA0h | 1DA1h | 1DA2h | 1DA3h |
05B0h | 1DA4h | 1DA5h | 1DA6h | 1DA7h | 1DA8h | 1DA9h | 1DAAh | 1DABh |
05B8h | 1DACh | 1DADh | 1DAEh | 1DAFh | 1DB0h | 1DB1h | 1DB2h | 1DB3h |
05C0h | 1DB4h | 1DB5h | 1DB6h | 1DB7h | 1DB8h | 1DB9h | 1DBAh | 1DBBh |
05C8h | 1DBCh | 1DBDh | 1DBEh | 1DBFh | 1DC0h | 1DC1h | 1DC2h | 1DC3h |
05D0h | 1DC4h | 1DC5h | 1DC6h | 1DC7h | 1DC8h | 1DC9h | 1DCAh | 1DCBh |
05D8h | 1DCCh | 1DCDh | 1DCEh | 1DCFh | 1DD0h | 1DD1h | 1DD2h | 1DD3h |
05E0h | 1DD4h | 1DD5h | 1DD6h | 1DD7h | 1DD8h | 1DD9h | 1DDAh | 1DDBh |
05E8h | 1DDCh | 1DDDh | 1DDEh | 1DDFh | 1DE0h | 1DE1h | 1DE2h | 1DE3h |
05F0h | 1DE4h | 1DE5h | 1DE6h | 1DE7h | 1DE8h | 1DE9h | 1DEAh | 1DEBh |
05F8h | 1DECh | 1DEDh | 1DEEh | 1DEFh | 1DF0h | 1DF1h | 1DF2h | 1DF3h |
0600h | 1DF4h | 1DF5h | 1DF6h | 1DF7h | 1DF8h | 1DF9h | 1DFAh | 1DFBh |
0608h | 1DFCh | 1DFDh | 1DFEh | 1DFFh | 1E00h | 1E00h | 1E02h | 1E02h |
0610h | 1E04h | 1E04h | 1E06h | 1E06h | 1E08h | 1E08h | 1E0Ah | 1E0Ah |
0618h | 1E0Ch | 1E0Ch | 1E0Eh | 1E0Eh | 1E10h | 1E10h | 1E12h | 1E12h |
0620h | 1E14h | 1E14h | 1E16h | 1E16h | 1E18h | 1E18h | 1E1Ah | 1E1Ah |
0628h | 1E1Ch | 1E1Ch | 1E1Eh | 1E1Eh | 1E20h | 1E20h | 1E22h | 1E22h |
0630h | 1E24h | 1E24h | 1E26h | 1E26h | 1E28h | 1E28h | 1E2Ah | 1E2Ah |
0638h | 1E2Ch | 1E2Ch | 1E2Eh | 1E2Eh | 1E30h | 1E30h | 1E32h | 1E32h |
0640h | 1E34h | 1E34h | 1E36h | 1E36h | 1E38h | 1E38h | 1E3Ah | 1E3Ah |
0648h | 1E3Ch | 1E3Ch | 1E3Eh | 1E3Eh | 1E40h | 1E40h | 1E42h | 1E42h |
0650h | 1E44h | 1E44h | 1E46h | 1E46h | 1E48h | 1E48h | 1E4Ah | 1E4Ah |
0658h | 1E4Ch | 1E4Ch | 1E4Eh | 1E4Eh | 1E50h | 1E50h | 1E52h | 1E52h |
0660h | 1E54h | 1E54h | 1E56h | 1E56h | 1E58h | 1E58h | 1E5Ah | 1E5Ah |
0668h | 1E5Ch | 1E5Ch | 1E5Eh | 1E5Eh | 1E60h | 1E60h | 1E62h | 1E62h |
0670h | 1E64h | 1E64h | 1E66h | 1E66h | 1E68h | 1E68h | 1E6Ah | 1E6Ah |
0678h | 1E6Ch | 1E6Ch | 1E6Eh | 1E6Eh | 1E70h | 1E70h | 1E72h | 1E72h |
0680h | 1E74h | 1E74h | 1E76h | 1E76h | 1E78h | 1E78h | 1E7Ah | 1E7Ah |
0688h | 1E7Ch | 1E7Ch | 1E7Eh | 1E7Eh | 1E80h | 1E80h | 1E82h | 1E82h |
0690h | 1E84h | 1E84h | 1E86h | 1E86h | 1E88h | 1E88h | 1E8Ah | 1E8Ah |
0698h | 1E8Ch | 1E8Ch | 1E8Eh | 1E8Eh | 1E90h | 1E90h | 1E92h | 1E92h |
06A0h | 1E94h | 1E94h | 1E96h | 1E97h | 1E98h | 1E99h | 1E9Ah | 1E9Bh |
06A8h | 1E9Ch | 1E9Dh | 1E9Eh | 1E9Fh | 1EA0h | 1EA0h | 1EA2h | 1EA2h |
06B0h | 1EA4h | 1EA4h | 1EA6h | 1EA6h | 1EA8h | 1EA8h | 1EAAh | 1EAAh |
06B8h | 1EACh | 1EACh | 1EAEh | 1EAEh | 1EB0h | 1EB0h | 1EB2h | 1EB2h |
06C0h | 1EB4h | 1EB4h | 1EB6h | 1EB6h | 1EB8h | 1EB8h | 1EBAh | 1EBAh |
06C8h | 1EBCh | 1EBCh | 1EBEh | 1EBEh | 1EC0h | 1EC0h | 1EC2h | 1EC2h |
06D0h | 1EC4h | 1EC4h | 1EC6h | 1EC6h | 1EC8h | 1EC8h | 1ECAh | 1ECAh |
06D8h | 1ECCh | 1ECCh | 1ECEh | 1ECEh | 1ED0h | 1ED0h | 1ED2h | 1ED2h |
06E0h | 1ED4h | 1ED4h | 1ED6h | 1ED6h | 1ED8h | 1ED8h | 1EDAh | 1EDAh |
06E8h | 1EDCh | 1EDCh | 1EDEh | 1EDEh | 1EE0h | 1EE0h | 1EE2h | 1EE2h |
06F0h | 1EE4h | 1EE4h | 1EE6h | 1EE6h | 1EE8h | 1EE8h | 1EEAh | 1EEAh |
06F8h | 1EECh | 1EECh | 1EEEh | 1EEEh | 1EF0h | 1EF0h | 1EF2h | 1EF2h |
0700h | 1EF4h | 1EF4h | 1EF6h | 1EF6h | 1EF8h | 1EF8h | 1EFAh | 1EFBh |
0708h | 1EFCh | 1EFDh | 1EFEh | 1EFFh | 1F08h | 1F09h | 1F0Ah | 1F0Bh |
0710h | 1F0Ch | 1F0Dh | 1F0Eh | 1F0Fh | 1F08h | 1F09h | 1F0Ah | 1F0Bh |
0718h | 1F0Ch | 1F0Dh | 1F0Eh | 1F0Fh | 1F18h | 1F19h | 1F1Ah | 1F1Bh |
0720h | 1F1Ch | 1F1Dh | 1F16h | 1F17h | 1F18h | 1F19h | 1F1Ah | 1F1Bh |
0728h | 1F1Ch | 1F1Dh | 1F1Eh | 1F1Fh | 1F28h | 1F29h | 1F2Ah | 1F2Bh |
0730h | 1F2Ch | 1F2Dh | 1F2Eh | 1F2Fh | 1F28h | 1F29h | 1F2Ah | 1F2Bh |
0738h | 1F2Ch | 1F2Dh | 1F2Eh | 1F2Fh | 1F38h | 1F39h | 1F3Ah | 1F3Bh |
0740h | 1F3Ch | 1F3Dh | 1F3Eh | 1F3Fh | 1F38h | 1F39h | 1F3Ah | 1F3Bh |
0748h | 1F3Ch | 1F3Dh | 1F3Eh | 1F3Fh | 1F48h | 1F49h | 1F4Ah | 1F4Bh |
0750h | 1F4Ch | 1F4Dh | 1F46h | 1F47h | 1F48h | 1F49h | 1F4Ah | 1F4Bh |
0758h | 1F4Ch | 1F4Dh | 1F4Eh | 1F4Fh | 1F50h | 1F59h | 1F52h | 1F5Bh |
0760h | 1F54h | 1F5Dh | 1F56h | 1F5Fh | 1F58h | 1F59h | 1F5Ah | 1F5Bh |
0768h | 1F5Ch | 1F5Dh | 1F5Eh | 1F5Fh | 1F68h | 1F69h | 1F6Ah | 1F6Bh |
0770h | 1F6Ch | 1F6Dh | 1F6Eh | 1F6Fh | 1F68h | 1F69h | 1F6Ah | 1F6Bh |
0778h | 1F6Ch | 1F6Dh | 1F6Eh | 1F6Fh | 1FBAh | 1FBBh | 1FC8h | 1FC9h |
0780h | 1FCAh | 1FCBh | 1FDAh | 1FDBh | 1FF8h | 1FF9h | 1FEAh | 1FEBh |
0788h | 1FFAh | 1FFBh | 1F7Eh | 1F7Fh | 1F88h | 1F89h | 1F8Ah | 1F8Bh |
0790h | 1F8Ch | 1F8Dh | 1F8Eh | 1F8Fh | 1F88h | 1F89h | 1F8Ah | 1F8Bh |
0798h | 1F8Ch | 1F8Dh | 1F8Eh | 1F8Fh | 1F98h | 1F99h | 1F9Ah | 1F9Bh |
07A0h | 1F9Ch | 1F9Dh | 1F9Eh | 1F9Fh | 1F98h | 1F99h | 1F9Ah | 1F9Bh |
07A8h | 1F9Ch | 1F9Dh | 1F9Eh | 1F9Fh | 1FA8h | 1FA9h | 1FAAh | 1FABh |
07B0h | 1FACh | 1FADh | 1FAEh | 1FAFh | 1FA8h | 1FA9h | 1FAAh | 1FABh |
07B8h | 1FACh | 1FADh | 1FAEh | 1FAFh | 1FB8h | 1FB9h | 1FB2h | 1FBCh |
07C0h | 1FB4h | 1FB5h | 1FB6h | 1FB7h | 1FB8h | 1FB9h | 1FBAh | 1FBBh |
07C8h | 1FBCh | 1FBDh | 1FBEh | 1FBFh | 1FC0h | 1FC1h | 1FC2h | 1FC3h |
07D0h | 1FC4h | 1FC5h | 1FC6h | 1FC7h | 1FC8h | 1FC9h | 1FCAh | 1FCBh |
07D8h | 1FC3h | 1FCDh | 1FCEh | 1FCFh | 1FD8h | 1FD9h | 1FD2h | 1FD3h |
07E0h | 1FD4h | 1FD5h | 1FD6h | 1FD7h | 1FD8h | 1FD9h | 1FDAh | 1FDBh |
07E8h | 1FDCh | 1FDDh | 1FDEh | 1FDFh | 1FE8h | 1FE9h | 1FE2h | 1FE3h |
07F0h | 1FE4h | 1FECh | 1FE6h | 1FE7h | 1FE8h | 1FE9h | 1FEAh | 1FEBh |
07F8h | 1FECh | 1FEDh | 1FEEh | 1FEFh | 1FF0h | 1FF1h | 1FF2h | 1FF3h |
0800h | 1FF4h | 1FF5h | 1FF6h | 1FF7h | 1FF8h | 1FF9h | 1FFAh | 1FFBh |
0808h | 1FF3h | 1FFDh | 1FFEh | 1FFFh | 2000h | 2001h | 2002h | 2003h |
0810h | 2004h | 2005h | 2006h | 2007h | 2008h | 2009h | 200Ah | 200Bh |
0818h | 200Ch | 200Dh | 200Eh | 200Fh | 2010h | 2011h | 2012h | 2013h |
0820h | 2014h | 2015h | 2016h | 2017h | 2018h | 2019h | 201Ah | 201Bh |
0828h | 201Ch | 201Dh | 201Eh | 201Fh | 2020h | 2021h | 2022h | 2023h |
0830h | 2024h | 2025h | 2026h | 2027h | 2028h | 2029h | 202Ah | 202Bh |
0838h | 202Ch | 202Dh | 202Eh | 202Fh | 2030h | 2031h | 2032h | 2033h |
0840h | 2034h | 2035h | 2036h | 2037h | 2038h | 2039h | 203Ah | 203Bh |
0848h | 203Ch | 203Dh | 203Eh | 203Fh | 2040h | 2041h | 2042h | 2043h |
0850h | 2044h | 2045h | 2046h | 2047h | 2048h | 2049h | 204Ah | 204Bh |
0858h | 204Ch | 204Dh | 204Eh | 204Fh | 2050h | 2051h | 2052h | 2053h |
0860h | 2054h | 2055h | 2056h | 2057h | 2058h | 2059h | 205Ah | 205Bh |
0868h | 205Ch | 205Dh | 205Eh | 205Fh | 2060h | 2061h | 2062h | 2063h |
0870h | 2064h | 2065h | 2066h | 2067h | 2068h | 2069h | 206Ah | 206Bh |
0878h | 206Ch | 206Dh | 206Eh | 206Fh | 2070h | 2071h | 2072h | 2073h |
0880h | 2074h | 2075h | 2076h | 2077h | 2078h | 2079h | 207Ah | 207Bh |
0888h | 207Ch | 207Dh | 207Eh | 207Fh | 2080h | 2081h | 2082h | 2083h |
0890h | 2084h | 2085h | 2086h | 2087h | 2088h | 2089h | 208Ah | 208Bh |
0898h | 208Ch | 208Dh | 208Eh | 208Fh | 2090h | 2091h | 2092h | 2093h |
08A0h | 2094h | 2095h | 2096h | 2097h | 2098h | 2099h | 209Ah | 209Bh |
08A8h | 209Ch | 209Dh | 209Eh | 209Fh | 20A0h | 20A1h | 20A2h | 20A3h |
08B0h | 20A4h | 20A5h | 20A6h | 20A7h | 20A8h | 20A9h | 20AAh | 20ABh |
08B8h | 20ACh | 20ADh | 20AEh | 20AFh | 20B0h | 20B1h | 20B2h | 20B3h |
08C0h | 20B4h | 20B5h | 20B6h | 20B7h | 20B8h | 20B9h | 20BAh | 20BBh |
08C8h | 20BCh | 20BDh | 20BEh | 20BFh | 20C0h | 20C1h | 20C2h | 20C3h |
08D0h | 20C4h | 20C5h | 20C6h | 20C7h | 20C8h | 20C9h | 20CAh | 20CBh |
08D8h | 20CCh | 20CDh | 20CEh | 20CFh | 20D0h | 20D1h | 20D2h | 20D3h |
08E0h | 20D4h | 20D5h | 20D6h | 20D7h | 20D8h | 20D9h | 20DAh | 20DBh |
08E8h | 20DCh | 20DDh | 20DEh | 20DFh | 20E0h | 20E1h | 20E2h | 20E3h |
08F0h | 20E4h | 20E5h | 20E6h | 20E7h | 20E8h | 20E9h | 20EAh | 20EBh |
08F8h | 20ECh | 20EDh | 20EEh | 20EFh | 20F0h | 20F1h | 20F2h | 20F3h |
0900h | 20F4h | 20F5h | 20F6h | 20F7h | 20F8h | 20F9h | 20FAh | 20FBh |
0908h | 20FCh | 20FDh | 20FEh | 20FFh | 2100h | 2101h | 2102h | 2103h |
0910h | 2104h | 2105h | 2106h | 2107h | 2108h | 2109h | 210Ah | 210Bh |
0918h | 210ch | 210Dh | 210Eh | 210Fh | 2110h | 2111h | 2112h | 2113h |
0920h | 2114 ч | 2115h | 2116h | 2117h | 2118h | 2119h | 211Ah | 211Bh |
0928h | 211ch | 211Dh | 211Eh | 211Fh | 2120h | 2121 ч | 2122h | 2123 ч |
0930h | 2124h | 2125h | 2126h | 2127h | 2128h | 2129h | 212Ah | 212Bh |
0938h | 212ch | 212Dh | 212Eh | 212Fh | 2130h | 2131h | 2132h | 2133h |
0940h | 2134h | 2135h | 2136h | 2137h | 2138h | 2139h | 213Ah | 213Bh |
0948h | 213ch | 213Dh | 213Eh | 213Fh | 2140h | 2141h | 2142 ч | 2143h |
0950h | 2144h | 2145h | 2146h | 2147h | 2148h | 2149h | 214Ah | 214Bh |
0958h | 214ch | 214Dh | 2132h | 214Fh | 2150h | 2151h | 2152h | 2153h |
0960h | 2154h | 2155h | 2156h | 2157h | 2158h | 2159h | 215Ah | 215Bh |
0968h | 215ch | 215Dh | 215Eh | 215Fh | 2160h | 2161h | 2162h | 2163h |
0970h | 2164h | 2165h | 2166h | 2167h | 2168h | 2169h | 216Ah | 216Bh |
0978h | 216ch | 216Dh | 216Eh | 216Fh | 2160h | 2161h | 2162h | 2163h |
0980h | 2164h | 2165h | 2166h | 2167h | 2168h | 2169h | 216Ah | 216Bh |
0988h | 216ch | 216Dh | 216Eh | 216Fh | 2180h | 2181h | 2182h | 2183h |
0990h | 2183h | FFFFh | 034Bh | 24B6h | 24B7h | 24B8h | 24B9h | 24BAh |
0998h | 24BBh | 24BCh | 24BDh | 24BEh | 24BFh | 24C0h | 24C1h | 24C2h |
09A0h | 24C3h | 24C4h | 24C5h | 24C6h | 24C7h | 24C8h | 24C9h | 24CAh |
09A8h | 24CBh | 24CCh | 24CDh | 24CEh | 24CFh | FFFFh | 0746h | 2C00h |
09B0h | 2C01h | 2C02h | 2C03h | 2C04h | 2C05h | 2C06h | 2C07h | 2C08h |
09B8h | 2C09h | 2C0Ah | 2C0Bh | 2C0Ch | 2C0Dh | 2C0Eh | 2C0Fh | 2C10h |
09C0h | 2C11h | 2C12h | 2C13h | 2C14h | 2C15h | 2C16h | 2C17h | 2C18h |
09C8h | 2C19h | 2C1Ah | 2C1Bh | 2C1Ch | 2C1Dh | 2C1Eh | 2C1Fh | 2C20h |
09D0h | 2C21h | 2C22h | 2C23h | 2C24h | 2C25h | 2C26h | 2C27h | 2C28h |
09D8h | 2C29h | 2C2Ah | 2C2Bh | 2C2Ch | 2C2Dh | 2C2Eh | 2C5Fh | 2C60h |
09E0h | 2C60h | 2C62h | 2C63h | 2C64h | 2C65h | 2C66h | 2C67h | 2C67h |
09E8h | 2C69h | 2C69h | 2C6Bh | 2C6Bh | 2C6Dh | 2C6Eh | 2C6Fh | 2C70h |
09F0h | 2C71h | 2C72h | 2C73h | 2C74h | 2C75h | 2C75h | 2C77h | 2C78h |
09F8h | 2C79h | 2C7Ah | 2C7Bh | 2C7Ch | 2C7Dh | 2C7Eh | 2C7Fh | 2C80h |
0A00h | 2C80h | 2C82h | 2C82h | 2C84h | 2C84h | 2C86h | 2C86h | 2C88h |
0A08h | 2C88h | 2C8Ah | 2C8Ah | 2C8Ch | 2C8Ch | 2C8Eh | 2C8Eh | 2C90h |
0A10h | 2C90h | 2C92h | 2C92h | 2C94h | 2C94h | 2C96h | 2C96h | 2C98h |
0A18h | 2C98h | 2C9Ah | 2C9Ah | 2C9Ch | 2C9Ch | 2C9Eh | 2C9Eh | 2CA0h |
0A20h | 2CA0h | 2CA2h | 2CA2h | 2CA4h | 2CA4h | 2CA6h | 2CA6h | 2CA8h |
0A28h | 2CA8h | 2CAAh | 2CAAh | 2CACh | 2CACh | 2CAEh | 2CAEh | 2CB0h |
0A30h | 2CB0h | 2CB2h | 2CB2h | 2CB4h | 2CB4h | 2CB6h | 2CB6h | 2CB8h |
0A38h | 2CB8h | 2CBAh | 2CBAh | 2CBCh | 2CBCh | 2CBEh | 2CBEh | 2CC0h |
0A40h | 2CC0h | 2CC2h | 2CC2h | 2CC4h | 2CC4h | 2CC6h | 2CC6h | 2CC8h |
0A48h | 2CC8h | 2CCAh | 2CCAh | 2CCCh | 2CCCh | 2CCEh | 2CCEh | 2CD0h |
0A50h | 2CD0h | 2CD2h | 2CD2h | 2CD4h | 2CD4h | 2CD6h | 2CD6h | 2CD8h |
0A58h | 2CD8h | 2CDAh | 2CDAh | 2CDCh | 2CDCh | 2CDEh | 2CDEh | 2CE0h |
0A60h | 2CE0h | 2CE2h | 2CE2h | 2CE4h | 2CE5h | 2CE6h | 2CE7h | 2CE8h |
0A68h | 2CE9h | 2CEAh | 2CEBh | 2CECh | 2CEDh | 2CEEh | 2CEFh | 2CF0h |
0A70h | 2CF1h | 2CF2h | 2CF3h | 2CF4h | 2CF5h | 2CF6h | 2CF7h | 2CF8h |
0A78h | 2CF9h | 2CFAh | 2CFBh | 2CFCh | 2CFDh | 2CFEh | 2CFFh | 10A0h |
0A80h | 10A1h | 10A2h | 10A3h | 10A4h | 10A5h | 10A6h | 10A7h | 10A8h |
0A88h | 10A9h | 10AAh | 10ABh | 10ACh | 10ADh | 10AEh | 10AFh | 10B0h |
0A90h | 10B1h | 10B2h | 10B3h | 10B4h | 10B5h | 10B6h | 10B7h | 10B8h |
0A98h | 10B9h | 10BAh | 10BBh | 10БЧ | 10BDh | 10BEh | 10BFh | 10C0h |
0AA0h | 10C1h | 10C2h | 10C3h | 10C4h | 10C5h | FFFFh | D21Bh | FF21h |
0AA8h | FF22h | FF23h | FF24h | FF25h | FF26h | FF27h | FF28h | FF29h |
0AB0h | FF2Ah | FF2Bh | FF2Ch | FF2Dh | FF2Eh | FF2Fh | FF30h | FF31h |
0AB8h | FF32h | FF33h | FF34h | FF35h | FF36h | FF37h | FF38h | FF39h |
0AC0h | FF3Ah | FF5Bh | FF5Ch | FF5Dh | FF5Eh | FF5Fh | FF60h | FF61h |
0AC8h | FF62h | FF63h | FF64h | FF65h | FF66h | FF67h | FF68h | FF69h |
0AD0h | FF6Ah | FF6Bh | FF6Ch | FF6Dh | FF6Eh | FF6Fh | FF70h | FF71h |
0AD8h | FF72h | FF73h | FF74h | FF75h | FF76h | FF77h | FF78h | FF79h |
0AE0h | FF7Ah | FF7Bh | FF7Ch | FF7Dh | FF7Eh | FF7Fh | FF80h | FF81h |
0AE8h | FF82h | FF83h | FF84h | FF85h | FF86h | FF87h | FF88h | FF89h |
0AF0h | FF8Ah | FF8Bh | FF8Ch | FF8Dh | FF8Eh | FF8Fh | FF90h | FF91h |
0AF8h | FF92h | FF93h | FF94h | FF95h | FF96h | FF97h | FF98h | FF99h |
0B00h | FF9Ah | FF9Bh | FF9Ch | FF9Dh | FF9Eh | FF9Fh | FFA0h | FFA1h |
0B08h | FFA2h | FFA3h | FFA4h | FFA5h | FFA6h | FFA7h | FFA8h | FFA9h |
0B10h | FFAAh | FFABh | FFACh | FFADh | FFAEh | FFAFh | FFB0h | FFB1h |
0B18h | FFB2h | FFB3h | FFB4h | FFB5h | FFB6h | FFB7h | FFB8h | FFB9h |
0B20h | FFBAh | FFBBh | FFBCh | FFBDh | FFBEh | FFBFh | FFC0h | FFC1h |
0B28h | FFC2h | FFC3h | FFC4h | FFC5h | FFC6h | FFC7h | FFC8h | FFC9h |
0B30h | FFCAh | FFCBh | FFCCh | FFCDh | FFCEh | FFCFh | FFD0h | FFD1h |
0B38h | FFD2h | FFD3h | FFD4h | FFD5h | FFD6h | FFD7h | FFD8h | FFD9h |
0B40h | FFDAh | FFDBh | FFDCh | FFDDh | FFDEh | FFDFh | FFE0h | FFE1h |
0B48h | FFE2h | FFE3h | FFE4h | FFE5h | FFE6h | FFE7h | FFE8h | FFE9h |
0B50h | FFEAh | FFEBh | FFECh | FFEDh | FFEEh | FFEFh | FFF0h | FFF1h |
0B58h | FFF2h | FFF3h | FFF4h | FFF5h | FFF6h | FFF7h | FFF8h | FFF9h |
0B60h | FFFAh | FFFBh | FFFCh | FFFDh | FFFEh | FFFFh |
7.3 Запись каталога меток тома
Метка тома — это строка Юникода, которая позволяет конечным пользователям различать свои тома хранилища. В файловой системе exFAT метка тома существует в качестве важной записи основного каталога в корневом каталоге (см . таблицу 26). Допустимое количество записей каталога меток тома в диапазоне от 0 до 1.
Таблица 26. Каталог меток томаСтруктура запросов
Имя поля | Offset (байт) |
Размер (байт) |
Комментарии |
---|---|---|---|
EntryType | 0 | 1 | Это поле является обязательным, и его содержимое определяется в разделе 7.3.1 . |
CharacterCount | 1 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.3.2 . |
VolumeLabel | 2 | 22 | Это поле является обязательным, а его содержимое определяется в разделе 7.3.3 . |
Зарезервировано | 24 | 8 | Это поле является обязательным и его содержимое зарезервировано. |
7.3.1. Поле EntryType
Поле EntryType должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.1).
7.3.1.1 Поле TypeCode
Поле TypeCode должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.1.1).
Для записи каталога "Метка тома" допустимое значение этого поля равно 3.
7.3.1.2 Поле typeImportance
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.1.2).
Для записи каталога "Метка тома" допустимое значение этого поля равно 0.
7.3.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.1.3).
7.3.1.4 InUse Field
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см . раздел 6.3.1.4).
7.3.2. Поле CharacterCount
Поле CharacterCount должно содержать длину строки Юникода, которая содержится в поле VolumeLabel.
Допустимый диапазон значений для этого поля должен быть следующим:
Не менее 0, что означает, что строка Юникода имеет длину 0 символов (что эквивалентно без метки тома).
Не более 11, что означает, что строка Юникода имеет длину 11 символов.
7.3.3 Поле VolumeLabel
Поле VolumeLabel должно содержать строку Юникода, которая является понятным именем тома. Поле VolumeLabel содержит тот же набор недопустимых символов, что и поле FileName в записи каталога Имя файла (см . раздел 7.7.3).
7.4 Запись каталога файлов
Записи каталога файлов описывают файлы и каталоги. Они являются критически важными записями основного каталога, и любой каталог может содержать ноль или более записей каталога файлов (см . таблицу 27). Чтобы запись каталога файлов была допустимой, только одна запись каталога расширения потока и по крайней мере одна запись каталога имени файла должны сразу следовать за записью Каталог файлов (см . раздел 7.6 и Раздел 7.7 соответственно).
Таблица 27 File DirectoryEntry
Имя поля | Offset (байт) |
Размер (байт) |
Комментарии |
---|---|---|---|
EntryType | 0 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.1 . |
SecondaryCount | 1 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.2 . |
SetChecksum | 2 | 2 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.3 . |
FileAttributes | 4 | 2 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.4 . |
Reserved1 | 6 | 2 | Это поле является обязательным и его содержимое зарезервировано. |
CreateTimestamp | 8 | 4 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.5 a> . |
LastModifiedTimestamp | 12 | 4 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.6 . |
LastAccessedTimestamp | 16 | 4 | Это поле является обязательным, и его содержимое определяется в разделе 7.4.7 . |
Create10msIncrement | 20 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.5 a> . |
LastModified10msIncrement | 21 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.6 . |
CreateUtcOffset | 22 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.5 a> . |
LastModifiedUtcOffset | 23 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.6 . |
LastAccessedUtcOffset | 24 | 1 | Это поле является обязательным, и его содержимое определяется в разделе 7.4.7 . |
Reserved2 | 25 | 7 | Это поле является обязательным и его содержимое зарезервировано. |
7.4.1. Поле EntryType
Поле EntryType должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.1).
7.4.1.1 Поле TypeCode
Поле TypeCode должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.1.1).
Для записи каталога файлов допустимое значение этого поля равно 5.
7.4.1.2 Поле TypeImportance
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.1.2).
Для записи каталога файлов допустимое значение этого поля равно 0.
7.4.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.1.3).
7.4.1.4 InUse Field
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см . раздел 6.3.1.4).
7.4.2. Поле SecondaryCount
Поле SecondaryCount должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см . раздел 6.3.2).
7.4.3. Поле SetChecksum
Поле SetChecksum должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.3).
7.4.4. Поле FileAttributes
Поле FileAttributes содержит флаги (см . таблицу 28).
Таблица 28. Структура поля FileAttributes
Имя поля | Offset (бит) |
Размер (биты) |
Комментарии |
---|---|---|---|
Только для чтения | 0 | 1 | Это поле является обязательным и соответствует определению MS-DOS. |
Скрытый | 1 | 1 | Это поле является обязательным и соответствует определению MS-DOS. |
Система | 2 | 1 | Это поле является обязательным и соответствует определению MS-DOS. |
Reserved1 | 3 | 1 | Это поле является обязательным и его содержимое зарезервировано. |
Directory | 4 | 1 | Это поле является обязательным и соответствует определению MS-DOS. |
Архив | 5 | 1 | Это поле является обязательным и соответствует определению MS-DOS. |
Reserved2 | 6 | 10 | Это поле является обязательным и его содержимое зарезервировано. |
7.4.5 Поля CreateTimestamp, Create10msIncrement и CreateUtcOffset
В сочетании поля CreateTimestamp и CreateTime10msIncrement должны описывать локальную дату и время создания данного файла или каталога. Поле CreateUtcOffset описывает смещение локальной даты и времени от UTC. Реализации должны задавать эти поля при создании заданного набора записей каталога.
Эти поля должны соответствовать определениям полей Timestamp, 10msIncrement и UtcOffset (см . раздел 7.4.8, раздел 7.4.9 и раздел 7.4.10 соответственно).
7.4.6 Поля LastModifiedTimestamp, LastModified10msIncrement и LastModifiedUtcOffset
В сочетании поля LastModifiedTimestamp и LastModifiedTime10msIncrement должны описывать локальную дату и время последнего изменения содержимого любого из кластеров, связанных с данной записью каталога расширения Stream. Поле LastModifiedUtcOffset описывает смещение локальной даты и времени от UTC. Реализации должны обновлять следующие поля:
После изменения содержимого любого из кластеров, связанных с заданной записью каталога расширения Stream (за исключением содержимого, которое существует за пределами точки, описанной в поле ValidDataLength).
При изменении значений полей ValidDataLength или DataLength
Эти поля должны соответствовать определениям полей Timestamp, 10msIncrement и UtcOffset (см . раздел 7.4.8, раздел 7.4.9 и раздел 7.4.10 соответственно).
7.4.7 Поля LastAccessedTimestamp и LastAccessedUtcOffset
Поле LastAccessedTimestamp должно описывать локальную дату и время последнего доступа к содержимому любого из кластеров, связанных с данной записью каталога расширения Stream. Поле LastAccessedUtcOffset описывает смещение локальной даты и времени от UTC. Реализации должны обновлять следующие поля:
После изменения содержимого любого из кластеров, связанных с указанной записью каталога расширения Stream (за исключением содержимого, которое существует за пределами ValidDataLength)
При изменении значений полей ValidDataLength или DataLength
Реализации должны обновлять эти поля после чтения содержимого любого из кластеров, связанных с заданной записью каталога Stream Extension.
Эти поля должны соответствовать определениям полей Timestamp и UtcOffset (см . раздел 7.4.8 и раздел 7.4.10 соответственно).
7.4.8. Поля меток времени
Поля метки времени описывают локальную дату и время вплоть до двухсекундного разрешения (см . таблицу 29).
Таблица 29. Структура поля метки времени
Имя поля | Offset (бит) |
Размер (биты) |
Комментарии |
---|---|---|---|
DoubleSeconds | 0 | 5 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.8.1 . |
Минута | 5 | 6 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.8.2 . |
Час | 11 | 5 | Это поле является обязательным, и его содержимое определяется в разделе 7.4.8.3 . |
День | 16 | 5 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.8.4 . |
Месяц | 21 | 4 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.8.5 . |
Год | 25 | 7 | Это поле является обязательным, и его содержимое определяется в разделе 7.4.8.6 . |
7.4.8.1 Поле DoubleSeconds
Поле DoubleSeconds должно описывать секундную часть поля Метка времени в двухсекундном кратном значении.
Допустимый диапазон значений для этого поля должен быть следующим:
0, представляющий 0 секунд
29, то есть 58 секунд
7.4.8.2 Минутное поле
Поле "Минута" должно описывать часть поля Метка времени в минутах.
Допустимый диапазон значений для этого поля должен быть следующим:
0, представляющее 0 минут
59, что представляет 59 минут
7.4.8.3 Часовое поле
Поле Hour должно описывать часть часов в поле Метка времени.
Допустимый диапазон значений для этого поля должен быть следующим:
0, представляющее 00:00 часов
23, что представляет 23:00 часов
7.4.8.4. Поле дня
Поле День должно описывать часть дня в поле Метка времени.
Допустимый диапазон значений для этого поля должен быть следующим:
1, который является первым днем заданного месяца
Последний день заданного месяца (заданный месяц определяет количество допустимых дней)
7.4.8.5 Поле месяца
Поле Месяц должно описывать часть месяца в поле Метка времени.
Допустимый диапазон значений для этого поля должен быть следующим:
По крайней мере 1, представляющее январь
Не более 12, что представляет декабрь
7.4.8.6 Поле года
Поле Year должно описывать часть года в поле Метка времени относительно 1980 года. Это поле представляет год 1980 со значением 0 и год 2107 со значением 127.
Допустимы все возможные значения для этого поля.
7.4.9. 10 мсПоля приращения
Поля 10msIncrement должны предоставлять дополнительное разрешение времени соответствующим полям Метка времени в десяти миллисекундах.
Допустимый диапазон значений для этих полей должен быть следующим:
Не менее 0, представляющее 0 миллисекундах
Не более 199, что представляет 1990 миллисекундах
7.4.10 UtcOffset Fields
Поля UtcOffset (см . таблицу 30) должны описывать смещение от UTC до локальной даты и времени, которые описываются соответствующими полями Timestamp и 10msIncrement. Смещение от UTC к местным датам и времени включает в себя влияние часовых поясов и другие корректировки даты и времени, такие как летнее и региональное летнее время.
Структура полей в таблице 30 UtcOffset
Имя поля | Offset (бит) |
Размер (биты) |
Комментарии |
---|---|---|---|
OffsetFromUtc | 0 | 7 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.10.1. |
OffsetValid | 7 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.4.10.2 . |
7.4.10.1 Поле OffsetFromUtc
Поле OffsetFromUtc должно описывать смещение от UTC локальной даты и времени, которые содержатся в связанных полях Timestamp и 10msIncrement. В этом поле описывается смещение от UTC с интервалами в 15 минут (см. таблицу 31).
Таблица 31. Значение значений поля OffsetFromUtc
Значение | Десятичный эквивалент со знаком | Описание |
---|---|---|
3Fh | 63 | Местные дата и время — UTC + 15:45 |
3Eh | 62 | Местные дата и время : UTC + 15:30 |
. . . |
. . . |
. . . |
01h | 1 | Местные дата и время : UTC + 00:15 |
00h | 0 | Местные дата и время — UTC |
7Fh | -1 | Местные дата и время — UTC — 00:15 |
. . . |
. . . |
. . . |
41 ч | -63 | Местные дата и время — UTC — 15:45 |
40 ч | -64 | Местные дата и время — UTC — 16:00 |
Как показано в приведенной выше таблице, все возможные значения для этого поля допустимы. Однако реализации должны записывать значение 00h для этого поля только в следующих случаях:
Местные дата и время фактически совпадают с utc, и в этом случае значение поля OffsetValid должно быть равно 1
Локальные дата и время не известны. В этом случае значение поля OffsetValid должно быть равно 1, а реализации должны считать UTC местными датами и временем.
ВРЕМЯ UTC неизвестно, в этом случае значение поля OffsetValid должно быть равно 0.
Если смещение локальной даты и времени от UTC не кратно 15-минутным интервалам, то реализации должны записывать 00h в поле OffsetFromUtc и считать UTC местными датами и временем.
7.4.10.2. Поле OffsetValid
Поле OffsetValid должно описывать, является ли содержимое поля OffsetFromUtc допустимым или нет, следующим образом:
0, что означает недопустимое содержимое поля OffsetFromUtc
и должно быть 00h
1, то есть содержимое поля OffsetFromUtc является допустимым
Реализации должны задавать этому полю значение 0, только если utc недоступен для вычисления значения поля OffsetFromUtc. Если это поле содержит значение 0, то реализации должны рассматривать поля Timestamp и 10msIncrement как имеющие то же смещение в формате UTC, что и текущие локальные дата и время.
7.5 Запись каталога GUID тома
Запись каталога GUID тома содержит GUID, который позволяет реализации уникально и программно различать тома. Guid тома существует как неопасная запись первичного каталога в корневом каталоге (см . таблицу 32). Допустимое число записей каталога GUID тома в диапазоне от 0 до 1.
Таблица 32. Каталог GUID томаКоралог
Имя поля | Offset (байт) |
Размер (байт) |
Комментарии |
---|---|---|---|
EntryType | 0 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.5.1 . |
SecondaryCount | 1 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.5.2 . |
SetChecksum | 2 | 2 | Это поле является обязательным, а его содержимое определяется в разделе 7.5.3 . |
GeneralPrimaryFlags | 4 | 2 | Это поле является обязательным, а его содержимое определяется в разделе 7.5.4 . |
VolumeGuid | 6 | 16 | Это поле является обязательным, а его содержимое определяется в разделе 7.5.5 . |
Зарезервировано | 22 | 10 | Это поле является обязательным и его содержимое зарезервировано. |
7.5.1. Поле EntryType
Поле EntryType должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.1).
7.5.1.1 Поле TypeCode
Поле TypeCode должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.1.1).
Для записи каталога GUID тома допустимое значение этого поля равно 0.
7.5.1.2 Поле typeImportance
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.1.2).
Для записи каталога GUID тома допустимое значение этого поля равно 1.
7.5.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.1.3).
7.5.1.4 InUse Field
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см . раздел 6.3.1.4).
7.5.2. Поле SecondaryCount
Поле SecondaryCount должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см . раздел 6.3.2).
Для записи каталога GUID тома допустимое значение этого поля равно 0.
7.5.3. Поле SetChecksum
Поле SetChecksum должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.3).
7.5.4. Поле GeneralPrimaryFlags
Поле GeneralPrimaryFlags должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.4) и определяет содержимое зарезервированного поля CustomDefined.
7.5.4.1 AllocationPossible Field
Поле AllocationPossible должно соответствовать определению, указанному в шаблоне Универсального первичного каталогаEntry (см . раздел 6.3.4.1).
Для записи каталога GUID тома допустимое значение этого поля равно 0.
7.5.4.2 Поле NoFatChain
Поле NoFatChain должно соответствовать определению, указанному в шаблоне Универсального основного каталогаEntry (см . раздел 6.3.4.2).
7.5.5 Поле VolumeGuid
Поле VolumeGuid должно содержать GUID, который однозначно идентифицирует данный том.
Допустимы все возможные значения для этого поля, за исключением GUID null, который имеет значение {00000000-0000-0000-0000-000000000000}.
7.6 Запись каталога расширения stream
Запись каталога расширения Stream — это критически важная запись дополнительного каталога в наборах записей каталогов файлов (см . таблицу 33). Допустимое число записей каталога расширения Stream в наборе записей каталога файлов равно 1. Кроме того, эта запись каталога действительна, только если она сразу следует за записью Каталог файлов.
Таблица 33 Stream Extension DirectoryEntry
Имя поля | Offset (байт) |
Размер (байт) |
Комментарии |
---|---|---|---|
EntryType | 0 | 1 | Это поле является обязательным, и его содержимое определяется в разделе 7.6.1 . |
GeneralSecondaryFlags | 1 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.6.2 . |
Reserved1 | 2 | 1 | Это поле является обязательным и его содержимое зарезервировано. |
NameLength | 3 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.6.3 . |
NameHash | 4 | 2 | Это поле является обязательным, а его содержимое определяется в разделе 7.6.4 . |
Reserved2 | 6 | 2 | Это поле является обязательным и его содержимое зарезервировано. |
ValidDataLength | 8 | 8 | Это поле является обязательным, а его содержимое определяется в разделе 7.6.5 . |
Зарезервировано3 | 16 | 4 | Это поле является обязательным и его содержимое зарезервировано. |
FirstCluster | 20 | 4 | Это поле является обязательным, а его содержимое определяется в разделе 7.6.6 . |
DataLength | 24 | 8 | Это поле является обязательным, а его содержимое определяется в разделе 7.6.7 . |
7.6.1. Поле EntryType
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1).
7.6.1.1 Поле TypeCode
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.1).
Для записи каталога расширения Stream допустимое значение для этого поля равно 0.
7.6.1.2 Поле типа
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.2).
Для записи каталога расширения Stream допустимое значение для этого поля равно 0.
7.6.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.3).
7.6.1.4 InUse Field
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.4).
7.6.2 Поле GeneralSecondaryFlags
Поле GeneralSecondaryFlags должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.2), и определяет содержимое поля CustomDefined для резервации.
7.6.2.1 AllocationPossible Field
Поле AllocationPossible должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.2.1).
Для записи каталога расширения Stream допустимое значение для этого поля равно 1.
7.6.2.2 Поле NoFatChain
Поле NoFatChain должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.2.2).
7.6.3 NameLength Field
Поле NameLength должно содержать длину строки Юникода, которая содержится в последующих записях каталога имени файла (см. раздел 7.7).
Допустимый диапазон значений для этого поля должен быть следующим:
Не менее 1, что является кратчайшим возможным именем файла.
Не более 255, что является самым длинным возможным именем файла.
Значение поля NameLength также влияет на число записей каталога имени файла (см. раздел 7.7).
7.6.4 ИмяПолиоhash
Поле NameHash должно содержать 2-байтовый хэш-код (см . рис. 4) имени файла в регистре. Это позволяет реализовать быстрое сравнение при поиске файла по имени. Важно отметить, что NameHash обеспечивает уверенную проверку несоответствия. Реализации должны проверять все совпадения NameHash с помощью сравнения имени файла в регистре.
Рис. 4. Вычисление именHash
UInt16 NameHash
(
WCHAR * FileName, // points to an in-memory copy of the up-cased file name
UCHAR NameLength
)
{
UCHAR * Buffer = (UCHAR *)FileName;
UInt16 NumberOfBytes = (UInt16)NameLength * 2;
UInt16 Hash = 0;
UInt16 Index;
for (Index = 0; Index < NumberOfBytes; Index++)
{
Hash = ((Hash&1) ? 0x8000 : 0) + (Hash>>1) + (UInt16)Buffer[Index];
}
return Hash;
}
7.6.5. Поле ValidDataLength
Поле ValidDataLength должно описывать, насколько далеко в потоке данных были записаны пользовательские данные. Реализации должны обновлять это поле по мере записи данных в поток данных. На носителе данных данные между допустимой длиной данных и длиной данных потока данных не определена. Реализации должны возвращать нули для операций чтения, превышающие допустимую длину данных.
Если соответствующая запись Каталога файлов описывает каталог, то единственное допустимое значение для этого поля равно значению поля DataLength. В противном случае диапазон допустимых значений для этого поля должен быть следующим:
Не менее 0, что означает, что пользовательские данные не были записаны в поток данных.
Не более DataLength, что означает, что пользовательские данные были записаны во всю длину потока данных.
7.6.6 FirstCluster Field
Поле FirstCluster должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.3).
Это поле должно содержать индекс первого кластера потока данных, в котором размещаются пользовательские данные.
7.6.7. Поле DataLength
Поле DataLength должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.4).
Если соответствующая запись Каталога файлов описывает каталог, то допустимым значением для этого поля является весь размер связанного выделения в байтах, который может быть равен 0. Кроме того, для каталогов максимальное значение этого поля равно 256 МБ.
7.7. Запись каталога имени файла
Записи каталога имени файла являются критически важными записями вторичного каталога в наборах записей каталогов файлов (см . таблицу 34). Допустимое число записей каталога имени файла в наборе записей каталога файлов — NameLength / 15, округленное до ближайшего целого числа. Кроме того, записи каталога имени файла действительны только в том случае, если они сразу следуют за записью каталога расширения потока в виде последовательного ряда. Записи каталога имени файла объединяются для формирования имени файла для набора записей каталога файлов.
Все дочерние элементы данной записи каталога должны иметь уникальные наборы записей каталога имени файла. Это значит, что после вставки регистра в одном каталоге не может быть повторяющихся имен файлов или каталогов.
Таблица 34 Имя файла DirectoryEntry
Имя поля | Offset (байт) |
Размер (байт) |
Комментарии |
---|---|---|---|
EntryType | 0 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.7.1 . |
GeneralSecondaryFlags | 1 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.7.2 . |
FileName | 2 | 30 | Это поле является обязательным, а его содержимое определяется в разделе 7.7.3 . |
7.7.1. Поле EntryType
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1).
7.7.1.1 Поле TypeCode
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.1).
Для записи каталога Имя файла допустимое значение для этого поля — 1.
7.7.1.2 Поле typeImportance
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.2).
Для записи каталога имя файла допустимое значение этого поля равно 0.
7.7.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Универсального вторичного каталогаEntry (см . раздел 6.4.1.3).
7.7.1.4 InUse Field
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.4).
7.7.2. Поле GeneralSecondaryFlags
Поле GeneralSecondaryFlags должно соответствовать определению, указанному в шаблоне Универсальный вторичный каталогEntry (см . раздел 6.4.2) и определяет содержимое зарезервированного поля CustomDefined.
7.7.2.1 AllocationPossible Field
Поле AllocationPossible должно соответствовать определению, указанному в шаблоне Универсальный вторичный каталогEntry (см . раздел 6.4.2.1).
Для записи каталога Stream Extension допустимое значение этого поля равно 0.
7.7.2.2 Поле NoFatChain
Поле NoFatChain должно соответствовать определению, указанному в шаблоне Универсальный вторичный каталогEntry (см . раздел 6.4.2.2).
7.7.3. Поле имени файла
Поле FileName должно содержать строку Юникода, которая является частью имени файла. В порядке существования записей каталога имени файла в наборе записей каталога файлов поля FileName объединяются, чтобы сформировать имя файла для набора записей каталога файлов. Учитывая длину поля FileName ( 15 символов) и максимальное количество записей каталога Имя файла (17), максимальная длина окончательного сцепленного имени файла составляет 255.
Сцепленное имя файла содержит тот же набор недопустимых символов, что и другие файловые системы на основе FAT (см . таблицу 35). Реализации должны задавать для неиспользуемых символов полей FileName значение 0000h.
Недопустимые символы имени файла в таблице 35
Код символа | Описание | Код символа | Описание | Код символа | Описание |
---|---|---|---|---|---|
0000h | Код элемента управления | 0001h | Код элемента управления | 0002h | Код элемента управления |
0003h | Код элемента управления | 0004h | Код элемента управления | 0005h | Код элемента управления |
0006h | Код элемента управления | 0007h | Код элемента управления | 0008h | Код элемента управления |
0009h | Код элемента управления | 000Ah | Код элемента управления | 000Bh | Код элемента управления |
000Ch | Код элемента управления | 000Dh | Код элемента управления | 000Eh | Код элемента управления |
000Fh | Код элемента управления | 0010h | Код элемента управления | 0011h | Код элемента управления |
0012h | Код элемента управления | 0013h | Код элемента управления | 0014h | Код элемента управления |
0015h | Код элемента управления | 0016h | Код элемента управления | 0017h | Код элемента управления |
0018h | Код элемента управления | 0019h | Код элемента управления | 001Ah | Код элемента управления |
001Bh | Код элемента управления | 001Ch | Код элемента управления | 001Dh | Код элемента управления |
001Eh | Код элемента управления | 001Fh | Код элемента управления | 0022h | Знак кавычек |
002Ah | Asterisk | 002Fh | Косая черта | 003Ah | Двоеточие |
003Ch | Знак "меньше" | 003Eh | Знак "больше" | 003Fh | Вопросительный знак |
005Ch | Обратная косая черта | 007Ch | Вертикальная черта |
Имена файлов "." и ".." имеют особое значение "this directory" и "containing directory" соответственно. Реализации не должны записывать ни одно из этих зарезервированных имен файлов в поле FileName. Однако реализации могут создавать эти два имени файлов в списках каталогов, чтобы ссылаться на указанный каталог и содержащий каталог.
Реализациям может потребоваться ограничить имена файлов и каталогов только кодировкой ASCII. В этом случае следует ограничить использование символов диапазоном допустимых символов в первых 128 записях Юникода. Они по-прежнему должны хранить имена файлов и каталогов в Юникоде на томе и преобразовывать в ASCII/Юникод при взаимодействии с пользователем.
7.8. Запись каталога расширения поставщика
Запись каталога расширения поставщика является неопасной записью вторичного каталога в наборах записей каталогов файлов (см . таблицу 36). Набор записей каталога файлов может содержать любое количество записей каталога расширения поставщика, вплоть до ограничения записей вторичного каталога, за вычетом количества других записей дополнительного каталога. Кроме того, записи каталога расширения поставщика действительны только в том случае, если они не предшествуют требуемым записям каталога расширения потока и имени файла.
Записи каталога расширения поставщика позволяют поставщикам иметь уникальные записи каталога для конкретных поставщиков в отдельных наборах записей каталога файлов с помощью поля VendorGuid (см . таблицу 36). Уникальные записи каталога позволяют поставщикам расширить файловую систему exFAT. Поставщики могут определять содержимое поля VendorDefined (см . таблицу 36). Реализации поставщика могут поддерживать содержимое поля VendorDefined и предоставлять функциональные возможности для конкретных поставщиков.
Реализации, которые не распознают GUID записи каталога расширения поставщика, должны обрабатывать запись каталога так же, как и любую другую нераспознанную неопасную запись вторичного каталога (см. раздел 8.2).
Таблица 36. Каталог расширения поставщикаКоралог
Имя поля | Offset (байт) |
Размер (байт) |
Комментарии |
---|---|---|---|
EntryType | 0 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.8.1 . |
GeneralSecondaryFlags | 1 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.8.2 . |
VendorGuid | 2 | 16 | Это поле является обязательным, а его содержимое определяется в разделе 7.8.3 . |
VendorDefined | 18 | 14 | Это поле является обязательным, и поставщики могут определить его содержимое. |
7.8.1. Поле EntryType
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1).
7.8.1.1 Поле TypeCode
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.1).
Для записи каталога расширения поставщика допустимое значение для этого поля равно 0.
7.8.1.2 Поле типа
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.2).
Для записи каталога расширения поставщика допустимое значение для этого поля равно 1.
7.8.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.3).
7.8.1.4 InUse Field
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.4).
7.8.2 GeneralSecondaryFlags Field
Поле GeneralSecondaryFlags должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.2), и определяет содержимое поля CustomDefined для резервации.
7.8.2.1 AllocationPossible Field
Поле AllocationPossible должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.2.1).
Для записи каталога расширения поставщика допустимое значение для этого поля равно 0.
7.8.2.2 Поле NoFatChain
Поле NoFatChain должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.2.2).
7.8.3. Поле VendorGuid
Поле VendorGuid должно содержать GUID, который однозначно идентифицирует данное расширение поставщика.
Все возможные значения для этого поля являются допустимыми, за исключением ИДЕНТИФИКАТОРа GUID NULL, который имеет значение {00000000-0000-0000-0000-000000000000}. Однако поставщики должны использовать средство создания GUID, например GuidGen.exe, чтобы выбрать GUID при определении расширений.
Значение этого поля определяет структуру поля VendorDefined для конкретного поставщика.
7.9 Запись каталога распределения поставщиков
Запись каталога распределения поставщиков — это неопасная запись вторичного каталога в наборах записей каталогов файлов (см . таблицу 37). Набор записей каталога файлов может содержать любое количество записей каталога распределения поставщиков, вплоть до ограничения записей вторичного каталога, за вычетом количества других записей дополнительного каталога. Кроме того, записи каталога распределения поставщиков действительны только в том случае, если они не предшествуют требуемым записям каталога расширения потока и имени файла.
Записи каталога распределения поставщиков позволяют поставщикам иметь уникальные записи каталога, относящиеся к поставщику, в отдельных наборах записей каталогов файлов с помощью поля VendorGuid (см . таблицу 37). Уникальные записи каталога позволяют поставщикам расширить файловую систему exFAT. Поставщики могут определить содержимое связанных кластеров, если таковые существуют. Реализации поставщиков могут поддерживать содержимое связанных кластеров, если таковые есть, и могут предоставлять функциональные возможности для конкретных поставщиков.
Реализации, которые не распознают GUID записи каталога распределения поставщиков, должны обрабатывать запись каталога так же, как и любую другую нераспознанную неопасную запись вторичного каталога (см. раздел 8.2).
Таблица 37. Каталог распределения поставщиковВыделимая таблица
Имя поля | Offset (байт) |
Размер (байт) |
Комментарии |
---|---|---|---|
EntryType | 0 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.9.1 . |
GeneralSecondaryFlags | 1 | 1 | Это поле является обязательным, а его содержимое определяется в разделе 7.9.2 . |
VendorGuid | 2 | 16 | Это поле является обязательным, а его содержимое определяется в разделе 7.9.3 . |
VendorDefined | 18 | 2 | Это поле является обязательным, и поставщики могут определить его содержимое. |
FirstCluster | 20 | 4 | Это поле является обязательным, а его содержимое определяется в разделе 7.9.4 . |
DataLength | 24 | 8 | Это поле является обязательным, а его содержимое определяется в разделе 7.9.5 . |
7.9.1. Поле EntryType
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1).
7.9.1.1 Поле TypeCode
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.1).
Для записи каталога распределения поставщиков допустимое значение этого поля равно 1.
7.9.1.2 Поле typeImportance
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.2).
Для записи каталога распределения поставщиков допустимое значение этого поля равно 1.
7.9.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Универсального вторичного каталогаEntry (см . раздел 6.4.1.3).
7.9.1.4 InUse Field
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.1.4).
7.9.2. Поле GeneralSecondaryFlags
Поле GeneralSecondaryFlags должно соответствовать определению, указанному в шаблоне Универсальный вторичный каталогEntry (см . раздел 6.4.2) и определяет содержимое зарезервированного поля CustomDefined.
7.9.2.1 AllocationPossible Field
Поле AllocationPossible должно соответствовать определению, указанному в шаблоне Универсальный вторичный каталогEntry (см . раздел 6.4.2.1).
Для записи каталога распределения поставщиков допустимое значение этого поля равно 1.
7.9.2.2 Поле NoFatChain
Поле NoFatChain должно соответствовать определению, указанному в шаблоне Универсальный вторичный каталогEntry (см . раздел 6.4.2.2).
7.9.3. Поле VendorGuid
Поле VendorGuid должно содержать GUID, который однозначно идентифицирует данное распределение поставщика.
Допустимы все возможные значения для этого поля, за исключением GUID null, который имеет значение {00000000-0000-0000-0000-000000000000}. Однако поставщики должны использовать средство создания GUID, например GuidGen.exe, чтобы выбрать GUID при определении расширений.
Значение этого поля определяет структуру содержимого связанных кластеров, если таковые существуют, зависит от поставщика.
7.9.4. Поле FirstCluster
Поле FirstCluster должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.3).
7.9.5 Поле DataLength
Поле DataLength должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см . раздел 6.4.4).
7.10 Запись каталога TexFAT Padding
Эта спецификация, exFAT Revision 1.00 File System Basic Specification, не определяет запись каталога TexFAT Padding. Однако его код типа равен 1, а его важность типа — 1. Реализации этой спецификации должны обрабатывать записи каталога TexFAT Padding так же, как любые другие нераспознанные неопасные записи первичного каталога. Реализации не должны перемещать записи каталога TexFAT Padding.
8 Примечания о реализации
8.1. Рекомендуемый порядок записи
Реализации должны гарантировать, что том максимально устойчив к сбоям питания и другим неизбежным сбоям. При создании новых записей каталога или изменении выделений кластеров реализации, как правило, должны соответствовать следующему порядку записи:
Задайте для поля VolumeDirty значение 1.
При необходимости обновите активный FAT
Обновление активного растрового изображения выделения
При необходимости создайте или обновите запись каталога.
Очистите значение поля VolumeDirty до 0, если его значение до первого шага было 0.
При удалении записей каталога или освобождении кластерных выделений реализации должны соответствовать следующему порядку записи:
Задайте для поля VolumeDirty значение 1.
При необходимости удалите или обновите запись каталога.
При необходимости обновите активный FAT
Обновление активного растрового изображения выделения
Очистите значение поля VolumeDirty до 0, если его значение до первого шага было 0.
8.2. Последствия нераспознанных записей каталога
Будущие спецификации exFAT с тем же основным номером редакции, 1, и номером незначительной редакции, превышающим 0, могут определять новые неопасные записи первичного, критического вторичного и неопасного вторичного каталога. Только спецификации exFAT с более высоким номером основной редакции могут определять новые критически важные записи первичного каталога. Реализации этой спецификации, exFAT Revision 1.00 File System Basic Specification, должны иметь возможность подключения и доступа к любому тому exFAT с основным номером редакции 1 и любым дополнительным номером редакции. Здесь представлены сценарии, в которых реализация может столкнуться с записями каталога, которые она не распознает. Ниже описаны последствия этих сценариев.
Наличие нераспознанных критически важных записей основного каталога в корневом каталоге делает том недействительным. Наличие любой важной записи основного каталога, за исключением записей файлового каталога, в любом некорневом каталоге делает каталог размещения недействительным.
Реализации не должны изменять нераспознанные неопасные записи первичного каталога или связанные с ними выделения кластера. Однако при удалении каталога и только при удалении каталога реализации должны удалять нераспознанные неопасные записи первичного каталога и освобождать все связанные выделения кластера, если таковые есть.
Реализации не должны изменять нераспознанные критически важные записи вторичного каталога или связанные с ними выделения кластеров. Наличие одной или нескольких нераспознанных критически важных записей вторичного каталога в наборе записей каталога делает весь набор записей каталога нераспознанным. При удалении набора записей каталога, содержащего одну или несколько нераспознанных критически важных записей вторичного каталога, реализации должны освобождать все выделения кластера, если таковые имеются, связанные с нераспознанными критически важными записями вторичного каталога. Кроме того, если набор записей каталога описывает каталог, реализации могут:
Переход в каталог
Перечисление записей каталога, содержащихся в нем
Удаление записей автономного каталога
Перемещение записей автономного каталога в другой каталог
Однако реализации не должны:
Изменение содержащихся записей каталога, за исключением удаления, как указано
Создание записей автономного каталога
Открытие записей автономного каталога, за исключением обхода и перечисления, как указано
Реализации не должны изменять нераспознанные записи неопасных вторичных каталогов или связанные с ними выделения кластеров. Реализации должны игнорировать нераспознанные записи неопасных вторичных каталогов. При удалении набора записей каталога реализации должны освобождать все выделения кластера, если таковые есть, связанные с нераспознанными неопасными записями вторичного каталога.
9 Ограничения файловой системы
9.1. Ограничения размера сектора
Поле BytesPerSectorShift определяет нижний и верхний пределы размера сектора (который оценивается как нижний предел: 512 байт; верхний предел: 4096 байт).
9.2. Ограничения размера кластера
Поле SectorsPerClusterShift определяет нижний и верхний пределы размера кластера (нижний предел: 1 сектор; верхний предел: 25 — секторы BytesPerSectorShift, размер которого — 32 МБ).
9.3. Ограничения размера кучи кластера
Кластерная куча должна содержать по крайней мере достаточно места для размещения следующих базовых структур файловой системы: корневой каталог, все растровые карты выделения и таблица up-case.
Более низкий предел размера кластерной кучи является функцией нижнего ограничения размера каждой из базовых структур файловой системы, которые находятся в кластерной куче. Даже при наименьшем возможном кластере (512 байт) каждой из базовых структур файловой системы требуется не более одного кластера. Таким образом, нижний предел: 2 + число кластеров NumberOfFats, которые оцениваются как 3 или 4 кластера в зависимости от значения поля NumberOfFats.
Верхний предел размера кучи кластера — это простая функция максимально возможного числа кластеров, определяемого полем ClusterCount (верхний предел: 232–11 кластеров). Независимо от размера кластера, такая куча кластера имеет достаточно места для размещения по крайней мере базовых структур файловой системы.
9.4. Ограничения размера тома
В поле VolumeLength определяются нижние и верхние пределы размера тома (нижний предел: 220/ 2сектора BytesPerSectorShift, значение которого равно 1 МБ; верхний предел: 264-1 сектор, который, учитывая максимально возможный размер сектора, оценивается примерно в 64ZB). Однако в этой спецификации рекомендуется не более24-2 кластеров в куче кластера (см . раздел 3.1.9). Поэтому рекомендуемый верхний предел тома: ClusterHeapOffset + (224-2) * 2SectorsPerClusterShift. Учитывая максимальный размер кластера ( 32 МБ) и предполагая, что ClusterHeapOffset составляет 96 МБ (достаточно места для основной и резервной загрузки регионов и только первой FAT), рекомендуемый верхний предел тома оценивается примерно в 512 ТБ.
9.5. Ограничения размера каталога
Поле DataLength в записи каталога Stream Extension определяет нижний и верхний пределы размера каталога (нижний предел: 0 байт; верхний предел: 256 МБ). Это означает, что в каталоге может размещаться до 8 388 608 записей каталога (каждая запись каталога занимает 32 байта). С учетом наименьшего возможного набора записей каталога файлов (трех записей каталога), каталог может содержать до 2 796 202 файлов.
Приложение 10
10.1. Глобальные уникальные идентификаторы (GUID)
GUID — это реализация майкрософт универсального уникального идентификатора. GUID — это 128-битовое значение, состоящее из одной группы из 8 шестнадцатеричных цифр, за которой следуют три группы по 4 шестнадцатеричные цифры каждая, а затем одна группа из 12 шестнадцатеричных цифр, например {6B29FC40-CA47-1067-B31D-00DD010662DA}, (см . таблицу 38).
Структура GUID таблицы 38
Имя поля | Offset (байт) |
Размер (байты) |
Комментарии |
---|---|---|---|
Data1 | 0 | 4 | Это поле является обязательным и содержит четыре байта из первой группы GUID (6B29FC40h из примера). |
Data2 | 4 | 2 | Это поле является обязательным и содержит два байта из второй группы GUID (CA47h из примера). |
Data3 | 6 | 2 | Это поле является обязательным и содержит два байта из третьей группы GUID (1067h из примера). |
Data4[0] | 8 | 1 | Это поле является обязательным и содержит наиболее значимый байт из четвертой группы GUID (B3h из примера). |
Data4[1] | 9 | 1 | Это поле является обязательным и содержит наименее значимый байт из четвертой группы GUID (1Dh из примера). |
Data4[2] | 10 | 1 | Это поле является обязательным и содержит первый байт из пятой группы GUID (00h из примера). |
Data4[3] | 11 | 1 | Это поле является обязательным и содержит второй байт из пятой группы GUID (DDh из примера). |
Data4[4] | 12 | 1 | Это поле является обязательным и содержит третий байт из пятой группы GUID (01h из примера). |
Data4[5] | 13 | 1 | Это поле является обязательным и содержит четвертый байт из пятой группы GUID (06h из примера). |
Data4[6] | 14 | 1 | Это поле является обязательным и содержит пятый байт из пятой группы GUID (62h из примера). |
Data4[7] | 15 | 1 | Это поле является обязательным и содержит шестой байт из пятой группы GUID (DAh из примера). |
10.2 Таблицы секций
Чтобы обеспечить взаимодействие томов exFAT в широком наборе сценариев использования, реализации должны использовать тип секции 07h для хранилища с секционированием MBR и GUID секции {EBD0A0A2-B9E5-4433-87C0-68B6B72699C7} для секционированного хранилища GPT.
11 Журнал изменений документации
В таблице 39 описывается история выпусков, исправлений в, дополнений, удалений из этого документа и уточнений.
Журнал изменений документации в таблице 39
Дата | Описание изменения |
---|---|
8 января 2008 г. | Первый выпуск базовой спецификации, которая включает в себя: Раздел 1. Введение Раздел 2, Раздел 3. Основной и Резервный загрузочные регионы Раздел 4. Область таблицы выделения файлов Раздел 5. Область данных Раздел 6. Структура каталогов Раздел 7. Определения записей каталога Раздел 8. Примечания о реализации Раздел 9. Ограничения файловой системы Раздел 10, приложение |
8 июня 2008 г. | Второй выпуск базовой спецификации, который включает следующие изменения: Добавление раздела 11, Добавление записей расширения поставщика и каталога распределения поставщиков в разделах 7.8 и 7.9 Добавление таблицы рекомендуемых вариантов в разделах 7.2.5 и 7.2.5.1 Добавление полей UtcOffset в разделе 7.4 и добавление аббревиатуры UTC в разделе 1.3 Исправление размера поля CustomDefined в таблице 19 Исправление допустимого диапазона значений NameLength в разделе 7.6.3 Исправление и уточнение полей Timestamp и 10msIncrement в разделе 7.4 Уточнение структуры параметров NULL в разделе 3.3 Уточнение значения значений поля NoFatChain в разделе 6.3.4.2 Уточнение значения значений поля DataLength в разделе 6.2.3 Уточнение поля VolumeDirty в разделе 3.1.13.2 и рекомендуемое упорядочение записи в разделе 8.1 Уточнение поля MediaFailure в разделе 3.1.13.3 |
01 октября 2008 г. | Третий выпуск базовой спецификации, который включает следующие изменения: Добавление в пояснения на местах о том, что должны, должны и могут быть добавлены Добавление определения UTC в раздел 1.3 таблицы 2 Изменены разделы 1.5, чтобы обеспечить соответствие с документом спецификации TexFAT. Уточнено ограничение, согласно которому только корпорация Майкрософт может определять макет записей каталога в разделе 6.2. Добавлено уточнение о том, что поле FirstCluster должно быть равным нулю, если DataLength равно нулю и NoFatChain имеет значение Раздел 6.3.5 и Раздел 6.4.3 Уточнены требования к допустимым записям каталога файлов в разделе 7.4 В раздел 7.7 добавлено требование для уникальных имен файлов и каталогов. Добавлена заметка о реализации ASCII в конце раздела 7.7.3. |
1 января 2009 г. | Четвертый выпуск базовой спецификации, который включает следующие изменения: Удалены ссылки на записи Windows CE контроль доступа Добавлено уточнение в раздел 7.2.5.1, в соответствии с которым явно требуется полная таблица с учетом регистра |
02 сентября 2009 г. | Пятый выпуск базовой спецификации, который включает следующие изменения: Изменение форматирования документа для улучшения преобразования PDF |
24 февраля 2010 г. | Шестой выпуск базовой спецификации, который включает следующие изменения: Изменено неверное утверждение: "Поле FirstCluster должно быть равно нулю, если DataLength равно нулю и NoFatChain задано" в разделе 6.3.5 и разделе 6.4.3 до "Если бит NoFatChain равен 1, FirstCluster должен указывать на допустимый кластер в куче кластера", чтобы уточнить, что при использовании бита NoFatChain задано допустимое выделение. Добавлено значение "Если бит NoFatChain равен 1, dataLength не должен быть равен нулю. Если поле FirstCluster равно нулю, dataLength также должен быть равен нулю" в разделе 6.3.6 и разделе 6.4.4, чтобы уточнить, что должно быть допустимое выделение, если задан бит NoFatChain. Уведомление об авторских правах обновлено до 2010 г. |
26 августа 2019 г. | Седьмой выпуск базовой спецификации, который включает следующие изменения: Обновлены юридические термины, относящиеся к спецификации, в том числе: Удаление конфиденциального уведомления Майкрософт Удаление раздела лицензионного соглашения технической документации корпорации Майкрософт Уведомление об авторских правах обновлено до 2019 г. |
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделе:Отправить и просмотреть отзыв по