Page 1 sur 2

Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : ven. 10/juil./2015 16:25
par Marc56
Windows 8.1
C:\>ver
Microsoft Windows [version 6.3.9600]

Debug OSVersion() => 90 Ok

Windows 10
C:\>ver
Microsoft Windows [version 10.0.10162]

Debug OSVersion() => 90 aussi!

Alors que dans le visualiseur de structures on a
#PB_OS_Windows_8 (= 90)
#PB_OS_Windows_Future (= 200) ; Nouvelle version de Windows (n'existant pas lorsque le programme a été écrit)

Au début j'ai pensé que PB se rendait compte que Windows 10 tournait dans virtualbox sous windows 8.1. Mais non, si je lance un XP dans cette même VM, osversion retourne alors 60 qui est bien la constante pour #PB_OS_Windows_XP

Bon, c'est pas trop gênant. J'espère juste que c'est prévu dans la 5.40.
(Oui, d'accord W10 est encore en bêta, mais il sort officiellement le 29 juillet)

Je ne sais pas sur quelle API se base la fonction OSVersion() de PB ?
Perso, j'ai toujours utilisé 'ver' et 'winver' pour identifier la version.
:wink:

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : ven. 10/juil./2015 16:41
par Ar-S
Nul doute qu'ils corrigeront ceci dans la 5.40 (ou 5.32 ?)
Sous MINT 17.2 l'OS version est de 2000 :) ce qui correspond bien à #PB_OS_Linux_Future

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : ven. 10/juil./2015 16:59
par blendman
Ar-S a écrit :Nul doute qu'ils corrigeront ceci dans la 5.40 (ou 5.32 ?)
et elle sort quand cette 5.40 ? :)

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : ven. 10/juil./2015 17:56
par Ar-S
héhé faut demander au grand Manitou

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : ven. 10/juil./2015 18:25
par falsam
Bonjour Marc.

Pourrais tu tester ce code et le mettre à jour avec la valeur retourner dans la variable sVersion.

Code : Tout sélectionner

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 sVersion
      
  EndSelect
EndProcedure  
  
