]> git.sesse.net Git - fat-rescue/commitdiff
Initial (probably final) checkin. master
authorsgunderson@bigfoot.com <>
Sat, 10 Feb 2007 12:11:04 +0000 (13:11 +0100)
committersgunderson@bigfoot.com <>
Sat, 10 Feb 2007 12:11:04 +0000 (13:11 +0100)
dirsearch.c [new file with mode: 0644]
salvage.c [new file with mode: 0644]

diff --git a/dirsearch.c b/dirsearch.c
new file mode 100644 (file)
index 0000000..805b3c1
--- /dev/null
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+
+#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 (file)
index 0000000..413a15c
--- /dev/null
+++ b/salvage.c
@@ -0,0 +1,94 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+
+#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;
+}