1use strict; 2use Test::More; 3use Win32; 4 5# The "description" value is extracted from the $pretty field: 6# 7# "2000 [Server]" => "Server" 8# "{Home Server}" => "Windows Home Server" (prefixed with "Windows ") 9# "Anything R2" => "R2 Anything" (R2 moved to front) 10# 11# The "display name" value is the same as the $pretty field, 12# prefixed by "Windows ", with all "[]{}" characters removed. 13 14# $pretty, $os $id, $major, $minor, $sm, $pt, $metric 15 16my @intel_tests = ( 17["Win32s", "Win32s", 0 ], 18 19["95", "95", 1, 4, 0 ], 20["98", "98", 1, 4, 10 ], 21["Me", "Me", 1, 4, 90 ], 22 23["NT 3.51", "NT3.51", 2, 3, 51 ], 24["NT 4", "NT4", 2, 4, 0 ], 25 26["2000 [Professional]", "2000", 2, 5, 0, 0x0000, 1, 0], 27["2000 [Server]", "2000", 2, 5, 0, 0x0000, 2, 0], 28["[Small Business Server] 2000", "2000", 2, 5, 0, 0x0020, 2, 0], 29["2000 [Advanced Server]", "2000", 2, 5, 0, 0x0002, 2, 0], 30["2000 [Datacenter Server]", "2000", 2, 5, 0, 0x0080, 2, 0], 31 32["XP [Home Edition]", "XP/.Net", 2, 5, 1, 0x0200, 1, 0], 33["XP [Professional]", "XP/.Net", 2, 5, 1, 0x0000, 1, 0], 34["XP [Tablet PC Edition]", "XP/.Net", 2, 5, 1, 0x0000, 1, 86], 35["XP [Media Center Edition]", "XP/.Net", 2, 5, 1, 0x0000, 1, 87], 36["XP [Starter Edition]", "XP/.Net", 2, 5, 1, 0x0000, 1, 88], 37 38["2003 [Standard Edition]", "2003", 2, 5, 2, 0x0000, 2, 0], 39["[Small Business Server] 2003", "2003", 2, 5, 2, 0x0020, 2, 0], 40["{Storage Server} 2003", "2003", 2, 5, 2, 0x2000, 2, 0], 41["{Home Server}", "2003", 2, 5, 2, 0x8000, 2, 0], 42 43["{Compute Cluster Server} 2003", "2003", 2, 5, 2, 0x4000, 2, 0], 44["2003 [Datacenter Edition]", "2003", 2, 5, 2, 0x0080, 2, 0], 45["2003 [Enterprise Edition]", "2003", 2, 5, 2, 0x0002, 2, 0], 46["2003 [Web Edition]", "2003", 2, 5, 2, 0x0400, 2, 0], 47 48["2003 [R2 Standard Edition]", "2003", 2, 5, 2, 0x0000, 2, 89], 49["[Small Business Server] 2003 R2", "2003", 2, 5, 2, 0x0020, 2, 89], 50["{Storage Server} 2003 R2", "2003", 2, 5, 2, 0x2000, 2, 89], 51# ??? test for more R2 versions? 52); 53 54my @amd64_tests = ( 55["{XP Professional x64 Edition}", "2003", 2, 5, 2, 0x0000, 1, 0], 56["2003 [Datacenter x64 Edition]", "2003", 2, 5, 2, 0x0080, 2, 0], 57["2003 [Enterprise x64 Edition]", "2003", 2, 5, 2, 0x0002, 2, 0], 58["2003 [Standard x64 Edition]", "2003", 2, 5, 2, 0x0000, 2, 0], 59); 60 61my @dual_tests = ( 62["Vista", "Vista", 2, 6, 0 ], 63 64["Vista [Starter]", "Vista", 2, 6, 0, 0x0b ], 65["Vista [Home Basic]", "Vista", 2, 6, 0, 0x02 ], 66["Vista [Home Premium]", "Vista", 2, 6, 0, 0x03 ], 67["Vista [Business]", "Vista", 2, 6, 0, 0x06 ], 68["Vista [Enterprise]", "Vista", 2, 6, 0, 0x04 ], 69["Vista [Ultimate]", "Vista", 2, 6, 0, 0x01 ], 70 71#["Vista Business for Embedded Systems", "Vista", 2, 6, 0 ], 72#["Vista Ultimate for Embedded Systems", "Vista", 2, 6, 0 ], 73 74["2008 [Standard]", "2008", 2, 6, 0, 0x07, 2 ], 75["2008 [Enterprise]", "2008", 2, 6, 0, 0x04, 2 ], 76["[HPC Server] 2008", "2008", 2, 6, 0, 0x12, 2 ], 77["[Web Server] 2008", "2008", 2, 6, 0, 0x11, 2 ], 78#["[Storage Server] 2008", "2008", 2, 6, 0, ????, 2 ], 79["[Small Business Server] 2008", "2008", 2, 6, 0, 0x09, 2, 0 ], 80 81# * Windows Server 2008 Standard (x86 and x86-64) 82# * Windows Server 2008 Enterprise (x86 and x86-64) 83# * Windows HPC Server 2008 (replacing Windows Compute Cluster Server 2003) 84# * Windows Web Server 2008 (x86 and x86-64) 85# * Windows Storage Server 2008 (x86 and x86-64) 86# * Windows Small Business Server 2008 (Codenamed "Cougar") (x86-64) for small businesses 87# * Windows Essential Business Server 2008 (Codenamed "Centro") (x86-64) for medium-sized businesses [25] 88# * Windows Server 2008 for Itanium-based Systems 89# * Windows Server 2008 Foundation 90# 91# Server Core is available in the Web, Standard, Enterprise and Datacenter editions. 92 93["7", "7", 2, 6, 1 ], 94["7 [Starter]", "7", 2, 6, 1, 0x0b ], 95["7 [Home Basic]", "7", 2, 6, 1, 0x02 ], 96["7 [Home Premium]", "7", 2, 6, 1, 0x03 ], 97["7 [Professional]", "7", 2, 6, 1, 0x06 ], 98["7 [Professional]", "7", 2, 6, 1, 0x30 ], 99["7 [Enterprise]", "7", 2, 6, 1, 0x04 ], 100["7 [Ultimate]", "7", 2, 6, 1, 0x01 ], 101 102["8", "8", 2, 6, 2 ], 103["2008 [R2]", "2008", 2, 6, 1, 0x00, 2, 89 ], 104["2012", "2012", 2, 6, 2, 0x00, 2, 89 ], 105["[Small Business Server] 2008 R2", "2008", 2, 6, 1, 0x09, 2, 89 ], 106 107["8.1", "8.1", 2, 6, 3 ], 108["2012 [R2]", "2012", 2, 6, 3, 0x00, 2, 89 ], 109 110["10", "10", 2, 10, 0 ], 111 112); 113 114my @ia64_tests = ( 115["2003 [Datacenter Edition for Itanium-based Systems]", "2003", 2, 5, 2, 0x0080, 2, 0], 116["2003 [Enterprise Edition for Itanium-based Systems]", "2003", 2, 5, 2, 0x0002, 2, 0], 117); 118 119plan tests => 6 * (@intel_tests + @amd64_tests + 2*@dual_tests + @ia64_tests); 120 121# Test internal implementation function 122sub check { 123 my($test, $arch) = @_; 124 my($pretty, $expect, $id, $major, $minor, $sm, $pt, $metrics) = @$test; 125 $metrics = [$metrics] if defined($metrics) && not ref $metrics; 126 127 my $tag = ""; 128 ($pretty, $tag) = ("$1$2$3", "$2") if $pretty =~ /^(.*)\[(.*)\](.*)$/; 129 ($pretty, $tag) = ("$1$2$3", "Windows $2") if $pretty =~ /^(.*)\{(.*)\}(.*)$/; 130 $tag = "R2 $tag" if $tag !~ /R2/ && $pretty =~ /R2$/; 131 132 # All display names start with "Windows"; 133 # and 2003/2008 start with "Windows Server" 134 unless ($pretty eq "Win32s") { 135 my $prefix = "Windows"; 136 $prefix .= " Server" if $pretty =~ /^20(03|08|12)/; 137 $pretty = "$prefix $pretty"; 138 } 139 140 # @dual_tests: Vista and later all come in both 32-bit and 64-bit versions 141 if ($id == 2 && $major >= 6) { 142 my $suffix = ""; 143 $suffix = " (32-bit)" if $arch == Win32::PROCESSOR_ARCHITECTURE_INTEL; 144 $suffix = " (64-bit)" if $arch == Win32::PROCESSOR_ARCHITECTURE_AMD64; 145 $_ .= $suffix for $pretty, $tag; 146 $tag =~ s/^\s*//; 147 } 148 149 # We pass the same value for $suitemask and $productinfo. The former is 150 # used for Windows up to 2003, the latter is used for Vista and later. 151 my($os, $desc) = Win32::_GetOSName("", $major||0, $minor||0, 0, 152 $id, $sm||0, $pt||1, $sm||0, $arch, $metrics); 153 my $display = Win32::GetOSDisplayName($os, $desc); 154 155 note($pretty) if defined ¬e; 156 is($display, $pretty); 157 is($os, "Win$expect", "os: $os"); 158 is($desc, $tag, "desc: $desc"); 159 160 my $sp = "Service Pack 42"; 161 ($os, $desc) = Win32::_GetOSName($sp, $major||0, $minor||0, 0, 162 $id, $sm||0, $pt||1, $sm||0, $arch, $metrics); 163 $display = Win32::GetOSDisplayName($os, $desc); 164 165 is($display, "$pretty $sp", "display: $display"); 166 is($os, "Win$expect", "os: $os"); 167 $expect = length($tag) ? "$tag $sp" : $sp; 168 is($desc, $expect, "desc: $desc"); 169} 170 171check($_, Win32::PROCESSOR_ARCHITECTURE_INTEL) for @intel_tests, @dual_tests; 172check($_, Win32::PROCESSOR_ARCHITECTURE_AMD64) for @amd64_tests, @dual_tests; 173check($_, Win32::PROCESSOR_ARCHITECTURE_IA64) for @ia64_tests; 174 175