Debug VersionToName(NativeGetVersion())
Merci :)

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : sam. 11/juil./2015 6:58
par Marc56
falsam a écrit :et elle sort quand cette 5.40 ?
Fred a donné une indication la semaine dernière :)
...'Back on PureBasic: yes we are hard at work to ship the new release (which will be an LTS one - yes it's 2 years already). We except it to be out for a beta in august and final in september. It already has a quite big list of new stuffs !'
http://www.purebasic.fr/english/viewtop ... 67#p467467
falsam a écrit :Pourrais tu tester ce code et le mettre à jour avec la valeur retourner dans la variable sVersion.
Done. Marche pô :(
Attente du démarrage du programme...
Type d'exécutable: Windows - x64 (64bit, Unicode)
Exécutable démarré.
[ERREUR] Ligne: 7
[ERREUR] Accès mémoire invalide. (erreur d'écriture à l'adresse 0)


Ligne 7: proc = GetProcAddress_(lib, "RtlGetVersion")

Je pensais avoir installé la version démo (l'erreur venant d'une instruction d'appel direct API) mais ce n'est pas cela. J'ai bien installé ma version sous licence.

Edit: Même message avec la version x86 de PB 5.31 complet (avec en plus un tas de messages méchants de Windows 10 quand j'ai voulu installer une version x86 sur ce bel os neuf x64)

:?

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : sam. 11/juil./2015 8:32
par Mesa
Dans le même fil, Fred a dit aussi
For example, we are now toying with a LLVM backend for PB which is much easier to do, thanks to the JS pipeline which is more highlevel than raw ASM one. It won't be in the 5.40 version, but it should be ready one day or another :)
Ça veut dire qu'il(s) étudie(nt) le "compilateur" LLVM et ici http://llvm.org/Features.html on peut lire:
An easily retargettable code generator, which currently supports X86, X86-64, PowerPC, PowerPC-64, ARM, Thumb, SPARC, Alpha, CellSPU, MIPS, MSP430, SystemZ, and XCore.
A Just-In-Time (JIT) code generation system, which currently supports X86, X86-64, ARM, AArch64, Mips, SystemZ, PowerPC, and PowerPC-64.
Il est donc possible d'espérer une version ARM et donc android (au mieux) après la version 5.40 de PB ...


M.

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : sam. 11/juil./2015 10:00
par GallyHC
Pour Windows, un code simple que l'on peu forcement exploiter en attendant la nouvelle version de PB :

Code : Tout sélectionner

;
; VERSION DE WINDOWS.
;

Define osv.OSVERSIONINFO
osv\dwOSVersionInfoSize=SizeOf(OSVERSIONINFO)

If GetVersionEx_(osv) = #True
  Debug Str(osv\dwMajorVersion) + "." + Str(osv\dwMinorVersion) + "." + Str(osv\dwBuildNumber)
EndIf
et voila ce que pourrait donné le code en attendant :

Code : Tout sélectionner

Select OSVersion()
  Case  #PB_OS_Windows_NT3_51
  Case  #PB_OS_Windows_95
  Case  #PB_OS_Windows_NT_4
  Case  #PB_OS_Windows_98
  Case  #PB_OS_Windows_ME
  Case  #PB_OS_Windows_2000
  Case  #PB_OS_Windows_XP
  Case  #PB_OS_Windows_Server_2003
  Case  #PB_OS_Windows_Vista
  Case  #PB_OS_Windows_Server_2008
  Case  #PB_OS_Windows_7
  Case  #PB_OS_Windows_Server_2008_R2  
  Case  #PB_OS_Windows_Server_2012
  Case  #PB_OS_Windows_8, #PB_OS_Windows_Future
    Define osv.OSVERSIONINFO
    osv\dwOSVersionInfoSize=SizeOf(OSVERSIONINFO)
    If GetVersionEx_(osv) = #True
      If osv\dwMajorVersion = 10
        Debug "C'est un Windows 10"
      EndIf
      Debug Str(osv\dwMajorVersion) + "." + Str(osv\dwMinorVersion) + "." + Str(osv\dwBuildNumber)
    EndIf
  Default
    Debug "La c'est un problème"
EndSelect
Cordialement,
GallyHC

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : sam. 11/juil./2015 10:18
par falsam
Merci pour cette alternative Gally. J'attend de voir la valeur retourné par Window 10.

Marc, merci d'avoir accepter de faire le cobaye avec mon code. Le résultat n'est pas celui que j'attendais mais je suis presque pas étonné. Je pense que Windows 10 va nous réserver quelques surprises. Je pense que tu testeras le code de gally. A plus tard pour le résultat.

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : sam. 11/juil./2015 10:48
par falsam
Marc56 a écrit :
falsam a écrit :et elle sort quand cette 5.40 ?
Fred a donné une indication la semaine dernière
Faudrait voir ne pas me confondre avec Blendman. Ce manant, cet hérétique :mrgreen:
blendman a écrit :et elle sort quand cette 5.40 ? :)

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : sam. 11/juil./2015 13:37
par Marc56
@falsam: Désolé :? :roll:

@GallyHC: 6.2.9200 :wink:
(Windows 10 Pro Insider Preview - Version d'évaluation. Build 10162)(Virtualbox 4.3)

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : sam. 11/juil./2015 14:29
par GallyHC
Bonjour,

Heuuu la y aura un problème, avec une version donné par la dll de Windows a "6.2.9200" et avec ce que tu donne dans ton premier poste "Microsoft Windows [version 6.3.9600]" pour Windows 8 donc "6.3.9600".

Windows 10 a une version moindre que Windows 8 (problème). D'où le bug avec "PureBasic" qui compare aussi, surement les numéro de version des OS.

Cordialement,
GallyHC

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : sam. 11/juil./2015 16:10
par Marc56
Ton programme retourne la même valeur pour Windows 8.1 et Windows 10

Windows 8.1
Ver : 6.3.9600
Winver : 6.3.9600
PB : 6.2.9200

Windows 10
Ver 10.0.10162
Winver : 10.0.10162
PB: 6.2.9200

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : sam. 11/juil./2015 19:12
par GallyHC
Bonjour,

Mon source utilise "GetVersionEx_()", fonction de Microsoft pour avoir la version de Windows. Le problème est donc la (tu as une version beta).

Cordialement,
GallyHC

Re: Mauvais numéro retourné par OSVersion() sous Windows 10

Publié : dim. 12/juil./2015 10:23
par GallyHC
Bonjour,

Un code pour avoir quelque informations supplémentaire.

Code : Tout sélectionner

#PRODUCT_ULTIMATE                     = 1
#PRODUCT_HOME_PREMIUM                 = 3
#PRODUCT_HOME_BASIC                   = 2
#PRODUCT_ENTERPRISE                   = 4
#PRODUCT_BUSINESS                     = 6
#PRODUCT_STANDARD_SERVER              = 7
#PRODUCT_DATACENTER_SERVER            = 8
#PRODUCT_SMALLBUSINESS_SERVER         = 9
#PRODUCT_DATACENTER_SERVER_CORE       = $0C
#PRODUCT_ENTERPRISE_SERVER            = $0A
#PRODUCT_STARTER                      = $0B
#PRODUCT_STANDARD_SERVER_CORE         = $0D
#PRODUCT_ENTERPRISE_SERVER_CORE       = $0E
#PRODUCT_ENTERPRISE_SERVER_IA64       = $0F
#PRODUCT_WEB_SERVER                   = $11
#PRODUCT_CLUSTER_SERVER               = $12
#PRODUCT_SMALLBUSINESS_SERVER_PREMIUM = $19
#PRODUCT_WEB_SERVER_CORE              = $1D
#PRODUCT_PROFESSIONAL                 = $30

#KEY_WOW64_64KEY                      = $100
#KEY_WOW64_32KEY                      = $200
;
;
;
Procedure Is64Bit()
;
  Protected.i retval, openlib
  Protected *IsWow64
  
  openlib = OpenLibrary(0, "Kernel32.dll")
  If openlib
     *IsWow64 = GetFunction(0,"IsWow64Process")
     If *IsWow64
       CallFunctionFast(*IsWow64, GetCurrentProcess_(), @retval)
       CloseLibrary(0)
       ProcedureReturn retval
     EndIf
   EndIf
   ProcedureReturn -1

EndProcedure
;
;
;
Procedure.s GetWindowsProductKey()
; ROUTINE DU PRODUCTKEY DE WINDOWS.
  Protected i.i
  Protected j.i
  Protected x.i
  Protected hKey.i
  Protected lRes.i
  Protected size.i    = 280
  Protected result.s
  Protected *memkey = AllocateMemory(size)
  Protected *newmem = AllocateMemory(size)
  Protected *digits = AllocateMemory(25)
 
  PokeS(*digits, "BCDFGHJKMPQRTVWXY2346789", -1, #PB_Ascii)
  If OSVersion() <= #PB_OS_Windows_2000
    lRes = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows NT\CurrentVersion", 0, #KEY_READ, @hKey)
  Else
    lRes = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows NT\CurrentVersion", 0, #KEY_READ | #KEY_WOW64_64KEY, @hKey)
  EndIf
  If lRes = #ERROR_SUCCESS
    RegQueryValueEx_(hKey, "DigitalProductID", 0, 0, *memkey, @size)
    RegCloseKey_(hKey)
    If size <> 280
      For i = 24 To 0 Step -1
        x = 0
        For j = 66 To 52 Step -1
          x = (x << 8) + PeekA(*memkey + j)
          PokeA(*memkey + j, x / 24)
          x % 24
        Next j
        PokeA(*newmem + i, PeekA(*digits + x))
      Next i
      For i = 0 To 15 Step 5
        result + PeekS(*newmem + i, 5, #PB_Ascii) + " "
      Next i
      result + PeekS(*newmem + 20, 5, #PB_Ascii)
    EndIf
  EndIf
  FreeMemory(*memkey)
  FreeMemory(*newmem)
  FreeMemory(*digits)
  ProcedureReturn Result

EndProcedure
;
;
;
Define sType.s
Define osv.OSVERSIONINFOEX
osv\dwOSVersionInfoSize=SizeOf(OSVERSIONINFOEX)
If GetVersionEx_(osv) = #True
  Debug "OS Version : " + Str(osv\dwMajorVersion) + "." + Str(osv\dwMinorVersion) + "." + Str(osv\dwBuildNumber)
  Debug "Windows key : " + GetWindowsProductKey()
  Debug "Service Pack : " + Str(osv\wServicePackMajor) + "." + Str(osv\wServicePackMajor)
  Debug "Service Info : " + PeekS(@osv\szCSDVersion, -1, #PB_Unicode)
  Select osv\wProductType
    Case #PRODUCT_ULTIMATE
       sType = "Ultimate Edition"
    Case #PRODUCT_PROFESSIONAL
       sType = "Professional"
    Case #PRODUCT_HOME_PREMIUM
       sType = "Home Premium Edition"
     Case #PRODUCT_HOME_BASIC
       sType = "Home Basic Edition"
    Case #PRODUCT_ENTERPRISE
       sType = "Enterprise Edition"
    Case #PRODUCT_BUSINESS
       sType = "Business Edition"
    Case #PRODUCT_STARTER:
       sType = "Starter Edition"
    Case #PRODUCT_CLUSTER_SERVER
       sType = "Cluster Server Edition"
    Case #PRODUCT_DATACENTER_SERVER
       sType = "Datacenter Edition"
    Case #PRODUCT_DATACENTER_SERVER_CORE
       sType = "Datacenter Edition (core installation)"
    Case #PRODUCT_ENTERPRISE_SERVER
       sType = "Enterprise Edition"
    Case #PRODUCT_ENTERPRISE_SERVER_CORE
       sType = "Enterprise Edition (core installation)"
    Case #PRODUCT_ENTERPRISE_SERVER_IA64
       sType = "Enterprise Edition for Itanium-based Systems"
    Case #PRODUCT_SMALLBUSINESS_SERVER
       sType = "Small Business Server"
    Case #PRODUCT_SMALLBUSINESS_SERVER_PREMIUM
       sType = "Small Business Server Premium Edition"
    Case #PRODUCT_STANDARD_SERVER
       sType = "Standard Edition"
    Case #PRODUCT_STANDARD_SERVER_CORE
       sType = "Standard Edition (core installation)"
    Case #PRODUCT_WEB_SERVER
       sType = "Web Server Edition"
    Case #PRODUCT_WEB_SERVER_CORE
       sType = "Web Server Edition (core installation)"
    Default
       sType = ""
  EndSelect
  Debug "Windows Type : " + sType
  Select Is64Bit()
    Case 0
      Debug "x32"
    Case 1
      Debug "x64"
  EndSelect
EndIf
Cordialement,
GallyHC