void extract_files(unsigned char *fw, int len)
{
unsigned char *pos;
- unsigned int length;
- unsigned char unknown[5];
+ unsigned int content_length;
+ unsigned int name_length;
+ unsigned char unknown;
char *name;
pos = fw + 0x28;
pos = fw + *((unsigned int*)pos);
while (pos < (fw + len)) {
- unknown[0] = *pos; pos++;
- unknown[1] = *pos; pos++;
- unknown[2] = *pos; pos++;
- unknown[3] = *pos; pos++;
- unknown[4] = *pos; pos++;
- length = *((unsigned int*)pos);
+ unknown = *pos; pos++;
+ name_length = *((unsigned int*)pos);
+ pos += 4;
+ content_length = *((unsigned int*)pos);
pos += 4;
name = (char*)pos;
- pos += strlen(name) + 1;
- if ((pos + length) > (fw + len)) {
+ if (((pos + content_length) > (fw + len)) ||
+ ((pos + name_length) > (fw + len))) {
printf("EOF reached\n");
break;
}
- printf("%s: unknown: %02x %02x %02x %02x %02x, length: %d",
- name, unknown[0], unknown[1], unknown[2], unknown[3],
- unknown[4], length);
+ pos += name_length;
+
+ printf("%s: unknown: 0x%02x, length: %d",
+ name, unknown, content_length);
- if (length > 0) {
- write_file(name, pos, length);
+ if (content_length > 0) {
+ write_file(name, pos, content_length);
if (*((unsigned int*)pos) == LZ_MAGIC) {
char *lzname;
}
}
- pos += length;
+ pos += content_length;
}
}