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 :

Fonction Windows (LookupAccountName) qui fait crasher mon programme


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut Fonction Windows (LookupAccountName) qui fait crasher mon programme
    Bonjour tout le monde,

    J'appèle dans mon programme la fonction LookupAccountName, mais elle fait crasher mon programme ("xxxx.exe a rencontré un problème et doit fermer" ...).

    La déclaration des variables et l'appel à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SID sid;
    DWORD taille2=sizeof(sid);
    PSID_NAME_USE typeSID;
    
    LookupAccountName(NULL, "admin2", &sid, &taille2, NULL, 0, typeSID);
    // Je met le nom du compte manuellement pour l'instant pour pouvoir exclure l'hypothèse d'une conversion foireuse.
    Ça compile sans erreur ni warning, mais quand le programme arrive à l'appel de la fonction, Windows me dit que le programme "a renconté un problème".

    J'ai essayé de remplire la fonction avec tout à NULL, normalement, je pense que la fonction aurais du renvoyer une erreur, mais ça fait planter le programme tout pareil.


    Vous en pensez quoi ?

    Merci.
    A+, Pierre.

  2. #2
    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 normal que rien ne soit initialisé ?
    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.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Médinoc
    C'est normal que rien ne soit initialisé ?
    Non. Surtout le pointeur "peUse".

    J'aurai plutôt écrit :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SID sid;
    DWORD taille2=sizeof(sid);
    SID_NAME_USE typeSID;
    LookupAccountName(NULL, "admin2", &sid, &taille2, NULL, 0, &typeSID);

    Citation Envoyé par Pierre.g
    Vous en pensez quoi ?
    Que, contrairement à ce que tu dis, ce n'est pas LookupAccountName() qui fait "crasher" ton programme : c'est plutôt, a priori, le fait que tu n'as pas initialisé un pointeur.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    Je n'avais pas mis le & devant la variable typeSID parce que je l'avais initialisée comme PSID_NAME_USE et non comme SID_NAME_USE. Reprenez-mois si c'est une connerie.

    De l'initialiser en SID_NAME_USE et de mettre le & a le même résultat, ça crash.

    C'est bien ce que vous me décriviez ?

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Pierre.g
    Je n'avais pas mis le & devant la variable typeSID parce que je l'avais initialisée comme PSID_NAME_USE et non comme SID_NAME_USE. Reprenez-mois si c'est une connerie.
    Ce qui suit est une déclaration, pas une initialisation :.

    Donc, vous déclariez une variable de type PSID_NAME_USE appelée typeSID.
    Le "P" de "PSID_NAME_USE" veut dire, sauf erreur de ma part, "Pointer" ("Pointeur" en français).
    Donc, votre variable "typeSID" était un pointeur.

    Vous appeliez LookupAccountName() en lui passant ce pointeur pour que LookupAccountName() écrive des informations à l'adresse pointée par ce pointeur.
    Mais quelle adresse était pointée par ce pointeur ? Aviez-vous INITIALISE ce pointeur pour qu'il pointe vers une zone de mémoire allouée ?

    Je ne garantis pas que l'extrait de code que j'ai donné fonctionne : je suis sous linux et n'ai même pas essayé. Par contre, je suis certain d'une chose : le pointeur que je transmettais à LookupAccountName() était initialisé et pointait vers une zone de mémoire allouée.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    OK, exacte, mais le problème, c'est que même avec cette correction, ça continus de planter.

    A votre avis, est-ce que le rapport d'erreur de Microsoft pourrait me donner plus de précisions ?

  7. #7
    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
    non.
    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.

  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
    Essaie ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SID sid;
    DWORD taille2=sizeof(sid);
    SID_NAME_USE typeSID;
    DWORD cchDomain = 0;
    LookupAccountName(NULL, TEXT("admin2"), &sid, &taille2, NULL, &cchDomain, &typeSID);
    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
    mat.M
    Invité(e)
    Par défaut
    Je suis très sceptique sur cette déclaration:
    DWORD taille2=sizeof(sid);
    S'il y a un plantage c'est que LookupAccountName essaie d'allouer un tampon trop petit de taille taille2 , qu'on tente d'écrire dedans

    Regarder ceci
    Converting a Binary SID to String Format in C++
    The ConvertSidToStringSid and ConvertStringSidToSid functions convert a SID to and from string format. For a description of the SID string format, see SID Components.


    Windows NT: ConvertSidToStringSid and ConvertStringSidToSid are not supported. Use the following code to convert a SID to string format.

    The following example shows converting a SID to string format. It is designed for systems that do not support the ConvertSidToStringSid and ConvertStringSidToSid functions.


    BOOL GetTextualSid(
    PSID pSid, // binary SID
    LPTSTR TextualSid, // buffer for Textual representation of SID
    LPDWORD lpdwBufferLen // required/provided TextualSid buffersize
    )
    {
    PSID_IDENTIFIER_AUTHORITY psia;
    DWORD dwSubAuthorities;
    DWORD dwSidRev=SID_REVISION;
    DWORD dwCounter;
    DWORD dwSidSize;

    // Validate the binary SID.

    if(!IsValidSid(pSid)) return FALSE;

    // Get the identifier authority value from the SID.

    psia = GetSidIdentifierAuthority(pSid);

    // Get the number of subauthorities in the SID.

    dwSubAuthorities = *GetSidSubAuthorityCount(pSid);

    // Compute the buffer length.
    // S-SID_REVISION- + IdentifierAuthority- + subauthorities- + NULL

    dwSidSize=(15 + 12 + (12 * dwSubAuthorities) + 1) * sizeof(TCHAR);

    // Check input buffer length.
    // If too small, indicate the proper size and set the last error.

    if (*lpdwBufferLen < dwSidSize)
    {
    *lpdwBufferLen = dwSidSize;
    SetLastError(ERROR_INSUFFICIENT_BUFFER);
    return FALSE;
    }

    // Add 'S' prefix and revision number to the string.

    dwSidSize=wsprintf(TextualSid, TEXT("S-%lu-"), dwSidRev );

    // Add a SID identifier authority to the string.

    if ( (psia->Value[0] != 0) || (psia->Value[1] != 0) )
    {
    dwSidSize+=wsprintf(TextualSid + lstrlen(TextualSid),
    TEXT("0x%02hx%02hx%02hx%02hx%02hx%02hx"),
    (USHORT)psia->Value[0],
    (USHORT)psia->Value[1],
    (USHORT)psia->Value[2],
    (USHORT)psia->Value[3],
    (USHORT)psia->Value[4],
    (USHORT)psia->Value[5]);
    }
    else
    {
    dwSidSize+=wsprintf(TextualSid + lstrlen(TextualSid),
    TEXT("%lu"),
    (ULONG)(psia->Value[5] ) +
    (ULONG)(psia->Value[4] << 8) +
    (ULONG)(psia->Value[3] << 16) +
    (ULONG)(psia->Value[2] << 24) );
    }

    // Add SID subauthorities to the string.
    //
    for (dwCounter=0 ; dwCounter < dwSubAuthorities ; dwCounter++)
    {
    dwSidSize+=wsprintf(TextualSid + dwSidSize, TEXT("-%lu"),
    *GetSidSubAuthority(pSid, dwCounter) );
    }

    return TRUE;
    }

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    Ah merci, on avance, le programme ne crash plus, apparemment Windows n'aimais pas que l'on ne lui donne pas de variable pour le dernier argument.

    Par contre, LookupAccountName me renvoie une erreur : ERROR_RESOURCE_TYPE_NOT_FOUND => The specified resource type cannot be found in the image file.

    Le "type de ressource spécifié" ne serait pas bon, ça voudrait dire que c'est la manière dont on lui donne le nom du compte qui n'est pas bonne ?

  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
    Pour moi, ce n'est carrément pas la bonne erreur.
    Ça ressemble à une erreur qu'on aurait avec FindResource()...
    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 régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    Salut mat.M, comment trouverais-tu la taille d'une structure SID autrement ?

    Médinoc, pourtant, la fonction renvois 0, donc erreur, juste avant GetLastError renvoi 0 et juste après GetLastError renvoi 1813, donc à moins que je me soit trompé de table de correspondance, on n'en saura pas beaucoup plus de ce coté là.

  13. #13
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Pierre.g
    Salut mat.M, comment trouverais-tu la taille d'une structure SID autrement ?

    .
    Ben s'il n'ya plus de plantage sizeof(sid) suffit alors

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    C'est bon, finalement, je me suis inspiré d'un code que j'ai trouvé je ne sais plus trop où.

    Il faut d'abord appeller la fonction sans lui donner l'adresse de la structure SID mais en lui donnant la variable de sa taille, comme ça, la fonction remplis la taille que doit avoir la stucture SID.
    Ensuite on alloue la mémoire qu'il faut avec pSid=(PSID) malloc(tailleSid);
    Et ensuite on peut faire un deuxième appel à la fonction en lui donnant l'adresse ou il doit écrire le SID.
    Tu avais bien présentis le truc mat.M !

    Donc, le problème est résolue, mais j'ai maintenant un autre problème : c'est très bien, j'arrive à avoir le SID en texte comme je le voulais, mais dans le registre, dans HKEY_USER, il n'y a aucune clé qui ne correspond à ces SID ...
    Si vous voulez me répondre à ce problème, veuillez le faire ici svp : ICI
    Merci.
    A+, Pierre.

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

Discussions similaires

  1. Comment savoir ce qui fait crasher mon application
    Par rdeumil dans le forum Android
    Réponses: 4
    Dernier message: 03/05/2013, 16h50
  2. fonction dans dll qui fait planter programme
    Par chris069 dans le forum C++
    Réponses: 22
    Dernier message: 28/04/2009, 16h19
  3. fonction qui fait crasher le serveur ?
    Par hannibal69 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 19/04/2007, 16h00
  4. Réponses: 2
    Dernier message: 17/03/2007, 13h43
  5. Réponses: 8
    Dernier message: 21/07/2006, 11h23

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