From a2121ea1ce3fb04341ec23e31fb8f4b593d0a9b2 Mon Sep 17 00:00:00 2001 From: Yaribz Date: Wed, 10 Apr 2024 14:54:01 +0200 Subject: [PATCH 1/8] Fix Windows 11 being reported as Windows 10 When running on Windows 11: - GetOSName now returns "Win11" instead of "Win10" - GetOSDisplayName now returns "Windows 11 Build ..." instead of "Windows 10 Build ..." --- Win32.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Win32.pm b/Win32.pm index 2ad726a..f57931f 100644 --- a/Win32.pm +++ b/Win32.pm @@ -560,7 +560,7 @@ sub _GetOSName { elsif ($major == 10) { if ($producttype == VER_NT_WORKSTATION) { # Build numbers from https://en.wikipedia.org/wiki/Windows_10_version_history - $os = '10'; + $os = $build < 22000 ? '10' : '11'; if (9841 <= $build && $build <= 10240) { $desc = " Version 1507"; $desc .= " (Preview Build $build)" if $build < 10240; From b47e4e1f546bb3bdca629b66c47433b21724117b Mon Sep 17 00:00:00 2001 From: Markus Demml <104694616+mardem1@users.noreply.github.com> Date: Tue, 8 Oct 2024 22:42:27 +0200 Subject: [PATCH 2/8] Improve _GetOSName for newer Windows 10 1909 to 22H2 releases. --- Win32.pm | 22 ++++++++++++++++++++-- t/GetOSName.t | 8 +++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Win32.pm b/Win32.pm index 2ad726a..3bd9624 100644 --- a/Win32.pm +++ b/Win32.pm @@ -594,6 +594,24 @@ sub _GetOSName { $desc = " Version 1903 (May 2019 Update)"; $desc .= " (Preview Build $build)" if $build < 18362; } + elsif ($build == 18363) { + $desc = " Version 1909 (November 2019 Update)"; + } + elsif ($build == 19041) { + $desc = " Version 2004 (May 2020 Update)"; + } + elsif ($build == 19042) { + $desc = " Version 20H2 (October 2020 Update)"; + } + elsif ($build == 19043) { + $desc = " Version 21H1 (May 2021 Update)"; + } + elsif ($build == 19044) { + $desc = " Version 21H2 (November 2021 Update)"; + } + elsif ($build == 19045) { + $desc = " Version 22H2 (2022 Update)"; + } else { $desc = " Build $build"; } @@ -1179,11 +1197,11 @@ Currently known values for ID MAJOR MINOR and BUILD are as follows: Windows Server 2012 2 6 2 - Windows 8.1 2 6 2 - Windows Server 2012 R2 2 6 2 - - + Windows 10 2 10 0 - Windows Server 2016 2 10 0 14393 Windows Server 2019 2 10 0 17677 - + On Windows NT 4 SP6 and later this function returns the following additional values: SPMAJOR, SPMINOR, SUITEMASK, PRODUCTTYPE. diff --git a/t/GetOSName.t b/t/GetOSName.t index 219f39a..38b8d4e 100644 --- a/t/GetOSName.t +++ b/t/GetOSName.t @@ -135,6 +135,13 @@ my @win10_tests = ( ["10 [Version 1903 (May 2019 Update) (Preview Build 18204)]", "10", 2, 10, 0, 0x00, 0, 0, 18204], ["10 [Version 1903 (May 2019 Update)]", "10", 2, 10, 0, 0x00, 0, 0, 18362], +["10 [Version 1909 (November 2019 Update)]", "10", 2, 10, 0, 0x00, 0, 0, 18363], +["10 [Version 2004 (May 2020 Update)]", "10", 2, 10, 0, 0x00, 0, 0, 19041], +["10 [Version 20H2 (October 2020 Update)]", "10", 2, 10, 0, 0x00, 0, 0, 19042], +["10 [Version 21H1 (May 2021 Update)]", "10", 2, 10, 0, 0x00, 0, 0, 19043], +["10 [Version 21H2 (November 2021 Update)]", "10", 2, 10, 0, 0x00, 0, 0, 19044], +["10 [Version 22H2 (2022 Update)]", "10", 2, 10, 0, 0x00, 0, 0, 19045], + ["2016 [Version 1607]", "2016", 2, 10, 0, 0x07, 2, 0, 14393], ["2019 [Version 1809]", "2019", 2, 10, 0, 0x07, 2, 0, 17763], @@ -209,4 +216,3 @@ sub check { check($_, Win32::PROCESSOR_ARCHITECTURE_INTEL) for @intel_tests, @dual_tests, @win10_tests; check($_, Win32::PROCESSOR_ARCHITECTURE_AMD64) for @amd64_tests, @dual_tests; check($_, Win32::PROCESSOR_ARCHITECTURE_IA64) for @ia64_tests; - From a9e3f415a3a30f94542df222c44086cf536d1950 Mon Sep 17 00:00:00 2001 From: Markus Demml <104694616+mardem1@users.noreply.github.com> Date: Tue, 8 Oct 2024 22:43:11 +0200 Subject: [PATCH 3/8] fixed wrong BUILD Id "17677" to "17763" of "Windows Server 2019" in Win32 POD --- Win32.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Win32.pm b/Win32.pm index 3bd9624..3e3a6c5 100644 --- a/Win32.pm +++ b/Win32.pm @@ -1200,7 +1200,7 @@ Currently known values for ID MAJOR MINOR and BUILD are as follows: Windows 10 2 10 0 - Windows Server 2016 2 10 0 14393 - Windows Server 2019 2 10 0 17677 + Windows Server 2019 2 10 0 17763 On Windows NT 4 SP6 and later this function returns the following additional values: SPMAJOR, SPMINOR, SUITEMASK, PRODUCTTYPE. From 147316a82a398fc53e68375ab3e84e71ede70823 Mon Sep 17 00:00:00 2001 From: Markus Demml <104694616+mardem1@users.noreply.github.com> Date: Tue, 8 Oct 2024 22:50:08 +0200 Subject: [PATCH 4/8] Improve _GetOSName for newer Windows Server (Semi) Annual Channel (AC) 1909 to 23H2 releases. --- Win32.pm | 16 ++++++++++++++++ t/GetOSName.t | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/Win32.pm b/Win32.pm index 3e3a6c5..9b83407 100644 --- a/Win32.pm +++ b/Win32.pm @@ -617,6 +617,9 @@ sub _GetOSName { } } else { + # Build numbers from https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions + # https://learn.microsoft.com/en-us/windows-server/get-started/servicing-channels-comparison#annual-channel-ac + # Long-Term Servicing Channel (LTSC) if ($build == 14393) { $os = "2016"; $desc = "Version 1607"; @@ -626,6 +629,7 @@ sub _GetOSName { $desc = "Version 1809"; } else { + # (Semi) Annual Channel (AC) $os = "Server"; if ($build == 16299) { $desc = "Version 1709"; @@ -636,6 +640,18 @@ sub _GetOSName { elsif ($build == 18362) { $desc = "Version 1903"; } + elsif ($build == 18363) { + $desc = "Version 1909"; + } + elsif ($build == 19041) { + $desc = "Version 2004"; + } + elsif ($build == 19042) { + $desc = "Version 20H2"; + } + elsif ($build == 25398) { + $desc = "Version 23H2"; + } else { $desc = "Build $build"; } diff --git a/t/GetOSName.t b/t/GetOSName.t index 38b8d4e..804df1f 100644 --- a/t/GetOSName.t +++ b/t/GetOSName.t @@ -150,6 +150,10 @@ my @win10_tests = ( # The 1809 version from the semi-annual channel will identify as "Windows Server 2019 Version 1809" #["Server [Version 1809]", "Server", 2, 10, 0, 0x07, 2, 0, 17763], ["Server [Version 1903]", "Server", 2, 10, 0, 0x07, 2, 0, 18362], +["Server [Version 1909]", "Server", 2, 10, 0, 0x07, 2, 0, 18363], +["Server [Version 2004]", "Server", 2, 10, 0, 0x07, 2, 0, 19041], +["Server [Version 20H2]", "Server", 2, 10, 0, 0x07, 2, 0, 19042], +["Server [Version 23H2]", "Server", 2, 10, 0, 0x07, 2, 0, 25398], ["Server [Build 12345]", "Server", 2, 10, 0, 0x07, 2, 0, 12345], ); From c2e93754da9a195840766a198b163d8ec8aecc31 Mon Sep 17 00:00:00 2001 From: Markus Demml <104694616+mardem1@users.noreply.github.com> Date: Tue, 8 Oct 2024 22:54:11 +0200 Subject: [PATCH 5/8] Improve _GetOSName for Windows Server 2022 LTSC releases. --- Win32.pm | 6 ++++++ t/GetOSName.t | 1 + 2 files changed, 7 insertions(+) diff --git a/Win32.pm b/Win32.pm index 9b83407..84307fe 100644 --- a/Win32.pm +++ b/Win32.pm @@ -628,6 +628,10 @@ sub _GetOSName { $os = "2019"; $desc = "Version 1809"; } + elsif ($build == 20348) { + $os = "2022"; + $desc = "Version 21H2"; + } else { # (Semi) Annual Channel (AC) $os = "Server"; @@ -1162,6 +1166,7 @@ Currently the possible values for the OS name are Win10 Win2016 Win2019 + Win2022 WinSAC This routine is just a simple interface into GetOSVersion(). More @@ -1217,6 +1222,7 @@ Currently known values for ID MAJOR MINOR and BUILD are as follows: Windows 10 2 10 0 - Windows Server 2016 2 10 0 14393 Windows Server 2019 2 10 0 17763 + Windows Server 2022 2 10 0 20348 On Windows NT 4 SP6 and later this function returns the following additional values: SPMAJOR, SPMINOR, SUITEMASK, PRODUCTTYPE. diff --git a/t/GetOSName.t b/t/GetOSName.t index 804df1f..5dac44e 100644 --- a/t/GetOSName.t +++ b/t/GetOSName.t @@ -144,6 +144,7 @@ my @win10_tests = ( ["2016 [Version 1607]", "2016", 2, 10, 0, 0x07, 2, 0, 14393], ["2019 [Version 1809]", "2019", 2, 10, 0, 0x07, 2, 0, 17763], +["2022 [Version 21H2]", "2022", 2, 10, 0, 0x07, 2, 0, 20348], ["Server [Version 1709]", "Server", 2, 10, 0, 0x07, 2, 0, 16299], ["Server [Version 1803]", "Server", 2, 10, 0, 0x07, 2, 0, 17134], From cfe15e2fd33459e1d928cdaadf510ce2e1712f45 Mon Sep 17 00:00:00 2001 From: Markus Demml <104694616+mardem1@users.noreply.github.com> Date: Tue, 8 Oct 2024 23:00:42 +0200 Subject: [PATCH 6/8] fixed GetOSDisplayName regex to add "Server" if it's 2022 server version, as already done in previous versions. --- Win32.pm | 2 +- t/GetOSName.t | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Win32.pm b/Win32.pm index 84307fe..690ff17 100644 --- a/Win32.pm +++ b/Win32.pm @@ -370,7 +370,7 @@ sub GetOSDisplayName { $desc =~ s/^\s*//; s/(200.)/$name Server $1/; } - s/^Windows (20(03|08|12|16|19))/Windows Server $1/; + s/^Windows (20(03|08|12|16|19|22))/Windows Server $1/; s/^Windows SAC/Windows Server/; } } diff --git a/t/GetOSName.t b/t/GetOSName.t index 5dac44e..1d765c4 100644 --- a/t/GetOSName.t +++ b/t/GetOSName.t @@ -181,7 +181,7 @@ sub check { # and 2003/2008 start with "Windows Server" unless ($pretty eq "Win32s") { my $prefix = "Windows"; - $prefix .= " Server" if $pretty =~ /^20(03|08|12|16|19)/; + $prefix .= " Server" if $pretty =~ /^20(03|08|12|16|19|22)/; $pretty = "$prefix $pretty"; } From bd21830ee48cd107f7d7bdba568399ac40188887 Mon Sep 17 00:00:00 2001 From: Markus Demml <104694616+mardem1@users.noreply.github.com> Date: Tue, 8 Oct 2024 23:06:33 +0200 Subject: [PATCH 7/8] Improve _GetOSName for Windows 11 21H2 to 24H2 releases. --- Win32.pm | 22 ++++++++++++++++++++++ t/GetOSName.t | 5 +++++ 2 files changed, 27 insertions(+) diff --git a/Win32.pm b/Win32.pm index 690ff17..ba38037 100644 --- a/Win32.pm +++ b/Win32.pm @@ -612,6 +612,26 @@ sub _GetOSName { elsif ($build == 19045) { $desc = " Version 22H2 (2022 Update)"; } + # Build numbers from https://en.wikipedia.org/wiki/Windows_11_version_history + elsif ($build >= 22000) { + # windows 11 + $os = '11'; + if ($build == 22000) { + $desc = " Version 21H2 (2021 Update)"; + } + elsif ($build == 22621) { + $desc = " Version 22H2 (2022 Update)"; + } + elsif ($build == 22631) { + $desc = " Version 23H2 (2023 Update)"; + } + elsif ($build == 26100) { + $desc = " Version 24H2 (2024 Update)"; + } + else { + $desc = " Build $build"; + } + } else { $desc = " Build $build"; } @@ -1167,6 +1187,7 @@ Currently the possible values for the OS name are Win2016 Win2019 Win2022 + Win11 WinSAC This routine is just a simple interface into GetOSVersion(). More @@ -1223,6 +1244,7 @@ Currently known values for ID MAJOR MINOR and BUILD are as follows: Windows Server 2016 2 10 0 14393 Windows Server 2019 2 10 0 17763 Windows Server 2022 2 10 0 20348 + Windows 11 2 10 0 - On Windows NT 4 SP6 and later this function returns the following additional values: SPMAJOR, SPMINOR, SUITEMASK, PRODUCTTYPE. diff --git a/t/GetOSName.t b/t/GetOSName.t index 1d765c4..70a6c6d 100644 --- a/t/GetOSName.t +++ b/t/GetOSName.t @@ -142,6 +142,11 @@ my @win10_tests = ( ["10 [Version 21H2 (November 2021 Update)]", "10", 2, 10, 0, 0x00, 0, 0, 19044], ["10 [Version 22H2 (2022 Update)]", "10", 2, 10, 0, 0x00, 0, 0, 19045], +["11 [Version 21H2 (2021 Update)]", "11", 2, 10, 0, 0x00, 0, 0, 22000], +["11 [Version 22H2 (2022 Update)]", "11", 2, 10, 0, 0x00, 0, 0, 22621], +["11 [Version 23H2 (2023 Update)]", "11", 2, 10, 0, 0x00, 0, 0, 22631], +["11 [Version 24H2 (2024 Update)]", "11", 2, 10, 0, 0x00, 0, 0, 26100], + ["2016 [Version 1607]", "2016", 2, 10, 0, 0x07, 2, 0, 14393], ["2019 [Version 1809]", "2019", 2, 10, 0, 0x07, 2, 0, 17763], ["2022 [Version 21H2]", "2022", 2, 10, 0, 0x07, 2, 0, 20348], From e58a75a4c231266b613e4ba54a62f706c151d5e8 Mon Sep 17 00:00:00 2001 From: Markus Demml <104694616+mardem1@users.noreply.github.com> Date: Tue, 8 Oct 2024 23:21:36 +0200 Subject: [PATCH 8/8] Improve _GetOSName removed unneeded if block, because of early win 10/11 decision. --- Win32.pm | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/Win32.pm b/Win32.pm index 0b7d390..6fe3fdb 100644 --- a/Win32.pm +++ b/Win32.pm @@ -559,8 +559,10 @@ sub _GetOSName { } elsif ($major == 10) { if ($producttype == VER_NT_WORKSTATION) { - # Build numbers from https://en.wikipedia.org/wiki/Windows_10_version_history $os = $build < 22000 ? '10' : '11'; + + # Build numbers from https://en.wikipedia.org/wiki/Windows_10_version_history + # windows 10 if (9841 <= $build && $build <= 10240) { $desc = " Version 1507"; $desc .= " (Preview Build $build)" if $build < 10240; @@ -613,24 +615,18 @@ sub _GetOSName { $desc = " Version 22H2 (2022 Update)"; } # Build numbers from https://en.wikipedia.org/wiki/Windows_11_version_history - elsif ($build >= 22000) { - # windows 11 - $os = '11'; - if ($build == 22000) { - $desc = " Version 21H2 (2021 Update)"; - } - elsif ($build == 22621) { - $desc = " Version 22H2 (2022 Update)"; - } - elsif ($build == 22631) { - $desc = " Version 23H2 (2023 Update)"; - } - elsif ($build == 26100) { - $desc = " Version 24H2 (2024 Update)"; - } - else { - $desc = " Build $build"; - } + # windows 11 + elsif ($build == 22000) { + $desc = " Version 21H2 (2021 Update)"; + } + elsif ($build == 22621) { + $desc = " Version 22H2 (2022 Update)"; + } + elsif ($build == 22631) { + $desc = " Version 23H2 (2023 Update)"; + } + elsif ($build == 26100) { + $desc = " Version 24H2 (2024 Update)"; } else { $desc = " Build $build";