@deadbug
Well, I started something at XP SP3 time.
Not finished so far. There are some manual parts still, should be automatic builded in future.
Maybe you like some ideas.
No fancy gui. Just a batch.
And I'm lazy, did choose some requirements:
no space in file or directory names, no strange chars, plain ASCII chars
Back then I choose some conditions:
small foot print at hard disk
less copy files at hard disk
some single CD XP folders: possibility to create a single CD and to create multi boot at request
As files are not copied at build time, iso creation tool has to collect files from different locations and merge them.
Another solution maybe create junction and or hard linkd at build time. This creates final multi boot soltuion at hard disk at build time.
General multi boot was described
http://www.msfn.org/board/index.php?s=&...st&p=814566
txtsetup.sif SetupSourcePath and BootPath is used.
That's similiar to flyakite and different.
There are three fixed file names to define basic boot
Quote
\I386\NTDETECT.COM
\I386\SETUPLDR.BIN
\I386\TXTSETUP.SIF
Other files are redirected and defined by BootPath and SetupSourcePath
Sed.exe is used to create a multi boot txtsetup.sif.
Mkisofs is used to redirect files.
That's the basic windows multi boot solution.
Bootloader is a difficult decission.
Grub4dos can chainload setupldr.bin. No boot sector file required.
Grub4dos is developed currently.
BCDW can chainload setupldr.bin. No boot sector file required.
In addition BCDW hexedit setupldr.bin in RAM. No hexediting setupldr.bin at build time.
However BCDW isn't developed since 2004. Does fail at some current hardware.
Isolinux is developed currently. Tested at a lot of hardware.
Can chainload setupldr.bin at (USB) hard disk, but not at CD so far.
Hence require a boot sector file.
As for grub4dos and isolinux:
Gsar.exe can be used to hexedit setupldr.bin at build time.
A example, create a multi boot XP PRO CD:
Given XP source files at XP_PRO.
d:\bcd\multi\XP_PRO
Files are at a NTFS partition.
Batches are at D:\Bcd\multi\build.
Binaries are at D:\Bcd\multi\build\bin.
Quote
BatchLink.exe
mkisofs.exe
cygwin1.dll
gsar.exe
sed.exe
Integrate BTS driverpacks drivers:
First step: create a second d:\bcd\multi\XP_PRO_BTS
Create hard links instead of copy: mk-link.cmd D:\Bcd\multi\XP_PRO D:\Bcd\multi\XP_PRO_BTS
Integrate BTS driverpacks drivers manually.
D:\Bcd\multi\build\mk-link.cmd
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set path=%~dp0;%~dp0.\bin;%path%
rem Create hard links for XP driver integration
rem BatchLink Utility
rem Copyright © 2000 Mike Woodring
rem [url="http://www.bearcanyon.com"]http://www.bearcanyon.com[/url]
rem ### parameters ####################################################
set Source=%~1
set Destination=%Source%_BTS
if not %2.==. set Destination=%~2
rem ###################################################################
if not exist "%Source%" (
echo error: source directory %source% not found
echo. & echo Syntax: %~nx0 source [destination]
goto :eof)
if not exist "%~dp0.\bin\BatchLink.exe" (echo error: BatchLink.exe not found &goto :eof)
md "%Destination%"
call :calc_string_length %Source%
set /a new_dir_start=%string_length%+1
echo create hard links at %Destination%
pushd %Destination%
BatchLink.exe %Source% /q
popd
pushd %Source%
for /D /R . %%a in (*) do call :mklink %%a
popd
goto :eof
:mklink
set Source=%~1
call :exec set Target=%%Source:~%new_dir_start%%%
echo %Target%
pushd "%Destination%"
md "%Target%"
cd /d "%Target%"
BatchLink.exe "%Source%" /q
popd
goto :eof
:calc_string_length
set string=%*
set string=%string: =#%
set string_length=-1
echo %string%
for /L %%a in (0,1,255) do (
call :exec set Char=%%string:~%%a,1%%
if !Char!.==. (set string_length=%%a & goto :eof)
)
goto :eof
:exec
%*
goto :eof
Create a config file: d:\bcd\multi\build\multi01.txt
@echo off
setlocal EnableExtensions EnableDelayedExpansion
REM +=================================================================+
REM | Multi-Boot CD |
REM | |
REM | bootpath solution |
REM | |
REM | based on: DVD [url="http://flyakite.msfn.org/"]http://flyakite.msfn.org/[/url] |
REM | |
REM |--- created by cdob ---------------------------------------------|
REM | |
REM +--- under construction ver -272 --------------------------------+
set path=%~dp0;%~dp0.\bin;%path%
set multi_lst=%~dp0multi01.txt
if not %~1.==. set multi_lst=%~1
rem mkisofs sort file
set sort_lst=%~dp0multi_sort.txt
rem mkisofs parameter file
set mkisofs_par=%~dp0mkisofs.par
pushd "%~dp0.."
echo -o multi_bootpath\XP_multi.iso > %mkisofs_par%
(echo -iso-level 3 -U -D
echo -force-uppercase
echo -volid "XP_MULTI"
echo -b BCDW/loader.bin -hide loader.bin -hide boot.catalog
echo -no-emul-boot -boot-load-size 4
echo -duplicates-once
echo -graft-points -cache-inodes -follow-links
) >> %mkisofs_par%
rem exclude some folders
(echo -x win9xmig
echo -x win9xupg
echo -x winntupg
echo -x COMPDATA
) >> %mkisofs_par%
rem add multi_bootpath\root folder
echo multi_bootpath/root >> %mkisofs_par%
if exist multi_bootpath\root\win51* del multi_bootpath\root\win51*
FOR /F "eol=; tokens=1,*" %%a in (%multi_lst%) do call :add_multi %%a %%b
rem fix: replace multi_bootpath\root\win51* files by 0 byte size
for %%a in (multi_bootpath\root\win51*) do (
echo /%%~nxa=nul: >> %mkisofs_par%
del %%a
)
echo on
mkisofs.exe @%mkisofs_par%
@echo off
popd
goto :eof =============================================================
:add_multi ============================================================
set boot_4_char=%~1
set source_inst_files=%~2
echo. &echo add: %boot_4_char% %source_inst_files%
if not exist multi_bootpath\%boot_4_char%\I386 md multi_bootpath\%boot_4_char%\I386
rem collect flag files at root. And create empty flag files at %boot_4_char%
for %%a in (%source_inst_files%\win51*) do (
copy /y %%a multi_bootpath\root >nul 2>&1
echo /%boot_4_char%/%%~nxa=nul: >> %mkisofs_par%
)
rem add I386 files, remap to new four char name
(echo /%boot_4_char%/I386=multi_bootpath/%boot_4_char%/I386
echo /%boot_4_char%/I386=%source_inst_files:\=/%/I386
) >> %mkisofs_par%
rem add available $OEM$ OEM folder
for %%a in ($OEM$ OEM) do (
for %%b in (multi_bootpath\%boot_4_char% %source_inst_files%) do (
if exist %%b\%%a (
echo %%b\%%a
set read_path=%%b\%%a
echo /%boot_4_char%/%%a/=!read_path:\=/! >> %mkisofs_par%
)
)
)
rem patch txtsetup.sif SetupSourcePath: set \XP_INST_%boot_4_char%\
if not exist multi_bootpath\%boot_4_char%\txtsetup.sif (
sed.exe -e s/"^SetupSourcePath.*=.*$"/"SetupSourcePath = \"\\%boot_4_char%\\\\\"\nBootPath = \\%boot_4_char%\\I386\\ "/g %source_inst_files%\I386\txtsetup.sif> multi_bootpath\%boot_4_char%\TXTSetup.SIF
)
rem add \%boot_4_char%\ files
(echo /%boot_4_char%/TXTSETUP.SIF=multi_bootpath/%boot_4_char%/TXTSetup.SIF
echo /%boot_4_char%/NTDETECT.COM=%source_inst_files:\=/%/I386/NTDETECT.COM
echo /%boot_4_char%/SETUPLDR.BIN=%source_inst_files:\=/%/I386/SETUPLDR.BIN
) >> %mkisofs_par%
rem todo dosnet.inf
goto :eof =============================================================
Example creates a mkiosfs.par parameter file
-o multi_bootpath\XP_multi.iso
-iso-level 3 -U -D
-force-uppercase
-volid "XP_MULTI"
-b BCDW/loader.bin -hide loader.bin -hide boot.catalog
-no-emul-boot -boot-load-size 4
-duplicates-once
-graft-points -cache-inodes -follow-links
-x win9xmig
-x win9xupg
-x winntupg
-x COMPDATA
multi_bootpath/root
/XPR1/WIN51IP=nul:
/XPR1/WIN51IP.SP3=nul:
/XPR1/I386=multi_bootpath/XPR1/I386
/XPR1/I386=XP_PRO/I386
/XPR1/TXTSETUP.SIF=multi_bootpath/XPR1/TXTSetup.SIF
/XPR1/NTDETECT.COM=XP_PRO/I386/NTDETECT.COM
/XPR1/SETUPLDR.BIN=XP_PRO/I386/SETUPLDR.BIN
/XPR2/WIN51IP=nul:
/XPR2/WIN51IP.SP3=nul:
/XPR2/I386=multi_bootpath/XPR2/I386
/XPR2/I386=XP_PRO_BTS/I386
/XPR2/OEM/=XP_PRO_BTS/OEM
/XPR2/TXTSETUP.SIF=multi_bootpath/XPR2/TXTSetup.SIF
/XPR2/NTDETECT.COM=XP_PRO_BTS/I386/NTDETECT.COM
/XPR2/SETUPLDR.BIN=XP_PRO_BTS/I386/SETUPLDR.BIN
/WIN51IP=nul:
/WIN51IP.SP3=nul:
XP use flag files win51* by default.
Adjust batch if you use Windows 2000.
As for driverpacks there is antother decision to be taken.
Method 2 use \OEM folder. That's one OEM version for hole CD/DVD.
I prefer OEM at each windows installation \ABCD\OEM. Driverpacks presetup.cmd has to be edited.