diff options
Diffstat (limited to 'isohybrid-embeddedfat')
-rwxr-xr-x | isohybrid-embeddedfat | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/isohybrid-embeddedfat b/isohybrid-embeddedfat new file mode 100755 index 0000000..b35b3bc --- /dev/null +++ b/isohybrid-embeddedfat @@ -0,0 +1,57 @@ +#!/usr/bin/perl +# isohybrid-embeddedfat - written by Andreas Loibl <andreas@andreas-loibl.de> +# + +die "Usage: $0 <isohybrid-bg2.iso> <filename>\n" if $#ARGV != 1; + +($file,$filename) = @ARGV; +open(FILE, "+< $file\0") or die "$0: cannot open $file: $!\n"; +binmode FILE; + +# Get the total size of the image +(@imgstat = stat(FILE)) or die "$0: $file: $!\n"; +$imgsize = $imgstat[7]; +if (!$imgsize) { + die "$0: $file: cannot determine length of file\n"; +} + +$start = `isoinfo -J -s -l -i kanotix64.iso | awk '/$filename/{print \$10}'`; +if (!$start) { + die "$0: $filename: cannot determine position of file\n"; +} + +use integer; +$lba = $start*4; +$psize = $imgsize/512 - $lba; +$h = 64; $s = 32; +$hpc = 32; $spt = 63; +$bcyl = $lba / ($spt * $hpc); +$bhead = ($lba / $spt) % $hpc; +$bsect = ($lba % $spt) + 1; +$cylsize = $h*$s*512; +$c = $imgsize/$cylsize; +if ($c > 1024) { + $cc = 1024; +} else { + $cc = $c; +} +$ehead = $h-1; +$esect = $s + ((($cc-1) & 0x300) >> 2); +$ecyl = ($cc-1) & 0xff; + +# Adjust MBR partition table +$fstype = 0xEF; +$pentry = 1; + +seek(FILE, 430+16*$pentry, SEEK_SET) or die "$0: $file: $!\n"; +print FILE pack("CCCCCCCCVV", 0x80, $bhead, $bsect, $bcyl, $fstype, $ehead, $esect, $ecyl, $lba, $psize); + +# Delete other partition entry from MBR-partition-table +seek(FILE, 430+16*2, SEEK_SET) or die "$0: $file: $!\n"; +print FILE "\0" x 16; + +# Done... +close(PART); +close(FILE); + +exit 0; |