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 :

erreur 299 avec EnumProcessModulesEx en 64 bits


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Par défaut erreur 299 avec EnumProcessModulesEx en 64 bits
    Je souhaite énumérer les modules d'une application. Je suis sous Windows 64 bits, je compile les applications en 64 bits. Donc tout est en 64 bits. Dependency Walker me le confirme.

    Le code :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #define PSAPI_VERSION 1
    #define _WIN32_WINNT 0x0601
    #include <stdio.h>
    
    #include <windows.h>
    #include <psapi.h>
    
    #define CREATE_THREAD_ACCESS (PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_SUSPEND_RESUME | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ)
    
    int main(int argc, char *argv[])
    {
      STARTUPINFO         si;
      PROCESS_INFORMATION pi;
      char *file;
      HANDLE process;
      HMODULE modules[100];
      DWORD s;
      DWORD needed;
      BOOL res;
    
      if (argc < 2)
        return 1;
    
      file = argv[1];
      printf("%s\n", file);
    
      ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
      ZeroMemory(&si, sizeof(STARTUPINFO));
      si.cb = sizeof(STARTUPINFO);
    
      if (!CreateProcess(NULL, file, NULL, NULL, TRUE,
                         CREATE_SUSPENDED, NULL, NULL, &si, &pi))
        {
          printf("CreateProcess failed \n");
          return 1;
        }
    
      if (!WaitForInputIdle(pi.hProcess, INFINITE))
        {
          printf("WaitForInputIdle failed \n");
          return 1;
        }
    
      process = OpenProcess(QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pi.dwProcessId);
      if (!process)
        {
          printf("OpenProcess failed \n");
          return 1;
        }
    
      s = 100;
      res = EnumProcessModulesEx(process, modules, sizeof(modules), &needed, LIST_MODULES_ALL);
      if (!res)
        {
          printf("failed %ld\n", GetLastError());
        }
    
      printf("size : %lu, %Iu\n", needed, needed / sizeof(HMODULE));
    
      return 0;
    }
    EnumProcessModulesEx() retourne l'erreur 299 (ERROR_PARTIAL_COPY : "Only part of a ReadProcessMemory or WriteProcessMemory request was completed.")

    Cette erreur est renvoyée en général quand il y a un processus 32 bits, mais l'application que je passe en argument est une application 64 bits, ainsi que l'application dont le code est ci-dessus.

    Quelqu'un verrait-il le problème ?

    merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je n'ai pas d'explication pour ton problème, mais juste pour être sûr, tu devrais peut-être commencer ton application par un printf("sizeof ptr=%Iu\n", sizeof(void*));Pour le reste, j'ai trois remarques:
    • j'ai du mal à voir comment tu peux WaitForInputIdle() un processus créé en CREATE_SUSPENDED...
    • le handle retourné par CreateProcess() est supposé avoir les droits PROCESS_ALL_ACCESS, j'ai donc du mal à voir pourquoi tu ouvres un second handle dessus.
    • Attention, needed est un DWORD et non pas un size_t, ton printf() final échouera donc.
    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é
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je n'ai pas d'explication pour ton problème, mais juste pour être sûr, tu devrais peut-être commencer ton application par un printf("sizeof ptr=%Iu\n", sizeof(void*));
    tu veux vérifier que je suis en 64 bits ? Donc oui, et ça renvoie 8.

    Pour le reste, j'ai trois remarques:
    • j'ai du mal à voir comment tu peux WaitForInputIdle() un processus créé en CREATE_SUSPENDED...
    • le handle retourné par CreateProcess() est supposé avoir les droits PROCESS_ALL_ACCESS, j'ai donc du mal à voir pourquoi tu ouvres un second handle dessus.
    honnêtement, je ne sais pas trop. Je fais un petit outil de détection de memory leak avec injection de DLL et d'API hook. J'ai repris une partie de code trouvé sur Codeproject pour cette partie. Le bout de code que j'ai posté est une adaptation très rapide de mon code pour faire un exemple de test d'EnumProcessModulesEx.

    Il me semble que j'avais enlevé WaitForInputIdle et OpenProcess et que j'avais constaté que ça ne marchait plus. Mais je regarderai, merci.

    Attention, needed est un DWORD et non pas un size_t, ton printf() final échouera donc.
    héhé, c'est un 'l' (lettre après 'k') et non un 'I' (i majuscule) pour needed. Ce n'est pas très visible

    J'ai enlevé WaitForInputIdle et OenProcess :

    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
    46
    47
    48
    #define PSAPI_VERSION 1
    #define _WIN32_WINNT 0x0601
    #include <stdio.h>
    
    #include <windows.h>
    #include <psapi.h>
    
    int main(int argc, char *argv[])
    {
      STARTUPINFO         si;
      PROCESS_INFORMATION pi;
      char *file;
      HMODULE modules[100];
      DWORD s;
      DWORD needed;
      BOOL res;
    
      printf("sizeof ptr=%Iu\n", sizeof(void*));
    
      if (argc < 2)
        return 1;
    
      file = argv[1];
      printf("%s\n", file);
    
      ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
      ZeroMemory(&si, sizeof(STARTUPINFO));
      si.cb = sizeof(STARTUPINFO);
    
      if (!CreateProcess(NULL, file, NULL, NULL, TRUE,
                         CREATE_SUSPENDED, NULL, NULL, &si, &pi))
        {
          printf("CreateProcess failed \n");
          return 1;
        }
    
      s = 100;
      res = EnumProcessModulesEx(pi.hProcess, modules, sizeof(modules), &needed, LIST_MODULES_ALL);
      if (!res)
        {
          printf("failed %ld\n", GetLastError());
        }
    
      printf("size : %Iu %lu, %Iu\n", sizeof(modules), needed, needed / sizeof(HMODULE));
    
      return 0;
    }
    et même problème

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Mince, là je ne sais pas trop. Je n'ai jamais utilisé EnumProcessModules[Ex], lui préférant Module32First...
    Si tu remplaces LIST_MODULES_ALL par une des deux catégories, ça foire toujours? (je sais que ça n'aidera pas si tu veux tous les modules, mais ça devrait aider au moins à cerner le 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.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Mince, là je ne sais pas trop. Je n'ai jamais utilisé EnumProcessModules[Ex], lui préférant Module32First...
    tu pourrais me décrire un peu plus précisément cette méthode ?

    Si tu remplaces LIST_MODULES_ALL par une des deux catégories, ça foire toujours? (je sais que ça n'aidera pas si tu veux tous les modules, mais ça devrait aider au moins à cerner le problème).
    J'ai déjà essayé Pareil. Je ne comprends vraiment pas

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par d'Oursse Voir le message
    tu pourrais me décrire un peu plus précisément cette méthode ?
    Je fais un CreateToolHelp32Snapshot() avec les bons paramètres, puis j'utilise Module32First()/Module32Next().
    cela donne plein d'infos sur les modules en plus de leur HMODULE (qui sous Win32 est leur adresse de chargement dans le processus).

    Par contre, j'ignore comment ça réagit aux nouveaux trucs (64 bits, UAC, etc.), je n'ai pas vérifié depuis un moment.
    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.

Discussions similaires

  1. debutant: erreur LNK2001 avec la librairie GSL
    Par drill3 dans le forum MFC
    Réponses: 6
    Dernier message: 25/04/2005, 13h58
  2. Erreur EACCESSVIOLATION avec des compsts créés dynamiquement
    Par tsikpemoise dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/02/2004, 19h05
  3. Erreur fréquente avec ASP et IIS
    Par Community Management dans le forum ASP
    Réponses: 2
    Dernier message: 11/02/2004, 22h20
  4. Erreurs IIS avec Multiples Frames avec xmlrad
    Par powerlog dans le forum XMLRAD
    Réponses: 4
    Dernier message: 01/07/2003, 13h15
  5. Comparaison d'un registre 8 bits avec une variable 32 bits
    Par tupperware dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 15/10/2002, 10h25

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