[Extractor-gtk-cvslog] SF.net SVN: extractor-gtk:[114] trunk/extractor/generic.c
Extract files from unusual archive formats
Brought to you by:
someone-guy
From: <som...@us...> - 2009-02-08 12:42:11
|
Revision: 114 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=114&view=rev Author: someone-guy Date: 2009-02-08 12:42:05 +0000 (Sun, 08 Feb 2009) Log Message: ----------- Add detection for DV headers. Modified Paths: -------------- trunk/extractor/generic.c Modified: trunk/extractor/generic.c =================================================================== --- trunk/extractor/generic.c 2008-09-17 19:00:18 UTC (rev 113) +++ trunk/extractor/generic.c 2009-02-08 12:42:05 UTC (rev 114) @@ -57,6 +57,18 @@ return res; } +static inline uint64_t get_le64(uint8_t **p) { + uint64_t res = get_le32(p); + res += (uint64_t)get_le32(p) << 32; + return res; +} + +static inline uint64_t get_be64(uint8_t **p) { + uint64_t res = (uint64_t)get_be32(p) << 32; + res += get_be32(p); + return res; +} + static file_t *get_list(FILE *in) { register buffer_t t = 0; uint8_t *rambuf = malloc(2 * RAMBUF_SZ); @@ -85,6 +97,7 @@ t = t << 8 | rambuf[rambuf_pos++]; p = rambuf + rambuf_pos; fpos++; + // NOTE: at least RAMBUF_SZ bytes after p are valid (unless EOF was reached) switch (t) { case HUGETAG(0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1): add_entry(&list, cnt, "msi"); @@ -105,6 +118,18 @@ break; } switch ((uint32_t)t) { + case 0x1f07003f: + case 0x1f0700bf: { + uint32_t dvhdr = get_be32(&p); + uint64_t padding = get_be64(&p); + p -= 12; + if (padding != 0xffffffffffffffff) break; + add_entry(&list, cnt, "dv"); + list[cnt].start = fpos - 4; + list[cnt].len = 0; + cnt++; + break; + } case TAG('M', 'S', 'C', 'F'): { uint32_t unk = get_le32(&p); uint32_t size = get_le32(&p); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |