]> wimlib.net Git - wimlib/blobdiff - programs/mkwinpeimg.in
Cleanups
[wimlib] / programs / mkwinpeimg.in
index 805b2bd60a1e2fb94c0c772d7274d7ee496cdb7f..654249b24cf73f9c459145c87671caee9dceaff0 100755 (executable)
@@ -18,7 +18,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-script_name="$(basename $0)"
+script_name="$(basename "$0")"
 PREFIX_REG="::"
 WIMLIB_VERSION=@VERSION@
 imagex=@IMAGEX_PROGNAME@
@@ -94,13 +94,14 @@ Usage: $script_name [OPTIONS] IMAGE
   -A, --waik-dir=DIR       Get the boot files and boot.wim from the ISO of the
                               Windows Automated Installation Kit mounted on DIR
                               instead of from the Windows 7 or Windows 8 DVD.
+                              This also works if the mounted ISO is for the
+                              WAIK supplement rather than the WAIK itself.
   -s, --start-script=FILE  Add FILE to the root directory of Windows PE image
                               and adjust \Windows\System32\winpeshl.ini to
                               execute FILE when Windows PE starts up.
-  -w, --wim=WIM            Use WIM as the boot.wim file.  Defaults to
-                              sources/boot.wim in the Windows DVD directory, or
-                              F1_WINPE.WIM from the WAIK if --waik-dir is
-                              specified.
+  -w, --wim=WIM            Use WIM as the boot.wim file.  This defaults to the
+                              appropriate WIM file from the Windows DVD, WAIK,
+                              or WAIK supplement.
   -O, --overlay=DIR        Adds all the files in DIR to the Windows PE image.
   -t, --tmp-dir=DIR        Use DIR as the temporary base of the ISO filesystem.
                               Defaults to making one using "mktemp -d".
@@ -115,7 +116,7 @@ EOF
 }
 
 version() {
-       echo "$script_name (wimlib $WIMLIB_VERSION)"
+       echo "$script_name (distributed with wimlib $WIMLIB_VERSION)"
        exit 0
 }
 
@@ -297,7 +298,7 @@ EOF
                fi
        fi
 
-       if [ -n "$waik_dir" ]; then
+       if [ -n "$waik_dir" ] &&  [ -f "$waik_dir"/wAIK${arch}.msi ]; then
                if ! type -P cabextract &> /dev/null ; then
                        cat << EOF
 ERROR: The boot files in the Windows Automated Installation Kit (WAIK) are
