wok annotate syslinux/stuff/iso2exe/iso2exe.c @ rev 14151

syslinux/isohybrid.exe: lseek fix
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Mar 04 10:03:54 2013 +0100 (2013-03-04)
parents a26ba54f3ea7
children 5ed4d6b2d690
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@14151 60 size = lseek(fd, 0UL, 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@14151 74 lseek(fd, 0UL, SEEK_SET);
pascal@14150 75 write(fd, bootiso, 1024);
pascal@14151 76 lseek(fd, 0x8400UL - BOOTISOSZ, SEEK_SET);
pascal@14150 77 write(fd, bootiso + 1024, BOOTISOSZ - 1024);
pascal@14150 78
pascal@14150 79 // Compute the checksum
pascal@14151 80 lseek(fd, 0UL, 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@14151 88 lseek(fd, 0UL, SEEK_SET);
pascal@14150 89 write(fd, bootiso, 512);
pascal@14150 90 nochksum:
pascal@14150 91 close(fd);
pascal@14150 92 }