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 :

KEY_VALUE_PARTIAL_INFORMATION structure : taille et type de Data


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 KEY_VALUE_PARTIAL_INFORMATION structure : taille et type de Data
    Bonjour,

    Je n'arrive pas à comprendre comment cette structure se remplit :

    Mon header est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef UCHAR unsigned char;
    
    
    typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
      ULONG  TitleIndex;
      ULONG  Type;
      ULONG  DataLength;
      UCHAR Data[1];  //  Variable size
    } KEY_VALUE_PARTIAL_INFORMATION;
    typedef KEY_VALUE_PARTIAL_INFORMATION *PKEY_VALUE_PARTIAL_INFORMATION;
    Prenons le cas d'une donnée de type REG_SZ, dont le contenu est 'Hello' :

    DataLength me renvoie 12 en taille, taille en bytes. Or le type UCHAR, pour unsigned char est codé sur un byte et non 2. Pourtant, lorsque je lis le contenu de Data, j'obtiens 'H e l l o ', soit 12 caractères au lieu des 6 attendus ( hello + caractère null de fin de chaîne ).

    Voici comment je lis le contenu de Data actuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          else if (pDataInfo->Type == 1 || pDataInfo->Type == 2)
                      {
                          if (pDataInfo->DataLength != 0)
                             for (b = 0; b < pDataInfo->DataLength; b++)
                                 putchar(pDataInfo->Data[b]);
                          printf("\n");
                      }
    Par contre, si j'utilise plutôt le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                    else if (pDataInfo->Type == 1 || pDataInfo->Type == 2)
                      {
                        if (pDataInfo->DataLength != 0)
                          for (b = 0; b < pDataInfo->DataLength; b++)
                           {
                             putchar(pDataInfo->Data[b]);
                             b++;
                           }
                        printf("\n");
                      }
    j'obtiens bien 'Hello' uniquement.

    Mais je ne comprends pas pourquoi la taille de DataLength est égale à deux fois la taille attendue, comme si c'était de type WCHAR.

    Merci par avance pour vos explications.


  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Ton buffer est un UCHAR [] mais t'as du mettre des WCHAR là-dedans. Comme la chaîne est null-terminated, tu peux l'afficher avec printf("%S", (WCHAR *)pDataInfo->Data) par exemple. Le cast est juste nécessaire pour supprimer le warning, mais il n'est pas obligatoire.

  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
    Exact, ça marche impec' avec printf("%S").

    Je vais voir alors comment ça se fait que la donnée Data se remplisse avec du WCHAR alors que ce n'est pas souhaité.

    Je te tiens au courant si j'ai un souci.

    Merci

Discussions similaires

  1. Réponses: 12
    Dernier message: 01/03/2007, 11h28
  2. Réponses: 2
    Dernier message: 27/02/2007, 18h17
  3. [SQL SERVER 2000]taille et type des champs
    Par Franck2mars dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 09/05/2006, 11h59
  4. la taille des types de base
    Par hansaplast dans le forum C++
    Réponses: 4
    Dernier message: 27/04/2006, 15h59
  5. Taille de types ?
    Par gOgHi dans le forum Oracle
    Réponses: 12
    Dernier message: 27/10/2004, 17h56

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