If there should be separate detection for Longhorn, why not make a separate detection for Chicago as well? I'd suggest that you ignore internal codenames.PB wrote:> I'm not sure if Vista and Longhorn works
@Fred: Maybe PureBasic's OSVersion() command can be updated to get
these versions of Windows too?
GetVersionEx (help me test this code)
-
techjunkie
- Addict

- Posts: 1126
- Joined: Wed Oct 15, 2003 12:40 am
- Location: Sweden
- Contact:
Both Windows Vista and Windows Server "Loghorn" are official names by now, but the server is released in 2007 so I'll guess it can change.Trond wrote:If there should be separate detection for Longhorn, why not make a separate detection for Chicago as well? I'd suggest that you ignore internal codenames.PB wrote:> I'm not sure if Vista and Longhorn works
@Fred: Maybe PureBasic's OSVersion() command can be updated to get
these versions of Windows too?
(It would be nice to get the result for all 7 - 9 different Vista versions)
http://www.microsoft.com/windowsvista/default.mspx
http://www.microsoft.com/windowsserver2 ... .mspx#EFAA

(\__/)
(='.'=) This is Bunny. Copy and paste Bunny into your
(")_(") signature to help him gain world domination.
techjunkie wrote:Here is a good link about how to get the new versions, but I'm to lazy to convert it...![]()
http://msdn.microsoft.com/library/defau ... ersion.asp
Code: Select all
;/ Getting the System Version
;/ http://msdn.microsoft.com/library/Default.asp?url=/library/en-us/sysinfo/base/getting_the_system_version.asp
;/
;/ Windows 95 B: OK
;/ Windows 98 SE: OK
;/ Windows ME: OK
;/ Windows NT4 SP6a: OK
;/ Windows 2000 Pro SP4: OK
;/ Windows XP Pro SP2: OK
#BUFSIZE = 80
#VER_NT_WORKSTATION = 1
#VER_NT_DOMAIN_CONTROLLER = 2
#VER_NT_SERVER = 3
#PROCESSOR_ARCHITECTURE_INTEL = 0
#PROCESSOR_ARCHITECTURE_MIPS = 1
#PROCESSOR_ARCHITECTURE_ALPHA = 2
#PROCESSOR_ARCHITECTURE_PPC = 3
#PROCESSOR_ARCHITECTURE_SHX = 4
#PROCESSOR_ARCHITECTURE_ARM = 5
#PROCESSOR_ARCHITECTURE_IA64 = 6
#PROCESSOR_ARCHITECTURE_ALPHA64 = 7
#PROCESSOR_ARCHITECTURE_MSIL = 8
#PROCESSOR_ARCHITECTURE_AMD64 = 9
#PROCESSOR_ARCHITECTURE_UNKNOWN = $FFFF
#SM_SERVERR2 = 89
#VER_SUITE_SMALLBUSINESS = 1
#VER_SUITE_ENTERPRISE = 2
#VER_SUITE_BACKOFFICE = 4
#VER_SUITE_COMMUNICATIONS = 8
#VER_SUITE_TERMINAL = 10
#VER_SUITE_SMALLBUSINESS_RESTRICTED = 20
#VER_SUITE_EMBEDDEDNT = 40
#VER_SUITE_DATACENTER = 80
#VER_SUITE_SINGLEUSERTS = 100
#VER_SUITE_PERSONAL = 200
#VER_SUITE_BLADE = 400
Structure OSVERSIONINFOEX Extends OSVERSIONINFO ;/ -> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/osversioninfoex_str.asp
wServicePackMajor.w ; Major version number of the latest Service Pack installed on the system.
wServicePackMinor.w ; Minor version number of the latest Service Pack installed on the system.
wSuiteMask.w ; Bit flags that identify the product suites available on the system.
wProductType.b ; Additional information about the system.
wReserved.b ; Reserved for future use.
EndStructure
Procedure.s WindowsVersion()
Protected Version.OSVERSIONINFOEX, SystemInfo.SYSTEM_INFO, *pGetNativeSystemInfo, bOsVersionInfoEx.b
Protected WinVer$, hkey.l
; Try calling GetVersionEx using the OSVERSIONINFOEX Structure.
; If that fails, Try using the OSVERSIONINFO Structure.
ZeroMemory_(@Version, SizeOf(OSVERSIONINFOEX))
Version\dwOSVersionInfoSize=SizeOf(OSVERSIONINFOEX)
bOsVersionInfoEx = GetVersionEx_(Version)
If bOsVersionInfoEx=0
ZeroMemory_(@Version, SizeOf(OSVERSIONINFO))
Version\dwOSVersionInfoSize=SizeOf(OSVERSIONINFO)
If GetVersionEx_(Version)=0
ProcedureReturn "ERROR 1"
EndIf
EndIf
Select Version\dwPlatformId
Case #VER_PLATFORM_WIN32_NT ; Test for the Windows NT product family.
; test For the specific product.
If (Version\dwMajorVersion=6) And (Version\dwMinorVersion=0)
If Version\wProductType = #VER_NT_WORKSTATION
WinVer$ = "Microsoft Windows Vista "
Else
WinVer$ = "Windows Server 'Longhorn' "
EndIf
EndIf
If (Version\dwMajorVersion=5) And (Version\dwMinorVersion=2)
; Use GetProcAddress To avoid load issues on Windows 2000
*pGetNativeSystemInfo = GetProcAddress_(GetModuleHandle_("kernel32.dll"), "GetNativeSystemInfo")
If *pGetNativeSystemInfo
CallFunctionFast(*pGetNativeSystemInfo,@SystemInfo)
If GetSystemMetrics_(#SM_SERVERR2)
WinVer$ = "Microsoft Windows Server 2003 'R2' "
ElseIf (Version\wProductType =#VER_NT_WORKSTATION) And (SystemInfo\wProcessorArchitecture=#PROCESSOR_ARCHITECTURE_AMD64)
WinVer$ = "Microsoft Windows XP Professional x64 Edition "
Else
WinVer$ = "Microsoft Windows Server 2003, "
EndIf
EndIf
EndIf
If (Version\dwMajorVersion=5) And (Version\dwMinorVersion=1)
WinVer$ = "Microsoft Windows XP "
EndIf
If (Version\dwMajorVersion=5) And (Version\dwMinorVersion=0)
WinVer$ = "Microsoft Windows 2000 "
EndIf
If (Version\dwMajorVersion<=4)
WinVer$ = "Microsoft Windows NT "
EndIf
; test For specific product on Windows NT 4.0 SP6 And later.
If bOsVersionInfoEx
If (Version\wProductType=#VER_NT_WORKSTATION) And (SystemInfo\wProcessorArchitecture<>#PROCESSOR_ARCHITECTURE_AMD64)
If (Version\dwMajorVersion=4)
WinVer$ + "Workstation 4.0 "
ElseIf (Version\wSuiteMask & #VER_SUITE_PERSONAL)
WinVer$ + "Home Edition "
Else
WinVer$ + "Professional "
EndIf
; Test for the server type.
ElseIf (Version\wProductType=#VER_NT_SERVER) Or (Version\wProductType=#VER_NT_DOMAIN_CONTROLLER)
If (Version\dwMajorVersion=5) And (Version\dwMinorVersion=2)
If (SystemInfo\wProcessorArchitecture<>#PROCESSOR_ARCHITECTURE_IA64)
If (Version\wSuiteMask & #VER_SUITE_DATACENTER)
WinVer$ + "Datacenter Edition for Itanium-based Systems"
ElseIf (Version\wSuiteMask & #VER_SUITE_ENTERPRISE)
WinVer$ + "Enterprise Edition for Itanium-based Systems"
EndIf
ElseIf (SystemInfo\wProcessorArchitecture<>#PROCESSOR_ARCHITECTURE_AMD64)
If (Version\wSuiteMask & #VER_SUITE_DATACENTER)
WinVer$ + "Datacenter x64 Edition "
ElseIf (Version\wSuiteMask & #VER_SUITE_ENTERPRISE)
WinVer$ + "Enterprise x64 Edition "
Else
WinVer$ + "Standard x64 Edition "
EndIf
Else
If (Version\wSuiteMask & #VER_SUITE_DATACENTER)
WinVer$ + "Datacenter Edition "
ElseIf (Version\wSuiteMask & #VER_SUITE_ENTERPRISE)
WinVer$ + "Enterprise Edition "
ElseIf (Version\wSuiteMask & #VER_SUITE_BLADE)
WinVer$ + "Web Edition "
Else
WinVer$ + "Standard Edition "
EndIf
EndIf
ElseIf (Version\dwMajorVersion=5) And (Version\dwMinorVersion=0)
If (Version\wSuiteMask & #VER_SUITE_DATACENTER)
WinVer$ + "Datacenter Server "
ElseIf (Version\wSuiteMask & #VER_SUITE_ENTERPRISE)
WinVer$ + "Advanced Server "
Else
WinVer$ + "Server "
EndIf
Else ; Windows NT 4.0
If (Version\wSuiteMask & #VER_SUITE_ENTERPRISE)
WinVer$ + "Server 4.0, Enterprise Edition "
Else
WinVer$ + "Server 4.0 "
EndIf
EndIf
EndIf
Else ; Test for specific product on Windows NT 4.0 SP5 and earlier
szProductType.s = Space(#BUFSIZE)
dwBufLen.l = #BUFSIZE
lRet.l = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\ProductOptions",0,#KEY_QUERY_VALUE, @hkey)
If (lRet<>#ERROR_SUCCESS)
ProcedureReturn "ERROR 2"
EndIf
lRet = RegQueryValueEx_( hkey,"ProductType", 0, 0, @szProductType, @dwBufLen)
RegCloseKey_(hkey)
If (lRet<>#ERROR_SUCCESS) Or (dwBufLen > #BUFSIZE)
ProcedureReturn "ERROR 3"
EndIf
If szProductType="WINNT" : WinVer$ + "Workstation " : EndIf
If szProductType="LANMANNT" : WinVer$ + "Server " : EndIf
If szProductType="SERVERNT" : WinVer$ + "Advanced Server " : EndIf
WinVer$ + Str(Version\dwMajorVersion) + "." + Str(Version\dwMinorVersion)
EndIf
; Display service pack (if any) and build number.
If (Version\dwMajorVersion=4) And (PeekS(@Version\szCSDVersion,128) = "Service Pack 6")
lRet.l = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\Q246009",0,#KEY_QUERY_VALUE, @hkey)
If (lRet=#ERROR_SUCCESS)
WinVer$ + "Service Pack 6a (Build " + Str(Version\dwBuildNumber & $FFFF) + ")"
Else ; Windows NT 4.0 prior to SP6a
WinVer$ + PeekS(@Version\szCSDVersion,128) + " (Build " + Str(Version\dwBuildNumber & $FFFF) + ")"
EndIf
RegCloseKey_(hkey)
Else ; not Windows NT 4.0
WinVer$ + PeekS(@Version\szCSDVersion,128) + " (Build " + Str(Version\dwBuildNumber & $FFFF) + ")"
EndIf
Case #VER_PLATFORM_WIN32_WINDOWS ; Test for the Windows Me/98/95.
If (Version\dwMajorVersion=4) And (Version\dwMinorVersion=0)
WinVer$ = "Microsoft Windows 95 "
If (PeekS(@Version\szCSDVersion+1,1)="B") Or (PeekS(@Version\szCSDVersion+1,1)="C")
WinVer$ + "OSR2"
EndIf
EndIf
If (Version\dwMajorVersion=4) And (Version\dwMinorVersion=10)
WinVer$ = "Microsoft Windows 98 "
If (PeekS(@Version\szCSDVersion+1,1)="A") Or (PeekS(@Version\szCSDVersion+1,1)="B")
WinVer$ + "SE"
EndIf
EndIf
If (Version\dwMajorVersion=4) And (Version\dwMinorVersion=90)
WinVer$ = "Microsoft Windows Millenium Edition"
EndIf
Case #VER_PLATFORM_WIN32s
WinVer$ = "Microsoft Win32s"
EndSelect
ProcedureReturn WinVer$
EndProcedure
MessageRequester("Windows Version",WindowsVersion())
End
