Windows boot process and grub4dos wimboot

Windows Boot Process - BCD, Boot Process,

wimboot - boot directly to .wim file

Using wimboot from grub4dos

title Install Windows10Home32_64Aniversary - wimboot

map (hd0) (hd1)

map (hd1) (hd0)

map --hook

kernel (hd1,0)/multiboot/wimboot

initrd @bootmgr=(hd1,0)/multiboot/Windows10Home32_64Aniversary/bootmgr @bcd=(hd1,0)/multiboot/Windows10Home32_64Aniversary/boot/bcd @boot.sdi=(hd1,0)/multiboot/Windows10Home32_64Aniversary/boot/boot.sdi @boot.wim=(hd1,0)/multiboot/Windows10Home32_64Aniversary/sources/boot.wim

(bootmgr file may not actually be required?).

How to have multiple Windows Install images

1. Use wimboot to boot from the boot.wim file

2. Ensure a \AutoUnattend.xml file inside Image #2 of boot.wim

<?xml version="1.0" encoding="utf-8" ?>

<unattend xmlns="urn:schemas-microsoft-com:unattend">

<settings pass="windowsPE">

<component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<RunSynchronous>

<RunSynchronousCommand wcm:action="add">

<Order>1</Order>

<Path>cmd /q /c "FOR %i IN (C D E F G H I J K L N M O P Q R S T U V W X Y Z) DO IF EXIST %i:\multiboot\Windows10Home32_64Aniversary\remount.cmd cmd /k %i:\multiboot\Windows10Home32_64Aniversary\remount.cmd"</Path>

<Description>Launch Remount</Description>

</RunSynchronousCommand>

</RunSynchronous>

<UserData>

<AcceptEula>true</AcceptEula>

<ProductKey>

<Key></Key>

<WillShowUI>Always</WillShowUI>

</ProductKey>

</UserData>

</component>

<component name="Microsoft-Windows-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<RunSynchronous>

<RunSynchronousCommand wcm:action="add">

<Order>1</Order>

<Path>cmd /q /c "FOR %i IN (C D E F G H I J K L N M O P Q R S T U V W X Y Z) DO IF EXIST %i:\multiboot\Windows10Home32_64Aniversary\remount.cmd cmd /k %i:\multiboot\Windows10Home32_64Aniversary\remount.cmd"</Path>

<Description>Launch Remount</Description>

</RunSynchronousCommand>

</RunSynchronous>

<UserData>

<AcceptEula>true</AcceptEula>

<ProductKey>

<Key></Key>

<WillShowUI>Always</WillShowUI>

</ProductKey>

</UserData>

</component>

</settings>

</unattend>

3. remount.cmd will map a Z: drive so that \Sources\Install.wim will be found

@echo off

cls

Set Distroname=Windows10Home32_64Aniversary

echo %Distroname%

subst Z: "%~d0\multiboot\%Distroname%"

echo mounted "%~d0\multiboot\%Distroname%" as Z:

exit

Directory structure

\multiboot\wimboot

multiboot\Windows10Home32_64Aniversary\remount.cmd

multiboot\Windows10Home32_64Aniversary\bootmgr

multiboot\Windows10Home32_64Aniversary\setup.exe

multiboot\Windows10Home32_64Aniversary\boot folder

multiboot\Windows10Home32_64Aniversary\sources folder

Injecting files

The latest version (2017+) of wimboot has the ability to inject files into the X:\Windows\System32 folder using the syntax:

initrd @xxx.bat=/special.bat

A new file X:\Windows\System32\xxx.bat will be created (or replaced if it already exists) and it's contents will be the same as that in /special.bat

This means it is possible to inject a winpeshl.ini file into the final X: volume.

The winpeshl.ini file is the first file to be executed by WinPE, so any applications you place in it will 'take over' the WinPE boot process.

For instance, if you run a .bat or .cmd file from winpeshl.ini, you could then use it to:

    1. Find a Windows .ISO file on a USB drive in the system

    2. Mount the ISO as drive Y: using ImDisk

    3. Find an AutoUnattend.xml file on the USB drive

    4. Launch X:\Setup.exe and specify the XML file for unattended installs

winpeshl.ini

[LaunchApps]

startupe2b.bat

startupe2b.bat

(code here to find DVDDRIVE (e.g. Y:), mount ISO, find USB Drive (%E2BDRIVE%) and then run Setup.exe)

%DVDDRIVE%

cd \

REM Setup.exe may be in \Sources, \x86\Sources or \x64\Sources folders...

set pp=\x86

if /i "%PROCESSOR_ARCHITECTURE%"=="AMD64" set pp=\x64

if not exist %DVDDRIVE%%pp%\setup.exe set pp=

#Run setup with XML file in root of USB drive

%DVDDRIVE%%pp%\setup.exe /Unattend:%E2BDRIVE%\AutoUnattend.xml

Direct boot from Windows Install ISOs

Here is a grub4dos menu to directly boot a Windows Install ISO from a bootable USB drive

title Install Windows10x64UK_Oct_2018 using wimboot method \n

map /Windows10x64UK_Oct_2018.iso (0xff)

map --hook root (0xff)

# the root path now points to the files inside the ISO file

# hd0,0 is the USB drive that we booted from

# (add index=1 after wimboot to boot from wim image #1)

kernel (hd0,0)/wimboot

initrd @startup.bat=(hd0,0)/startup.bat @winpeshl.ini=(hd0,0)/winpeshl.ini @bcd=/boot/bcd @boot.sdi=/boot/boot.sdi @boot.wim=/sources/boot.wim

map (hd0) (hd1)

map (hd1) (hd0)

map --hook

#drive 0 must not be a removable drive or else Windows Setup will think it is the 'system' boot disk and refuse to install the boot files to it.

boot

wimboot will load \Windows\Boot\EFI\bootmgr.exe from the boot.wim image.