Lire et écrire dans le registre une REG_EXPAND_SZ

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Snooze
Messages : 7
Inscription : jeu. 22/janv./2004 16:13

Lire et écrire dans le registre une REG_EXPAND_SZ

Message par Snooze »

Bonjour à tous.
J'ai cherché sur Purearena, testé différente libs comme Droopy, regini et jhregistry mais les si cela fonctionne pour des clés en texte simple, je n'arrive pas a obtenir une REG_EXPAND_SZ.

Je souhaite lire et écrire dans HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
la clé DevicePath.

En vbs, cela donne

Code : Tout sélectionner

Const HKEY_LOCAL_MACHINE = &H80000002

Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
    strComputer & "\root\default:StdRegProv")
 
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion"
strValueName = "DevicePath"
oReg.GetExpandedStringValue HKEY_LOCAL_MACHINE,strKeyPath, _
    strValueName,strValue
 
Wscript.Echo  "DevicePath=: " & strValueConst HKEY_LOCAL_MACHINE = &H80000002
et pour l'écriture

Code : Tout sélectionner

Const HKEY_LOCAL_MACHINE = &H80000002

strComputer = "."
 
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
    strComputer & "\root\default:StdRegProv")
 
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion"
strValueName = "DevicePath"
strValue = "titi"
 
oReg.SetExpandedStringValue _
    HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
Quelqu'un a-t-il des infos à ce sujet ?

Fred, pourrais tu nous faire une gestion de la registry ?

Merci d'avance et bon dimanche.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

salut, utilise les API windows, voici un exemple :

Code : Tout sélectionner

    If RegCreateKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.gs", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      RegSetValueEx_(NewKey, "Application", 0, #REG_SZ,  "WinGS.exe", Len("WinGS.exe")+1)
      RegCloseKey_(NewKey)
    EndIf
utilise #REG_EXPAND_SZ comme valeur à la place de #REG_SZ, pour lire, utilise RegOpenKeyEx_ et RegQueryValueEx_
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

a ma connaissance o ne peut que lire ou ecrire soit un nombre soit une chaine de caracteres !!


ne connaissant pas ton "REG_EXPAND_SZ"

