Windows 8 and 8.1

Windows specific forum
User avatar
luis
Addict
Addict
Posts: 3893
Joined: Wed Aug 31, 2005 11:09 pm
Location: Italy

Re: Windows 8 and 8.1

Post by luis »

smacker wrote:yes, RtlGetVersion() is ok to use but it should be noted that the RtlGetVersion() seems to only works properly "fully" when compiled unicode when using the OSVERSIONINFOEX structure.
RtlGetVersion() as said above it's a kernel function and it can be called from user mode thanks to the stub in ntdll.dll, but it works natively in unicode.
The kernel is unicode only, and the higher level API converts unicode to ascii when called from a ascii client (PB program compiled in ascii).
The OSVERSIONEX defined in PB is made to be used with the normal API functions, so correctly uses .c for chars to work with the ascii and unicode version of the API called (they will do the internal conversion).

In short, to call the kernel function which is only unicode-aware you can do this:

Code: Select all

Structure KERNEL_OSVERSIONINFOEX
    dwOSVersionInfoSize.l
    dwMajorVersion.l
    dwMinorVersion.l
    dwBuildNumber.l
    dwPlatformId.l
    szCSDVersion.u[128]
    wServicePackMajor.w
    wServicePackMinor.w
    wSuiteMask.w
    wProductType.b
    wReserved.b
EndStructure

Global osvex.KERNEL_OSVERSIONINFOEX
Global *fp, hDLL, major, minor, build, sp$

osvex\dwOSVersionInfoSize = SizeOf(osvex)
 