@@ -314,18 +315,29 @@ EOF
 get_primary_boot_files() {
        if [ -n "$waik_dir" ]; then
                # Get boot files from the WAIK.
-
                stat_busy "Copying primary boot files from the Windows Automated Installation Kit ($waik_dir, $arch)"
-               if [ $make = iso ]; then
-                       cabextract "$waik_dir"/wAIK${arch}.msi -F F_WINPE_${arch}_etfsboot.com -p \
-                                       > "$tmp_dir"/etfsboot.com || stat_fail
+
+               if [ -f "$waik_dir"/wAIK${arch}.msi ]; then
+                       if [ $make = iso ]; then
+                               cabextract "$waik_dir"/wAIK${arch}.msi -F F_WINPE_${arch}_etfsboot.com -p \
+                                               > "$tmp_dir"/etfsboot.com || stat_fail
+                       fi
+                       cabextract "$waik_dir"/wAIK${arch}.msi -F F${arch_id}_BOOTMGR -p \
+                                       > "$tmp_dir"/bootmgr || stat_fail
+                       cabextract "$waik_dir"/wAIK${arch}.msi -F F_WINPE_${arch}_boot.sdi -p \
+                                       > "$tmp_dir"/boot/boot.sdi || stat_fail
+                       cabextract "$waik_dir"/wAIK${arch}.msi -F F_WINPE_${arch}_bcd -p \
+                                       > "$tmp_dir"/boot/bcd || stat_fail
+               # The WAIK supplement disc has a different structure
+               else
+                       # Note: fuseiso, mount default to map=normal i.e. lowercase
+                       if [ $make = iso ]; then
+                               cp "$waik_dir"/${arch,,}/boot/etfsboot.com $tmp_dir/etfsboot.com || stat_fail
+                       fi
+                       cp "$waik_dir"/${arch,,}/bootmgr $tmp_dir/bootmgr || stat_fail
+                       cp "$waik_dir"/${arch,,}/boot/boot.sdi $tmp_dir/boot/boot.sdi || stat_fail
+                       cp "$waik_dir"/${arch,,}/boot/bcd $tmp_dir/boot/bcd || stat_fail
                fi
-               cabextract "$waik_dir"/wAIK${arch}.msi -F F${arch_id}_BOOTMGR -p \
-                               > "$tmp_dir"/bootmgr || stat_fail
-               cabextract "$waik_dir"/wAIK${arch}.msi -F F_WINPE_${arch}_boot.sdi -p \
-                               > "$tmp_dir"/boot/boot.sdi || stat_fail
-               cabextract "$waik_dir"/wAIK${arch}.msi -F F_WINPE_${arch}_bcd -p \
-                               > "$tmp_dir"/boot/bcd || stat_fail
                stat_done
        else
                # Get boot files from the Windows ISO
@@ -350,9 +362,16 @@ get_boot_wim() {
                # WIM file unspecified- grab it from the WAIK or the Windows DVD
                if [ -n "$waik_dir" ]; then
                        # WAIK
-                       stat_busy "Extracting boot.wim from \"$waik_dir/WinPE.cab\""
-                       cabextract "$waik_dir/WinPE.cab" -F F${arch_id}_WINPE.WIM -p \
-                                       > "$boot_wim" 2>/dev/null || stat_fail
+                       if [ -f "$waik_dir/WinPE.cab" ]; then
+                               stat_busy "Extracting boot.wim from \"$waik_dir/WinPE.cab\""
+                               cabextract "$waik_dir/WinPE.cab" -F F${arch_id}_WINPE.WIM -p \
+                                               > "$boot_wim" 2>/dev/null || stat_fail
+                       # WAIK supplement has different layout
+                       else
+                               stat_busy "Copying boot.wim from \"${waik_dir}/${arch,,}/winpe.wim\""
+                               cp "$waik_dir"/${arch,,}/winpe.wim "$boot_wim" || stat_fail
+                               chmod +w "$boot_wim"
+                       fi
                        stat_done
                else
                        # Windows DVD
@@ -389,13 +408,13 @@ modify_boot_wim() {
 
        if [ -n "$start_script" ]; then
                stat_busy "Setting \"$start_script\" as the script to be executed when Windows PE boots"
-               cp "$start_script" "$tmp_dir/$start_script"
+               start_script_base="$(basename "$start_script")"
                cat > "$tmp_dir/__mkwinpeimg.winpeshl.ini" <<- EOF
                        [LaunchApps]
-                       %SYSTEMDRIVE%\\$start_script
+                       %SYSTEMDRIVE%\\$start_script_base
                EOF
                cat 1>&3 <<- EOF
-                       add '$tmp_dir/$start_script' '/$start_script'
+                       add '$start_script' '/$start_script_base'
                        delete --force /Windows/System32/winpeshl.ini
                        add '$tmp_dir/__mkwinpeimg.winpeshl.ini' /Windows/System32/winpeshl.ini
                EOF
@@ -454,11 +473,26 @@ make_disk_img() {
 
        export MTOOLSRC="$mtool_conf"
 
-       mformat -h 255 -s 63 -T $(( image_size / 512)) s:
-       mcopy -s "$tmp_dir"/* s:
+       mformat -h 255 -s 63 -T $(( image_size / 512)) s: || stat_fail
+       mcopy -s "$tmp_dir"/* s: || stat_fail
 
        syslinux --install "$image"
-       mcopy /usr/lib/syslinux/chain.c32 s:
+
+       syslinuxdir="/usr/lib/syslinux"
+
+       if [ -d "$syslinuxdir/bios" ]; then
+               biosdir="$syslinuxdir/bios"
+       else
+               biosdir="$syslinuxdir"
+       fi
+
+       mcopy "$biosdir/chain.c32" s: || stat_fail
+       if [ -e "$biosdir/libcom32.c32" ]; then
+               mcopy "$biosdir/libcom32.c32" s:
+       fi
+       if [ -e "$biosdir/libutil.c32" ]; then
+               mcopy "$biosdir/libutil.c32" s:
+       fi
        mcopy - 's:syslinux.cfg' <<- EOF
                DEFAULT winpe
                LABEL   winpe