blob: acc9659e8681ea5c48568cc88ac2db56ca240f24 [file] [log] [blame]
Ketut Putu Kumajaya63846372014-06-23 20:05:33 +07001#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <unistd.h>
5#include <fcntl.h>
6#include <errno.h>
7#include <limits.h>
8#include <libgen.h>
9
Ketut Putu Kumajaya63846372014-06-23 20:05:33 +070010#include "bootimg.h"
11
12typedef unsigned char byte;
13
14int read_padding(FILE* f, unsigned itemsize, int pagesize)
15{
16 byte* buf = (byte*)malloc(sizeof(byte) * pagesize);
17 unsigned pagemask = pagesize - 1;
18 unsigned count;
19
20 if((itemsize & pagemask) == 0) {
21 free(buf);
22 return 0;
23 }
24
25 count = pagesize - (itemsize & pagemask);
26
27 fread(buf, count, 1, f);
28 free(buf);
29 return count;
30}
31
32void write_string_to_file(char* file, char* string)
33{
34 FILE* f = fopen(file, "w");
35 fwrite(string, strlen(string), 1, f);
36 fwrite("\n", 1, 1, f);
37 fclose(f);
38}
39
40int usage() {
41 printf("usage: unpackbootimg\n");
42 printf("\t-i|--input boot.img\n");
43 printf("\t[ -o|--output output_directory]\n");
44 printf("\t[ -p|--pagesize <size-in-hexadecimal> ]\n");
45 return 0;
46}
47
48int main(int argc, char** argv)
49{
50 char tmp[PATH_MAX];
51 char* directory = "./";
52 char* filename = NULL;
53 int pagesize = 0;
54
55 argc--;
56 argv++;
57 while(argc > 0){
58 char *arg = argv[0];
59 char *val = argv[1];
60 argc -= 2;
61 argv += 2;
62 if(!strcmp(arg, "--input") || !strcmp(arg, "-i")) {
63 filename = val;
64 } else if(!strcmp(arg, "--output") || !strcmp(arg, "-o")) {
65 directory = val;
66 } else if(!strcmp(arg, "--pagesize") || !strcmp(arg, "-p")) {
67 pagesize = strtoul(val, 0, 16);
68 } else {
69 return usage();
70 }
71 }
72
73 if (filename == NULL) {
74 return usage();
75 }
76
77 int total_read = 0;
78 FILE* f = fopen(filename, "rb");
79 boot_img_hdr header;
80
81 //printf("Reading header...\n");
82 int i;
83 for (i = 0; i <= 512; i++) {
84 fseek(f, i, SEEK_SET);
85 fread(tmp, BOOT_MAGIC_SIZE, 1, f);
86 if (memcmp(tmp, BOOT_MAGIC, BOOT_MAGIC_SIZE) == 0)
87 break;
88 }
89 total_read = i;
90 if (i > 512) {
91 printf("Android boot magic not found.\n");
92 return 1;
93 }
94 fseek(f, i, SEEK_SET);
95 printf("Android magic found at: %d\n", i);
96
97 fread(&header, sizeof(header), 1, f);
98 printf("BOARD_KERNEL_CMDLINE %s\n", header.cmdline);
99 printf("BOARD_KERNEL_BASE %08x\n", header.kernel_addr - 0x00008000);
100 printf("BOARD_RAMDISK_OFFSET %08x\n", header.ramdisk_addr - header.kernel_addr + 0x00008000);
101 printf("BOARD_SECOND_OFFSET %08x\n", header.second_addr - header.kernel_addr + 0x00008000);
102 printf("BOARD_TAGS_OFFSET %08x\n",header.tags_addr - header.kernel_addr + 0x00008000);
103 printf("BOARD_PAGE_SIZE %d\n", header.page_size);
104 printf("BOARD_SECOND_SIZE %d\n", header.second_size);
105 printf("BOARD_DT_SIZE %d\n", header.dt_size);
106
107 if (pagesize == 0) {
108 pagesize = header.page_size;
109 }
110
111 //printf("cmdline...\n");
112 sprintf(tmp, "%s/%s", directory, basename(filename));
113 strcat(tmp, "-cmdline");
114 write_string_to_file(tmp, header.cmdline);
115
116 //printf("base...\n");
117 sprintf(tmp, "%s/%s", directory, basename(filename));
118 strcat(tmp, "-base");
119 char basetmp[200];
120 sprintf(basetmp, "%08x", header.kernel_addr - 0x00008000);
121 write_string_to_file(tmp, basetmp);
122
123 //printf("ramdisk_offset...\n");
124 sprintf(tmp, "%s/%s", directory, basename(filename));
125 strcat(tmp, "-ramdisk_offset");
126 char ramdisktmp[200];
127 sprintf(ramdisktmp, "%08x", header.ramdisk_addr - header.kernel_addr + 0x00008000);
128 write_string_to_file(tmp, ramdisktmp);
129
130 //printf("second_offset...\n");
131 sprintf(tmp, "%s/%s", directory, basename(filename));
132 strcat(tmp, "-second_offset");
133 char secondtmp[200];
134 sprintf(secondtmp, "%08x", header.second_addr - header.kernel_addr + 0x00008000);
135 write_string_to_file(tmp, secondtmp);
136
137 //printf("tags_offset...\n");
138 sprintf(tmp, "%s/%s", directory, basename(filename));
139 strcat(tmp, "-tags_offset");
140 char tagstmp[200];
141 sprintf(tagstmp, "%08x", header.tags_addr - header.kernel_addr + 0x00008000);
142 write_string_to_file(tmp, tagstmp);
143
144 //printf("pagesize...\n");
145 sprintf(tmp, "%s/%s", directory, basename(filename));
146 strcat(tmp, "-pagesize");
147 char pagesizetmp[200];
148 sprintf(pagesizetmp, "%d", header.page_size);
149 write_string_to_file(tmp, pagesizetmp);
150
151 total_read += sizeof(header);
152 //printf("total read: %d\n", total_read);
153 total_read += read_padding(f, sizeof(header), pagesize);
154
155 sprintf(tmp, "%s/%s", directory, basename(filename));
156 strcat(tmp, "-zImage");
157 FILE *k = fopen(tmp, "wb");
158 byte* kernel = (byte*)malloc(header.kernel_size);
159 //printf("Reading kernel...\n");
160 fread(kernel, header.kernel_size, 1, f);
161 total_read += header.kernel_size;
162 fwrite(kernel, header.kernel_size, 1, k);
163 fclose(k);
164
165 //printf("total read: %d\n", header.kernel_size);
166 total_read += read_padding(f, header.kernel_size, pagesize);
167
168
169 byte* ramdisk = (byte*)malloc(header.ramdisk_size);
170 //printf("Reading ramdisk...\n");
171 fread(ramdisk, header.ramdisk_size, 1, f);
172 total_read += header.ramdisk_size;
173 sprintf(tmp, "%s/%s", directory, basename(filename));
174 if(ramdisk[0] == 0x02 && ramdisk[1]== 0x21)
175 strcat(tmp, "-ramdisk.lz4");
176 else
177 strcat(tmp, "-ramdisk.gz");
178 FILE *r = fopen(tmp, "wb");
179 fwrite(ramdisk, header.ramdisk_size, 1, r);
180 fclose(r);
181
182 total_read += read_padding(f, header.ramdisk_size, pagesize);
183
184 sprintf(tmp, "%s/%s", directory, basename(filename));
185 strcat(tmp, "-second");
186 FILE *s = fopen(tmp, "wb");
187 byte* second = (byte*)malloc(header.second_size);
188 //printf("Reading second...\n");
189 fread(second, header.second_size, 1, f);
190 total_read += header.second_size;
191 fwrite(second, header.second_size, 1, r);
192 fclose(s);
193
194 total_read += read_padding(f, header.second_size, pagesize);
195
196 sprintf(tmp, "%s/%s", directory, basename(filename));
197 strcat(tmp, "-dt");
198 FILE *d = fopen(tmp, "wb");
199 byte* dt = (byte*)malloc(header.dt_size);
200 //printf("Reading dt...\n");
201 fread(dt, header.dt_size, 1, f);
202 total_read += header.dt_size;
203 fwrite(dt, header.dt_size, 1, r);
204 fclose(d);
Ketut Putu Kumajaya0c2cc5a2014-06-23 20:18:46 +0700205
206 total_read += read_padding(f, header.dt_size, pagesize);
207
208 sprintf(tmp, "%s/%s", directory, basename(filename));
209 strcat(tmp, "-signature");
210 FILE *fsig = fopen(tmp, "wb");
211 byte* bsig = (byte*)malloc(256);
212 //printf("Reading signature...\n");
213 fread(bsig, 256, 1, f);
214 total_read += 256;
215 fwrite(bsig, 256, 1, r);
216 fclose(fsig);
217
Ketut Putu Kumajaya63846372014-06-23 20:05:33 +0700218 fclose(f);
219
220 //printf("Total Read: %d\n", total_read);
221 return 0;
222}