More additions
[tpg/acess2.git] / Usermode / Applications / MultibootCheck_src / MultibootCheck.c
1 /*
2  */
3
4 #include <stdio.h>
5 #include <stdlib.h>
6
7 // === CONSTANTS ===
8 #define SCAN_SPACE      8192
9 #define MAGIC   0x1BADB002
10
11 // === TYPES ===
12 typedef struct {
13         unsigned long   Magic;
14         unsigned long   Flags;
15         unsigned long   Checksum;
16 } tMBootImg;
17
18 // === PROTOTYPES ===
19 void    CheckMultiboot(char *file);
20
21 // === CODE ===
22 /**
23  */
24 int main(int argc, char *argv[])
25 {
26         if(argc != 2)
27         {
28                 fprintf(stderr, "Usage: %s <file>\n", argv[0]);
29                 fprintf(stderr, " <file>        Path of file to validate\n");
30                 fprintf(stderr, "\n");
31         }
32         
33         CheckMultiboot(argv[1]);
34         
35         return 0;
36 }
37
38 /**
39  */
40 void CheckMultiboot(char *file)
41 {
42         FILE    *fp = fopen(file, "rb");
43          int    len, ofs;
44         char    buf[SCAN_SPACE];
45         tMBootImg       *img;
46         
47         // Error Check
48         if(fp == NULL) {
49                 fprintf(stderr, "Unable to open '%s' for reading\n", file);
50                 exit(EXIT_FAILURE);
51         }
52         
53         // Get file length
54         fseek(fp, 0, SEEK_END);
55         len = ftell(fp);
56         fseek(fp, 0, SEEK_SET);
57         
58         // Clip
59         if(len > SCAN_SPACE)    len = SCAN_SPACE;
60         
61         // Read
62         fread(buf, len, 1, fp);
63         
64         // Scan
65         for(ofs = 0; ofs < len-sizeof(tMBootImg); ofs += 4)
66         {
67                 img = (void*)&buf[ofs];
68                 // Check magic value
69                 if(img->Magic != MAGIC) continue;
70                 // Validate checksum
71                 if(img->Magic + img->Flags + img->Checksum != 0) {
72                         printf("Checksum fail at 0x%x\n", ofs);
73                         continue;
74                 }
75                 // Check undefined feature flags
76                 if(img->Flags & 0xFFF8) {
77                         printf("Header at 0x%x uses undefined features (0x%lx)\n", ofs, img->Flags);
78                         return ;
79                 }
80                 // Print success
81                 printf("Found Multiboot header at 0x%x\n", ofs);
82                 return ;
83         }
84         
85         printf("No multiboot header found\n");
86 }

UCC git Repository :: git.ucc.asn.au