wok view syslinux/stuff/iso2exe/iso2exe.sh @ rev 20771

cpige: add man page for cook.slitaz.org
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Feb 13 16:56:42 2019 +0100 (21 months ago)
parents a9c77509261e
children 01b30edcef4e
line source
1 #!/bin/sh
3 ddq()
4 {
5 dd $@ 2> /dev/null
6 }
8 store()
9 {
10 n=$2; for i in $(seq 8 8 ${4:-16}); do
11 printf '\\\\x%02X' $(($n & 255))
12 n=$(($n >> 8))
13 done | xargs echo -en | ddq bs=1 conv=notrunc of=$3 seek=$(($1))
14 }
16 get()
17 {
18 echo $(od -j $(($1)) -N ${3:-2} -t u${3:-2} -An "$2")
19 }
21 compress()
22 {
23 if [ "$1" ]; then
24 gzip -9 > $1
25 [ "$(which advdef 2> /dev/null)" ] &&
26 advdef -z4 -i100 $1 > /dev/null
27 elif [ "$(which xz 2> /dev/null)" ]; then
28 xz -z -e --format=lzma --lzma1=mode=normal --stdout
29 else
30 lzma e -si -so
31 fi 2> /dev/null
32 }
34 add_rootfs()
35 {
36 TMP=/tmp/iso2exe$$
37 mkdir -p $TMP
38 $0 --get rootfs.gz > $TMP/rootfs.gz
39 SIZE=$(wc -c < $TMP/rootfs.gz)
40 store 24 $SIZE $1
41 OFS=$(( $OFS - $SIZE ))
42 printf "Adding rootfs.gz file at %04X (%d bytes) ...\n" $OFS $SIZE
43 cat $TMP/rootfs.gz | ddq of=$1 bs=1 seek=$OFS conv=notrunc
44 rm -rf $TMP
45 }
47 add_dosexe()
48 {
49 TMP=/tmp/bootiso$$
50 $0 --get bootiso.bin > $TMP 2> /dev/null
51 OFS=$(($(get 20 $TMP) - 0xC0))
52 printf "Adding DOS/EXE stub at %04X (%d bytes) ...\n" $OFS $((0x7FF0 - $OFS))
53 ddq if=$TMP bs=1 skip=$OFS of=$1 seek=$OFS conv=notrunc
54 rm -f $TMP
55 }
57 add_doscom()
58 {
59 SIZE=$($0 --get boot.com | wc -c)
60 OFS=$(( $OFS - $SIZE ))
61 printf "Adding DOS boot file at %04X (%d bytes) ...\n" $OFS $SIZE
62 $0 --get boot.com | ddq of=$1 bs=1 seek=$OFS conv=notrunc
63 store 64 $(($OFS+0xC0)) $1
64 }
66 add_tazlito_info()
67 {
68 HOLE=$OFS
69 [ $(get 0 $2) -eq 35615 ] || return
70 zcat $2 | compress /tmp/rezipped$$.gz
71 n=$(stat -c %s /tmp/rezipped$$.gz)
72 printf "Moving tazlito data record at %04X ($n bytes) ...\n" $OFS
73 ddq if=/tmp/rezipped$$.gz bs=1 of=$1 seek=$OFS conv=notrunc
74 HOLE=$(($HOLE+$n))
75 rm -f /tmp/rezipped$$.gz
76 if [ -n "$gpt" ]; then
77 store $((0x25E)) $n $1
78 store $((0x25C)) $OFS $1
79 fi
80 }
82 add_win32exe()
83 {
84 SIZE=$($0 --get win32.exe 2> /dev/null | tee /tmp/exe$$ | wc -c)
85 [ -n "$gpt" ] && SIZE=$(($SIZE+1024))
86 [ -n "$mac" ] && SIZE=$(($SIZE+3072))
87 printf "Adding WIN32 file at %04X (%d bytes) ...\n" 0 $SIZE
88 ddq if=/tmp/exe$$ of=$1 conv=notrunc
89 if [ -n "$gpt" ]; then
90 printf "Adding GPT at %04X (1024 bytes) ...\n" 512
91 ddq if=$2 bs=512 skip=1 of=$1 seek=1 conv=notrunc
92 i=3; [ -n "$mac" ] && i=9
93 ddq if=/tmp/exe$$ bs=512 skip=1 of=$1 seek=$i conv=notrunc
94 for i in 12C 154 17C ; do # always 3 UPX sections
95 store $((0x$i)) $((1024 + $(get 0x$i $1))) $1
96 done
97 fi
98 printf "Adding bootiso head at %04X...\n" 0
99 $0 --get bootiso.bin 2> /dev/null > /tmp/exe$$
100 ddq if=/tmp/exe$$ of=$1 bs=128 count=1 conv=notrunc
101 store $((0x94)) $((0xE0 - 12*8)) $1
102 store $((0xF4)) $((16 - 12)) $1
103 ddq if=$1 of=/tmp/coff$$ bs=1 skip=$((0x178)) count=$((0x88))
104 ddq if=/tmp/coff$$ of=$1 conv=notrunc bs=1 seek=$((0x178 - 12*8))
105 ddq if=/tmp/exe$$ of=$1 bs=1 count=24 seek=$((0x1A0)) skip=$((0x1A0)) conv=notrunc
106 ddq if=$2 bs=1 skip=$((0x1B8)) seek=$((0x1B8)) count=72 of=$1 conv=notrunc
107 store 510 $((0xAA55)) $1
108 i=$SIZE; OFS=$(($SIZE+512))
109 [ -n "$mac" ] && OFS=$SIZE && i=1536
110 store 417 $(($i/512)) $1 8
111 printf "Moving syslinux hybrid boot record at %04X (512 bytes) ...\n" $i
112 ddq if=$2 bs=1 count=512 of=$1 seek=$i conv=notrunc
113 if [ $(get $((0x7C00)) /tmp/exe$$) -eq 60905 ]; then
114 ddq if=/tmp/exe$$ bs=1 count=66 skip=$((0x7DBE)) of=$1 seek=$(($i + 0x1BE)) conv=notrunc
115 ddq if=$1 bs=1 count=3 skip=$i of=$1 seek=$(($i + 0x1BE)) conv=notrunc
116 ddq if=/tmp/exe$$ bs=1 count=3 skip=$((0x7C00)) of=$1 seek=$i conv=notrunc
117 fi
118 rm -f /tmp/exe$$ /tmp/coff$$
119 if [ -z "$RECURSIVE_PARTITION" -a $(get 454 $1 4) -eq 0 ]; then
120 store 448 $((1+$i/512)) $1 8
121 store 454 $(($i/512)) $1 8
122 store 458 $(($(get 458 $1 4) - $i/512)) $1 32
123 fi
124 }
126 add_fdbootstrap()
127 {
128 SIZE=$($0 --get bootfd.bin 2> /dev/null | wc -c)
129 if [ $SIZE -ne 0 ]; then
130 SIZE=$(( $SIZE - 512 )) # sector 2 is data
131 OFS=$(( $OFS - $SIZE ))
132 printf "Adding floppy bootstrap file at %04X (%d bytes) ...\n" $OFS $SIZE
133 $0 --get bootfd.bin | \
134 ddq of=$1 bs=1 count=512 seek=$OFS conv=notrunc
135 $0 --get bootfd.bin | \
136 ddq of=$1 bs=1 skip=1024 seek=$((512 + $OFS)) conv=notrunc
137 store 26 $(($SIZE/512)) $1 8
138 fi
139 }
141 gzsize()
142 {
143 echo $(($(hexdump -C | awk ' {
144 for (i = 17; i > 1; i--) if ($i != "00") break;
145 if (i == 1) {
146 print "0x" $1 " + 1 + 1 - " n
147 exit
148 }
149 n = 17 - i
150 }')))
151 }
153 fileofs()
154 {
155 [ $(get 1024 "$ISO") -eq 35615 ] && x=1024 ||
156 x=$((512*(1+$(get 417 "$ISO" 1))))
157 [ $x -gt 32768 ] && x=6656
158 stub=$(($(get 20 "$ISO") - 0xC0))
159 c=$(custom_config_sector "$ISO")
160 SIZE=0; OFFSET=0
161 case "$1" in
162 win32.exe) [ $x -eq 2048 ] && x=10752
163 [ $x -eq 1024 ] || SIZE=$(($x - 512));;
164 syslinux.mbr) [ $x -eq 1024 ] || OFFSET=$(($x - 512)); SIZE=512;;
165 flavor.info) [ $(get 22528 "$ISO") -eq 35615 ] && OFFSET=22528
166 [ $x -eq 2048 ] && x=$(get 0x25C "$ISO") &&
167 SIZE=$(get 0x25E "$ISO")
168 [ $(get $x "$ISO") -eq 35615 ] && OFFSET=$x
169 [ $OFFSET -ne 0 ] && [ $SIZE -eq 0 ] &&
170 SIZE=$(ddq bs=512 skip=$(($OFFSET/512)) if="$ISO" | gzsize);;
171 floppy.boot) SIZE=$(($(get 26 "$ISO" 1)*512))
172 OFFSET=$(($(get 64 "$ISO") - 0xC0 - $SIZE));;
173 rootfs.gz) SIZE=$(get 24 "$ISO"); OFFSET=$(($stub - $SIZE));;
174 tazboot.com) OFFSET=$(($(get 64 "$ISO") - 0xC0))
175 SIZE=$(($stub - $(get 24 "$ISO") - $OFFSET));;
176 dosstub) OFFSET=$stub; SIZE=$((0x7FF0 - $OFFSET));;
177 boot.md5) [ $(get 0 "$ISO") -eq 23117 ] &&
178 [ $(get 18 "$ISO") -ne 0 ] &&
179 OFFSET=$((0x7FF0)) && SIZE=16;;
180 fs.iso) OFFSET=$((0x8000))
181 SIZE=$((2048*$c - $OFFSET));;
182 custom.magic) ddq bs=2k skip=$c if="$ISO" | ddq bs=1 count=6 | \
183 grep -q '#!boot' && OFFSET=$((2048*$c)) &&
184 SIZE=39 ;;
185 custom.append) OFFSET=$((2048*$c+47)) &&
186 SIZE=$(ddq bs=2k skip=$c if="$ISO" count=1 | \
187 sed '/^append=/!d;s/^[^=]*=.//' | wc -c);;
188 custom.initrd) x=$(ddq bs=2k skip=$c if="$ISO" count=1 | \
189 sed '/^append=\|^initrd:/!d' | wc -c)
190 OFFSET=$((2048*$c+$x+40))
191 SIZE=$(($(ddq bs=2k skip=$c if="$ISO" count=1 | \
192 sed '/^initrd:/!d;s/.*://') + 0));;
193 esac
194 }
196 trailer()
197 {
198 OFFSET=$(stat -c %s "$1")
199 [ $OFFSET -gt $HEAP ] &&
200 printf "%d free bytes in %04X..%04X\n" $(($OFFSET - $HEAP)) $HEAP $OFFSET
201 if [ $(get 510 "$1") -eq 43605 ]; then
202 echo "MBR partitions :"
203 for i in 0 1 2 3; do
204 SIZE=$(get $((446+12+16*i)) "$1" 4)
205 [ $SIZE -eq 0 ] && continue
206 OFFSET=$(get $((446+8+16*i)) "$1" 4)
207 printf " $i:%08X %08X %02X\n" $OFFSET $SIZE \
208 $(get $((446+4+16*i)) "$1" 1)
209 done
210 if [ $(get 450 "$1") -eq 65262 ]; then
211 echo "EFI partitions :"
212 n=$(get 592 "$1")
213 s=$(get 596 "$1")
214 o=$(($(get 584 "$1")*512))
215 i=0
216 while [ $i -lt $n ]; do
217 f=$(get $(($o+0x20)) "$1" 4)
218 l=$(($(get $(($o+0x28)) "$1" 4)-$f))
219 [ $l -eq 0 ] && break
220 printf " $i:%08X %08X %s\n" $f $(($l+1)) \
221 "$(od -An -N 72 -w72 -j $(($o+0x38)) -t a "$1" \
222 | sed 's/ nul//g;s/ //g;s/ sp//g')"
223 o=$(($o+$s))
224 i=$(($i+1))
225 done
226 fi
227 fi
228 o=2048
229 if [ $(get $o "$1") -eq 19792 ]; then
230 echo "Apple partitions :"
231 i=0
232 while [ $(get $o "$1") -eq 19792 ]; do
233 f=$((0x$(od -An -N 4 -j $(($o+8)) -t x1 "$1" | sed 's/ //g')))
234 l=$((0x$(od -An -N 4 -j $(($o+0x54)) -t x1 "$1" | sed 's/ //g')))
235 printf " $i:%08X %08X %s\n" $f $l \
236 "$(ddq bs=1 skip=$(($o+16)) count=32 if="$1")"
237 o=$(($o+2048))
238 i=$(($i+1))
239 done
240 fi
241 }
243 list()
244 {
245 HEAP=0
246 for f in win32.exe syslinux.mbr flavor.info floppy.boot tazboot.com \
247 rootfs.gz dosstub boot.md5 fs.iso custom.magic custom.append \
248 custom.initrd; do
249 fileofs $f
250 [ $SIZE -le 0 ] && continue
251 [ "${OFFSET:8}" ] && continue
252 [ $OFFSET -lt 0 ] && continue
253 [ $(get $OFFSET "$ISO") -eq 0 ] && continue
254 [ $OFFSET -gt $HEAP ] && [ $(($OFFSET - $HEAP)) -gt 16 ] &&
255 printf "%d free bytes in %04X..%04X\n" $(($OFFSET - $HEAP)) $HEAP $OFFSET
256 [ $OFFSET -ge $HEAP ] && HEAP=$(($OFFSET+$SIZE))
257 printf "$f at %04X ($SIZE bytes).\n" $OFFSET
258 done
259 trailer $ISO
260 }
262 restore_hybrid_mbr()
263 {
264 if [ $(get 0 "$1") -eq 60905 ]; then
265 ddq bs=1 conv=notrunc if="$1" of="$1" skip=$((0x1BE)) seek=0 count=3
266 ddq bs=1 skip=$((0x1BE)) count=66 if="$2" | \
267 ddq bs=1 seek=$((0x1BE)) count=66 of="$1" conv=notrunc
268 if [ -n "$RECURSIVE_PARTITION" ]; then
269 for i in 0 1 2 3 ; do
270 n=$(get $((0x1C6+16*i)) $1 4)
271 [ $n -eq 0 -o $n -gt 64 ] && continue
272 store $((0x1C0+16*i)) 1 $1 8