hDLL = OpenLibrary (#PB_Any, "ntdll.dll")     
If hDLL   
    *fp = GetFunction(hDLL, "RtlGetVersion")
        If *fp And CallFunctionFast(*fp, @osvex) = 0 ; #STATUS_SUCCESS        
            major = osvex\dwMajorVersion   
            minor = osvex\dwMinorVersion
            build = osvex\dwBuildNumber
            product = osvex\wProductType
            sp$ = PeekS(@osvex\szCSDVersion[0], -1, #PB_Unicode)
            ShowMemoryViewer(@osvex, SizeOf(osvex))
        EndIf     
        CloseLibrary(hDLL)       
EndIf

Debug major
Debug minor
Debug build
Debug product
Debug sp$
WIN 7 SP1 x64 workstation output in ascii and unicode mode

Code: Select all

[12:35:58] 6
[12:35:58] 1
[12:35:58] 7601
[12:35:58] 1
[12:35:58] Service Pack 1
All this wasn't needed to access dwMajorVersion.l, dwMinorVersion.l, dwBuildNumber.l because as you see they are before the char field in the middle of the structure, so always at the same offset.
"Have you tried turning it off and on again ?"
A little PureBasic review
smacker
User
User
Posts: 55
Joined: Thu Nov 06, 2014 7:18 pm

Re: Windows 8 and 8.1

Post by smacker »

That works luis. thanks.

I had come to that realization after posting what I did, but you implemented it. :)
The world and human nature was screwed up before I was born. It's not my fault and I'm just stuck with trying to deal with the mess left behind, so don't blame me.
User avatar
luis
Addict
Addict
Posts: 3893
Joined: Wed Aug 31, 2005 11:09 pm
Location: Italy

Re: Windows 8 and 8.1

Post by luis »

You're welcome :wink:
"Have you tried turning it off and on again ?"
A little PureBasic review
smacker
User
User
Posts: 55
Joined: Thu Nov 06, 2014 7:18 pm

Re: Windows 8 and 8.1

Post by smacker »

On a side note, I always wondered why MS never provided an easy api function to get the friendly name of the OS, for example, "Windows 7 Ultimate", instead of making people jump through hoops with testing this and that condition or digging this and that out of a return from something else. You would think that with all the hub bub they go through with names for their operating systems that there would be a simple call to something like "GetOperatingSystemFriendlyName()" in the api without having to jump through hoops to get it. Its almost like they don't want people to be able to get it easily. Yeah, you can do it via reading the registry but that's not without its own pitfalls and its still jumping through hoops.

Anyway, harkening back to the WMI method earlier in the thread, one could also do this using the command prompt.

Quick and dirty code below:

Code: Select all

Procedure.s GetOSNameInfo()
  
  Compilertrdns = RunProgram("wmic.exe", " os get Caption", "", #PB_Program_Hide|#PB_Program_Open|#PB_Program_Read)
  Outns$ = ""
  If Compilertrdns
    While ProgramRunning(Compilertrdns)
      Outns$=ReadProgramString(Compilertrdns)
      keepdns$ = keepdns$ + Outns$ + #CRLF$
    Wend
    CloseProgram(Compilertrdns)
  EndIf
  
  name$ = RemoveString(keepdns$, Chr(10), #PB_String_NoCase, 1)
  name$ = RemoveString(name$, Chr(13), #PB_String_NoCase, 1)
  name$ = Trim(RemoveString(name$, "Caption", #PB_String_NoCase, 1))
  
  Compilertrdnsx = RunProgram("wmic.exe", " path Win32_OperatingSystem get version", "", #PB_Program_Hide|#PB_Program_Open|#PB_Program_Read)
  Outnsx$ = ""
  If Compilertrdnsx
    While ProgramRunning(Compilertrdnsx)
      Outnsx$=ReadProgramString(Compilertrdnsx)
      keepdnsx$ = keepdnsx$ + Outnsx$ + #CRLF$
    Wend
    CloseProgram(Compilertrdnsx)
  EndIf
  
  version$ = RemoveString(keepdnsx$, Chr(10), #PB_String_NoCase, 1)
  version$ = RemoveString(version$, Chr(13), #PB_String_NoCase, 1)
  version$ = Trim(RemoveString(version$, "Version", #PB_String_NoCase, 1))
  
  Compilertrdnsy = RunProgram("wmic.exe", " path Win32_OperatingSystem get CSDVersion", "", #PB_Program_Hide|#PB_Program_Open|#PB_Program_Read)
  Outnsy$ = ""
  If Compilertrdnsy
    While ProgramRunning(Compilertrdnsy)
      Outnsy$=ReadProgramString(Compilertrdnsy)
      keepdnsy$ = keepdnsy$ + Outnsy$ + #CRLF$
    Wend
    CloseProgram(Compilertrdnsy)
  EndIf
  
  sp$ = RemoveString(keepdnsy$, Chr(10), #PB_String_NoCase, 1)
  sp$ = RemoveString(sp$, Chr(13), #PB_String_NoCase, 1)
  sp$ = Trim(RemoveString(sp$, "CSDVersion", #PB_String_NoCase, 1))
  
  Compilerprodtyp = RunProgram("wmic.exe", " path Win32_OperatingSystem get ProductType", "", #PB_Program_Hide|#PB_Program_Open|#PB_Program_Read)
  Outprodtyp$ = ""
  If Compilerprodtyp
    While ProgramRunning(Compilerprodtyp)
      Outprodtyp$=ReadProgramString(Compilerprodtyp)
      keepprodtyp$ = keepprodtyp$ + Outprodtyp$ + #CRLF$
    Wend
    CloseProgram(Compilerprodtyp)
  EndIf
  
    
  prodtyp$ = RemoveString(keepprodtyp$, Chr(10), #PB_String_NoCase, 1)
  prodtyp$ = RemoveString(prodtyp$, Chr(13), #PB_String_NoCase, 1)
  prodtyp$ = Trim(RemoveString(prodtyp$, "ProductType", #PB_String_NoCase, 1))
  prdtp = Val(Trim(prodtyp$))
  
  Select prdtp
    Case #VER_NT_WORKSTATION
      prdtype$ = "Workstation"
    Case #VER_NT_DOMAIN_CONTROLLER
      prdtype$ = "Domain Controller"
    Case #VER_NT_SERVER
      prdtype$ = "Server"
    Default
      prdtype$ = "Unknown Type"
  EndSelect
  
  osnamever$ = name$ + " " + version$ + " - " + prdtype$ + " - " + sp$
  
  ProcedureReturn osnamever$
  
EndProcedure

Debug GetOSNameInfo()
Wish my windows 8 machine was up and running :(, hard drive failures are a pain, but..... anyway here on on Windows 7 64 bit it produces:
Microsoft Windows 7 Ultimate 6.1.7601 - Workstation - Service Pack 1
My understanding though is that wmi via the command prompt also gives the correct version information for Windows 8 and 8.1.
Last edited by smacker on Tue Nov 11, 2014 5:50 pm, edited 2 times in total.
The world and human nature was screwed up before I was born. It's not my fault and I'm just stuck with trying to deal with the mess left behind, so don't blame me.
smacker
User
User
Posts: 55
Joined: Thu Nov 06, 2014 7:18 pm

Re: Windows 8 and 8.1

Post by smacker »

As a sort of 'companion' add on type of thing if one wishes to dig further and get into the product type info after getting the version info, there is http://msdn.microsoft.com/en-us/library/ms724358.aspx

Code: Select all

Prototype PGetProductInfo(In_dwOSMajorVersion, In_dwOSMinorVersion, In_dwSpMajorVersion, In_dwSpMinorVersion, Out_pdwReturnedProductType)
Global GetProductInfo.PGetProductInfo

Lib_Kernel32 = OpenLibrary(#PB_Any, "Kernel32.dll")
If IsLibrary(Lib_Kernel32)
  isLib_Kernel32.b = #True
  GetProductInfo.PGetProductInfo=GetFunction(Lib_Kernel32,"GetProductInfo")
Else
  isLib_Kernel32.b = #False
EndIf

#PRODUCT_BUSINESS = $00000006 ; Business
#PRODUCT_BUSINESS_N = $00000010 ; Business N
#PRODUCT_CLUSTER_SERVER = $00000012 ; HPC Edition
#PRODUCT_CLUSTER_SERVER_V = $00000040 ; Server Hyper Core V
#PRODUCT_CORE = $00000065             ; Windows 8
#PRODUCT_CORE_N = $00000062           ; Windows 8 N
#PRODUCT_CORE_COUNTRYSPECIFIC = $00000063 ; Windows 8 China
#PRODUCT_CORE_SINGLELANGUAGE = $00000064 ; Windows 8 Single Language
#PRODUCT_DATACENTER_EVALUATION_SERVER = $00000050 ; Server Datacenter (evaluation installation)
#PRODUCT_DATACENTER_SERVER = $00000008 ; Server Datacenter (full installation)
#PRODUCT_DATACENTER_SERVER_CORE = $0000000C ; Server Datacenter (core installation)
#PRODUCT_DATACENTER_SERVER_CORE_V = $00000027 ; Server Datacenter without Hyper-V (core installation)
#PRODUCT_DATACENTER_SERVER_V = $00000025 ; Server Datacenter without Hyper-V (full installation)
#PRODUCT_ENTERPRISE = $00000004 ; Enterprise
#PRODUCT_ENTERPRISE_E = $00000046 ; Not supported
#PRODUCT_ENTERPRISE_N_EVALUATION = $00000054 ; Enterprise N (evaluation installation)
#PRODUCT_ENTERPRISE_N = $0000001B ; Enterprise N
#PRODUCT_ENTERPRISE_EVALUATION = $00000048 ; Server Enterprise (evaluation installation)
#PRODUCT_ENTERPRISE_SERVER = $0000000A ; Server Enterprise (full installation)
#PRODUCT_ENTERPRISE_SERVER_CORE = $0000000E ; Server Enterprise (core installation)
#PRODUCT_ENTERPRISE_SERVER_CORE_V = $00000029 ; Server Enterprise without Hyper-V (core installation)
#PRODUCT_ENTERPRISE_SERVER_IA64 = $0000000F ; Server Enterprise For Itanium-based Systems
#PRODUCT_ENTERPRISE_SERVER_V = $00000026 ; Server Enterprise without Hyper-V (full installation)
#PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT = $0000003B ; Windows Essential Server Solution Management
#PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL = $0000003C ; Windows Essential Server Solution Additional
#PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC = $0000003D ; Windows Essential Server Solution Management SVC
#PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC = $0000003E ; Windows Essential Server Solution Additional SVC
#PRODUCT_HOME_BASIC = $00000002 ; Home Basic
#PRODUCT_HOME_BASIC_E = $00000043 ; Not supported
#PRODUCT_HOME_BASIC_N = $00000005 ; Home Basic N
#PRODUCT_HOME_PREMIUM = $00000003 ; Home Premium
#PRODUCT_HOME_PREMIUM_E = $00000044 ; Not supported
#PRODUCT_HOME_PREMIUM_N = $0000001A ; Home Premium N
#PRODUCT_HOME_PREMIUM_SERVER = $00000022 ; Windows Home Server 2011
#PRODUCT_HOME_SERVER = $00000013 ; Windows Storage Server 2008 R2 Essentials
#PRODUCT_HYPERV = $0000002A      ; Microsoft Hyper-V Server
#PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT = $0000001E ; Windows Essential Business Server Management Server
#PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING = $00000020 ; Windows Essential Business Server Messaging Server
#PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY = $0000001F ; Windows Essential Business Server Security Server
#PRODUCT_MULTIPOINT_STANDARD_SERVER = $0000004C ; Windows MultiPoint Server Standard (full installation)
#PRODUCT_MULTIPOINT_PREMIUM_SERVER = $0000004D ; Windows MultiPoint Server Premium (full installation)
#PRODUCT_PROFESSIONAL = $00000030 ; Professional
#PRODUCT_PROFESSIONAL_E = $00000045 ; Not supported
#PRODUCT_PROFESSIONAL_N = $00000031 ; Professional N
#PRODUCT_PROFESSIONAL_WMC = $00000067 ; Professional With Media Center
#PRODUCT_SB_SOLUTION_SERVER_EM = $00000036 ; Server For SB Solutions EM
#PRODUCT_SERVER_FOR_SB_SOLUTIONS = $00000033 ; Server For SB Solutions
#PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM = $00000037 ; Server For SB Solutions EM
#PRODUCT_SERVER_FOR_SMALLBUSINESS = $00000018 ; Windows Server 2008 For Windows Essential Server Solutions
#PRODUCT_SERVER_FOR_SMALLBUSINESS_V = $00000023 ; Windows Server 2008 without Hyper-V For Windows Essential Server Solutions
#PRODUCT_SERVER_FOUNDATION = $00000021 ; Server Foundation
#PRODUCT_SB_SOLUTION_SERVER = $00000032 ; Windows Small Business Server 2011 Essentials
#PRODUCT_SMALLBUSINESS_SERVER = $00000009 ; Windows Small Business Server
#PRODUCT_SMALLBUSINESS_SERVER_PREMIUM = $00000019 ; Small Business Server Premium
#PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE = $0000003F ; Small Business Server Premium (core installation)
#PRODUCT_SOLUTION_EMBEDDEDSERVER = $00000038 ;Windows MultiPoint Server
#PRODUCT_STANDARD_EVALUATION_SERVER = $0000004F ; Server Standard (evaluation installation)
#PRODUCT_STANDARD_SERVER = $00000007 ; Server Standard
#PRODUCT_STANDARD_SERVER_CORE = $0000000D ; Server Standard (core installation)
#PRODUCT_STANDARD_SERVER_V = $00000024 ; Server Standard without Hyper-V
#PRODUCT_STANDARD_SERVER_CORE_V = $00000028 ; Server Standard without Hyper-V (core installation)
#PRODUCT_STANDARD_SERVER_SOLUTIONS = $00000034 ; Server Solutions Premium
#PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE = $00000035 ; Server Solutions Premium (core installation)
#PRODUCT_STARTER = $0000000B ; Starter
#PRODUCT_STARTER_E = $00000042 ; Not supported
#PRODUCT_STARTER_N = $0000002F ; Starter N
#PRODUCT_STORAGE_ENTERPRISE_SERVER = $00000017 ; Storage Server Enterprise
#PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE = $0000002E ; Storage Server Enterprise (core installation)
#PRODUCT_STORAGE_EXPRESS_SERVER = $00000014 ; Storage Server Express
#PRODUCT_STORAGE_EXPRESS_SERVER_CORE = $0000002B ; Storage Server Express (core installation)
#PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER = $00000060 ; Storage Server Standard (evaluation installation)
#PRODUCT_STORAGE_STANDARD_SERVER = $00000015 ; Storage Server Standard
#PRODUCT_STORAGE_STANDARD_SERVER_CORE = $0000002C ; Storage Server Standard (core installation)
#PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER = $0000005F ; Storage Server Workgroup (evaluation installation)
#PRODUCT_STORAGE_WORKGROUP_SERVER = $00000016 ; Storage Server Workgroup
#PRODUCT_STORAGE_WORKGROUP_SERVER_CORE = $0000002D ; Storage Server Workgroup (core installation)
#PRODUCT_UNDEFINED = $00000000 ; An unknown product
#PRODUCT_ULTIMATE = $00000001 ; Ultimate
#PRODUCT_ULTIMATE_E = $00000047 ; Not supported
#PRODUCT_ULTIMATE_N = $0000001C ; Ultimate N
#PRODUCT_WEB_SERVER = $00000011 ; Web Server (full installation)
#PRODUCT_WEB_SERVER_CORE = $0000001D ; Web Server (core installation)

Procedure OS_ProductType(maj.l, min.l)

pdwReturnedProductType.l

GetProductInfo(maj, min, #Null, #Null, @pdwReturnedProductType)

ProcedureReturn pdwReturnedProductType
EndProcedure

Debug OS_ProductType(6, 1) ; Windows 7
Debug OS_ProductType(6, 2) ; Windows 8

; filter here according to the constants above
The world and human nature was screwed up before I was born. It's not my fault and I'm just stuck with trying to deal with the mess left behind, so don't blame me.
smacker
User
User
Posts: 55
Joined: Thu Nov 06, 2014 7:18 pm

Re: Windows 8 and 8.1

Post by smacker »

Based upon discussions between myself and luis in this thread (to which the credit goes to luis who furthered the proper use of the 'RtlGetVersion' function for me), if anyone has use for it, check OS version, or just a simple true/false if an OS is Windows 7, or Windows 7 with Service Pack 1, Windows 8, Windows 8.1, or (the upcoming as of this post date) Windows 10:

Code: Select all

Prototype.i PRtlGetVersion(*lpVersionInformation) : Global RtlGetVersion.PRtlGetVersion

Lib_ntdll = OpenLibrary(#PB_Any, "ntdll.dll")
If IsLibrary(Lib_ntdll)
  isLib_ntdll.b = #True
  RtlGetVersion.PRtlGetVersion=GetFunction(Lib_ntdll,"RtlGetVersion")
Else
  isLib_ntdll.b = #False
EndIf

Structure KERNEL_OSVERSIONINFOEX
  dwOSVersionInfoSize.l
  dwMajorVersion.l
  dwMinorVersion.l
  dwBuildNumber.l
  dwPlatformId.l
  szCSDVersion.u[128]
  wServicePackMajor.w
  wServicePackMinor.w
  wSuiteMask.w
  wProductType.b
  wReserved.b
EndStructure

Procedure.s GetVersion()
  osinfo.KERNEL_OSVERSIONINFOEX
  osinfo\dwOSVersionInfoSize = SizeOf(osinfo)
  
  RtlGetVersion(@osinfo)
  
  Select osinfo\wProductType
    Case #VER_NT_WORKSTATION
      prodtype$ = "Workstation"
    Case #VER_NT_DOMAIN_CONTROLLER
      prodtype$ = "Domain Controller"
    Case #VER_NT_SERVER
      prodtype$ = "Server"
  EndSelect
  
  cds$ = PeekS(@osinfo\szCSDVersion[0], -1, #PB_Unicode)
 
  ProcedureReturn Str(osinfo\dwMajorVersion) + "." + Str(osinfo\dwMinorVersion) + "." + Str(osinfo\dwBuildNumber) + "  " + cds$ + "  " + prodtype$
EndProcedure


Procedure IsGetVersionWin7()
  
  osinfo.KERNEL_OSVERSIONINFOEX
  osinfo\dwOSVersionInfoSize = SizeOf(osinfo)
  
  RtlGetVersion(@osinfo)
  
  If osinfo\dwMajorVersion + osinfo\dwMinorVersion = 7
    IsWin7.b = #True
  Else
    IsWin7.b = #False
  EndIf
  
  ProcedureReturn IsWin7
EndProcedure

Procedure IsGetVersionWin7WithServicePack1()
  
  osinfo.KERNEL_OSVERSIONINFOEX
  osinfo\dwOSVersionInfoSize = SizeOf(osinfo)
  
  RtlGetVersion(@osinfo)
  
  If (osinfo\dwMajorVersion + osinfo\dwMinorVersion = 7) And (osinfo\wServicePackMajor = 1 And osinfo\wServicePackMinor = 0)
    IsWin7.b = #True
  Else
    IsWin7.b = #False
  EndIf
  
  ProcedureReturn IsWin7
EndProcedure

Procedure IsGetVersionWin8()
  
  osinfo.KERNEL_OSVERSIONINFOEX
  osinfo\dwOSVersionInfoSize = SizeOf(osinfo)
  
  RtlGetVersion(@osinfo)
  
  If osinfo\dwMajorVersion + osinfo\dwMinorVersion = 8
    IsWin8.b = #True
  Else
    IsWin8.b = #False
  EndIf
  
  ProcedureReturn IsWin8
EndProcedure

Procedure IsGetVersionWin8Point1()
  
  osinfo.KERNEL_OSVERSIONINFOEX
  osinfo\dwOSVersionInfoSize = SizeOf(osinfo)
  
  RtlGetVersion(@osinfo)
  
  If osinfo\dwMajorVersion + osinfo\dwMinorVersion = 9
    IsWin8p1.b = #True
  Else
    IsWin8p1.b = #False
  EndIf
  
  ProcedureReturn IsWin8p1
EndProcedure

Procedure IsGetVersionWin10()
  
  osinfo.KERNEL_OSVERSIONINFOEX 
  osinfo\dwOSVersionInfoSize = SizeOf(osinfo)
  
  RtlGetVersion(@osinfo)
  
  If osinfo\dwMajorVersion + osinfo\dwMinorVersion = 10
    IsWin10.b = #True
  Else
    IsWin10.b = #False
  EndIf
  
  ProcedureReturn IsWin10
EndProcedure

Debug IsGetVersionWin7()
Debug IsGetVersionWin7WithServicePack1()
Debug IsGetVersionWin8()
Debug IsGetVersionWin8Point1()
Debug IsGetVersionWin10()
Debug GetVersion()

CloseLibrary(Lib_ntdll)
The world and human nature was screwed up before I was born. It's not my fault and I'm just stuck with trying to deal with the mess left behind, so don't blame me.
User avatar
bgeraghty
User
User
Posts: 52
Joined: Wed Apr 02, 2014 12:45 am
Location: irc.ibotched.it:+6697
Contact:

Re: Windows 8 and 8.1

Post by bgeraghty »

Code: Select all

Procedure.s NativeGetVersion()
    Protected Dim tOSVw.l($54)
   
    lib = LoadLibrary_("ntdll.dll")
    proc = GetProcAddress_(lib, "RtlGetVersion")
    tOSVw(0) = $54 * $4
    CallFunctionFast(proc, @tOSVw())
    FreeLibrary_(lib)
 
    ProcedureReturn Str(tOSVw(4)) + "." + Str(tOSVw(1)) + "." + Str(tOSVw(2))
EndProcedure
 
Procedure.s VersionToName(sVersion.s)
    Select sVersion
        Case "1.0.0":     ProcedureReturn "Windows 95"
        Case "1.1.0":     ProcedureReturn "Windows 98"
        Case "1.9.0":     ProcedureReturn "Windows Millenium"
        Case "2.3.0":     ProcedureReturn "Windows NT 3.51"
        Case "2.4.0":     ProcedureReturn "Windows NT 4.0"
        Case "2.5.0":     ProcedureReturn "Windows 2000"
        Case "2.5.1":     ProcedureReturn "Windows XP"
        Case "2.5.3":     ProcedureReturn "Windows 2003 (SERVER)"
        Case "2.6.0":     ProcedureReturn "Windows Vista"
        Case "2.6.1":     ProcedureReturn "Windows 7"
        Case "2.6.2":     ProcedureReturn "Windows 8"
        Case "2.6.3":     ProcedureReturn "Windows 8.1"
        Default:        ProcedureReturn "Unknown"
    EndSelect
EndProcedure  
  
Debug VersionToName(NativeGetVersion())
?
SolveMyIssue_() - No QuickHelp available.
Post Reply