#!/bin/zsh
export iso=$1
export output=$2
export disk=$3
export index=$4
if [ -e $iso ];then
sleep .01
else
echo cannot find windows iso
exit 1
fi
if [ -z $output ];then
export output=../winpe.iso
fi
if [ -z $disk ];then
echo no disk number supplied, configuring for disk 0
export disk=0
fi
if [ -z $index ];then
echo no image index supplied, configuring for index 1
export index=1
fi
if [ -e $output ];then
if [ -e $output".img" ];then
sleep .01
else
export outputsize=`wc -c $output|cut -f 1 -d \  `             
export efiblocks=$(($outputsize/384))
dd if=/dev/zero of=$output".img" bs=512 count=$efiblocks
udisksctl loop-setup -f $output
export outputloopdev=`losetup|grep -i $output|cut -f 1 -d \  `
udisksctl mount -b $outputloopdev
export outputmount=`mount|grep -i $outputloopdev|cut -f 3 -d \  `
export espbytes=`wc -c $outputmount"/efi.img"|cut -f 1 -d \  `
export espsize=$(($espbytes/256))
sgdisk -o -n 1:0:$espsize":ef00" -t 1:ef00 -n 2:$(($espsize+2048)):-0s:0700 -t 2:0700 $output".img"
dd if=$outputmount"/efi.img" of=$output".img" conv=notrunc bs=512 seek=2048
export datastart=`sgdisk -i 2 $output".img"|grep -i first\ sector|cut -f 2 -d :|cut -f 2 -d \  `
mkfs.vfat -S 512 --offset=$datastart $output".img"
udisksctl loop-setup -f $output".img"
export fdloopdev=`losetup|grep -i $output".img"|cut -f 1 -d \  `
udisksctl mount -b $fdloopdev"p2"
export fdmount=`mount|grep -i $fdloopdev"p2"|cut -f 3 -d \  `
rsync -avz $outputmount"/" $fdmount"/"
umount $fdmount
umount $outputmount
udisksctl loop-delete -b $outputloopdev
udisksctl loop-delete -b $fdloopdev
fi
else
udisksctl loop-setup -f $iso
export loopdev=`losetup|grep -iw $iso|cut -f 1 -d \  `
udisksctl mount -b $loopdev
export isomount=`mount|grep -iw $loopdev|cut -f 3 -d \  `
if [ -e scripts ];then
export user_supplied_scripts=1
else
mkdir -p scripts
fi
if [ -d tmp ];then
export user_supplied_root=1
else
mkdir tmp
fi
if [ -e install.wim ];then
export user_supplied_wim=1
else
echo extracting image index $index from $isomount/sources/install.wim, this will take a long time.
wimexport $isomount/sources/install.wim $index $PWD/install.wim --solid
export user_supplied_wim=1
fi
if [ -e scripts/partition ];then
export user_supplied_partition_scr=1
else
cat > scripts/partition<<EOF
select disk $disk
clean
convert gpt
create partition efi size 100
create partition msr size 16
create partition primary
select partition 1
assign letter=s
select partition 3
assign letter=w
EOF
fi
if [ -e scripts/install.bat ];then
export user_supplied_install_scr=1
else
cat > scripts/install.bat <<EOF
@echo on
cd/dx:\\
pnputil /add-driver x:\drivers /subdirs
for %%f in (x:\windows\inf\oem*) do drvload %%f
diskpart /s partition
format s: /fs:fat32 /q /y
format w: /fs:ntfs /q /y
EOF
for l in "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z";do
echo if exist $l":\sources\install.wim" set wimpath=$l":\sources\install.wim" >> scripts/install.bat
done
cat >> scripts/install.bat <<EOF
dism /apply-image /imagefile:%wimpath% /index:1 /applydir:w:\\
dism /add-driver /driver:x:\drivers /recurse /image:w:\\
bcdboot w:\windows /s s:\ /f all
cd/dw:\windows\system32
.\shutdown.exe /r /t 0
EOF
fi
if [ -e mkisofs ];then
export user_supplied_mkisofs_override=1
else
cat > mkisofs<<EOF
export PATH=.:$PATH
export mkisofs=`which -a mkisofs|tail -n 1`
\$mkisofs -rock -iso-level 3 -untranslated-filenames -eltorito-alt-boot -eltorito-platform efi -b tmp/efi.img \`echo \$@|sed "s|Microsoft Windows PE |Microsoft_Windows_PE_|g;s|(||g;s|)||g"\`
EOF
chmod 700 mkisofs
fi
if [ -e scripts/drivers ];then
cp -rf scripts/drivers tmp/\$WinPEDriver\$
fi
cp -rf $isomount/efi tmp
chmod -R 700 tmp
export espsize=`du -h --total tmp/efi|tail -n 1|cut -f 1 -d M`
export newefisize=$(($espsize+1))
dd if=/dev/zero of=tmp/efi.img count=$newefisize bs=1M
mkfs.vfat tmp/efi.img
udisksctl loop-setup -f tmp/efi.img
export efiloopdev=`losetup|grep -iw efi.img|cut -f 1 -d \  `
udisksctl mount -b $efiloopdev
export efimount=`mount|grep -iw $efiloopdev|cut -f 3 -d \  `
cp -rf tmp/efi $efimount
umount $efimount
udisksctl loop-delete -b $efiloopdev
export oldpath=$PATH
export PATH=.:$PATH
mkdir -p tmp/sources
cp install.wim tmp/sources
mkwinpeimg -s scripts/install.bat -W $isomount -O scripts -t tmp -i $output
export PATH=$oldpath
umount $isomount
udisksctl loop-delete -b $loopdev
fi
if [ -e $output".img" ];then
sleep .01
else
export outputsize=`wc -c $output|cut -f 1 -d \  `             
export efiblocks=$(($outputsize/384))
dd if=/dev/zero of=$output".img" bs=512 count=$efiblocks
udisksctl loop-setup -f $output
export outputloopdev=`losetup|grep -i $output|cut -f 1 -d \  `
udisksctl mount -b $outputloopdev
export outputmount=`mount|grep -i $outputloopdev|cut -f 3 -d \  `
export espbytes=`wc -c $outputmount"/efi.img"|cut -f 1 -d \  `
export espsize=$(($espbytes/256))
sgdisk -o -n 1:0:$espsize":ef00" -t 1:ef00 -n 2:$(($espsize+2048)):-0s:0700 -t 2:0700 $output".img"
dd if=$outputmount"/efi.img" of=$output".img" conv=notrunc bs=512 seek=2048
export datastart=`sgdisk -i 2 $output".img"|grep -i first\ sector|cut -f 2 -d :|cut -f 2 -d \  `
mkfs.vfat -S 512 --offset=$datastart $output".img"
udisksctl loop-setup -f $output".img"
export fdloopdev=`losetup|grep -i $output".img"|cut -f 1 -d \  `
udisksctl mount -b $fdloopdev"p2"
export fdmount=`mount|grep -i $fdloopdev"p2"|cut -f 3 -d \  `
rsync -avz $outputmount"/" $fdmount"/"
umount $fdmount
umount $outputmount
udisksctl loop-delete -b $outputloopdev
udisksctl loop-delete -b $fdloopdev
fi
if [ -z $user_supplied_root ];then
rm -rf tmp
else
sleep .01
fi
if [ -z $user_supplied_wim ];then
rm install.wim
else
sleep .01
fi
if [ -z $user_supplied_partition_scr ];then
rm scripts/partition
else
sleep .01
fi
if [ -z $user_supplied_install_scr ];then
rm scripts/install.bat
else
sleep .01
fi
if [ -z $user_supplied_mkisofs_override ];then
rm mkisofs
else
sleep .01
fi
