rev |
line source |
pascal@14150
|
1 #include <sys/types.h>
|
pascal@14150
|
2 #include <fcntl.h>
|
pascal@14150
|
3 #include <stdio.h>
|
pascal@14150
|
4 #include "iso2exe.h"
|
pascal@14150
|
5
|
pascal@14150
|
6 static int fd;
|
pascal@14150
|
7 static char buffer[2048];
|
pascal@14150
|
8
|
pascal@14150
|
9 static void quit(char *msg)
|
pascal@14150
|
10 {
|
pascal@14150
|
11 fprintf(stderr,"%s.\n", msg);
|
pascal@14150
|
12 exit(1);
|
pascal@14150
|
13 }
|
pascal@14150
|
14
|
pascal@14150
|
15 static void readsector(unsigned long sector)
|
pascal@14150
|
16 {
|
pascal@14150
|
17 if (lseek(fd, sector * sizeof(buffer), SEEK_SET) == -1 ||
|
pascal@14150
|
18 read(fd, buffer, sizeof(buffer)) != sizeof(buffer))
|
pascal@14150
|
19 quit("read sector failure");
|
pascal@14150
|
20 }
|
pascal@14150
|
21
|
pascal@14150
|
22 int main(int argc, char *argv[])
|
pascal@14150
|
23 {
|
pascal@14150
|
24 #define heads 64
|
pascal@14150
|
25 #define sectors 32
|
pascal@14150
|
26 #define partition 446
|
pascal@14150
|
27 #define trksz (512 * heads * sectors)
|
pascal@14150
|
28 unsigned long size, catalog, lba;
|
pascal@14150
|
29 int cylinders, i, j;
|
pascal@14150
|
30 unsigned n;
|
pascal@14150
|
31 #ifndef WIN32
|
pascal@14150
|
32 char *bootiso;
|
pascal@14150
|
33 for (bootiso = (char *) main;
|
pascal@14150
|
34 bootiso[0] != 'M' || bootiso[1] != 'Z' || bootiso[2] != 0xEB;
|
pascal@14150
|
35 bootiso++) if (bootiso < (char *) main) quit("bootiso not found");
|
pascal@14150
|
36 #endif
|
pascal@14150
|
37 if (argc < 2)
|
pascal@14150
|
38 quit("Usage : isohybrid.exe file.iso");
|
pascal@14150
|
39 fd = open(argv[1],O_RDWR|O_BINARY);
|
pascal@14150
|
40 if (fd == -1)
|
pascal@14150
|
41 quit("Can't open rw");
|
pascal@14150
|
42
|
pascal@14150
|
43 // Install hybridiso boot sector
|
pascal@14150
|
44 readsector(17UL);
|
pascal@14150
|
45 if (strncmp(buffer+7, "EL TORITO SPECIFICATION", 23))
|
pascal@14150
|
46 quit("No EL TORITO boot record found");
|
pascal@14150
|
47 catalog = * (unsigned long *) (buffer + 71);
|
pascal@14150
|
48 readsector(catalog);
|
pascal@14150
|
49 if (* (unsigned long *) buffer != 1 ||
|
pascal@14150
|
50 * (unsigned long *) (buffer + 30) != 0x88AA55)
|
pascal@14150
|
51 quit("invalid boot catalog.");
|
pascal@14150
|
52 lba = * (unsigned long *) (buffer + 40);
|
pascal@14150
|
53 readsector(lba);
|
pascal@14150
|
54 if (* (unsigned long *) (buffer + 64) != 1886961915)
|
pascal@14150
|
55 quit("no isolinux.bin hybrid signature in bootloader");
|
pascal@14150
|
56 * (unsigned long *) &bootiso[512 + 432] = lba * 4;
|
pascal@14150
|
57 * (unsigned long *) &bootiso[512 + 440] = rand();
|
pascal@14150
|
58 * (unsigned long *) &bootiso[512 + partition] = 0x10080;
|
pascal@14150
|
59 * (unsigned short *) &bootiso[512 + 510] = 0xAA55;
|
pascal@14150
|
60 size = lseek(fd, 0, SEEK_END);
|
pascal@14150
|
61 cylinders = (size + trksz - 1) / trksz;
|
pascal@14150
|
62 bootiso[512 + partition + 4] = 23; // "Windows hidden IFS"
|
pascal@14150
|
63 bootiso[512 + partition + 5] = heads - 1;
|
pascal@14150
|
64 bootiso[512 + partition + 6] = (((cylinders - 1) & 0x300) >> 2) + sectors;
|
pascal@14150
|
65 bootiso[512 + partition + 7] = (cylinders - 1) & 0xFF;
|
pascal@14150
|
66 * (unsigned long *) &bootiso[512 + partition + 8] = 0;
|
pascal@14150
|
67 * (unsigned long *) &bootiso[512 + partition + 12] = cylinders * sectors * heads;
|
pascal@14150
|
68
|
pascal@14150
|
69 // Install iso2exe boot sector
|
pascal@14150
|
70 memcpy(bootiso + 512 - 66, bootiso + 1024 - 66, 66);
|
pascal@14150
|
71 * (unsigned short *) (bootiso + 26) = rand();
|
pascal@14150
|
72
|
pascal@14150
|
73 // Update iso image
|
pascal@14150
|
74 lseek(fd, 0, SEEK_SET);
|
pascal@14150
|
75 write(fd, bootiso, 1024);
|
pascal@14150
|
76 lseek(fd, 0x8400 - BOOTISOSZ, SEEK_SET);
|
pascal@14150
|
77 write(fd, bootiso + 1024, BOOTISOSZ - 1024);
|
pascal@14150
|
78
|
pascal@14150
|
79 // Compute the checksum
|
pascal@14150
|
80 lseek(fd, 0, SEEK_SET);
|
pascal@14150
|
81 for (i = 66, n = 0, j = 0; j < 16; j++, i = 0) {
|
pascal@14150
|
82 if (read(fd, buffer, sizeof(buffer)) != sizeof(buffer))
|
pascal@14150
|
83 goto nochksum;
|
pascal@14150
|
84 for (; i < sizeof(buffer); i += 2)
|
pascal@14150
|
85 n += * (unsigned short *) (buffer + i);
|
pascal@14150
|
86 }
|
pascal@14150
|
87 * (unsigned short *) (bootiso + 64) = -n;
|
pascal@14150
|
88 lseek(fd, 0, SEEK_SET);
|
pascal@14150
|
89 write(fd, bootiso, 512);
|
pascal@14150
|
90 nochksum:
|
pascal@14150
|
91 close(fd);
|
pascal@14150
|
92 }
|