IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

RegSetValueKeyEx et les données binaires


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut RegSetValueKeyEx et les données binaires
    Bonjour,

    Je cherche à écrire une donnée de type REG_BINARY à partir d'une chaîne récupérée via la ligne de commande.

    Par exemple, la chaîne fed8a44536b4. Seulement quand je la passe en argument à RegSetValueKeyEx, il me convertit cette chaîne en hexa, alors qu'à la base, elle y est déjà...

    J'essaye de recoder reg.exe.

    Donc quand je tape dans un batch :

    EgwReg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\TEST" /v:"avgnt" /t:"REG_BINARY" /d:"fed856a245"

    la fonction me convertit la chaîne en hexa, alors que moi je voulais une données binaires de 5 octects : fe d8 56 a2 45

    Sur le coup je me suis dit que c'était impossible à réaliser sans les api natives, mais reg.exe le fait et je crois que reg.exe est exclusivement codé avec l'api win 32.

    Merci de m'éclairer.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Il n'y a que des chaînes de caractères qui soient passées en paramètres.

    Vous devez convertir votre chaine de caractère selon le type qu'elle est sensée représentée
    "fed856a245" n'est qu'une suite de 10 caractères.
    Pour en faire du binaire, vous devez convertir chaque paire de caractères en un octet dont la valeur est comprise entre 0 et 255.
    Pour faire du binaire, vous concaténez les octets et non des caractères.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Bonjour,

    Pour faire du binaire, vous concaténez les octets et non des caractères.
    Merci pour la réponse. Pourrais-je avoir un exemple afin de mieux comprendre ? Car je ne vois pas comment concaténer des octets.

    Merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne vois pas où est le problème. J'ai testé l'exemple de l'aide de la vraie commande Reg, et j'ai bien les données comme je m'y attends.

    Ce que tu dois faire dans ton code, c'est convertir toi-même depuis l'hexa vers les données brutes avant d'appeler RegSetValueEx().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Ce que tu dois faire dans ton code, c'est convertir toi-même depuis l'hexa vers les données brutes avant d'appeler RegSetValueEx().
    C'est là où je bloque, car RegSetValueKeyEx attend un string de type char il me semble. Depuis l'invite de commande, on récupère une chaîne de caractères. Et je n'arrive pas à trouver comment convertir cette chaîne en données brutes, sans compter que RegSetValueKeyEx convertit automatiquement en hexa...

    Je ne sais pas si je suis très clair pour expliquer mon problème...

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    RegSetValueEx() ne convertit rien, et n'attend pas une string: Elle attend un tableau de bytes, et stocke un tableau de bytes.

    C'est regedit qui convertit en hexa, et seulement pour l'affichage.

    Le problème, c'est qu'au lieu de bytes, tu passes de l'hexa à RegSetValueEx(), donc tu te retrouves avec de l'hexa dans le Registre, et regedit t'affiche de l'hexa converti en hexa.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    c'est qu'au lieu de bytes, tu passes de l'hexa à RegSetValueEx()
    Comment faire pour passer des bytes alors ?

    Je pense que tu as saisi ce que je cherchais à faire.

    Merci.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Hé bien vu que tu reçois de l'hexa sur la ligne de commande, tu dois les reconvertir en bytes avant d'appeler RegSetValueEx().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Hé bien vu que tu reçois de l'hexa sur la ligne de commande, tu dois les reconvertir en bytes avant d'appeler RegSetValueEx().
    Oki, je vais chercher comment faire alors. Merci de ton aide.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
        if (compare_ch(ptr_registre->type, "REG_BINARY") == 0)
        {
          DWORD dwRet;
          int   a;
          BYTE *tab;
    
          if ((tab = malloc((ptr_registre->dataSize)-1)) == NULL)
            printf("Error !\n");
    
          for (a = 0; a < ptr_registre->dataSize; a++)
            tab[a] = (BYTE)(ptr_registre->data[a]);
    
          dwRet = RegSetValueEx(hKey,
                ptr_registre->value,
                0,
                REG_BINARY,
                tab,
                (ptr_registre->dataSize-1));
    
          if (dwRet != ERROR_SUCCESS)
            {
              printf("%s ->  Error : the value can't be created...\n\n", ptr_registre->value);
              exit(EXIT_FAILURE);
            }
        }
    Mais ça ne change rien...

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est mauvais.

    Commence par te faire une fonction pour convertir deux caractères hexadécimaux en un octet. Puis utilise cette fonction en boucle.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Commence par te faire une fonction pour convertir deux caractères hexadécimaux en un octet. Puis utilise cette fonction en boucle.
    Ha... ça je ne sais pas faire. Je me disais bien qu'il fallait faire quelque chose de ce genre. Bon je vais chercher et voir si je trouve comment faire.

    Merci de m'aiguiller.


  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    J'ai du mal à saisir comment faire, je ne sais même pas vraiment par où commencer. Peux-tu me dire si je suis sur la bonne voie ?

    Prenons l'exemple d'un tableau de type char contenant "a8". Pour en transformer ça en byte, de manière à obtenir a8 en hexa :

    a = 0000 1010b en binaire
    8 = 0000 1000b en binaire

    Donc pour avoir a8 il faut que j'obtienne :

    1010 1000b

    Suis-je sur la bonne voie ?

    Je n'ai aucune idée sur comment créer un tableau de BYTE et comment le remplir. Je veux bien quelques exemples/indications à ce sujet, merci.

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Oui.
    Un BYTE, c'est juste un unsigned char.
    Pour faire simple:
    • Fais une fonction qui convertit un caractère ASCII hexadécimal en la valeur qu'il représente (traduction: fonction pour convertir 'F' en la valeur 15).
    • Appelle cette fonction deux fois
    • Ensuite, un petit décalage de 4 à gauche et un petit OU binaire...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Merci pour ta réponse, je crois que je commence à comprendre l'idée.

    Concernant ta première indication, voilà la fonction que j'ai obtenue pour passer de l'hexa au décimal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <stdio.h>
    #include <windows.h>
    
    unsigned char conv_hexa_ascii(char hexa[])
    {
      unsigned char     result;
      int               tab[1];
      int               a;
      int               b;
    
      int count = 0;
      static const char digits[] = "0123456789ABCDEF";
    
      for (a = 0; a < strlen(hexa); a++)
        {
          for (b = 0; b <= 15; b++)
            {
              if (hexa[a] == digits[b])
                tab[a] = count;
              else
                count += 1;
            }
          count = 0;
        }
    
      result = tab[0]*16 + tab[1];
      return (result);
    }
    
    int main ()
    {
      printf("%d\n", conv_hexa_ascii("C8"));
    
      return (0);
    }
    C'est loin d'être bien codé je pense, mais bon, ça marche. Je le retravaillerai.

    Appelle cette fonction deux fois
    Je l'appelle 2 fois, c'est-à-dire ? Une fois pour le caractère hexadécimal 'a', une autre fois pour le deuxième caractère hexadécimal '8' ? ( pour reprendre mon exemple ci-dessus ). En fait, je l'appelle pour chaque caractère de type char du string initial ?

    J'ai du mal à visualiser cette étape.

    La dernière, je pense avoir compris le principe.

    J'avance lentement, mais j'avance.


  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Je pense avoir compris, en fait pour faire ce que je souhaite, cette fonction suffit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    unsigned char conv_hexa_ascii(char hexa)
    {
      unsigned char     result;
      int               b;
    
      int count = 0;
      static const char digits[] = "0123456789ABCDEF";
    
      for (b = 0; b <= 15; b++)
        {
          if (hexa == digits[b])
            result = count;
          else
            count += 1;
        }
    
      return (result);
    }
    J'essaye de parvenir au résultat, car je pense avoir tout compris, ignore mon précédent message. Je te tiens au courant.


  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Et voilà, j'ai réussi ! Bon c'est un brouillon de code hein, mais l'idée est là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #include <stdio.h>
    #include <windows.h>
    
    unsigned char conv_hexa_ascii(char hexa)
    {
      unsigned char     result;
      int               b;
    
      int count = 0;
      static const char digits[] = "0123456789ABCDEF";
    
      for (b = 0; b <= 15; b++)
        {
          if (hexa == digits[b])
            result = count;
          else
            count += 1;
        }
    
      return (result);
    }
    
    int main ()
    {
      char tableau[] = "E8F67586001A";
      int a;
      size_t n;
      int b = 0;
      BYTE *destination;
    
      n = strlen((tableau)-1)/2;
      destination = malloc(n);
    
      for (a = 0; a < strlen(tableau); a++)
        {
          destination[b] = (conv_hexa_ascii(tableau[a]) << 4) | (conv_hexa_ascii(tableau[a+1]));
          a += 1;
          b += 1;
        }
    
      for (a = 0; a < n; a++)
        printf("%02x\n", destination[a]);
    
      return (0);
    }
    Je tiens tout particulièrement à te remercier Médinoc, car jamais je n'aurais pu trouver ça tout seul, car c'est la première fois que je fais des manipulations bit à bit. J'ai vu quelque chose de nouveau aujourd'hui.

    Un grand merci.

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu essaies de brûler des étapes. Et en plus, ta fonction est un peu lente.

    Plus simple:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    int ConvertOneHexCharToItsValue(char c)
    {
    	if(c>='0' && c<='9')
    		return c - '0';
    	else if(c>='a' && c<='f')
    		return c - 'a' + 10;
    	else if(c>='A' && c<='F')
    		return c - 'A' + 10;
    	else
    		return 0;
    }
     
    unsigned char ConvertTwoHexCharsToByte(char const c[])
    {
    	int highNibble = ConvertOneHexCharToItsValue(c[0]);
    	int lowNibble = ConvertOneHexCharToItsValue(c[1]);
    	int ret = (highNibble << 4) | lowNibble;
    	return (unsigned char)ret;
    }
     
    unsigned char * ConvertHexStringToBytes(char const s[])
    {
    	size_t cb = strlen(s)/2;
    	unsigned char *pRet = malloc(cb);
    	if(pRet != 0)
    	{
    		size_t i;
    		for(i=0 ; i<cb ; i++)
    			pRet[i] = ConvertTwoHexCharsToByte(s+2*i);
    	}
    	return pRet;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Oui je suis encore débutant en C

    Merci pour cette correction.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Soft pour lire les données binaires
    Par Tristan33000 dans le forum Access
    Réponses: 1
    Dernier message: 29/04/2013, 13h39
  2. Réponses: 10
    Dernier message: 17/03/2012, 17h32
  3. Les données chaîne ou binaires seront tronquées
    Par ecoinfo dans le forum ASP.NET
    Réponses: 3
    Dernier message: 12/02/2009, 16h04
  4. Envoie de donnée binaires avec les sockets
    Par java_developper dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 01/06/2007, 11h11
  5. Problème avec les données binaire
    Par Lachessis dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/08/2005, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo