diff --git a/.github/ISSUE_TEMPLATE/1-issue.yml b/.github/ISSUE_TEMPLATE/1-issue.yml
index 68f19b7..87860c9 100644
--- a/.github/ISSUE_TEMPLATE/1-issue.yml
+++ b/.github/ISSUE_TEMPLATE/1-issue.yml
@@ -21,6 +21,7 @@ body:
attributes:
label: Docker compose
description: The compose file (or otherwise the `docker run` command used).
+ render: yaml
validations:
required: true
- type: textarea
@@ -28,6 +29,7 @@ body:
attributes:
label: Docker log
description: The logfile of the container (as shown by `docker logs windows`).
+ render: shell
validations:
required: true
- type: textarea
diff --git a/.github/ISSUE_TEMPLATE/3-bug.yml b/.github/ISSUE_TEMPLATE/3-bug.yml
index 131742c..f614f27 100644
--- a/.github/ISSUE_TEMPLATE/3-bug.yml
+++ b/.github/ISSUE_TEMPLATE/3-bug.yml
@@ -23,6 +23,7 @@ body:
attributes:
label: Docker compose
description: The compose file (or otherwise the `docker run` command used).
+ render: yaml
validations:
required: true
- type: textarea
@@ -30,6 +31,7 @@ body:
attributes:
label: Docker log
description: The logfile of the container (as shown by `docker logs windows`).
+ render: shell
validations:
required: true
- type: textarea
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 8731ab4..c552d6b 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -32,7 +32,7 @@ jobs:
steps:
-
name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
fetch-depth: 0
-
diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml
index b132f31..71c2d33 100644
--- a/.github/workflows/check.yml
+++ b/.github/workflows/check.yml
@@ -7,7 +7,7 @@ jobs:
name: shellcheck
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Run ShellCheck
uses: ludeeus/action-shellcheck@master
env:
@@ -18,7 +18,7 @@ jobs:
path: "assets"
file-endings: ".xml"
- name: Lint Dockerfile
- uses: hadolint/hadolint-action@v3.1.0
+ uses: hadolint/hadolint-action@v3.2.0
with:
dockerfile: Dockerfile
ignore: DL3006,DL3008
diff --git a/.github/workflows/hub.yml b/.github/workflows/hub.yml
index 0e0bcd1..263e97c 100644
--- a/.github/workflows/hub.yml
+++ b/.github/workflows/hub.yml
@@ -12,7 +12,7 @@ jobs:
dockerHubDescription:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
-
name: Docker Hub Description
uses: peter-evans/dockerhub-description@v4
diff --git a/Dockerfile b/Dockerfile
index 8b9c70c..3a1ce53 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,9 @@
+# syntax=docker/dockerfile:1
+
ARG VERSION_ARG="latest"
FROM scratch AS build-amd64
-COPY --from=qemux/qemu:7.02 / /
+COPY --from=qemux/qemu:7.12 / /
ARG DEBCONF_NOWARNINGS="yes"
ARG DEBIAN_FRONTEND="noninteractive"
@@ -10,20 +12,21 @@ ARG DEBCONF_NONINTERACTIVE_SEEN="true"
RUN set -eu && \
apt-get update && \
apt-get --no-install-recommends -y install \
- wsdd \
samba \
wimtools \
dos2unix \
cabextract \
libxml2-utils \
- libarchive-tools && \
+ libarchive-tools \
+ netcat-openbsd && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY --chmod=755 ./src /run/
COPY --chmod=755 ./assets /run/assets
-ADD --chmod=664 https://github.com/qemus/virtiso-whql/releases/download/v1.9.45-0/virtio-win-1.9.45.tar.xz /drivers.txz
+ADD --chmod=755 https://raw.githubusercontent.com/christgau/wsdd/refs/tags/v0.9/src/wsdd.py /usr/sbin/wsdd
+ADD --chmod=664 https://github.com/qemus/virtiso-whql/releases/download/v1.9.47-0/virtio-win-1.9.47.tar.xz /var/drivers.txz
FROM dockurr/windows-arm:${VERSION_ARG} AS build-arm64
FROM build-${TARGETARCH}
diff --git a/assets/win10x64-enterprise-eval.xml b/assets/win10x64-enterprise-eval.xml
index 15cf47e..f91811f 100644
--- a/assets/win10x64-enterprise-eval.xml
+++ b/assets/win10x64-enterprise-eval.xml
@@ -323,11 +323,6 @@
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
diff --git a/assets/win10x64-enterprise.xml b/assets/win10x64-enterprise.xml
index 8523316..dc0b0d7 100644
--- a/assets/win10x64-enterprise.xml
+++ b/assets/win10x64-enterprise.xml
@@ -326,11 +326,6 @@
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
diff --git a/assets/win10x64-iot.xml b/assets/win10x64-iot.xml
index fc80dc5..08741af 100644
--- a/assets/win10x64-iot.xml
+++ b/assets/win10x64-iot.xml
@@ -332,11 +332,6 @@
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
diff --git a/assets/win10x64-ltsc.xml b/assets/win10x64-ltsc.xml
index 8cdc2de..e3823a9 100644
--- a/assets/win10x64-ltsc.xml
+++ b/assets/win10x64-ltsc.xml
@@ -329,11 +329,6 @@
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
diff --git a/assets/win10x64.xml b/assets/win10x64.xml
index dbcbb51..969ffe3 100644
--- a/assets/win10x64.xml
+++ b/assets/win10x64.xml
@@ -326,11 +326,6 @@
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
diff --git a/assets/win11x64-enterprise-eval.xml b/assets/win11x64-enterprise-eval.xml
index fcfa7b4..39caac3 100644
--- a/assets/win11x64-enterprise-eval.xml
+++ b/assets/win11x64-enterprise-eval.xml
@@ -351,11 +351,6 @@
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f
Disable SMB signing requirement
-
- 3
- reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f
- Allow RDP login with blank password
-
4
reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f
diff --git a/assets/win11x64-enterprise.xml b/assets/win11x64-enterprise.xml
index 173e091..1c18bf7 100644
--- a/assets/win11x64-enterprise.xml
+++ b/assets/win11x64-enterprise.xml
@@ -354,11 +354,6 @@
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f
Disable SMB signing requirement
-
- 3
- reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f
- Allow RDP login with blank password
-
4
reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f
diff --git a/assets/win11x64-iot.xml b/assets/win11x64-iot.xml
index 1c35d05..3ee4107 100644
--- a/assets/win11x64-iot.xml
+++ b/assets/win11x64-iot.xml
@@ -354,11 +354,6 @@
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f
Disable SMB signing requirement
-
- 3
- reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f
- Allow RDP login with blank password
-
4
reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f
diff --git a/assets/win11x64-ltsc.xml b/assets/win11x64-ltsc.xml
index e52ccc9..5bc5187 100644
--- a/assets/win11x64-ltsc.xml
+++ b/assets/win11x64-ltsc.xml
@@ -354,11 +354,6 @@
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f
Disable SMB signing requirement
-
- 3
- reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f
- Allow RDP login with blank password
-
4
reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f
diff --git a/assets/win11x64.xml b/assets/win11x64.xml
index e5442ef..f3fc68c 100644
--- a/assets/win11x64.xml
+++ b/assets/win11x64.xml
@@ -354,11 +354,6 @@
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f
Disable SMB signing requirement
-
- 3
- reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f
- Allow RDP login with blank password
-
4
reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f
diff --git a/assets/win2008r2-eval.xml b/assets/win2008r2-eval.xml
index bd3d074..84467bd 100644
--- a/assets/win2008r2-eval.xml
+++ b/assets/win2008r2-eval.xml
@@ -203,11 +203,6 @@
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
diff --git a/assets/win2008r2.xml b/assets/win2008r2.xml
index f1e87d6..9ab119f 100644
--- a/assets/win2008r2.xml
+++ b/assets/win2008r2.xml
@@ -206,11 +206,6 @@
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
diff --git a/assets/win2012r2-eval.xml b/assets/win2012r2-eval.xml
index b454f2a..84bf8be 100644
--- a/assets/win2012r2-eval.xml
+++ b/assets/win2012r2-eval.xml
@@ -236,11 +236,6 @@
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
diff --git a/assets/win2012r2.xml b/assets/win2012r2.xml
index 06c8030..5eef789 100644
--- a/assets/win2012r2.xml
+++ b/assets/win2012r2.xml
@@ -239,11 +239,6 @@
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
diff --git a/assets/win2016-eval.xml b/assets/win2016-eval.xml
index 5a3f668..45c1d82 100644
--- a/assets/win2016-eval.xml
+++ b/assets/win2016-eval.xml
@@ -236,11 +236,6 @@
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
diff --git a/assets/win2016.xml b/assets/win2016.xml
index 7300fed..019cd1c 100644
--- a/assets/win2016.xml
+++ b/assets/win2016.xml
@@ -239,11 +239,6 @@
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
diff --git a/assets/win2019-eval.xml b/assets/win2019-eval.xml
index 6de9fd1..e6db2d9 100644
--- a/assets/win2019-eval.xml
+++ b/assets/win2019-eval.xml
@@ -240,11 +240,6 @@
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
diff --git a/assets/win2019-hv.xml b/assets/win2019-hv.xml
index 0f7990d..bb87975 100644
--- a/assets/win2019-hv.xml
+++ b/assets/win2019-hv.xml
@@ -159,6 +159,11 @@
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
+
+ 2
+ dism.exe /online /Disable-Feature /FeatureName:Microsoft-Hyper-V /NoRestart
+ Disable Hyper-V role
+
@@ -240,11 +245,6 @@
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
diff --git a/assets/win2019.xml b/assets/win2019.xml
index e07ef29..5051f9f 100644
--- a/assets/win2019.xml
+++ b/assets/win2019.xml
@@ -243,11 +243,6 @@
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
diff --git a/assets/win2022-eval.xml b/assets/win2022-eval.xml
index 9059ab5..a4ed208 100644
--- a/assets/win2022-eval.xml
+++ b/assets/win2022-eval.xml
@@ -240,11 +240,6 @@
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
diff --git a/assets/win2022.xml b/assets/win2022.xml
index 2cdfb86..71c07c9 100644
--- a/assets/win2022.xml
+++ b/assets/win2022.xml
@@ -243,11 +243,6 @@
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
diff --git a/assets/win2025-eval.xml b/assets/win2025-eval.xml
index 52303b5..d86f152 100644
--- a/assets/win2025-eval.xml
+++ b/assets/win2025-eval.xml
@@ -250,11 +250,6 @@
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f
Disable SMB signing requirement
-
- 3
- reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f
- Allow RDP login with blank password
-
4
reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f
diff --git a/assets/win2025.xml b/assets/win2025.xml
index bef8e3f..d488ae2 100644
--- a/assets/win2025.xml
+++ b/assets/win2025.xml
@@ -253,11 +253,6 @@
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 0 /f
Disable SMB signing requirement
-
- 3
- reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f
- Allow RDP login with blank password
-
4
reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /v "DevicePasswordLessBuildVersion" /t REG_DWORD /d 0 /f
diff --git a/assets/win7x64-enterprise-eval.xml b/assets/win7x64-enterprise-eval.xml
index 4b7ce48..85b69e4 100644
--- a/assets/win7x64-enterprise-eval.xml
+++ b/assets/win7x64-enterprise-eval.xml
@@ -197,11 +197,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/assets/win7x64-enterprise.xml b/assets/win7x64-enterprise.xml
index f64a076..84c873e 100644
--- a/assets/win7x64-enterprise.xml
+++ b/assets/win7x64-enterprise.xml
@@ -201,11 +201,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/assets/win7x64-ultimate.xml b/assets/win7x64-ultimate.xml
index aa8117d..f17fb0e 100644
--- a/assets/win7x64-ultimate.xml
+++ b/assets/win7x64-ultimate.xml
@@ -201,11 +201,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/assets/win7x64.xml b/assets/win7x64.xml
index f0056e2..be1f3a8 100644
--- a/assets/win7x64.xml
+++ b/assets/win7x64.xml
@@ -201,11 +201,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/assets/win7x86-enterprise.xml b/assets/win7x86-enterprise.xml
index acf676f..e96e5a7 100644
--- a/assets/win7x86-enterprise.xml
+++ b/assets/win7x86-enterprise.xml
@@ -201,11 +201,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/assets/win7x86-ultimate.xml b/assets/win7x86-ultimate.xml
index c6beb01..ce81d12 100644
--- a/assets/win7x86-ultimate.xml
+++ b/assets/win7x86-ultimate.xml
@@ -201,11 +201,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/assets/win7x86.xml b/assets/win7x86.xml
index 74a9064..314c2ee 100644
--- a/assets/win7x86.xml
+++ b/assets/win7x86.xml
@@ -201,11 +201,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/assets/win81x64-enterprise-eval.xml b/assets/win81x64-enterprise-eval.xml
index 7aee42a..f3a61e9 100644
--- a/assets/win81x64-enterprise-eval.xml
+++ b/assets/win81x64-enterprise-eval.xml
@@ -221,11 +221,6 @@
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
diff --git a/assets/win81x64-enterprise.xml b/assets/win81x64-enterprise.xml
index d2d49fc..bf927cc 100644
--- a/assets/win81x64-enterprise.xml
+++ b/assets/win81x64-enterprise.xml
@@ -224,11 +224,6 @@
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
diff --git a/assets/win81x64.xml b/assets/win81x64.xml
index d4b9d5c..290e923 100644
--- a/assets/win81x64.xml
+++ b/assets/win81x64.xml
@@ -231,11 +231,6 @@
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
diff --git a/assets/winvistax64-enterprise.xml b/assets/winvistax64-enterprise.xml
index 04a3f5b..1e3709c 100644
--- a/assets/winvistax64-enterprise.xml
+++ b/assets/winvistax64-enterprise.xml
@@ -150,11 +150,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/assets/winvistax64-ultimate.xml b/assets/winvistax64-ultimate.xml
index a391a96..cb1d1c1 100644
--- a/assets/winvistax64-ultimate.xml
+++ b/assets/winvistax64-ultimate.xml
@@ -150,11 +150,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/assets/winvistax64.xml b/assets/winvistax64.xml
index a2fda33..729e568 100644
--- a/assets/winvistax64.xml
+++ b/assets/winvistax64.xml
@@ -150,11 +150,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/assets/winvistax86-enterprise.xml b/assets/winvistax86-enterprise.xml
index 2dc58fa..66efdf3 100644
--- a/assets/winvistax86-enterprise.xml
+++ b/assets/winvistax86-enterprise.xml
@@ -150,11 +150,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/assets/winvistax86-ultimate.xml b/assets/winvistax86-ultimate.xml
index b7d35cc..5231d50 100644
--- a/assets/winvistax86-ultimate.xml
+++ b/assets/winvistax86-ultimate.xml
@@ -150,11 +150,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/assets/winvistax86.xml b/assets/winvistax86.xml
index 3bec2e6..ef0ed47 100644
--- a/assets/winvistax86.xml
+++ b/assets/winvistax86.xml
@@ -150,11 +150,6 @@
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
cmd /C wmic useraccount where name="Docker" set PasswordExpires=false
diff --git a/readme.md b/readme.md
index 0c29966..c777869 100644
--- a/readme.md
+++ b/readme.md
@@ -53,7 +53,7 @@ services:
##### Via Docker CLI:
```bash
-docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v ${PWD:-.}/windows:/storage --stop-timeout 120 dockurr/windows
+docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v "${PWD:-.}/windows:/storage" --stop-timeout 120 dockurr/windows
```
##### Via Kubernetes:
@@ -64,18 +64,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
##### Via Github Codespaces:
-[`Click here to launch this container in the cloud!`](https://github.com/codespaces/new?skip_quickstart=true&machine=basicLinux32gb&repo=743140652&ref=master&devcontainer_path=.devcontainer.json)
-
-## Compatibility ⚙️
-
-| **Product** | **Platform** | |
-|---|---|---|
-| Docker Engine | Linux| ✅ |
-| Docker Desktop | Linux | ❌ |
-| Docker Desktop | macOS | ❌ |
-| Docker Desktop | Windows 11 | ✅ |
-| Docker Desktop | Windows 10 | ❌ |
-| Github Codespaces | Cloud | ✅ |
+[](https://codespaces.new/dockur/windows)
## FAQ 💬
@@ -102,28 +91,29 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
Select from the values below:
- | **Value** | **Version** | **Size** |
+ | **Value** | **Version** | **Size** |
|---|---|---|
- | `11` | Windows 11 Pro | 5.4 GB |
- | `11l` | Windows 11 LTSC | 4.7 GB |
- | `11e` | Windows 11 Enterprise | 4.0 GB |
+ | `11` | Windows 11 Pro | 5.4 GB |
+ | `11l` | Windows 11 LTSC | 4.7 GB |
+ | `11e` | Windows 11 Enterprise | 4.0 GB |
||||
- | `10` | Windows 10 Pro | 5.7 GB |
- | `10l` | Windows 10 LTSC | 4.6 GB |
- | `10e` | Windows 10 Enterprise | 5.2 GB |
+ | `10` | Windows 10 Pro | 5.7 GB |
+ | `10l` | Windows 10 LTSC | 4.6 GB |
+ | `10e` | Windows 10 Enterprise | 5.2 GB |
||||
- | `8e` | Windows 8.1 Enterprise | 3.7 GB |
- | `7e` | Windows 7 Enterprise | 3.0 GB |
- | `ve` | Windows Vista Enterprise | 3.0 GB |
- | `xp` | Windows XP Professional | 0.6 GB |
- ||||
- | `2025` | Windows Server 2025 | 5.6 GB |
- | `2022` | Windows Server 2022 | 4.7 GB |
- | `2019` | Windows Server 2019 | 5.3 GB |
- | `2016` | Windows Server 2016 | 6.5 GB |
- | `2012` | Windows Server 2012 | 4.3 GB |
- | `2008` | Windows Server 2008 | 3.0 GB |
- | `2003` | Windows Server 2003 | 0.6 GB |
+ | `8e` | Windows 8.1 Enterprise | 3.7 GB |
+ | `7u` | Windows 7 Ultimate | 3.1 GB |
+ | `vu` | Windows Vista Ultimate | 3.0 GB |
+ | `xp` | Windows XP Professional | 0.6 GB |
+ | `2k` | Windows 2000 Professional | 0.4 GB |
+ ||||
+ | `2025` | Windows Server 2025 | 5.6 GB |
+ | `2022` | Windows Server 2022 | 4.7 GB |
+ | `2019` | Windows Server 2019 | 5.3 GB |
+ | `2016` | Windows Server 2016 | 6.5 GB |
+ | `2012` | Windows Server 2012 | 4.3 GB |
+ | `2008` | Windows Server 2008 | 3.0 GB |
+ | `2003` | Windows Server 2003 | 0.6 GB |
> [!TIP]
> To install ARM64 versions of Windows use [dockur/windows-arm](https://github.com/dockur/windows-arm/).
@@ -181,7 +171,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
### How do I configure the username and password?
- By default, a user called `Docker` (with an empty password) is created during installation.
+ By default, a user called `Docker` is created during installation and its password is `admin`.
If you want to use different credentials, you can configure them in your compose file (only before installation):
@@ -214,15 +204,6 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
KEYBOARD: "en-US"
```
-### How do I set the product key?
-
- By default, an evaluation version of Windows will be installed, but if you have a product key you can add a `KEY` variable like this (before installation):
-
- ```yaml
- environment:
- KEY: "xxxxx-xxxxx-xxxxx-xxxxx-xxxxx"
- ```
-
### How do I select the edition?
Windows Server offers a minimalistic Core edition without a GUI. To select those non-standard editions, you can add a `EDITION` variable like this (before installation):
@@ -245,7 +226,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
```yaml
volumes:
- - ./example.iso:/custom.iso
+ - ./example.iso:/boot.iso
```
Replace the example path `./example.iso` with the filename of your desired ISO file. The value of `VERSION` will be ignored in this case.
@@ -267,7 +248,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
It's recommended 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 on your own risk, add the following environment variable to your compose file:
+ However, if you insist on performing the installation manually at your own risk, add the following environment variable to your compose file:
```yaml
environment:
@@ -278,7 +259,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
The web-viewer is mainly meant to be used during installation, as its picture quality is low, and it has no audio or clipboard for example.
- 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.
+ 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 password `admin`.
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.
@@ -349,12 +330,12 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
### How do I pass-through a disk?
- It is possible to pass-through disk devices directly by adding them to your compose file in this way:
+ It is possible to pass-through disk devices or partitions directly by adding them to your compose file in this way:
```yaml
devices:
- /dev/sdb:/disk1
- - /dev/sdc:/disk2
+ - /dev/sdc1:/disk2
```
Use `/disk1` if you want it to become your main drive (which will be formatted during installation), and use `/disk2` and higher to add them as secondary drives (which will stay untouched).
@@ -374,9 +355,16 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
### How do I verify if my system supports KVM?
- Only Linux and Windows 11 support KVM virtualization, macOS and Windows 10 do not unfortunately.
-
- You can run the following commands in Linux to check your system:
+ First check if your software is compatible using this chart:
+
+ | **Product** | **Linux** | **Win11** | **Win10** | **macOS** |
+ |---|---|---|---|---|
+ | Docker CLI | ✅ | ✅ | ❌ | ❌ |
+ | Docker Desktop | ❌ | ✅ | ❌ | ❌ |
+ | Podman CLI | ✅ | ✅ | ❌ | ❌ |
+ | Podman Desktop | ✅ | ✅ | ❌ | ❌ |
+
+ After that you can run the following commands in Linux to check your system:
```bash
sudo apt install cpu-checker
@@ -391,11 +379,7 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
- you are not using a cloud provider, as most of them do not allow nested virtualization for their VPS's.
- If you do not receive any error from `kvm-ok` but the container still complains about KVM, please check whether:
-
- - you are not using "Docker Desktop for Linux" as it does not support KVM, instead make use of Docker Engine directly.
-
- - it could help to add `privileged: true` to your compose file (or `sudo` to your `docker run` command), to rule out any permission issue.
+ If you did not receive any error from `kvm-ok` but the container still complains about a missing KVM device, it could help to add `privileged: true` to your compose file (or `sudo` to your `docker` command) to rule out any permission issue.
### How do I run macOS in a container?
@@ -409,9 +393,6 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
Yes, this project contains only open-source code and does not distribute any copyrighted material. Any product keys found in the code are just generic placeholders provided by Microsoft for trial purposes. So under all applicable laws, this project will be considered legal.
-## Stars 🌟
-[](https://starchart.cc/dockur/windows)
-
## Disclaimer ⚖️
*The product names, logos, brands, and other trademarks referred to within this project are the property of their respective trademark holders. This project is not affiliated, sponsored, or endorsed by Microsoft Corporation.*
diff --git a/src/define.sh b/src/define.sh
index 80d1dfe..bd41f80 100644
--- a/src/define.sh
+++ b/src/define.sh
@@ -16,8 +16,7 @@ set -Eeuo pipefail
: "${USERNAME:=""}"
: "${PASSWORD:=""}"
-MIRRORS=3
-PLATFORM="x64"
+MIRRORS=4
parseVersion() {
@@ -62,27 +61,45 @@ parseVersion() {
"8e" | "81e" | "8.1e" | "win8e" | "win81e" | "windows 8e" )
VERSION="win81x64-enterprise-eval"
;;
- "7" | "7e" | "win7" | "win7e" | "windows7" | "windows 7" )
+ "7" | "win7" | "windows7" | "windows 7" )
VERSION="win7x64"
- [ -z "$DETECTED" ] && DETECTED="win7x64-enterprise-eval"
+ [ -z "$DETECTED" ] && DETECTED="win7x64-ultimate"
;;
"7u" | "win7u" | "windows7u" | "windows 7u" )
VERSION="win7x64-ultimate"
;;
- "7x86" | "win7x86" | "windows7x86" | "win7x86-enterprise" )
+ "7e" | "win7e" | "windows7e" | "windows 7e" )
+ VERSION="win7x64-enterprise"
+ ;;
+ "7x86" | "win7x86" | "win732" | "windows7x86" )
VERSION="win7x86"
- [ -z "$DETECTED" ] && DETECTED="win7x86-enterprise"
+ [ -z "$DETECTED" ] && DETECTED="win7x86-ultimate"
;;
- "vista" | "ve" | "6" | "winvista" | "windowsvista" | "windows vista" )
+ "7ux86" | "7u32" | "win7x86-ultimate" )
+ VERSION="win7x86-ultimate"
+ ;;
+ "7ex86" | "7e32" | "win7x86-enterprise" )
+ VERSION="win7x86-enterprise"
+ ;;
+ "vista" | "vs" | "6" | "winvista" | "windowsvista" | "windows vista" )
VERSION="winvistax64"
- [ -z "$DETECTED" ] && DETECTED="winvistax64-enterprise"
+ [ -z "$DETECTED" ] && DETECTED="winvistax64-ultimate"
;;
- "vistu" | "vu" | "6u" | "winvistu" | "windowsvistu" | "windows vistu" )
+ "vistu" | "vu" | "6u" | "winvistu" )
VERSION="winvistax64-ultimate"
;;
- "vistax86" | "vex86" | "6x86" | "winvistax86" | "windowsvistax86" | "winvistax86-enterprise" )
+ "viste" | "ve" | "6e" | "winviste" )
+ VERSION="winvistax64-enterprise"
+ ;;
+ "vistax86" | "vista32" | "6x86" | "winvistax86" | "windowsvistax86" )
VERSION="winvistax86"
- [ -z "$DETECTED" ] && DETECTED="winvistax86-enterprise"
+ [ -z "$DETECTED" ] && DETECTED="winvistax86-ultimate"
+ ;;
+ "vux86" | "vu32" | "winvistax86-ultimate" )
+ VERSION="winvistax86-ultimate"
+ ;;
+ "vex86" | "ve32" | "winvistax86-enterprise" )
+ VERSION="winvistax86-enterprise"
;;
"xp" | "xp32" | "xpx86" | "5" | "5x86" | "winxp" | "winxp86" | "windowsxp" | "windows xp" )
VERSION="winxpx86"
@@ -90,6 +107,9 @@ parseVersion() {
"xp64" | "xpx64" | "5x64" | "winxp64" | "winxpx64" | "windowsxp64" | "windowsxpx64" )
VERSION="winxpx64"
;;
+ "2k" | "2000" | "win2k" | "win2000" | "windows2k" | "windows2000" )
+ VERSION="win2kx86"
+ ;;
"25" | "2025" | "win25" | "win2025" | "windows2025" | "windows 2025" )
VERSION="win2025-eval"
;;
@@ -102,7 +122,7 @@ parseVersion() {
"16" | "2016" | "win16" | "win2016" | "windows2016" | "windows 2016" )
VERSION="win2016-eval"
;;
- "hv" | "hyperv" | "hyper v" | "hyper-v" | "19hv" | "2019hv" | "win2019hv")
+ "hv" | "hyperv" | "hyper v" | "hyper-v" | "19hv" | "2019hv" | "win2019hv" )
VERSION="win2019-hv"
;;
"2012" | "2012r2" | "win2012" | "win2012r2" | "windows2012" | "windows 2012" )
@@ -742,11 +762,6 @@ getMido() {
sum="2dedd44c45646c74efc5a028f65336027e14a56f76686a4631cf94ffe37c72f2"
url="https://download.microsoft.com/download/B/9/9/B999286E-0A47-406D-8B3D-5B5AD7373A4A/9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_ENTERPRISE_EVAL_EN-US-IR3_CENA_X64FREE_EN-US_DV9.ISO"
;;
- "win7x64" | "win7x64-enterprise-eval" )
- size=3121248256
- sum="2c16c73388a5c02a0ec4cd8b9e5c14ba28b7b45d13d0c9c7d44459feecc0385f"
- url="http://care.dlservice.microsoft.com/dl/download/evalx/win7/x64/EN/7600.16385.090713-1255_x64fre_enterprise_en-us_EVAL_Eval_Enterprise-GRMCENXEVAL_EN_DVD.iso"
- ;;
"win2025-eval" )
size=6014152704
sum="d0ef4502e350e3c6c53c15b1b3020d38a5ded011bf04998e950720ac8579b23d"
@@ -878,36 +893,41 @@ getLink1() {
sum="dfd9890881b7e832a927c38310fb415b7ea62ac5a896671f2ce2a111998f0df8"
url="server/2008r2/en_windows_server_2008_r2_with_sp1_x64_dvd_617601-018.iso"
;;
- "win7x64" | "win7x64-enterprise" | "win7x64-enterprise-eval" )
- size=3182604288
- sum="ee69f3e9b86ff973f632db8e01700c5724ef78420b175d25bae6ead90f6805a7"
- url="7/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso"
- ;;
- "win7x64-ultimate" )
+ "win7x64" | "win7x64-ultimate" )
size=3320836096
sum="0b738b55a5ea388ad016535a5c8234daf2e5715a0638488ddd8a228a836055a1"
url="7/en_windows_7_with_sp1_x64.iso"
;;
- "win7x86" | "win7x86-enterprise" )
- size=2434502656
- sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad"
- url="7/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso"
+ "win7x64-enterprise" | "win7x64-enterprise-eval" )
+ size=3182604288
+ sum="ee69f3e9b86ff973f632db8e01700c5724ef78420b175d25bae6ead90f6805a7"
+ url="7/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso"
;;
- "win7x86-ultimate" )
+ "win7x86" | "win7x86-ultimate" )
size=2564411392
sum="99f3369c90160816be07093dbb0ac053e0a84e52d6ed1395c92ae208ccdf67e5"
url="7/en_windows_7_with_sp1_x86.iso"
;;
- "winvistax64-ultimate" )
+ "win7x86-enterprise" | "win7x86-enterprise-eval" )
+ size=2434502656
+ sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad"
+ url="7/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso"
+ ;;
+ "winvistax64" | "winvistax64-ultimate" )
size=3861460992
sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78"
url="vista/en_windows_vista_sp2_x64_dvd_342267.iso"
;;
- "winvistax86-ultimate" )
+ "winvistax86" | "winvistax86-ultimate" )
size=3243413504
sum="9c36fed4255bd05a8506b2da88f9aad73643395e155e609398aacd2b5276289c"
url="vista/en_windows_vista_with_sp2_x86_dvd_342266.iso"
;;
+ "win2003r2" )
+ size=731650535
+ sum="6b64bbae7eb00fd000cc887ffdc9f224d00c557daad7f756cfa373950b880dc8"
+ url="server/2003r2/en_win_srv_2003_r2_standard_x64_with_sp2_cd1_cd2.zip"
+ ;;
"winxpx86" )
size=617756672
sum="62b6c91563bad6cd12a352aa018627c314cfc5162d8e9f8af0756a642e602a46"
@@ -918,6 +938,11 @@ getLink1() {
sum="8fac68e1e56c64ad9a2aa0ad464560282e67fa4f4dd51d09a66f4e548eb0f2d6"
url="xp/professional/en_win_xp_pro_x64_vl.iso"
;;
+ "win2kx86" )
+ size=331701982
+ sum="a93251b31f92316411bb48458a695d9051b13cdeba714c46f105012fdda45bf3"
+ url="2000/5.00.2195.6717_x86fre_client-professional_retail_en-us.7z"
+ ;;
esac
case "${ret,,}" in
@@ -962,46 +987,46 @@ getLink2() {
sum="dfd9890881b7e832a927c38310fb415b7ea62ac5a896671f2ce2a111998f0df8"
url="Windows%20Server%202008%20R2/en_windows_server_2008_r2_with_sp1_x64_dvd_617601.iso"
;;
- "win7x64" | "win7x64-enterprise" | "win7x64-enterprise-eval" )
- size=3182604288
- sum="ee69f3e9b86ff973f632db8e01700c5724ef78420b175d25bae6ead90f6805a7"
- url="Windows%207/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso"
- ;;
- "win7x64-ultimate" )
+ "win7x64" | "win7x64-ultimate" )
size=3320903680
sum="36f4fa2416d0982697ab106e3a72d2e120dbcdb6cc54fd3906d06120d0653808"
url="Windows%207/en_windows_7_ultimate_with_sp1_x64_dvd_u_677332.iso"
;;
- "win7x86" | "win7x86-enterprise" )
- size=2434502656
- sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad"
- url="Windows%207/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso"
+ "win7x64-enterprise" | "win7x64-enterprise-eval" )
+ size=3182604288
+ sum="ee69f3e9b86ff973f632db8e01700c5724ef78420b175d25bae6ead90f6805a7"
+ url="Windows%207/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso"
;;
- "win7x86-ultimate" )
+ "win7x86" | "win7x86-ultimate" )
size=2564476928
sum="e2c009a66d63a742941f5087acae1aa438dcbe87010bddd53884b1af6b22c940"
url="Windows%207/en_windows_7_ultimate_with_sp1_x86_dvd_u_677460.iso"
;;
- "winvistax64" | "winvistax64-enterprise" )
- size=3205953536
- sum="0a0cd511b3eac95c6f081419c9c65b12317b9d6a8d9707f89d646c910e788016"
- url="Windows%20Vista/en_windows_vista_enterprise_sp2_x64_dvd_342332.iso"
+ "win7x86-enterprise" | "win7x86-enterprise-eval" )
+ size=2434502656
+ sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad"
+ url="Windows%207/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso"
;;
- "winvistax64-ultimate" )
+ "winvistax64" | "winvistax64-ultimate" )
size=3861460992
sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78"
url="Windows%20Vista/en_windows_vista_sp2_x64_dvd_342267.iso"
;;
- "winvistax86" | "winvistax86-enterprise" )
- size=2420981760
- sum="54e2720004041e7db988a391543ea5228b0affc28efcf9303d2d0ff9402067f5"
- url="Windows%20Vista/en_windows_vista_enterprise_sp2_x86_dvd_342329.iso"
+ "winvistax64-enterprise" )
+ size=3205953536
+ sum="0a0cd511b3eac95c6f081419c9c65b12317b9d6a8d9707f89d646c910e788016"
+ url="Windows%20Vista/en_windows_vista_enterprise_sp2_x64_dvd_342332.iso"
;;
- "winvistax86-ultimate" )
+ "winvistax86" | "winvistax86-ultimate" )
size=3243413504
sum="9c36fed4255bd05a8506b2da88f9aad73643395e155e609398aacd2b5276289c"
url="Windows%20Vista/en_windows_vista_with_sp2_x86_dvd_342266.iso"
;;
+ "winvistax86-enterprise" )
+ size=2420981760
+ sum="54e2720004041e7db988a391543ea5228b0affc28efcf9303d2d0ff9402067f5"
+ url="Windows%20Vista/en_windows_vista_enterprise_sp2_x86_dvd_342329.iso"
+ ;;
"win2003r2" )
size=652367872
sum="74245cba888f935b138b106c2744bec7f392925b472358960a0b5643cd6abb32"
@@ -1030,6 +1055,49 @@ getLink2() {
getLink3() {
+ local id="$1"
+ local lang="$2"
+ local ret="$3"
+ local url=""
+ local sum=""
+ local size=""
+ local host="https://nixsys.com/drivers"
+
+ [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-us" ]] && return 0
+
+ case "${id,,}" in
+ "win7x64" | "win7x64-ultimate" )
+ size=3319478272
+ sum="3286963e1476082ba882a5058c205c264772bead9e99e15cd1cb255f04b72900"
+ url="WINDOWS764_EN_DVD.iso"
+ ;;
+ "win7x86" | "win7x86-ultimate" )
+ size=2564784128
+ sum="bd4c03c917d00a40222d92a6fab04981a7bd46140bda1888eb961a322e3c5d89"
+ url="WINDOWS732_EN_DVD.iso"
+ ;;
+ "winxpx86" )
+ size=618065920
+ sum="8177d0137dfe4e8296a85793f140806c9250a5992c8e0e50158c742767ad1182"
+ url="WinXPsp3.iso"
+ ;;
+ "win2kx86" )
+ size=387424256
+ sum="08b11c3897eb38d1e6566a17cec5cdf2b3c620444e160e3db200a7e223aabbd8"
+ url="Windows_2000_SP4.iso"
+ esac
+
+ case "${ret,,}" in
+ "sum" ) echo "$sum" ;;
+ "size" ) echo "$size" ;;
+ *) [ -n "$url" ] && echo "$host/$url";;
+ esac
+
+ return 0
+}
+
+getLink4() {
+
local id="$1"
local lang="$2"
local ret="$3"
@@ -1056,11 +1124,135 @@ getLink3() {
sum="a11116c0645d892d6a5a7c585ecc1fa13aa66f8c7cc6b03bf1f27bd16860cc35"
url="tiny-10-23-h2/tiny10%20x64%2023h2.iso"
;;
+ "win11x64" )
+ size=5819484160
+ sum="b56b911bf18a2ceaeb3904d87e7c770bdf92d3099599d61ac2497b91bf190b11"
+ url="windows-11-24h2-x64/Windows%2011%2024H2%20x64.iso"
+ ;;
+ "win11x64-enterprise" | "win11x64-enterprise-eval" )
+ size=6209064960
+ sum="c8dbc96b61d04c8b01faf6ce0794fdf33965c7b350eaa3eb1e6697019902945c"
+ url="Windows11Enterprise23H2x64/22631.2428.231001-0608.23H2_NI_RELEASE_SVC_REFRESH_CLIENTENTERPRISEEVAL_OEMRET_x64FRE_en-us.iso"
+ ;;
+ "win11x64-iot" | "win11x64-enterprise-iot-eval" )
+ size=5144817664
+ sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a"
+ url="Windows11LTSC/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso"
+ ;;
+ "win11x64-ltsc" | "win11x64-enterprise-ltsc-eval" )
+ size=5144817664
+ sum="4f59662a96fc1da48c1b415d6c369d08af55ddd64e8f1c84e0166d9e50405d7a"
+ url="Windows11LTSC/X23-81951_26100.1742.240906-0331.ge_release_svc_refresh_CLIENT_ENTERPRISES_OEM_x64FRE_en-us.iso"
+ ;;
+ "win10x64" | "win10x64-enterprise" | "win10x64-enterprise-eval" )
+ size=6978310144
+ sum="7847abd6f39abd02dc8089c4177d354f9eb66fa0ee2fe8ae20e596e675d1ab67"
+ url="Windows-10-22H2-July-2024-64-bit-DVD-English/en-us_windows_10_business_editions_version_22h2_updated_july_2024_x64_dvd_c004521a.iso"
+ ;;
+ "win10x64-iot" | "win10x64-enterprise-iot-eval" )
+ size=4851668992
+ sum="a0334f31ea7a3e6932b9ad7206608248f0bd40698bfb8fc65f14fc5e4976c160"
+ url="en-us_windows_10_iot_enterprise_ltsc_2021_x64_dvd_257ad90f_202411/en-us_windows_10_iot_enterprise_ltsc_2021_x64_dvd_257ad90f.iso"
+ ;;
+ "win10x64-ltsc" | "win10x64-enterprise-ltsc-eval" )
+ size=4899461120
+ sum="c90a6df8997bf49e56b9673982f3e80745058723a707aef8f22998ae6479597d"
+ url="en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96_202302/en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso"
+ ;;
+ "win81x64" )
+ size=4320526336
+ sum="d8333cf427eb3318ff6ab755eb1dd9d433f0e2ae43745312c1cd23e83ca1ce51"
+ url="en_windows_8.1_with_update_x64_dvd_6051480/en_windows_8.1_with_update_x64_dvd_6051480.iso"
+ ;;
+ "win81x64-enterprise" | "win81x64-enterprise-eval" )
+ size=4139163648
+ sum="c3c604c03677504e8905090a8ce5bb1dde76b6fd58e10f32e3a25bef21b2abe1"
+ url="en_windows_8.1_enterprise_with_update_x64_dvd/en_windows_8.1_enterprise_with_update_x64_dvd_6054382.iso"
+ ;;
+ "win2022" | "win2022-eval" )
+ size=5365624832
+ sum="c3c57bb2cf723973a7dcfb1a21e97dfa035753a7f111e348ad918bb64b3114db"
+ url="win-server-2022/2227-January_2024/en-us_windows_server_2022_updated_jan_2024_x64_dvd_2b7a0c9f.iso"
+ ;;
+ "win2019" | "win2019-eval" )
+ size=5575774208
+ sum="0067afe7fdc4e61f677bd8c35a209082aa917df9c117527fc4b2b52a447e89bb"
+ url="sw-dvd-9-win-server-std-core-2019-1809.18-64-bit-english-dc-std-mlf-x-22-74330/SW_DVD9_Win_Server_STD_CORE_2019_1809.18_64Bit_English_DC_STD_MLF_X22-74330.ISO"
+ ;;
+ "win2016" | "win2016-eval" )
+ size=6006587392
+ sum="af06e5483c786c023123e325cea4775050324d9e1366f46850b515ae43f764be"
+ url="en_windows_server_2016_updated_feb_2018_x64_dvd_11636692/en_windows_server_2016_updated_feb_2018_x64_dvd_11636692.iso"
+ ;;
+ "win2012r2" | "win2012r2-eval" )
+ size=5397889024
+ sum="f351e89eb88a96af4626ceb3450248b8573e3ed5924a4e19ea891e6003b62e4e"
+ url="en_windows_server_2012_r2_with_update_x64_dvd_6052708_202006/en_windows_server_2012_r2_with_update_x64_dvd_6052708.iso"
+ ;;
+ "win2008r2" | "win2008r2-eval" )
+ size=3166584832
+ sum="dfd9890881b7e832a927c38310fb415b7ea62ac5a896671f2ce2a111998f0df8"
+ url="en_windows_server_2008_r2_with_sp1_x64_dvd_617601_202006/en_windows_server_2008_r2_with_sp1_x64_dvd_617601.iso"
+ ;;
+ "win7x64" | "win7x64-ultimate" )
+ size=3320903680
+ sum="36f4fa2416d0982697ab106e3a72d2e120dbcdb6cc54fd3906d06120d0653808"
+ url="win7-ult-sp1-english/Win7_Ult_SP1_English_x64.iso"
+ ;;
+ "win7x64-enterprise" | "win7x64-enterprise-eval" )
+ size=3182604288
+ sum="ee69f3e9b86ff973f632db8e01700c5724ef78420b175d25bae6ead90f6805a7"
+ url="en_windows_7_enterprise_with_sp1_x64_dvd_u_677651_202006/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso"
+ ;;
+ "win7x86" | "win7x86-ultimate" )
+ size=2564476928
+ sum="e2c009a66d63a742941f5087acae1aa438dcbe87010bddd53884b1af6b22c940"
+ url="win7-ult-sp1-english/Win7_Ult_SP1_English_x32.iso"
+ ;;
+ "win7x86-enterprise" | "win7x86-enterprise-eval" )
+ size=2434502656
+ sum="8bdd46ff8cb8b8de9c4aba02706629c8983c45e87da110e64e13be17c8434dad"
+ url="en_windows_7_enterprise_with_sp1_x86_dvd_u_677710_202006/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso"
+ ;;
+ "winvistax64" | "winvistax64-ultimate" )
+ size=3861460992
+ sum="edf9f947c5791469fd7d2d40a5dcce663efa754f91847aa1d28ed7f585675b78"
+ url="en_windows_vista_sp2_x64_dvd_342267_202010/en_windows_vista_sp2_x64_dvd_342267.iso"
+ ;;
+ "winvistax64-enterprise" )
+ size=3205953536
+ sum="0a0cd511b3eac95c6f081419c9c65b12317b9d6a8d9707f89d646c910e788016"
+ url="en_windows_vista_enterprise_sp2_x64_dvd_342332_202007/en_windows_vista_enterprise_sp2_x64_dvd_342332.iso"
+ ;;
+ "winvistax86" | "winvistax86-ultimate" )
+ size=3243413504
+ sum="9c36fed4255bd05a8506b2da88f9aad73643395e155e609398aacd2b5276289c"
+ url="en_windows_vista_sp2_x86_dvd_342266/en_windows_vista_sp2_x86_dvd_342266.iso"
+ ;;
+ "winvistax86-enterprise" )
+ size=2420981760
+ sum="54e2720004041e7db988a391543ea5228b0affc28efcf9303d2d0ff9402067f5"
+ url="en_windows_vista_enterprise_sp2_x86_dvd_342329_202007/en_windows_vista_enterprise_sp2_x86_dvd_342329.iso"
+ ;;
+ "win2003r2" )
+ size=652367872
+ sum="74245cba888f935b138b106c2744bec7f392925b472358960a0b5643cd6abb32"
+ url="en_win_srv_2003_r2_standard_x64_with_sp2_cd1_x13-05757/en_win_srv_2003_r2_standard_x64_with_sp2_cd1_x13-05757.iso"
+ ;;
"winxpx86" )
size=617756672
sum="62b6c91563bad6cd12a352aa018627c314cfc5162d8e9f8af0756a642e602a46"
url="XPPRO_SP3_ENU/en_windows_xp_professional_with_service_pack_3_x86_cd_x14-80428.iso"
;;
+ "winxpx64" )
+ size=614166528
+ sum="8fac68e1e56c64ad9a2aa0ad464560282e67fa4f4dd51d09a66f4e548eb0f2d6"
+ url="windows-xp-all-sp-msdn-iso-files-en-de-ru-tr-x86-x64/en_win_xp_sp1_pro_x64_vl.iso"
+ ;;
+ "win2kx86" )
+ size=386859008
+ sum="e3816f6e80b66ff686ead03eeafffe9daf020a5e4717b8bd4736b7c51733ba22"
+ url="MicrosoftWindows2000BuildCollection/5.00.2195.6717_x86fre_client-professional_retail_en-us-ZRMPFPP_EN.iso"
esac
case "${ret,,}" in
@@ -1184,7 +1376,7 @@ addFolder() {
cp -Lr "$folder/." "$dest" || return 1
local file
- file=$(find "$dest" -maxdepth 1 -type f -iname install.bat | head -n 1)
+ file=$(find "$dest" -maxdepth 1 -type f -iname install.bat -print -quit)
[ -f "$file" ] && unix2dos -q "$file"
return 0
@@ -1192,93 +1384,180 @@ addFolder() {
prepareInstall() {
+ local pid=""
+ local file=""
local dir="$2"
local desc="$3"
local driver="$4"
local drivers="/tmp/drivers"
- rm -rf "$drivers"
- mkdir -p "$drivers"
-
ETFS="[BOOT]/Boot-NoEmul.img"
if [ ! -f "$dir/$ETFS" ] || [ ! -s "$dir/$ETFS" ]; then
error "Failed to locate file \"$ETFS\" in $desc ISO image!" && return 1
fi
- local msg="Adding drivers to image..."
- info "$msg" && html "$msg"
-
- if ! bsdtar -xf /drivers.txz -C "$drivers"; then
- error "Failed to extract drivers!" && return 1
- fi
-
local arch target
[ -d "$dir/AMD64" ] && arch="amd64" || arch="x86"
[[ "${arch,,}" == "x86" ]] && target="$dir/I386" || target="$dir/AMD64"
- if [ ! -f "$drivers/viostor/$driver/$arch/viostor.sys" ]; then
- error "Failed to locate required storage drivers!" && return 1
+ if [ ! -d "$target" ]; then
+ error "Failed to locate directory \"$target\" in $desc ISO image!" && return 1
fi
- cp -L "$drivers/viostor/$driver/$arch/viostor.sys" "$target" || return 1
+ if [[ "${driver,,}" == "xp" ]] || [[ "${driver,,}" == "2k3" ]]; then
- mkdir -p "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1
- cp -L "$drivers/viostor/$driver/$arch/viostor.cat" "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1
- cp -L "$drivers/viostor/$driver/$arch/viostor.inf" "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1
- cp -L "$drivers/viostor/$driver/$arch/viostor.sys" "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1
+ local msg="Adding drivers to image..."
+ info "$msg" && html "$msg"
+
+ rm -rf "$drivers"
+ mkdir -p "$drivers"
+
+ if ! bsdtar -xf /var/drivers.txz -C "$drivers"; then
+ error "Failed to extract drivers!" && return 1
+ fi
+
+ if [ ! -f "$drivers/viostor/$driver/$arch/viostor.sys" ]; then
+ error "Failed to locate required storage drivers!" && return 1
+ fi
+
+ cp -L "$drivers/viostor/$driver/$arch/viostor.sys" "$target" || return 1
+
+ mkdir -p "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1
+ cp -L "$drivers/viostor/$driver/$arch/viostor.cat" "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1
+ cp -L "$drivers/viostor/$driver/$arch/viostor.inf" "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1
+ cp -L "$drivers/viostor/$driver/$arch/viostor.sys" "$dir/\$OEM\$/\$1/Drivers/viostor" || return 1
+
+ if [ ! -f "$drivers/NetKVM/$driver/$arch/netkvm.sys" ]; then
+ error "Failed to locate required network drivers!" && return 1
+ fi
+
+ mkdir -p "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1
+ cp -L "$drivers/NetKVM/$driver/$arch/netkvm.cat" "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1
+ cp -L "$drivers/NetKVM/$driver/$arch/netkvm.inf" "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1
+ cp -L "$drivers/NetKVM/$driver/$arch/netkvm.sys" "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1
+
+ file=$(find "$target" -maxdepth 1 -type f -iname TXTSETUP.SIF -print -quit)
+
+ if [ -z "$file" ]; then
+ error "The file TXTSETUP.SIF could not be found!" && return 1
+ fi
+
+ sed -i '/^\[SCSI.Load\]/s/$/\nviostor=viostor.sys,4/' "$file"
+ sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\nviostor.sys=1,,,,,,4_,4,1,,,1,4/' "$file"
+ sed -i '/^\[SCSI\]/s/$/\nviostor=\"Red Hat VirtIO SCSI Disk Device\"/' "$file"
+ sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00000000=\"viostor\"/' "$file"
+ sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00020000=\"viostor\"/' "$file"
+ sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00021AF4=\"viostor\"/' "$file"
+ sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00000000=\"viostor\"/' "$file"
+
+ if [ ! -d "$drivers/sata/xp/$arch" ]; then
+ error "Failed to locate required SATA drivers!" && return 1
+ fi
+
+ mkdir -p "$dir/\$OEM\$/\$1/Drivers/sata" || return 1
+ cp -Lr "$drivers/sata/xp/$arch/." "$dir/\$OEM\$/\$1/Drivers/sata" || return 1
+ cp -Lr "$drivers/sata/xp/$arch/." "$target" || return 1
+
+ sed -i '/^\[SCSI.Load\]/s/$/\niaStor=iaStor.sys,4/' "$file"
+ sed -i '/^\[FileFlags\]/s/$/\niaStor.sys = 16/' "$file"
+ sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.cat = 1,,,,,,,1,0,0/' "$file"
+ sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.inf = 1,,,,,,,1,0,0/' "$file"
+ sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.sys = 1,,,,,,4_,4,1,,,1,4/' "$file"
+ sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.sys = 1,,,,,,,1,0,0/' "$file"
+ sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaahci.cat = 1,,,,,,,1,0,0/' "$file"
+ sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaAHCI.inf = 1,,,,,,,1,0,0/' "$file"
+ sed -i '/^\[SCSI\]/s/$/\niaStor=\"Intel\(R\) SATA RAID\/AHCI Controller\"/' "$file"
+ sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_8086\&DEV_2922\&CC_0106=\"iaStor\"/' "$file"
+
+ rm -rf "$drivers"
- if [ ! -f "$drivers/NetKVM/$driver/$arch/netkvm.sys" ]; then
- error "Failed to locate required network drivers!" && return 1
fi
- mkdir -p "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1
- cp -L "$drivers/NetKVM/$driver/$arch/netkvm.cat" "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1
- cp -L "$drivers/NetKVM/$driver/$arch/netkvm.inf" "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1
- cp -L "$drivers/NetKVM/$driver/$arch/netkvm.sys" "$dir/\$OEM\$/\$1/Drivers/NetKVM" || return 1
+ local key setup
+ setup=$(find "$target" -maxdepth 1 -type f -iname setupp.ini -print -quit)
+
+ if [ -n "$setup" ] && [ -z "$KEY" ]; then
+
+ pid=$(<"$setup")
+ pid="${pid%$'\r'}"
+
+ if [[ "$driver" == "2k" ]]; then
+
+ echo "${pid:0:$((${#pid})) - 3}270" > "$setup"
+
+ else
+
+ if [[ "$pid" == *"270" ]]; then
+
+ warn "this version of $desc requires a volume license key (VLK), it will ask for one during installation."
+
+ else
+
+ file=$(find "$target" -maxdepth 1 -type f -iname PID.INF -print -quit)
+
+ if [ -n "$file" ]; then
+
+ if [[ "$driver" == "2k3" ]]; then
+
+ key=$(grep -i -A 2 "StagingKey" "$file" | tail -n 2 | head -n 1)
+
+ else
+
+ key="${pid:$((${#pid})) - 8:5}"
+ if [[ "${pid^^}" == *"OEM" ]]; then
+ key=$(grep -i -A 2 "$key" "$file" | tail -n 2 | head -n 1)
+ else
+ key=$(grep -i -m 1 -A 2 "$key" "$file" | tail -n 2 | head -n 1)
+ fi
+ key="${key#*= }"
+
+ fi
+
+ key="${key%$'\r'}"
+ [[ "${#key}" == "29" ]] && KEY="$key"
+
+ fi
+
+ if [ -z "$KEY" ]; then
+
+ # These are NOT pirated keys, they come from official MS documentation.
+
+ case "${driver,,}" in
+ "xp" )
+
+ if [[ "${arch,,}" == "x86" ]]; then
+ # Windows XP Professional x86 generic trial key (no activation)
+ KEY="DR8GV-C8V6J-BYXHG-7PYJR-DB66Y"
+ else
+ # Windows XP Professional x64 generic trial key (no activation)
+ KEY="B2RBK-7KPT9-4JP6X-QQFWM-PJD6G"
+ fi ;;
+
+ "2k3" )
+
+ if [[ "${arch,,}" == "x86" ]]; then
+ # Windows Server 2003 Standard x86 generic trial key (no activation)
+ KEY="QKDCQ-TP2JM-G4MDG-VR6F2-P9C48"
+ else
+ # Windows Server 2003 Standard x64 generic trial key (no activation)
+ KEY="P4WJG-WK3W7-3HM8W-RWHCK-8JTRY"
+ fi ;;
+
+ esac
+
+ echo "${pid:0:$((${#pid})) - 3}000" > "$setup"
+
+ fi
+
+ fi
+ fi
- if [ ! -f "$target/TXTSETUP.SIF" ]; then
- error "The file TXTSETUP.SIF could not be found!" && return 1
fi
- sed -i '/^\[SCSI.Load\]/s/$/\nviostor=viostor.sys,4/' "$target/TXTSETUP.SIF"
- sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\nviostor.sys=1,,,,,,4_,4,1,,,1,4/' "$target/TXTSETUP.SIF"
- sed -i '/^\[SCSI\]/s/$/\nviostor=\"Red Hat VirtIO SCSI Disk Device\"/' "$target/TXTSETUP.SIF"
- sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00000000=\"viostor\"/' "$target/TXTSETUP.SIF"
- sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00020000=\"viostor\"/' "$target/TXTSETUP.SIF"
- sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00021AF4=\"viostor\"/' "$target/TXTSETUP.SIF"
- sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_1AF4\&DEV_1001\&SUBSYS_00000000=\"viostor\"/' "$target/TXTSETUP.SIF"
+ [ -n "$KEY" ] && KEY="ProductID=$KEY"
- if [ ! -d "$drivers/sata/xp/$arch" ]; then
- error "Failed to locate required SATA drivers!" && return 1
- fi
-
- mkdir -p "$dir/\$OEM\$/\$1/Drivers/sata" || return 1
- cp -Lr "$drivers/sata/xp/$arch/." "$dir/\$OEM\$/\$1/Drivers/sata" || return 1
- cp -Lr "$drivers/sata/xp/$arch/." "$target" || return 1
-
- sed -i '/^\[SCSI.Load\]/s/$/\niaStor=iaStor.sys,4/' "$target/TXTSETUP.SIF"
- sed -i '/^\[FileFlags\]/s/$/\niaStor.sys = 16/' "$target/TXTSETUP.SIF"
- sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.cat = 1,,,,,,,1,0,0/' "$target/TXTSETUP.SIF"
- sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.inf = 1,,,,,,,1,0,0/' "$target/TXTSETUP.SIF"
- sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.sys = 1,,,,,,4_,4,1,,,1,4/' "$target/TXTSETUP.SIF"
- sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaStor.sys = 1,,,,,,,1,0,0/' "$target/TXTSETUP.SIF"
- sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaahci.cat = 1,,,,,,,1,0,0/' "$target/TXTSETUP.SIF"
- sed -i '/^\[SourceDisksFiles.'"$arch"'\]/s/$/\niaAHCI.inf = 1,,,,,,,1,0,0/' "$target/TXTSETUP.SIF"
- sed -i '/^\[SCSI\]/s/$/\niaStor=\"Intel\(R\) SATA RAID\/AHCI Controller\"/' "$target/TXTSETUP.SIF"
- sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_8086\&DEV_2922\&CC_0106=\"iaStor\"/' "$target/TXTSETUP.SIF"
-
- rm -rf "$drivers"
-
- local pid file setup
- setup=$(find "$target" -maxdepth 1 -type f -iname setupp.ini | head -n 1)
- pid=$(<"$setup")
- pid="${pid:(-4)}"
- pid="${pid:0:3}"
-
- if [[ "$pid" == "270" ]]; then
- warn "this version of $desc requires a volume license key (VLK), it will ask for one during installation."
- fi
+ mkdir -p "$dir/\$OEM\$"
if ! addFolder "$dir"; then
error "Failed to add OEM folder to image!" && return 1
@@ -1294,34 +1573,18 @@ prepareInstall() {
XHEX=$(printf '%x\n' "$WIDTH")
YHEX=$(printf '%x\n' "$HEIGHT")
- local username="Docker"
- local password="*"
+ local username=""
+ local password=""
- [ -n "$PASSWORD" ] && password="$PASSWORD"
[ -n "$USERNAME" ] && username=$(echo "$USERNAME" | sed 's/[^[:alnum:]@!._-]//g')
+ [ -z "$username" ] && username="Docker"
+
+ [ -n "$PASSWORD" ] && password=$(echo "$PASSWORD" | sed 's/"//g')
+ [ -z "$password" ] && password="admin"
local ip="20.20.20.1"
[ -n "${VM_NET_IP:-}" ] && ip="${VM_NET_IP%.*}.1"
- # These are not pirated keys, they come from the official MS documentation.
- if [[ "${driver,,}" == "xp" ]]; then
- if [[ "${arch,,}" == "x86" ]]; then
- # Windows XP Professional x86 generic key (no activation, trial-only)
- [ -z "$KEY" ] && KEY="DR8GV-C8V6J-BYXHG-7PYJR-DB66Y"
- else
- # Windows XP Professional x64 generic key (no activation, trial-only)
- [ -z "$KEY" ] && KEY="B2RBK-7KPT9-4JP6X-QQFWM-PJD6G"
- fi
- else
- if [[ "${arch,,}" == "x86" ]]; then
- # Windows Server 2003 Standard x86 generic key (no activation, trial-only)
- [ -z "$KEY" ] && KEY="QKDCQ-TP2JM-G4MDG-VR6F2-P9C48"
- else
- # Windows Server 2003 Standard x64 generic key (no activation, trial-only)
- [ -z "$KEY" ] && KEY="P4WJG-WK3W7-3HM8W-RWHCK-8JTRY"
- fi
- fi
-
find "$target" -maxdepth 1 -type f -iname winnt.sif -exec rm {} \;
{ echo "[Data]"
@@ -1359,7 +1622,7 @@ prepareInstall() {
echo " FullName=\"$username\""
echo " ComputerName=\"*\""
echo " OrgName=\"Windows for Docker\""
- echo " ProductKey=$KEY"
+ echo " $KEY"
echo ""
echo "[Identification]"
echo " JoinWorkgroup = WORKGROUP"
@@ -1409,21 +1672,24 @@ prepareInstall() {
echo "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\GloballyOpenPorts\List]"
echo "\"3389:TCP\"=\"3389:TCP:*:Enabled:@xpsp2res.dll,-22009\""
echo ""
- echo "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]"
- echo "\"LimitBlankPasswordUse\"=dword:00000000"
- echo ""
echo "[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Tour]"
echo "\"RunCount\"=dword:00000000"
echo ""
echo "[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]"
echo "\"HideFileExt\"=dword:00000000"
echo ""
+ echo "[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer]"
+ echo "\"NoWelcomeScreen\"=\"1\""
+ echo ""
+ echo "[HKEY_CURRENT_USER\Software\Microsoft\Internet Connection Wizard]"
+ echo "\"Completed\"=\"1\""
+ echo "\"Desktopchanged\"=\"1\""
+ echo ""
echo "[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]"
- echo "\"DefaultUserName\"=\"$username\""
- echo "\"DefaultDomainName\"=\"Dockur\""
- echo "\"AltDefaultUserName\"=\"$username\""
- echo "\"AltDefaultDomainName\"=\"Dockur\""
echo "\"AutoAdminLogon\"=\"1\""
+ echo "\"DefaultUserName\"=\"$username\""
+ echo "\"DefaultPassword\"=\"$password\""
+ echo "\"DefaultDomainName\"=\"Dockur\""
echo ""
echo "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{23A77BF7-ED96-40EC-AF06-9B1F4867732A}\0000]"
echo "\"DefaultSettings.BitsPerPel\"=dword:00000020"
@@ -1442,11 +1708,18 @@ prepareInstall() {
echo ""
} | unix2dos > "$dir/\$OEM\$/install.reg"
+ if [[ "$driver" == "2k" ]]; then
+ { echo "[HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Runonce]"
+ echo "\"^SetupICWDesktop\"=-"
+ echo ""
+ } | unix2dos >> "$dir/\$OEM\$/install.reg"
+ fi
+
if [[ "$driver" == "2k3" ]]; then
{ echo "[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\srvWiz]"
echo "@=dword:00000000"
echo ""
- echo "[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ServerOOBE\SecurityOOBE]"
+ echo "[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ServerOOBE\SecurityOOBE]"
echo "\"DontLaunchSecurityOOBE\"=dword:00000000"
echo ""
} | unix2dos >> "$dir/\$OEM\$/install.reg"
@@ -1494,11 +1767,13 @@ prepareInstall() {
echo ""
echo "Call Domain.MoveHere(LocalAdminADsPath, \"$username\")"
echo ""
- echo "Set oFSO = CreateObject(\"Scripting.FileSystemObject\")"
- echo "Set oHosts = oFSO.GetFile(\"C:\Windows\System32\drivers\etc\hosts\")"
- echo "Set fileAPPEND = oFSO.OpenTextFile(\"C:\Windows\System32\drivers\etc\hosts\", 8, true)"
- echo "fileAPPEND.Write(\"$ip host.lan\")"
- echo "fileAPPEND.Close()"
+ echo "With (CreateObject(\"Scripting.FileSystemObject\"))"
+ echo " SysRoot = WshShell.ExpandEnvironmentStrings(\"%SystemRoot%\")"
+ echo " Set oFile = .OpenTextFile(SysRoot & \"\system32\drivers\etc\hosts\", 8, true)"
+ echo " oFile.Write(\"$ip host.lan\")"
+ echo " oFile.Close()"
+ echo " Set oFile = Nothing"
+ echo "End With"
echo ""
} | unix2dos > "$dir/\$OEM\$/admin.vbs"
@@ -1539,34 +1814,59 @@ prepareLegacy() {
detectLegacy() {
local dir="$1"
- local find find2
+ local find
- find=$(find "$dir" -maxdepth 1 -type d -iname win95 | head -n 1)
+ find=$(find "$dir" -maxdepth 1 -type d -iname WIN95 -print -quit)
[ -n "$find" ] && DETECTED="win95" && return 0
- find=$(find "$dir" -maxdepth 1 -type d -iname win98 | head -n 1)
+ find=$(find "$dir" -maxdepth 1 -type d -iname WIN98 -print -quit)
[ -n "$find" ] && DETECTED="win98" && return 0
- find=$(find "$dir" -maxdepth 1 -type d -iname win9x | head -n 1)
+ find=$(find "$dir" -maxdepth 1 -type d -iname WIN9X -print -quit)
[ -n "$find" ] && DETECTED="win9x" && return 0
- find=$(find "$dir" -maxdepth 1 -type f -iname cdrom_nt.5 | head -n 1)
- [ -n "$find" ] && DETECTED="win2k" && return 0
+ find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_W.40 -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_S.40 -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_TS.40 -print -quit)
+ [ -n "$find" ] && DETECTED="winnt4" && return 0
- find=$(find "$dir" -maxdepth 1 -type d -iname win51 | head -n 1)
- find2=$(find "$dir" -maxdepth 1 -type f -iname setupxp.htm | head -n 1)
+ find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_NT.5 -print -quit)
+
+ if [ -n "$find" ]; then
+
+ find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_IA.5 -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_ID.5 -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_IP.5 -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname CDROM_IS.5 -print -quit)
+ [ -n "$find" ] && DETECTED="win2k" && return 0
- if [ -n "$find" ] || [ -n "$find2" ] || [ -f "$dir/WIN51AP" ] || [ -f "$dir/WIN51IC" ]; then
- [ -d "$dir/AMD64" ] && DETECTED="winxpx64" && return 0
- DETECTED="winxpx86" && return 0
fi
- if [ -f "$dir/WIN51IA" ] || [ -f "$dir/WIN51IB" ] || [ -f "$dir/WIN51ID" ] || [ -f "$dir/WIN51IL" ] || [ -f "$dir/WIN51IS" ]; then
- DETECTED="win2003r2" && return 0
- fi
+ find=$(find "$dir" -maxdepth 1 -iname WIN51 -print -quit)
+
+ if [ -n "$find" ]; then
+
+ find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AP -print -quit)
+ [ -n "$find" ] && DETECTED="winxpx64" && return 0
+
+ find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IC -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IP -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname setupxp.htm -print -quit)
+ [ -n "$find" ] && DETECTED="winxpx86" && return 0
+
+ find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IS -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IA -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IB -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51ID -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IL -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51IS -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AA -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AD -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51AS -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51MA -print -quit)
+ [ -z "$find" ] && find=$(find "$dir" -maxdepth 1 -type f -iname WIN51MD -print -quit)
+ [ -n "$find" ] && DETECTED="win2003r2" && return 0
- if [ -f "$dir/WIN51AA" ] || [ -f "$dir/WIN51AD" ] || [ -f "$dir/WIN51AS" ] || [ -f "$dir/WIN51MA" ] || [ -f "$dir/WIN51MD" ]; then
- DETECTED="win2003r2" && return 0
fi
return 1
@@ -1595,7 +1895,9 @@ setMachine() {
"win9"* )
ETFS="[BOOT]/Boot-1.44M.img" ;;
"win2k"* )
- ETFS="[BOOT]/Boot-NoEmul.img" ;;
+ if ! prepareInstall "$iso" "$dir" "$desc" "2k"; then
+ error "Failed to prepare $desc ISO!" && return 1
+ fi ;;
"winxp"* )
if ! prepareInstall "$iso" "$dir" "$desc" "xp"; then
error "Failed to prepare $desc ISO!" && return 1
@@ -1607,10 +1909,20 @@ setMachine() {
esac
case "${id,,}" in
- "win9"* | "win2k"* )
+ "win9"* )
+ USB="no"
+ VGA="cirrus"
DISK_TYPE="auto"
+ ADAPTER="rtl8139"
MACHINE="pc-i440fx-2.4"
BOOT_MODE="windows_legacy" ;;
+ "win2k"* )
+ VGA="cirrus"
+ MACHINE="pc"
+ USB="pci-ohci"
+ DISK_TYPE="auto"
+ ADAPTER="rtl8139"
+ BOOT_MODE="windows_legacy" ;;
"winxp"* | "win2003"* )
DISK_TYPE="blk"
BOOT_MODE="windows_legacy" ;;
diff --git a/src/entry.sh b/src/entry.sh
index 88d549f..17b2147 100644
--- a/src/entry.sh
+++ b/src/entry.sh
@@ -2,6 +2,7 @@
set -Eeuo pipefail
: "${APP:="Windows"}"
+: "${PLATFORM:="x64"}"
: "${BOOT_MODE:="windows"}"
: "${SUPPORT:="https://github.com/dockur/windows"}"
@@ -32,8 +33,10 @@ info "Booting ${APP}${BOOT_DESC} using QEMU v$version..."
terminal
( sleep 30; boot ) &
tail -fn +0 "$QEMU_LOG" 2>/dev/null &
-cat "$QEMU_TERM" 2> /dev/null | tee "$QEMU_PTY" &
-wait $! || :
+cat "$QEMU_TERM" 2> /dev/null | tee "$QEMU_PTY" | \
+sed -u -e 's/\x1B\[[=0-9;]*[a-z]//gi' \
+-e 's/failed to load Boot/skipped Boot/g' \
+-e 's/0): Not Found/0)/g' & wait $! || :
sleep 1 & wait $!
[ ! -f "$QEMU_END" ] && finish 0
diff --git a/src/install.sh b/src/install.sh
index a473e7b..e0be8f8 100644
--- a/src/install.sh
+++ b/src/install.sh
@@ -10,21 +10,31 @@ EFISYS="efi/microsoft/boot/efisys_noprompt.bin"
skipInstall() {
local iso="$1"
+ local method=""
local magic byte
local boot="$STORAGE/windows.boot"
local previous="$STORAGE/windows.base"
if [ -f "$previous" ]; then
previous=$(<"$previous")
+ previous="${previous//[![:print:]]/}"
if [ -n "$previous" ]; then
- previous="$STORAGE/$previous"
- if [[ "${previous,,}" != "${iso,,}" ]]; then
+ if [[ "${STORAGE,,}/${previous,,}" != "${iso,,}" ]]; then
if [ -f "$boot" ] && hasDisk; then
- info "Detected that the version was changed, but ignoring this because Windows is already installed."
- info "Please start with an empty /storage folder, if you want to install a different version of Windows."
+ if [[ "${iso,,}" == "${STORAGE,,}/windows."* ]]; then
+ method="your custom .iso file"
+ else
+ if [[ "${previous,,}" != "windows."* ]]; then
+ method="the VERSION variable"
+ fi
+ fi
+ if [ -n "$method" ]; then
+ info "Detected that $method was changed, but ignoring this because Windows is already installed."
+ info "Please start with an empty /storage folder, if you want to install a different version of Windows."
+ fi
return 0
fi
- [ -f "$previous" ] && rm -f "$previous"
+ rm -f "$STORAGE/$previous"
return 1
fi
fi
@@ -118,6 +128,8 @@ finishInstall() {
rm -f "$STORAGE/windows.old"
rm -f "$STORAGE/windows.vga"
+ rm -f "$STORAGE/windows.net"
+ rm -f "$STORAGE/windows.usb"
rm -f "$STORAGE/windows.args"
rm -f "$STORAGE/windows.base"
rm -f "$STORAGE/windows.boot"
@@ -160,10 +172,22 @@ finishInstall() {
echo "$ARGS" > "$STORAGE/windows.args"
fi
+ if [ -n "${VGA:-}" ] && [[ "${VGA:-}" != "virtio"* ]]; then
+ echo "$VGA" > "$STORAGE/windows.vga"
+ fi
+
+ if [ -n "${USB:-}" ] && [[ "${USB:-}" != "qemu-xhci"* ]]; then
+ echo "$USB" > "$STORAGE/windows.usb"
+ fi
+
if [ -n "${DISK_TYPE:-}" ] && [[ "${DISK_TYPE:-}" != "scsi" ]]; then
echo "$DISK_TYPE" > "$STORAGE/windows.type"
fi
+ if [ -n "${ADAPTER:-}" ] && [[ "${ADAPTER:-}" != "virtio-net-pci" ]]; then
+ echo "$ADAPTER" > "$STORAGE/windows.net"
+ fi
+
rm -rf "$TMP"
return 0
}
@@ -175,8 +199,9 @@ abortInstall() {
local efi
[[ "${iso,,}" == *".esd" ]] && exit 60
+ [[ "${UNPACK:-}" == [Yy1]* ]] && exit 60
- efi=$(find "$dir" -maxdepth 1 -type d -iname efi | head -n 1)
+ efi=$(find "$dir" -maxdepth 1 -type d -iname efi -print -quit)
if [ -z "$efi" ]; then
[[ "${PLATFORM,,}" == "x64" ]] && BOOT_MODE="windows_legacy"
@@ -197,19 +222,23 @@ abortInstall() {
return 1
}
-detectCustom() {
+findFile() {
- local file base
- local fname="custom.iso"
+ local dir file base
+ local fname="$1"
+ local boot="$STORAGE/windows.boot"
- CUSTOM=""
+ dir=$(find / -maxdepth 1 -type d -iname "$fname" -print -quit)
+ [ ! -d "$dir" ] && dir=$(find "$STORAGE" -maxdepth 1 -type d -iname "$fname" -print -quit)
- if [ -d "/$fname" ]; then
- error "The file /$fname has an invalid path!" && return 1
+ if [ -d "$dir" ]; then
+ if ! hasDisk || [ ! -f "$boot" ]; then
+ error "The bind $dir maps to a file that does not exist!" && return 1
+ fi
fi
- file=$(find / -maxdepth 1 -type f -iname "$fname" | head -n 1)
- [ ! -s "$file" ] && file=$(find "$STORAGE" -maxdepth 1 -type f -iname "$fname" | head -n 1)
+ file=$(find / -maxdepth 1 -type f -iname "$fname" -print -quit)
+ [ ! -s "$file" ] && file=$(find "$STORAGE" -maxdepth 1 -type f -iname "$fname" -print -quit)
if [ ! -s "$file" ] && [[ "${VERSION,,}" != "http"* ]]; then
base=$(basename "$VERSION")
@@ -225,12 +254,25 @@ detectCustom() {
[ -z "$size" ] || [[ "$size" == "0" ]] && return 0
ISO="$file"
- CUSTOM="$ISO"
+ CUSTOM="$file"
BOOT="$STORAGE/windows.$size.iso"
return 0
}
+detectCustom() {
+
+ CUSTOM=""
+
+ ! findFile "custom.iso" && return 1
+ [ -n "$CUSTOM" ] && return 0
+
+ ! findFile "boot.iso" && return 1
+ [ -n "$CUSTOM" ] && return 0
+
+ return 0
+}
+
extractESD() {
local iso="$1"
@@ -320,7 +362,7 @@ extractImage() {
local dir="$2"
local version="$3"
local desc="local ISO"
- local size size_gb space space_gb
+ local file size size_gb space space_gb
if [ -z "$CUSTOM" ]; then
desc="downloaded ISO"
@@ -359,7 +401,26 @@ extractImage() {
error "Failed to extract ISO file: $iso" && return 1
fi
- LABEL=$(isoinfo -d -i "$iso" | sed -n 's/Volume id: //p')
+ if [[ "${UNPACK:-}" != [Yy1]* ]]; then
+
+ LABEL=$(isoinfo -d -i "$iso" | sed -n 's/Volume id: //p')
+
+ else
+
+ file=$(find "$dir" -maxdepth 1 -type f -iname "*.iso" -print -quit)
+
+ if [ -z "$file" ]; then
+ error "Failed to find any .iso file in archive!" && return 1
+ fi
+
+ if ! 7z x "$file" -o"$dir" > /dev/null; then
+ error "Failed to extract archive!" && return 1
+ fi
+
+ LABEL=$(isoinfo -d -i "$file" | sed -n 's/Volume id: //p')
+ rm -f "$file"
+
+ fi
return 0
}
@@ -494,7 +555,7 @@ setXML() {
local file="/custom.xml"
if [ -d "$file" ]; then
- warn "The file $file has an invalid path!"
+ error "The bind $file maps to a file that does not exist!" && exit 67
fi
[ ! -f "$file" ] || [ ! -s "$file" ] && file="$STORAGE/custom.xml"
@@ -541,14 +602,14 @@ detectImage() {
fi
local src wim info
- src=$(find "$dir" -maxdepth 1 -type d -iname sources | head -n 1)
+ src=$(find "$dir" -maxdepth 1 -type d -iname sources -print -quit)
if [ ! -d "$src" ]; then
warn "failed to locate 'sources' folder in ISO image, $FB" && return 1
fi
- 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)
+ wim=$(find "$src" -maxdepth 1 -type f -iname install.wim -print -quit)
+ [ ! -f "$wim" ] && wim=$(find "$src" -maxdepth 1 -type f -iname install.esd -print -quit)
if [ ! -f "$wim" ]; then
warn "failed to locate 'install.wim' or 'install.esd' in ISO image, $FB" && return 1
@@ -581,6 +642,10 @@ detectImage() {
info "Detected: $desc"
setXML "" && return 0
+ if [[ "$DETECTED" == "win81x86"* ]] || [[ "$DETECTED" == "win10x86"* ]]; then
+ error "The 32-bit version of $desc is not supported!" && return 1
+ fi
+
msg="the answer file for $desc was not found ($DETECTED.xml)"
local fallback="/run/assets/${DETECTED%%-*}.xml"
@@ -669,16 +734,17 @@ updateXML() {
sed -i "s/Docker<\/Username>/$user<\/Username>/g" "$asset"
fi
- if [ -n "$PASSWORD" ]; then
- pass=$(printf '%s' "${PASSWORD}Password" | iconv -f utf-8 -t utf-16le | base64 -w 0)
- admin=$(printf '%s' "${PASSWORD}AdministratorPassword" | iconv -f utf-8 -t utf-16le | base64 -w 0)
- sed -i "s/password<\/Value>/$admin<\/Value>/g" "$asset"
- sed -i "s/true<\/PlainText>/false<\/PlainText>/g" "$asset"
- sed -z "s/.........../\n $pass<\/Value>/g" -i "$asset"
- sed -z "s/.............../\n $pass<\/Value>/g" -i "$asset"
- sed -z "s/.........../\n $admin<\/Value>/g" -i "$asset"
- sed -z "s/.............../\n $admin<\/Value>/g" -i "$asset"
- fi
+ [ -n "$PASSWORD" ] && pass="$PASSWORD" || pass="admin"
+
+ pw=$(printf '%s' "${pass}Password" | iconv -f utf-8 -t utf-16le | base64 -w 0)
+ admin=$(printf '%s' "${pass}AdministratorPassword" | iconv -f utf-8 -t utf-16le | base64 -w 0)
+
+ sed -i "s/password<\/Value>/$admin<\/Value>/g" "$asset"
+ sed -i "s/true<\/PlainText>/false<\/PlainText>/g" "$asset"
+ sed -z "s/.........../\n $pw<\/Value>/g" -i "$asset"
+ sed -z "s/.............../\n $pw<\/Value>/g" -i "$asset"
+ sed -z "s/.........../\n $admin<\/Value>/g" -i "$asset"
+ sed -z "s/.............../\n $admin<\/Value>/g" -i "$asset"
if [ -n "$EDITION" ]; then
[[ "${EDITION^^}" == "CORE" ]] && EDITION="STANDARDCORE"
@@ -726,7 +792,11 @@ addDriver() {
if [ -z "$folder" ]; then
desc=$(printVersion "$id" "$id")
- warn "no \"$driver\" driver available for \"$desc\" !" && return 0
+ if [[ "${id,,}" != *"x86"* ]]; then
+ warn "no \"$driver\" driver available for \"$desc\" !" && return 0
+ else
+ warn "no \"$driver\" driver available for the 32-bit version of \"$desc\" !" && return 0
+ fi
fi
[ ! -d "$path/$driver/$folder" ] && return 0
@@ -764,7 +834,7 @@ addDrivers() {
warn "Windows version unknown, falling back to Windows 11 drivers..."
fi
- if ! bsdtar -xf /drivers.txz -C "$drivers"; then
+ if ! bsdtar -xf /var/drivers.txz -C "$drivers"; then
error "Failed to extract drivers from archive!" && return 1
fi
@@ -833,14 +903,14 @@ updateImage() {
rm -rf "$tmp"
mkdir -p "$tmp"
- src=$(find "$dir" -maxdepth 1 -type d -iname sources | head -n 1)
+ src=$(find "$dir" -maxdepth 1 -type d -iname sources -print -quit)
if [ ! -d "$src" ]; then
error "failed to locate 'sources' folder in ISO image, $FB" && return 1
fi
- 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)
+ wim=$(find "$src" -maxdepth 1 -type f -iname boot.wim -print -quit)
+ [ ! -f "$wim" ] && wim=$(find "$src" -maxdepth 1 -type f -iname boot.esd -print -quit)
if [ ! -f "$wim" ]; then
error "failed to locate 'boot.wim' or 'boot.esd' in ISO image, $FB" && return 1
@@ -903,7 +973,7 @@ updateImage() {
local find="$file"
[[ "$MANUAL" == [Yy1]* ]] && find="$org"
- path=$(find "$dir" -maxdepth 1 -type f -iname "$find" | head -n 1)
+ path=$(find "$dir" -maxdepth 1 -type f -iname "$find" -print -quit)
if [ -f "$path" ]; then
if [[ "$MANUAL" != [Yy1]* ]]; then
@@ -1006,19 +1076,48 @@ bootWindows() {
if [ -f "$STORAGE/windows.args" ]; then
ARGS=$(<"$STORAGE/windows.args")
+ ARGS="${ARGS//[![:print:]]/}"
ARGUMENTS="$ARGS ${ARGUMENTS:-}"
fi
+ if [ -s "$STORAGE/windows.vga" ] && [ -f "$STORAGE/windows.vga" ]; then
+ if [ -z "${VGA:-}" ]; then
+ VGA=$(<"$STORAGE/windows.vga")
+ VGA="${VGA//[![:print:]]/}"
+ fi
+ fi
+
+ if [ -s "$STORAGE/windows.usb" ] && [ -f "$STORAGE/windows.usb" ]; then
+ if [ -z "${USB:-}" ]; then
+ USB=$(<"$STORAGE/windows.usb")
+ USB="${USB//[![:print:]]/}"
+ fi
+ fi
+
+ if [ -s "$STORAGE/windows.net" ] && [ -f "$STORAGE/windows.net" ]; then
+ if [ -z "${ADAPTER:-}" ]; then
+ ADAPTER=$(<"$STORAGE/windows.net")
+ ADAPTER="${ADAPTER//[![:print:]]/}"
+ fi
+ fi
+
if [ -s "$STORAGE/windows.type" ] && [ -f "$STORAGE/windows.type" ]; then
- [ -z "${DISK_TYPE:-}" ] && DISK_TYPE=$(<"$STORAGE/windows.type")
+ if [ -z "${DISK_TYPE:-}" ]; then
+ DISK_TYPE=$(<"$STORAGE/windows.type")
+ DISK_TYPE="${DISK_TYPE//[![:print:]]/}"
+ fi
fi
if [ -s "$STORAGE/windows.mode" ] && [ -f "$STORAGE/windows.mode" ]; then
BOOT_MODE=$(<"$STORAGE/windows.mode")
+ BOOT_MODE="${BOOT_MODE//[![:print:]]/}"
fi
if [ -s "$STORAGE/windows.old" ] && [ -f "$STORAGE/windows.old" ]; then
- [[ "${PLATFORM,,}" == "x64" ]] && MACHINE=$(<"$STORAGE/windows.old")
+ if [[ "${PLATFORM,,}" == "x64" ]]; then
+ MACHINE=$(<"$STORAGE/windows.old")
+ MACHINE="${MACHINE//[![:print:]]/}"
+ fi
fi
return 0
diff --git a/src/mido.sh b/src/mido.sh
index bbaa5c2..75e2e5e 100644
--- a/src/mido.sh
+++ b/src/mido.sh
@@ -93,6 +93,7 @@ download_windows() {
# uuidgen: For MacOS (installed by default) and other systems (e.g. with no /proc) that don't have a kernel interface for generating random UUIDs
session_id=$(cat /proc/sys/kernel/random/uuid 2> /dev/null || uuidgen --random)
+ session_id="${session_id//[![:print:]]/}"
# Get product edition ID for latest release of given Windows version
# Product edition ID: This specifies both the Windows release (e.g. 22H2) and edition ("multi-edition" is default, either Home/Pro/Edu/etc., we select "Pro" in the answer files) in one number
@@ -313,7 +314,7 @@ getWindows() {
info "$msg" && html "$msg"
case "${version,,}" in
- "win2008r2" | "win7${PLATFORM,,}"* | "win81${PLATFORM,,}"* | "win11${PLATFORM,,}-enterprise-iot"* | "win11${PLATFORM,,}-enterprise-ltsc"* )
+ "win2008r2" | "win81${PLATFORM,,}"* | "win11${PLATFORM,,}-enterprise-iot"* | "win11${PLATFORM,,}-enterprise-ltsc"* )
if [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-"* ]]; then
error "No download in the $language language available for $edition!"
MIDO_URL="" && return 1
@@ -341,7 +342,7 @@ getWindows() {
"win2025-eval" | "win2022-eval" | "win2019-eval" | "win2019-hv" | "win2016-eval" | "win2012r2-eval" )
download_windows_eval "$version" "$lang" "$edition" && return 0
;;
- "win7${PLATFORM,,}"* | "win81${PLATFORM,,}-enterprise"* | "win2008r2" )
+ "win81${PLATFORM,,}-enterprise"* | "win2008r2" )
;;
* ) error "Invalid VERSION specified, value \"$version\" is not recognized!" ;;
esac
@@ -471,6 +472,18 @@ getESD() {
return 0
}
+isCompressed() {
+
+ local file="$1"
+
+ case "${file,,}" in
+ *".7z" | *".zip" | *".rar" | *".lzma" | *".bz" | *".bz2" )
+ return 0 ;;
+ esac
+
+ return 1
+}
+
verifyFile() {
local iso="$1"
@@ -501,7 +514,7 @@ verifyFile() {
fi
if [[ "$hash" == "$check" ]]; then
- info "Succesfully verified ISO!" && return 0
+ info "Successfully verified ISO!" && return 0
fi
error "The downloaded file has an unknown $algo checksum: $hash , as the expected value was: $check. Please report this at $SUPPORT/issues"
@@ -516,9 +529,11 @@ downloadFile() {
local size="$4"
local lang="$5"
local desc="$6"
- local rc total total_gb progress domain dots space folder
+ local msg="Downloading $desc"
+ local rc total total_gb progress domain dots agent space folder
rm -f "$iso"
+ agent=$(get_agent)
if [ -n "$size" ] && [[ "$size" != "0" ]]; then
folder=$(dirname -- "$iso")
@@ -534,8 +549,8 @@ downloadFile() {
progress="--progress=dot:giga"
fi
- local msg="Downloading $desc"
html "$msg..."
+ /run/progress.sh "$iso" "$size" "$msg ([P])..." &
domain=$(echo "$url" | awk -F/ '{print $3}')
dots=$(echo "$domain" | tr -cd '.' | wc -c)
@@ -546,9 +561,8 @@ downloadFile() {
fi
info "$msg..."
- /run/progress.sh "$iso" "$size" "$msg ([P])..." &
- { wget "$url" -O "$iso" -q --timeout=30 --no-http-keep-alive --show-progress "$progress"; rc=$?; } || :
+ { wget "$url" -O "$iso" -q --timeout=30 --no-http-keep-alive --user-agent "$agent" --show-progress "$progress"; rc=$?; } || :
fKill "progress.sh"
@@ -556,16 +570,17 @@ downloadFile() {
total=$(stat -c%s "$iso")
total_gb=$(formatBytes "$total")
if [ "$total" -lt 100000000 ]; then
- error "Invalid download link: $url (is only $total_gb ?). Please report this at $SUPPORT/issues." && return 1
+ error "Invalid download link: $url (is only $total_gb ?). Please report this at $SUPPORT/issues" && return 1
fi
verifyFile "$iso" "$size" "$total" "$sum" || return 1
+ isCompressed "$url" && UNPACK="Y"
html "Download finished successfully..." && return 0
fi
msg="Failed to download $url"
(( rc == 3 )) && error "$msg , cannot write file (disk full?)" && return 1
(( rc == 4 )) && error "$msg , network failure!" && return 1
- (( rc == 8 )) && error "$msg , server issued an error response! Please report this at $SUPPORT/issues." && return 1
+ (( rc == 8 )) && error "$msg , server issued an error response! Please report this at $SUPPORT/issues" && return 1
error "$msg , reason: $rc"
return 1
@@ -583,12 +598,14 @@ downloadImage() {
local msg="Will retry after $delay seconds..."
if [[ "${version,,}" == "http"* ]]; then
+
base=$(basename "$iso")
desc=$(fromFile "$base")
downloadFile "$iso" "$version" "" "" "" "$desc" && return 0
info "$msg" && html "$msg" && sleep "$delay"
downloadFile "$iso" "$version" "" "" "" "$desc" && return 0
rm -f "$iso"
+
return 1
fi
diff --git a/src/power.sh b/src/power.sh
index 4252dd8..9ca5583 100644
--- a/src/power.sh
+++ b/src/power.sh
@@ -35,7 +35,7 @@ boot() {
grep -Fq "BOOTMGR is missing" "$QEMU_PTY" && fail="y"
fi
if [ -z "$fail" ]; then
- info "Windows started succesfully, visit http://127.0.0.1:8006/ to view the screen..."
+ info "Windows started successfully, visit http://127.0.0.1:8006/ to view the screen..."
return 0
fi
fi
diff --git a/src/samba.sh b/src/samba.sh
index cf45311..10960b3 100644
--- a/src/samba.sh
+++ b/src/samba.sh
@@ -24,10 +24,11 @@ addShare() {
local comment="$3"
mkdir -p "$dir" || return 1
+ ls -A "$dir" >/dev/null 2>&1 || return 1
if [ -z "$(ls -A "$dir")" ]; then
- chmod 777 "$dir"
+ chmod 777 "$dir" || return 1
{ echo "--------------------------------------------------------"
echo " $APP for Docker v$(