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 :

ERROR_INVALID_HANDLE : The handle is invalid.


Sujet :

Windows

  1. #1
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut ERROR_INVALID_HANDLE : The handle is invalid.
    Bonjour à tous,
    Je code en c++ avec la librairie windows.h et j'ai un problème que je ne comprends pas.
    J'ai recopié le code de la doc Microsoft et ça fais 3 jours que j'essaye de le bidouiller, et ça ne fonctionne toujours pas ... (https://support.microsoft.com/en-us/kb/131065)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (!AdjustTokenPrivileges(handle_token, false, &tkp, 0, NULL, NULL))
    {
           // afficher l'erreur
    }
    J'ai l'erreur ERROR_INVALID_HANDLE sur cette fonction alors que mon handle_token s'est créé sans erreur avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OpenProcessToken(handle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &handle_token)
    Quelqu'un aurait une idée ?
    Es-ce un problème 32/64 bit ou un truc du genre ?


    PS: Je développe avec Qt sous Windows 10 et je compile avec MinGW 32bit

  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
    Donc, tu vérifies le retour de OpenProcessToken() et il retourne bien TRUE? Bizarre.
    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 éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut re
    Oui c'est bizarre, c'est pour cela que je demande de l'aide !
    En faite je pense que le problème ne vient pas de mon handle_token mais je sais pas trop ...

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 742
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 742
    Points : 15 159
    Points
    15 159
    Par défaut
    Salut,
    Citation Envoyé par Matthieu76 Voir le message
    J'ai recopié le code de la doc Microsoft et ça fait 3 jours que j'essaye de le bidouiller, et ça ne fonctionne toujours pas ... (https://support.microsoft.com/en-us/kb/131065)
    T'as dû grave le bidouiller et/ou le recopier à l'arrache, car l'appel à OpenProcessToken que tu essayes d'utiliser est absent sur la page que tu nous donnes...

    Par ailleurs, l'autre appel, AdjustTokenPrivileges, utilisé 3 fois sur la page, passe un paramètre avec une taille définie quand toi tu le passes à 0. Pas sûr que ça le fasse.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    On peut utiliser indifféremment OpenProcessToken ou OpenThreadToken suivant ce qu'on veut faire.
    L'explication de Microsoft porte sur le thread.
    Matthieu76 a choisi d'utiliser le process.

    Quant aux 3 derniers paramètres de AdjustTokenPrivilege, ils peuvent être nuls.
    Voir https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

    L'erreur ne vient donc pas de là ...

    Lorsqu'on utilise OpenProcessToken pour changer les privilèges, le premier paramètre doit avoir été créé par GetCurrentProcess.
    Est-ce le cas ?

  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
    Ah, on ne peut pas changer les privilèges d'un autre processus?
    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 éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut re
    Tu as raison, j'ai vu partout des GetCurrentProcess() mais ce n'est pas ce que j'utilise car je cherche à modifier les privilèges d'un autre process pour accès au droit PROCESS_VM_READ.
    Du coup ce que je cherche à faire est impossible ?

  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
    Tu veux que ton programme A donne à un processus B le privilège Debug, pour que celui-ci puisse aller lire la mémoire d'un processus C?
    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 éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut oui
    Oui, je veux que mon programme A modifie les privilèges de mon programme B pour que pour programme A puisse lire les valeur RAM de mon programme B.

    En faite ça marche très bien sur d'autre processus ou j'ai PROCESS_ALL_ACCESS mais pas sur celui-là donc je cherche à modifier les privilèges.

  10. #10
    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
    Citation Envoyé par Matthieu76 Voir le message
    Oui, je veux que mon programme A modifie les privilèges de mon programme B
    O.. kay...
    pour que pour programme A puisse lire les valeur RAM de mon programme B.
    Hein? Quel est le rapport?

    Il n'existe pas, à ma connaissance, de privilège qui signifie "empêcher les autres processus de lire ma RAM" (en dehors, peut-être, du Protected Media Path, mais là c'est un tout autre problème).

    Edit: Il existe, par contre, des droits d'accès aux processus (d'un utilisateur à l'autre) ainsi qu'un privilège qui signifie "ouvrir n'importe quel autre processus quels que soient les droits d'accès" mais c'est le programme A qui a besoin de ce privilège, pas un autre...
    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.

  11. #11
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut re
    Okay !!!!
    Donc c'est mon propre process de mon programme qui doit avoir le privilège de lire dans la RAM de mon autre process.
    Et du coup comment je suis spécifie le process dans lequel je dois lire dans la RAM ?
    En gros j'aimerais faire un OpenProcess sur mon autre process mais avec le paramètre PROCESS_VM_READ mais j'ai l'erreur ERROR_ACCESS_DENIED.

    En tout cas merci beaucoup pour votre aide.

  12. #12
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut re
    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
        handle = OpenProcess(PROCESS_ALL_ACCESS, false, process_id);
        if(!handle)
        {
            string error = (string)itoa(GetLastError(), c, 10);
            MainWindow::instance()->write("Could not get handle !", "console");
            CloseHandle(handle);
            if(error == "5")
            {
                MainWindow::instance()->write("ERROR_ACCESS_DENIED", "console");
    
                handle = OpenProcess(WRITE_DAC | READ_CONTROL | WRITE_OWNER | PROCESS_QUERY_INFORMATION, false, process_id);
                if(!handle && !OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &handle_token))
                {
                   MainWindow::instance()->write("ERROR_ACCESS_DENIED", "console");
                   return false;
                }
                MainWindow::instance()->write("START :\n", "console");
    
    
                DWORD sizep = sizeof(TOKEN_PRIVILEGES);
                TOKEN_PRIVILEGES tkp;
                tkp.PrivilegeCount = 1;
                tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
                if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid))
                {
                    MainWindow::instance()->write("ERROR in LookupPrivilegeValue", "console");
                    return FALSE;
                }
                if (!AdjustTokenPrivileges(handle_token, false, &tkp, sizep, NULL, NULL))//handle_token, FALSE, &tkp, sizeof(tkp), NULL, 0
                {
                    MainWindow::instance()->write((string)"error : " + itoa(GetLastError(), c, 10), "console");
                    MainWindow::instance()->write("Error in AdjustTokenPrivileges", "console");
                    return FALSE;
                }
                else
                    MainWindow::instance()->write("It works !!!", "console");
    
    
            }
        }
    Voilà mon code, ce sera plus simple pour voir les erreurs.
    J'ai juste changer mon handle en GetCurrentProcess() et ça ne fonctionne toujours pas (même erreur) mais je continue à chercher

  13. #13
    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
    string error = (string)itoa(GetLastError(), c, 10);
    What the fuck...


    Bon, en attendant, normalement le handle devrait être correct, et AdjustTokenPrivileges devrait soit réussir, soit échouer avec ERROR_NOT_ALL_ASSIGNED si ton processus A ne tourne pas en Admin.

    Par contre maintenant tu fais ton OpenProcess(PROCESS_ALL_ACCESS) beaucoup trop tôt! Il échouera avec ERROR_ACCESS_DENIED si le processus B ne t'appartient pas (ou tourne en Admin et pas toi) parce que le privilège Debug n'est pas encore actif...
    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.

  14. #14
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut
    Je vérifie d'abord que j'ai pas les droits et ensuite je modifie les privilèges et après faut que je refasse un OpenProcess() mais pour l'instant ça me marche pas.
    Je vais essayer de re-tester en administrateur.

    PS: Je viens de tester en admin et j'ai toujours la même erreur.

    Personne n'a d'idée ?

  15. #15
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut
    OK, ça marche mais quand j'appelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    handle = OpenProcess(PROCESS_VM_READ, false, process_id);
    J'ai toujours ERROR_ACCESS_DENIED.

  16. #16
    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
    Est-ce un processus spécial que tu cherches à ouvrir? (service, lecteur multimédia susceptible d'être protégé par le Protected Media Path, etc.)
    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.

  17. #17
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut
    Çà marche!!!!

    MERCI BEAUCOUP LES MECS

  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
    Je suggère de poster le code final pour les suivants qui auraient le même problème.
    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 éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut
    Voila le code qui fonctionne :

    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
    BOOL SetPrivilege(HANDLE hToken, LPCTSTR Privilege, BOOL bEnablePrivilege)
    {
        char c[32];
        TOKEN_PRIVILEGES tp;
        LUID luid;
        TOKEN_PRIVILEGES tpPrevious;
        DWORD cbPrevious=sizeof(TOKEN_PRIVILEGES);
    
        if(!LookupPrivilegeValue( NULL, Privilege, &luid ))
            return FALSE;
    
        tp.PrivilegeCount           = 1;
        tp.Privileges[0].Luid       = luid;
        tp.Privileges[0].Attributes = 0;
    
    
        if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &tpPrevious, &cbPrevious))
        {
            MainWindow::instance()->write((string)"error : " + itoa(GetLastError(), c, 10), "console");
            return FALSE;
        }
        tpPrevious.PrivilegeCount       = 1;
        tpPrevious.Privileges[0].Luid   = luid;
    
        if(bEnablePrivilege)
        {
            tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
        }
        else
        {
            tpPrevious.Privileges[0].Attributes ^= (SE_PRIVILEGE_ENABLED & tpPrevious.Privileges[0].Attributes);
        }
    
        if (!AdjustTokenPrivileges(hToken, FALSE, &tpPrevious, cbPrevious, NULL, NULL))
        {
            MainWindow::instance()->write((string)"error : " + itoa(GetLastError(), c, 10), "console");
            return FALSE;
        }
        return TRUE;
    }
    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
    if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &handle_token))
                {
                    if (GetLastError() == ERROR_NO_TOKEN)
                    {
                        if (!ImpersonateSelf(SecurityImpersonation))
                        {
                            return false;
                        }
    
                        if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &handle_token))
                        {
                            return false;
                        }
                    }
                    else
                    {
                        return false;
                    }
                }
    
                MainWindow::instance()->write("START :\n", "console");
    
                if (!SetPrivilege(handle_token, SE_DEBUG_NAME, TRUE))       // !AdjustTokenPrivileges(handle_token, false, &tkp, 0, NULL, NULL))//handle_token, FALSE, &tkp, sizeof(tkp), NULL, 0
                {
                    MainWindow::instance()->write((string)"error : " + itoa(GetLastError(), c, 10), "console");
                    MainWindow::instance()->write("Error in AdjustTokenPrivileges", "console");
                    return FALSE;
                }
                else
                    MainWindow::instance()->write("It works !!!", "console");

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/11/2011, 11h45
  2. Réponses: 10
    Dernier message: 15/10/2011, 22h21
  3. invalid handle: kesako?
    Par ataya dans le forum JDBC
    Réponses: 5
    Dernier message: 18/05/2007, 12h26
  4. dbExpress error: Invalid handle
    Par lassmust dans le forum Bases de données
    Réponses: 1
    Dernier message: 14/11/2006, 12h04

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