voici quand meme 3 procedures
1 pour lire une chaine dans le registre
1 pour ecrire une chaine de caractere
1 pour lire une nombre



 
; Lire une chaine dans le registre
Procedure.s ReadRegKey(OpenKey.l,SubKey.s,ValueName.s) ; ====================================== ReadRegKey
    
     ; key.s=ReadRegKey(#HKEY_LOCAL_MACHINE,"SOFTWARE\Zone Labs\ZoneAlarm","InstallDirectory")
     ;
    hKey.l=0
    keyvalue.s= Space (255)
    DataSize.l=255
    
     If RegOpenKeyEx_ (OpenKey,SubKey,0, #KEY_READ ,@hKey)
        keyvalue= ""
     Else
         If RegQueryValueEx_ (hKey,ValueName,0,0,@keyvalue,@DataSize)
            keyvalue= ""
         Else
            keyvalue= Left (keyvalue,DataSize-1)
         EndIf
         RegCloseKey_ (hKey)
     EndIf
    
     ProcedureReturn keyvalue
EndProcedure

; ecrire une chaine dans le registre
Procedure.l WriteRegKey(OpenKey.l,SubKey.s,keyset.s,keyvalue.s) ; ------------------------ WRITE KEY
    
     ; result.l=WriteRegKey(#HKEY_LOCAL_MACHINE,"SOFTWARE\Test Program Name","Test","TestValue")
    
    hKey.l=0
     If RegCreateKey_ (OpenKey,SubKey,@hKey)=0
        Result=1
        DataSize.l= Len (keyvalue)
         If RegSetValueEx_ (hKey,keyset,0, #REG_SZ ,@keyvalue,DataSize)=0
            Result=2
         EndIf
         RegCloseKey_ (hKey)
     EndIf
     ProcedureReturn Result
     ;returns 0 if error / could not open or create SubKey
     ;returns 1 if error / could not write new value
     ;returns 2 if Success!!
    
EndProcedure

; ecrire un long dans le registre
Procedure.l WritebinaryRegKey(OpenKey.l,SubKey.s,keyset.s,keyvalue.l) ; ------------------------ WRITE KEY
    
     ; result.l=WriteRegKey(#HKEY_LOCAL_MACHINE,"SOFTWARE\Test Program Name","Test","TestValue")
    
    hKey.l=0
     If RegCreateKey_ (OpenKey,SubKey,@hKey)=0
        Result=1
        DataSize.l=4 ; nombre d'octets ecrit !!
         If RegSetValueEx_ (hKey,keyset,0, #REG_BINARY ,@keyvalue,DataSize)=0
            Result=2
         EndIf
         RegCloseKey_ (hKey)
     EndIf
     ProcedureReturn Result
     ;returns 0 if error / could not open or create SubKey
     ;returns 1 if error / could not write new value
     ;returns 2 if Success!!
    
EndProcedure

Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Dobro a écrit :a ma connaissance o ne peut que lire ou ecrire soit un nombre soit une chaine de caracteres !!

ne connaissant pas ton "REG_EXPAND_SZ"
en visualisant la base de registre, tu trouveras plusieurs type de valeurs dont #REG_EXPAND_SZ ou #REG_BINARY, #REG_DWORD, etc...

toutes les valeurs ici : http://www.secretswindows.com/index.php ... nction.php

:)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

flaith a écrit :
Dobro a écrit :a ma connaissance o ne peut que lire ou ecrire soit un nombre soit une chaine de caracteres !!

ne connaissant pas ton "REG_EXPAND_SZ"
en visualisant la base de registre, tu trouveras plusieurs type de valeurs dont #REG_EXPAND_SZ ou #REG_BINARY, #REG_DWORD, etc...

toutes les valeurs ici : http://www.secretswindows.com/index.php ... nction.php

:)
ben justement ça reviens a ce que je disais :D
REG_EXPAND_SZ = 2 Chaine se terminant par NULL contenant des références non-étendues aux variables de l'environnement (par exemple %PATH%).
c'est donc une chaine de caractere qui se termine par un zero
ça tombe bien en purebasic les chaines de caracteres se termine par un zero, il me semble ...!! ??
sinon tu ajoute

Code : Tout sélectionner

+asc(0)
a la chaine de caractere, et voilou :D
Snooze
Messages : 7
Inscription : jeu. 22/janv./2004 16:13

Message par Snooze »

Merci à tous pour ces infos, je vais tâcher de digérer tout ça...

Pour info, une REG_SZ_EXPAND permet de stocker une grande quantité d'info, bien plus qu'une simple clé texte.

Dans le cas de DevicePath, ça permet de stocker le chemin de quantité de drivers pour des carte-mères différentes et donc de faire une image Ghost pour des machines différentes.

C'est ce que fait Sysprep, mais quand on renseigne le fichier sysprep.inf, on est limité à 4ko, ce qui est très juste quand on voit la longueur des noms dossiers de drivers (extraits avec mydriver), c'est pourquoi il faut taper directement dans la registry qui ne connait pas ces limitations.

Je posterai mon programme, si j'y arrive :)

Encore merci et bonne soirée.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Pour la lecture essaye ça :

Code : Tout sélectionner

Procedure.s Reg_GetValue(topKey, sKeyName.s, sValueName.s, ComputerName.s) 
  lpData.s 
  GetValue.s =""
  
  If Left(sKeyName, 1) = "\" 
    sKeyName = Right(sKeyName, Len(sKeyName) - 1) 
  EndIf 
  
  If ComputerName = "" 
    GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
  Else 
    lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry) 
    GetHandle = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
  EndIf 
  
  If GetHandle = #ERROR_SUCCESS 
    lpcbData = 60000 
    lpData = Space(60000) 
    
    GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData) 
    
    If GetHandle = #ERROR_SUCCESS 
      Select lType 
        Case #REG_SZ 
          GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData) 
          
          If GetHandle = 0 
            GetValue = Left(lpData, lpcbData - 1) 
          Else 
            GetValue = "" 
          EndIf 
          
          
        Case #REG_MULTI_SZ 
          GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData) 
          
          If GetHandle = 0 
            ptr=@lpData
            
            
            ;/ Renvoie chaine terminée par deux Chr nul
            For n=ptr To ptr+lpcbData-2
              If PeekB(n)=0
                GetValue+Chr(13)
              Else
                GetValue+Chr(PeekB(n))
              EndIf
            Next
            
          Else 
            GetValue = "" 
          EndIf 
          
        Case #REG_DWORD 
          GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lpType, @lpDataDWORD, @lpcbData) 
          
          If GetHandle = 0 
            GetValue = Str(lpDataDWORD) 
          Else 
            GetValue = "0" 
          EndIf 
          
      EndSelect 
    EndIf
  EndIf 
  RegCloseKey_(hKey) 
  ProcedureReturn GetValue 
EndProcedure 

Debug Reg_GetValue(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\ServiceGroupOrder","List",".")

Répondre