Statistiques
| Révision :

root / tmp / org.txm.setups / nsis / Include / WinVer.nsh @ 3108

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