Chris Styles
/
BinaryPatcher
A program to insert Valid User Code checksums
Diff: main.cpp
- Revision:
- 0:f125b9cfab7b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Oct 17 13:18:31 2012 +0000 @@ -0,0 +1,78 @@ +#include "mbed.h" + +LocalFileSystem fs ("fs"); +DigitalOut led1(LED1); +DigitalOut led4(LED4); + +int main() { + + int ctr=32; // 32 because the fixed size of the vector table + + printf("File patcher\n"); + + FILE *f1 = fopen("/fs/file.unp","rb"); // read binary + FILE *f2 = fopen("/fs/file.pat","wb"); // write binary + + if (f1 == NULL) { + printf("Cant open file for reading\n"); + while (1) { + led1 = !led1; + wait(0.2); + } + } + + else { + + unsigned int vector [8]; // storage for the vector table + unsigned int sum = 0; // + + // read first 7 words (28 bytes) into an array + for (int i = 0; i < 8; i++) { + vector[i] = 0; // zero the vector location + for (int j = 0; j < 4; j++) { + char c = fgetc(f1); // read char from file + vector[i] |= (c << (8*j)); // shift to byte location + } + sum += vector[i]; // keep a running total + } + + + // calculate the 2's compliment, for vector[7] + vector[7] = (~sum) + 1; + + for (int i = 0; i < 8; i++) { + printf("Vector[%d] = 0x%08x\n",i,vector[i]); + } + + printf("Sum vector = 0x%08x\n",sum); + + + // write out patched vector table + // read first 7 words (28 bytes) into an array + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 4; j++) { + char c = ( vector[i] >> (8*j)) & 0xFF; + fputc(c,f2); // read char from file + } + } + + // read in and write remaining bytes of source binary + while (!feof(f1)) { + char c = fgetc (f1); // read char from file + fputc(c,f2); // write byte to file + ctr++; + } + + } + + fclose(f1); + fclose(f2); + + printf("Done! %d bytes processed\n",ctr); + while (1) { + led4 = !led4; + wait(0.2); + } + + +}