From 6240b34ac784790e9171610603ee077d05fddc90 Mon Sep 17 00:00:00 2001 From: "sgunderson@bigfoot.com" <> Date: Sat, 10 Feb 2007 13:11:04 +0100 Subject: [PATCH] Initial (probably final) checkin. --- dirsearch.c | 38 ++++++++++++++++++++++ salvage.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 dirsearch.c create mode 100644 salvage.c diff --git a/dirsearch.c b/dirsearch.c new file mode 100644 index 0000000..805b3c1 --- /dev/null +++ b/dirsearch.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include + +#define CLUSTER_SIZE 16384 +#define OFFSET 0x2800 + +int main(int argc, char **argv) +{ + int fd = open("/home/sesse/minnekort.img", O_RDONLY); + int offset = OFFSET; + char rd[32]; + + for ( ;; ) { + if (lseek(fd, offset, SEEK_SET) != offset) { + break; + } + read(fd, rd, 32); + if (memcmp(rd, ". ", 11) == 0) { + int i; + + printf("Possible directory found at 0x%x\n", offset); + for (i = 0; i < 128; ++i) { + read(fd, rd, 32); + printf("%c%c%c%c%c%c%c%c.%c%c%c\n", + rd[0], rd[1], rd[2], rd[3], + rd[4], rd[5], rd[6], rd[7], + rd[8], rd[9], rd[10]); + } + } + offset += CLUSTER_SIZE; + printf("0x%x\r", offset); + fflush(stdout); + } + return 0; +} diff --git a/salvage.c b/salvage.c new file mode 100644 index 0000000..413a15c --- /dev/null +++ b/salvage.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include + +#define FAT_SIZE 65536 +#define FAT_START 0x27400 +#define DATA_START 0x42800 +#define CLUSTER_SIZE 16384 +unsigned short fat[FAT_SIZE]; + +int main(int argc, char **argv) +{ + int fd = open("/home/sesse/minnekort.img", O_RDONLY); + int ofd; + int offset; + int cluster; + int left; + unsigned char de[32]; + char filename[8 + 1 + 3 + 1]; + char data[CLUSTER_SIZE]; + + if (fd == -1) { + perror("/home/sesse/minnekort.img"); + exit(1); + } + + // read the FAT + lseek(fd, FAT_START, SEEK_SET); + read(fd, fat, FAT_SIZE * sizeof(unsigned short)); + + // read the directory structure in question + sscanf(argv[1], "%i", &offset); + lseek(fd, offset, SEEK_SET); + read(fd, de, 32); + + memcpy(filename, de, 8); + filename[8] = '.'; + memcpy(filename + 9, de + 8, 3); + filename[12] = '\0'; + + printf("Filename = %s\n", filename); + ofd = open(filename, O_WRONLY | O_CREAT, 0644); + + left = *((unsigned int *)(de + 0x1c)); + printf("Size = %u\n", left); + + printf("Recovering:"); + cluster = *((unsigned short *)(de + 0x1a)); +// printf(" %u(0x%x)", cluster, cluster * CLUSTER_SIZE + DATA_START); +// fflush(stdout); + + for ( ;; ) { + int towrite = (CLUSTER_SIZE < left) ? CLUSTER_SIZE : left; + + lseek(fd, cluster * CLUSTER_SIZE + DATA_START, SEEK_SET); + read(fd, data, CLUSTER_SIZE); + write(ofd, data, towrite); + + // read the next entry in the FAT + cluster = fat[cluster]; + + /* if (towrite < CLUSTER_SIZE) + printf("(trunc)"); + printf(" %u", cluster); + fflush(stdout);*/ + + if (cluster < 0x0002) { + printf(" (ERROR)"); + break; + } + if (cluster >= 0xfff0 && cluster < 0xfff8) { + printf(" (ERROR)"); + break; + } + if (cluster >= 0xfff8) { + printf(" (EOF)"); + break; + } + if (towrite < CLUSTER_SIZE) { + printf(" (EXPECTED EOF)\n"); + } + + // printf("(0x%x)", cluster * CLUSTER_SIZE + DATA_START); + + left -= towrite; + } + printf("\n"); + close(fd); + close(ofd); + + return 0; +} -- 2.39.2