FreeCalypso > hg > freecalypso-reveng
annotate mysteryffs/dump2.c @ 106:a39a38bbec4d
analysis of what osmocon's voodoo payloads disassemble to in ARM/Thumb
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Mon, 31 Mar 2014 06:33:14 +0000 |
parents | 9f3a7b014e63 |
children |
rev | line source |
---|---|
23
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
1 /* |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
2 * This program attempts to traverse the FFS directory tree |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
3 * from the root down, following the descendant and sibling |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
4 * pointers, and dumps everything it encounters. |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
5 * |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
6 * The objective is to understand how to extract the precise |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
7 * content of data files. |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
8 */ |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
9 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
10 #include <sys/types.h> |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
11 #include <sys/file.h> |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
12 #include <sys/stat.h> |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
13 #include <endian.h> |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
14 #include <ctype.h> |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
15 #include <stdio.h> |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
16 #include <string.h> |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
17 #include <strings.h> |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
18 #include <stdlib.h> |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
19 #include <unistd.h> |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
20 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
21 typedef unsigned char u8; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
22 typedef unsigned short u16; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
23 typedef unsigned int u32; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
24 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
25 u8 mysteryffs_hdr[6] = {'F', 'f', 's', '#', 0x10, 0x02}; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
26 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
27 struct index_entry { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
28 u16 len; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
29 u8 unknown_b1; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
30 u8 type; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
31 u16 descend; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
32 u16 sibling; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
33 u32 dataptr; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
34 u16 unknown_w1; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
35 u16 unknown_w2; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
36 }; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
37 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
38 char *imgfile; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
39 u32 eraseblk_size; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
40 int total_blocks; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
41 u32 total_img_size; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
42 u8 *image, *indexblk; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
43 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
44 char workpath[512]; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
45 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
46 read_img_file() |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
47 { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
48 int fd; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
49 struct stat st; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
50 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
51 fd = open(imgfile, O_RDONLY); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
52 if (fd < 0) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
53 perror(imgfile); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
54 exit(1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
55 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
56 fstat(fd, &st); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
57 if (!S_ISREG(st.st_mode)) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
58 fprintf(stderr, "%s is not a regular file\n", imgfile); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
59 exit(1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
60 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
61 if (st.st_size < total_img_size) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
62 fprintf(stderr, "%s has fewer than 0x%x bytes\n", imgfile, |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
63 total_img_size); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
64 exit(1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
65 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
66 image = malloc(total_img_size); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
67 if (!image) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
68 perror("malloc"); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
69 exit(1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
70 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
71 read(fd, image, total_img_size); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
72 close(fd); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
73 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
74 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
75 find_index_block() |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
76 { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
77 int i; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
78 u8 *ptr; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
79 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
80 for (ptr = image, i = 0; i < total_blocks; i++, ptr += eraseblk_size) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
81 if (bcmp(ptr, mysteryffs_hdr, 6)) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
82 continue; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
83 if (ptr[8] != 0xAB) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
84 continue; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
85 printf("Found index in erase block #%d (offset %x)\n", i, |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
86 ptr - image); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
87 indexblk = ptr; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
88 return(0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
89 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
90 fprintf(stderr, "could not find a MysteryFFS index block in %s\n", |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
91 imgfile); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
92 exit(1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
93 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
94 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
95 get_index_entry(num, host) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
96 int num; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
97 struct index_entry *host; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
98 { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
99 struct index_entry *le; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
100 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
101 le = (struct index_entry *) indexblk + num; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
102 host->len = le16toh(le->len); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
103 host->unknown_b1 = le->unknown_b1; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
104 host->type = le->type; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
105 host->descend = le16toh(le->descend); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
106 host->sibling = le16toh(le->sibling); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
107 host->dataptr = le32toh(le->dataptr); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
108 host->unknown_w1 = le16toh(le->unknown_w1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
109 host->unknown_w2 = le16toh(le->unknown_w2); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
110 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
111 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
112 is_namestr_ok(s) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
113 char *s; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
114 { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
115 int cnt; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
116 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
117 for (cnt = 0; *s; s++, cnt++) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
118 if (cnt >= 32) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
119 return(0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
120 if (!isprint(*s)) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
121 return(0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
122 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
123 if (cnt) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
124 return(1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
125 else |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
126 return(0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
127 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
128 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
129 char * |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
130 get_name(dptr) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
131 u32 dptr; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
132 { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
133 u8 *name; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
134 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
135 if (dptr > 0x0FFFFFFF) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
136 return(0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
137 dptr <<= 4; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
138 if (dptr >= total_img_size - 32) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
139 return(0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
140 name = image + dptr; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
141 if (is_namestr_ok(name)) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
142 return(name); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
143 else |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
144 return(0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
145 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
146 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
147 dump_common(idx, rec, path_prefix, typestr, newprefix) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
148 int idx, path_prefix, *newprefix; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
149 struct index_entry *rec; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
150 char *typestr; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
151 { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
152 u8 *name; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
153 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
154 name = get_name(rec->dataptr); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
155 if (!name) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
156 printf("entry #%x has an invalid name pointer!\n", idx); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
157 return(-1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
158 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
159 if (sizeof(workpath) - path_prefix < strlen(name) + 2) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
160 printf("entry #%x: pathname buffer overflow!\n", idx); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
161 return(-1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
162 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
163 path_prefix += sprintf(workpath + path_prefix, "/%s", name); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
164 printf("\n%s (%s)\n", workpath, typestr); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
165 printf("len=%x, unknown fields: %02X %04X %04X\n", rec->len, |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
166 rec->unknown_b1, rec->unknown_w1, rec->unknown_w2); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
167 if (newprefix) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
168 *newprefix = path_prefix; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
169 return(0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
170 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
171 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
172 dump_data_frag(entryidx, rec) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
173 struct index_entry *rec; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
174 { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
175 u32 dptr, endptr; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
176 int i, c; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
177 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
178 if (rec->len & 0xF || !rec->len) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
179 printf("entry #%x: don't know how to dump fragment of length %x\n", |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
180 entryidx, rec->len); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
181 return(-1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
182 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
183 dptr = rec->dataptr; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
184 if (dptr > 0x0FFFFFFF) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
185 inv: printf("entry #%x: invalid data pointer\n", entryidx); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
186 return(-1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
187 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
188 dptr <<= 4; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
189 if (dptr > total_img_size - rec->len) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
190 goto inv; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
191 for (endptr = dptr + rec->len; dptr < endptr; dptr += 0x10) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
192 printf("%08X: ", dptr); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
193 for (i = 0; i < 16; i++) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
194 printf("%02X ", image[dptr + i]); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
195 if (i == 7 || i == 15) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
196 putchar(' '); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
197 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
198 for (i = 0; i < 16; i++) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
199 c = image[dptr + i]; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
200 if (!isprint(c)) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
201 c = '.'; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
202 putchar(c); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
203 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
204 putchar('\n'); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
205 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
206 return(0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
207 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
208 |
24
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
209 dump_file_chain(firstent) |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
210 { |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
211 struct index_entry rec; |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
212 int ent; |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
213 |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
214 for (ent = firstent; ent != 0xFFFF; ent = rec.descend) { |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
215 get_index_entry(ent, &rec); |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
216 if (rec.type == 0xF4) { |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
217 printf("\nfile continuation (entry #%x)\n", ent); |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
218 printf("len=%x, unknown fields: %02X %04X %04X\n", |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
219 rec.len, rec.unknown_b1, |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
220 rec.unknown_w1, rec.unknown_w2); |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
221 dump_data_frag(ent, &rec); |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
222 } else { |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
223 printf("\ncontinuation entry at %x: type %02X != F4\n", |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
224 ent, rec.type); |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
225 printf("len=%x, unknown fields: %02X %04X %04X\n", |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
226 rec.len, rec.unknown_b1, |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
227 rec.unknown_w1, rec.unknown_w2); |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
228 } |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
229 if (rec.sibling != 0xFFFF) |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
230 printf("warning: non-nil sibling pointer\n"); |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
231 } |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
232 } |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
233 |
23
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
234 dump_dir(firstent, path_prefix) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
235 { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
236 struct index_entry rec; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
237 int ent; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
238 int subprefix; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
239 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
240 for (ent = firstent; ent != 0xFFFF; ent = rec.sibling) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
241 get_index_entry(ent, &rec); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
242 switch (rec.type) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
243 case 0x00: |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
244 /* deleted object - skip it */ |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
245 continue; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
246 case 0xF2: |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
247 /* subdirectory */ |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
248 if (dump_common(ent, &rec, path_prefix, "directory", |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
249 &subprefix) < 0) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
250 continue; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
251 dump_dir(rec.descend, subprefix); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
252 continue; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
253 case 0xF1: |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
254 /* regular file */ |
24
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
255 if (dump_common(ent, &rec, path_prefix, "file", 0) < 0) |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
256 continue; |
23
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
257 dump_data_frag(ent, &rec); |
24
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
258 dump_file_chain(rec.descend); |
23
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
259 continue; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
260 case 0xE1: |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
261 /* special .journal file */ |
24
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
262 if (dump_common(ent, &rec, path_prefix, "E1 file", 0)<0) |
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
263 continue; |
23
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
264 dump_data_frag(ent, &rec); |
24
9f3a7b014e63
MysteryFFS dump2: dumping all file fragments
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
23
diff
changeset
|
265 dump_file_chain(rec.descend); |
23
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
266 continue; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
267 default: |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
268 printf("entry #%x: unexpected type %02X\n", ent, |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
269 rec.type); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
270 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
271 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
272 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
273 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
274 dump_root() |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
275 { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
276 struct index_entry rec; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
277 char *name; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
278 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
279 get_index_entry(1, &rec); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
280 if (rec.type != 0xF2) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
281 fprintf(stderr, |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
282 "error: entry #1 (expected root dir) is not a directory\n"); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
283 exit(1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
284 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
285 name = get_name(rec.dataptr); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
286 if (!name) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
287 fprintf(stderr, "root entry has an invalid name pointer!\n"); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
288 exit(1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
289 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
290 printf("Root node name: %s\n", name); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
291 printf("len=%x, unknown fields: %02X %04X %04X\n", rec.len, |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
292 rec.unknown_b1, rec.unknown_w1, rec.unknown_w2); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
293 if (rec.sibling != 0xFFFF) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
294 printf("warning: root entry has a non-nil sibling pointer\n"); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
295 dump_dir(rec.descend, 0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
296 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
297 |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
298 main(argc, argv) |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
299 char **argv; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
300 { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
301 if (argc != 4) { |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
302 fprintf(stderr, "usage: %s imgfile blksize nblocks\n", argv[0]); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
303 exit(1); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
304 } |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
305 imgfile = argv[1]; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
306 eraseblk_size = strtoul(argv[2], 0, 0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
307 total_blocks = strtoul(argv[3], 0, 0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
308 total_img_size = eraseblk_size * total_blocks; |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
309 read_img_file(); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
310 find_index_block(); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
311 dump_root(); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
312 exit(0); |
671db68916c7
MysteryFFS: dump2 started, dumping the initial frag of each file
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
313 } |