wok-next diff syslinux/stuff/iso2exe/iso2exe.sh @ rev 19425
syslinux/isohybrid: boot efi support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Sep 30 21:29:58 2016 +0200 (2016-09-30) |
parents | 4e8ef03c7137 |
children | 986d5902efcf |
line diff
1.1 --- a/syslinux/stuff/iso2exe/iso2exe.sh Sun Jul 31 11:28:07 2016 +0200 1.2 +++ b/syslinux/stuff/iso2exe/iso2exe.sh Fri Sep 30 21:29:58 2016 +0200 1.3 @@ -21,11 +21,9 @@ 1.4 compress() 1.5 { 1.6 if [ "$1" ]; then 1.7 - [ "$(which zopfli 2> /dev/null)" ] && 1.8 - zopfli --i100 -c /dev/stdin > $1 || 1.9 gzip -9 > $1 1.10 [ "$(which advdef 2> /dev/null)" ] && 1.11 - advdef -z4 $1 > /dev/null 1.12 + advdef -z4 -i100 $1 > /dev/null 1.13 elif [ "$(which xz 2> /dev/null)" ]; then 1.14 xz -z -e --format=lzma --lzma1=mode=normal --stdout 1.15 else 1.16 @@ -88,13 +86,28 @@ 1.17 ddq if=/tmp/rezipped$$.gz bs=1 of=$1 seek=$OFS conv=notrunc 1.18 HOLE=$(($HOLE+$n)) 1.19 rm -f /tmp/rezipped$$.gz 1.20 + if [ -n "$gpt" ]; then 1.21 + store $((0x25E)) $n $1 1.22 + store $((0x25C)) $OFS $1 1.23 + fi 1.24 } 1.25 1.26 add_win32exe() 1.27 { 1.28 SIZE=$($0 --get win32.exe 2> /dev/null | tee /tmp/exe$$ | wc -c) 1.29 + [ -n "$gpt" ] && SIZE=$(($SIZE+1024)) 1.30 + [ -n "$mac" ] && SIZE=$(($SIZE+3072)) 1.31 printf "Adding WIN32 file at %04X (%d bytes) ...\n" 0 $SIZE 1.32 ddq if=/tmp/exe$$ of=$1 conv=notrunc 1.33 + if [ -n "$gpt" ]; then 1.34 + printf "Adding GPT at %04X (1024 bytes) ...\n" 512 1.35 + ddq if=$2 bs=512 skip=1 of=$1 seek=1 conv=notrunc 1.36 + i=3; [ -n "$mac" ] && i=9 1.37 + ddq if=/tmp/exe$$ bs=512 skip=1 of=$1 seek=$i conv=notrunc 1.38 + for i in 12C 154 17C ; do # always 3 UPX sections 1.39 + store $((0x$i)) $((1024 + $(get 0x$i $1))) $1 2 1.40 + done 1.41 + fi 1.42 printf "Adding bootiso head at %04X...\n" 0 1.43 $0 --get bootiso.bin 2> /dev/null > /tmp/exe$$ 1.44 ddq if=/tmp/exe$$ of=$1 bs=128 count=1 conv=notrunc 1.45 @@ -104,12 +117,13 @@ 1.46 ddq if=/tmp/coff$$ of=$1 conv=notrunc bs=1 seek=$((0x178 - 12*8)) 1.47 ddq if=/tmp/exe$$ of=$1 bs=1 count=24 seek=$((0x1A0)) skip=$((0x1A0)) conv=notrunc 1.48 ddq if=$2 bs=1 skip=$((0x1B8)) seek=$((0x1B8)) count=72 of=$1 conv=notrunc 1.49 - store 417 $(($SIZE/512)) $1 8 1.50 store 510 $((0xAA55)) $1 1.51 rm -f /tmp/exe$$ /tmp/coff$$ 1.52 - printf "Moving syslinux hybrid boot record at %04X (512 bytes) ...\n" $SIZE 1.53 - ddq if=$2 bs=1 count=512 of=$1 seek=$SIZE conv=notrunc 1.54 - OFS=$(($SIZE+512)) 1.55 + i=$SIZE; OFS=$(($SIZE+512)) 1.56 + [ -n "$mac" ] && OFS=$SIZE && i=1536 1.57 + store 417 $(($i/512)) $1 8 1.58 + printf "Moving syslinux hybrid boot record at %04X (512 bytes) ...\n" $i 1.59 + ddq if=$2 bs=1 count=512 of=$1 seek=$i conv=notrunc 1.60 } 1.61 1.62 add_fdbootstrap() 1.63 @@ -141,16 +155,21 @@ 1.64 1.65 fileofs() 1.66 { 1.67 - [ $(get 1024 "$ISO") -eq 35615 ] && i=1024 || 1.68 - i=$((512*(1+$(get 417 "$ISO" 1)))) 1.69 + [ $(get 1024 "$ISO") -eq 35615 ] && x=1024 || 1.70 + x=$((512*(1+$(get 417 "$ISO" 1)))) 1.71 stub=$(($(get 20 "$ISO") - 0xC0)) 1.72 c=$(custom_config_sector "$ISO") 1.73 SIZE=0; OFFSET=0 1.74 case "$1" in 1.75 - win32.exe) [ $i -eq 1024 ] || SIZE=$(($i - 512));; 1.76 - syslinux.mbr) [ $i -eq 1024 ] || OFFSET=$(($i - 512)); SIZE=512;; 1.77 - flavor.info) OFFSET=$i 1.78 - SIZE=$(ddq bs=512 skip=$(($i/512)) if="$ISO" | gzsize);; 1.79 + win32.exe) [ $x -eq 2048 ] && x=10752 1.80 + [ $x -eq 1024 ] || SIZE=$(($x - 512));; 1.81 + syslinux.mbr) [ $x -eq 1024 ] || OFFSET=$(($x - 512)); SIZE=512;; 1.82 + flavor.info) [ $(get 22528 "$ISO") -eq 35615 ] && OFFSET=22528 1.83 + [ $x -eq 2048 ] && x=$(get 0x25C "$ISO") && 1.84 + SIZE=$(get 0x25E "$ISO") 1.85 + [ $(get $x "$ISO") -eq 35615 ] && OFFSET=$x 1.86 + [ $OFFSET -ne 0 ] && [ $SIZE -eq 0 ] && 1.87 + SIZE=$(ddq bs=512 skip=$(($OFFSET/512)) if="$ISO" | gzsize);; 1.88 floppy.boot) SIZE=$(($(get 26 "$ISO" 1)*512)) 1.89 OFFSET=$(($(get 64 "$ISO") - 0xC0 - $SIZE));; 1.90 rootfs.gz) SIZE=$(get 24 "$ISO"); OFFSET=$(($stub - $SIZE));; 1.91 @@ -168,7 +187,7 @@ 1.92 sed '/^append=/!d;s/^[^=]*=.//' | wc -c);; 1.93 custom.initrd) i=$(ddq bs=2k skip=$c if="$ISO" count=1 | \ 1.94 sed '/^append=\|^initrd:/!d' | wc -c) 1.95 - OFFSET=$((2048*$c+$i+40)) 1.96 + OFFSET=$((2048*$c+$x+40)) 1.97 SIZE=$(($(ddq bs=2k skip=$c if="$ISO" count=1 | \ 1.98 sed '/^initrd:/!d;s/.*://') + 0));; 1.99 esac 1.100 @@ -193,6 +212,46 @@ 1.101 OFFSET=$(stat -c %s "$ISO") 1.102 [ $OFFSET -gt $HEAP ] && 1.103 printf "%d free bytes in %04X..%04X\n" $(($OFFSET - $HEAP)) $HEAP $OFFSET 1.104 + if [ $(get 510 "$ISO") -eq 43605 ]; then 1.105 + echo "MBR partitions :" 1.106 + for i in 0 1 2 3; do 1.107 + SIZE=$(get $((446+12+16*i)) "$ISO" 4) 1.108 + [ $SIZE -eq 0 ] && continue 1.109 + OFFSET=$(get $((446+8+16*i)) "$ISO" 4) 1.110 + printf " $i:%08X %08X %02X\n" $OFFSET $SIZE \ 1.111 + $(get $((446+4+16*i)) "$ISO" 1) 1.112 + done 1.113 + if [ $(get 466 "$ISO") -eq 65263 ]; then 1.114 + echo "EFI partitions :" 1.115 + n=$(get 584 "$ISO" 1) 1.116 + s=$(get 596 "$ISO") 1.117 + o=$((($(get 552 "$ISO" 1)*512)-($(get 592 "$ISO")*$s))) 1.118 + i=0 1.119 + while [ $n -gt $i ]; do 1.120 + f=$(get $(($o+0x20)) "$ISO" 4) 1.121 + l=$(($(get $(($o+0x28)) "$ISO" 4)-$f)) 1.122 + [ $l -eq 0 ] && break 1.123 + printf " $i:%08X %08X %s\n" $f $(($l+1)) \ 1.124 + "$(od -An -N 36 -w -j $(($o+0x38)) -t a "$ISO" \ 1.125 + | sed 's/\( nul\)*//g;s/ //g;s/ sp//')" 1.126 + o=$(($o+$s)) 1.127 + i=$(($i+1)) 1.128 + done 1.129 + fi 1.130 + fi 1.131 + o=2048 1.132 + if [ $(get $o "$ISO") -eq 19792 ]; then 1.133 + echo "Apple partitions :" 1.134 + i=0 1.135 + while [ $(get $o "$ISO") -eq 19792 ]; do 1.136 + f=$((0x$(od -An -N 4 -j $(($o+8)) -t x1 "$ISO" | sed 's/ //g'))) 1.137 + l=$((0x$(od -An -N 4 -j $(($o+0x54)) -t x1 "$ISO" | sed 's/ //g'))) 1.138 + printf " $i:%08X %08X %s\n" $f $l \ 1.139 + "$(ddq bs=1 skip=$(($o+16)) count=32 if="$ISO")" 1.140 + o=$(($o+2048)) 1.141 + i=$(($i+1)) 1.142 + done 1.143 + fi 1.144 } 1.145 1.146 extract() 1.147 @@ -211,10 +270,10 @@ 1.148 1.149 clear_custom_config() 1.150 { 1.151 - start=$(custom_config_sector $1) 1.152 - cnt=$((512 - ($start % 512))) 1.153 - [ $cnt -ne 512 ] && 1.154 - ddq if=/dev/zero of=$1 bs=2k seek=$start count=$cnt 1.155 + start=$(custom_config_sector $1) 1.156 + cnt=$((512 - ($start % 512))) 1.157 + [ $cnt -ne 512 ] && 1.158 + ddq if=/dev/zero of=$1 bs=2k seek=$start count=$cnt 1.159 } 1.160 case "$1" in 1.161 --build) 1.162 @@ -408,6 +467,7 @@ 1.163 [ $(id -u) -ne 0 ] && cmd="$0 $@" && exec su -c "$cmd" < /dev/tty 1.164 append= 1.165 initrd= 1.166 + 1.167 while [ "$1" ]; do 1.168 case "${1/--/-}" in 1.169 -get) shift 1.170 @@ -434,9 +494,16 @@ 1.171 b=$(get 417 $1 1) 1.172 n=$(($(get 64 $1) + 0xC0 - ($(get 26 $1 1)*512) - ($b+1)*512)) 1.173 ddq if=$1 bs=512 count=1 skip=$b of=$1 conv=notrunc 1.174 - ddq if=/dev/zero bs=512 seek=1 count=1 of=$1 conv=notrunc 1.175 - ddq if=$1 bs=512 seek=2 count=30 skip=$(($b+1)) of=$1 conv=notrunc 1.176 - ddq if=/dev/zero bs=1 seek=$n count=$((0x8000 - $n)) of=$1 conv=notrunc ;; 1.177 + if [ $(get 512 $1) -eq 17989 ]; then 1.178 + n=$(($(get 0x25C $1)/512)) 1.179 + ddq if=$1 bs=512 seek=44 count=20 skip=$n of=$1 conv=notrunc 1.180 + ddq if=/dev/zero bs=512 seek=9 count=35 of=$1 conv=notrunc 1.181 + ddq if=/dev/zero bs=512 seek=3 count=1 of=$1 conv=notrunc 1.182 + else 1.183 + ddq if=/dev/zero bs=512 seek=1 count=1 of=$1 conv=notrunc 1.184 + ddq if=$1 bs=512 seek=2 count=30 skip=$(($b+1)) of=$1 conv=notrunc 1.185 + ddq if=/dev/zero bs=1 seek=$n count=$((0x8000 - $n)) of=$1 conv=notrunc 1.186 + fi ;; 1.187 *) ddq if=/dev/zero bs=1k count=32 of=$1 conv=notrunc ;; 1.188 esac 1.189 case "${2/--/-}" in 1.190 @@ -452,10 +519,19 @@ 1.191 23117) echo "The file $1 is already an EXE file." 1>&2 && exit 1;; 1.192 0) [ -x /usr/bin/isohybrid ] && isohybrid $1;; 1.193 esac 1.194 - 1.195 + 1.196 + gpt= ; [ $(get 466 $1) -eq 65263 ] && gpt=1 1.197 + mac= ; [ $(get 2048 $1) -eq 19792 ] && mac=1 1.198 echo "Read hybrid & tazlito data..." 1.199 - ddq if=$1 bs=512 count=1 of=/tmp/hybrid$$ 1.200 - ddq if=$1 bs=512 skip=2 count=20 of=/tmp/tazlito$$ 1.201 + if [ -n "gpt" ]; then 1.202 + echo "GUID Partition Table..." 1.203 + n=3; [ -n "mac" ] && n=9 && echo "Apple Partition Table..." 1.204 + ddq if=$1 bs=512 count=$n of=/tmp/hybrid$$ 1.205 + ddq if=$1 bs=512 skip=44 count=20 of=/tmp/tazlito$$ 1.206 + else 1.207 + ddq if=$1 bs=512 count=1 of=/tmp/hybrid$$ 1.208 + ddq if=$1 bs=512 skip=2 count=20 of=/tmp/tazlito$$ 1.209 + fi 1.210 add_win32exe $1 /tmp/hybrid$$ 1.211 add_tazlito_info $1 /tmp/tazlito$$ 1.212 rm -f /tmp/tazlito$$ /tmp/hybrid$$