xref: /reactos/sdk/lib/fslib/ext2lib/Mke2fs.h (revision 9393fc32)
1 /*
2  * PROJECT:          Mke2fs
3  * FILE:             Mke2fs.h
4  * PROGRAMMER:       Matt Wu <mattwu@163.com>
5  * HOMEPAGE:         http://ext2.yeah.net
6  */
7 
8 #ifndef _MKE2FS_H_
9 #define _MKE2FS_H_
10 
11 /* INCLUDES **************************************************************/
12 
13 #define NTOS_MODE_USER
14 #include <ndk/kefuncs.h>
15 #include <ndk/rtlfuncs.h>
16 
17 #include "ext2_fs.h"
18 
19 /* DEFINITIONS ***********************************************************/
20 
21 #define SECTOR_SIZE (Ext2Sys->DiskGeometry.BytesPerSector)
22 
23 #ifndef GUID_DEFINED
24 #define GUID_DEFINED
25 typedef struct _GUID
26 {
27     unsigned long  Data1;
28     unsigned short Data2;
29     unsigned short Data3;
30     unsigned char  Data4[8];
31 } GUID;
32 #endif /* GUID_DEFINED */
33 
34 #ifndef UUID_DEFINED
35 #define UUID_DEFINED
36 typedef GUID UUID;
37 #ifndef uuid_t
38 #define uuid_t UUID
39 #endif
40 #endif
41 
42 #ifndef bool
43 #define bool    BOOLEAN
44 #endif
45 
46 #ifndef true
47 #define true    TRUE
48 #endif
49 
50 #ifndef false
51 #define false   FALSE
52 #endif
53 
54 
55 #define EXT2_CHECK_MAGIC(struct, code) \
56       if ((struct)->magic != (code)) return (code)
57 
58 /*
59  * ext2fs_scan flags
60  */
61 #define EXT2_SF_CHK_BADBLOCKS   0x0001
62 #define EXT2_SF_BAD_INODE_BLK   0x0002
63 #define EXT2_SF_BAD_EXTRA_BYTES 0x0004
64 #define EXT2_SF_SKIP_MISSING_ITABLE 0x0008
65 
66 /*
67  * ext2fs_check_if_mounted flags
68  */
69 #define EXT2_MF_MOUNTED     1
70 #define EXT2_MF_ISROOT      2
71 #define EXT2_MF_READONLY    4
72 #define EXT2_MF_SWAP        8
73 
74 /*
75  * Ext2/linux mode flags.  We define them here so that we don't need
76  * to depend on the OS's sys/stat.h, since we may be compiling on a
77  * non-Linux system.
78  */
79 
80 #define LINUX_S_IFMT  00170000
81 #define LINUX_S_IFSOCK 0140000
82 #define LINUX_S_IFLNK    0120000
83 #define LINUX_S_IFREG  0100000
84 #define LINUX_S_IFBLK  0060000
85 #define LINUX_S_IFDIR  0040000
86 #define LINUX_S_IFCHR  0020000
87 #define LINUX_S_IFIFO  0010000
88 #define LINUX_S_ISUID  0004000
89 #define LINUX_S_ISGID  0002000
90 #define LINUX_S_ISVTX  0001000
91 
92 #define LINUX_S_IRWXU 00700
93 #define LINUX_S_IRUSR 00400
94 #define LINUX_S_IWUSR 00200
95 #define LINUX_S_IXUSR 00100
96 
97 #define LINUX_S_IRWXG 00070
98 #define LINUX_S_IRGRP 00040
99 #define LINUX_S_IWGRP 00020
100 #define LINUX_S_IXGRP 00010
101 
102 #define LINUX_S_IRWXO 00007
103 #define LINUX_S_IROTH 00004
104 #define LINUX_S_IWOTH 00002
105 #define LINUX_S_IXOTH 00001
106 
107 #define LINUX_S_ISLNK(m)    (((m) & LINUX_S_IFMT) == LINUX_S_IFLNK)
108 #define LINUX_S_ISREG(m)    (((m) & LINUX_S_IFMT) == LINUX_S_IFREG)
109 #define LINUX_S_ISDIR(m)    (((m) & LINUX_S_IFMT) == LINUX_S_IFDIR)
110 #define LINUX_S_ISCHR(m)    (((m) & LINUX_S_IFMT) == LINUX_S_IFCHR)
111 #define LINUX_S_ISBLK(m)    (((m) & LINUX_S_IFMT) == LINUX_S_IFBLK)
112 #define LINUX_S_ISFIFO(m)   (((m) & LINUX_S_IFMT) == LINUX_S_IFIFO)
113 #define LINUX_S_ISSOCK(m)   (((m) & LINUX_S_IFMT) == LINUX_S_IFSOCK)
114 
115 
116 #define EXT2_FIRST_INODE(s) EXT2_FIRST_INO(s)
117 
118 typedef struct _ext2fs_bitmap {
119     __u32       start, end;
120     __u32       real_end;
121     char*       bitmap;
122 } EXT2_BITMAP, *PEXT2_BITMAP;
123 
124 typedef EXT2_BITMAP EXT2_GENERIC_BITMAP, *PEXT2_GENERIC_BITMAP;
125 typedef EXT2_BITMAP EXT2_INODE_BITMAP, *PEXT2_INODE_BITMAP;
126 typedef EXT2_BITMAP EXT2_BLOCK_BITMAP, *PEXT2_BLOCK_BITMAP;
127 
128 typedef struct ext2_acl_entry   EXT2_ACL_ENTRY, *PEXT2_ACL_ENTRY;
129 typedef struct ext2_acl_header  EXT2_ACL_HEADER, *PEXT2_ACL_HEADER;
130 typedef struct ext2_dir_entry   EXT2_DIR_ENTRY, *PEXT2_DIR_ENTRY;
131 typedef struct ext2_dir_entry_2 EXT2_DIR_ENTRY2, *PEXT2_DIR_ENTRY2;
132 typedef struct ext2_dx_countlimit   EXT2_DX_CL, *PEXT2_DX_CL;
133 typedef struct ext2_dx_entry    EXT2_DX_ENTRY, *PEXT2_DX_ENTRY;
134 typedef struct ext2_dx_root_info    EXT2_DX_RI, *PEXT2_DX_RI;
135 typedef struct ext2_inode   EXT2_INODE, *PEXT2_INODE;
136 typedef struct ext2_group_desc  EXT2_GROUP_DESC, *PEXT2_GROUP_DESC;
137 typedef struct ext2_super_block EXT2_SUPER_BLOCK, *PEXT2_SUPER_BLOCK;
138 
139 /*
140  * Badblocks list
141  */
142 struct ext2_struct_badblocks_list {
143     int     num;
144     int     size;
145     ULONG   *list;
146     int     badblocks_flags;
147 };
148 
149 typedef struct ext2_struct_badblocks_list EXT2_BADBLK_LIST, *PEXT2_BADBLK_LIST;
150 
151 typedef struct _ext2_filesys
152 {
153     int                 flags;
154     int                 blocksize;
155     int                 fragsize;
156     ULONG               group_desc_count;
157     unsigned long       desc_blocks;
158     PEXT2_GROUP_DESC    group_desc;
159     PEXT2_SUPER_BLOCK   ext2_sb;
160     unsigned long       inode_blocks_per_group;
161     PEXT2_INODE_BITMAP  inode_map;
162     PEXT2_BLOCK_BITMAP  block_map;
163 
164     EXT2_BADBLK_LIST    badblocks;
165 /*
166     ext2_dblist         dblist;
167 */
168     __u32               stride; /* for mke2fs */
169 
170     __u32               umask;
171 
172     /*
173      * Reserved for future expansion
174      */
175     __u32               reserved[8];
176 
177     /*
178      * Reserved for the use of the calling application.
179      */
180     void *              priv_data;
181 
182     HANDLE              MediaHandle;
183 
184     DISK_GEOMETRY       DiskGeometry;
185 
186     PARTITION_INFORMATION   PartInfo;
187 
188 } EXT2_FILESYS, *PEXT2_FILESYS;
189 
190 // Block Description List
191 typedef struct _EXT2_BDL {
192     LONGLONG    Lba;
193     ULONG       Offset;
194     ULONG       Length;
195 } EXT2_BDL, *PEXT2_BDL;
196 
197 /*
198  * Where the master copy of the superblock is located, and how big
199  * superblocks are supposed to be.  We define SUPERBLOCK_SIZE because
200  * the size of the superblock structure is not necessarily trustworthy
201  * (some versions have the padding set up so that the superblock is
202  * 1032 bytes long).
203  */
204 #define SUPERBLOCK_OFFSET   1024
205 #define SUPERBLOCK_SIZE     1024
206 
207 
208 bool create_bad_block_inode(PEXT2_FILESYS fs, PEXT2_BADBLK_LIST bb_list);
209 
210 
211 /*
212  *  Bitmap.c
213  */
214 
215 #define ext2_mark_block_bitmap ext2_mark_bitmap
216 #define ext2_mark_inode_bitmap ext2_mark_bitmap
217 #define ext2_unmark_block_bitmap ext2_unmark_bitmap
218 #define ext2_unmark_inode_bitmap ext2_unmark_bitmap
219 
220 bool ext2_set_bit(int nr, void * addr);
221 bool ext2_clear_bit(int nr, void * addr);
222 bool ext2_test_bit(int nr, void * addr);
223 
224 bool ext2_mark_bitmap(PEXT2_BITMAP bitmap, ULONG bitno);
225 bool ext2_unmark_bitmap(PEXT2_BITMAP bitmap, ULONG bitno);
226 
227 bool ext2_test_block_bitmap(PEXT2_BLOCK_BITMAP bitmap,
228                         ULONG block);
229 
230 bool ext2_test_block_bitmap_range(PEXT2_BLOCK_BITMAP bitmap,
231                         ULONG block, int num);
232 
233 bool ext2_test_inode_bitmap(PEXT2_BLOCK_BITMAP bitmap,
234                         ULONG inode);
235 
236 
237 bool ext2_allocate_block_bitmap(PEXT2_FILESYS pExt2Sys);
238 bool ext2_allocate_inode_bitmap(PEXT2_FILESYS pExt2Sys);
239 void ext2_free_inode_bitmap(PEXT2_FILESYS pExt2Sys);
240 void ext2_free_block_bitmap(PEXT2_FILESYS pExt2Sys);
241 
242 bool ext2_write_block_bitmap (PEXT2_FILESYS fs);
243 bool ext2_write_inode_bitmap (PEXT2_FILESYS fs);
244 
245 bool ext2_write_bitmaps(PEXT2_FILESYS fs);
246 
247 //bool read_bitmaps(PEXT2_FILESYS fs, int do_inode, int do_block);
248 bool ext2_read_inode_bitmap (PEXT2_FILESYS fs);
249 bool ext2_read_block_bitmap(PEXT2_FILESYS fs);
250 bool ext2_read_bitmaps(PEXT2_FILESYS fs);
251 
252 
253 /*
254  *  Disk.c
255  */
256 
257 NTSTATUS
258 Ext2OpenDevice( PEXT2_FILESYS    Ext2Sys,
259                 PUNICODE_STRING  DeviceName );
260 
261 NTSTATUS
262 Ext2CloseDevice( PEXT2_FILESYS  Ext2Sys);
263 
264 NTSTATUS
265 Ext2ReadDisk( PEXT2_FILESYS  Ext2Sys,
266               ULONGLONG      Offset,
267               ULONG          Length,
268               PVOID          Buffer     );
269 
270 NTSTATUS
271 Ext2WriteDisk( PEXT2_FILESYS  Ext2Sys,
272                ULONGLONG      Offset,
273                ULONG          Length,
274                PVOID          Buffer );
275 
276 NTSTATUS
277 Ext2GetMediaInfo( PEXT2_FILESYS Ext2Sys );
278 
279 
280 NTSTATUS
281 Ext2LockVolume( PEXT2_FILESYS Ext2Sys );
282 
283 NTSTATUS
284 Ext2UnLockVolume( PEXT2_FILESYS Ext2Sys );
285 
286 NTSTATUS
287 Ext2DisMountVolume( PEXT2_FILESYS Ext2Sys );
288 
289 
290 /*
291  *  Group.c
292  */
293 
294 bool ext2_allocate_group_desc(PEXT2_FILESYS pExt2Sys);
295 void ext2_free_group_desc(PEXT2_FILESYS pExt2Sys);
296 bool ext2_bg_has_super(PEXT2_SUPER_BLOCK pExt2Sb, int group_block);
297 
298 /*
299  *  Inode.c
300  */
301 
302 bool ext2_get_inode_lba(PEXT2_FILESYS pExt2Sys, ULONG no, LONGLONG *offset);
303 bool ext2_load_inode(PEXT2_FILESYS pExt2Sys, ULONG no, PEXT2_INODE pInode);
304 bool ext2_save_inode(PEXT2_FILESYS pExt2Sys, ULONG no, PEXT2_INODE pInode);
305 bool ext2_new_inode(PEXT2_FILESYS fs, ULONG dir, int mode,
306                       PEXT2_INODE_BITMAP map, ULONG *ret);
307 bool ext2_expand_inode(PEXT2_FILESYS pExt2Sys, PEXT2_INODE, ULONG newBlk);
308 
309 bool ext2_read_inode (PEXT2_FILESYS pExt2Sys,
310             ULONG               ino,
311             ULONG               offset,
312             PVOID               Buffer,
313             ULONG               size,
314             PULONG              dwReturn );
315 bool ext2_write_inode (PEXT2_FILESYS pExt2Sys,
316             ULONG               ino,
317             ULONG               offset,
318             PVOID               Buffer,
319             ULONG               size,
320             PULONG              dwReturn );
321 
322 bool ext2_add_entry(PEXT2_FILESYS pExt2Sys, ULONG parent, ULONG inode, int filetype, char *name);
323 bool ext2_reserve_inodes(PEXT2_FILESYS fs);
324 /*
325  *  Memory.c
326  */
327 
328 //
329 // Return the group # of an inode number
330 //
331 int ext2_group_of_ino(PEXT2_FILESYS fs, ULONG ino);
332 
333 //
334 // Return the group # of a block
335 //
336 int ext2_group_of_blk(PEXT2_FILESYS fs, ULONG blk);
337 
338 /*
339  *  Badblock.c
340  */
341 
342 
343 void ext2_inode_alloc_stats2(PEXT2_FILESYS fs, ULONG ino, int inuse, int isdir);
344 void ext2_inode_alloc_stats(PEXT2_FILESYS fs, ULONG ino, int inuse);
345 void ext2_block_alloc_stats(PEXT2_FILESYS fs, ULONG blk, int inuse);
346 
347 bool ext2_allocate_tables(PEXT2_FILESYS pExt2Sys);
348 bool ext2_allocate_group_table(PEXT2_FILESYS fs, ULONG group,
349                       PEXT2_BLOCK_BITMAP bmap);
350 bool ext2_get_free_blocks(PEXT2_FILESYS fs, ULONG start, ULONG finish,
351                  int num, PEXT2_BLOCK_BITMAP map, ULONG *ret);
352 bool write_inode_tables(PEXT2_FILESYS fs);
353 
354 bool ext2_new_block(PEXT2_FILESYS fs, ULONG goal,
355                PEXT2_BLOCK_BITMAP map, ULONG *ret);
356 bool ext2_alloc_block(PEXT2_FILESYS fs, ULONG goal, ULONG *ret);
357 bool ext2_new_dir_block(PEXT2_FILESYS fs, ULONG dir_ino,
358                    ULONG parent_ino, char **block);
359 bool ext2_write_block(PEXT2_FILESYS fs, ULONG block, void *inbuf);
360 bool ext2_read_block(PEXT2_FILESYS fs, ULONG block, void *inbuf);
361 
362 /*
363  *  Mke2fs.c
364  */
365 
366 bool parase_cmd(int argc, char *argv[], PEXT2_FILESYS pExt2Sys);
367 
368 bool zero_blocks(PEXT2_FILESYS fs, ULONG blk, ULONG num,
369                  ULONG *ret_blk, ULONG *ret_count);
370 
371 ULONG
372 Ext2DataBlocks(PEXT2_FILESYS Ext2Sys, ULONG TotalBlocks);
373 
374 ULONG
375 Ext2TotalBlocks(PEXT2_FILESYS Ext2Sys, ULONG DataBlocks);
376 
377 
378 
379 /*
380  *  Super.c
381  */
382 
383 void ext2_print_super(PEXT2_SUPER_BLOCK pExt2Sb);
384 bool ext2_initialize_sb(PEXT2_FILESYS pExt2Sys);
385 
386 
387 /*
388  *  Super.c
389  */
390 
391 LONGLONG ext2_nt_time (ULONG i_time);
392 ULONG ext2_unix_time (LONGLONG n_time);
393 
394 /*
395  *  Uuid.c
396  */
397 
398 void uuid_generate(__u8 * uuid);
399 
400 #endif /* _MKE2FS_H_ */
401