WUIsBack/setup/WinVer.nsh

174 lines
5.9 KiB
Plaintext

; NSIS WinVer.nsh rewritten to work more like what I expect.
!include LogicLib.nsh
!include Util.nsh
; Defines
!define OSVERSIONINFOW_SIZE 276
!define OSVERSIONINFOEXW_SIZE 284
!define WINVER_2000 0x0500 ; 5.0.2195
!define WINVER_XP 0x0501 ; 5.1.2600
!define WINVER_XP2002 0x0501 ; 5.1.2600
!define WINVER_XP2003 0x0502 ; 5.2.3790
!define WINVER_VISTA 0x0600 ; 6.0.6000
!define WINVER_7 0x0601 ; 6.1.7600
!define WINVER_8 0x0602 ; 6.2.9200
!define WINVER_8.1 0x0603 ; 6.3.9600
!define WINVER_10 0x0A00 ; 10.0.10240
!define WINVER_SERVER_2000 ${WINVER_2000}
!define WINVER_SERVER_2003 ${WINVER_XP2003}
!define WINVER_SERVER_2003R2 ${WINVER_XP2003}
!define WINVER_SERVER_2008 ${WINVER_VISTA}
!define WINVER_SERVER_2008R2 ${WINVER_7}
!define WINVER_SERVER_2012 ${WINVER_8}
!define WINVER_SERVER_2012R2 ${WINVER_8.1}
!define WINVER_SERVER_2016 ${WINVER_10}
!define WINVER_BUILD_11 22000
!define /ifndef VER_NT_WORKSTATION 1
!define VER_SUITE_BACKOFFICE 0x00000004 ; Microsoft BackOffice
!define VER_SUITE_BLADE 0x00000400 ; Windows Server 2003, Web Edition
!define VER_SUITE_COMPUTE_SERVER 0x00004000 ; Windows Server 2003, Compute Cluster Edition
!define VER_SUITE_DATACENTER 0x00000080 ; Windows Server Datacenter
!define VER_SUITE_ENTERPRISE 0x00000002 ; Windows Server Enterprise
!define VER_SUITE_EMBEDDEDNT 0x00000040 ; Windows Embedded
!define VER_SUITE_PERSONAL 0x00000200 ; Windows Home Edition
!define VER_SUITE_SINGLEUSERTS 0x00000100 ; Single-user Remote Desktop
!define VER_SUITE_SMALLBUSINESS 0x00000001 ; Small Business Server
!define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020 ; Small Business Server (restrictive client license)
!define VER_SUITE_STORAGE_SERVER 0x00002000 ; Windows Storage Server 2003
!define VER_SUITE_TERMINAL 0x00000010 ; Terminal Services (always true)
!define VER_SUITE_WH_SERVER 0x00008000 ; Windows Home Server
!define VER_SUITE_MULTIUSERTS 0x00020000 ; Multi-user Remote Desktop
!define SM_CLEANBOOT 67
; Init
!macro __WinVer_Init
!ifndef __WINVER_VARS_DECLARED
!define __WINVER_VARS_DECLARED
Var /GLOBAL __WINVEROS
Var /GLOBAL __WINVERBUILD
Var /GLOBAL __WINVERSP
Var /GLOBAL __WINVERPROD
Var /GLOBAL __WINVERSUITE
!endif
StrCmp $__WINVEROS "" _winver_noveryet
Return
_winver_noveryet:
GetWinVer $__WINVEROS NTDDIMajMin
GetWinVer $__WINVERBUILD Build
GetWinVer $__WINVERSP ServicePack
GetWinVer $__WINVERPROD Product
Push $0
Push $1
System::Alloc ${OSVERSIONINFOEXW_SIZE}
Pop $0
System::Call '*$0(i ${OSVERSIONINFOEXW_SIZE})'
System::Call '${GetVersionEx}(.r0)'
System::Call '*$0(i, i, i, i, i, &t128, h, h, h .r1, b, b)'
System::Free $0
StrCpy $__WINVERSUITE $1
Pop $1
Pop $0
!macroend
; Tests
!macro __WinVer_TestOS op num _t _f
${CallArtificialFunction} __WinVer_Init
!insertmacro _${op} $__WINVEROS ${num} `${_t}` `${_f}`
!macroend
!macro __WinVer_TestBuild op num _t _f
${CallArtificialFunction} __WinVer_Init
!insertmacro _${op} $__WINVERBUILD ${num} `${_t}` `${_f}`
!macroend
!macro __WinVer_TestSP op num _t _f
${CallArtificialFunction} __WinVer_Init
!insertmacro _${op} $__WINVERSP ${num} `${_t}` `${_f}`
!macroend
!macro __WinVer_TestProduct op num _t _f
${CallArtificialFunction} __WinVer_Init
!insertmacro _${op} $__WINVERPROD ${num} `${_t}` `${_f}`
!macroend
!macro __WinVer_TestSuite _a num _t _f
!insertmacro _LOGICLIB_TEMP
${CallArtificialFunction} __WinVer_Init
IntOp $_LOGICLIB_TEMP $__WINVERSUITE & ${num}
!insertmacro _= $_LOGICLIB_TEMP ${num} `${_t}` `${_f}`
!macroend
!macro __WinVer_TestSystemMetric op metric _t _f
!insertmacro _LOGICLIB_TEMP
${CallArtificialFunction} __WinVer_Init
System::Call '${GetSystemMetrics}(${metric}) .s'
Pop $_LOGICLIB_TEMP
!insertmacro _${op} $_LOGICLIB_TEMP 0 `${_t}` `${_f}`
!macroend
; Defines
!define IsClientOS `= _WinVer_TestProduct ${VER_NT_WORKSTATION}`
!define IsServerOS `!= _WinVer_TestProduct ${VER_NT_WORKSTATION}`
!define IsHomeEdition `"" _WinVer_TestSuite ${VER_SUITE_PERSONAL}`
!define IsEmbedded `"" _WinVer_TestSuite ${VER_SUITE_EMBEDDEDNT}`
!define IsHomeServer `"" _WinVer_TestSuite ${VER_SUITE_WH_SERVER}`
!define IsSafeMode `!= _WinVer_TestSystemMetric ${SM_CLEANBOOT}`
!define IsServicePack `= _WinVer_TestSP`
!define AtLeastServicePack `>= _WinVer_TestSP`
!define AtMostServicePack `<= _WinVer_TestSP`
!macro __WinVer_DefineClient os
!define IsWin${os} `= _WinVer_TestOS ${WINVER_${os}}`
!define AtLeastWin${os} `>= _WinVer_TestOS ${WINVER_${os}}`
!define AtMostWin${os} `<= _WinVer_TestOS ${WINVER_${os}}`
!macroend
!macro __WinVer_DefineServer os
!define IsWin${os} `= _WinVer_TestOS ${WINVER_SERVER_${os}}`
!define AtLeastWin${os} `>= _WinVer_TestOS ${WINVER_SERVER_${os}}`
!define AtMostWin${os} `<= _WinVer_TestOS ${WINVER_SERVER_${os}}`
!macroend
!macro __WinVer_DefineBuild os
!define IsWin${os} `= _WinVer_TestBuild ${WINVER_BUILD_${os}}`
!define AtLeastWin${os} `>= _WinVer_TestBuild ${WINVER_BUILD_${os}}`
!define AtMostWin${os} `<= _WinVer_TestBuild ${WINVER_BUILD_${os}}`
!macroend
!insertmacro __WinVer_DefineClient 2000
!insertmacro __WinVer_DefineClient XP2002
!insertmacro __WinVer_DefineClient XP2003
!insertmacro __WinVer_DefineClient Vista
!insertmacro __WinVer_DefineClient 7
!insertmacro __WinVer_DefineClient 8
!insertmacro __WinVer_DefineClient 8.1
!insertmacro __WinVer_DefineClient 10
!insertmacro __WinVer_DefineServer 2003
!insertmacro __WinVer_DefineServer 2003R2
!insertmacro __WinVer_DefineServer 2008
!insertmacro __WinVer_DefineServer 2008R2
!insertmacro __WinVer_DefineServer 2012
!insertmacro __WinVer_DefineServer 2012R2
!insertmacro __WinVer_DefineServer 2016
!insertmacro __WinVer_DefineBuild 11