summaryrefslogtreecommitdiffstats
path: root/src/file_bld.c
diff options
context:
space:
mode:
authorChristophe Grenier <grenier@cgsecurity.org>2007-11-27 20:48:20 +0100
committerChristophe Grenier <grenier@cgsecurity.org>2007-11-27 20:48:20 +0100
commit29d126909672ff5e31efd0f38766317e2feb1960 (patch)
tree7677b48c61d6fba04276c3060f81703de73861ed /src/file_bld.c
parent850c4903821f619b305519823c3e61dfb34010ec (diff)
PhotoRec: check blender .bld content
Diffstat (limited to 'src/file_bld.c')
-rw-r--r--src/file_bld.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/file_bld.c b/src/file_bld.c
index a57588e..1b7253f 100644
--- a/src/file_bld.c
+++ b/src/file_bld.c
@@ -29,9 +29,14 @@
#include <stdio.h>
#include "types.h"
#include "filegen.h"
+#include "log.h"
static void register_header_check_blend(file_stat_t *file_stat);
static int header_check_blend(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new);
+static int data_check_blend4le(const unsigned char *buffer, const unsigned int buffer_size, file_recovery_t *file_recovery);
+static int data_check_blend8le(const unsigned char *buffer, const unsigned int buffer_size, file_recovery_t *file_recovery);
+static int data_check_blend4be(const unsigned char *buffer, const unsigned int buffer_size, file_recovery_t *file_recovery);
+static int data_check_blend8be(const unsigned char *buffer, const unsigned int buffer_size, file_recovery_t *file_recovery);
const file_hint_t file_hint_blend= {
.extension="blend",
@@ -44,6 +49,7 @@ const file_hint_t file_hint_blend= {
};
static const unsigned char blend_header[7] = { 'B', 'L', 'E', 'N', 'D', 'E', 'R'};
+static const unsigned char blend_header_footer[4] = { 'E', 'N', 'D', 'B'};
static void register_header_check_blend(file_stat_t *file_stat)
{
@@ -55,9 +61,120 @@ static int header_check_blend(const unsigned char *buffer, const unsigned int bu
if(memcmp(buffer,blend_header,sizeof(blend_header))==0 && (buffer[7]=='_' || buffer[7]=='-'))
{
reset_file_recovery(file_recovery_new);
+ file_recovery_new->calculated_file_size=12;
+ if(buffer[8]=='v')
+ { /* Little endian */
+ if(buffer[7]=='_')
+ file_recovery_new->data_check=&data_check_blend4le;
+ else
+ file_recovery_new->data_check=&data_check_blend8le;
+ }
+ else
+ { /* Big endian */
+ if(buffer[7]=='_')
+ file_recovery_new->data_check=&data_check_blend4be;
+ else
+ file_recovery_new->data_check=&data_check_blend8be;
+ }
file_recovery_new->extension=file_hint_blend.extension;
+ file_recovery_new->file_check=&file_check_size;
return 1;
}
return 0;
}
+static int data_check_blend4le(const unsigned char *buffer, const unsigned int buffer_size, file_recovery_t *file_recovery)
+{
+ while(file_recovery->calculated_file_size + 0x14 < file_recovery->file_size + buffer_size/2)
+ {
+ unsigned int len;
+ unsigned int i=file_recovery->calculated_file_size - file_recovery->file_size + buffer_size/2;
+ len=buffer[i+4]+ ((buffer[i+5])<<8)+ ((buffer[i+6])<<16)+ ((buffer[i+7])<<24);
+#ifdef DEBUG_BLEND
+ log_debug("file_mov.c: atom %c%c%c%c (0x%02x%02x%02x%02x) size %u, calculated_file_size %llu\n",
+ buffer[i+0],buffer[i+1],buffer[i+2],buffer[i+3],
+ buffer[i+0],buffer[i+1],buffer[i+2],buffer[i+3],
+ len,
+ (long long unsigned)file_recovery->calculated_file_size);
+#endif
+ if(memcmp(&buffer[i],blend_header_footer,sizeof(blend_header_footer))==0)
+ {
+ file_recovery->calculated_file_size+=0x14;
+ return 2;
+ }
+ file_recovery->calculated_file_size+=0x14+len;
+ }
+ return 1;
+}
+
+static int data_check_blend8le(const unsigned char *buffer, const unsigned int buffer_size, file_recovery_t *file_recovery)
+{
+ while(file_recovery->calculated_file_size + 0x18 < file_recovery->file_size + buffer_size/2)
+ {
+ unsigned int len;
+ unsigned int i=file_recovery->calculated_file_size - file_recovery->file_size + buffer_size/2;
+ len=buffer[i+4]+ ((buffer[i+5])<<8)+ ((buffer[i+6])<<16)+ ((buffer[i+7])<<24);
+#ifdef DEBUG_BLEND
+ log_debug("file_mov.c: atom %c%c%c%c (0x%02x%02x%02x%02x) size %u, calculated_file_size %llu\n",
+ buffer[i+0],buffer[i+1],buffer[i+2],buffer[i+3],
+ buffer[i+0],buffer[i+1],buffer[i+2],buffer[i+3],
+ len,
+ (long long unsigned)file_recovery->calculated_file_size);
+#endif
+ if(memcmp(&buffer[i],blend_header_footer,sizeof(blend_header_footer))==0)
+ {
+ file_recovery->calculated_file_size+=0x18;
+ return 2;
+ }
+ file_recovery->calculated_file_size+=0x18+len;
+ }
+ return 1;
+}
+
+static int data_check_blend4be(const unsigned char *buffer, const unsigned int buffer_size, file_recovery_t *file_recovery)
+{
+ while(file_recovery->calculated_file_size + 0x14 < file_recovery->file_size + buffer_size/2)
+ {
+ unsigned int len;
+ unsigned int i=file_recovery->calculated_file_size - file_recovery->file_size + buffer_size/2;
+ len=(buffer[i+4]<<24)+ ((buffer[i+5])<<16)+ ((buffer[i+6])<<8)+ buffer[i+7];
+#ifdef DEBUG_BLEND
+ log_debug("file_mov.c: atom %c%c%c%c (0x%02x%02x%02x%02x) size %u, calculated_file_size %llu\n",
+ buffer[i+0],buffer[i+1],buffer[i+2],buffer[i+3],
+ buffer[i+0],buffer[i+1],buffer[i+2],buffer[i+3],
+ len,
+ (long long unsigned)file_recovery->calculated_file_size);
+#endif
+ if(memcmp(&buffer[i],blend_header_footer,sizeof(blend_header_footer))==0)
+ {
+ file_recovery->calculated_file_size+=0x14;
+ return 2;
+ }
+ file_recovery->calculated_file_size+=0x14+len;
+ }
+ return 1;
+}
+
+static int data_check_blend8be(const unsigned char *buffer, const unsigned int buffer_size, file_recovery_t *file_recovery)
+{
+ while(file_recovery->calculated_file_size + 0x18 < file_recovery->file_size + buffer_size/2)
+ {
+ unsigned int len;
+ unsigned int i=file_recovery->calculated_file_size - file_recovery->file_size + buffer_size/2;
+ len=(buffer[i+4]<<24)+ ((buffer[i+5])<<16)+ ((buffer[i+6])<<8)+ buffer[i+7];
+#ifdef DEBUG_BLEND
+ log_debug("file_mov.c: atom %c%c%c%c (0x%02x%02x%02x%02x) size %u, calculated_file_size %llu\n",
+ buffer[i+0],buffer[i+1],buffer[i+2],buffer[i+3],
+ buffer[i+0],buffer[i+1],buffer[i+2],buffer[i+3],
+ len,
+ (long long unsigned)file_recovery->calculated_file_size);
+#endif
+ if(memcmp(&buffer[i],blend_header_footer,sizeof(blend_header_footer))==0)
+ {
+ file_recovery->calculated_file_size+=0x18;
+ return 2;
+ }
+ file_recovery->calculated_file_size+=0x18+len;
+ }
+ return 1;
+}