diff --git a/Dockerfile b/Dockerfile
index ebc1805..486cc88 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -14,6 +14,7 @@ RUN set -eu && \
7zip \
wsdd \
samba \
+ xz-utils \
wimtools \
dos2unix \
cabextract \
@@ -27,7 +28,7 @@ COPY --chmod=755 ./src /run/
COPY --chmod=755 ./assets /run/assets
ADD --chmod=755 https://raw.githubusercontent.com/christgau/wsdd/v0.8/src/wsdd.py /usr/sbin/wsdd
-ADD --chmod=664 https://github.com/qemus/virtiso-arm/releases/download/v0.1.248/virtio-win-0.1.248.iso /run/drivers.iso
+ADD --chmod=664 https://github.com/qemus/virtiso-arm/releases/download/v0.1.248/virtio-win-0.1.248.tar.xz /drivers.txz
EXPOSE 8006 3389
VOLUME /storage
diff --git a/assets/win10arm64-enterprise.xml b/assets/win10arm64-enterprise.xml
new file mode 100644
index 0000000..64e4fda
--- /dev/null
+++ b/assets/win10arm64-enterprise.xml
@@ -0,0 +1,427 @@
+
+
+
+
+
+ en-US
+
+ 0409:00000409
+ en-US
+ en-US
+ en-US
+
+
+
+
+ 0
+ true
+
+
+
+ 1
+ EFI
+ 128
+
+
+
+ 2
+ MSR
+ 128
+
+
+
+ 3
+ Primary
+ true
+
+
+
+
+
+ 1
+ 1
+
+ FAT32
+
+
+
+ 2
+ 2
+
+
+
+ 3
+ 3
+
+ C
+ NTFS
+
+
+
+
+
+
+
+ 0
+ 3
+
+ false
+
+
+
+ true
+ Never
+
+
+ false
+ Never
+
+
+ true
+ Docker
+ Windows for Docker
+
+ NPPR9-FWDCX-D2C8J-H872K-2YT43
+
+
+ false
+
+ false
+
+
+
+
+
+ false
+
+
+
+
+ true
+
+
+ 1
+
+
+
+
+ true
+
+
+ *
+
+ Dockur
+ Windows for Docker
+ 24/7
+
+ Dockur
+ https://github.com/dockur/windows-arm/issues
+
+ Windows for Docker
+
+
+ 1
+
+
+ true
+ true
+ https://google.com
+ about:blank
+
+
+ true
+ true
+ https://google.com
+ about:blank
+
+
+ 0
+
+
+ 1
+
+
+ 0409:00000409
+ en-US
+ en-US
+ en-US
+
+
+
+
+ 1
+ reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v BypassNRO /t REG_DWORD /d 1 /f
+
+
+ 2
+ reg.exe load "HKU\mount" "C:\Users\Default\NTUSER.DAT"
+
+
+ 3
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "ContentDeliveryAllowed" /t REG_DWORD /d 0 /f
+
+
+ 4
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "FeatureManagementEnabled" /t REG_DWORD /d 0 /f
+
+
+ 5
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "OEMPreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 6
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 7
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEverEnabled" /t REG_DWORD /d 0 /f
+
+
+ 8
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SilentInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 9
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SoftLandingEnabled" /t REG_DWORD /d 0 /f
+
+
+ 10
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContentEnabled" /t REG_DWORD /d 0 /f
+
+
+ 11
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-310093Enabled" /t REG_DWORD /d 0 /f
+
+
+ 12
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338387Enabled" /t REG_DWORD /d 0 /f
+
+
+ 13
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338388Enabled" /t REG_DWORD /d 0 /f
+
+
+ 14
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338389Enabled" /t REG_DWORD /d 0 /f
+
+
+ 15
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338393Enabled" /t REG_DWORD /d 0 /f
+
+
+ 16
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-353698Enabled" /t REG_DWORD /d 0 /f
+
+
+ 17
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SystemPaneSuggestionsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 18
+ reg.exe add "HKU\mount\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableCloudOptimizedContent" /t REG_DWORD /d 1 /f
+
+
+ 19
+ reg.exe add "HKU\mount\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 1 /f
+
+
+ 20
+ reg.exe add "HKU\mount\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableConsumerAccountStateContent" /t REG_DWORD /d 1 /f
+
+
+ 21
+ reg.exe unload "HKU\mount"
+
+
+ 22
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableCloudOptimizedContent" /t REG_DWORD /d 1 /f
+
+
+ 23
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 1 /f
+
+
+ 24
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableConsumerAccountStateContent" /t REG_DWORD /d 1 /f
+
+
+ 25
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f
+ Set Network Location to Home
+
+
+
+
+ false
+
+
+ 0
+
+
+
+
+ true
+ all
+ @FirewallAPI.dll,-28752
+
+
+
+
+
+
+
+
+ true
+
+
+ 1
+
+
+
+
+
+ Docker
+ Administrators
+
+
+ true
+
+
+
+
+ password
+ true
+
+
+
+ Docker
+ true
+ 65432
+
+
+ true
+
+
+
+ 32
+ 1920
+ 1080
+
+
+ true
+ true
+ true
+ true
+ true
+ Home
+ 3
+ true
+ true
+
+ Dockur
+ Windows for Docker
+
+
+ 1
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f
+ Allow guest access to network shares
+
+
+ 2
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f
+ Allow RDP login with blank password
+
+
+ 3
+ reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f
+ Enable option for passwordless sign-in
+
+
+ 4
+ cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
+ Password Never Expires
+
+
+ 5
+ cmd /C POWERCFG -H OFF
+ Disable Hibernation
+
+
+ 6
+ cmd /C POWERCFG -X -monitor-timeout-ac 0
+ Disable monitor blanking
+
+
+ 7
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Edge" /v "HideFirstRunExperience" /t REG_DWORD /d 1 /f
+ Disable first-run experience in Edge
+
+
+ 8
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f
+ Show file extensions in Explorer
+
+
+ 9
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f
+ Zero Hibernation File
+
+
+ 10
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f
+ Disable Hibernation
+
+
+ 11
+ cmd /C POWERCFG -X -standby-timeout-ac 0
+ Disable Sleep
+
+
+ 12
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f
+ Enable RemoteAPP to launch unlisted programs
+
+
+ 13
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f
+ Remove Search from the Taskbar
+
+
+ 14
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f
+ Remove Task View from the Taskbar
+
+
+ 15
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f
+ Remove Widgets from the Taskbar
+
+
+ 16
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f
+ Remove Chat from the Taskbar
+
+
+ 17
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f
+ Turn off Windows Update auto download
+
+
+ 18
+ netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes
+ Enable Network Discovery
+
+
+ 19
+ netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes
+ Enable File Sharing
+
+
+ 20
+ cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat"
+ Execute custom script from the OEM folder if exists
+
+
+
+
+
diff --git a/assets/win10arm64-ltsc.xml b/assets/win10arm64-ltsc.xml
new file mode 100644
index 0000000..9088e2d
--- /dev/null
+++ b/assets/win10arm64-ltsc.xml
@@ -0,0 +1,430 @@
+
+
+
+
+
+ en-US
+
+ 0409:00000409
+ en-US
+ en-US
+ en-US
+
+
+
+
+ 0
+ true
+
+
+
+ 1
+ EFI
+ 128
+
+
+
+ 2
+ MSR
+ 128
+
+
+
+ 3
+ Primary
+ true
+
+
+
+
+
+ 1
+ 1
+
+ FAT32
+
+
+
+ 2
+ 2
+
+
+
+ 3
+ 3
+
+ C
+ NTFS
+
+
+
+
+
+
+
+
+ /image/index
+ 1
+
+
+
+ 0
+ 3
+
+ false
+
+
+
+ true
+ Never
+
+
+ false
+ Never
+
+
+ true
+ Docker
+ Windows for Docker
+
+ false
+
+ false
+
+
+
+
+
+ false
+
+
+
+
+ true
+
+
+ 1
+
+
+
+
+ true
+
+
+ *
+
+ Dockur
+ Windows for Docker
+ 24/7
+
+ Dockur
+ https://github.com/dockur/windows-arm/issues
+
+ Windows for Docker
+
+
+ 1
+
+
+ true
+ true
+ https://google.com
+ about:blank
+
+
+ true
+ true
+ https://google.com
+ about:blank
+
+
+ 0
+
+
+ 1
+
+
+ 0409:00000409
+ en-US
+ en-US
+ en-US
+
+
+
+
+ 1
+ reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v BypassNRO /t REG_DWORD /d 1 /f
+
+
+ 2
+ reg.exe load "HKU\mount" "C:\Users\Default\NTUSER.DAT"
+
+
+ 3
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "ContentDeliveryAllowed" /t REG_DWORD /d 0 /f
+
+
+ 4
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "FeatureManagementEnabled" /t REG_DWORD /d 0 /f
+
+
+ 5
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "OEMPreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 6
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 7
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEverEnabled" /t REG_DWORD /d 0 /f
+
+
+ 8
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SilentInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 9
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SoftLandingEnabled" /t REG_DWORD /d 0 /f
+
+
+ 10
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContentEnabled" /t REG_DWORD /d 0 /f
+
+
+ 11
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-310093Enabled" /t REG_DWORD /d 0 /f
+
+
+ 12
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338387Enabled" /t REG_DWORD /d 0 /f
+
+
+ 13
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338388Enabled" /t REG_DWORD /d 0 /f
+
+
+ 14
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338389Enabled" /t REG_DWORD /d 0 /f
+
+
+ 15
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338393Enabled" /t REG_DWORD /d 0 /f
+
+
+ 16
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-353698Enabled" /t REG_DWORD /d 0 /f
+
+
+ 17
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SystemPaneSuggestionsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 18
+ reg.exe add "HKU\mount\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableCloudOptimizedContent" /t REG_DWORD /d 1 /f
+
+
+ 19
+ reg.exe add "HKU\mount\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 1 /f
+
+
+ 20
+ reg.exe add "HKU\mount\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableConsumerAccountStateContent" /t REG_DWORD /d 1 /f
+
+
+ 21
+ reg.exe unload "HKU\mount"
+
+
+ 22
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableCloudOptimizedContent" /t REG_DWORD /d 1 /f
+
+
+ 23
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 1 /f
+
+
+ 24
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableConsumerAccountStateContent" /t REG_DWORD /d 1 /f
+
+
+ 25
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f
+ Set Network Location to Home
+
+
+
+
+ false
+
+
+ 0
+
+
+
+
+ true
+ all
+ @FirewallAPI.dll,-28752
+
+
+
+
+
+
+
+
+ true
+
+
+ 1
+
+
+
+
+
+ Docker
+ Administrators
+
+
+ true
+
+
+
+
+ password
+ true
+
+
+
+ Docker
+ true
+ 65432
+
+
+ true
+
+
+
+ 32
+ 1920
+ 1080
+
+
+ true
+ true
+ true
+ true
+ true
+ Home
+ 3
+ true
+ true
+
+ Dockur
+ Windows for Docker
+
+
+ 1
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f
+ Allow guest access to network shares
+
+
+ 2
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f
+ Allow RDP login with blank password
+
+
+ 3
+ reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f
+ Enable option for passwordless sign-in
+
+
+ 4
+ cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
+ Password Never Expires
+
+
+ 5
+ cmd /C POWERCFG -H OFF
+ Disable Hibernation
+
+
+ 6
+ cmd /C POWERCFG -X -monitor-timeout-ac 0
+ Disable monitor blanking
+
+
+ 7
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Edge" /v "HideFirstRunExperience" /t REG_DWORD /d 1 /f
+ Disable first-run experience in Edge
+
+
+ 8
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f
+ Show file extensions in Explorer
+
+
+ 9
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f
+ Zero Hibernation File
+
+
+ 10
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f
+ Disable Hibernation
+
+
+ 11
+ cmd /C POWERCFG -X -standby-timeout-ac 0
+ Disable Sleep
+
+
+ 12
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f
+ Enable RemoteAPP to launch unlisted programs
+
+
+ 13
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f
+ Remove Search from the Taskbar
+
+
+ 14
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f
+ Remove Task View from the Taskbar
+
+
+ 15
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f
+ Remove Widgets from the Taskbar
+
+
+ 16
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f
+ Remove Chat from the Taskbar
+
+
+ 17
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f
+ Turn off Windows Update auto download
+
+
+ 18
+ netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes
+ Enable Network Discovery
+
+
+ 19
+ netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes
+ Enable File Sharing
+
+
+ 20
+ cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat"
+ Execute custom script from the OEM folder if exists
+
+
+
+
+
diff --git a/assets/win11arm64-enterprise.xml b/assets/win11arm64-enterprise.xml
new file mode 100644
index 0000000..69cbfab
--- /dev/null
+++ b/assets/win11arm64-enterprise.xml
@@ -0,0 +1,451 @@
+
+
+
+
+
+ en-US
+
+ 0409:00000409
+ en-US
+ en-US
+ en-US
+
+
+
+
+ 0
+ true
+
+
+
+ 1
+ EFI
+ 128
+
+
+
+ 2
+ MSR
+ 128
+
+
+
+ 3
+ Primary
+ true
+
+
+
+
+
+ 1
+ 1
+
+ FAT32
+
+
+
+ 2
+ 2
+
+
+
+ 3
+ 3
+
+ C
+ NTFS
+
+
+
+
+
+
+
+ 0
+ 3
+
+ false
+
+
+
+ true
+ Never
+
+
+ false
+ Never
+
+
+ true
+ Docker
+ Windows for Docker
+
+ NPPR9-FWDCX-D2C8J-H872K-2YT43
+ OnError
+
+
+ false
+
+ false
+
+
+
+ 1
+ reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassTPMCheck /t REG_DWORD /d 1 /f
+
+
+ 2
+ reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassSecureBootCheck /t REG_DWORD /d 1 /f
+
+
+ 3
+ reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassRAMCheck /t REG_DWORD /d 1 /f
+
+
+ 4
+ reg.exe add "HKLM\SYSTEM\Setup\MoSetup" /v AllowUpgradesWithUnsupportedTPMOrCPU /t REG_DWORD /d 1 /f
+
+
+
+
+
+
+ false
+
+
+
+
+ true
+
+
+ 1
+
+
+
+
+ true
+
+
+ *
+
+ Dockur
+ Windows for Docker
+ 24/7
+
+ Dockur
+ https://github.com/dockur/windows-arm/issues
+
+ Windows for Docker
+
+
+ 1
+
+
+ true
+ true
+ https://google.com
+ about:blank
+
+
+ true
+ true
+ https://google.com
+ about:blank
+
+
+ 0
+
+
+ 1
+
+
+ 0409:00000409
+ en-US
+ en-US
+ en-US
+
+
+
+
+ 1
+ reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v BypassNRO /t REG_DWORD /d 1 /f
+
+
+ 2
+ reg.exe load "HKU\mount" "C:\Users\Default\NTUSER.DAT"
+
+
+ 3
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "ContentDeliveryAllowed" /t REG_DWORD /d 0 /f
+
+
+ 4
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "FeatureManagementEnabled" /t REG_DWORD /d 0 /f
+
+
+ 5
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "OEMPreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 6
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 7
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEverEnabled" /t REG_DWORD /d 0 /f
+
+
+ 8
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SilentInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 9
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SoftLandingEnabled" /t REG_DWORD /d 0 /f
+
+
+ 10
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContentEnabled" /t REG_DWORD /d 0 /f
+
+
+ 11
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-310093Enabled" /t REG_DWORD /d 0 /f
+
+
+ 12
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338387Enabled" /t REG_DWORD /d 0 /f
+
+
+ 13
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338388Enabled" /t REG_DWORD /d 0 /f
+
+
+ 14
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338389Enabled" /t REG_DWORD /d 0 /f
+
+
+ 15
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338393Enabled" /t REG_DWORD /d 0 /f
+
+
+ 16
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-353698Enabled" /t REG_DWORD /d 0 /f
+
+
+ 17
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SystemPaneSuggestionsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 18
+ reg.exe add "HKU\mount\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableCloudOptimizedContent" /t REG_DWORD /d 1 /f
+
+
+ 19
+ reg.exe add "HKU\mount\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 1 /f
+
+
+ 20
+ reg.exe add "HKU\mount\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableConsumerAccountStateContent" /t REG_DWORD /d 1 /f
+
+
+ 21
+ reg.exe unload "HKU\mount"
+
+
+ 22
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableCloudOptimizedContent" /t REG_DWORD /d 1 /f
+
+
+ 23
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 1 /f
+
+
+ 24
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableConsumerAccountStateContent" /t REG_DWORD /d 1 /f
+
+
+ 25
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f
+ Set Network Location to Home
+
+
+
+
+ false
+
+
+ 0
+
+
+
+
+ true
+ all
+ @FirewallAPI.dll,-28752
+
+
+
+
+
+
+
+
+ true
+
+
+ 1
+
+
+
+
+
+ Docker
+ Administrators
+
+
+ true
+
+
+
+
+ password
+ true
+
+
+
+ Docker
+ true
+ 65432
+
+
+ true
+
+
+
+ 32
+ 1920
+ 1080
+
+
+ true
+ true
+ true
+ true
+ true
+ Home
+ 3
+ true
+ true
+
+ Dockur
+ Windows for Docker
+
+
+ 1
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f
+ Allow guest access to network shares
+
+
+ 2
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f
+ Allow RDP login with blank password
+
+
+ 3
+ reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f
+ Enable option for passwordless sign-in
+
+
+ 4
+ cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
+ Password Never Expires
+
+
+ 5
+ cmd /C POWERCFG -H OFF
+ Disable Hibernation
+
+
+ 6
+ cmd /C POWERCFG -X -monitor-timeout-ac 0
+ Disable monitor blanking
+
+
+ 7
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Edge" /v "HideFirstRunExperience" /t REG_DWORD /d 1 /f
+ Disable first-run experience in Edge
+
+
+ 8
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f
+ Show file extensions in Explorer
+
+
+ 9
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f
+ Zero Hibernation File
+
+
+ 10
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f
+ Disable Hibernation
+
+
+ 11
+ cmd /C POWERCFG -X -standby-timeout-ac 0
+ Disable Sleep
+
+
+ 12
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f
+ Enable RemoteAPP to launch unlisted programs
+
+
+ 13
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f
+ Remove Task View from the Taskbar
+
+
+ 14
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f
+ Remove Widgets from the Taskbar
+
+
+ 15
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f
+ Remove Chat from the Taskbar
+
+
+ 16
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f
+ Turn off Windows Update auto download
+
+
+ 17
+ netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes
+ Enable Network Discovery
+
+
+ 18
+ netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes
+ Enable File Sharing
+
+
+ 19
+ reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV1 /d 0 /t REG_DWORD /f
+ Disable unsupported hardware notifications
+
+
+ 20
+ reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV2 /d 0 /t REG_DWORD /f
+ Disable unsupported hardware notifications
+
+
+ 21
+ cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat"
+ Execute custom script from the OEM folder if exists
+
+
+
+
+
diff --git a/assets/win11arm64-ltsc.xml b/assets/win11arm64-ltsc.xml
new file mode 100644
index 0000000..f429e7b
--- /dev/null
+++ b/assets/win11arm64-ltsc.xml
@@ -0,0 +1,453 @@
+
+
+
+
+
+ en-US
+
+ 0409:00000409
+ en-US
+ en-US
+ en-US
+
+
+
+
+ 0
+ true
+
+
+
+ 1
+ EFI
+ 128
+
+
+
+ 2
+ MSR
+ 128
+
+
+
+ 3
+ Primary
+ true
+
+
+
+
+
+ 1
+ 1
+
+ FAT32
+
+
+
+ 2
+ 2
+
+
+
+ 3
+ 3
+
+ C
+ NTFS
+
+
+
+
+
+
+
+
+ /image/index
+ 1
+
+
+
+ 0
+ 3
+
+ false
+
+
+
+ true
+ Never
+
+
+ false
+ Never
+
+
+ true
+ Docker
+ Windows for Docker
+
+ false
+
+ false
+
+
+
+ 1
+ reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassTPMCheck /t REG_DWORD /d 1 /f
+
+
+ 2
+ reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassSecureBootCheck /t REG_DWORD /d 1 /f
+
+
+ 3
+ reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassRAMCheck /t REG_DWORD /d 1 /f
+
+
+ 4
+ reg.exe add "HKLM\SYSTEM\Setup\MoSetup" /v AllowUpgradesWithUnsupportedTPMOrCPU /t REG_DWORD /d 1 /f
+
+
+
+
+
+
+ false
+
+
+
+
+ true
+
+
+ 1
+
+
+
+
+ true
+
+
+ *
+
+ Dockur
+ Windows for Docker
+ 24/7
+
+ Dockur
+ https://github.com/dockur/windows-arm/issues
+
+ Windows for Docker
+
+
+ 1
+
+
+ true
+ true
+ https://google.com
+ about:blank
+
+
+ true
+ true
+ https://google.com
+ about:blank
+
+
+ 0
+
+
+ 1
+
+
+ 0409:00000409
+ en-US
+ en-US
+ en-US
+
+
+
+
+ 1
+ reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v BypassNRO /t REG_DWORD /d 1 /f
+
+
+ 2
+ reg.exe load "HKU\mount" "C:\Users\Default\NTUSER.DAT"
+
+
+ 3
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "ContentDeliveryAllowed" /t REG_DWORD /d 0 /f
+
+
+ 4
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "FeatureManagementEnabled" /t REG_DWORD /d 0 /f
+
+
+ 5
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "OEMPreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 6
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 7
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEverEnabled" /t REG_DWORD /d 0 /f
+
+
+ 8
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SilentInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 9
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SoftLandingEnabled" /t REG_DWORD /d 0 /f
+
+
+ 10
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContentEnabled" /t REG_DWORD /d 0 /f
+
+
+ 11
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-310093Enabled" /t REG_DWORD /d 0 /f
+
+
+ 12
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338387Enabled" /t REG_DWORD /d 0 /f
+
+
+ 13
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338388Enabled" /t REG_DWORD /d 0 /f
+
+
+ 14
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338389Enabled" /t REG_DWORD /d 0 /f
+
+
+ 15
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338393Enabled" /t REG_DWORD /d 0 /f
+
+
+ 16
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-353698Enabled" /t REG_DWORD /d 0 /f
+
+
+ 17
+ reg.exe add "HKU\mount\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SystemPaneSuggestionsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 18
+ reg.exe add "HKU\mount\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableCloudOptimizedContent" /t REG_DWORD /d 1 /f
+
+
+ 19
+ reg.exe add "HKU\mount\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 1 /f
+
+
+ 20
+ reg.exe add "HKU\mount\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableConsumerAccountStateContent" /t REG_DWORD /d 1 /f
+
+
+ 21
+ reg.exe unload "HKU\mount"
+
+
+ 22
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableCloudOptimizedContent" /t REG_DWORD /d 1 /f
+
+
+ 23
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 1 /f
+
+
+ 24
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableConsumerAccountStateContent" /t REG_DWORD /d 1 /f
+
+
+ 25
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\FirstNetwork" /v Category /t REG_DWORD /d 1 /f
+ Set Network Location to Home
+
+
+
+
+ false
+
+
+ 0
+
+
+
+
+ true
+ all
+ @FirewallAPI.dll,-28752
+
+
+
+
+
+
+
+
+ true
+
+
+ 1
+
+
+
+
+
+ Docker
+ Administrators
+
+
+ true
+
+
+
+
+ password
+ true
+
+
+
+ Docker
+ true
+ 65432
+
+
+ true
+
+
+
+ 32
+ 1920
+ 1080
+
+
+ true
+ true
+ true
+ true
+ true
+ Home
+ 3
+ true
+ true
+
+ Dockur
+ Windows for Docker
+
+
+ 1
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "AllowInsecureGuestAuth" /t REG_DWORD /d 1 /f
+ Allow guest access to network shares
+
+
+ 2
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f
+ Allow RDP login with blank password
+
+
+ 3
+ reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f
+ Enable option for passwordless sign-in
+
+
+ 4
+ cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
+ Password Never Expires
+
+
+ 5
+ cmd /C POWERCFG -H OFF
+ Disable Hibernation
+
+
+ 6
+ cmd /C POWERCFG -X -monitor-timeout-ac 0
+ Disable monitor blanking
+
+
+ 7
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Edge" /v "HideFirstRunExperience" /t REG_DWORD /d 1 /f
+ Disable first-run experience in Edge
+
+
+ 8
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f
+ Show file extensions in Explorer
+
+
+ 9
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateFileSizePercent" /t REG_DWORD /d 0 /f
+ Zero Hibernation File
+
+
+ 10
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Power" /v "HibernateEnabled" /t REG_DWORD /d 0 /f
+ Disable Hibernation
+
+
+ 11
+ cmd /C POWERCFG -X -standby-timeout-ac 0
+ Disable Sleep
+
+
+ 12
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fAllowUnlistedRemotePrograms" /t REG_DWORD /d 1 /f
+ Enable RemoteAPP to launch unlisted programs
+
+
+ 13
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "ShowTaskViewButton" /t REG_DWORD /d 0 /f
+ Remove Task View from the Taskbar
+
+
+ 14
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarDa" /t REG_DWORD /d 0 /f
+ Remove Widgets from the Taskbar
+
+
+ 15
+ reg.exe add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f
+ Remove Chat from the Taskbar
+
+
+ 16
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v "NoAutoUpdate" /t REG_DWORD /d 1 /f
+ Turn off Windows Update auto download
+
+
+ 17
+ netsh advfirewall firewall set rule group="@FirewallAPI.dll,-32752" new enable=Yes
+ Enable Network Discovery
+
+
+ 18
+ netsh advfirewall firewall set rule group="@FirewallAPI.dll,-28502" new enable=Yes
+ Enable File Sharing
+
+
+ 19
+ reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV1 /d 0 /t REG_DWORD /f
+ Disable unsupported hardware notifications
+
+
+ 20
+ reg.exe add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v SV2 /d 0 /t REG_DWORD /f
+ Disable unsupported hardware notifications
+
+
+ 21
+ cmd /C if exist "C:\OEM\install.bat" start "Install" "cmd /C C:\OEM\install.bat"
+ Execute custom script from the OEM folder if exists
+
+
+
+
+
diff --git a/readme.md b/readme.md
index 5925c09..5d1ab0a 100644
--- a/readme.md
+++ b/readme.md
@@ -85,10 +85,13 @@ kubectl apply -f kubernetes.yml
Select from the values below:
- | **Value** | **Version** | **Platform** | **Size** |
+ | **Value** | **Version** | **Platform** | **Size** |
|---|---|---|---|
- | `win11` | Windows 11 Pro | ARM64 | 4.6 GB |
- | `win10` | Windows 10 Pro | ARM64 | 3.9 GB |
+ | `win11` | Windows 11 Pro | ARM64 | 4.9 GB |
+ | `win11e` | Windows 11 Enterprise | ARM64 | 4.8 GB |
+ | `win10` | Windows 10 Pro | ARM64 | 3.5 GB |
+ | `ltsc10` | Windows 10 LTSC | ARM64 | 4.1 GB |
+ | `win10e` | Windows 10 Enterprise | ARM64 | 3.4 GB |
To install x86 and x64 versions of Windows, use [dockur/windows](https://github.com/dockur/windows/).
@@ -162,22 +165,9 @@ kubectl apply -f kubernetes.yml
Replace the example path `/home/user/example.iso` with the filename of your desired ISO file, the value of `VERSION` will be ignored in this case.
-* ### How do I customize the installation?
-
- If you want to modify the settings used during the automatic installation, you can do this by editing the answer file corresponding to your Windows edition, for example [win11arm64.xml](https://raw.githubusercontent.com/dockur/windows-arm/master/assets/win11arm64.xml) in the case of Windows 11 Pro.
-
- Apply your modifications to it, and add this line to your compose file:
-
- ```yaml
- volumes:
- - /home/user/example.xml:/custom.xml
- ```
-
- Replace the example path `/home/user/example.xml` with the filename of the modified XML file.
-
* ### How do I run a script after installation?
- To run your own script after installation, you can create a file called `install.bat` and place it in a folder together with other files it needs (programs to install for example). Then bind it in your compose file like this:
+ To run your own script after installation, you can create a file called `install.bat` and place it in a folder together with any additional files it needs (software to be installed for example). Then bind that folder in your compose file like this:
```yaml
volumes:
@@ -186,6 +176,17 @@ kubectl apply -f kubernetes.yml
The example folder `/home/user/example` will be copied to `C:\OEM` during installation and the containing `install.bat` will be executed during the last step.
+* ### How do I perform a manual installation?
+
+ It's best to stick to the automatic installation, as it adjusts various settings to prevent common issues when running Windows inside a virtual environment.
+
+ However, if you insist on performing the installation manually, add the following environment variable to your compose file:
+
+ ```yaml
+ environment:
+ MANUAL: "Y"
+ ```
+
* ### How do I verify if my system supports KVM?
To verify if your system supports KVM, run the following commands:
@@ -197,11 +198,11 @@ kubectl apply -f kubernetes.yml
If you receive an error from `kvm-ok` indicating that KVM acceleration can't be used, check the virtualization settings in the BIOS.
-* ### How do I increase the amount of CPU or RAM?
+* ### How do I change the amount of CPU or RAM?
- By default, 2 CPU cores and 4 GB of RAM are allocated to the container, as those are the minimum requirements of Windows 11.
+ By default, the container will be allowed to use a maximum of 2 CPU cores and 4 GB of RAM.
- If there arises a need to increase this, add the following environment variables:
+ If you want to adjust this, you can specify the desired amount using the following environment variables:
```yaml
environment:
@@ -211,12 +212,14 @@ kubectl apply -f kubernetes.yml
* ### How do I configure the username and password?
- By default, a user called `Docker` is created during installation with an empty password. You can change these credentials in your compose file:
+ By default, a user called `Docker` is created during the installation, with an empty password.
+
+ If you want to use different credentials, you can change them in your compose file:
```yaml
environment:
- USERNAME: "john"
- PASSWORD: "secret"
+ USERNAME: "bill"
+ PASSWORD: "gates"
```
* ### How do I connect using RDP?
@@ -225,7 +228,7 @@ kubectl apply -f kubernetes.yml
So for a better experience you can connect using any Microsoft Remote Desktop client to the IP of the container, using the username `Docker` and by leaving the password empty.
- There is a good RDP client for [Android](https://play.google.com/store/apps/details?id=com.microsoft.rdc.androidx) available from the Play Store and one for [iOS](https://apps.apple.com/nl/app/microsoft-remote-desktop/id714464092?l=en-GB) in the Apple Store. For Linux you can use [FreeRDP](https://www.freerdp.com/) and on Windows just type `mstsc` in the search box.
+ There is a RDP client for [Android](https://play.google.com/store/apps/details?id=com.microsoft.rdc.androidx) available from the Play Store and one for [iOS](https://apps.apple.com/nl/app/microsoft-remote-desktop/id714464092?l=en-GB) in the Apple Store. For Linux you can use [FreeRDP](https://www.freerdp.com/) and on Windows just type `mstsc` in the search box.
* ### How do I assign an individual IP address to the container?
diff --git a/src/define.sh b/src/define.sh
index afa01d7..4e4e8df 100644
--- a/src/define.sh
+++ b/src/define.sh
@@ -27,9 +27,23 @@ parseVersion() {
"11" | "11p" | "win11" | "win11p" | "windows11" | "windows 11" )
VERSION="win11arm64"
;;
+ "11e" | "win11e" | "windows11e" | "windows 11e" )
+ VERSION="win11arm64-enterprise-eval"
+ ;;
+ "ltsc11" | "11ltsc" | "win11-ltsc" | "win11arm64-ltsc" | "win11arm64-enterprise-ltsc-eval" )
+ VERSION="win11arm64-enterprise-ltsc-eval"
+ [ -z "$DETECTED" ] && DETECTED="win11arm64-ltsc"
+ ;;
"10" | "10p" | "win10" | "win10p" | "windows10" | "windows 10" )
VERSION="win10arm64"
;;
+ "10e" | "win10e" | "windows10e" | "windows 10e" )
+ VERSION="win10arm64-enterprise-eval"
+ ;;
+ "ltsc10" | "10ltsc" | "win10-ltsc" | "win10arm64-ltsc" | "win10arm64-enterprise-ltsc-eval" )
+ VERSION="win10arm64-enterprise-ltsc-eval"
+ [ -z "$DETECTED" ] && DETECTED="win10arm64-ltsc"
+ ;;
esac
return 0
@@ -295,6 +309,18 @@ printEdition() {
[[ "$result" == "x" ]] && echo "$desc" && return 0
case "${id,,}" in
+ *"-enterprise" )
+ edition="Enterprise"
+ ;;
+ *"-iot" | *"-iot-eval" )
+ edition="LTSC"
+ ;;
+ *"-ltsc" | *"-ltsc-eval" )
+ edition="LTSC"
+ ;;
+ *"-enterprise-eval" )
+ edition="Enterprise (Evaluation)"
+ ;;
"win10"* | "win11"* )
edition="Pro"
;;
@@ -365,11 +391,34 @@ getVersion() {
id=$(fromName "$name" "$arch")
+ case "${id,,}" in
+ "win10"* | "win11"* )
+ case "${name,,}" in
+ *" iot"* ) id="$id-ltsc" ;;
+ *" ltsc"* ) id="$id-ltsc" ;;
+ *" enterprise evaluation"* ) id="$id-enterprise-eval" ;;
+ *" enterprise"* ) id="$id-enterprise" ;;
+ esac
+ ;;
+ esac
+
echo "$id"
return 0
}
switchEdition() {
+
+ local id="$1"
+
+ case "${id,,}" in
+ "win11${PLATFORM,,}-enterprise-eval" )
+ DETECTED="win11${PLATFORM,,}-enterprise"
+ ;;
+ "win10${PLATFORM,,}-enterprise-eval" )
+ DETECTED="win10${PLATFORM,,}-enterprise"
+ ;;
+ esac
+
return 0
}
@@ -377,42 +426,6 @@ getLink1() {
# Fallbacks for users who cannot connect to the Microsoft servers
- local id="$1"
- local lang="$2"
- local ret="$3"
- local url=""
- local sum=""
- local size=""
- local host="https://dl.bobpony.com/windows"
-
- [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0
-
- case "${id,,}" in
- "win11arm64")
- size=5946128384
- sum="0c8edeae3202cf6f4bf8bb65c9f6176374c48fdcbcc8d0effa8547be75e9fd20"
- url="11/en-us_windows_11_23h2_arm64.iso"
- ;;
- "win10arm64")
- size=4957009920
- sum="64461471292b79d18cd9cced6cc141d7773b489a9b3e12de7b120312e63bfaf1"
- url="10/en-us_windows_10_22h2_arm64.iso"
- ;;
- esac
-
- case "${ret,,}" in
- "sum" ) echo "$sum" ;;
- "size" ) echo "$size" ;;
- *) [ -n "$url" ] && echo "$host/$url";;
- esac
-
- return 0
-}
-
-getLink2() {
-
- # Fallbacks for users who cannot connect to the Microsoft servers
-
local id="$1"
local lang="$2"
local ret="$3"
@@ -424,7 +437,7 @@ getLink2() {
culture=$(getLanguage "$lang" "culture")
case "${id,,}" in
- "win11arm64")
+ "win11arm64" | "win11arm64-enterprise" | "win11arm64-enterprise-eval" )
case "${culture,,}" in
"ar" | "ar-"* ) url="SW_DVD9_Win_Pro_11_23H2.2_Arm64_Arabic_Pro_Ent_EDU_N_MLF_X23-68013.ISO" ;;
"bg" | "bg-"* ) url="SW_DVD9_Win_Pro_11_23H2.2_Arm64_Bulgarian_Pro_Ent_EDU_N_MLF_X23-68015.ISO" ;;
@@ -436,7 +449,7 @@ getLink2() {
"en" | "en-"* )
size=7010680832
sum="3da19e8c8c418091081186e362fb53a1aa68dad255d1d28ace81e2c88c3f99ba"
- url="$host/SW_DVD9_Win_Pro_11_23H2.2_Arm64_English_Pro_Ent_EDU_N_MLF_X23-68023.ISO" ;;
+ url="SW_DVD9_Win_Pro_11_23H2.2_Arm64_English_Pro_Ent_EDU_N_MLF_X23-68023.ISO" ;;
"mx" | "es-mx" ) url="SW_DVD9_Win_Pro_11_23H2.2_Arm64_Spanish_Latam_Pro_Ent_EDU_N_MLF_X23-68045.ISO" ;;
"es" | "es-"* ) url="SW_DVD9_Win_Pro_11_23H2.2_Arm64_Spanish_Pro_Ent_EDU_N_MLF_X23-68046.ISO" ;;
"et" | "et-"* ) url="SW_DVD9_Win_Pro_11_23H2.2_Arm64_Estonian_Pro_Ent_EDU_N_MLF_X23-68024.ISO" ;;
@@ -469,7 +482,13 @@ getLink2() {
"zh" | "zh-"* ) url="SW_DVD9_Win_Pro_11_23H2.2_Arm64_ChnSimp_Pro_Ent_EDU_N_MLF_X23-68016.ISO" ;;
esac
;;
- "win10arm64")
+ "win11arm64-ltsc" | "win11arm64-enterprise-ltsc-eval" )
+ [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0
+ size=4821989376
+ sum="e8f1431c4e6289b3997c20eadbb2576670300bb6e1cf8948b5d7af179010a962"
+ url="26100.1.240331-1435.ge_release_CLIENT_ENTERPRISES_OEM_A64FRE_en-us.iso"
+ ;;
+ "win10arm64" | "win10arm64-enterprise" | "win10arm64-enterprise-eval" )
case "${culture,,}" in
"ar" | "ar-"* ) url="SW_DVD9_Win_Pro_10_22H2.15_Arm64_Arabic_Pro_Ent_EDU_N_MLF_X23-67213.ISO" ;;
"bg" | "bg-"* ) url="SW_DVD9_Win_Pro_10_22H2.15_Arm64_Bulgarian_Pro_Ent_EDU_N_MLF_X23-67215.ISO" ;;
@@ -481,7 +500,7 @@ getLink2() {
"en" | "en-"* )
size=5190453248
sum="bd96b342193f81c0a2e6595d8d8b8dc01dbf789d19211699f6299fec7b712197"
- url="$host/SW_DVD9_Win_Pro_10_22H2.15_Arm64_English_Pro_Ent_EDU_N_MLF_X23-67223.ISO" ;;
+ url="SW_DVD9_Win_Pro_10_22H2.15_Arm64_English_Pro_Ent_EDU_N_MLF_X23-67223.ISO" ;;
"mx" | "es-mx" ) url="SW_DVD9_Win_Pro_10_22H2.15_Arm64_Spanish_Latam_Pro_Ent_EDU_N_MLF_X23-67245.ISO" ;;
"es" | "es-"* ) url="SW_DVD9_Win_Pro_10_22H2.15_Arm64_Spanish_Pro_Ent_EDU_N_MLF_X23-67246.ISO" ;;
"et" | "et-"* ) url="SW_DVD9_Win_Pro_10_22H2.15_Arm64_Estonian_Pro_Ent_EDU_N_MLF_X23-67224.ISO" ;;
@@ -514,6 +533,59 @@ getLink2() {
"zh" | "zh-"* ) url="SW_DVD9_Win_Pro_10_22H2.15_Arm64_ChnSimp_Pro_Ent_EDU_N_MLF_X23-67216.ISO" ;;
esac
;;
+ "win10arm64-ltsc" | "win10arm64-enterprise-ltsc-eval" )
+ [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0
+ size=4430471168
+ sum="d265df49b30a1477d010c79185a7bc88591a1be4b3eb690c994bed828ea17c00"
+ url="en-us_windows_10_iot_enterprise_ltsc_2021_arm64_dvd_e8d4fc46.iso"
+ ;;
+ esac
+
+ case "${ret,,}" in
+ "sum" ) echo "$sum" ;;
+ "size" ) echo "$size" ;;
+ *) [ -n "$url" ] && echo "$host/$url";;
+ esac
+
+ return 0
+}
+
+getLink2() {
+
+ # Fallbacks for users who cannot connect to the Microsoft servers
+
+ local id="$1"
+ local lang="$2"
+ local ret="$3"
+ local url=""
+ local sum=""
+ local size=""
+ local host="https://dl.bobpony.com/windows"
+
+ [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0
+
+ case "${id,,}" in
+ "win11arm64" | "win11arm64-enterprise" | "win11arm64-enterprise-eval" )
+ size=6326812672
+ sum="464c75909b9c37864e144886445a2faa67ac86f0845a68cca3f017b97f810e8d"
+ url="11/en-us_windows_11_23h2_arm64.iso"
+ ;;
+ "win11arm64-ltsc" | "win11arm64-enterprise-ltsc-eval" )
+ [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0
+ size=4821989376
+ sum="e8f1431c4e6289b3997c20eadbb2576670300bb6e1cf8948b5d7af179010a962"
+ url="11/26100.1.240331-1435.ge_release_CLIENT_ENTERPRISES_OEM_A64FRE_en-us.iso"
+ ;;
+ "win10arm64" | "win10arm64-enterprise" | "win10arm64-enterprise-eval" )
+ size=4846794752
+ sum="6d2688f95fa1d359d68ed0c38c3f38de7b3713c893410e15be9d1e706a4a58c7"
+ url="10/en-us_windows_10_22h2_arm64.iso"
+ ;;
+ "win10arm64-ltsc" | "win10arm64-enterprise-ltsc-eval" )
+ size=4430471168
+ sum="d265df49b30a1477d010c79185a7bc88591a1be4b3eb690c994bed828ea17c00"
+ url="10/en-us_windows_10_iot_enterprise_ltsc_2021_arm64_dvd_e8d4fc46.iso"
+ ;;
esac
case "${ret,,}" in
@@ -581,6 +653,12 @@ isESD() {
"win11${PLATFORM,,}" | "win10${PLATFORM,,}" )
return 0
;;
+ "win11${PLATFORM,,}-enterprise" | "win11${PLATFORM,,}-enterprise-eval")
+ return 0
+ ;;
+ "win10${PLATFORM,,}-enterprise" | "win10${PLATFORM,,}-enterprise-eval" )
+ return 0
+ ;;
esac
return 1
@@ -609,4 +687,8 @@ migrateFiles() {
return 0
}
+detectLegacy() {
+ return 1
+}
+
return 0
diff --git a/src/entry.sh b/src/entry.sh
index bfa7498..4082ffc 100644
--- a/src/entry.sh
+++ b/src/entry.sh
@@ -35,4 +35,4 @@ cat "$QEMU_TERM" 2> /dev/null | tee "$QEMU_PTY" &
wait $! || :
sleep 1 & wait $!
-finish 0
+[ ! -f "$QEMU_END" ] && finish 0
diff --git a/src/install.sh b/src/install.sh
index 52552b9..c8b0b22 100644
--- a/src/install.sh
+++ b/src/install.sh
@@ -119,6 +119,7 @@ finishInstall() {
fi
rm -f "$STORAGE/windows.old"
+ rm -f "$STORAGE/windows.type"
rm -f "$STORAGE/windows.base"
rm -f "$STORAGE/windows.boot"
rm -f "$STORAGE/windows.mode"
@@ -146,19 +147,33 @@ finishInstall() {
echo "$BOOT_MODE" > "$STORAGE/windows.mode"
fi
fi
+ # Enable secure boot on multi-socket systems to workaround freeze
+ if [ -n "$SOCKETS" ] && [[ "$SOCKETS" != "1" ]]; then
+ BOOT_MODE="windows_secure"
+ echo "$BOOT_MODE" > "$STORAGE/windows.mode"
+ fi
fi
fi
+ if [ -n "${DISK_TYPE:-}" ] && [[ "${DISK_TYPE:-}" != "scsi" ]]; then
+ echo "$DISK_TYPE" > "$STORAGE/windows.type"
+ fi
+
rm -rf "$TMP"
return 0
}
abortInstall() {
- local iso="$1"
+ local dir="$1"
+ local iso="$2"
[[ "${iso,,}" == *".esd" ]] && exit 60
+ if [ ! -d "$dir/EFI" ]; then
+ [[ "${PLATFORM,,}" == "x64" ]] && BOOT_MODE="windows_legacy"
+ fi
+
if [ -n "$CUSTOM" ]; then
BOOT="$iso"
REMOVE="N"
@@ -463,6 +478,7 @@ detectLanguage() {
setXML() {
local file="/custom.xml"
+
[ ! -f "$file" ] || [ ! -s "$file" ] && file="$STORAGE/custom.xml"
[ ! -f "$file" ] || [ ! -s "$file" ] && file="/run/assets/custom.xml"
[ ! -f "$file" ] || [ ! -s "$file" ] && file="$1"
@@ -473,11 +489,24 @@ setXML() {
return 0
}
+skipVersion() {
+
+ local version="$1"
+
+ case "${version,,}" in
+ "win2k"* | "winxp"* | "win9"* )
+ return 0
+ ;;
+ esac
+
+ return 1
+}
+
detectImage() {
local dir="$1"
local version="$2"
- local desc msg language
+ local desc msg find language
XML=""
@@ -487,7 +516,7 @@ detectImage() {
if [ -n "$DETECTED" ]; then
- [[ "${DETECTED,,}" == "winxp"* ]] && return 0
+ skipVersion "${DETECTED,,}" && return 0
if ! setXML "" && [[ "$MANUAL" != [Yy1]* ]]; then
MANUAL="Y"
@@ -499,31 +528,23 @@ detectImage() {
fi
info "Detecting version from ISO image..."
+ detectLegacy "$dir" && return 0
- if [ -f "$dir/WIN51" ] || [ -f "$dir/SETUPXP.HTM" ]; then
- [ -d "$dir/AMD64" ] && DETECTED="winxpx64" || DETECTED="winxpx86"
- desc=$(printEdition "$DETECTED" "Windows XP")
- info "Detected: $desc"
- return 0
- fi
-
- local src loc info
+ local src wim info
src=$(find "$dir" -maxdepth 1 -type d -iname sources | head -n 1)
if [ ! -d "$src" ]; then
- [[ "${PLATFORM,,}" == "x64" ]] && BOOT_MODE="windows_legacy"
warn "failed to locate 'sources' folder in ISO image, $FB" && return 1
fi
- loc=$(find "$src" -maxdepth 1 -type f -iname install.wim | head -n 1)
- [ ! -f "$loc" ] && loc=$(find "$src" -maxdepth 1 -type f -iname install.esd | head -n 1)
+ wim=$(find "$src" -maxdepth 1 -type f -iname install.wim | head -n 1)
+ [ ! -f "$wim" ] && wim=$(find "$src" -maxdepth 1 -type f -iname install.esd | head -n 1)
- if [ ! -f "$loc" ]; then
- [[ "${PLATFORM,,}" == "x64" ]] && BOOT_MODE="windows_legacy"
+ if [ ! -f "$wim" ]; then
warn "failed to locate 'install.wim' or 'install.esd' in ISO image, $FB" && return 1
fi
- info=$(wimlib-imagex info -xml "$loc" | tr -d '\000')
+ info=$(wimlib-imagex info -xml "$wim" | tr -d '\000')
! checkPlatform "$info" && exit 67
DETECTED=$(detectVersion "$info")
@@ -570,19 +591,33 @@ prepareImage() {
local missing
case "${DETECTED,,}" in
+ "win9"* | "win2k"* )
+ MACHINE="pc-i440fx-2.4" ;;
"winxp"* | "winvistax86"* | "win7x86"* )
- MACHINE="pc-q35-2.10"
- ;;
+ MACHINE="pc-q35-2.10" ;;
+ esac
+
+ case "${DETECTED,,}" in
+ "win9"* | "winxp"* | "win2k"* )
+ HV="N"
+ BOOT_MODE="windows_legacy" ;;
+ "winvista"* | "win7"* | "win2008"* )
+ BOOT_MODE="windows_legacy" ;;
esac
case "${DETECTED,,}" in
"winxp"* )
- BOOT_MODE="windows_legacy"
+ DISK_TYPE="blk"
prepareXP "$iso" "$dir" && return 0
- error "Failed to prepare Windows XP ISO!" && return 1
- ;;
- "winvista"* | "win7"* | "win2008"* )
- BOOT_MODE="windows_legacy" ;;
+ error "Failed to prepare Windows XP ISO!" && return 1 ;;
+ "win9"* )
+ DISK_TYPE="auto"
+ prepare9x "$iso" "$dir" && return 0
+ error "Failed to prepare Windows 9x ISO!" && return 1 ;;
+ "win2k"* )
+ DISK_TYPE="auto"
+ prepare2k "$iso" "$dir" && return 0
+ error "Failed to prepare Windows 2000 ISO!" && return 1 ;;
esac
if [[ "${BOOT_MODE,,}" != "windows_legacy" ]]; then
@@ -591,10 +626,9 @@ prepareImage() {
missing=$(basename "$dir/$EFISYS")
[ ! -f "$dir/$ETFS" ] && missing=$(basename "$dir/$ETFS")
- warn "failed to locate file '${missing,,}' in ISO image!"
- [[ "${PLATFORM,,}" == "arm64" ]] && return 1
- BOOT_MODE="windows_legacy"
+ error "failed to locate file '${missing,,}' in ISO image!"
+ return 1
fi
prepareLegacy "$iso" "$dir" && return 0
@@ -654,6 +688,118 @@ updateXML() {
return 0
}
+addDriver() {
+
+ local id="$1"
+ local path="$2"
+ local target="$3"
+ local driver="$4"
+ local folder=""
+
+ case "${id,,}" in
+ "win7x86"* ) folder="w7/x86" ;;
+ "win7x64"* ) folder="w7/amd64" ;;
+ "win81x64"* ) folder="w10/amd64" ;;
+ "win10x64"* ) folder="w10/amd64" ;;
+ "win11x64"* ) folder="w11/amd64" ;;
+ "win2022"* ) folder="2k22/amd64" ;;
+ "win2019"* ) folder="2k19/amd64" ;;
+ "win2016"* ) folder="2k16/amd64" ;;
+ "win2012"* ) folder="2k16/amd64" ;;
+ "win2008"* ) folder="2k8R2/amd64" ;;
+ "win10arm64"* ) folder="w10/ARM64" ;;
+ "win11arm64"* ) folder="w11/ARM64" ;;
+ "winvistax86"* ) folder="2k8/x86" ;;
+ "winvistax64"* ) folder="2k8/amd64" ;;
+ esac
+
+ if [ -z "$folder" ]; then
+ warn "no \"$driver\" driver found for \"$DETECTED\" !" && return 0
+ fi
+
+ [ ! -d "$path/$driver/$folder" ] && return 0
+
+ if [[ "${id,,}" == "winvista"* ]]; then
+ [[ "${driver,,}" == "viorng" ]] && return 0
+ fi
+
+ local dest="$path/$target/$driver"
+ mv "$path/$driver/$folder" "$dest"
+
+ return 0
+}
+
+addDrivers() {
+
+ local file="$1"
+ local index="$2"
+ local version="$3"
+
+ local msg="Adding drivers to image..."
+ info "$msg" && html "$msg"
+
+ local drivers="$TMP/drivers"
+ mkdir -p "$drivers"
+
+ if ! tar -xf /drivers.txz -C "$drivers" --warning=no-timestamp; then
+ error "Failed to extract driver!" && return 1
+ fi
+
+ local target="\$WinPEDriver\$"
+ local dest="$drivers/$target"
+ mkdir -p "$dest"
+
+ wimlib-imagex update "$file" "$index" --command "delete --force --recursive /$target" >/dev/null || true
+
+ addDriver "$version" "$drivers" "$target" "qxl"
+ addDriver "$version" "$drivers" "$target" "viofs"
+ addDriver "$version" "$drivers" "$target" "sriov"
+ addDriver "$version" "$drivers" "$target" "smbus"
+ addDriver "$version" "$drivers" "$target" "qxldod"
+ addDriver "$version" "$drivers" "$target" "viorng"
+ addDriver "$version" "$drivers" "$target" "viostor"
+ addDriver "$version" "$drivers" "$target" "NetKVM"
+ addDriver "$version" "$drivers" "$target" "Balloon"
+ addDriver "$version" "$drivers" "$target" "vioscsi"
+ addDriver "$version" "$drivers" "$target" "pvpanic"
+ addDriver "$version" "$drivers" "$target" "vioinput"
+ addDriver "$version" "$drivers" "$target" "viogpudo"
+ addDriver "$version" "$drivers" "$target" "vioserial"
+ addDriver "$version" "$drivers" "$target" "qemupciserial"
+
+ if ! wimlib-imagex update "$file" "$index" --command "add $dest /$target" >/dev/null; then
+ return 1
+ fi
+
+ rm -rf "$drivers"
+ return 0
+}
+
+addFolder() {
+
+ local src="$1"
+ local folder="/oem"
+
+ [ ! -d "$folder" ] && folder="/OEM"
+ [ ! -d "$folder" ] && folder="$STORAGE/oem"
+ [ ! -d "$folder" ] && folder="$STORAGE/OEM"
+ [ ! -d "$folder" ] && return 0
+
+ local msg="Adding OEM folder to image..."
+ info "$msg" && html "$msg"
+
+ local dest="$src/\$OEM\$/\$1/"
+ mkdir -p "$dest"
+
+ ! cp -r "$folder" "$dest" && return 1
+
+ local file
+ file=$(find "$dest" -maxdepth 1 -type f -iname install.bat | head -n 1)
+ [ -f "$file" ] && unix2dos -q "$file"
+
+ return 0
+}
+
updateImage() {
local dir="$1"
@@ -662,9 +808,9 @@ updateImage() {
local file="autounattend.xml"
local org="${file//.xml/.org}"
local dat="${file//.xml/.dat}"
- local desc path src loc xml index result
+ local desc path src wim xml index result
- [[ "${DETECTED,,}" == "winxp"* ]] && return 0
+ skipVersion "${DETECTED,,}" && return 0
if [ ! -s "$asset" ] || [ ! -f "$asset" ]; then
asset=""
@@ -677,29 +823,35 @@ updateImage() {
src=$(find "$dir" -maxdepth 1 -type d -iname sources | head -n 1)
if [ ! -d "$src" ]; then
- [[ "${PLATFORM,,}" == "x64" ]] && BOOT_MODE="windows_legacy"
- warn "failed to locate 'sources' folder in ISO image, $FB" && return 1
+ error "failed to locate 'sources' folder in ISO image, $FB" && return 1
fi
- loc=$(find "$src" -maxdepth 1 -type f -iname boot.wim | head -n 1)
- [ ! -f "$loc" ] && loc=$(find "$src" -maxdepth 1 -type f -iname boot.esd | head -n 1)
+ wim=$(find "$src" -maxdepth 1 -type f -iname boot.wim | head -n 1)
+ [ ! -f "$wim" ] && wim=$(find "$src" -maxdepth 1 -type f -iname boot.esd | head -n 1)
- if [ ! -f "$loc" ]; then
- [[ "${PLATFORM,,}" == "x64" ]] && BOOT_MODE="windows_legacy"
- warn "failed to locate 'boot.wim' or 'boot.esd' in ISO image, $FB" && return 1
+ if [ ! -f "$wim" ]; then
+ error "failed to locate 'boot.wim' or 'boot.esd' in ISO image, $FB" && return 1
fi
index="1"
- result=$(wimlib-imagex info -xml "$loc" | tr -d '\000')
+ result=$(wimlib-imagex info -xml "$wim" | tr -d '\000')
if [[ "${result^^}" == *""* ]]; then
index="2"
fi
- if wimlib-imagex extract "$loc" "$index" "/$file" "--dest-dir=$TMP" >/dev/null 2>&1; then
- if ! wimlib-imagex extract "$loc" "$index" "/$dat" "--dest-dir=$TMP" >/dev/null 2>&1; then
- if ! wimlib-imagex extract "$loc" "$index" "/$org" "--dest-dir=$TMP" >/dev/null 2>&1; then
- if ! wimlib-imagex update "$loc" "$index" --command "rename /$file /$org" > /dev/null; then
+ if ! addDrivers "$wim" "$index" "$DETECTED"; then
+ error "Failed to add drivers to image!" && return 1
+ fi
+
+ if ! addFolder "$src"; then
+ error "Failed to add OEM folder to image!" && return 1
+ fi
+
+ if wimlib-imagex extract "$wim" "$index" "/$file" "--dest-dir=$TMP" >/dev/null 2>&1; then
+ if ! wimlib-imagex extract "$wim" "$index" "/$dat" "--dest-dir=$TMP" >/dev/null 2>&1; then
+ if ! wimlib-imagex extract "$wim" "$index" "/$org" "--dest-dir=$TMP" >/dev/null 2>&1; then
+ if ! wimlib-imagex update "$wim" "$index" --command "rename /$file /$org" > /dev/null; then
warn "failed to backup original answer file ($file)."
fi
fi
@@ -718,11 +870,11 @@ updateImage() {
cp "$asset" "$answer"
updateXML "$answer" "$language"
- if ! wimlib-imagex update "$loc" "$index" --command "add $answer /$file" > /dev/null; then
+ if ! wimlib-imagex update "$wim" "$index" --command "add $answer /$file" > /dev/null; then
MANUAL="Y"
warn "failed to add answer file ($xml) to ISO image, $FB"
else
- wimlib-imagex update "$loc" "$index" --command "add $answer /$dat" > /dev/null || true
+ wimlib-imagex update "$wim" "$index" --command "add $answer /$dat" > /dev/null || true
fi
rm -f "$answer"
@@ -731,10 +883,10 @@ updateImage() {
if [[ "$MANUAL" == [Yy1]* ]]; then
- wimlib-imagex update "$loc" "$index" --command "delete --force /$file" > /dev/null || true
+ wimlib-imagex update "$wim" "$index" --command "delete --force /$file" > /dev/null || true
- if wimlib-imagex extract "$loc" "$index" "/$org" "--dest-dir=$TMP" >/dev/null 2>&1; then
- if ! wimlib-imagex update "$loc" "$index" --command "add $TMP/$org /$file" > /dev/null; then
+ if wimlib-imagex extract "$wim" "$index" "/$org" "--dest-dir=$TMP" >/dev/null 2>&1; then
+ if ! wimlib-imagex update "$wim" "$index" --command "add $TMP/$org /$file" > /dev/null; then
warn "failed to restore original answer file ($org)."
fi
fi
@@ -758,7 +910,7 @@ updateImage() {
return 0
}
-removeDownload() {
+removeImage() {
local iso="$1"
@@ -769,43 +921,10 @@ removeDownload() {
return 0
}
-copyOEM() {
-
- local dir="$1"
- local folder="/oem"
- local src dest file
-
- [ ! -d "$folder" ] && folder="/OEM"
- [ ! -d "$folder" ] && folder="$STORAGE/oem"
- [ ! -d "$folder" ] && folder="$STORAGE/OEM"
- [ ! -d "$folder" ] && return 0
-
- local msg="Copying OEM folder to image..."
- info "$msg" && html "$msg"
-
- src=$(find "$dir" -maxdepth 1 -type d -iname sources | head -n 1)
-
- if [ ! -d "$src" ]; then
- error "failed to locate 'sources' folder in ISO image!" && return 1
- fi
-
- dest="$src/\$OEM\$/\$1/"
- mkdir -p "$dest"
-
- if ! cp -r "$folder" "$dest"; then
- error "Failed to copy OEM folder!" && return 1
- fi
-
- file=$(find "$dest" -maxdepth 1 -type f -iname install.bat | head -n 1)
- [ -f "$file" ] && unix2dos -q "$file"
-
- return 0
-}
-
buildImage() {
local dir="$1"
- local failed="N"
+ local failed=""
local cat="BOOT.CAT"
local log="/run/shm/iso.log"
local base size size_gb space space_gb desc
@@ -836,31 +955,25 @@ buildImage() {
if [[ "${BOOT_MODE,,}" != "windows_legacy" ]]; then
- if ! genisoimage -o "$out" -b "$ETFS" -no-emul-boot -c "$cat" -iso-level 4 -J -l -D -N -joliet-long -relaxed-filenames -V "${LABEL::30}" \
- -udf -boot-info-table -eltorito-alt-boot -eltorito-boot "$EFISYS" -no-emul-boot -allow-limited-size -quiet "$dir" 2> "$log"; then
- failed="Y"
- fi
+ ! genisoimage -o "$out" -b "$ETFS" -no-emul-boot -c "$cat" -iso-level 4 -J -l -D -N -joliet-long -relaxed-filenames -V "${LABEL::30}" \
+ -udf -boot-info-table -eltorito-alt-boot -eltorito-boot "$EFISYS" -no-emul-boot -allow-limited-size -quiet "$dir" 2> "$log" && failed="y"
else
- if [[ "${DETECTED,,}" != "winxp"* ]]; then
+ case "${DETECTED,,}" in
+ "win2k"* | "winxp"* )
+ ! 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" ;;
+ "win9"* )
+ ! genisoimage -o "$out" -b "$ETFS" -J -r -V "${LABEL::30}" -quiet "$dir" 2> "$log" && failed="y" ;;
+ * )
+ ! genisoimage -o "$out" -b "$ETFS" -no-emul-boot -c "$cat" -iso-level 2 -J -l -D -N -joliet-long -relaxed-filenames -V "${LABEL::30}" \
+ -udf -allow-limited-size -quiet "$dir" 2> "$log" && failed="y" ;;
+ esac
- if ! genisoimage -o "$out" -b "$ETFS" -no-emul-boot -c "$cat" -iso-level 2 -J -l -D -N -joliet-long -relaxed-filenames -V "${LABEL::30}" \
- -udf -allow-limited-size -quiet "$dir" 2> "$log"; then
- failed="Y"
- fi
-
- else
-
- if ! 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"; then
- failed="Y"
- fi
-
- fi
fi
- if [[ "$failed" != "N" ]]; then
+ if [ -n "$failed" ]; then
[ -s "$log" ] && echo "$(<"$log")"
error "Failed to build image!" && return 1
fi
@@ -881,6 +994,10 @@ bootWindows() {
[[ "${PLATFORM,,}" == "arm64" ]] && VGA="virtio-gpu"
+ if [ -s "$STORAGE/windows.type" ] && [ -f "$STORAGE/windows.type" ]; then
+ DISK_TYPE=$(<"$STORAGE/windows.type")
+ fi
+
if [ -s "$STORAGE/windows.mode" ] && [ -f "$STORAGE/windows.mode" ]; then
BOOT_MODE=$(<"$STORAGE/windows.mode")
if [ -s "$STORAGE/windows.old" ] && [ -f "$STORAGE/windows.old" ]; then
@@ -950,28 +1067,24 @@ if ! extractImage "$ISO" "$DIR" "$VERSION"; then
fi
if ! detectImage "$DIR" "$VERSION"; then
- abortInstall "$ISO" && return 0
+ abortInstall "$DIR" "$ISO" && return 0
exit 60
fi
if ! prepareImage "$ISO" "$DIR"; then
- abortInstall "$ISO" && return 0
- exit 60
+ abortInstall "$DIR" "$ISO" && return 0
+ exit 66
fi
if ! updateImage "$DIR" "$XML" "$LANGUAGE"; then
- abortInstall "$ISO" && return 0
- exit 60
-fi
-
-if ! removeDownload "$ISO"; then
- exit 64
-fi
-
-if ! copyOEM "$DIR"; then
+ abortInstall "$DIR" "$ISO" && return 0
exit 63
fi
+if ! removeImage "$ISO"; then
+ exit 64
+fi
+
if ! buildImage "$DIR"; then
exit 65
fi
diff --git a/src/mido.sh b/src/mido.sh
index 17ce0b9..3287874 100644
--- a/src/mido.sh
+++ b/src/mido.sh
@@ -18,6 +18,14 @@ getCatalog() {
edition="Professional"
name="Windows 10 Pro"
url="https://go.microsoft.com/fwlink/?LinkId=841361" ;;
+ "win11${PLATFORM,,}-enterprise" | "win11${PLATFORM,,}-enterprise-eval")
+ edition="Enterprise"
+ name="Windows 11 Enterprise"
+ url="https://go.microsoft.com/fwlink?linkid=2156292" ;;
+ "win10${PLATFORM,,}-enterprise" | "win10${PLATFORM,,}-enterprise-eval" )
+ edition="Enterprise"
+ name="Windows 10 Enterprise"
+ url="https://go.microsoft.com/fwlink/?LinkId=841361" ;;
esac
case "${ret,,}" in
@@ -87,8 +95,9 @@ getESD() {
size=$(stat -c%s "$dir/$eFile")
if ((size<20)); then
+ desc=$(printEdition "$version" "$desc")
language=$(getLanguage "$lang" "desc")
- error "the $language language is not supported by this download method!" && return 1
+ error "No download in the $language language available for $desc!" && return 1
fi
local tag="FilePath"
@@ -229,6 +238,8 @@ downloadImage() {
desc="$desc in $language"
fi
+ switchEdition "$version"
+
if isESD "$version" "$lang"; then
if [[ "$tried" != "n" ]]; then
diff --git a/src/power.sh b/src/power.sh
index 1ce6232..ecc65ff 100644
--- a/src/power.sh
+++ b/src/power.sh
@@ -35,6 +35,11 @@ boot() {
fi
error "Timeout while waiting for QEMU to boot the machine!"
+
+ local pid
+ pid=$(<"$QEMU_PID")
+ { kill -15 "$pid" || true; } 2>/dev/null
+
return 0
}
@@ -44,9 +49,7 @@ ready() {
[ ! -s "$QEMU_PTY" ] && return 1
local line="\"Windows Boot Manager\""
- if grep -Fq "$line" "$QEMU_PTY"; then
- return 0
- fi
+ grep -Fq "$line" "$QEMU_PTY" && return 0
return 1
}