diff options
author | Christophe Grenier <grenier@cgsecurity.org> | 2018-12-08 09:25:39 +0100 |
---|---|---|
committer | Christophe Grenier <grenier@cgsecurity.org> | 2018-12-08 09:25:39 +0100 |
commit | b73d5766ce81063c8f5b6b4fbad15be6eb2720f8 (patch) | |
tree | f6a300b69deaf5578c925c73e94f1eb79bdb3b9a | |
parent | d3e1bb0d2d97936c91b2a3401f61f970a76b6683 (diff) |
PhotoRec: recover Football Manager .fm files
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/file_fm.c | 69 | ||||
-rw-r--r-- | src/file_list.c | 2 |
3 files changed, 72 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 002a8be..532c578 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -139,6 +139,7 @@ file_C = filegen.c \ file_flac.c \ file_flp.c \ file_flv.c \ + file_fm.c \ file_fob.c \ file_fos.c \ file_fp5.c \ diff --git a/src/file_fm.c b/src/file_fm.c new file mode 100644 index 0000000..240e15d --- /dev/null +++ b/src/file_fm.c @@ -0,0 +1,69 @@ +/* + + File: file_fm.c + + Copyright (C) 2018 Christophe GRENIER <grenier@cgsecurity.org> + + This software is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write the Free Software Foundation, Inc., 51 + Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#ifdef HAVE_STRING_H +#include <string.h> +#endif +#include <stdio.h> +#include "types.h" +#include "filegen.h" +#include "common.h" + +static void register_header_check_fm(file_stat_t *file_stat); + +const file_hint_t file_hint_fm= { + .extension="fm", + .description="Football Manager", + .max_filesize=PHOTOREC_MAX_FILE_SIZE, + .recover=1, + .enable_by_default=1, + .register_header_check=®ister_header_check_fm +}; + +struct fm_header +{ + char magic[9]; + uint64_t size; +} __attribute__ ((gcc_struct, __packed__)); + +static int header_check_fm(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) +{ + const struct fm_header *hdr=(const struct fm_header *)buffer; + reset_file_recovery(file_recovery_new); + file_recovery_new->extension=file_hint_fm.extension; + file_recovery_new->calculated_file_size=(uint64_t)le64(hdr->size) + 12833; + file_recovery_new->data_check=&data_check_size; + file_recovery_new->file_check=&file_check_size; + return 1; +} + +static void register_header_check_fm(file_stat_t *file_stat) +{ + static const unsigned char fm_header[9]= { + 0x02, 0x01, 'f' , 'm' , 'f' , '.' , 0x07, 0x00, + 0x00 + }; + register_header_check(0, fm_header, sizeof(fm_header), &header_check_fm, file_stat); +} diff --git a/src/file_list.c b/src/file_list.c index ef39792..4fd428f 100644 --- a/src/file_list.c +++ b/src/file_list.c @@ -141,6 +141,7 @@ extern const file_hint_t file_hint_flac; extern const file_hint_t file_hint_fasttxt; extern const file_hint_t file_hint_flp; extern const file_hint_t file_hint_flv; +extern const file_hint_t file_hint_fm; extern const file_hint_t file_hint_fob; extern const file_hint_t file_hint_fos; extern const file_hint_t file_hint_fp5; @@ -474,6 +475,7 @@ file_enable_t list_file_enable[]= { .enable=0, .file_hint=&file_hint_flac }, { .enable=0, .file_hint=&file_hint_flp }, { .enable=0, .file_hint=&file_hint_flv }, + { .enable=0, .file_hint=&file_hint_fm }, { .enable=0, .file_hint=&file_hint_fob }, { .enable=0, .file_hint=&file_hint_fos }, { .enable=0, .file_hint=&file_hint_fp5 }, |