wok diff syslinux/stuff/iso2exe/iso2exe.sh @ rev 14261

syslinux/iso2exe: add NT+ support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Mar 30 18:36:46 2013 +0100 (2013-03-30)
parents 65b3fd0022ed
children ff85ea851c53
line diff
     1.1 --- a/syslinux/stuff/iso2exe/iso2exe.sh	Thu Mar 28 11:51:42 2013 +0100
     1.2 +++ b/syslinux/stuff/iso2exe/iso2exe.sh	Sat Mar 30 18:36:46 2013 +0100
     1.3 @@ -25,18 +25,27 @@
     1.4  	cp -a /dev/?d?* $TMP/dev
     1.5  	$0 --get init > $TMP/init.exe
     1.6  	grep -q mount.posixovl.iso2exe $TMP/init.exe &&
     1.7 -	cp /usr/sbin/mount.posixovl $TMP/bin/mount.posixovl.iso2exe
     1.8 +	cp /usr/sbin/mount.posixovl $TMP/bin/mount.posixovl.iso2exe &&
     1.9 +	echo "Store mount.posixovl..."
    1.10  	find $TMP -type f | xargs chmod +x
    1.11  	( cd $TMP ; find * | cpio -o -H newc ) | \
    1.12  		lzma e $TMP/rootfs.gz -si 2> /dev/null
    1.13  	SIZE=$(wc -c < $TMP/rootfs.gz)
    1.14  	store 24 $SIZE $1
    1.15 -	OFS=$(( 0x8000 - $SIZE ))
    1.16 +	OFS=$(( $OFS - $SIZE ))
    1.17  	printf "Adding rootfs.gz file at %04X...\n" $OFS
    1.18  	cat $TMP/rootfs.gz | ddq of=$1 bs=1 seek=$OFS conv=notrunc
    1.19  	rm -rf $TMP
    1.20  }
    1.21  
    1.22 +add_dosexe()
    1.23 +{
    1.24 +	OFS=$((0x7EE0))
    1.25 +	printf "Adding DOS/EXE at %04X...\n" $OFS
    1.26 +	$0 --get bootiso.bin 2> /dev/null | \
    1.27 +	ddq bs=1 skip=$OFS of=$1 seek=$OFS conv=notrunc
    1.28 +}
    1.29 +
    1.30  add_doscom()
    1.31  {
    1.32  	SIZE=$($0 --get boot.com | wc -c)
    1.33 @@ -48,20 +57,19 @@
    1.34  
    1.35  add_win32exe()
    1.36  {
    1.37 +	printf "Adding WIN32 file at %04X...\n" 0
    1.38 +	ddq if=/tmp/exe$$ of=$1 conv=notrunc
    1.39  	SIZE=$($0 --get win32.exe 2> /dev/null | tee /tmp/exe$$ | wc -c)
    1.40 -	if [ $SIZE -ne 0 ]; then
    1.41 -		OFS=$(( 128 + ( ($OFS - $SIZE + 128) & 0xFE00 ) ))
    1.42 -		printf "Adding WIN32 file at %04X...\n" $OFS
    1.43 -		LOC=$((0xAC+$(get 0x94 /tmp/exe$$)))
    1.44 -		for i in $(seq 1 $(get 0x86 /tmp/exe$$)); do
    1.45 -			CUR=$(get $LOC /tmp/exe$$)
    1.46 -			[ $CUR -eq 0 ] || store $LOC $(($CUR+$OFS-128)) /tmp/exe$$
    1.47 -			LOC=$(($LOC+40))
    1.48 -		done
    1.49 -		ddq if=/tmp/exe$$ of=$1 bs=1 skip=128 seek=$OFS conv=notrunc
    1.50 -		store 60 $OFS $1
    1.51 -	fi
    1.52 +	ddq if=/tmp/exe$$ of=$1 conv=notrunc
    1.53 +	printf "Adding bootiso head at %04X...\n" 0
    1.54 +	$0 --get bootiso.bin 2> /dev/null > /tmp/exe$$
    1.55 +	ddq if=/tmp/exe$$ of=$1 bs=128 count=1 conv=notrunc
    1.56 +	store 69 $(($SIZE/512)) $1 8
    1.57 +	store 510 $((0xAA55)) $1
    1.58  	rm -f /tmp/exe$$ 
    1.59 +	printf "Moving syslinux hybrid boot record at %04X ...\n" $SIZE
    1.60 +	ddq if=$2 bs=1 count=512 of=$1 seek=$SIZE conv=notrunc
    1.61 +	OFS=$(($SIZE+512))
    1.62  }
    1.63  
    1.64  add_fdbootstrap()
    1.65 @@ -77,9 +85,7 @@
    1.66  case "$1" in
    1.67  --build)
    1.68  	shift
    1.69 -	[ $(tar cf - $@ | wc -c) -gt $((32 * 1024)) ] &&
    1.70 -		echo "WARNING: The file set $@ is too large (31K max) :" &&
    1.71 -		ls -l $@
    1.72 +	ls -l $@
    1.73  	cat >> $0 <<EOM
    1.74  $(tar cf - $@ | lzma e -si -so | uuencode -m -)
    1.75  EOT
    1.76 @@ -92,20 +98,20 @@
    1.77  --array)
    1.78  	DATA=/tmp/dataiso$$
    1.79  	ddq if=/dev/zero bs=32k count=1 of=$DATA
    1.80 -	ddq if=bootiso.bin of=$DATA conv=notrunc
    1.81 -	ddq if=$2 of=$DATA bs=512 seek=1 conv=notrunc
    1.82 +	add_win32exe $DATA $2 > /dev/null
    1.83 +	HSZ=$OFS
    1.84 +	add_dosexe $DATA > /dev/null
    1.85  	add_rootfs $DATA > /dev/null
    1.86  	add_doscom $DATA > /dev/null
    1.87 -	add_win32exe $DATA > /dev/null
    1.88  	add_fdbootstrap $DATA > /dev/null
    1.89  	name=${3:-bootiso}
    1.90  	cat <<EOT
    1.91  
    1.92 -#define $(echo $name | tr '[a-z]' '[A-Z]')SZ $((0x8400 - $OFS))
    1.93 +#define $(echo $name | tr '[a-z]' '[A-Z]')SZ $((0x8000 - $OFS + $HSZ))
    1.94  
    1.95  #ifdef WIN32
    1.96  static char $name[] = {
    1.97 -$(hexdump -v -n 1024 -e '"    " 16/1 "0x%02X, "' -e '"  // %04.4_ax |" 16/1 "%_p" "| \n"' $DATA | sed 's/ 0x  ,/      /g')
    1.98 +$(hexdump -v -n $HSZ -e '"    " 16/1 "0x%02X, "' -e '"  // %04.4_ax |" 16/1 "%_p" "| \n"' $DATA | sed 's/ 0x  ,/      /g')
    1.99  $(hexdump -v -s $OFS -e '"    " 16/1 "0x%02X, "' -e '"  // %04.4_ax |" 16/1 "%_p" "| \n"' $DATA | sed 's/ 0x  ,/      /g')
   1.100  };
   1.101  #endif
   1.102 @@ -143,19 +149,21 @@
   1.103  	[ ! -s "$1" ] && echo "usage: $0 image.iso" 1>&2 && exit 1
   1.104  	case "$(get 0 $1)" in
   1.105  	23117)	echo "The file $1 is already an EXE file." 1>&2 && exit 1;;
   1.106 -	0)	[ -x /usr/bin/isohybrid ] && isohybrid $1
   1.107 +	0)	[ -x /usr/bin/isohybrid ] && isohybrid $1 && echo "Do isohybrid"
   1.108  	esac
   1.109  		
   1.110 -	echo "Moving syslinux hybrid boot record..."
   1.111 -	ddq if=$1 bs=512 count=1 | ddq of=$1 bs=512 count=1 seek=1 conv=notrunc 
   1.112 +	echo "Read hybrid & tazlito data..."
   1.113 +	ddq if=$1 bs=512 count=1 of=/tmp/hybrid$$
   1.114 +	ddq if=$1 bs=512 skip=2 count=20 of=/tmp/tazlito$$
   1.115 +	add_win32exe $1 /tmp/hybrid$$
   1.116 +	printf "Moving tazlito data record at %04X ...\n" $OFS
   1.117 +	ddq if=/tmp/tazlito$$ bs=1 count=512 of=$1 seek=$OFS conv=notrunc
   1.118 +	rm -f /tmp/tazlito$$ /tmp/hybrid$$
   1.119  	
   1.120 -	echo "Inserting EXE boot record..."
   1.121 -	$0 --get bootiso.bin | ddq of=$1 conv=notrunc
   1.122 -
   1.123  	# keep the largest room for the tazlito info file
   1.124 +	add_dosexe $1
   1.125  	add_rootfs $1
   1.126  	add_doscom $1
   1.127 -	add_win32exe $1
   1.128  	add_fdbootstrap $1
   1.129  	store 26 ${RANDOM:-0} $1
   1.130  	i=66