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$$