diff --git a/Win32.pm b/Win32.pm index 2ad726a..6fe3fdb 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/; } } @@ -559,8 +559,10 @@ sub _GetOSName { } elsif ($major == 10) { if ($producttype == VER_NT_WORKSTATION) { + $os = $build < 22000 ? '10' : '11'; + # Build numbers from https://en.wikipedia.org/wiki/Windows_10_version_history - $os = '10'; + # windows 10 if (9841 <= $build && $build <= 10240) { $desc = " Version 1507"; $desc .= " (Preview Build $build)" if $build < 10240; @@ -594,11 +596,46 @@ 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)"; + } + # Build numbers from https://en.wikipedia.org/wiki/Windows_11_version_history + # 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"; } } 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"; @@ -607,7 +644,12 @@ sub _GetOSName { $os = "2019"; $desc = "Version 1809"; } + elsif ($build == 20348) { + $os = "2022"; + $desc = "Version 21H2"; + } else { + # (Semi) Annual Channel (AC) $os = "Server"; if ($build == 16299) { $desc = "Version 1709"; @@ -618,6 +660,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"; } @@ -1128,6 +1182,8 @@ Currently the possible values for the OS name are Win10 Win2016 Win2019 + Win2022 + Win11 WinSAC This routine is just a simple interface into GetOSVersion(). More @@ -1179,11 +1235,13 @@ 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 - + 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 219f39a..70a6c6d 100644 --- a/t/GetOSName.t +++ b/t/GetOSName.t @@ -135,14 +135,31 @@ 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], + +["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], ["Server [Version 1709]", "Server", 2, 10, 0, 0x07, 2, 0, 16299], ["Server [Version 1803]", "Server", 2, 10, 0, 0x07, 2, 0, 17134], # 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], ); @@ -169,7 +186,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"; } @@ -209,4 +226,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; -