fix: Hide long mode from 32-bit Windows guests (#2178)

This commit is contained in:
Kroese
2026-08-22 00:07:19 +02:00
committed by GitHub
parent afa55b476c
commit 2fe4645685
4 changed files with 73 additions and 54 deletions
+54 -14
View File
@@ -573,6 +573,8 @@ patchWin9xSetupFiles() {
return 1
fi
patchWin9xLooseSetupFiles "$id" "$target" "$desc" "$patcher" || return 1
if [[ "${id,,}" == "win9x"* ]]; then
patchWinMeBaseComponents "$target" "$desc" || return 1
fi
@@ -600,6 +602,51 @@ patchWin9xSetupFiles() {
return 0
}
patchWin9xLooseSetupFiles() {
local id="$1"
local target="$2"
local desc="$3"
local patcher="$4"
local patches="tlb,speed,mem,g4resfix"
local name file patch_output
local -a list=()
[[ "${id,,}" == "win9x"* ]] && patches="default"
# Patcher9x scans the setup CABs in installation-media mode, while Windows
# Setup gives loose files in the setup directory precedence over CAB copies.
# Patch every loose file Patcher9x documents as a possible replacement so a
# media-specific override cannot bypass the already-patched cabinet version.
for name in \
VMM32.VXD \
VMM.VXD \
NTKERN.VXD \
IOS.VXD \
ESDI_506.PDR \
SCSIPORT.PDR \
NDIS.VXD \
NDIS.386 \
VCACHE.VXD \
WIN.COM \
WIN.CNF; do
file=$(find "$target" -maxdepth 1 -type f -iname "$name" -print -quit) || return 1
[ -n "$file" ] && list+=("$file")
done
(( ${#list[@]} == 0 )) && return 0
if ! patch_output=$("$patcher" --patch "$patches" "${list[@]}" 2>&1); then
[ -z "$patch_output" ] || printf '%s\n' "$patch_output" >&2
error "Failed to patch loose $desc setup files!"
return 1
fi
return 0
}
stageWin95AC97Driver() {
local dir="$1"
@@ -1976,6 +2023,7 @@ writeWin9xAnswerFile() {
local firstLogonUpdateInis="Win9x.OnlineServicesFolder"
local copyFiles="" post="" hide="" installDelReg=""
local culture region keyboard localeID keyboardID
local phys="10000" # 256 MB
if [[ "${id,,}" == "win9x"* ]]; then
addReg="${addReg%,Win9x.ActiveSetup},WinMe.ActiveSetup"
@@ -2100,8 +2148,7 @@ writeWin9xAnswerFile() {
'[Install]' \
"CopyFiles=$copyFiles" \
"UpdateInis=$updateInis" \
"AddReg=$addReg" \
'BitReg=Win9x.DisableAnimationsDefault'
"AddReg=$addReg"
if [ -n "$installDelReg" ]; then
printf '%s\n' "DelReg=$installDelReg"
@@ -2190,8 +2237,7 @@ writeWin9xAnswerFile() {
printf '%s\n' \
'' \
'[Win9x.FirstLogon]' \
"AddReg=$firstLogonAddReg" \
'BitReg=Win9x.DisableAnimations'
"AddReg=$firstLogonAddReg"
if [ -n "$firstLogonDelReg" ]; then
printf '%s\n' "DelReg=$firstLogonDelReg"
@@ -2374,8 +2420,7 @@ writeWin9xAnswerFile() {
printf '%s\n' \
'' \
'[Win9x.SystemIni]' \
'%10%\system.ini,386Enh,,"MaxPhysPage=100000"' \
'%10%\system.ini,vcache,,"MaxFileCache=65536"'
"%10%\system.ini,386Enh,,\"MaxPhysPage=$phys\""
if ! disabled "$AUTOLOGIN"; then
printf '%s\n' '%10%\system.ini,"Password Lists",,"DOCKER=C:\WINDOWS\DOCKER.PWL"'
@@ -2384,7 +2429,7 @@ writeWin9xAnswerFile() {
printf '%s\n' \
'' \
'[Win9x.SystemCb]' \
'%10%\system.cb,386Enh,,"MaxPhysPage=100000"' \
"%10%\system.cb,386Enh,,\"MaxPhysPage=$phys\"" \
'' \
'[Setup]' \
'Express=1' \
@@ -2483,6 +2528,7 @@ writeWin9xUserRegistry() {
'HKU,".DEFAULT\Control Panel\Desktop","ScreenSaveActive",,"0"' \
'HKU,".DEFAULT\Control Panel\Desktop","DragFullWindows",,"1"' \
'HKU,".DEFAULT\Control Panel\Desktop","MenuShowDelay",,"0"' \
'HKU,".DEFAULT\Control Panel\Desktop","UserPreferenceMask",1,9c,32,07,80' \
'HKU,".DEFAULT\Control Panel\Desktop","FontSmoothing",,"1"' \
'HKU,".DEFAULT\Control Panel\Desktop","SmoothScroll",0x00010001,0' \
'HKU,".DEFAULT\Control Panel\Desktop\WindowMetrics","MinAnimate",,"0"' \
@@ -2509,6 +2555,7 @@ writeWin9xUserRegistry() {
'HKCU,"Control Panel\Desktop","ScreenSaveActive",,"0"' \
'HKCU,"Control Panel\Desktop","DragFullWindows",,"1"' \
'HKCU,"Control Panel\Desktop","MenuShowDelay",,"0"' \
'HKCU,"Control Panel\Desktop","UserPreferenceMask",1,9c,32,07,80' \
'HKCU,"Control Panel\Desktop","FontSmoothing",,"1"' \
'HKCU,"Control Panel\Desktop","SmoothScroll",0x00010001,0' \
'HKCU,"Control Panel\Desktop\WindowMetrics","MinAnimate",,"0"' \
@@ -2528,13 +2575,6 @@ writeWin9xUserRegistry() {
fi
fi
printf '%s\n' \
'' \
'[Win9x.DisableAnimationsDefault]' \
'HKU,".DEFAULT\Control Panel\Desktop","UserPreferencesMask",0,0x02,0' \
'' \
'[Win9x.DisableAnimations]' \
'HKCU,"Control Panel\Desktop","UserPreferencesMask",0,0x02,0'
}
writeWin9xMachineRegistry() {
+5 -7
View File
@@ -356,12 +356,9 @@ getImageSize() {
getArchiveSize() {
local file="$1"
local result_name="$2"
local -n result="$result_name"
local found=0 listing line value rc
result=0
local found=0 result=0
local listing line value rc
listing=$(7z l -slt "$file" 2>/dev/null) || {
rc=$?
@@ -386,6 +383,7 @@ getArchiveSize() {
return 1
fi
printf '%s\n' "$result"
return 0
}
@@ -437,7 +435,7 @@ extractImage() {
return 1
fi
getArchiveSize "$iso" archiveSize || return
archiveSize=$(getArchiveSize "$iso") || return
required=$((archiveSize + (archiveSize + 99) / 100))
checkFreeSpace "$target" "$required" || return 1
@@ -554,7 +552,7 @@ getPlatform() {
local xml="$1"
local arch current platform=""
local arch count current platform=""
local image_count output records
local separator=$'\x1f'
+5 -2
View File
@@ -87,12 +87,15 @@ setMachine() {
case "${id,,}" in
"win9"* | "winnt4" | "win2k"* | *"x86"* | "reactos" )
"win9"* | "winnt4" | "win2k"* | *"x86"* )
# Legacy 32-bit Windows may enter an incompatible PAE/DEP path when the
# NX flag is exposed, causing installation failures or repeated resets.
#
# Long mode is unusable by 32-bit guests and may cause the firmware to
# allocate PCI resources above 4 GB, which older systems may not handle.
writeState "flag" "nx=off" || return 1 ;;
writeState "flag" "nx=off,lm=off" || return 1 ;;
esac
+9 -31
View File
@@ -163,7 +163,6 @@ SIFInstall() {
writeRegistry "$dir" "$shortcut" "$oem" "$regUsername" "$regPassword" "$driver" || return 1
appendRegistry "$dir" "$driver" || return 1
writeNT5Effects "$dir" || return 1
writeVBS "$dir" "$username" "$shortcut" "$driver" || return 1
return 0
@@ -941,7 +940,15 @@ appendRegistry() {
'"SCRNSAVE.EXE"="off"' \
'"ScreenSaveActive"="0"' \
'"DragFullWindows"="1"' \
'"MenuShowDelay"="0"' \
'"MenuShowDelay"="0"'
if [[ "$driver" == "2k" ]]; then
printf '%s\n' '"UserPreferencesMask"=hex:9c,32,00,80'
else
printf '%s\n' '"UserPreferencesMask"=hex:9c,32,07,80'
fi
printf '%s\n' \
'' \
'[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics]' \
'"MinAnimate"="0"' \
@@ -1001,34 +1008,6 @@ appendRegistry() {
return 0
}
writeNT5Effects() {
local dir="$1"
local target="$dir/\$OEM\$/effects.inf"
{
printf '%s\n' \
'[Version]' \
"Signature=\"\$CHICAGO\$\"" \
'' \
'[DefaultInstall]' \
'BitReg=DisableAnimations' \
'' \
'[DisableAnimations]' \
'; Fade or slide menus into view' \
'HKCU,"Control Panel\Desktop","UserPreferencesMask",0,0x02,0' \
'' \
'; Fade out menu items after clicking' \
'HKCU,"Control Panel\Desktop","UserPreferencesMask",0,0x04,1' \
'' \
'; Fade or slide ToolTips into view' \
'HKCU,"Control Panel\Desktop","UserPreferencesMask",0,0x08,1' \
''
} | unix2dos > "$target" || return 1
return 0
}
writeVBS() {
local dir="$1"
@@ -1128,7 +1107,6 @@ writeVBS() {
printf '%s\n' \
'[COMMANDS]' \
'"REGEDIT /s install.reg"' \
'"RUNDLL32.EXE setupapi.dll,InstallHinfSection DefaultInstall 128 effects.inf"' \
'"Wscript install.vbs"' \
''
} | unix2dos > "$dir/\$OEM\$/cmdlines.txt" || return 1