Chris Styles
/
BinaryPatcher
A program to insert Valid User Code checksums
main.cpp@0:f125b9cfab7b, 2012-10-17 (annotated)
- Committer:
- chris
- Date:
- Wed Oct 17 13:18:31 2012 +0000
- Revision:
- 0:f125b9cfab7b
First commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
chris | 0:f125b9cfab7b | 1 | #include "mbed.h" |
chris | 0:f125b9cfab7b | 2 | |
chris | 0:f125b9cfab7b | 3 | LocalFileSystem fs ("fs"); |
chris | 0:f125b9cfab7b | 4 | DigitalOut led1(LED1); |
chris | 0:f125b9cfab7b | 5 | DigitalOut led4(LED4); |
chris | 0:f125b9cfab7b | 6 | |
chris | 0:f125b9cfab7b | 7 | int main() { |
chris | 0:f125b9cfab7b | 8 | |
chris | 0:f125b9cfab7b | 9 | int ctr=32; // 32 because the fixed size of the vector table |
chris | 0:f125b9cfab7b | 10 | |
chris | 0:f125b9cfab7b | 11 | printf("File patcher\n"); |
chris | 0:f125b9cfab7b | 12 | |
chris | 0:f125b9cfab7b | 13 | FILE *f1 = fopen("/fs/file.unp","rb"); // read binary |
chris | 0:f125b9cfab7b | 14 | FILE *f2 = fopen("/fs/file.pat","wb"); // write binary |
chris | 0:f125b9cfab7b | 15 | |
chris | 0:f125b9cfab7b | 16 | if (f1 == NULL) { |
chris | 0:f125b9cfab7b | 17 | printf("Cant open file for reading\n"); |
chris | 0:f125b9cfab7b | 18 | while (1) { |
chris | 0:f125b9cfab7b | 19 | led1 = !led1; |
chris | 0:f125b9cfab7b | 20 | wait(0.2); |
chris | 0:f125b9cfab7b | 21 | } |
chris | 0:f125b9cfab7b | 22 | } |
chris | 0:f125b9cfab7b | 23 | |
chris | 0:f125b9cfab7b | 24 | else { |
chris | 0:f125b9cfab7b | 25 | |
chris | 0:f125b9cfab7b | 26 | unsigned int vector [8]; // storage for the vector table |
chris | 0:f125b9cfab7b | 27 | unsigned int sum = 0; // |
chris | 0:f125b9cfab7b | 28 | |
chris | 0:f125b9cfab7b | 29 | // read first 7 words (28 bytes) into an array |
chris | 0:f125b9cfab7b | 30 | for (int i = 0; i < 8; i++) { |
chris | 0:f125b9cfab7b | 31 | vector[i] = 0; // zero the vector location |
chris | 0:f125b9cfab7b | 32 | for (int j = 0; j < 4; j++) { |
chris | 0:f125b9cfab7b | 33 | char c = fgetc(f1); // read char from file |
chris | 0:f125b9cfab7b | 34 | vector[i] |= (c << (8*j)); // shift to byte location |
chris | 0:f125b9cfab7b | 35 | } |
chris | 0:f125b9cfab7b | 36 | sum += vector[i]; // keep a running total |
chris | 0:f125b9cfab7b | 37 | } |
chris | 0:f125b9cfab7b | 38 | |
chris | 0:f125b9cfab7b | 39 | |
chris | 0:f125b9cfab7b | 40 | // calculate the 2's compliment, for vector[7] |
chris | 0:f125b9cfab7b | 41 | vector[7] = (~sum) + 1; |
chris | 0:f125b9cfab7b | 42 | |
chris | 0:f125b9cfab7b | 43 | for (int i = 0; i < 8; i++) { |
chris | 0:f125b9cfab7b | 44 | printf("Vector[%d] = 0x%08x\n",i,vector[i]); |
chris | 0:f125b9cfab7b | 45 | } |
chris | 0:f125b9cfab7b | 46 | |
chris | 0:f125b9cfab7b | 47 | printf("Sum vector = 0x%08x\n",sum); |
chris | 0:f125b9cfab7b | 48 | |
chris | 0:f125b9cfab7b | 49 | |
chris | 0:f125b9cfab7b | 50 | // write out patched vector table |
chris | 0:f125b9cfab7b | 51 | // read first 7 words (28 bytes) into an array |
chris | 0:f125b9cfab7b | 52 | for (int i = 0; i < 8; i++) { |
chris | 0:f125b9cfab7b | 53 | for (int j = 0; j < 4; j++) { |
chris | 0:f125b9cfab7b | 54 | char c = ( vector[i] >> (8*j)) & 0xFF; |
chris | 0:f125b9cfab7b | 55 | fputc(c,f2); // read char from file |
chris | 0:f125b9cfab7b | 56 | } |
chris | 0:f125b9cfab7b | 57 | } |
chris | 0:f125b9cfab7b | 58 | |
chris | 0:f125b9cfab7b | 59 | // read in and write remaining bytes of source binary |
chris | 0:f125b9cfab7b | 60 | while (!feof(f1)) { |
chris | 0:f125b9cfab7b | 61 | char c = fgetc (f1); // read char from file |
chris | 0:f125b9cfab7b | 62 | fputc(c,f2); // write byte to file |
chris | 0:f125b9cfab7b | 63 | ctr++; |
chris | 0:f125b9cfab7b | 64 | } |
chris | 0:f125b9cfab7b | 65 | |
chris | 0:f125b9cfab7b | 66 | } |
chris | 0:f125b9cfab7b | 67 | |
chris | 0:f125b9cfab7b | 68 | fclose(f1); |
chris | 0:f125b9cfab7b | 69 | fclose(f2); |
chris | 0:f125b9cfab7b | 70 | |
chris | 0:f125b9cfab7b | 71 | printf("Done! %d bytes processed\n",ctr); |
chris | 0:f125b9cfab7b | 72 | while (1) { |
chris | 0:f125b9cfab7b | 73 | led4 = !led4; |
chris | 0:f125b9cfab7b | 74 | wait(0.2); |
chris | 0:f125b9cfab7b | 75 | } |
chris | 0:f125b9cfab7b | 76 | |
chris | 0:f125b9cfab7b | 77 | |
chris | 0:f125b9cfab7b | 78 | } |