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