Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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 | Расширяемая таблица выделения файлов |
| ЖИР | Таблица выделения файлов |
| FAT12 | Таблица выделения файлов, 12-разрядные индексы кластера |
| FAT16 | Таблица выделения файлов, 16-разрядные индексы кластера |
| FAT32 | Таблица выделения файлов, 32-разрядные индексы кластера |
| GPT | Таблица секционирования GUID |
| GUID | Глобальный уникальный идентификатор (см. раздел раздел 10.1) |
| ИНТ | Прерывать |
| MBR | Главная загрузочная запись |
| texFAT | Транзакциобезопасный exFAT |
| UTC | Координированное универсальное время |
1.4 Квалификаторы полей и структур по умолчанию
Поля и структуры в этой спецификации имеют следующие квалификаторы (см. список ниже), если в противном случае не указаны заметки спецификации.
Неназначенные
Используйте десятичную нотацию для описания значений, в которых не указано в противном случае; Эта спецификация использует букву "h" после исправления для обозначения шестнадцатеричных чисел и заключает идентификаторы GUID в фигурные скобки
В маленьком формате
Не требуется символ, завершающий значение NULL для строк
1.5 Windows CE и TexFAT
TexFAT — это расширение для exFAT, которое добавляет семантику операций, безопасную для транзакций, поверх базовой файловой системы. TexFAT используется Windows CE. Для использования в транзакциях требуется использование двух FAT и растровых карт выделения. Он также определяет несколько дополнительных структур, включая дескрипторы заполнения и дескрипторы безопасности.
Структура томов 2
Том — это набор всех структур файловой системы и пространства данных, необходимых для хранения и извлечения пользовательских данных. Все тома exFAT содержат четыре региона (см. таблицу 3 ).
структуры томов таблицы 3
| имя подрегионов | смещения (сектор) |
размера (секторы) |
примечания |
|---|---|---|---|
| основной области загрузки | |||
| Основной загрузочный сектор | 0 | 1 | Этот подрегион является обязательным и раздела 3.1 определяет его содержимое. |
| Основные расширенные секторы загрузки | 1 | 8 | Этот подрегион является обязательным и раздела 3.2) определяет его содержимое. |
| Основные параметры OEM | 9 | 1 | Этот подрегион является обязательным и раздела 3.3 определяет его содержимое. |
| Основной зарезервированный | 10 | 1 | Этот подрегион является обязательным, а его содержимое зарезервировано. |
| Основная контрольная сумма загрузки | 11 | 1 | Этот подрегион является обязательным и раздела 3.4 определяет его содержимое. |
| регион загрузки резервного копирования | |||
| Загрузочный сектор резервного копирования | 12 | 1 | Этот подрегион является обязательным и раздела 3.1 определяет его содержимое. |
| Расширенные секторы загрузки резервного копирования | 13 (тринадцать) | 8 | Этот подрегион является обязательным и раздела 3.2 определяет его содержимое. |
| Параметры OEM резервного копирования | двадцать один | 1 | Этот подрегион является обязательным и раздела 3.3 определяет его содержимое. |
| Резервная копия зарезервирована | двадцать два | 1 | Этот подрегион является обязательным, а его содержимое зарезервировано. |
| Контрольная сумма загрузки резервного копирования | двадцать три | 1 | Этот подрегион является обязательным и раздела 3.4 определяет его содержимое. |
| регион FAT | |||
| Выравнивание FAT | двадцать четыре | FatOffset — 24 | Этот подрегион является обязательным и его содержимое, если таковые имеются, не определены. Примечание. Секторы основной и резервной загрузки содержат поле FatOffset. |
| Первый FAT | FatOffset | FatLength | Этот подрегион является обязательным и раздел 4.1 определяет его содержимое. Примечание. Секторы основной и резервной загрузки содержат поля FatOffset и FatLength. |
| Второй FAT | FatOffset + FatLength | FatLength * (NumberOfFats – 1) | Этот подрегион является обязательным и раздел 4.1 определяет его содержимое, если таковые есть. Примечание. Секторы основной и резервной загрузки содержат поля FatOffset, FatLength и NumberOfFats. Поле NumberOfFats может содержать только значения 1 и 2. |
| области данных | |||
| Выравнивание кучи кластера | СмещениеЖира + ДлинаЖира * КоличествоЖиров | ClusterHeapOffset — (FatOffset + FatLength * NumberOfFats) | Этот подрегион является обязательным и его содержимое, если таковые имеются, не определены. Примечание. Основные и резервные секторы загрузки содержат поля FatOffset, FatLength, NumberOfFats и ClusterHeapOffset. Допустимые значения поля NumberOfFats : 1 и 2. |
| Куча кластера | ClusterHeapOffset | ClusterCount * 2SectorsPerClusterShift | Этот подрегион является обязательным и раздел 5.1 определяет его содержимое. Примечание. Основные и резервные секторы загрузки содержат поля ClusterHeapOffset, ClusterCount и SectorsPerClusterShift. |
| Избыточное пространство | ClusterHeapOffset + ClusterCount * 2SectorsPerClusterShift | VolumeLength — (ClusterHeapOffset + ClusterCount * 2SectorsPerClusterShift) | Этот подрегион является обязательным и его содержимое, если таковые имеются, не определены. Примечание. Основные и резервные секторы загрузки содержат поля ClusterHeapOffset, ClusterCount, SectorsPerClusterShift и VolumeLength. |
3 Основные и резервные области загрузки
Основной регион загрузки предоставляет все необходимые инструкции по загрузочному обвязке, идентификации сведений и параметров файловой системы, чтобы обеспечить реализацию для выполнения следующих действий:
- Загрузочная ремешка компьютерной системы из тома exFAT.
- Определите файловую систему в томе как exFAT.
- Узнайте расположение структур файловой системы exFAT.
Область загрузки резервного копирования — это резервная копия основной области загрузки. Он помогает восстановить том exFAT в случае того, что основной регион загрузки в несогласованном состоянии. За исключением редких обстоятельств, таких как обновление инструкций по обвязке загрузки, реализации не должны изменять содержимое области загрузки резервного копирования.
3.1 Основной и резервный загрузочный сектор подрегиационные регионы
Основной загрузочный сектор содержит код для загрузочного обвязки из тома exFAT и основных параметров exFAT, описывающих структуру тома (см. таблицу 4). BIOS, MBR или другие агенты с загрузочными обвязками могут проверять этот сектор и загружать и выполнять все инструкции по загрузочному обвязке, содержащиеся в нем.
Сектор загрузки резервного копирования — это резервная копия основного загрузочного сектора и имеет ту же структуру (см. таблицу 4). Резервный загрузочный сектор может помочь в операциях восстановления; однако реализации должны рассматривать содержимое полей VolumeFlags и PercentInUse как устаревшие.
Перед использованием содержимого основного или резервного сектора загрузки реализация должна проверить их содержимое, проверяя соответствующую контрольную сумму загрузки и гарантируя, что все поля находятся в допустимом диапазоне значений.
Хотя начальная операция форматирования инициализирует содержимое основных и резервных загрузочных секторов, реализации могут обновлять эти секторы (а также обновлять соответствующие контрольные суммы загрузки) по мере необходимости. Однако реализации могут обновлять поля VolumeFlags или PercentInUse без обновления соответствующей контрольной суммы загрузки (контрольная сумма специально исключает эти два поля).
таблица 4 Main и структура загрузочного сектора резервного копирования
| имени поля | смещения (байт) |
размера (байты) |
примечания |
|---|---|---|---|
| JumpBoot | 0 | 3 | Это поле является обязательным и раздел 3.1.1 определяет его содержимое. |
| ИмяФайловойСистемы | 3 | 8 | Это поле является обязательным и раздела 3.1.2 определяет его содержимое. |
| MustBeZero | 11 | 53 | Это поле является обязательным и раздела 3.1.3 определяет его содержимое. |
| СмещениеРаздела | 64 | 8 | Это поле является обязательным и раздел 3.1.4 определяет его содержимое. |
| ДлинаОбъема | 72 | 8 | Это поле является обязательным и раздел 3.1.5 определяет его содержимое. |
| FatOffset | 80 | 4 | Это поле является обязательным и раздел 3.1.6 определяет его содержимое. |
| FatLength | 84 | 4 | Это поле является обязательным и раздел 3.1.7 определяет его содержимое. |
| ClusterHeapOffset | 88 | 4 | Это поле является обязательным и раздел 3.1.8 определяет его содержимое. |
| КоличествоКластеров | 92 | 4 | Это поле является обязательным и раздела 3.1.9 определяет его содержимое. |
| FirstClusterOfRootDirectory | 96 | 4 | Это поле является обязательным и раздел 3.1.10 определяет его содержимое. |
| VolumeSerialNumber | 100 | 4 | Это поле является обязательным и раздел 3.1.11 определяет его содержимое. |
| FileSystemRevision | 104 | 2 | Это поле является обязательным и раздел 3.1.12 определяет его содержимое. |
| VolumeFlags | 106 | 2 | Это поле является обязательным и раздел 3.1.13 определяет его содержимое. |
| БайтыНаСекторСдвиг | 108 | 1 | Это поле является обязательным и раздел 3.1.14 определяет его содержимое. |
| SectorsPerClusterShift | 109 | 1 | Это поле является обязательным и раздел 3.1.15 определяет его содержимое. |
| NumberOfFats | 110 | 1 | Это поле является обязательным и раздел 3.1.16 определяет его содержимое. |
| DriveSelect | 111 | 1 | Это поле является обязательным и раздела 3.1.17 определяет его содержимое. |
| ПроцентИспользования | 112 | 1 | Это поле является обязательным и раздел 3.1.18 определяет его содержимое. |
| Скрытный | 113 | 7 | Это поле является обязательным и его содержимое зарезервировано. |
| Загрузочный код | 120 | 390 | Это поле является обязательным и раздел 3.1.19 определяет его содержимое. |
| BootSignature | 510 | 2 | Это поле является обязательным и раздела 3.1.20 определяет его содержимое. |
| Избыточное пространство | 512 | 2BytesPerSectorShift – 512 | Это поле является обязательным и его содержимое, если таковые имеются, не определены. Примечание. Оба сектора загрузки основного и резервного копирования содержат поле BytesPerSectorShift. |
3.1.1 JumpBoot Поле
Поле JumpBoot должно содержать инструкцию по переходу для ЦП, распространенных на персональных компьютерах, которые при выполнении ЦП прыгает цП для выполнения инструкций по загрузочному обвязке в поле BootCode.
Допустимое значение этого поля (в порядке низкого порядка байтов к байтам высокого порядка) EBh 76h 90h.
Поле FileSystemName 3.1.2
Поле FileSystemName должно содержать имя файловой системы в томе.
Допустимое значение этого поля в символах ASCII — EXFAT, включающее три конечных пробела.
3.1.3 Поле MustBeZero
Поле MustBeZero должно напрямую соответствовать диапазону байтов упакованный блок параметров BIOS, используемый в томах FAT12/16/32.
Допустимое значение этого поля равно 0, что помогает предотвратить ошибочное подключение тома EXFAT для FAT12/16/32.
Поле PartitionOffset 3.1.4
Поле PartitionOffset должно описать смещение относительного сектора мультимедиа секции, в которой размещается заданный том exFAT. Это поле помогает загрузочному обвязке из тома с помощью расширенного inT 13h на персональных компьютерах.
Допустимы все возможные значения этого поля; Однако значение 0 указывает, что реализации должны игнорировать это поле.
Поле VolumeLength 3.1.5
Поле VolumeLength должно описать размер заданного тома exFAT в секторах.
Допустимый диапазон значений для этого поля должен быть следующим:
По крайней мере 220/ 2BytesPerSectorShift, что гарантирует, что наименьший объем не меньше 1 МБ
Не более 264– 1, самое большое значение этого поля можно описать.
Однако если размер подрегион избыточного пространства равен 0, то наибольшее значение этого поля — ClusterHeapOffset + (232–11) *2SectorsPerClusterShift.
3.1.6 Поле FatOffset
Поле FatOffset должно описать смещение относительного объема сектора первого FAT. Это поле позволяет реализовать реализацию для выравнивания первого FAT с характеристиками базового носителя хранения.
Допустимый диапазон значений для этого поля должен быть следующим:
- По крайней мере 24, которые учитывают секторы, которые используют регионы основной загрузки и резервного копирования загрузки
- По крайней мере ClusterHeapOffset — (FatLength * NumberOfFats), который учитывает секторы, которые используют кучу кластера.
3.1.7 Поле FatLength
Поле FatLength должно описать длину в секторах каждой таблицы FAT (объем может содержать до двух FAT).
Допустимый диапазон значений для этого поля должен быть следующим:
- По крайней мере (ClusterCount + 2) * 22/ 2BytesPerSectorShiftокругляется до ближайшего целого числа, что гарантирует, что каждый FAT имеет достаточно места для описания всех кластеров в куче кластера.
- В большинстве случаев (ClusterHeapOffset — FatOffset) / NumberOfFats округляется до ближайшего целого числа, что гарантирует, что fats существуют до кучи кластера
Это поле может содержать значение, превышающее его нижней границы (как описано выше), чтобы включить второй FAT, если он присутствует, также должен быть выровнен с характеристиками базового носителя хранилища. Содержимое пространства, превышающее то, что требуется для САМОГО FAT, если таковые имеются, не определены.
Поле ClusterHeapOffset 3.1.8
Поле ClusterHeapOffset должно описать смещение относительного объема кластера. Это поле позволяет реализовать реализацию для выравнивания кучи кластера с характеристиками базового носителя хранилища.
Допустимый диапазон значений для этого поля должен быть следующим:
- По крайней мере FatOffset + FatLength * NumberOfFats, чтобы учитывать секторы всех предыдущих регионов потребляют
- Не более 232- 1 или VolumeLength - (ClusterCount * 2SectorsPerClusterShift), в зависимости от того, какие вычисления меньше
Поле ClusterCount 3.1.9
Поле ClusterCount должно описать количество кластеров, содержащих кучу кластера.
Допустимое значение для этого поля должно быть меньше следующего:
- (VolumeLength — ClusterHeapOffset) / 2SectorsPerClusterShiftокругляется до ближайшего целого числа, что именно количество кластеров, которые могут соответствовать началу кучи кластера и концу тома.
- 232– 11, что является максимальным числом кластеров, которые могут описать FAT
Значение поля ClusterCount определяет минимальный размер FAT. Чтобы избежать чрезвычайно больших fats, реализации могут контролировать количество кластеров в куче кластера, увеличив размер кластера (с помощью поля SectorsPerClusterShift). Эта спецификация рекомендует не более 224— 2 кластера в куче кластера. Однако реализации должны обрабатывать тома до 232- 11 кластеров в куче кластера.
Поле FirstClusterOfRootDirectory
Поле FirstClusterOfRootDirectory должно содержать индекс кластера первого кластера корневого каталога. Корневой каталог всегда должен быть описан с цепочкой кластеров в активном FAT, как если бы он был описан с записью каталога, где флаг NoFatChain поля GeneralPrimaryFlags равным нулю (см. раздел 6.3.4.2). Длина данных корневого каталога всегда определяется путем загрузки цепочки кластеров. Реализации должны предпринять все усилия, чтобы разместить первый кластер корневого каталога в первом неисправном кластере после того, как кластеры используют растровое изображение выделения и таблицу up-case.
Допустимый диапазон значений для этого поля должен быть следующим:
- По крайней мере 2 индекс первого кластера в куче кластера
- В большинстве случаев ClusterCount + 1 индекс последнего кластера в куче кластера
Поле 3.1.11 VolumeSerialNumber
Поле VolumeSerialNumber должно содержать уникальный серийный номер. Это помогает реализовать различия между различными томами exFAT. Реализации должны создавать серийный номер, сочетая дату и время форматирования тома exFAT. Механизм объединения даты и времени для формирования серийного номера зависит от реализации.
Допустимы все возможные значения этого поля.
3.1.12 Поле FileSystemRevision
Поле FileSystemRevision должно описать основные и незначительные номера редакций структур exFAT в заданном томе.
Байт высокого порядка — это основной номер редакции, а байт низкого порядка — незначительный номер редакции. Например, если байт высокого порядка содержит значение 01h, а если байт низкого порядка содержит значение 05h, то поле FileSystemRevision описывает номер редакции 1.05. Аналогичным образом, если байт высокого порядка содержит значение 0Ah и если байт низкого порядка содержит значение 0Fh, то поле FileSystemRevision описывает номер редакции 10,15.
Допустимый диапазон значений для этого поля должен быть следующим:
- По крайней мере 0 для байтов низкого порядка и 1 для байтов высокого порядка
- Не более 99 для байтов низкого порядка и 99 для байтов высокого порядка
Номер редакции exFAT, описывающий эту спецификацию, равен 1.00. Реализации этой спецификации должны подключать любой том exFAT с основным номером редакции 1 и не подключать любой том exFAT с любым другим основным номером редакции. Реализации должны учитывать незначительный номер редакции и не должны выполнять операции или создавать какие-либо структуры файловой системы, не описанные в соответствующей спецификации дополнительного номера редакции.
Поле VolumeFlags 3.1.13
Поле VolumeFlags должно содержать флаги, указывающие состояние различных структур файловой системы на томе exFAT (см. таблице 5).
Реализации не должны включать это поле при вычислении соответствующей контрольной суммы основной загрузки или резервной загрузки. При обращении к сектору загрузки резервного копирования реализация должна рассматривать это поле как устаревшее.
таблице 5 VolumeFlags Field Structure
| имени поля | смещения (бит) |
размера (биты) |
примечания |
|---|---|---|---|
| ActiveFat | 0 | 1 | Это поле является обязательным и раздел 3.1.13.1 определяет его содержимое. |
| VolumeDirty | 1 | 1 | Это поле является обязательным и раздел 3.1.13.2 определяет его содержимое. |
| MediaFailure | 2 | 1 | Это поле является обязательным и раздел 3.1.13.3 определяет его содержимое. |
| ClearToZero | 3 | 1 | Это поле является обязательным и раздел 3.1.13.4 определяет его содержимое. |
| Скрытный | 4 | 12 | Это поле является обязательным и его содержимое зарезервировано. |
Поле ActiveFat 3.1.1.1.1
Поле ActiveFat должно описать, какие растровые карты FAT и выделения являются активными (и реализации должны использоваться), как показано ниже.
- 0, что означает, что первая растровая карта распределения и первый жир являются активными
- 1, что означает, что вторая растровая карта распределения fat и второй выделений активна и возможна только в том случае, если поле NumberOfFats содержит значение 2
Реализации должны рассматривать неактивные растровые изображения FAT и выделения как устаревшие. Только реализации с поддержкой TexFAT должны переключать активные растровые карты FAT и выделения (см. раздел 7.1).
Поле VolumeDirty 3.1.13.2
Поле VolumeDirty должно описать, является ли том грязным или нет, как показано ниже.
- 0, что означает, что объем, вероятно, находится в согласованном состоянии
- 1, что означает, что объем, вероятно, находится в несогласованном состоянии
Реализации должны задать значение этого поля равным 1 при обнаружении несоответствий метаданных файловой системы, которые они не разрешают. Если при подключении тома значение этого поля равно 1, то только реализации, разрешающие несоответствия метаданных файловой системы, могут очистить значение этого поля до 0. Такие реализации должны очищать значение этого поля до 0 после обеспечения согласованного состояния файловой системы.
Если при подключении тома значение этого поля равно 0, реализации должны задать это поле равным 1, прежде чем обновлять метаданные файловой системы и очищать это поле до 0 после этого, аналогично рекомендуемой последовательности записи, описанной в разделе .8.1.
3.1.13.3 Поле MediaFailure
Поле MediaFailure должно описать, обнаружена ли реализация сбоев мультимедиа, как показано ниже.
- 0, что означает, что носитель размещения не сообщил о сбоях или известных сбоях уже записаны в FAT как "плохие" кластеры
- 1, что означает, что носитель размещения сообщил о сбоях (т. е. произошел сбой операций чтения или записи).
Реализация должна задать для этого поля значение 1, если:
- Не удается получить доступ к любому региону в томе.
- Реализация исчерпала алгоритмы повторных попыток доступа, если таковые имеются.
Если при подключении тома значение этого поля равно 1, реализации, которые сканируют весь том для сбоев мультимедиа и записывают все сбои как "плохие" кластеры в FAT (или в противном случае устраняют сбои мультимедиа) могут очистить значение этого поля до 0.
3.1.13.4 Поле ОчиститьДоНуля
Поле ClearToZero не имеет значительного значения в этой спецификации.
Допустимые значения для этого поля:
- 0, который не имеет определенного значения
- 1, что означает, что реализации должны очистить это поле до 0 до изменения любых структур файловой системы, каталогов или файлов.
3.1.14 Поле BytesPerSectorShift
Поле BytesPerSectorShift должно описать байты для каждого сектора, выраженные как журнал2(N), где N — это число байтов на сектор. Например, для 512 байт на сектор значение этого поля равно 9.
Допустимый диапазон значений для этого поля должен быть следующим:
- По крайней мере 9 (размер сектора 512 байт), который является наименьшим сектором, возможным для тома exFAT
- Не более 12 (размер сектора 4096 байт), который является размером страницы памяти ЦП, распространенных на персональных компьютерах
3.1.15 Поле SectorsPerClusterShift
Поле SectorsPerClusterShift должно описать секторы для каждого кластера, выраженные как журнал2(N), где N — число секторов на кластер. Например, для 8 секторов на кластер значение этого поля равно 3.
Допустимый диапазон значений для этого поля должен быть следующим:
- По крайней мере 0 (1 сектор на кластер), что является самым маленьким кластером
- Не более 25 — BytesPerSectorShift, который оценивается в размере 32 МБ кластера.
Поле 3.1.16 NumberOfFats
Поле NumberOfFats должно описать количество fats и растровых карт выделения, содержащихся в томе.
Допустимый диапазон значений для этого поля должен быть следующим:
- 1, указывающее, что том содержит только первую растровую карту распределения FAT и первого выделения.
- 2, указывающее, что том содержит первый FAT, второй FAT, растровое изображение первого выделения и растровое изображение второго выделения; это значение допустимо только для томов TexFAT
3.1.17 Поле выбора привода
Поле DriveSelect должно содержать расширенный номер диска INT 13h, который помогает загрузочному обвязке из этого тома с помощью расширенного INT 13h на персональных компьютерах.
Допустимы все возможные значения этого поля. Аналогичные поля в предыдущих файловых системах на основе FAT часто содержат значение 80h.
Поле 3.1.18 PercentInUse
Поле PercentInUse должно описать процент кластеров в куче кластера, которые выделены.
Допустимый диапазон значений для этого поля должен быть следующим:
- От 0 до 100 включительно, что является процентом выделенных кластеров в куче кластера, округляя до ближайшего целого числа.
- Точно FFh, указывающий процент выделенных кластеров в куче кластера недоступен
Реализации должны изменить значение этого поля, чтобы отразить изменения в выделении кластеров в куче кластера или изменить его на FFh.
Реализации не должны включать это поле при вычислении соответствующей контрольной суммы основной загрузки или резервной загрузки. При обращении к сектору загрузки резервного копирования реализация должна рассматривать это поле как устаревшее.
Поле начального кода 3.1.19
Поле BootCode должно содержать инструкции по загрузочному обвязке. Реализации могут заполнять это поле инструкциями ЦП, необходимыми для загрузочного привязывания к компьютерной системе. Реализации, которые не предоставляют инструкции по загрузочному обвязке, должны инициализировать каждый байт в этом поле до F4h (инструкция остановки для ЦП, распространенных на персональных компьютерах) в рамках их операции форматирования.
3.1.20 Поле BootSignature
Поле BootSignature должно описать, является ли намерение данного сектора для него загрузочным сектором или нет.
Допустимое значение этого поля — AA55h. Любое другое значение в этом поле делает недействительным соответствующий загрузочный сектор. Реализации должны проверять содержимое этого поля перед любым другим полем в соответствующем секторе загрузки.
3.2. Основные и резервные резервные секторы расширенных загрузочных секторов
Каждый сектор основных секторов расширенной загрузки имеет одинаковую структуру; однако каждый сектор может содержать отдельные инструкции по загрузочному обвязке (см. таблицу 6). Агенты обвязки загрузки, такие как инструкции по загрузочному обвязке в главном секторе загрузки, альтернативные реализации BIOS или встроенное ПО встроенного ПО системы, могут загружать эти секторы и выполнять содержащиеся в них инструкции.
Секторы расширенной загрузки резервного копирования — это резервная копия основных расширенных загрузочных секторов и имеет ту же структуру (см. таблицу 6).
Перед выполнением инструкций для секторов основной или резервной копии расширенных загрузочных секторов реализация должна проверить их содержимое, убедившись, что поле ExtendedBootSignature каждого сектора содержит его предписанное значение.
Хотя начальная операция форматирования инициализирует содержимое основных и резервных секторов расширенной загрузки, реализации могут обновлять эти секторы (а также обновлять соответствующую контрольную сумму загрузки) по мере необходимости.
таблице 6 Расширенные структуры сектора загрузки
| имени поля | смещения (байт) |
размера (байты) |
примечания |
|---|---|---|---|
| ExtendedBootCode | 0 | 2BytesPerSectorShift – 4 | Это поле является обязательным и раздела 3.2.1 определяет его содержимое. Примечание. Оба сектора загрузки основного и резервного копирования содержат поле BytesPerSectorShift. |
| ExtendedBootSignature | 2BytesPerSectorShift – 4 | 4 | Это поле является обязательным и раздел 3.2.2.2 определяет его содержимое. Примечание. Оба сектора загрузки основного и резервного копирования содержат поле BytesPerSectorShift. |
Поле ExtendedBootCode 3.2.1
Поле ExtendedBootCode должно содержать инструкции по загрузочному обвязке. Реализации могут заполнять это поле инструкциями ЦП, необходимыми для загрузочного привязывания к компьютерной системе. Реализации, которые не предоставляют инструкции по загрузочному обвязке, должны инициализировать каждый байт в этом поле до 00h в рамках операции форматирования.
Поле ExtendedBootSignature 3.2.2
Поле ExtendedBootSignature должно описать, является ли это намерением данного сектора быть расширенный загрузочный сектор или нет.
Допустимое значение этого поля — AA550000h. Любое другое значение в этом поле недействительно определяет соответствующий сектор главного или расширенного загрузки резервного копирования. Реализации должны проверять содержимое этого поля перед любым другим полем в соответствующем расширенном секторе загрузки.
3.3 Основные и резервные параметры OEM-регионов
Подрегион основных параметров OEM содержит десять структур параметров, которые могут содержать сведения о производителях (см. таблицу 7). Каждая из десяти структур параметров является производным от шаблона универсальных параметров (см. раздел 3.3.2). Производители могут наследовать собственные пользовательские структуры параметров из шаблона универсальных параметров. Эта спецификация определяет две структуры параметров: Null Parameters (см. раздел 3.3.3) и параметры флэш-памяти (см. раздел 3.3.4).
Параметры OEM резервного копирования — это резервная копия основных параметров OEM и имеет ту же структуру (см. таблицу 7).
Перед использованием содержимого параметров основного или резервного копирования OEM реализация должна проверить их содержимое, проверяя соответствующую контрольную сумму загрузки.
Производители должны заполнять параметры основного и резервного копирования OEM собственными настраиваемыми структурами параметров, если таковые имеются, и любыми другими структурами параметров. Последующие операции форматирования должны сохранять содержимое параметров основного и резервного копирования OEM.
Реализации могут обновлять параметры основного и резервного копирования OEM по мере необходимости (а также обновлять соответствующую контрольную сумму загрузки).
таблица 7 параметров OEM
| имени поля | смещения (байт) |
размера (байты) |
примечания |
|---|---|---|---|
| Параметры[0] | 0 | 48 | Это поле является обязательным и раздел 3.3.1 определяет его содержимое. |
. . . |
. . . |
. . . |
. . . |
| Параметры[9] | 432 | 48 | Это поле является обязательным и раздел 3.3.1 определяет его содержимое. |
| Скрытный | 480 | 2BytesPerSectorShift – 480 | Это поле является обязательным и его содержимое зарезервировано. Примечание. Оба сектора загрузки основного и резервного копирования содержат поле BytesPerSectorShift. |
3.3.1 Параметры[0] ... Параметры[9]
Каждое поле "Параметры" в этом массиве содержит структуру параметров, которая является производным от шаблона универсальных параметров (см. раздел раздел 3.3.2). Любое поле неиспользуемых параметров должно быть описано как содержащее структуру null параметров (см. разделе 3.3.3).
Шаблон универсальных параметров 3.3.2
Шаблон универсальных параметров предоставляет базовое определение структуры параметров (см. таблицу 8). Все структуры параметров являются производными от этого шаблона. Поддержка этого шаблона универсальных параметров является обязательной.
шаблона универсальных параметров таблицы 8
| имени поля | смещения (байт) |
размера (байты) |
примечания |
|---|---|---|---|
| ParametersGuid | 0 | 16 | Это поле является обязательным и раздела 3.3.2.1 определяет его содержимое. |
| ПользовательскоеОпределение | 16 | 32 | Это поле является обязательным и структуры, производные от этого шаблона, определяют его содержимое. |
3.3.2.1 Поле ParametersGuid
Поле ParametersGuid должно описать GUID, который определяет макет оставшейся части заданной структуры параметров.
Допустимы все возможные значения этого поля; Однако производители должны использовать средство создания GUID, например GuidGen.exe, для выбора GUID при создании пользовательских структур параметров из этого шаблона.
3.3.3 Пустые параметры
Структура null параметров является производным от шаблона универсальных параметров (см. раздел 3.3.3.2) и описывает поле неиспользуемых параметров (см. таблицу 9). При создании или обновлении структуры параметров OEM реализация должна заполнять поля неиспользуемых параметров структурой null Parameters. Кроме того, при создании или обновлении структуры параметров OEM реализация должна консолидировать структуры NULL Parameters в конце массива, тем самым оставляя все другие структуры параметров в начале структуры параметров OEM.
Поддержка структуры параметров NULL является обязательной.
таблице 9 Null Parameters Structure
| имени поля | смещения (байт) |
размера (байты) |
примечания |
|---|---|---|---|
| ParametersGuid | 0 | 16 | Это поле является обязательным и раздел 3.3.3.1 определяет его содержимое. |
| Скрытный | 16 | 32 | Это поле является обязательным и его содержимое зарезервировано. |
3.3.3.1 Поле ParametersGuid
Поле ParametersGuid должно соответствовать определению, предоставленному шаблоном универсальных параметров (см. раздел 3.3.3.2.1).
Допустимое значение этого поля в нотации GUID {00000000-0000-0000-0000-000000000000}.
Параметры флэш-памяти 3.3.4
Структура параметра Flash является производным от шаблона универсальных параметров (см. раздел 3.3.3.2) и содержит параметры для флэш-носителя (см. таблицу 10 ). Производители устройств хранения на основе флэш-памяти могут заполнять поле "Параметры" (предпочтительно поле "Параметры[0] этой структурой параметров. Реализации могут использовать сведения в структуре параметров Flash для оптимизации операций доступа во время операций чтения и записи и выравнивания структур файловой системы во время форматирования носителя.
Поддержка структуры параметров Flash является необязательной.
Структура параметров флэш-памяти таблицы 10
| имени поля | смещения (байт) |
размера (байты) |
примечания |
|---|---|---|---|
| ParametersGuid | 0 | 16 | Это поле является обязательным и раздел 3.3.4.1 определяет его содержимое. |
| EraseBlockSize | 16 | 4 | Это поле является обязательным и раздел 3.3.4.2 определяет его содержимое. |
| РазмерСтраницы | 20 | 4 | Это поле является обязательным и раздел 3.3.4.3 определяет его содержимое. |
| Запасные секторы | двадцать четыре | 4 | Это поле является обязательным и раздел 3.3.4.4 определяет его содержимое. |
| время выборочного доступа | 28 | 4 | Это поле является обязательным и раздел 3.3.4.5 определяет его содержимое. |
| ПрограммированиеTime | 32 | 4 | Это поле является обязательным и раздел 3.3.4.6 определяет его содержимое. |
| ReadCycle | 36 | 4 | Это поле является обязательным и раздел 3.3.4.7 определяет его содержимое. |
| WriteCycle | 40 | 4 | Это поле является обязательным и раздел 3.3.4.8 определяет его содержимое. |
| Скрытный | 44 | 4 | Это поле является обязательным и его содержимое зарезервировано. |
Допустимы все возможные значения для всех полей Flash Parameters, кроме поля ParametersGuid. Однако значение 0 указывает, что поле на самом деле бессмысленно (реализации должны игнорировать заданное поле).
Поле параметров 3.3.4.1
Поле ParametersGuid должно соответствовать определению, указанному в шаблоне универсальных параметров (см. раздел 3.3.2.1).
Допустимое значение этого поля в нотации GUID — {0A0C7E46-3399-4021-90C8-FA6D389C4BA2}.
3.3.4.2 Поле EraseBlockSize
Поле EraseBlockSize должно описать размер в байтах блока удаления флэш-носителя.
3.3.4.3 Поле PageSize
Поле PageSize должно описать размер страницы флэш-носителя в байтах.
Поле запасных элементов 3.3.4.4
Поле SpareSectors должно описать количество секторов, доступных для внутренних операций с разрежением.
Поле 3.3.4.5 RandomAccessTime
Поле RandomAccessTime должно описать среднее время случайного доступа флэш-носителя в наносекундах.
Поле программирования 3.3.4.6
Поле ProgrammingTime должно описать среднее время программирования флэш-носителя в наносекундах.
Поле чтения 3.3.4.7
Поле ReadCycle должно описать среднее время цикла чтения флэш-носителя в наносекундах.
3.3.4.8 Поле WriteCycle
Поле WriteCycle должно описать среднее время цикла записи в наносекундах.
3.4 Основные и резервные области контрольной суммы загрузки резервного копирования
Контрольные суммы главного и резервного копирования содержат повторяющийся шаблон четырехбайтовой контрольной суммы содержимого всех остальных вложенных регионов в соответствующих регионах загрузки. Вычисление контрольной суммы не должно содержать поля VolumeFlags и PercentInUse в соответствующем секторе загрузки (см. рис. 1). Повторяющийся шаблон четырехбайтовой контрольной суммы заполняет соответствующий подрегион контрольной суммы загрузки с начала до конца подрегион.
Перед использованием содержимого любого из других вложенных регионов в регионах Main или Backup Boot реализация должна проверить их содержимое, проверяя соответствующую контрольную сумму загрузки загрузки.
Хотя начальная операция форматирования заполняет как основные, так и резервные суммы контрольных сумм повторяющимся шаблоном контрольной суммы, реализации должны обновлять эти секторы как содержимое других секторов в соответствующих регионах загрузки.
рис. 1 Вычисление контрольной суммы загрузки
UInt32 BootChecksum
(
UCHAR * Sectors, // points to an in-memory copy of the 11 sectors
USHORT BytesPerSector
)
{
UInt32 NumberOfBytes = (UInt32)BytesPerSector * 11;
UInt32 Checksum = 0;
UInt32 Index;
for (Index = 0; Index < NumberOfBytes; Index++)
{
if ((Index == 106) || (Index == 107) || (Index == 112))
{
continue;
}
Checksum = ((Checksum&1) ? 0x80000000 : 0) + (Checksum>>1) + (UInt32)Sectors[Index];
}
return Checksum;
}
4 области таблицы выделения файлов
Область "Таблица выделения файлов" (FAT) может содержать до двух FAT, один в первом подрегионе FAT и другой во втором подрегионе FAT. Поле NumberOfFats описывает, сколько fats этого региона содержит. Допустимые значения поля NumberOfFats: 1 и 2. Поэтому первый подрегион FAT всегда содержит FAT. Если поле NumberOfFats равно двум, второй подрегион FAT также содержит FAT.
Поле ActiveFat поля VolumeFlags описывает, какая функция FAT активна. Текущей является только поле VolumeFlags в основном секторе загрузки. Реализации должны относиться к ЖИРу, который не активен как устаревший. Использование неактивного FAT и переключения между FATs является конкретной реализацией.
4.1 Первый и Второй подрегиаторы FAT
FAT должен описывать цепочки кластеров в куче кластера (см. таблицу 11). Цепочка кластеров представляет собой ряд кластеров, которые предоставляют пространство для записи содержимого файлов, каталогов и других структур файловой системы. FAT представляет цепочку кластеров в виде последовательно связанного списка индексов кластера. За исключением первых двух записей каждая запись в FAT представляет ровно один кластер.
таблице 11 Структура таблицы выделения файлов
| имени поля | смещения (байт) |
размера (байты) |
примечания |
|---|---|---|---|
| FatEntry[0] | 0 | 4 | Это поле является обязательным и раздел 4.1.1 определяет его содержимое. |
| FatEntry[1] | 4 | 4 | Это поле является обязательным и раздел 4.1.2 определяет его содержимое. |
| FatEntry[2] | 8 | 4 | Это поле является обязательным и раздел 4.1.3 определяет его содержимое. |
. . . |
. . . |
. . . |
. . . |
| FatEntry[ClusterCount+1] | (ClusterCount + 1) * 4 | 4 | Это поле является обязательным и раздел 4.1.3 определяет его содержимое. ClusterCount + 1 не может превышать FFFFFFF6h. Примечание. Основные и резервные секторы загрузки содержат поле ClusterCount. |
| Избыточное пространство | (ClusterCount + 2) * 4 | (FatLength * 2BytesPerSectorShift) — ((ClusterCount + 2) * 4) | Это поле является обязательным и его содержимое, если таковые имеются, не определены. Примечание. Основные и резервные секторы загрузки содержат поля ClusterCount, FatLength и BytesPerSectorShift. |
4.1.1 FatEntry[0] Поле
Поле FatEntry[0] должно описать тип носителя в первом байте (наименьшем порядке байта) и должен содержать FFh в оставшихся трех байтах.
Тип носителя (первый байт) должен быть F8h.
4.1.2 FatEntry[1] Поле
Поле FatEntry[1] существует только из-за исторического приоритета и не описывает ничего интересного.
Допустимое значение этого поля — FFFFFFFFh. Реализации должны инициализировать это поле в заданное значение и не должны использовать это поле для какой-либо цели. Реализации не должны интерпретировать это поле и сохранять его содержимое в операциях, которые изменяют окружающие поля.
4.1.3 FatEntry[2] ... Поля FatEntry[ClusterCount+1]
Каждое поле FatEntry в этом массиве должно представлять кластер в куче кластера. FatEntry[2] представляет первый кластер в куче кластера и FatEntry[ClusterCount+1] представляет последний кластер в куче кластера.
Допустимый диапазон значений для этих полей должен быть следующим:
- От 2 до ClusterCount + 1 включительно, что указывает на следующий FatEntry в данной цепочке кластеров; Данный FatEntry не должен указывать на fatEntry, который предшествует ему в данной цепочке кластеров
- Именно FFFFFFF7h, который обозначает соответствующий кластер FatEntry как "плохой"
- Именно FFFFFFFFh, который помечает соответствующий кластер FatEntry в качестве последнего кластера цепочки кластеров; Это единственное допустимое значение для последней fatEntry из любой заданной цепочки кластеров.
5 Регион данных
Регион данных содержит кучу кластера, которая предоставляет управляемое пространство для структур файловой системы, каталогов и файлов.
5.1 Подрегион кластера
Структура кучи кластера очень простая (см. таблицу 12 ); каждый последовательный ряд секторов описывает один кластер, как определяет поле SectorsPerClusterShift. Важно, что первый кластер кучи кластера имеет индекс два, который напрямую соответствует индексу FatEntry[2].
В томе exFAT растровое изображение выделения (см. раздел 7.1.1.5) сохраняет запись состояния выделения всех кластеров. Это значительное различие от предшественников exFAT (FAT12, FAT16 и FAT32), в которых FAT сохраняет запись состояния выделения всех кластеров в куче кластера.
таблице 12 кучи кластера
| имени поля | смещения (сектор) |
размера (секторы) |
примечания |
|---|---|---|---|
| Кластер[2] | ClusterHeapOffset | 2СектораНаСдвигКластера | Это поле является обязательным и раздел 5.1.1 определяет его содержимое. Примечание. Основные и резервные секторы загрузки содержат поля ClusterHeapOffset и SectorsPerClusterShift. |
. . . |
. . . |
. . . |
. . . |
| Кластер[ClusterCount+1] | ClusterHeapOffset + (ClusterCount – 1) * 2SectorsPerClusterShift | 2СектораНаСдвигКластера | Это поле является обязательным и раздел 5.1.1 определяет его содержимое. Примечание. Основные и резервные секторы загрузки содержат поля ClusterCount, ClusterHeapOffset и SectorsPerClusterShift. |
5.1.1 Кластер[2] ... Поля Cluster[ClusterCount+1]
Каждое поле кластера в этом массиве представляет собой ряд смежных секторов, размер которых определяется полем SectorsPerClusterShift.
Структура каталогов 6
В файловой системе exFAT используется подход дерева каталогов для управления структурами файловой системы и файлами, которые существуют в куче кластера. Каталоги имеют связь "один ко многим" между родительским и дочерним в дереве каталогов.
Каталог, к которому ссылается поле FirstClusterOfRootDirectory, является корнем дерева каталогов. Все остальные каталоги спускаются из корневого каталога в последовательно связанном виде.
Каждый каталог состоит из ряда записей каталога (см. таблицу 13).
Одна или несколько записей каталога объединяются в набор записей каталога, описывающий что-то интересное, например структуру файловой системы, вложенный каталог или файл.
таблица 13 структура каталогов
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| DirectoryEntry[0] | 0 | 32 | Это поле является обязательным и раздел 6.1 определяет его содержимое. |
. . . |
. . . |
. . . |
. . . |
| DirectoryEntry[N–1] | (N – 1) * 32 | 32 | Это поле является обязательным и раздел 6.1 определяет его содержимое. N, число полей DirectoryEntry — это размер в байтах цепочки кластеров, содержащей указанный каталог, разделенный размером поля DirectoryEntry, 32 байта. |
6.1 DirectoryEntry[0] ... DirectoryEntry[N--1]
Каждое поле DirectoryEntry в этом массиве является производным от шаблона Generic DirectoryEntry (см. разделе 6.2).
Шаблон 6.2 Generic DirectoryEntry
Шаблон Generic DirectoryEntry предоставляет базовое определение записей каталога (см. таблице 14). Все структуры записи каталогов являются производными от этого шаблона и допустимы только структуры входа в каталог, определенные корпорацией Майкрософт(exFAT не имеют положений для структур входа каталога, определенных производителем, за исключением того, что определено в разделе 7.8 и раздела 7.9). Возможность интерпретации шаблона Generic DirectoryEntry является обязательной.
таблице 14 Generic DirectoryEntry Template
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| Тип записи | 0 | 1 | Это поле является обязательным и раздел 6.2.1 определяет его содержимое. |
| ПользовательскоеОпределение | 1 | 19 | Это поле является обязательным, и структуры, производные от этого шаблона, могут определять его содержимое. |
| FirstCluster | 20 | 4 | Это поле является обязательным и раздел 6.2.2.2 определяет его содержимое. |
| ДлинаДанных | двадцать четыре | 8 | Это поле является обязательным и раздела 6.2.3 определяет его содержимое. |
Поле записи 6.2.1
Поле EntryType имеет три режима использования, которое определяет значение поля (см. список ниже).
- 00h, который представляет собой маркер конца каталога, и применяются следующие условия:
- Все остальные поля в заданном DirectoryEntry фактически зарезервированы
- Все последующие записи каталога в данном каталоге также являются маркерами конца каталога.
- Маркеры конечных каталогов допустимы только вне наборов записей каталога
- Реализации могут перезаписать маркеры конца каталога по мере необходимости
- В диапазоне от 01h до 7Fh включительно, который является маркером неиспользуемой записи каталога, применяются следующие условия:
- Все остальные поля в заданном DirectoryEntry фактически не определены
- Неиспользуемые записи каталога допустимы только за пределами наборов записей каталогов.
- Реализации могут перезаписать неиспользуемые записи каталога по мере необходимости
- Этот диапазон значений соответствует полю InUse (см. раздел 6.2.1.4), содержащий значение 0
- Между 81h и FFh включительно, что соответствует регулярной записи каталога при следующих условиях:
- Содержимое поля EntryType (см. таблицу 15) определяет макет остальной части структуры DirectoryEntry.
- Этот диапазон значений и только этот диапазон значений является допустимым внутри набора записей каталога.
- Этот диапазон значений напрямую соответствует полю InUse (см. раздел 6.2.1.4), содержащий значение 1
Чтобы предотвратить изменения в поле InUse (см. раздел раздел 6.2.1.4) ошибочно, что приводит к ошибке маркера конца каталога, значение 80h недопустимо.
таблице 15 Generic EntryType Field Structure
| имени поля | смещения (бит) |
размера (биты) |
примечания |
|---|---|---|---|
| Код типа | 0 | 5 | Это поле является обязательным и раздел 6.2.1.1 определяет его содержимое. |
| ТипВажности | 5 | 1 | Это поле является обязательным и раздел раздел 6.2.1.2 определяет его содержимое. |
| ТипКатегория | 6 | 1 | Это поле является обязательным и раздел 6.2.1.3 определяет его содержимое. |
| В использовании | 7 | 1 | Это поле является обязательным и раздел 6.2.1.4 определяет его содержимое. |
Поле TypeCode 6.2.1.1
Поле TypeCode частично описывает конкретный тип заданной записи каталога. Это поле, а также поля TypeImportance и TypeCategory (см. раздел 6.2.1.2 и раздел 6.2.1.3соответственно) однозначно идентифицирует тип заданной записи каталога.
Допустимы все возможные значения этого поля, если только поля TypeImportance и TypeCategory не содержат значение 0; В этом случае значение 0 недопустимо для этого поля.
Поле TypeImportance 6.2.1.2
Поле TypeImportance должно описать важность заданной записи каталога.
Допустимые значения этого поля должны быть:
- 0, что означает, что указанная запись каталога имеет решающее значение (см. раздел раздел 6.3.1.1 и раздел 6.4.1.2.1 для критически важных записей основного и критического вторичного каталога соответственно)
- 1, что означает, что указанная запись каталога является доброкачественной (см. раздел 6.3.1.2.2 и раздел 6.4.1.2.2 для доброкачественных первичных и доброкачественных записей вторичных каталогов соответственно)
6.2.1.3 Поле TypeCategory
Поле TypeCategory должно описать категорию заданной записи каталога.
Допустимые значения этого поля должны быть:
- 0, что означает, что указанная запись каталога является основной (см. раздел 6.3)
- 1, что означает, что указанная запись каталога является вторичной (см. раздел 6.4)
6.2.1.4 InUse Field
Поле InUse должно описать, используется ли указанная запись каталога.
Допустимые значения этого поля должны быть:
- 0, что означает, что указанная запись каталога не используется; Это означает, что данная структура фактически является неиспользуемой записью каталога
- 1, что означает, что указанная запись каталога используется; Это означает, что данная структура является обычной записью каталога
6.2.2 Поле FirstCluster
Поле FirstCluster должно содержать индекс первого кластера выделения в куче кластера, связанной с указанной записью каталога.
Допустимый диапазон значений для этого поля должен быть следующим:
- Ровно 0, что означает, что выделение кластера не существует
- От 2 до ClusterCount + 1, который является диапазоном допустимых индексов кластера
Структуры, производные от этого шаблона, могут переопределить поля FirstCluster и DataLength, если выделение кластера несовместимо с производной структурой.
Поле DataLength 6.2.3
Поле DataLength описывает размер в байтах данных, содержащихся в связанном выделении кластера.
Допустимый диапазон значений для этого поля:
- По крайней мере 0; Если поле FirstCluster содержит значение 0, допустимое значение этого поля равно 0.
- По крайней мере ClusterCount * 2SectorsPerClusterShift* 2BytesPerSectorShift
Структуры, производные от этого шаблона, могут переопределить поля FirstCluster и DataLength, если выделение кластера невозможно для производной структуры.
Шаблон 6.3 Generic Primary DirectoryEntry
Первая запись каталога в наборе записей каталога должна быть основной записью каталога. Все последующие записи каталога, если таковые есть, в наборе записей каталога должны быть вторичными записями каталога (см. раздел 6.4).
Возможность интерпретировать шаблон Generic Primary DirectoryEntry является обязательным.
Все структуры записи основного каталога являются производными от шаблона Generic Primary DirectoryEntry (см. раздел таблица 16), производный от шаблона Generic DirectoryEntry (см. раздел 6.2).
таблице 16 Универсальный шаблон primary DirectoryEntry
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| Тип записи | 0 | 1 | Это поле является обязательным и раздел 6.3.1 определяет его содержимое. |
| SecondaryCount | 1 | 1 | Это поле является обязательным и раздела 6.3.2 определяет его содержимое. |
| SetChecksum | 2 | 2 | Это поле является обязательным и раздела 6.3.3 определяет его содержимое. |
| ОсновныеФлаги (GeneralPrimaryFlags) | 4 | 2 | Это поле является обязательным и раздел 6.3.4 определяет его содержимое. |
| ПользовательскоеОпределение | 6 | 14 | Это поле является обязательным и структуры, производные от этого шаблона, определяют его содержимое. |
| FirstCluster | 20 | 4 | Это поле является обязательным и раздел 6.3.5 определяет его содержимое. |
| ДлинаДанных | двадцать четыре | 8 | Это поле является обязательным и раздел 6.3.6 определяет его содержимое. |
Поле entryType 6.3.1
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.1).
Поле TypeCode 6.3.1.1
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1.1).
Поле TypeImportance 6.3.1.2
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1.2).
6.3.1.2.1 Критически важные записи основного каталога
Критически важные записи основного каталога содержат сведения, критически важные для правильного управления томом exFAT. Только корневой каталог содержит критически важные записи основного каталога (записи каталога файлов являются исключением, см. разделе 7.4).
Определение критически важных записей основного каталога сопоставляется с основным номером редакции exFAT. Реализации должны поддерживать все критически важные записи первичного каталога и записывать только критически важные структуры записи основного каталога, которые определяются этой спецификацией.
6.3.1.2.2 Доброкачественные записи первичного каталога
Доброкачественные записи первичного каталога содержат дополнительные сведения, которые могут быть полезны для управления томом exFAT. Любой каталог может содержать доброкачественные записи первичного каталога.
Определение доброкачественных записей первичного каталога сопоставляется с дополнительным номером редакции exFAT. Поддержка любой доброкачественной записи первичного каталога этой спецификации или любой последующей спецификации определяется необязательно. Нераспознанная неопознанная запись первичного каталога отображает весь набор записей каталога как нераспознанный (помимо определения применимых шаблонов записей каталогов).
6.3.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1.3).
Для этого шаблона допустимое значение для этого поля должно иметь значение 0.
6.3.1.4 InUse Field
Поле InUse должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.1.4).
Поле 6.3.2 SecondaryCount
Поле SecondaryCount должно описать количество записей вторичного каталога, которые немедленно следуют заданной записи первичного каталога. Эти записи вторичного каталога вместе с заданной записью первичного каталога составляют набор записей каталога.
Допустимый диапазон значений для этого поля должен быть следующим:
- По крайней мере 0, это означает, что эта запись первичного каталога является единственной записью в наборе записей каталога.
- Не более 255, что означает следующие 255 записей каталога, а эта запись основного каталога состоит из набора записей каталога.
Критически важные структуры записи основного каталога, производные от этого шаблона, могут переопределить поля SecondaryCount и SetChecksum.
Поле SetChecksum 6.3.3
Поле SetChecksum должно содержать контрольную сумму всех записей каталога в заданном наборе записей каталога. Однако контрольная сумма исключает это поле (см. рис. 2). Реализации должны проверить, является ли содержимое этого поля допустимым перед использованием любой другой записи каталога в заданном наборе записей каталога.
Критически важные структуры записи основного каталога, производные от этого шаблона, могут переопределить поля SecondaryCount и SetChecksum.
рис. 2. Вычисление EntrySetChecksum
UInt16 EntrySetChecksum
(
UCHAR * Entries, // points to an in-memory copy of the directory entry set
UCHAR SecondaryCount
)
{
UInt16 NumberOfBytes = ((UInt16)SecondaryCount + 1) * 32;
UInt16 Checksum = 0;
UInt16 Index;
for (Index = 0; Index < NumberOfBytes; Index++)
{
if ((Index == 2) || (Index == 3))
{
continue;
}
Checksum = ((Checksum&1) ? 0x8000 : 0) + (Checksum>>1) + (UInt16)Entries[Index];
}
return Checksum;
}
6.3.4 Поле GeneralPrimaryFlags
Поле GeneralPrimaryFlags содержит флаги (см. таблицу 17).
Критически важные структуры записи основного каталога, производные от этого шаблона, могут переопределить это поле.
таблице 17 GenericPrimaryFlags Field Structure
| имени поля | смещения (бит) |
размера (биты) |
примечания |
|---|---|---|---|
| Возможное распределение | 0 | 1 | Это поле является обязательным и раздел 6.3.4.1 определяет его содержимое. |
| NoFatChain | 1 | 1 | Это поле является обязательным и раздел 6.3.4.2 определяет его содержимое. |
| ПользовательскоеОпределение | 2 | 14 | Это поле является обязательным и структуры, производные от этого шаблона, могут определять это поле. |
Поле 6.3.4.1 AllocationPossible
Поле AllocationPossible должно описать, возможно ли выделение в куче кластера для указанной записи каталога.
Допустимые значения этого поля должны быть:
- 0, что означает, что связанное выделение кластеров невозможно, а поля FirstCluster и DataLength фактически не определены (структуры, производные от этого шаблона, могут переопределить эти поля).
- 1. Это означает, что возможно связанное выделение кластеров, а поля FirstCluster и DataLength определены.
6.3.4.2 Поле NoFatChain
Поле NoFatChain должно указывать, описывает ли активный FAT цепочку кластеров данного выделения.
Допустимые значения этого поля должны быть:
- 0, что означает, что соответствующие записи FAT для цепочки кластеров выделения являются допустимыми, и реализации должны интерпретировать их; Значение 0, если поле AllocationPossible содержит значение 0 или если поле AllocationPossible содержит значение 1, а поле FirstCluster содержит значение 0, допустимое значение этого поля равно 0.
- 1, что означает, что связанное выделение является одним непрерывным рядом кластеров; Соответствующие записи FAT для кластеров недопустимы, а реализации не интерпретируют их; Реализации могут использовать следующее уравнение для вычисления размера связанного выделения: DataLength / (2SectorsPerClusterShift* 2BytesPerSectorShift) округляется до ближайшего целого числа.
Если критически важные структуры записи основного каталога, производные от этого шаблона, переопределяют поле GeneralPrimaryFlags, то допустимы соответствующие записи FAT для любой связанной цепочки кластеров.
6.3.5 Поле FirstCluster
Поле FirstCluster должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.2).
Если бит NoFatChain равен 1, FirstCluster должен указывать на допустимый кластер в куче кластера.
Критически важные структуры записи основного каталога, производные от этого шаблона, могут переопределить поля FirstCluster и DataLength. Другие структуры, производные от этого шаблона, могут переопределить поля FirstCluster и DataLength, только если поле AllocationPossible содержит значение 0.
6.3.6 Поле DataLength
Поле DataLength должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.3).
Если бит NoFatChain равен 1, DataLength не должен быть нулевым. Если поле FirstCluster равно нулю, DataLength также должно быть равно нулю.
Критически важные структуры записи основного каталога, производные от этого шаблона, могут переопределить поля FirstCluster и DataLength. Другие структуры, производные от этого шаблона, могут переопределить поля FirstCluster и DataLength, только если поле AllocationPossible содержит значение 0.
Шаблон 6.4 Generic Secondary DirectoryEntry
Основной целью записей вторичного каталога является предоставление дополнительных сведений о наборе записей каталога. Возможность интерпретировать шаблон Generic Secondary DirectoryEntry является обязательным.
Определение критически важных и доброкачественных записей вторичного каталога коррелирует с дополнительным номером редакции exFAT. Поддержка любой критической или доброкачественной записи вторичного каталога этой спецификации или последующих спецификаций определяется необязательно.
Все структуры записи вторичного каталога являются производными от шаблона Generic Secondary DirectoryEntry (см. таблицу 18), которая является производным от шаблона Generic DirectoryEntry (см. раздел 6.2).
таблице 18 Generic Secondary DirectoryEntry Template
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| Тип записи | 0 | 1 | Это поле является обязательным, и раздел раздел 6.4.1 определяет его содержимое. |
| GeneralSecondaryFlags | 1 | 1 | Это поле является обязательным и раздел 6.4.2 определяет его содержимое. |
| ПользовательскоеОпределение | 2 | 18 | Это поле является обязательным и структуры, производные от этого шаблона, определяют его содержимое. |
| FirstCluster | 20 | 4 | Это поле является обязательным и раздел 6.4.3 определяет его содержимое. |
| ДлинаДанных | двадцать четыре | 8 | Это поле является обязательным и раздел 6.4.4 определяет его содержимое. |
Поле entryType 6.4.1
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1)
Поле TypeCode 6.4.1.1
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1.1).
Поле TypeImportance 6.4.1.2
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1.2).
6.4.1.2.1 Критически важные записи вторичного каталога
Критически важные записи вторичного каталога содержат сведения, критически важные для правильного управления его содержащим набором записей каталога. Хотя поддержка любой определенной критической записи вторичного каталога является необязательной, нераспознанная запись критического каталога отображает весь набор записей каталога как неузнанный (за пределами определения применимых шаблонов записей каталогов).
Однако если набор записей каталога содержит по крайней мере одну критически важную запись вторичного каталога, которая не распознает реализацию, то реализация должна в большинстве случаев интерпретировать шаблоны записей каталога в наборе записей каталога, а не данные, связанные с любой записью каталога в наборе записей каталогов, содержащих (записи каталога файлов являются исключением, см. раздел 7.4).
6.4.1.2.2 Доброкачественные записи вторичного каталога
Доброкачественные записи вторичного каталога содержат дополнительные сведения, которые могут быть полезны для управления его содержащим набором записей каталога. Поддержка любой конкретной неопасной записи вторичного каталога является необязательной. Нераспознанные неопознанные записи вторичного каталога не отображают весь набор записей каталога как нераспознанные.
Реализации могут игнорировать любую неопасную вторичную запись, не распознаваемую.
6.4.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. раздел 6.2.1.3).
Для этого шаблона допустимое значение этого поля равно 1.
6.4.1.4 InUse Field
Поле InUse должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.1.4).
6.4.2 Поле GeneralSecondaryFlags
Поле GeneralSecondaryFlags содержит флаги (см. таблицу 19).
таблице 19 GenericSecondaryFlags Field Structure
| имени поля | смещения (бит) |
размера (биты) |
примечания |
|---|---|---|---|
| Возможное распределение | 0 | 1 | Это поле является обязательным и раздел 6.4.2.1 определяет его содержимое. |
| NoFatChain | 1 | 1 | Это поле является обязательным и раздел 6.4.2.2.2 определяет его содержимое. |
| ПользовательскоеОпределение | 2 | 6 | Это поле является обязательным и структуры, производные от этого шаблона, могут определять это поле. |
Поле 6.4.2.1 AllocationPossible
Поле AllocationPossible должно иметь то же определение, что и поле с тем же именем в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.4.1).
6.4.2.2 NoFatChain Field
Поле NoFatChain должно иметь то же определение, что и в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.4.2).
6.4.3 Поле FirstCluster
Поле FirstCluster должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.2).
Если бит NoFatChain равен 1, FirstCluster должен указывать на допустимый кластер в куче кластера.
Поле DataLength 6.4.4
Поле DataLength должно соответствовать определению, указанному в шаблоне Generic DirectoryEntry (см. разделе 6.2.3).
Если бит NoFatChain равен 1, DataLength не должен быть нулевым. Если поле FirstCluster равно нулю, DataLength также должно быть равно нулю.
Определения записей каталога 7
Версия 1.00 файловой системы exFAT определяет следующие записи каталога:
- Критически важный ключевой
- Растровое изображение выделения (раздел 7.1)
- Таблица up-case (раздел 7.2)
- Метка тома (раздел 7.3)
- Файл (раздел 7.4)
- Доброкачественные первичные
- GUID тома (раздел 7.5)
- Заполнение TexFAT (раздел 7.10)
- Критически важный вспомогательный
- Stream Extension (раздел 7.6)
- Имя файла (раздел 7.7)
- Доброкачественный вторичный
- Расширение поставщика (раздел 7.8)
- Распределение поставщиков (раздел 7.9)
Запись каталога растрового изображения выделения 7.1
В файловой системе exFAT FAT не описывает состояние выделения кластеров; скорее, растровое изображение выделения выполняется. Растровые карты выделения существуют в куче кластера (см. раздел раздел 7.1.5) и имеют соответствующие критически важные записи основного каталога в корневом каталоге (см. таблицу 20).
Поле NumberOfFats определяет количество допустимых записей каталога Bitmap выделения в корневом каталоге. Если поле NumberOfFats содержит значение 1, то единственное допустимое число записей каталога bitmap выделения равно 1. Кроме того, запись каталога bitmap выделения действительна только в том случае, если она описывает первую растровую карту выделения (см. раздел раздел 7.1.2.1). Если поле NumberOfFats содержит значение 2, то единственным допустимым числом записей каталога bitmap выделения является 2. Кроме того, два записи каталога растровых карт выделения допустимы только в том случае, если один описывает первую растровую карту выделения, а другой — второй растровый рисунок выделения.
таблица 20 Структура точечных карт выделения directoryEntry
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| Тип записи | 0 | 1 | Это поле является обязательным и раздел 7.1.1 определяет его содержимое. |
| BitmapFlags | 1 | 1 | Это поле является обязательным и раздел 7.1.2 определяет его содержимое. |
| Скрытный | 2 | 18 | Это поле является обязательным и его содержимое зарезервировано. |
| FirstCluster | 20 | 4 | Это поле является обязательным и раздел 7.1.3 определяет его содержимое. |
| ДлинаДанных | двадцать четыре | 8 | Это поле является обязательным и раздел 7.1.4 определяет его содержимое. |
Поле entryType 7.1.1
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел раздел 6.3.1).
7.1.1.1 Поле TypeCode
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.1).
Для записи каталога bitmap выделения допустимое значение для этого поля равно 1.
Поле TypeImportance 7.1.1.2
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.2).
Для записи каталога растрового изображения выделения допустимое значение для этого поля равно 0.
7.1.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.3).
7.1.1.4 InUse Field
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.1.4).
7.1.2 Поле BitmapFlags
Поле BitmapFlags содержит флаги (см. таблицу 21).
таблице 21 BitmapFlags Field Structure
| имени поля | смещения (бит) |
размера (биты) |
примечания |
|---|---|---|---|
| BitmapIdentifier | 0 | 1 | Это поле является обязательным и раздел 7.1.2.1 определяет его содержимое. |
| Скрытный | 1 | 7 | Это поле является обязательным и его содержимое зарезервировано. |
7.1.2.1 Поле BitmapIdentifier
Поле BitmapIdentifier должно указывать, какой растровый рисунок выделения описывает указанную запись каталога. Реализации должны использовать растровое изображение первого выделения в сочетании с первым FAT и использовать второе растровое изображение выделения в сочетании со вторым FAT. Поле ActiveFat описывает, какие растровые изображения FAT и выделения активны.
Допустимые значения этого поля должны быть:
- 0, что означает, что указанная запись каталога описывает растровое изображение первого выделения
- 1, что означает, что указанная запись каталога описывает вторую растровую карту выделения и возможна только в том случае, если NumberOfFats содержит значение 2.
7.1.3 Поле FirstCluster
Поле FirstCluster должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.5).
Это поле содержит индекс первого кластера цепочки кластеров, как описываетСЯ FAT, на котором размещена растровая карта выделения.
Поле DataLength 7.1.4
Поле DataCluster должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел раздел 6.3.6).
7.1.5 Растровое изображение выделения
Битовое изображение выделения записывает состояние выделения кластеров в куче кластера. Каждый бит в растровом рисунке выделения указывает, доступен ли соответствующий кластер для выделения.
Растровое изображение выделения представляет кластеры от самого низкого до самого высокого индекса (см. таблице 22). По историческим причинам первый кластер имеет индекс 2.
Замечание
Первый бит в растровом рисунке — это самый низкий порядок первого байта.
таблице 22 Структура растрового изображения выделения
| имени поля | смещения (бит) |
размера (биты) |
примечания |
|---|---|---|---|
| BitmapEntry[2] | 0 | 1 | Это поле является обязательным, а раздел раздел 7.1.5.1 определяет его содержимое. |
. . . |
. . . |
. . . |
. . . |
| BitmapEntry[ClusterCount+1] | ClusterCount — 1 | 1 | Это поле является обязательным и раздел 7.1.5.1 определяет его содержимое. Примечание. Основные и резервные секторы загрузки содержат поле ClusterCount. |
| Скрытный | КоличествоКластеров | (DataLength * 8) — ClusterCount | Это поле является обязательным и его содержимое, если таковые имеются, зарезервированы. Примечание. Основные и резервные секторы загрузки содержат поле ClusterCount. |
7.1.5.1 BitmapEntry[2] ... BitmapEntry[ClusterCount+1] Поля
Каждое поле BitmapEntry в этом массиве представляет кластер в куче кластера. BitmapEntry[2] представляет первый кластер в куче кластера и BitmapEntry[ClusterCount+1] представляет последний кластер в куче кластера.
Допустимые значения этих полей должны быть:
- 0, описывающий соответствующий кластер как доступный для выделения
- 1, описывающий соответствующий кластер как недоступный для выделения (выделение кластера может уже использовать соответствующий кластер или активный FAT может описать соответствующий кластер как плохой)
7.2 Запись каталога таблиц up-case
Таблица up-case определяет преобразование из нижнего регистра в символы верхнего регистра. Это важно из-за записи каталога имени файла (см. раздел 7.7) с использованием символов Юникода, а файловая система exFAT не учитывает регистр и сохраняет регистр. Таблица up-case существует в куче кластера (см. раздел раздел 7.2.5) и имеет соответствующую запись критического первичного каталога в корневом каталоге (см. таблицу 23). Допустимое число записей каталога таблицы up-case — 1.
Из-за связи между именами таблицы up-case и файлов реализация не должна изменять таблицу up-case, за исключением операций форматирования.
таблице 23 up-case Table DirectoryEntry Structure
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| Тип записи | 0 | 1 | Это поле является обязательным и раздел 7.2.1 определяет его содержимое. |
| Зарезервировано1 | 1 | 3 | Это поле является обязательным и его содержимое зарезервировано. |
| TableChecksum | 4 | 4 | Это поле является обязательным и раздел 7.2.2 определяет его содержимое. |
| Зарезервировано2 | 8 | 12 | Это поле является обязательным и его содержимое зарезервировано. |
| FirstCluster | 20 | 4 | Это поле является обязательным и раздел 7.2.3 определяет его содержимое. |
| ДлинаДанных | двадцать четыре | 8 | Это поле является обязательным и раздел 7.2.4 определяет его содержимое. |
Поле записи 7.2.1
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел раздел 6.3.1).
Поле TypeCode 7.2.1.1
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.1).
Для записи каталога таблицы up-case допустимое значение для этого поля равно 2.
Поле TypeImportance 7.2.2.2
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.2).
Для записи каталога таблицы up-case допустимое значение для этого поля равно 0.
7.2.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.3).
7.2.1.4 InUse Field
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.1.4).
7.2.2 Поле TableChecksum
Поле TableChecksum содержит контрольную сумму таблицы up-case (описываемой поля FirstCluster и DataLength). Реализации должны проверить, что содержимое этого поля допустимо до использования таблицы up-case.
рис. 3 Вычисление TableChecksum
UInt32 TableChecksum
(
UCHAR * Table, // points to an in-memory copy of the up-case table
UInt64 DataLength
)
{
UInt32 Checksum = 0;
UInt64 Index;
for (Index = 0; Index < DataLength; Index++)
{
Checksum = ((Checksum&1) ? 0x80000000 : 0) + (Checksum>>1) + (UInt32)Table[Index];
}
return Checksum;
}
7.2.3 Поле FirstCluster
Поле FirstCluster должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.5).
Это поле содержит индекс первого кластера цепочки кластеров, как описываетСЯ FAT, в котором размещается таблица up-case.
Поле DataLength 7.2.4
Поле DataCluster должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел раздел 6.3.6).
Таблица up-case 7.2.5
Таблица up-case — это ряд сопоставлений символов Юникода. Сопоставление символов состоит из 2-байтового поля с индексом поля в таблице up-case, представляющей символ Юникода, который будет регистрироваться, и 2-байтовое поле, представляющее символ Юникода, регистрируемый в формате Юникода.
Первые 128 символов Юникода имеют обязательные сопоставления (см. таблице 24). Таблица up-case, которая имеет любое другое сопоставление символов для любого из первых 128 символов Юникода является недопустимым.
Реализации, которые поддерживают только символы из обязательного диапазона сопоставления, могут игнорировать сопоставления остальной части таблицы up-case. Такие реализации должны использовать только символы из обязательного диапазона сопоставления при создании или переименовании файлов (с помощью записи каталога имени файла см. разделе 7.7). При вставке существующих имен файлов такие реализации не должны регистрируемые символы из диапазона не обязательного сопоставления, но не должны оставлять их неизменными в результирующем имени файла (это частичное регистрирование). При сравнении имен файлов такие реализации должны рассматривать имена файлов, которые отличаются от имени при сравнении только символами Юникода от диапазона не обязательного сопоставления как эквивалентного. Хотя такие имена файлов являются только потенциально эквивалентными, такие реализации не могут гарантировать, что полное имя файла, регистрируемого в соответствии с именем в сравнении.
таблице 24 Обязательные первые 128 записей таблицы up-case
| Индекс таблицы | + 0 | + 1 | + 2 | + 3 | + 4 | + 5 | + 6 | + 7 |
|---|---|---|---|---|---|---|---|---|
| 0000h | 0000h | 0001h | 0002h | 0003h | 0004h | 0005h | 0006h | 0007h |
| 0008h | 0008h | 0009h | 000Ah | 000Bh | 000Ch | 000Dh | 000Eh | 000Fh |
| 0010h | 0010h | 0011h | 0012h | 0013h | 0014h | 0015h | 0016h | 0017h |
| 0018h | 0018h | 0019h | 001Ah | 001Bh | 001Ch | 001Dh | 001Eh | 001Fh |
| 0020h | 0020h | 0021h | 0022h | 0023h | 0024h | 0025h | 0026h | 0027h |
| 0028h | 0028h | 0029h | 002Ah | 002Bh | 002Ch | 002Dh | 002Eh | 002Fh |
| 0030h | 0030h | 0031h | 0032h | 0033h | 0034h | 0035h | 0036h | 0037h |
| 0038h | 0038h | 0039h | 003Ah | 003Bh | 003Ch | 003Dh | 003Eh | 003Fh |
| 0040h | 0040h | 0041h | 0042h | 0043h | 0044h | 0045h | 0046h | 0047h |
| 0048h | 0048h | 0049h | 004Ah | 004Bh | 004Ch | 004Dh | 004Eh | 004Fh |
| 0050h | 0050h | 0051h | 0052h | 0053h | 0054h | 0055h | 0056h | 0057h |
| 0058h | 0058h | 0059h | 005Ah | 005Bh | 005Ch | 005Dh | 005Eh | 005Fh |
| 0060h | 0060h | 0041h | 0042h | 0043h | 0044h | 0045h | 0046h | 0047h |
| 0068h | 0048h | 0049h | 004Ah | 004Bh | 004Ch | 004Dh | 004Eh | 004Fh |
| 0070h | 0050h | 0051h | 0052h | 0053h | 0054h | 0055h | 0056h | 0057h |
| 0078h | 0058h | 0059h | 005Ah | 007Bh | 007Ch | 007Dh | 007Eh | 007Fh |
(Примечание. Записи с сопоставлениями без удостоверений в полужирном шрифте)
При форматировании тома реализация может создать таблицу up-case в сжатом формате с помощью сжатия сопоставления удостоверений, так как большая часть пространства символов Юникода не имеет понятия регистра (это означает, что символы нижнего регистра и "верхний регистр" эквивалентны). Реализации сжимают таблицу up-case, представляющую ряд сопоставлений удостоверений со значением FFFFh, за которым следует число сопоставлений удостоверений.
Например, реализация может представлять первые 100 (64h) сопоставления символов со следующими восемью записями сжатой таблицы регистра:
FFFFh, 0061h, 0041h, 0042h, 0043h
Первые две записи указывают на первые 97 (61h) символов (от 0000h до 0060h) имеют сопоставления удостоверений. Последующие символы, 0061h–0063h, сопоставляется с символами 0041h до 0043h соответственно.
Возможность предоставления сжатой таблицы с регистром при форматировании тома является необязательной. Однако возможность интерпретировать как несжатую, так и сжатую таблицу регистра является обязательной. Значение поля TableChecksum всегда соответствует тому, как в томе существует таблица up-case, которая может находиться в сжатом или несжатом формате.
7.2.5.1 Рекомендуемая таблица вариантов
При форматировании тома реализации должны записывать рекомендуемую таблицу up-case в сжатом формате (см. таблицу 25), для которой значение поля TableChecksum равно E619D30Dh.
Если реализация определяет собственную таблицу up-case( сжатые или несжатые), то эта таблица должна охватывать полный диапазон символов Юникода (от кодов символов до 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 | 01BCh | 01BCh | 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 | 02:00 часов | 02:00 часов | 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 | 02BAh | 02BBh | 02BCh | 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 | 02Dh | 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 | 02Fh |
| 0300h | 03:00 | 0301h | 0302h | 0303h | 0304h | 0305h | 0306h | 0307ч |
| 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 | 03:34 ч | 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 | 03Fh | 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 | 03Fh |
| 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 | 05:00 | 05:00 | 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 | 05:32 ч | 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 | 05:32 ч | 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 | 2005ч | 2006h | 2007ч | 2008h | 2009h | 200Ah | 200Bh |
| 0818h | 200Ch | 200Dh | 200Eh | 200Fh | 2010h | 2011h | 2012h | 2013h |
| 0820h | 2014h | 2015h | 2016h | 2017h | 2018h | 2019h | 201Ач | 201Bh |
| 0828h | 201Ch | 201Dh | 201Eh | 201Fh | 2020h | 2021h | 2022h | 2023h |
| 0830h | 2024h | 2025h | 2026h | 2027h | 2028h | 2029h | 202Ah | 202Bh |
| 0838h | 202Ch | 202Dh | 202Eh | 202Fh | 20:30 | 2031h | 2032 ч | 2033h |
| 0840h | 2034h | 2035h | 2036h | 2037h | 2038h | 2039h | 203Ah | 203Bh |
| 0848h | 203Ch | 203Dh | 203Eh | 203Fh | 20:40 | 2041h | 2042h | 2043h |
| 0850h | 20:44 | 2045h | 2046h | 2047h | 2048h | 2049h | 204Ач | 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 | 206 Ач | 206Bh |
| 0878h | 206Ch | 206Dh | 206Eh | 206Fh | 2070h | 2071h | 2072h | 2073ч |
| 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 | 2096 ч | 2097h | 2098h | 2099h | 209Ач | 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 | 20 Ач | 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 | 20DH | 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 | 20Fh | 2100h | 2101h | 2102h | 2103h |
| 0910h | 2104h | 21:05 ч. | 2106h | 2107h | 2108h | 2109h | 210Ah | 210Bh |
| 0918h | 210Ch | 210Dh | 210Eh | 210Fh | 2110h | 2111h | 21:12 | 2113h |
| 0920h | 2114h | 21:15 | 2116h | 21:17 | 2118ч | 21:19 | 211Ah | 211Bh |
| 0928h | 211Ch | 211Dh | 211Eh | 211Fh | 2120h | 2121h | 2122h | 21:23 ч |
| 0930h | 2124h | 2125h | 2126h | 2127h | 2128h | 2129h | 212Ah | 212Бh |
| 0938h | 212Ch | 212Dh | 212Eh | 212Fh | 2130h | 2131h | 2132h | 2133h |
| 0940h | 2134h | 2135h | 2136h | 2137h | 2138h | 2139h | 213 Ач | 213Bh |
| 0948h | 213Ch | 213Dh | 213Eh | 213Fh | 2140h | 2141h | 2142h | 2143h |
| 0950h | 2144h | 2145h | 2146h | 2147h | 2148h | 2149h | 214Ah | 214Bh |
| 0958h | 214Ch | 214Dh | 2132h | 214Fh | 2150h | 2151ч | 2152h | 2153h |
| 0960h | 2154h | 2155h | 2156h | 2157h | 2158h | 2159h | 215Ah | 215Bh |
| 0968h | 215Ch | 215Dh | 215Eh | 215 °Фч | 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 | 10BCh | 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 Структура DirectoryEntry для меток томов
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| Тип записи | 0 | 1 | Это поле является обязательным и раздел 7.3.1 определяет его содержимое. |
| Количество символов | 1 | 1 | Это поле является обязательным и раздел 7.3.2 определяет его содержимое. |
| Метка тома | 2 | двадцать два | Это поле является обязательным и раздел 7.3.3 определяет его содержимое. |
| Скрытный | двадцать четыре | 8 | Это поле является обязательным и его содержимое зарезервировано. |
Поле entryType 7.3.1
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел раздел 6.3.1).
Поле TypeCode 7.3.1.1
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.1).
Для записи каталога меток тома допустимое значение для этого поля равно 3.
Поле TypeImportance 7.3.1.2
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.2).
Для записи каталога меток тома допустимое значение для этого поля равно 0.
7.3.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.3).
7.3.1.4 Поле InUse
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.1.4).
Поле 7.3.2 CharacterCount
Поле CharacterCount должно содержать длину строки Юникода, содержащей поле VolumeLabel.
Допустимый диапазон значений для этого поля должен быть следующим:
- По крайней мере 0, что означает, что строка Юникода имеет длину 0 символов (что эквивалентно без метки тома).
- Не более 11, что означает, что строка Юникода длиной 11 символов
Поле тома 7.3.3
Поле VolumeLabel должно содержать строку Юникода, которая является понятным именем тома. Поле VolumeLabel имеет тот же набор недопустимых символов, что и поле FileName записи каталога имени файла (см. раздел 7.7.3).
Запись каталога файлов 7.4
Записи каталога файлов описывают файлы и каталоги. Они являются критически важными записями основного каталога, и любой каталог может содержать ноль или больше записей каталога файлов (см. таблицу 27). Чтобы запись каталога файлов была допустимой, то именно одна запись каталога Stream Extension и по крайней мере одна запись каталога имени файла должна немедленно следовать записи каталога файлов (см. раздел раздел 7.6 и раздел 7.7соответственно).
таблице 27 FileEntry
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| Тип записи | 0 | 1 | Это поле является обязательным и раздел 7.4.1 определяет его содержимое. |
| SecondaryCount | 1 | 1 | Это поле является обязательным и раздел 7.4.2 определяет его содержимое. |
| SetChecksum | 2 | 2 | Это поле является обязательным и раздел 7.4.3 определяет его содержимое. |
| FileAttributes | 4 | 2 | Это поле является обязательным и раздел 7.4.4 определяет его содержимое. |
| Зарезервировано1 | 6 | 2 | Это поле является обязательным и его содержимое зарезервировано. |
| создать метку времени | 8 | 4 | Это поле является обязательным и раздел 7.4.5 определяет его содержимое. |
| LastModifiedTimestamp | 12 | 4 | Это поле является обязательным и раздел 7.4.6 определяет его содержимое. |
| LastAccessedTimestamp | 16 | 4 | Это поле является обязательным и раздел 7.4.7 определяет его содержимое. |
| Create10msIncrement | 20 | 1 | Это поле является обязательным и раздел 7.4.5 определяет его содержимое. |
| ПоследнееИзменение10мсИнкремент | двадцать один | 1 | Это поле является обязательным и раздел 7.4.6 определяет его содержимое. |
| CreateUtcOffset | двадцать два | 1 | Это поле является обязательным и раздел 7.4.5 определяет его содержимое. |
| СмещениеОтПоследнейПравкиUTC | двадцать три | 1 | Это поле является обязательным и раздел 7.4.6 определяет его содержимое. |
| LastAccessedUtcOffset | двадцать четыре | 1 | Это поле является обязательным и раздел 7.4.7 определяет его содержимое. |
| Зарезервировано2 | двадцать пять | 7 | Это поле является обязательным и его содержимое зарезервировано. |
Поле entryType 7.4.1
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел раздел 6.3.1).
Поле typeCode 7.4.1.1
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.1).
Для записи каталога файлов допустимое значение для этого поля равно 5.
Поле TypeImportance 7.4.1.2
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.2).
Для записи каталога файлов допустимое значение для этого поля равно 0.
7.4.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.3).
7.4.1.4 Поле InUse
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.1.4).
Поле 7.4.2 SecondaryCount
Поле SecondaryCount должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.2).
Поле SetChecksum 7.4.3
Поле SetChecksum должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.3).
Поле 7.4.4 FileAttributes
Поле FileAttributes содержит флаги (см. таблицу 28).
таблице 28 FileAttributes Field Structure
| имени поля | смещения (бит) |
размера (биты) |
примечания |
|---|---|---|---|
| ReadOnly | 0 | 1 | Это поле является обязательным и соответствует определению MS-DOS. |
| Скрытый | 1 | 1 | Это поле является обязательным и соответствует определению MS-DOS. |
| Система | 2 | 1 | Это поле является обязательным и соответствует определению MS-DOS. |
| Зарезервировано1 | 3 | 1 | Это поле является обязательным и его содержимое зарезервировано. |
| Каталог | 4 | 1 | Это поле является обязательным и соответствует определению MS-DOS. |
| Архив | 5 | 1 | Это поле является обязательным и соответствует определению MS-DOS. |
| Зарезервировано2 | 6 | 10 | Это поле является обязательным и его содержимое зарезервировано. |
7.4.5 CreateTimestamp, Create10msIncrement и CreateUtcOffset Fields
В сочетании поля CreateTimestamp и CreateTime10msIncrement должны описать локальную дату и время создания заданного файла или каталога. Поле CreateUtcOffset описывает смещение локальной даты и времени из UTC. Реализации должны задавать эти поля при создании заданного набора записей каталога.
Эти поля должны соответствовать определениям полей Timestamp, 10msIncrement и UtcOffset (см. раздел 7.4.8, раздел 7.4.9и раздел 7.4.10соответственно).
7.4.6 LastModifiedTimestamp, LastModified10msIncrement и LastModifiedUtcOffset Fields
В сочетании поля LastModifiedTimestamp и LastModifiedTime10msIncrement должны описать локальную дату и время последнего изменения содержимого любого кластера, связанного с указанной записью каталога расширения Stream. Поле LastModifiedUtcOffset описывает смещение локальной даты и времени из UTC. Реализации должны обновлять следующие поля:
- После изменения содержимого любого из кластеров, связанных с указанной записью каталога stream Extension (за исключением содержимого, которое существует за пределами поля ValidDataLength описывается)
- При изменении значений полей ValidDataLength или DataLength
Эти поля должны соответствовать определениям полей Timestamp, 10msIncrement и UtcOffset (см. раздел 7.4.8, раздел 7.4.9и раздел 7.4.10соответственно).
7.4.7 LastAccessedTimestamp и LastAccessedUtcOffset Fields
Поле LastAccessedTimestamp должно описать локальную дату и время последнего доступа к содержимому любого кластера, связанного с указанной записью каталога расширения Stream. Поле LastAccessedUtcOffset описывает смещение локальной даты и времени из UTC. Реализации должны обновлять следующие поля:
- После изменения содержимого любого из кластеров, связанных с указанной записью каталога stream Extension (за исключением содержимого, которое существует за пределами ValidDataLength)
- При изменении значений полей ValidDataLength или DataLength
Реализации должны обновлять эти поля после чтения содержимого любого из кластеров, связанных с указанной записью каталога Stream Extension.
Эти поля должны соответствовать определениям полей Timestamp и UtcOffset (см. раздел 7.4.8 и раздел 7.4.10соответственно).
Поля метки времени 7.4.8
Поля метки времени описывают как локальную дату, так и время до двух секундного разрешения (см. таблицу 29).
таблице 29 Структура полей метки времени
| имени поля | смещения (бит) |
размера (биты) |
примечания |
|---|---|---|---|
| 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 определяет его содержимое. |
| Месяц | двадцать один | 4 | Это поле является обязательным и раздел 7.4.8.5 определяет его содержимое. |
| Год | двадцать пять | 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 часа
Поле "Час" должно описать часть поля метки времени.
Допустимый диапазон значений для этого поля должен быть следующим:
- 0, представляющий 00:00 часов
- 23, представляющее 23:00 часов
Поле дня 7.4.8.4
Поле Day должно описать часть поля метки времени.
Допустимый диапазон значений для этого поля должен быть следующим:
- 1, первый день заданного месяца
- Последний день заданного месяца (заданный месяц определяет количество допустимых дней)
Поле 7.4.8.5 месяца
Поле "Месяц" должно описать часть поля метки времени.
Допустимый диапазон значений для этого поля должен быть следующим:
- По крайней мере 1, представляющее январь
- Не более 12, что представляет декабрь
Поле 7.4.8.6 Год
Поле "Год" должно описать часть поля метки времени относительно года 1980 года. Это поле представляет год 1980 с значением 0 и годом 2107 с значением 127.
Допустимы все возможные значения этого поля.
Поля 7.4.9 10msIncrement
Поля 10msIncrement должны предоставлять дополнительное разрешение времени соответствующим полям метки времени в десяти миллисекундах.
Допустимый диапазон значений для этих полей должен быть следующим:
- По крайней мере 0, представляющее 0 миллисекунда
- Не более 199, что представляет 1990 миллисекундах
Поля UTCOffset 7.4.10
Поля UtcOffset (см. таблицу 30) должны описать смещение от UTC к локальной дате и времени их соответствующих меток времени и 10msIncrement полей. Смещение от UTC к локальной дате и времени включает эффекты часовых поясов и другие корректировки даты и времени, такие как летнее время и региональные летние изменения.
таблице 30 UtcOffset Field Structure
| имени поля | смещения (бит) |
размера (биты) |
примечания |
|---|---|---|---|
| СмещениеОтUtc | 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 |
. . . |
. . . |
. . . |
| 01 час | 1 | Локальная дата и время — UTC + 00:15 |
| 00ч | 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.
Поле OffsetValid 7.4.10.2
Поле OffsetValid должно описать, является ли содержимое поля OffsetFromUtc допустимым или нет, как показано ниже.
0, что означает, что содержимое поля OffsetFromUtc недопустимо
и должен быть 00h
1, что означает, что содержимое поля OffsetFromUtc допустимо
Реализации должны задать значение 0 только в том случае, если значение UTC недоступно для вычисления значения поля OffsetFromUtc. Если это поле содержит значение 0, то реализации должны обрабатывать поля timestamp и 10msIncrement с тем же смещением UTC, что и текущая локальная дата и время.
Запись каталога GUID тома 7.5
Запись каталога GUID тома содержит GUID, который позволяет реализации уникально и программно различать тома. GUID тома существует в качестве доброкачественной записи первичного каталога в корневом каталоге (см. таблице 32). Допустимое число записей каталога GUID тома от 0 до 1.
таблице 32 тома GUID DirectoryEntry
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| Тип записи | 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.5 определяет его содержимое. |
| Скрытный | двадцать два | 10 | Это поле является обязательным и его содержимое зарезервировано. |
Поле записи 7.5.1
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел раздел 6.3.1).
Поле TypeCode 7.5.1.1
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.1).
Для записи каталога GUID тома допустимое значение для этого поля равно 0.
Поле TypeImportance 7.5.1.2
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.1.2).
Для записи каталога GUID тома допустимое значение для этого поля равно 1.
7.5.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 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.
Поле SetChecksum 7.5.3
Поле SetChecksum должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.3).
7.5.4 Поле GeneralPrimaryFlags
Поле GeneralPrimaryFlags должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.4) и определяет содержимое поля CustomDefined, которое будет зарезервировано.
Поле 7.5.4.1 AllocationPossible
Поле AllocationPossible должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. раздел 6.3.4.1).
Для записи каталога GUID тома допустимое значение для этого поля равно 0.
7.5.4.2 Поле NoFatChain
Поле NoFatChain должно соответствовать определению, указанному в шаблоне Generic Primary DirectoryEntry (см. разделе 6.3.4.2).
Поле VolumeGuid 7.5.5
Поле VolumeGuid должно содержать GUID, который однозначно идентифицирует заданный том.
Допустимы все возможные значения для этого поля, за исключением NULL GUID, который {00000000-0000-0000-0000-000000000000}.
Запись каталога расширения потока 7.6
Запись каталога расширения Stream является критической записью вторичного каталога в наборах записей каталога файлов (см. таблицу 33). Допустимое число записей каталога расширения Stream в наборе записей каталога файлов — 1. Кроме того, эта запись каталога действительна только в том случае, если она сразу же следует записи каталога файлов.
таблице 33 Stream Extension DirectoryEntry
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| Тип записи | 0 | 1 | Это поле является обязательным и раздел 7.6.1 определяет его содержимое. |
| GeneralSecondaryFlags | 1 | 1 | Это поле является обязательным и раздел 7.6.2 определяет его содержимое. |
| Зарезервировано1 | 2 | 1 | Это поле является обязательным и его содержимое зарезервировано. |
| ДлинаИмени | 3 | 1 | Это поле является обязательным и раздел 7.6.3 определяет его содержимое. |
| NameHash | 4 | 2 | Это поле является обязательным и раздел 7.6.4 определяет его содержимое. |
| Зарезервировано2 | 6 | 2 | Это поле является обязательным и его содержимое зарезервировано. |
| ValidDataLength | 8 | 8 | Это поле является обязательным и раздел 7.6.5 определяет его содержимое. |
| Зарезервировано3 | 16 | 4 | Это поле является обязательным и его содержимое зарезервировано. |
| FirstCluster | 20 | 4 | Это поле является обязательным и раздел 7.6.6.6 определяет его содержимое. |
| ДлинаДанных | двадцать четыре | 8 | Это поле является обязательным и раздел 7.6.7 определяет его содержимое. |
Поле entryType 7.6.1
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1).
7.6.1.1 Поле TypeCode
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1.1).
Для записи каталога расширения Stream допустимое значение для этого поля равно 0.
Поле TypeImportance 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
Поле AllocationPossible должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.2.1).
Для записи каталога расширения Stream допустимое значение для этого поля равно 1.
7.6.2.2 Поле NoFatChain
Поле NoFatChain должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.2.2).
Поле NameLength 7.6.3
Поле NameLength должно содержать длину строки Юникода, которая содержит последующие записи каталога имени файла (см. раздел 7.7) коллективно.
Допустимый диапазон значений для этого поля должен быть следующим:
- По крайней мере 1, что является самым коротким именем файла
- Не более 255, что является самым длинным именем файла
Значение поля NameLength также влияет на записи каталога имен файлов числа (см. разделе 7.7).
Поле NameHash 7.6.4
Поле NameHash должно содержать хэш 2-байтов (см. рис. 4) имени файла, регистрированного в регистре. Это позволяет реализовать быстрое сравнение при поиске файла по имени. Важно, что NameHash обеспечивает уверенную проверку несоответствия. Реализации должны проверять все совпадения NameHash с сравнением имени файла, регистрированного в регистре.
рис. 4 Вычисление nameHash
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
Поле 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, округленное до ближайшего целого числа. Кроме того, записи каталога имени файла допустимы только в том случае, если они сразу же следуют записи каталога расширения Stream в виде последовательной серии. Записи каталога "Имя файла" объединяются для формирования имени файла для набора записей каталога файлов.
Все дочерние элементы указанной записи каталога должны иметь уникальные наборы записей каталога имен файлов. Это значит, что в любом каталоге не может быть повторяющихся имен файлов или каталогов.
таблице 34 Имя файла DirectoryEntry
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| Тип записи | 0 | 1 | Это поле является обязательным и раздел 7.7.1 определяет его содержимое. |
| GeneralSecondaryFlags | 1 | 1 | Это поле является обязательным и раздел 7.7.2 определяет его содержимое. |
| Имя файла | 2 | 30 | Это поле является обязательным и раздел 7.7.3 определяет его содержимое. |
Поле записи 7.7.1
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1).
7.7.1.1 Поле TypeCode
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1.1).
Для записи каталога имени файла допустимое значение для этого поля равно 1.
Поле TypeImportance 7.7.1.2
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1.2).
Для записи каталога имени файла допустимое значение для этого поля равно 0.
7.7.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1.3).
7.7.1.4 Поле InUse
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1.4).
7.7.2 Поле GeneralSecondaryFlags
Поле GeneralSecondaryFlags должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. разделе 6.4.2) и определяет содержимое поля CustomDefined, зарезервированного.
Поле 7.7.2.1 AllocationPossible
Поле AllocationPossible должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.2.1).
Для записи каталога имени файла допустимое значение для этого поля равно 0.
Поле NoFatChain 7.7.2.2
Поле NoFatChain должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 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 | Звездочка | 002Fh | Косая черта вперед | 003Ah | Двоеточие |
| 003Ch | Знак меньшего значения | 003Eh | Знак больше | 003Fh | Вопросительный знак |
| 005Ch | Косая черта | 007Ch | Вертикальная полоса |
Имена файлов "." и ".". имеют особое значение "этот каталог" и "содержащий каталог", соответственно. Реализации не записывают ни одно из этих зарезервированных имен файлов в поле FileName. Однако реализации могут создавать эти два имена файлов в списках каталогов, чтобы ссылаться на указанный каталог и содержащий каталог.
Реализации могут ограничить имена файлов и каталогов только набором символов ASCII. Если это так, они должны ограничить их использование диапазоном допустимых символов в первых 128 записях Юникода. Они по-прежнему должны хранить имена файлов и каталогов в Юникоде на томе и переводить их в ASCII/Юникод при взаимодействии с пользователем.
Запись каталога расширения поставщика 7.8
Запись каталога расширения поставщика — это доброкачественная запись вторичного каталога в наборах записей каталога файлов (см. раздел таблица 36). Набор записей каталога файлов может содержать любое количество записей каталога расширения поставщика до предела записей вторичного каталога, меньше количества других записей вторичного каталога. Кроме того, записи каталога расширения поставщика допустимы только в том случае, если они не предшествуют требуемым записям в каталоге Stream Extension и File Name.
Записи каталога расширения поставщика позволяют поставщикам иметь уникальные записи каталога, относящиеся к поставщику, в отдельных наборах записей каталога файлов с помощью поля VendorGuid (см. таблицу 36). Уникальные записи каталога позволяют поставщикам расширить файловую систему exFAT. Поставщики могут определить содержимое поля VendorDefined (см. таблицу 36). Реализации поставщиков могут поддерживать содержимое поля VendorDefined и предоставлять функциональные возможности для конкретных поставщиков.
Реализации, которые не распознают GUID каталога расширения поставщика, должны обрабатывать запись каталога так же, как и любую другую нераспознанную запись доброкачественного вторичного каталога (см. раздел 8.2).
таблица 36 поставщиков DirectoryEntry
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| Тип записи | 0 | 1 | Это поле является обязательным и раздел 7.8.1 определяет его содержимое. |
| GeneralSecondaryFlags | 1 | 1 | Это поле является обязательным и раздел 7.8.2 определяет его содержимое. |
| VendorGuid | 2 | 16 | Это поле является обязательным и раздел 7.8.3 определяет его содержимое. |
| Определено поставщиком | 18 | 14 | Это поле является обязательным, и поставщики могут определить его содержимое. |
Поле entryType 7.8.1
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1).
Поле typeCode 7.8.1.1
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1.1).
Для записи каталога расширения поставщика допустимое значение для этого поля равно 0.
Поле TypeImportance 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"
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1.4).
7.8.2 Поле GeneralSecondaryFlags
Поле GeneralSecondaryFlags должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. разделе 6.4.2) и определяет содержимое поля CustomDefined, зарезервированного.
Поле 7.8.2.1 AllocationPossible
Поле 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, который однозначно идентифицирует заданное расширение поставщика.
Допустимы все возможные значения для этого поля, за исключением NULL GUID, который {00000000-0000-0000-0000-000000000000}. Однако поставщики должны использовать средство создания GUID, например GuidGen.exe, для выбора GUID при определении расширений.
Значение этого поля определяет структуру конкретного поставщика поля VendorDefined.
Запись каталога распределения поставщиков 7.9
Запись каталога распределения поставщиков — это доброкачественная запись вторичного каталога в наборах записей каталога файлов (см. таблицу 37). Набор записей каталога файлов может содержать любое количество записей каталога распределения поставщиков до предела записей вторичного каталога, а не количество других записей вторичного каталога. Кроме того, записи каталога распределения поставщиков допустимы только в том случае, если они не предшествуют требуемым записям в каталоге Stream Extension и File Name.
Записи каталога распределения поставщиков позволяют поставщикам иметь уникальные записи каталога, относящиеся к поставщику, в отдельных наборах записей каталога файлов с помощью поля VendorGuid (см. таблицу 37). Уникальные записи каталога позволяют поставщикам расширить файловую систему exFAT. Поставщики могут определить содержимое связанных кластеров, если таковые существуют. Реализации поставщиков могут поддерживать содержимое связанных кластеров, если таковые есть, и может предоставлять функциональные возможности для конкретных поставщиков.
Реализации, которые не распознают GUID записи каталога распределения поставщиков, должны обрабатывать запись каталога так же, как и любую другую нераспознанную запись доброкачественного вторичного каталога (см. раздел 8.2).
таблице 37 Directory Allocation DirectoryEntry
| имени поля | смещения (байт) |
размера (байт) |
примечания |
|---|---|---|---|
| Тип записи | 0 | 1 | Это поле является обязательным и раздел 7.9.1 определяет его содержимое. |
| GeneralSecondaryFlags | 1 | 1 | Это поле является обязательным и раздел 7.9.2 определяет его содержимое. |
| VendorGuid | 2 | 16 | Это поле является обязательным и раздел 7.9.3 определяет его содержимое. |
| Определено поставщиком | 18 | 2 | Это поле является обязательным, и поставщики могут определить его содержимое. |
| FirstCluster | 20 | 4 | Это поле является обязательным и раздел 7.9.4 определяет его содержимое. |
| ДлинаДанных | двадцать четыре | 8 | Это поле является обязательным и раздел 7.9.5 определяет его содержимое. |
Поле entryType 7.9.1
Поле EntryType должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1).
Поле typeCode 7.9.1.1
Поле TypeCode должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1.1).
Для записи каталога распределения поставщиков допустимое значение для этого поля равно 1.
Поле TypeImportance 7.9.1.2
Поле TypeImportance должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1.2).
Для записи каталога распределения поставщиков допустимое значение для этого поля равно 1.
7.9.1.3 Поле TypeCategory
Поле TypeCategory должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1.3).
7.9.1.4 InUse Field
Поле InUse должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.1.4).
7.9.2 Поле GeneralSecondaryFlags
Поле GeneralSecondaryFlags должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. разделе 6.4.2) и определяет содержимое поля CustomDefined, зарезервированного.
Поле 7.9.2.1 AllocationPossible
Поле AllocationPossible должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.2.1).
Для записи каталога распределения поставщиков допустимое значение для этого поля равно 1.
7.9.2.2 Поле NoFatChain
Поле NoFatChain должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел 6.4.2.2).
Поле 7.9.3 VendorGuid
Поле VendorGuid должно содержать GUID, который однозначно идентифицирует заданное выделение поставщика.
Допустимы все возможные значения для этого поля, за исключением NULL GUID, который {00000000-0000-0000-0000-000000000000}. Однако поставщики должны использовать средство создания GUID, например GuidGen.exe, для выбора GUID при определении расширений.
Значение этого поля определяет структуру содержимого связанных кластеров, зависящее от поставщика, если оно существует.
7.9.4 Поле FirstCluster
Поле FirstCluster должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. раздел раздел 6.4.3).
Поле DataLength 7.9.5
Поле DataLength должно соответствовать определению, указанному в шаблоне Generic Secondary DirectoryEntry (см. разделе 6.4.4).
7.10 Запись каталога TexFAT Padding
Эта спецификация, версия exFAT версии 1.00 Базовая спецификация файловой системы, не определяет запись каталога 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 версии 1.00, должна иметь возможность подключать и получать доступ к любому объему exFAT основного номера редакции 1 и любому дополнительному номеру редакции. В этом примере представлены сценарии, в которых реализация может столкнуться с записями каталога, которые он не распознает. Ниже описаны последствия этих сценариев:
Наличие нераспознанных критически важных записей первичного каталога в корневом каталоге отображает том недопустимым. Наличие любой критической записи первичного каталога, за исключением записей каталога файлов в любом не корневом каталоге, отображает недопустимый каталог размещения.
Реализации не должны изменять нераспознанные неопознанные записи первичного каталога или связанные с ними выделения кластера. Однако при удалении каталога и только при удалении каталога реализация должна удалять нераспознанные нераспознанные записи первичного каталога и освобождать все связанные выделения кластера, если таковые есть.
Реализации не должны изменять нераспознанные критически важные записи каталога-получатели или связанные с ними выделения кластера. Наличие одного или нескольких нераспознанных критически важных записей вторичного каталога в наборе записей каталога отображает весь набор записей каталога нераспознанным. При удалении набора записей каталога, содержащего один или несколько нераспознанных критически важных записей вторичного каталога, реализации должны освободить все выделения кластера, если таковые имеются, связанные с нераспознанными критическими записями вторичного каталога. Кроме того, если набор записей каталога описывает каталог, реализации могут:
- Переход в каталог
- Перечисление записей каталога, содержащихся в нем
- Удаление содержащихся записей каталога
- Перемещение содержащихся записей каталога в другой каталог
Однако реализации не должны:
- Изменение содержащихся записей каталога, за исключением удаления, как указано
- Создание содержащихся записей каталога
- Открытые записи каталога, кроме обхода и перечисления, как отмечалось
Реализации не должны изменять нераспознанные записи доброкачественного вторичного каталога или связанные с ними выделения кластера. Реализации должны игнорировать нераспознанные записи доброкачественного вторичного каталога. При удалении набора записей каталога реализация должна освободить все выделения кластера, если таковые есть, связанные с нераспознанными нераспознанными записями вторичного каталога.
Ограничения файловой системы 9
Ограничения размера сектора 9.1
Поле BytesPerSectorShift определяет ограничения размера нижнего и верхнего секторов (которое оценивается как нижнее ограничение: 512 байт; верхний предел: 4096 байтов).
Ограничения размера кластера 9.2
Поле SectorsPerClusterShift определяет пределы размера нижнего и верхнего кластера (нижнего предела: 1 сектор; верхний предел: 25 - БайтPerSectorShift секторов, что оценивается в 32 МБ).
Ограничения размера кучи кластера 9.3
Куча кластера должна содержать по крайней мере достаточно места для размещения следующих основных структур файловой системы: корневого каталога, всех растровых карт выделения и таблицы up-case.
Более низкий размер кучи кластера — это функция нижнего предела размера каждой из базовых структур файловой системы, которые находятся в куче кластера. Даже учитывая наименьший возможный кластер (512 байт), каждая из базовых структур файловой системы не должна превышать одного кластера. Таким образом, меньшее ограничение: 2 + кластеры NumberOfFats, которые оцениваются как 3, так и 4 кластера в зависимости от значения поля NumberOfFats.
Максимальный размер кучи кластера — это простая функция максимального количества кластеров, которое определяет поле ClusterCount (верхний предел: 232– 11 кластеров). Независимо от размера кластера, такая куча кластера имеет достаточно места, чтобы по крайней мере разместить базовые структуры файловой системы.
Ограничения размера тома 9.4
Поле VolumeLength определяет ограничения размера нижнего и верхнего томов (нижний предел: 220/ 2BytesPerSectorShiftсекторов, которые оцениваются в 1 МБ; верхний предел: 264- 1 секторов, что, учитывая максимальный размер сектора, оценивается примерно на 64ZB). Однако эта спецификация рекомендует не более 224- 2 кластера в куче кластера (см. раздел 3.1.9). Поэтому рекомендуемый верхний предел тома: ClusterHeapOffset + (224–2) * 2SectorsPerClusterShift. Учитывая максимальный размер кластера, 32 МБ и предполагая, что ClusterHeapOffset составляет 96 МБ (достаточно места для регионов main и backup Boot и только First FAT), рекомендуемый верхний предел тома оценивается примерно на 512 ТБ.
Ограничения размера каталога 9.5
Поле DataLength в записи каталога расширения Stream определяет ограничения размера нижнего и верхнего каталога (нижнее ограничение: 0 байт; верхний предел: 256 МБ). Это означает, что каталог может размещать до 8388 608 записей каталога (каждая запись каталога потребляет 32 байта). Учитывая наименьший возможный набор записей каталога файлов, три записи каталога, каталог может размещать до 2 796 202 файлов.
10 Приложение
10.1 Глобальные уникальные идентификаторы (GUID)
GUID — это реализация универсального уникального идентификатора Майкрософт. GUID — это 128-разрядное значение, состоящее из одной группы из 8 шестнадцатеричных цифр, за которым следует три группы из 4 шестнадцатеричных цифр, за которыми следует одна группа из 12 шестнадцатеричных цифр, например {6B29FC40-CA47-1067-B31D-00DD010662DA}, (см. таблицу 38).
таблица 38 GUID
| имени поля | смещения (байт) |
размера (байты) |
примечания |
|---|---|---|---|
| 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 Журнал изменений документации
| дата | описание изменений |
|---|---|
| 08 января 2008 г. | Первый выпуск базовой спецификации, которая включает в себя: Раздел 1. Введение Раздел 2. Раздел 3. Основные и резервные регионы загрузки резервного копирования Раздел 4, область таблицы выделения файлов Раздел 5, регион данных Раздел 6, структура каталогов Раздел 7. Определения записей каталога Раздел 8. Заметки о реализации Раздел 9. Ограничения файловой системы Раздел 10, приложение |
| 08-юн-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 Исправление и уточнение полей метки времени и 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 в таблице 2 раздела 1.3 Изменены разделы 1.5, чтобы обеспечить выравнивание с документом спецификации TexFAT. Уточнено ограничение, которое может определить только корпорация Майкрософт макета записей каталогов в разделе 6.2. Добавлено уточнение, что поле FirstCluster должно быть равно нулю, если dataLength равен нулю, и NoFatChain имеет значение Раздел 6.3.5 и раздел 6.4.3. Уточнены требования к допустимым записям каталога файлов в разделе 7.4 Добавлено требование для уникальных имен файлов и каталогов в разделе 7.7 Добавлено примечание о реализации ASCII в конце раздела 7.7.3 |
| 01-Январь-2009 | Четвертый выпуск базовой спецификации, включающий следующие изменения: Удалены ссылки на записи управления доступом Windows CE Добавлено уточнение раздела 7.2.5.1 для явного требования полной таблицы регистра |
| 02-сентября 2009 г. | Пятый выпуск базовой спецификации, включающий следующие изменения: Изменения форматирования документов, позволяющие улучшить преобразование PDF |
| 24 февраля 2010 г. | Шестой выпуск базовой спецификации, который включает следующие изменения: Измененный неверный оператор: "Поле FirstCluster должно быть равно нулю, если значение DataLength равно нулю, и NoFatChain задано" в разделе 6.3 и разделе 6.4.3 значение "Если бит NoFatChain равен 1, FirstCluster должен указывать на допустимый кластер в куче кластера", чтобы уточнить, что необходимо иметь допустимое выделение, если бит NoFatChain задан. Добавлено значение "Если бит NoFatChain равен 1, DataLength не должен быть нулевым. Если поле FirstCluster равно нулю, DataLength также должно быть нулевым" в разделе 6.3.6 и разделе 6.4.4, чтобы уточнить, что должно быть допустимое выделение, если бит NoFatChain установлен. Обновлено уведомление об авторских правах до 2010 г. |
| 26-август 2019 г. | Седьмой выпуск базовой спецификации, который включает следующие изменения: Обновленные юридические термины, относящиеся к спецификации, в том числе: Удаление конфиденциального уведомления Майкрософт Удаление раздела лицензионного соглашения о технической документации корпорации Майкрософт Обновлено уведомление об авторских правах до 2019 г. |