feat: Added support for Windows Server 2003 (#547)

This commit is contained in:
Kroese 2024-05-28 01:00:16 +02:00 committed by GitHub
parent 4e2651e06a
commit beaeddac0b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 199 additions and 114 deletions

View File

@ -88,6 +88,9 @@ parseVersion() {
"2008" | "2008r2" | "win2008" | "win2008r2" | "windows2008" | "windows 2008" ) "2008" | "2008r2" | "win2008" | "win2008r2" | "windows2008" | "windows 2008" )
VERSION="win2008r2" VERSION="win2008r2"
;; ;;
"2003" | "2003r2" | "win2003" | "win2003r2" | "windows2003" | "windows 2003" )
VERSION="win2003r2"
;;
"core11" | "core 11" ) "core11" | "core 11" )
VERSION="core11" VERSION="core11"
[ -z "$DETECTED" ] && DETECTED="win11x64" [ -z "$DETECTED" ] && DETECTED="win11x64"
@ -370,12 +373,13 @@ printVersion() {
"win95"* ) desc="Windows 95" ;; "win95"* ) desc="Windows 95" ;;
"win2k"* ) desc="Windows 2000" ;; "win2k"* ) desc="Windows 2000" ;;
"winvista"* ) desc="Windows Vista" ;; "winvista"* ) desc="Windows Vista" ;;
"win2025"* ) desc="Windows Server 2025" ;; "win2003"* ) desc="Windows Server 2003" ;;
"win2022"* ) desc="Windows Server 2022" ;;
"win2019"* ) desc="Windows Server 2019" ;;
"win2016"* ) desc="Windows Server 2016" ;;
"win2012"* ) desc="Windows Server 2012" ;;
"win2008"* ) desc="Windows Server 2008" ;; "win2008"* ) desc="Windows Server 2008" ;;
"win2012"* ) desc="Windows Server 2012" ;;
"win2016"* ) desc="Windows Server 2016" ;;
"win2019"* ) desc="Windows Server 2019" ;;
"win2022"* ) desc="Windows Server 2022" ;;
"win2025"* ) desc="Windows Server 2025" ;;
esac esac
if [ -z "$desc" ]; then if [ -z "$desc" ]; then
@ -434,7 +438,10 @@ printEdition() {
"winvista"* ) "winvista"* )
edition="Business" edition="Business"
;; ;;
"win2025"* | "win2022"* | "win2019"* | "win2016"* | "win2012"* | "win2008"* ) "win2025"* | "win2022"* | "win2019"* | "win2016"* )
edition="Standard"
;;
"win2012"* | "win2008"* | "win2003"* )
edition="Standard" edition="Standard"
;; ;;
esac esac
@ -510,6 +517,9 @@ fromFile() {
*"server2008"* | *"server_2008"* ) *"server2008"* | *"server_2008"* )
id="win2008r2" id="win2008r2"
;; ;;
*"server2003"* | *"server_2003"* )
id="win2003r2"
;;
esac esac
if [ -n "$id" ]; then if [ -n "$id" ]; then
@ -901,6 +911,11 @@ getLink2() {
sum="9c36fed4255bd05a8506b2da88f9aad73643395e155e609398aacd2b5276289c" sum="9c36fed4255bd05a8506b2da88f9aad73643395e155e609398aacd2b5276289c"
url="Windows%20Vista/en_windows_vista_with_sp2_x86_dvd_342266.iso" url="Windows%20Vista/en_windows_vista_with_sp2_x86_dvd_342266.iso"
;; ;;
"win2003r2" )
size=652367872
sum="74245cba888f935b138b106c2744bec7f392925b472358960a0b5643cd6abb32"
url="Windows%20Server%202003%20R2/en_win_srv_2003_r2_standard_x64_with_sp2_cd1_x13-05757.iso"
;;
"winxpx86" ) "winxpx86" )
size=617756672 size=617756672
sum="62b6c91563bad6cd12a352aa018627c314cfc5162d8e9f8af0756a642e602a46" sum="62b6c91563bad6cd12a352aa018627c314cfc5162d8e9f8af0756a642e602a46"
@ -1962,6 +1977,19 @@ migrateFiles() {
return 0 return 0
} }
skipVersion() {
local version="$1"
case "${version,,}" in
"win2003"* | "win2k"* | "winxp"* | "win9"* )
return 0
;;
esac
return 1
}
detectLegacy() { detectLegacy() {
local dir="$1" local dir="$1"
@ -2001,81 +2029,39 @@ detectLegacy() {
fi fi
if [ -f "$dir/CDROM_NT.5" ]; then if [ -f "$dir/CDROM_NT.5" ]; then
DETECTED="win2kx86" DETECTED="win2k"
desc=$(printEdition "$DETECTED" "Windows 2000") desc=$(printEdition "$DETECTED" "Windows 2000")
info "Detected: $desc" && return 0 info "Detected: $desc" && return 0
fi fi
if [ -f "$dir/WIN51AA" ] || [ -f "$dir/WIN51AD" ] || [ -f "$dir/WIN51AS" ] || [ -f "$dir/WIN51MA" ] || [ -f "$dir/WIN51MD" ]; then if [ -f "$dir/WIN51AA" ] || [ -f "$dir/WIN51AD" ] || [ -f "$dir/WIN51AS" ] || [ -f "$dir/WIN51MA" ] || [ -f "$dir/WIN51MD" ]; then
desc="Windows Server 2003" DETECTED="win2003r2"
info "Detected: $desc" && error "$desc is not supported yet!" && exit 54 desc=$(printEdition "$DETECTED" "Windows Server 2003")
info "Detected: $desc" && return 0
fi fi
if [ -f "$dir/WIN51IA" ] || [ -f "$dir/WIN51IB" ] || [ -f "$dir/WIN51ID" ] || [ -f "$dir/WIN51IL" ] || [ -f "$dir/WIN51IS" ]; then if [ -f "$dir/WIN51IA" ] || [ -f "$dir/WIN51IB" ] || [ -f "$dir/WIN51ID" ] || [ -f "$dir/WIN51IL" ] || [ -f "$dir/WIN51IS" ]; then
desc="Windows Server 2003" DETECTED="win2003r2"
info "Detected: $desc" && error "$desc is not supported yet!" && exit 54 desc=$(printEdition "$DETECTED" "Windows Server 2003")
info "Detected: $desc" && return 0
fi fi
return 1 return 1
} }
prepareLegacy() { prepareInstall() {
local iso="$1"
local dir="$2"
local file="$dir/boot.img"
ETFS=$(basename "$file")
[ -f "$file" ] && [ -s "$file" ] && return 0
rm -f "$file"
local len offset
len=$(isoinfo -d -i "$iso" | grep "Nsect " | grep -o "[^ ]*$")
offset=$(isoinfo -d -i "$iso" | grep "Bootoff " | grep -o "[^ ]*$")
dd "if=$iso" "of=$file" bs=2048 "count=$len" "skip=$offset" status=none && return 0
return 1
}
prepare9x() {
local iso="$1"
local dir="$2"
local file="$dir/boot.img"
ETFS=$(basename "$file")
[ -f "$file" ] && [ -s "$file" ] && return 0
rm -f "$file"
local src="[BOOT]/Boot-1.44M.img"
[ ! -f "$dir/$src" ] && error "Boot floppy not found!" && return 1
cp "$dir/$src" "$file" && return 0
return 1
}
prepare2k() {
local dir="$2" local dir="$2"
ETFS="[BOOT]/Boot-NoEmul.img" local desc="$3"
local arch="$4"
return 0 local key="$5"
} local driver="$6"
prepareXP() {
local dir="$2"
local arch="x86"
local target="$dir/I386"
local drivers="$TMP/drivers" local drivers="$TMP/drivers"
ETFS="[BOOT]/Boot-NoEmul.img" ETFS="[BOOT]/Boot-NoEmul.img"
if [ -d "$dir/AMD64" ]; then if [ ! -f "$dir/$ETFS" ] || [ ! -s "$dir/$ETFS" ]; then
arch="amd64" error "Failed to locate file \"$ETFS\" in $desc ISO image!" && return 1
target="$dir/AMD64"
fi fi
local msg="Adding drivers to image..." local msg="Adding drivers to image..."
@ -2084,20 +2070,23 @@ prepareXP() {
mkdir -p "$drivers" mkdir -p "$drivers"
if ! tar -xf /drivers.txz -C "$drivers" --warning=no-timestamp; then if ! tar -xf /drivers.txz -C "$drivers" --warning=no-timestamp; then
error "Failed to extract driver!" && return 1 error "Failed to extract drivers!" && return 1
fi fi
cp "$drivers/viostor/xp/$arch/viostor.sys" "$target" local target
[[ "${arch,,}" == "x86" ]] && target="$dir/I386" || target="$dir/AMD64"
cp "$drivers/viostor/$driver/$arch/viostor.sys" "$target"
mkdir -p "$dir/\$OEM\$/\$1/Drivers/viostor" mkdir -p "$dir/\$OEM\$/\$1/Drivers/viostor"
cp "$drivers/viostor/xp/$arch/viostor.cat" "$dir/\$OEM\$/\$1/Drivers/viostor" cp "$drivers/viostor/$driver/$arch/viostor.cat" "$dir/\$OEM\$/\$1/Drivers/viostor"
cp "$drivers/viostor/xp/$arch/viostor.inf" "$dir/\$OEM\$/\$1/Drivers/viostor" cp "$drivers/viostor/$driver/$arch/viostor.inf" "$dir/\$OEM\$/\$1/Drivers/viostor"
cp "$drivers/viostor/xp/$arch/viostor.sys" "$dir/\$OEM\$/\$1/Drivers/viostor" cp "$drivers/viostor/$driver/$arch/viostor.sys" "$dir/\$OEM\$/\$1/Drivers/viostor"
mkdir -p "$dir/\$OEM\$/\$1/Drivers/NetKVM" mkdir -p "$dir/\$OEM\$/\$1/Drivers/NetKVM"
cp "$drivers/NetKVM/xp/$arch/netkvm.cat" "$dir/\$OEM\$/\$1/Drivers/NetKVM" cp "$drivers/NetKVM/$driver/$arch/netkvm.cat" "$dir/\$OEM\$/\$1/Drivers/NetKVM"
cp "$drivers/NetKVM/xp/$arch/netkvm.inf" "$dir/\$OEM\$/\$1/Drivers/NetKVM" cp "$drivers/NetKVM/$driver/$arch/netkvm.inf" "$dir/\$OEM\$/\$1/Drivers/NetKVM"
cp "$drivers/NetKVM/xp/$arch/netkvm.sys" "$dir/\$OEM\$/\$1/Drivers/NetKVM" cp "$drivers/NetKVM/$driver/$arch/netkvm.sys" "$dir/\$OEM\$/\$1/Drivers/NetKVM"
if [ ! -f "$target/TXTSETUP.SIF" ]; then if [ ! -f "$target/TXTSETUP.SIF" ]; then
error "The file TXTSETUP.SIF could not be found!" && return 1 error "The file TXTSETUP.SIF could not be found!" && return 1
@ -2129,24 +2118,14 @@ prepareXP() {
rm -rf "$drivers" rm -rf "$drivers"
local key pid file setup local pid file setup
setup=$(find "$target" -maxdepth 1 -type f -iname setupp.ini | head -n 1) setup=$(find "$target" -maxdepth 1 -type f -iname setupp.ini | head -n 1)
pid=$(<"$setup") pid=$(<"$setup")
pid="${pid:(-4)}" pid="${pid:(-4)}"
pid="${pid:0:3}" pid="${pid:0:3}"
if [[ "$pid" == "270" ]]; then if [[ "$pid" == "270" ]]; then
warn "this version of Windows XP requires a volume license key (VLK), it will ask for one during installation." warn "this version of $desc requires a volume license key (VLK), it will ask for one during installation."
fi
if [[ "${arch,,}" == "x86" ]]; then
# Windows XP Professional x86 generic key (no activation, trial-only)
# This is not a pirated key, it comes from the official MS documentation.
key="DR8GV-C8V6J-BYXHG-7PYJR-DB66Y"
else
# Windows XP Professional x64 generic key (no activation, trial-only)
# This is not a pirated key, it comes from the official MS documentation.
key="B2RBK-7KPT9-4JP6X-QQFWM-PJD6G"
fi fi
local oem="" local oem=""
@ -2211,6 +2190,10 @@ prepareXP() {
echo " OrgName=\"Windows for Docker\"" echo " OrgName=\"Windows for Docker\""
echo " ProductKey=$key" echo " ProductKey=$key"
echo "" echo ""
echo "[LicenseFilePrintData]"
echo " AutoMode=PerServer"
echo " AutoUsers=5"
echo ""
echo "[Identification]" echo "[Identification]"
echo " JoinWorkgroup = WORKGROUP" echo " JoinWorkgroup = WORKGROUP"
echo "" echo ""
@ -2246,12 +2229,18 @@ prepareXP() {
echo "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]" echo "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]"
echo "\"LimitBlankPasswordUse\"=dword:00000000" echo "\"LimitBlankPasswordUse\"=dword:00000000"
echo "" echo ""
echo "[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\srvWiz]"
echo "@=dword:00000000"
echo ""
echo "[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Tour]" echo "[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Tour]"
echo "\"RunCount\"=dword:00000000" echo "\"RunCount\"=dword:00000000"
echo "" echo ""
echo "[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]" echo "[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]"
echo "\"HideFileExt\"=dword:00000000" echo "\"HideFileExt\"=dword:00000000"
echo "" echo ""
echo "[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ServerOOBE\SecurityOOBE]"
echo "\"DontLaunchSecurityOOBE\"=dword:00000000"
echo ""
echo "[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]" echo "[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]"
echo "\"DefaultUserName\"=\"$username\"" echo "\"DefaultUserName\"=\"$username\""
echo "\"DefaultDomainName\"=\"Dockur\"" echo "\"DefaultDomainName\"=\"Dockur\""
@ -2299,4 +2288,103 @@ prepareXP() {
return 0 return 0
} }
prepare2k3() {
local iso="$1"
local dir="$2"
local desc="$3"
local driver="2k3"
local arch key
[ -d "$dir/AMD64" ] && arch="amd64" || arch="x86"
if [[ "${arch,,}" == "x86" ]]; then
# Windows Server 2003 Standard x86 generic key (no activation, trial-only)
# This is not a pirated key, it comes from the official MS documentation.
key="QKDCQ-TP2JM-G4MDG-VR6F2-P9C48"
else
# Windows Server 2003 Standard x64 generic key (no activation, trial-only)
# This is not a pirated key, it comes from the official MS documentation.
key="P4WJG-WK3W7-3HM8W-RWHCK-8JTRY"
fi
! prepareInstall "$iso" "$dir" "$desc" "$arch" "$key" "$driver" && return 1
return 0
}
prepareXP() {
local iso="$1"
local dir="$2"
local desc="$3"
local driver="xp"
local arch key
[ -d "$dir/AMD64" ] && arch="amd64" || arch="x86"
if [[ "${arch,,}" == "x86" ]]; then
# Windows XP Professional x86 generic key (no activation, trial-only)
# This is not a pirated key, it comes from the official MS documentation.
key="DR8GV-C8V6J-BYXHG-7PYJR-DB66Y"
else
# Windows XP Professional x64 generic key (no activation, trial-only)
# This is not a pirated key, it comes from the official MS documentation.
key="B2RBK-7KPT9-4JP6X-QQFWM-PJD6G"
fi
! prepareInstall "$iso" "$dir" "$desc" "$arch" "$key" "$driver" && return 1
return 0
}
prepareLegacy() {
local iso="$1"
local dir="$2"
local desc="$3"
ETFS="boot.img"
[ -f "$dir/$ETFS" ] && [ -s "$dir/$ETFS" ] && return 0
rm -f "$dir/$ETFS"
local len offset
len=$(isoinfo -d -i "$iso" | grep "Nsect " | grep -o "[^ ]*$")
offset=$(isoinfo -d -i "$iso" | grep "Bootoff " | grep -o "[^ ]*$")
if ! dd "if=$iso" "of=$dir/$ETFS" bs=2048 "count=$len" "skip=$offset" status=none; then
error "Failed to extract boot image from $desc ISO!" && return 1
fi
[ -f "$dir/$ETFS" ] && [ -s "$dir/$ETFS" ] && return 0
error "Failed to locate file \"$ETFS\" in $desc ISO image!"
return 1
}
prepare9x() {
local dir="$2"
local desc="$3"
ETFS="[BOOT]/Boot-1.44M.img"
[ -f "$dir/$ETFS" ] && [ -s "$dir/$ETFS" ] && return 0
error "Failed to locate file \"$ETFS\" in $desc ISO image!"
return 1
}
prepare2k() {
local dir="$2"
local desc="$3"
ETFS="[BOOT]/Boot-NoEmul.img"
[ -f "$dir/$ETFS" ] && [ -s "$dir/$ETFS" ] && return 0
error "Failed to locate file \"$ETFS\" in $desc ISO image!"
return 1
}
return 0 return 0

View File

@ -489,19 +489,6 @@ setXML() {
return 0 return 0
} }
skipVersion() {
local version="$1"
case "${version,,}" in
"win2k"* | "winxp"* | "win9"* )
return 0
;;
esac
return 1
}
detectImage() { detectImage() {
local dir="$1" local dir="$1"
@ -588,17 +575,19 @@ prepareImage() {
local iso="$1" local iso="$1"
local dir="$2" local dir="$2"
local missing local desc missing
desc=$(printVersion "$DETECTED" "$DETECTED")
case "${DETECTED,,}" in case "${DETECTED,,}" in
"win9"* | "win2k"* ) "win9"* | "win2k"* )
MACHINE="pc-i440fx-2.4" ;; MACHINE="pc-i440fx-2.4" ;;
"winxp"* | "winvistax86"* | "win7x86"* ) "winvistax86"* | "win7x86"* | "winxp"* | "win2003"* )
MACHINE="pc-q35-2.10" ;; MACHINE="pc-q35-2.10" ;;
esac esac
case "${DETECTED,,}" in case "${DETECTED,,}" in
"win9"* | "winxp"* | "win2k"* ) "win9"* | "win2k"* | "winxp"* | "win2003"* )
HV="N" HV="N"
BOOT_MODE="windows_legacy" ;; BOOT_MODE="windows_legacy" ;;
"winvista"* | "win7"* | "win2008"* ) "winvista"* | "win7"* | "win2008"* )
@ -606,18 +595,22 @@ prepareImage() {
esac esac
case "${DETECTED,,}" in case "${DETECTED,,}" in
"winxp"* )
DISK_TYPE="blk"
prepareXP "$iso" "$dir" && return 0
error "Failed to prepare Windows XP ISO!" && return 1 ;;
"win9"* ) "win9"* )
DISK_TYPE="auto" DISK_TYPE="auto"
prepare9x "$iso" "$dir" && return 0 prepare9x "$iso" "$dir" "$desc" && return 0
error "Failed to prepare Windows 9x ISO!" && return 1 ;; error "Failed to prepare $desc ISO!" && return 1 ;;
"win2k"* ) "win2k"* )
DISK_TYPE="auto" DISK_TYPE="auto"
prepare2k "$iso" "$dir" && return 0 prepare2k "$iso" "$dir" "$desc" && return 0
error "Failed to prepare Windows 2000 ISO!" && return 1 ;; error "Failed to prepare $desc ISO!" && return 1 ;;
"winxp"* )
DISK_TYPE="blk"
prepareXP "$iso" "$dir" "$desc" && return 0
error "Failed to prepare $desc ISO!" && return 1 ;;
"win2003"* )
DISK_TYPE="blk"
prepare2k3 "$iso" "$dir" "$desc" && return 0
error "Failed to prepare $desc ISO!" && return 1 ;;
esac esac
if [[ "${BOOT_MODE,,}" != "windows_legacy" ]]; then if [[ "${BOOT_MODE,,}" != "windows_legacy" ]]; then
@ -627,13 +620,13 @@ prepareImage() {
missing=$(basename "$dir/$EFISYS") missing=$(basename "$dir/$EFISYS")
[ ! -f "$dir/$ETFS" ] && missing=$(basename "$dir/$ETFS") [ ! -f "$dir/$ETFS" ] && missing=$(basename "$dir/$ETFS")
error "failed to locate file '${missing,,}' in ISO image!" error "Failed to locate file \"${missing,,}\" in $desc ISO image!"
return 1 return 1
fi fi
prepareLegacy "$iso" "$dir" && return 0 prepareLegacy "$iso" "$dir" "$desc" && return 0
error "Failed to extract boot image from ISO!" error "Failed to extract boot image from $desc ISO image!"
return 1 return 1
} }
@ -934,6 +927,10 @@ buildImage() {
error "File $BOOT does already exist?!" && return 1 error "File $BOOT does already exist?!" && return 1
fi fi
if [ ! -f "$dir/$ETFS" ]; then
error "Failed to locate file \"$ETFS\" in ISO image!" && return 1
fi
base=$(basename "$BOOT") base=$(basename "$BOOT")
local out="$TMP/${base%.*}.tmp" local out="$TMP/${base%.*}.tmp"
rm -f "$out" rm -f "$out"
@ -962,7 +959,7 @@ buildImage() {
else else
case "${DETECTED,,}" in case "${DETECTED,,}" in
"win2k"* | "winxp"* ) "win2k"* | "winxp"* | "win2003"* )
! genisoimage -o "$out" -b "$ETFS" -no-emul-boot -boot-load-seg 1984 -boot-load-size 4 -c "$cat" -iso-level 2 -J -l -D -N -joliet-long \ ! genisoimage -o "$out" -b "$ETFS" -no-emul-boot -boot-load-seg 1984 -boot-load-size 4 -c "$cat" -iso-level 2 -J -l -D -N -joliet-long \
-relaxed-filenames -V "${LABEL::30}" -quiet "$dir" 2> "$log" && failed="y" ;; -relaxed-filenames -V "${LABEL::30}" -quiet "$dir" 2> "$log" && failed="y" ;;
"win9"* ) "win9"* )