source: mainline/uspace/app/mkexfat/exfat.h

Last change on this file was 09ab0a9a, checked in by Jiri Svoboda <jiri@…>, 7 years ago

Fix vertical spacing with new Ccheck revision.

  • Property mode set to 100644
File size: 5.3 KB
Line 
1/*
2 * Copyright (c) 2008 Jakub Jermar
3 * Copyright (c) 2011 Oleg Romanenko
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup mkexfat
31 * @{
32 */
33
34#include <stdint.h>
35#include <stdbool.h>
36
37#define EXFAT_FILENAME_LEN 255
38#define EXFAT_NAME_PART_LEN 15
39#define EXFAT_VOLLABEL_LEN 11
40
41#define EXFAT_TYPE_UNUSED 0x00
42#define EXFAT_TYPE_USED 0x80
43#define EXFAT_TYPE_VOLLABEL 0x83
44#define EXFAT_TYPE_BITMAP 0x81
45#define EXFAT_TYPE_UCTABLE 0x82
46#define EXFAT_TYPE_GUID 0xA0
47#define EXFAT_TYPE_FILE 0x85
48#define EXFAT_TYPE_STREAM 0xC0
49#define EXFAT_TYPE_NAME 0xC1
50
51#define EXFAT_ATTR_RDONLY 0x01
52#define EXFAT_ATTR_HIDDEN 0x02
53#define EXFAT_ATTR_SYSTEM 0x04
54#define EXFAT_ATTR_SUBDIR 0x10
55#define EXFAT_ATTR_ARCHIVE 0x20
56
57/* All dentry structs should have 31 byte size */
58typedef struct {
59 uint8_t size;
60 uint16_t label[11];
61 uint8_t _reserved[8];
62} __attribute__((packed)) exfat_vollabel_dentry_t;
63
64typedef struct {
65 uint8_t flags;
66 uint8_t _reserved[18];
67 uint32_t firstc;
68 uint64_t size;
69} __attribute__((packed)) exfat_bitmap_dentry_t;
70
71typedef struct {
72 uint8_t _reserved1[3];
73 uint32_t checksum;
74 uint8_t _reserved2[12];
75 uint32_t firstc;
76 uint64_t size;
77} __attribute__((packed)) exfat_uctable_dentry_t;
78
79typedef struct {
80 uint8_t count; /* Always zero */
81 uint16_t checksum;
82 uint16_t flags;
83 uint8_t guid[16];
84 uint8_t _reserved[10];
85} __attribute__((packed)) exfat_guid_dentry_t;
86
87typedef struct {
88 uint8_t count;
89 uint16_t checksum;
90 uint16_t attr;
91 uint8_t _reserved1[2];
92 uint32_t ctime;
93 uint32_t mtime;
94 uint32_t atime;
95 uint8_t ctime_fine;
96 uint8_t mtime_fine;
97 uint8_t ctime_tz;
98 uint8_t mtime_tz;
99 uint8_t atime_tz;
100 uint8_t _reserved2[7];
101} __attribute__((packed)) exfat_file_dentry_t;
102
103typedef struct {
104 uint8_t flags;
105 uint8_t _reserved1[1];
106 uint8_t name_size;
107 uint16_t hash;
108 uint8_t _reserved2[2];
109 uint64_t valid_data_size;
110 uint8_t _reserved3[4];
111 uint32_t firstc;
112 uint64_t data_size;
113} __attribute__((packed)) exfat_stream_dentry_t;
114
115typedef struct {
116 uint8_t flags;
117 uint16_t name[EXFAT_NAME_PART_LEN];
118} __attribute__((packed)) exfat_name_dentry_t;
119
120typedef struct {
121 uint8_t type;
122 union {
123 exfat_vollabel_dentry_t vollabel;
124 exfat_bitmap_dentry_t bitmap;
125 exfat_uctable_dentry_t uctable;
126 exfat_guid_dentry_t guid;
127 exfat_file_dentry_t file;
128 exfat_stream_dentry_t stream;
129 exfat_name_dentry_t name;
130 };
131} __attribute__((packed)) exfat_dentry_t;
132
133typedef enum {
134 EXFAT_DENTRY_SKIP,
135 EXFAT_DENTRY_LAST,
136 EXFAT_DENTRY_FREE,
137 EXFAT_DENTRY_VOLLABEL,
138 EXFAT_DENTRY_BITMAP,
139 EXFAT_DENTRY_UCTABLE,
140 EXFAT_DENTRY_GUID,
141 EXFAT_DENTRY_FILE,
142 EXFAT_DENTRY_STREAM,
143 EXFAT_DENTRY_NAME
144} exfat_dentry_clsf_t;
145
146typedef struct exfat_bs {
147 uint8_t jump[3]; /* 0x00 jmp and nop instructions */
148 uint8_t oem_name[8]; /* 0x03 "EXFAT " */
149 uint8_t __reserved[53]; /* 0x0B always 0 */
150 uint64_t volume_start; /* 0x40 partition first sector */
151 uint64_t volume_count; /* 0x48 partition sectors count */
152 uint32_t fat_sector_start; /* 0x50 FAT first sector */
153 uint32_t fat_sector_count; /* 0x54 FAT sectors count */
154 uint32_t data_start_sector; /* 0x58 Data region first cluster sector */
155 uint32_t data_clusters; /* 0x5C total clusters count */
156 uint32_t rootdir_cluster; /* 0x60 first cluster of the root dir */
157 uint32_t volume_serial; /* 0x64 volume serial number */
158 struct { /* 0x68 FS version */
159 uint8_t minor;
160 uint8_t major;
161 } __attribute__((packed)) version;
162 uint16_t volume_flags; /* 0x6A volume state flags */
163 uint8_t bytes_per_sector; /* 0x6C sector size as (1 << n) */
164 uint8_t sec_per_cluster; /* 0x6D sectors per cluster as (1 << n) */
165 uint8_t fat_count; /* 0x6E always 1 */
166 uint8_t drive_no; /* 0x6F always 0x80 */
167 uint8_t allocated_percent; /* 0x70 percentage of allocated space */
168 uint8_t _reserved2[7]; /* 0x71 reserved */
169 uint8_t bootcode[390]; /* Boot code */
170 uint16_t signature; /* the value of 0xAA55 */
171} __attribute__((__packed__)) exfat_bs_t;
172
173/**
174 * @}
175 */
Note: See TracBrowser for help on using the repository browser.