root / tmp / org.txm.setups / nsis / Include / WinVer.nsh @ 3128
Historique | Voir | Annoter | Télécharger (18,09 ko)
1 | 728 | mdecorde | ; --------------------- |
---|---|---|---|
2 | 728 | mdecorde | ; WinVer.nsh |
3 | 728 | mdecorde | ; --------------------- |
4 | 728 | mdecorde | ; |
5 | 728 | mdecorde | ; LogicLib extensions for handling Windows versions and service packs. |
6 | 728 | mdecorde | ; |
7 | 728 | mdecorde | ; IsNT checks if the installer is running on Windows NT family (NT4, 2000, XP, etc.) |
8 | 728 | mdecorde | ; |
9 | 728 | mdecorde | ; ${If} ${IsNT} |
10 | 728 | mdecorde | ; DetailPrint "Running on NT. Installing Unicode enabled application." |
11 | 728 | mdecorde | ; ${Else} |
12 | 728 | mdecorde | ; DetailPrint "Not running on NT. Installing ANSI application." |
13 | 728 | mdecorde | ; ${EndIf} |
14 | 728 | mdecorde | ; |
15 | 2956 | mdecorde | ; IsServerOS checks if the installer is running on a server version of Windows (2000, 2003, 2008, etc.) |
16 | 2956 | mdecorde | ; IsDomainController checks if the server is a domain controller |
17 | 728 | mdecorde | ; |
18 | 728 | mdecorde | ; AtLeastWin<version> checks if the installer is running on Windows version at least as specified. |
19 | 728 | mdecorde | ; IsWin<version> checks if the installer is running on Windows version exactly as specified. |
20 | 728 | mdecorde | ; AtMostWin<version> checks if the installer is running on Windows version at most as specified. |
21 | 2956 | mdecorde | ; AtLeastBuild <number> checks if the installer is running on a Windows version with a minimum build number. |
22 | 2956 | mdecorde | ; AtMostBuild <number> checks if the installer is running on a Windows version with a maximum build number. |
23 | 2956 | mdecorde | ; AtLeastWaaS <name> and AtMostWaaS <name> checks Windows 10 "friendly names" against the build number. |
24 | 728 | mdecorde | ; |
25 | 728 | mdecorde | ; <version> can be replaced with the following values: |
26 | 728 | mdecorde | ; |
27 | 728 | mdecorde | ; 95 |
28 | 728 | mdecorde | ; 98 |
29 | 728 | mdecorde | ; ME |
30 | 728 | mdecorde | ; |
31 | 728 | mdecorde | ; NT4 |
32 | 728 | mdecorde | ; 2000 |
33 | 728 | mdecorde | ; XP |
34 | 728 | mdecorde | ; 2003 |
35 | 728 | mdecorde | ; Vista |
36 | 728 | mdecorde | ; 2008 |
37 | 728 | mdecorde | ; 7 |
38 | 728 | mdecorde | ; 2008R2 |
39 | 728 | mdecorde | ; 8 |
40 | 728 | mdecorde | ; 2012 |
41 | 2956 | mdecorde | ; 8.1 |
42 | 2956 | mdecorde | ; 2012R2 |
43 | 2956 | mdecorde | ; 10 |
44 | 728 | mdecorde | ; |
45 | 2956 | mdecorde | ; Note: Windows 8.1 and later will be detected as Windows 8 unless ManifestSupportedOS is set correctly! |
46 | 2956 | mdecorde | ; |
47 | 728 | mdecorde | ; AtLeastServicePack checks if the installer is running on Windows service pack version at least as specified. |
48 | 728 | mdecorde | ; IsServicePack checks if the installer is running on Windows service pack version exactly as specified. |
49 | 728 | mdecorde | ; AtMostServicePack checks if the installer is running on Windows service version pack at most as specified. |
50 | 728 | mdecorde | ; |
51 | 728 | mdecorde | ; Usage examples: |
52 | 728 | mdecorde | ; |
53 | 728 | mdecorde | ; ${If} ${IsNT} |
54 | 728 | mdecorde | ; DetailPrint "Running on NT family." |
55 | 728 | mdecorde | ; DetailPrint "Surely not running on 95, 98 or ME." |
56 | 728 | mdecorde | ; ${AndIf} ${AtLeastWinNT4} |
57 | 728 | mdecorde | ; DetailPrint "Running on NT4 or better. Could even be 2003." |
58 | 728 | mdecorde | ; ${EndIf} |
59 | 728 | mdecorde | ; |
60 | 728 | mdecorde | ; ${If} ${AtLeastWinXP} |
61 | 728 | mdecorde | ; DetailPrint "Running on XP or better." |
62 | 728 | mdecorde | ; ${EndIf} |
63 | 728 | mdecorde | ; |
64 | 728 | mdecorde | ; ${If} ${IsWin2000} |
65 | 728 | mdecorde | ; DetailPrint "Running on 2000." |
66 | 728 | mdecorde | ; ${EndIf} |
67 | 728 | mdecorde | ; |
68 | 728 | mdecorde | ; ${If} ${IsWin2000} |
69 | 728 | mdecorde | ; ${AndIf} ${AtLeastServicePack} 3 |
70 | 728 | mdecorde | ; ${OrIf} ${AtLeastWinXP} |
71 | 728 | mdecorde | ; DetailPrint "Running Win2000 SP3 or above" |
72 | 728 | mdecorde | ; ${EndIf} |
73 | 728 | mdecorde | ; |
74 | 728 | mdecorde | ; ${If} ${AtMostWinXP} |
75 | 728 | mdecorde | ; DetailPrint "Running on XP or older. Surely not running on Vista. Maybe 98, or even 95." |
76 | 728 | mdecorde | ; ${EndIf} |
77 | 728 | mdecorde | ; |
78 | 728 | mdecorde | ; Warning: |
79 | 728 | mdecorde | ; |
80 | 728 | mdecorde | ; Windows 95 and NT both use the same version number. To avoid getting NT4 misidentified |
81 | 728 | mdecorde | ; as Windows 95 and vice-versa or 98 as a version higher than NT4, always use IsNT to |
82 | 728 | mdecorde | ; check if running on the NT family. |
83 | 728 | mdecorde | ; |
84 | 728 | mdecorde | ; ${If} ${AtLeastWin95} |
85 | 2956 | mdecorde | ; ${AndIf} ${AtMostWinME} |
86 | 728 | mdecorde | ; DetailPrint "Running 95, 98 or ME." |
87 | 728 | mdecorde | ; DetailPrint "Actually, maybe it's NT4?" |
88 | 728 | mdecorde | ; ${If} ${IsNT} |
89 | 728 | mdecorde | ; DetailPrint "Yes, it's NT4! oops..." |
90 | 728 | mdecorde | ; ${Else} |
91 | 728 | mdecorde | ; DetailPrint "Nope, not NT4. phew..." |
92 | 728 | mdecorde | ; ${EndIf} |
93 | 728 | mdecorde | ; ${EndIf} |
94 | 728 | mdecorde | ; |
95 | 728 | mdecorde | ; |
96 | 728 | mdecorde | ; Other useful extensions are: |
97 | 728 | mdecorde | ; |
98 | 728 | mdecorde | ; * IsWin2003R2 |
99 | 728 | mdecorde | ; * IsStarterEdition |
100 | 728 | mdecorde | ; * OSHasMediaCenter |
101 | 728 | mdecorde | ; * OSHasTabletSupport |
102 | 728 | mdecorde | ; |
103 | 728 | mdecorde | |
104 | 728 | mdecorde | !verbose push |
105 | 728 | mdecorde | !verbose 3 |
106 | 728 | mdecorde | |
107 | 728 | mdecorde | !ifndef ___WINVER__NSH___ |
108 | 728 | mdecorde | !define ___WINVER__NSH___ |
109 | 728 | mdecorde | |
110 | 728 | mdecorde | !include LogicLib.nsh |
111 | 728 | mdecorde | !include Util.nsh |
112 | 728 | mdecorde | |
113 | 728 | mdecorde | # masks for our variables |
114 | 728 | mdecorde | |
115 | 2956 | mdecorde | !define _WINVER_VERXBIT 0x00000001 ; Used to boost $__WINVERV |
116 | 2956 | mdecorde | !define _WINVER_MASKVMAJ 0x7F000000 ; $__WINVERV mask |
117 | 2956 | mdecorde | !define _WINVER_MASKVMIN 0x00FF0000 ; $__WINVERV mask |
118 | 2956 | mdecorde | !define _WINVER_NTMASK 0x7FFFFFFF ; $__WINVERV mask used by AtMost/AtLeast |
119 | 2956 | mdecorde | !define _WINVER_NTBIT 0x80000000 ; $__WINVERV bit used by Is and $__WINVERSP bit used by IsNT |
120 | 2956 | mdecorde | !define _WINVER_NTSRVBIT 0x40000000 ; $__WINVERSP bit for !VER_NT_WORKSTATION |
121 | 2956 | mdecorde | !define _WINVER_NTDCBIT 0x20000000 ; $__WINVERSP bit for VER_NT_DOMAIN_CONTROLLER |
122 | 2956 | mdecorde | !define _WINVER_MASKVBLD 0x0000FFFF ; $__WINVERSP mask for OS build number |
123 | 2956 | mdecorde | !define _WINVER_MASKSP 0x000F0000 ; $__WINVERSP mask for OS service pack |
124 | 728 | mdecorde | |
125 | 728 | mdecorde | # possible variable values for different versions |
126 | 728 | mdecorde | |
127 | 728 | mdecorde | !define WINVER_95_NT 0x04000000 ;4.00.0950 |
128 | 728 | mdecorde | !define WINVER_95 0x04000000 ;4.00.0950 |
129 | 728 | mdecorde | !define WINVER_98_NT 0x040a0000 ;4.10.1998 |
130 | 728 | mdecorde | !define WINVER_98 0x040a0000 ;4.10.1998 |
131 | 728 | mdecorde | ;define WINVER_98SE 0x040a0000 ;4.10.2222 |
132 | 728 | mdecorde | !define WINVER_ME_NT 0x045a0000 ;4.90.3000 |
133 | 728 | mdecorde | !define WINVER_ME 0x045a0000 ;4.90.3000 |
134 | 2956 | mdecorde | ;define WINVER_NT3.51 ;3.51.1057 |
135 | 728 | mdecorde | !define WINVER_NT4_NT 0x84000000 ;4.00.1381 |
136 | 728 | mdecorde | !define WINVER_NT4 0x04000000 ;4.00.1381 |
137 | 728 | mdecorde | !define WINVER_2000_NT 0x85000000 ;5.00.2195 |
138 | 728 | mdecorde | !define WINVER_2000 0x05000000 ;5.00.2195 |
139 | 728 | mdecorde | !define WINVER_XP_NT 0x85010000 ;5.01.2600 |
140 | 728 | mdecorde | !define WINVER_XP 0x05010000 ;5.01.2600 |
141 | 728 | mdecorde | ;define WINVER_XP64 ;5.02.3790 |
142 | 728 | mdecorde | !define WINVER_2003_NT 0x85020000 ;5.02.3790 |
143 | 728 | mdecorde | !define WINVER_2003 0x05020000 ;5.02.3790 |
144 | 728 | mdecorde | !define WINVER_VISTA_NT 0x86000000 ;6.00.6000 |
145 | 728 | mdecorde | !define WINVER_VISTA 0x06000000 ;6.00.6000 |
146 | 728 | mdecorde | !define WINVER_2008_NT 0x86000001 ;6.00.6001 |
147 | 728 | mdecorde | !define WINVER_2008 0x06000001 ;6.00.6001 |
148 | 728 | mdecorde | !define WINVER_7_NT 0x86010000 ;6.01.7600 |
149 | 728 | mdecorde | !define WINVER_7 0x06010000 ;6.01.7600 |
150 | 728 | mdecorde | !define WINVER_2008R2_NT 0x86010001 ;6.01.7600 |
151 | 728 | mdecorde | !define WINVER_2008R2 0x06010001 ;6.01.7600 |
152 | 728 | mdecorde | !define WINVER_8_NT 0x86020000 ;6.02.9200 |
153 | 728 | mdecorde | !define WINVER_8 0x06020000 ;6.02.9200 |
154 | 728 | mdecorde | !define WINVER_2012_NT 0x86020001 ;6.02.9200 |
155 | 728 | mdecorde | !define WINVER_2012 0x06020001 ;6.02.9200 |
156 | 2956 | mdecorde | !define WINVER_8.1_NT 0x86030000 ;6.03.9600 |
157 | 2956 | mdecorde | !define WINVER_8.1 0x06030000 ;6.03.9600 |
158 | 2956 | mdecorde | !define WINVER_2012R2_NT 0x86030001 ;6.03.9600 |
159 | 2956 | mdecorde | !define WINVER_2012R2 0x06030001 ;6.03.9600 |
160 | 2956 | mdecorde | !define WINVER_10_NT 0x8A000000 ;10.0.10240 |
161 | 2956 | mdecorde | !define WINVER_10 0x0A000000 ;10.0.10240 |
162 | 2956 | mdecorde | !define WINVER_2016_NT 0x8A000001 ;10.0.14393 |
163 | 2956 | mdecorde | !define WINVER_2016 0x0A000001 ;10.0.14393 |
164 | 728 | mdecorde | |
165 | 728 | mdecorde | |
166 | 728 | mdecorde | # use this to make all nt > 9x |
167 | 728 | mdecorde | |
168 | 728 | mdecorde | !ifdef WINVER_NT4_OVER_W95 |
169 | 2956 | mdecorde | !define /redef /math WINVER_NT4 ${WINVER_NT4} | ${_WINVER_VERXBIT} |
170 | 728 | mdecorde | !endif |
171 | 728 | mdecorde | |
172 | 728 | mdecorde | # some definitions from header files |
173 | 728 | mdecorde | |
174 | 2956 | mdecorde | !define OSVERSIONINFOW_SIZE 276 |
175 | 2956 | mdecorde | !define OSVERSIONINFOEXW_SIZE 284 |
176 | 728 | mdecorde | !define OSVERSIONINFOA_SIZE 148 |
177 | 728 | mdecorde | !define OSVERSIONINFOEXA_SIZE 156 |
178 | 2956 | mdecorde | !define /ifndef VER_PLATFORM_WIN32_NT 2 |
179 | 2956 | mdecorde | !define /ifndef VER_NT_WORKSTATION 1 |
180 | 2956 | mdecorde | !define /ifndef VER_NT_DOMAIN_CONTROLLER 2 |
181 | 2956 | mdecorde | !define /ifndef VER_NT_SERVER 3 |
182 | 728 | mdecorde | |
183 | 728 | mdecorde | !define SM_TABLETPC 86 |
184 | 728 | mdecorde | !define SM_MEDIACENTER 87 |
185 | 728 | mdecorde | !define SM_STARTER 88 |
186 | 728 | mdecorde | !define SM_SERVERR2 89 |
187 | 728 | mdecorde | |
188 | 728 | mdecorde | # variable declaration |
189 | 728 | mdecorde | |
190 | 728 | mdecorde | !macro __WinVer_DeclareVars |
191 | 728 | mdecorde | |
192 | 728 | mdecorde | !ifndef __WINVER_VARS_DECLARED |
193 | 728 | mdecorde | |
194 | 728 | mdecorde | !define __WINVER_VARS_DECLARED |
195 | 728 | mdecorde | |
196 | 728 | mdecorde | Var /GLOBAL __WINVERV |
197 | 728 | mdecorde | Var /GLOBAL __WINVERSP |
198 | 728 | mdecorde | |
199 | 728 | mdecorde | !endif |
200 | 728 | mdecorde | |
201 | 728 | mdecorde | !macroend |
202 | 728 | mdecorde | |
203 | 728 | mdecorde | # lazy initialization macro |
204 | 728 | mdecorde | |
205 | 728 | mdecorde | !ifmacrondef __WinVer_Call_GetVersionEx |
206 | 728 | mdecorde | |
207 | 728 | mdecorde | !macro __WinVer_Call_GetVersionEx STRUCT_SIZE |
208 | 728 | mdecorde | |
209 | 728 | mdecorde | System::Call '*$0(i ${STRUCT_SIZE})' |
210 | 2956 | mdecorde | System::Call kernel32::GetVersionEx(pr0)i.r3 |
211 | 728 | mdecorde | |
212 | 728 | mdecorde | !macroend |
213 | 728 | mdecorde | |
214 | 728 | mdecorde | !endif |
215 | 728 | mdecorde | |
216 | 728 | mdecorde | !macro __WinVer_InitVars |
217 | 728 | mdecorde | # variables |
218 | 728 | mdecorde | !insertmacro __WinVer_DeclareVars |
219 | 728 | mdecorde | |
220 | 728 | mdecorde | # only calculate version once |
221 | 728 | mdecorde | StrCmp $__WINVERV "" _winver_noveryet |
222 | 728 | mdecorde | Return |
223 | 728 | mdecorde | _winver_noveryet: |
224 | 728 | mdecorde | |
225 | 728 | mdecorde | # push used registers on the stack |
226 | 728 | mdecorde | Push $0 |
227 | 728 | mdecorde | Push $1 ;maj |
228 | 728 | mdecorde | Push $2 ;min |
229 | 728 | mdecorde | Push $3 ;bld |
230 | 728 | mdecorde | Push $R0 ;temp |
231 | 728 | mdecorde | |
232 | 2956 | mdecorde | # a plugin call will lock the Unicode mode, it is now safe to set the struct size |
233 | 2956 | mdecorde | !ifdef NSIS_UNICODE |
234 | 2956 | mdecorde | !define /redef OSVERSIONINFO_SIZE ${OSVERSIONINFOW_SIZE} |
235 | 2956 | mdecorde | !define /redef OSVERSIONINFOEX_SIZE ${OSVERSIONINFOEXW_SIZE} |
236 | 2956 | mdecorde | !else |
237 | 2956 | mdecorde | !define /redef OSVERSIONINFO_SIZE ${OSVERSIONINFOA_SIZE} |
238 | 2956 | mdecorde | !define /redef OSVERSIONINFOEX_SIZE ${OSVERSIONINFOEXA_SIZE} |
239 | 2956 | mdecorde | !endif |
240 | 2956 | mdecorde | |
241 | 728 | mdecorde | # allocate memory |
242 | 2956 | mdecorde | System::Call '*(&i${OSVERSIONINFOEX_SIZE})p.r0' |
243 | 728 | mdecorde | |
244 | 728 | mdecorde | # use OSVERSIONINFOEX |
245 | 2956 | mdecorde | !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFOEX_SIZE} |
246 | 728 | mdecorde | |
247 | 728 | mdecorde | IntCmp $3 0 "" _winver_ex _winver_ex |
248 | 728 | mdecorde | # OSVERSIONINFOEX not allowed (Win9x or NT4 w/SP < 6), use OSVERSIONINFO |
249 | 2956 | mdecorde | !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFO_SIZE} |
250 | 728 | mdecorde | _winver_ex: |
251 | 728 | mdecorde | |
252 | 728 | mdecorde | # get results from struct |
253 | 728 | mdecorde | System::Call '*$0(i.s,i.r1,i.r2,i.r3,i.s,&t128.s,&i2.s,&i2,&i2,&i1.s,&i1)' |
254 | 728 | mdecorde | |
255 | 728 | mdecorde | # free struct |
256 | 728 | mdecorde | System::Free $0 |
257 | 728 | mdecorde | |
258 | 728 | mdecorde | # win9x has major and minor info in high word of dwBuildNumber - remove it |
259 | 728 | mdecorde | IntOp $3 $3 & 0xFFFF |
260 | 728 | mdecorde | |
261 | 728 | mdecorde | # get dwOSVersionInfoSize |
262 | 728 | mdecorde | Pop $R0 |
263 | 728 | mdecorde | |
264 | 728 | mdecorde | # get dwPlatformId |
265 | 728 | mdecorde | Pop $0 |
266 | 728 | mdecorde | |
267 | 728 | mdecorde | # NT? |
268 | 728 | mdecorde | IntCmp $0 ${VER_PLATFORM_WIN32_NT} "" _winver_notnt _winver_notnt |
269 | 728 | mdecorde | IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTBIT} |
270 | 728 | mdecorde | IntOp $__WINVERV $__WINVERV | ${_WINVER_NTBIT} |
271 | 728 | mdecorde | _winver_notnt: |
272 | 2956 | mdecorde | !ifndef NSIS_UNICODE |
273 | 2956 | mdecorde | !if "${NSIS_PTR_SIZE}" <= 4 |
274 | 728 | mdecorde | # get service pack information |
275 | 728 | mdecorde | IntCmp $0 ${VER_PLATFORM_WIN32_NT} _winver_nt "" _winver_nt # win9x |
276 | 728 | mdecorde | |
277 | 728 | mdecorde | # get szCSDVersion |
278 | 728 | mdecorde | Pop $0 |
279 | 728 | mdecorde | |
280 | 728 | mdecorde | # copy second char |
281 | 728 | mdecorde | StrCpy $0 $0 1 1 |
282 | 728 | mdecorde | |
283 | 728 | mdecorde | # discard invalid wServicePackMajor and wProductType |
284 | 728 | mdecorde | Pop $R0 |
285 | 728 | mdecorde | Pop $R0 |
286 | 728 | mdecorde | |
287 | 728 | mdecorde | # switch |
288 | 728 | mdecorde | StrCmp $0 'A' "" +3 |
289 | 728 | mdecorde | StrCpy $0 1 |
290 | 728 | mdecorde | Goto _winver_sp_done |
291 | 728 | mdecorde | StrCmp $0 'B' "" +3 |
292 | 728 | mdecorde | StrCpy $0 2 |
293 | 728 | mdecorde | Goto _winver_sp_done |
294 | 728 | mdecorde | StrCmp $0 'C' "" +3 |
295 | 728 | mdecorde | StrCpy $0 3 |
296 | 728 | mdecorde | Goto _winver_sp_done |
297 | 728 | mdecorde | StrCpy $0 0 |
298 | 728 | mdecorde | Goto _winver_sp_done |
299 | 728 | mdecorde | |
300 | 728 | mdecorde | _winver_nt: # nt |
301 | 2956 | mdecorde | !endif #~ 32-bit |
302 | 2956 | mdecorde | !endif #~ ANSI |
303 | 2956 | mdecorde | IntCmp $R0 ${OSVERSIONINFOEX_SIZE} "" _winver_sp_noex _winver_sp_noex |
304 | 728 | mdecorde | |
305 | 728 | mdecorde | # discard szCSDVersion |
306 | 728 | mdecorde | Pop $0 |
307 | 728 | mdecorde | |
308 | 728 | mdecorde | # get wProductType |
309 | 728 | mdecorde | Exch |
310 | 728 | mdecorde | Pop $0 |
311 | 728 | mdecorde | |
312 | 728 | mdecorde | # is server? |
313 | 2956 | mdecorde | IntCmp $0 ${VER_NT_WORKSTATION} _winver_nt_notsrv |
314 | 728 | mdecorde | IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTSRVBIT} |
315 | 2956 | mdecorde | IntCmp $0 ${VER_NT_DOMAIN_CONTROLLER} "" _winver_nt_notdc _winver_nt_notdc |
316 | 2956 | mdecorde | IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTDCBIT} |
317 | 2956 | mdecorde | _winver_nt_notdc: |
318 | 2956 | mdecorde | _winver_nt_notsrv: |
319 | 728 | mdecorde | |
320 | 728 | mdecorde | # get wServicePackMajor |
321 | 728 | mdecorde | Pop $0 |
322 | 728 | mdecorde | |
323 | 728 | mdecorde | # done with sp |
324 | 728 | mdecorde | Goto _winver_sp_done |
325 | 728 | mdecorde | |
326 | 728 | mdecorde | _winver_sp_noex: # OSVERSIONINFO, not OSVERSIONINFOEX |
327 | 728 | mdecorde | |
328 | 728 | mdecorde | #### TODO |
329 | 2956 | mdecorde | ## For IsServerOS to support < NT4SP6, we need to check the registry |
330 | 728 | mdecorde | ## here to see if we are a server and/or DC |
331 | 728 | mdecorde | |
332 | 728 | mdecorde | # get szCSDVersion |
333 | 728 | mdecorde | Pop $0 |
334 | 728 | mdecorde | |
335 | 728 | mdecorde | # discard invalid wServicePackMajor and wProductType |
336 | 728 | mdecorde | Pop $R0 |
337 | 728 | mdecorde | Pop $R0 |
338 | 728 | mdecorde | |
339 | 728 | mdecorde | # get service pack number from text |
340 | 728 | mdecorde | StrCpy $R0 $0 13 |
341 | 728 | mdecorde | StrCmp $R0 "Service Pack " "" +3 |
342 | 728 | mdecorde | StrCpy $0 $0 "" 13 # cut "Service Pack " |
343 | 728 | mdecorde | Goto +2 |
344 | 728 | mdecorde | StrCpy $0 0 # no service pack |
345 | 728 | mdecorde | |
346 | 728 | mdecorde | !ifdef WINVER_NT4_OVER_W95 |
347 | 2956 | mdecorde | IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT} ; change NT 4.0.reserved.0 to 4.0.reserved.1 |
348 | 728 | mdecorde | !endif |
349 | 728 | mdecorde | |
350 | 728 | mdecorde | _winver_sp_done: |
351 | 728 | mdecorde | |
352 | 728 | mdecorde | # store service pack |
353 | 728 | mdecorde | IntOp $0 $0 << 16 |
354 | 728 | mdecorde | IntOp $__WINVERSP $__WINVERSP | $0 |
355 | 728 | mdecorde | |
356 | 728 | mdecorde | ### now for the version |
357 | 728 | mdecorde | |
358 | 728 | mdecorde | # is server? |
359 | 728 | mdecorde | IntOp $0 $__WINVERSP & ${_WINVER_NTSRVBIT} |
360 | 728 | mdecorde | |
361 | 728 | mdecorde | # windows xp x64? |
362 | 728 | mdecorde | IntCmp $0 0 "" _winver_not_xp_x64 _winver_not_xp_x64 # not server |
363 | 728 | mdecorde | IntCmp $1 5 "" _winver_not_xp_x64 _winver_not_xp_x64 # maj 5 |
364 | 728 | mdecorde | IntCmp $2 2 "" _winver_not_xp_x64 _winver_not_xp_x64 # min 2 |
365 | 728 | mdecorde | # change XP x64 from 5.2 to 5.1 so it's still XP |
366 | 728 | mdecorde | StrCpy $2 1 |
367 | 728 | mdecorde | _winver_not_xp_x64: |
368 | 728 | mdecorde | |
369 | 728 | mdecorde | # server 2008? |
370 | 728 | mdecorde | IntCmp $0 0 _winver_not_ntserver # server |
371 | 728 | mdecorde | IntCmp 6 $1 "" "" _winver_not_ntserver # maj 6 |
372 | 728 | mdecorde | # extra bit so Server 2008 comes after Vista SP1 that has the same minor version, same for Win7 vs 2008R2 |
373 | 728 | mdecorde | IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT} |
374 | 728 | mdecorde | _winver_not_ntserver: |
375 | 728 | mdecorde | |
376 | 728 | mdecorde | # pack version |
377 | 728 | mdecorde | IntOp $1 $1 << 24 # VerMajor |
378 | 728 | mdecorde | IntOp $__WINVERV $__WINVERV | $1 |
379 | 728 | mdecorde | IntOp $0 $2 << 16 |
380 | 728 | mdecorde | IntOp $__WINVERV $__WINVERV | $0 # VerMinor |
381 | 728 | mdecorde | IntOp $__WINVERSP $__WINVERSP | $3 # VerBuild |
382 | 728 | mdecorde | |
383 | 728 | mdecorde | # restore registers |
384 | 728 | mdecorde | Pop $R0 |
385 | 728 | mdecorde | Pop $3 |
386 | 728 | mdecorde | Pop $2 |
387 | 728 | mdecorde | Pop $1 |
388 | 728 | mdecorde | Pop $0 |
389 | 728 | mdecorde | |
390 | 728 | mdecorde | !macroend |
391 | 728 | mdecorde | |
392 | 728 | mdecorde | # version comparison LogicLib macros |
393 | 728 | mdecorde | |
394 | 728 | mdecorde | !macro _WinVerAtLeast _a _b _t _f |
395 | 728 | mdecorde | !insertmacro _LOGICLIB_TEMP |
396 | 728 | mdecorde | ${CallArtificialFunction} __WinVer_InitVars |
397 | 728 | mdecorde | IntOp $_LOGICLIB_TEMP $__WINVERV & ${_WINVER_NTMASK} |
398 | 728 | mdecorde | !insertmacro _>= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` |
399 | 728 | mdecorde | !macroend |
400 | 728 | mdecorde | !macro _WinVerIs _a _b _t _f |
401 | 728 | mdecorde | ${CallArtificialFunction} __WinVer_InitVars |
402 | 728 | mdecorde | !insertmacro _= $__WINVERV `${_b}` `${_t}` `${_f}` |
403 | 728 | mdecorde | !macroend |
404 | 728 | mdecorde | !macro _WinVerAtMost _a _b _t _f |
405 | 728 | mdecorde | !insertmacro _LOGICLIB_TEMP |
406 | 728 | mdecorde | ${CallArtificialFunction} __WinVer_InitVars |
407 | 728 | mdecorde | IntOp $_LOGICLIB_TEMP $__WINVERV & ${_WINVER_NTMASK} |
408 | 728 | mdecorde | !insertmacro _<= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` |
409 | 728 | mdecorde | !macroend |
410 | 728 | mdecorde | |
411 | 728 | mdecorde | !macro __WinVer_DefineOSTest Test OS Suffix |
412 | 728 | mdecorde | !define ${Test}Win${OS} `"" WinVer${Test} ${WINVER_${OS}${Suffix}}` |
413 | 728 | mdecorde | !macroend |
414 | 728 | mdecorde | |
415 | 728 | mdecorde | !macro __WinVer_DefineOSTests Test Suffix |
416 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 95 '${Suffix}' |
417 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 98 '${Suffix}' |
418 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} ME '${Suffix}' |
419 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} NT4 '${Suffix}' |
420 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 2000 '${Suffix}' |
421 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} XP '${Suffix}' |
422 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 2003 '${Suffix}' |
423 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} VISTA '${Suffix}' |
424 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 2008 '${Suffix}' |
425 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 7 '${Suffix}' |
426 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 2008R2 '${Suffix}' |
427 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 8 '${Suffix}' |
428 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 2012 '${Suffix}' |
429 | 2956 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 8.1 '${Suffix}' |
430 | 2956 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 2012R2 '${Suffix}' |
431 | 2956 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 10 '${Suffix}' |
432 | 2956 | mdecorde | !insertmacro __WinVer_DefineOSTest ${Test} 2016 '${Suffix}' |
433 | 728 | mdecorde | !macroend |
434 | 728 | mdecorde | |
435 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTests AtLeast "" |
436 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTests Is _NT |
437 | 728 | mdecorde | !insertmacro __WinVer_DefineOSTests AtMost "" |
438 | 728 | mdecorde | |
439 | 728 | mdecorde | # version feature LogicLib macros |
440 | 728 | mdecorde | |
441 | 2956 | mdecorde | !macro __WinVer_LL_IsBitSet _v _b _t _f |
442 | 728 | mdecorde | !insertmacro _LOGICLIB_TEMP |
443 | 728 | mdecorde | ${CallArtificialFunction} __WinVer_InitVars |
444 | 2956 | mdecorde | IntOp $_LOGICLIB_TEMP ${_v} & ${_b} |
445 | 728 | mdecorde | !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}` |
446 | 728 | mdecorde | !macroend |
447 | 728 | mdecorde | |
448 | 2956 | mdecorde | !define IsNT `$__WINVERSP _WinVer_LL_IsBitSet ${_WINVER_NTBIT}` |
449 | 2956 | mdecorde | !define IsServerOS `$__WINVERSP _WinVer_LL_IsBitSet ${_WINVER_NTSRVBIT}` |
450 | 2956 | mdecorde | !define IsDomainController `$__WINVERSP _WinVer_LL_IsBitSet ${_WINVER_NTDCBIT}` |
451 | 728 | mdecorde | |
452 | 728 | mdecorde | # service pack macros |
453 | 728 | mdecorde | |
454 | 728 | mdecorde | !macro _WinVer_GetServicePackLevel OUTVAR |
455 | 728 | mdecorde | ${CallArtificialFunction} __WinVer_InitVars |
456 | 728 | mdecorde | IntOp ${OUTVAR} $__WINVERSP & ${_WINVER_MASKSP} |
457 | 728 | mdecorde | IntOp ${OUTVAR} ${OUTVAR} >> 16 |
458 | 728 | mdecorde | !macroend |
459 | 728 | mdecorde | !define WinVerGetServicePackLevel '!insertmacro _WinVer_GetServicePackLevel ' |
460 | 728 | mdecorde | |
461 | 728 | mdecorde | !macro _AtLeastServicePack _a _b _t _f |
462 | 728 | mdecorde | !insertmacro _LOGICLIB_TEMP |
463 | 728 | mdecorde | ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP |
464 | 728 | mdecorde | !insertmacro _>= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` |
465 | 728 | mdecorde | !macroend |
466 | 728 | mdecorde | !define AtLeastServicePack `"" AtLeastServicePack` |
467 | 728 | mdecorde | |
468 | 728 | mdecorde | !macro _AtMostServicePack _a _b _t _f |
469 | 728 | mdecorde | !insertmacro _LOGICLIB_TEMP |
470 | 728 | mdecorde | ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP |
471 | 728 | mdecorde | !insertmacro _<= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` |
472 | 728 | mdecorde | !macroend |
473 | 728 | mdecorde | !define AtMostServicePack `"" AtMostServicePack` |
474 | 728 | mdecorde | |
475 | 728 | mdecorde | !macro _IsServicePack _a _b _t _f |
476 | 728 | mdecorde | !insertmacro _LOGICLIB_TEMP |
477 | 728 | mdecorde | ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP |
478 | 728 | mdecorde | !insertmacro _= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` |
479 | 728 | mdecorde | !macroend |
480 | 728 | mdecorde | !define IsServicePack `"" IsServicePack` |
481 | 728 | mdecorde | |
482 | 728 | mdecorde | # special feature LogicLib macros |
483 | 728 | mdecorde | |
484 | 728 | mdecorde | !macro _WinVer_SysMetricCheck m _b _t _f |
485 | 728 | mdecorde | !insertmacro _LOGICLIB_TEMP |
486 | 728 | mdecorde | System::Call user32::GetSystemMetrics(i${m})i.s |
487 | 728 | mdecorde | pop $_LOGICLIB_TEMP |
488 | 728 | mdecorde | !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}` |
489 | 728 | mdecorde | !macroend |
490 | 728 | mdecorde | |
491 | 728 | mdecorde | !define IsWin2003R2 `${SM_SERVERR2} WinVer_SysMetricCheck ""` |
492 | 728 | mdecorde | !define IsStarterEdition `${SM_STARTER} WinVer_SysMetricCheck ""` |
493 | 728 | mdecorde | !define OSHasMediaCenter `${SM_MEDIACENTER} WinVer_SysMetricCheck ""` |
494 | 728 | mdecorde | !define OSHasTabletSupport `${SM_TABLETPC} WinVer_SysMetricCheck ""` |
495 | 728 | mdecorde | |
496 | 728 | mdecorde | # version retrieval macros |
497 | 728 | mdecorde | |
498 | 728 | mdecorde | !macro __WinVer_GetVer var rshift mask outvar |
499 | 728 | mdecorde | ${CallArtificialFunction} __WinVer_InitVars |
500 | 728 | mdecorde | !if "${mask}" != "" |
501 | 728 | mdecorde | IntOp ${outvar} ${var} & ${mask} |
502 | 728 | mdecorde | !if "${rshift}" != "" |
503 | 728 | mdecorde | IntOp ${outvar} ${outvar} >> ${rshift} |
504 | 728 | mdecorde | !endif |
505 | 728 | mdecorde | !else |
506 | 728 | mdecorde | IntOp ${outvar} ${var} >> ${rshift} |
507 | 728 | mdecorde | !endif |
508 | 728 | mdecorde | !macroend |
509 | 728 | mdecorde | |
510 | 728 | mdecorde | !define WinVerGetMajor '!insertmacro __WinVer_GetVer $__WINVERV 24 ${_WINVER_MASKVMAJ}' |
511 | 728 | mdecorde | !define WinVerGetMinor '!insertmacro __WinVer_GetVer $__WINVERV 16 ${_WINVER_MASKVMIN}' |
512 | 728 | mdecorde | !define WinVerGetBuild '!insertmacro __WinVer_GetVer $__WINVERSP "" ${_WINVER_MASKVBLD}' |
513 | 728 | mdecorde | |
514 | 2956 | mdecorde | !macro _WinVer_BuildNumCheck op num _t _f |
515 | 2956 | mdecorde | !insertmacro _LOGICLIB_TEMP |
516 | 2956 | mdecorde | ${WinVerGetBuild} $_LOGICLIB_TEMP |
517 | 2956 | mdecorde | !insertmacro _${op} $_LOGICLIB_TEMP ${num} `${_t}` `${_f}` |
518 | 2956 | mdecorde | !macroend |
519 | 2956 | mdecorde | !define AtLeastBuild `U>= WinVer_BuildNumCheck ` |
520 | 2956 | mdecorde | !define AtMostBuild `U<= WinVer_BuildNumCheck ` |
521 | 728 | mdecorde | |
522 | 2956 | mdecorde | # Windows as a Service macros |
523 | 2956 | mdecorde | |
524 | 2956 | mdecorde | !macro WinVer_WaaS id build fu codename marketingname |
525 | 2956 | mdecorde | !if "${id}" == ${fu} |
526 | 2956 | mdecorde | !define WinVer_WaaS_Build ${build} |
527 | 2956 | mdecorde | !else if "${id}" == "${codename}" |
528 | 2956 | mdecorde | !define WinVer_WaaS_Build ${build} |
529 | 2956 | mdecorde | !else if "${id}" == "${marketingname}" |
530 | 2956 | mdecorde | !define WinVer_WaaS_Build ${build} |
531 | 2956 | mdecorde | !endif |
532 | 2956 | mdecorde | !macroend |
533 | 2956 | mdecorde | |
534 | 2956 | mdecorde | !macro _WinVer_WaaS op id _t _f |
535 | 2956 | mdecorde | !insertmacro WinVer_WaaS "${id}" 10240 1507 "Threshold" "RTM" ; 10240.16384 |
536 | 2956 | mdecorde | !insertmacro WinVer_WaaS "${id}" 10586 1511 "Threshold 2" "November Update" ; 10586.0? |
537 | 2956 | mdecorde | !insertmacro WinVer_WaaS "${id}" 14393 1607 "Redstone" "Anniversary Update" ; 14393.10 |
538 | 2956 | mdecorde | !insertmacro WinVer_WaaS "${id}" 15063 1703 "Redstone 2" "Creators Update" ; 15063.13 |
539 | 2956 | mdecorde | !insertmacro WinVer_WaaS "${id}" 16299 1709 "Redstone 3" "Fall Creators Update" ; 16299.19 |
540 | 2956 | mdecorde | !insertmacro WinVer_WaaS "${id}" 17134 1803 "Redstone 4" "April 2018 Update" ; 17134.1 |
541 | 2956 | mdecorde | !insertmacro WinVer_WaaS "${id}" 17763 1809 "Redstone 5" "October 2018 Update" ; 17763.1 |
542 | 2956 | mdecorde | !insertmacro WinVer_WaaS "${id}" 18362 1903 "19H1" "May 2019 Update" ; 18362.116 |
543 | 2956 | mdecorde | !insertmacro WinVer_WaaS "${id}" 18363 1909 "19H2" "November 2019 Update" ; 18363.418 |
544 | 2956 | mdecorde | !insertmacro WinVer_WaaS "${id}" 19041 2004 "20H1" "May 2020 Update" ; 19041.264? |
545 | 2956 | mdecorde | !ifmacrodef WinVerExternal_WaaS_MapToBuild |
546 | 2956 | mdecorde | !insertmacro WinVerExternal_WaaS_MapToBuild ${op} "${id}" WinVer_WaaS_Build |
547 | 2956 | mdecorde | !endif |
548 | 2956 | mdecorde | !define /IfNDef WinVer_WaaS_Build 0 |
549 | 2956 | mdecorde | !if "${WinVer_WaaS_Build}" <= 9600 |
550 | 2956 | mdecorde | !error 'WinVer: Unknown WaaS name: ${id}' |
551 | 2956 | mdecorde | !endif |
552 | 2956 | mdecorde | !insertmacro _WinVer_BuildNumCheck ${op} ${WinVer_WaaS_Build} `${_t}` `${_f}` |
553 | 2956 | mdecorde | !undef WinVer_WaaS_Build |
554 | 2956 | mdecorde | !macroend |
555 | 2956 | mdecorde | |
556 | 2956 | mdecorde | !define AtLeastWaaS `U>= WinVer_WaaS ` |
557 | 2956 | mdecorde | !define AtMostWaaS `U<= WinVer_WaaS ` |
558 | 2956 | mdecorde | |
559 | 728 | mdecorde | !endif # !___WINVER__NSH___ |
560 | 728 | mdecorde | |
561 | 728 | mdecorde | !verbose pop |