wok annotate syslinux/stuff/tools/isohybrid.sh @ rev 24981
Up pce (20220220-991c55d9)
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sun May 08 10:57:53 2022 +0000 (2022-05-08) |
parents | db796dcadf0a |
children |
rev | line source |
---|---|
pascal@4513 | 1 #!/bin/sh |
pascal@4513 | 2 |
pascal@20892 | 3 if [ "$1" = "--build" ]; then |
pascal@7859 | 4 cat >> $0 <<EOM |
pascal@7859 | 5 $(for i in fx fx_f fx_c px px_f px_c ; do |
pascal@7860 | 6 cat mbr/isohdp$i.bin /dev/zero | dd bs=1 count=512 2> /dev/null |
pascal@23930 | 7 done | lzma e -si -so | uuencode -m -) |
pascal@4513 | 8 EOT |
pascal@4513 | 9 EOM |
pascal@7859 | 10 sed -i '/--build/,/^fi/d' $0 |
pascal@4513 | 11 exit |
pascal@4513 | 12 fi |
pascal@19425 | 13 crc32() |
pascal@19425 | 14 { |
pascal@19425 | 15 t0=00000000; t1=77073096; t2=EE0E612C; t3=990951BA; |
pascal@19425 | 16 t4=076DC419; t5=706AF48F; t6=E963A535; t7=9E6495A3; |
pascal@19425 | 17 t8=0EDB8832; t9=79DCB8A4; t10=E0D5E91E; t11=97D2D988; |
pascal@19425 | 18 t12=09B64C2B; t13=7EB17CBD; t14=E7B82D07; t15=90BF1D91; |
pascal@19425 | 19 t16=1DB71064; t17=6AB020F2; t18=F3B97148; t19=84BE41DE; |
pascal@19425 | 20 t20=1ADAD47D; t21=6DDDE4EB; t22=F4D4B551; t23=83D385C7; |
pascal@19425 | 21 t24=136C9856; t25=646BA8C0; t26=FD62F97A; t27=8A65C9EC; |
pascal@19425 | 22 t28=14015C4F; t29=63066CD9; t30=FA0F3D63; t31=8D080DF5; |
pascal@19425 | 23 t32=3B6E20C8; t33=4C69105E; t34=D56041E4; t35=A2677172; |
pascal@19425 | 24 t36=3C03E4D1; t37=4B04D447; t38=D20D85FD; t39=A50AB56B; |
pascal@19425 | 25 t40=35B5A8FA; t41=42B2986C; t42=DBBBC9D6; t43=ACBCF940; |
pascal@19425 | 26 t44=32D86CE3; t45=45DF5C75; t46=DCD60DCF; t47=ABD13D59; |
pascal@19425 | 27 t48=26D930AC; t49=51DE003A; t50=C8D75180; t51=BFD06116; |
pascal@19425 | 28 t52=21B4F4B5; t53=56B3C423; t54=CFBA9599; t55=B8BDA50F; |
pascal@19425 | 29 t56=2802B89E; t57=5F058808; t58=C60CD9B2; t59=B10BE924; |
pascal@19425 | 30 t60=2F6F7C87; t61=58684C11; t62=C1611DAB; t63=B6662D3D; |
pascal@19425 | 31 t64=76DC4190; t65=01DB7106; t66=98D220BC; t67=EFD5102A; |
pascal@19425 | 32 t68=71B18589; t69=06B6B51F; t70=9FBFE4A5; t71=E8B8D433; |
pascal@19425 | 33 t72=7807C9A2; t73=0F00F934; t74=9609A88E; t75=E10E9818; |
pascal@19425 | 34 t76=7F6A0DBB; t77=086D3D2D; t78=91646C97; t79=E6635C01; |
pascal@19425 | 35 t80=6B6B51F4; t81=1C6C6162; t82=856530D8; t83=F262004E; |
pascal@19425 | 36 t84=6C0695ED; t85=1B01A57B; t86=8208F4C1; t87=F50FC457; |
pascal@19425 | 37 t88=65B0D9C6; t89=12B7E950; t90=8BBEB8EA; t91=FCB9887C; |
pascal@19425 | 38 t92=62DD1DDF; t93=15DA2D49; t94=8CD37CF3; t95=FBD44C65; |
pascal@19425 | 39 t96=4DB26158; t97=3AB551CE; t98=A3BC0074; t99=D4BB30E2; |
pascal@19425 | 40 t100=4ADFA541; t101=3DD895D7; t102=A4D1C46D; t103=D3D6F4FB; |
pascal@19425 | 41 t104=4369E96A; t105=346ED9FC; t106=AD678846; t107=DA60B8D0; |
pascal@19425 | 42 t108=44042D73; t109=33031DE5; t110=AA0A4C5F; t111=DD0D7CC9; |
pascal@19425 | 43 t112=5005713C; t113=270241AA; t114=BE0B1010; t115=C90C2086; |
pascal@19425 | 44 t116=5768B525; t117=206F85B3; t118=B966D409; t119=CE61E49F; |
pascal@19425 | 45 t120=5EDEF90E; t121=29D9C998; t122=B0D09822; t123=C7D7A8B4; |
pascal@19425 | 46 t124=59B33D17; t125=2EB40D81; t126=B7BD5C3B; t127=C0BA6CAD; |
pascal@19425 | 47 t128=EDB88320; t129=9ABFB3B6; t130=03B6E20C; t131=74B1D29A; |
pascal@19425 | 48 t132=EAD54739; t133=9DD277AF; t134=04DB2615; t135=73DC1683; |
pascal@19425 | 49 t136=E3630B12; t137=94643B84; t138=0D6D6A3E; t139=7A6A5AA8; |
pascal@19425 | 50 t140=E40ECF0B; t141=9309FF9D; t142=0A00AE27; t143=7D079EB1; |
pascal@19425 | 51 t144=F00F9344; t145=8708A3D2; t146=1E01F268; t147=6906C2FE; |
pascal@19425 | 52 t148=F762575D; t149=806567CB; t150=196C3671; t151=6E6B06E7; |
pascal@19425 | 53 t152=FED41B76; t153=89D32BE0; t154=10DA7A5A; t155=67DD4ACC; |
pascal@19425 | 54 t156=F9B9DF6F; t157=8EBEEFF9; t158=17B7BE43; t159=60B08ED5; |
pascal@19425 | 55 t160=D6D6A3E8; t161=A1D1937E; t162=38D8C2C4; t163=4FDFF252; |
pascal@19425 | 56 t164=D1BB67F1; t165=A6BC5767; t166=3FB506DD; t167=48B2364B; |
pascal@19425 | 57 t168=D80D2BDA; t169=AF0A1B4C; t170=36034AF6; t171=41047A60; |
pascal@19425 | 58 t172=DF60EFC3; t173=A867DF55; t174=316E8EEF; t175=4669BE79; |
pascal@19425 | 59 t176=CB61B38C; t177=BC66831A; t178=256FD2A0; t179=5268E236; |
pascal@19425 | 60 t180=CC0C7795; t181=BB0B4703; t182=220216B9; t183=5505262F; |
pascal@19425 | 61 t184=C5BA3BBE; t185=B2BD0B28; t186=2BB45A92; t187=5CB36A04; |
pascal@19425 | 62 t188=C2D7FFA7; t189=B5D0CF31; t190=2CD99E8B; t191=5BDEAE1D; |
pascal@19425 | 63 t192=9B64C2B0; t193=EC63F226; t194=756AA39C; t195=026D930A; |
pascal@19425 | 64 t196=9C0906A9; t197=EB0E363F; t198=72076785; t199=05005713; |
pascal@19425 | 65 t200=95BF4A82; t201=E2B87A14; t202=7BB12BAE; t203=0CB61B38; |
pascal@19425 | 66 t204=92D28E9B; t205=E5D5BE0D; t206=7CDCEFB7; t207=0BDBDF21; |
pascal@19425 | 67 t208=86D3D2D4; t209=F1D4E242; t210=68DDB3F8; t211=1FDA836E; |
pascal@19425 | 68 t212=81BE16CD; t213=F6B9265B; t214=6FB077E1; t215=18B74777; |
pascal@19425 | 69 t216=88085AE6; t217=FF0F6A70; t218=66063BCA; t219=11010B5C; |
pascal@19425 | 70 t220=8F659EFF; t221=F862AE69; t222=616BFFD3; t223=166CCF45; |
pascal@19425 | 71 t224=A00AE278; t225=D70DD2EE; t226=4E048354; t227=3903B3C2; |
pascal@19425 | 72 t228=A7672661; t229=D06016F7; t230=4969474D; t231=3E6E77DB; |
pascal@19425 | 73 t232=AED16A4A; t233=D9D65ADC; t234=40DF0B66; t235=37D83BF0; |
pascal@19425 | 74 t236=A9BCAE53; t237=DEBB9EC5; t238=47B2CF7F; t239=30B5FFE9; |
pascal@19425 | 75 t240=BDBDF21C; t241=CABAC28A; t242=53B39330; t243=24B4A3A6; |
pascal@19425 | 76 t244=BAD03605; t245=CDD70693; t246=54DE5729; t247=23D967BF; |
pascal@19425 | 77 t248=B3667A2E; t249=C4614AB8; t250=5D681B02; t251=2A6F2B94; |
pascal@19425 | 78 t252=B40BBE37; t253=C30C8EA1; t254=5A05DF1B; t255=2D02EF8D; |
pascal@19425 | 79 crc=$((0xFFFFFFFF)) |
pascal@19425 | 80 dd if=$iso bs=1 skip=$(($1)) count=$(($2)) 2> /dev/null | \ |
pascal@19425 | 81 od -v -w1 -t u1 -An | { |
pascal@19425 | 82 while read n; do |
pascal@19425 | 83 local x=$((($crc ^ $n) & 255)) |
pascal@19425 | 84 eval x=0x\$t$x |
pascal@19425 | 85 crc=$(((($crc >> 8) & 0x00FFFFFF) ^ $x)) |
pascal@19425 | 86 done |
pascal@19425 | 87 echo $(($crc ^ 0xFFFFFFFF)) |
pascal@19425 | 88 } |
pascal@19425 | 89 } |
pascal@19425 | 90 |
pascal@24276 | 91 iso= |
pascal@24276 | 92 heads=64 # zipdrive-style geometry |
pascal@24276 | 93 sectors=32 |
pascal@24276 | 94 partype=23 # "Windows hidden IFS" |
pascal@24276 | 95 entry= |
pascal@24276 | 96 id=$(( ($RANDOM <<16) + $RANDOM)) |
pascal@24276 | 97 offset=0 |
pascal@24276 | 98 partok=0 |
pascal@24276 | 99 hd0=0 |
pascal@24276 | 100 always=0 |
pascal@24276 | 101 |
pascal@24276 | 102 while [ -n "$1" ]; do |
pascal@24276 | 103 case "${1/--/-}" in |
pascal@24276 | 104 -crc32) iso=$2; crc32 $3 $4; exit 0;; |
pascal@24276 | 105 -a*) always=1;; |
pascal@24276 | 106 -ct*) hd0=2;; |
pascal@24276 | 107 -e*) entry=$2; shift;; |
pascal@24276 | 108 -f*) hd0=1;; |
pascal@24276 | 109 -h) heads=$2; shift;; |
pascal@24276 | 110 -i*) id=$(($2)); shift;; |
pascal@24276 | 111 -noh*) hd0=0;; |
pascal@24276 | 112 -nop*) partok=0;; |
pascal@24276 | 113 -o*) offset=$(($2)); shift;; |
pascal@24276 | 114 -p*) partok=1;; |
pascal@24276 | 115 -s) sectors=$2; shift;; |
pascal@24276 | 116 -t*) partype=$(($2 & 255)); shift;; |
pascal@24276 | 117 *) iso=$1;; |
pascal@24276 | 118 esac |
pascal@24276 | 119 shift |
pascal@24276 | 120 done |
pascal@24276 | 121 |
pascal@24276 | 122 if [ ! -f "$iso" ]; then |
pascal@24276 | 123 cat << EOT |
pascal@24276 | 124 usage: $0 [options] isoimage |
pascal@24276 | 125 options: |
pascal@24276 | 126 -h <X> Number of default geometry heads |
pascal@24276 | 127 -s <X> Number of default geometry sectors |
pascal@24276 | 128 -e --entry Specify partition entry number (1-4) |
pascal@24276 | 129 -o --offset Specify partition offset (default 0) |
pascal@24276 | 130 -t --type Specify partition type (default 0x17) |
pascal@24276 | 131 -i --id Specify MBR ID (default random) |
pascal@24276 | 132 --forcehd0 Assume we are loaded as disk ID 0 |
pascal@24276 | 133 --ctrlhd0 Assume disk ID 0 if the Ctrl key is pressed |
pascal@24276 | 134 --partok Allow booting from within a partition |
pascal@24276 | 135 --always Do not abort on errors |
pascal@24276 | 136 EOT |
pascal@24276 | 137 exit 1 |
pascal@24276 | 138 fi |
pascal@24276 | 139 |
pascal@24276 | 140 ddq() |
pascal@24276 | 141 { |
pascal@24276 | 142 dd "$@" 2> /dev/null |
pascal@24276 | 143 } |
pascal@24276 | 144 |
pascal@24276 | 145 readiso() |
pascal@24276 | 146 { |
pascal@24276 | 147 ddq bs=2k skip=$1 count=1 if=$iso | ddq bs=1 skip=$2 count=$3 |
pascal@24276 | 148 } |
pascal@24276 | 149 |
pascal@24276 | 150 # read a 32 bits data |
pascal@24276 | 151 read32() |
pascal@24276 | 152 { |
pascal@24276 | 153 readiso $1 $2 4 | od -N 4 -t u4 -An |
pascal@24276 | 154 } |
pascal@24276 | 155 |
pascal@24276 | 156 # read a 16 bits data |
pascal@24276 | 157 read16() |
pascal@24276 | 158 { |
pascal@24276 | 159 readiso $1 $2 2 | od -N 2 -t u2 -An |
pascal@24276 | 160 } |
pascal@24276 | 161 |
pascal@24276 | 162 # read a 8 bits data |
pascal@24276 | 163 read8() |
pascal@24276 | 164 { |
pascal@24276 | 165 readiso $1 $2 1 | od -N 1 -t u1 -An |
pascal@24276 | 166 } |
pascal@24276 | 167 |
pascal@24276 | 168 # write a 32 bits data |
pascal@24276 | 169 store32() |
pascal@24276 | 170 { |
pascal@24276 | 171 n=$2; for i in 0 8 16 24; do |
pascal@24276 | 172 printf '\\\\x%02X' $((($n >> $i) & 255)) |
pascal@24276 | 173 done | xargs echo -en | ddq bs=1 conv=notrunc of=$iso seek=$(($1)) |
pascal@24276 | 174 } |
pascal@24276 | 175 |
pascal@7859 | 176 main() |
pascal@4513 | 177 { |
pascal@23930 | 178 uudecode | unlzma | ddq bs=512 count=1 of=$iso conv=notrunc \ |
pascal@7859 | 179 skip=$(( (3*$partok) + $hd0)) |
pascal@7859 | 180 store32 432 $(($lba * 4)) |
pascal@7859 | 181 store32 440 $id |
pascal@8400 | 182 store32 508 0xAA550000 |
pascal@19425 | 183 e=$(( ((${entry:-1} -1) % 4) *16 +446)) |
pascal@7859 | 184 esect=$(( ($sectors + ((($cylinders -1) & 0x300) >>2)) <<16)) |
pascal@7859 | 185 ecyl=$(( (($cylinders -1) & 0xff) <<24)) |
pascal@20310 | 186 epart=$(((($heads - 1) <<8) +$esect +$ecyl)) |
pascal@23935 | 187 sectorcount=$(($size/512)) |
pascal@20334 | 188 lastlba=$(($sectorcount -1)) |
pascal@20334 | 189 if [ -z "$efi_ofs" ]; then |
pascal@20334 | 190 store32 $e 0x10080 |
pascal@20334 | 191 store32 $(($e + 4)) $(($partype + $epart)) |
pascal@20334 | 192 store32 $(($e + 8)) $offset |
pascal@20334 | 193 store32 $(($e + 12)) $sectorcount |
pascal@20334 | 194 else |
pascal@19425 | 195 [ $(read16 0 1024) -eq 35615 -a $(read16 11 0) -ne 35615 ] && |
pascal@19425 | 196 ddq bs=512 conv=notrunc skip=2 seek=44 count=20 if=$iso of=$iso |
pascal@20331 | 197 store32 $((446)) $((0x10000)) |
pascal@20331 | 198 store32 $((446+4)) $((0xFFFFFEEE)) |
pascal@20332 | 199 store32 $((446+8)) 1 |
pascal@20332 | 200 store32 $((446+12)) $lastlba |
pascal@19425 | 201 uudecode <<EOT | unlzma | ddq bs=512 seek=1 of=$iso conv=notrunc |
pascal@19425 | 202 begin-base64 644 - |
pascal@23935 | 203 XQAAgAD//////////wAikYVN1N2VY3JXMnUMJn1TblyFVNF25HoOVhrhw3Se |
pascal@23935 | 204 4kSBUojPrccmav59pOZXngC45IbLUHikh0qe2mYlrw/AaqRZRJRaLD2FL2dU |
pascal@23935 | 205 TQz7/DAViU2+RxNm5OdW//po4AA= |
pascal@19425 | 206 ==== |
pascal@19425 | 207 EOT |
pascal@23935 | 208 store32 $((0x230)) $lastlba |
pascal@20331 | 209 store32 $((0x420)) $efi_ofs |
pascal@20331 | 210 store32 $((0x428)) $(($efi_ofs+$efi_len-1)) |
pascal@19428 | 211 for i in 238 410 490 ; do |
pascal@19428 | 212 ddq if=/dev/urandom count=16 bs=1 conv=notrunc \ |
pascal@19428 | 213 of=$iso seek=$((0x$i)) |
pascal@19428 | 214 done |
pascal@20332 | 215 store32 $((0x258)) $(crc32 0x400 $((128*$(read32 0 $((0x250)))))) |
pascal@20331 | 216 store32 $((0x210)) $(crc32 0x200 $(read32 0 $((0x20C)))) |
pascal@19425 | 217 fi |
pascal@4513 | 218 } |
pascal@4513 | 219 |
pascal@7859 | 220 abort() |
pascal@7859 | 221 { |
pascal@7859 | 222 echo "$iso: $1" |
pascal@8974 | 223 [ $always -eq 0 ] && exit 1 |
pascal@7859 | 224 } |
pascal@7859 | 225 |
pascal@20892 | 226 [ "$(readiso 17 7 23)" = "EL TORITO SPECIFICATION" ] || |
pascal@7859 | 227 abort "no boot record found." |
pascal@7859 | 228 cat=$(read32 17 71) |
pascal@7859 | 229 [ $(read32 $cat 0) -eq 1 -a $(read32 $cat 30) -eq $(( 0x88AA55 )) ] || |
pascal@7859 | 230 abort "invalid boot catalog." |
pascal@19425 | 231 efi_ofs= |
pascal@19425 | 232 if [ $(read8 $cat 65) -eq 239 ]; then |
pascal@20334 | 233 [ ${entry:-1} != 1 ] && echo "$iso: efi boot ignore --entry $entry" |
pascal@20334 | 234 entry=1 |
pascal@19425 | 235 partype=0 |
pascal@20269 | 236 efi_ofs=$((4*$(read32 $cat 104))) |
pascal@20312 | 237 efi_len=$(($(read16 $(($efi_ofs/4)) 19))) |
pascal@20312 | 238 [ $efi_len -eq 0 ] && efi_len=$(($(read32 $(($efi_ofs/4)) 32))) |
pascal@19425 | 239 fi |
pascal@7859 | 240 lba=$(read32 $cat 40) |
pascal@7859 | 241 [ $(read32 $lba 64) -eq 1886961915 ] || |
pascal@7859 | 242 abort "no isolinux.bin hybrid signature in bootloader." |
pascal@4513 | 243 size=$(stat -c "%s" $iso) |
pascal@7859 | 244 trksz=$(( 512 * $heads * $sectors )) |
pascal@7859 | 245 cylinders=$(( ($size + $trksz - 1) / $trksz )) |
pascal@7859 | 246 pad=$(( (($cylinders * $trksz) - $size) / 512 )) |
pascal@23935 | 247 #[ $pad -ne 0 ] && size=$(($size+$pad)) && ddq bs=512 count=$pad if=/dev/zero >> $iso |
pascal@4513 | 248 if [ $cylinders -gt 1024 ]; then |
pascal@4513 | 249 cat 1>&2 <<EOT |
pascal@4513 | 250 Warning: more than 1024 cylinders ($cylinders). |
pascal@4513 | 251 Not all BIOSes will be able to boot this device. |
pascal@4513 | 252 EOT |
pascal@4513 | 253 cylinders=1024 |
pascal@4513 | 254 fi |
pascal@4513 | 255 |
pascal@7859 | 256 main <<EOT |