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 :

[Win32] : appel à SuspendThread


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Août 2008
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 239
    Par défaut [Win32] : appel à SuspendThread
    J'ai écrit un petit programme pour comprendre comment appeler correctement SuspendThread et GetThreadContext.
    Je n'y ai pas réussi.

    Le programme consiste à créer un thread 'StarThread' qui ecrit 0, 1 .., 10 à l'écran et se suspend (le thread principal ayant fourni en parametre l'handle).

    Pourtant SuspendThread n'agit pas et ne relève pas d'erreur non plus.

    Ne parlons pas de GetThreadContext qui donne EIP à 0.

    Qu'est-ce qui cloche ?
    Merci bcp.

    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
    DWORD WINAPI StartThread(LPVOID argThreadHandle)
    {
          char lszParam[3];
          for(int i=0;i<=10;i++)
          std::cout<<i<<std::endl;
          if (SuspendThread((HANDLE) argThreadHandle) == FALSE)
          {
              std::cerr<<"Je suis une conne de founction SuspendThread"<<std::endl;
              return 1;
          }
          std::cerr<<"ResumeThread a ete appele ou quoi ?"<<std::endl;
          return 0;
    }
    int main(int, char**)
    {
          HANDLE hThread1;
          DWORD dwGenericThread;
          hThread1 = CreateThread(NULL,0,StartThread,&hThread1, 0 ,&dwGenericThread);
          if(hThread1 == NULL)
          {
                DWORD dwError = GetLastError();
                std::cerr<<"SCM:Error in Creating thread"<<dwError<<std::endl ;
                return 1;
          }
    
    Sleep(2000);
    
    CONTEXT context;
    
    context.ContextFlags = CONTEXT_i386
                                 | CONTEXT_INTEGER
                                 | CONTEXT_FLOATING_POINT
                                 | CONTEXT_EXTENDED_REGISTERS;
    
    BOOLEAN succes = GetThreadContext(hThread1, &context);
    .
    .
    .
    }

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je n'aime pas la manière dont tu procédes car elle peut avoir des effets de bord et en plus j'ai l'impression que ce que tu fais n'est pas correct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HANDLE hThread1 = CreateThread(..., StartThread, &hThread1, ...);
    Dans ce cas, tu passes à ton thread l'adresse d'un HANDLE qui n'est pas forcément fini d'initialiser. Si ton thread part avant que la fonction CreateThread() ne soit terminée (je ne sais pas si c'est possible), le handle de thread pointé par le paramètre risque d'être invalide (mais dans le cas présent, je ne pense pas que cela soit le problème car cette valeur est utilisée bien plus tard).

    Dans ton cas, ton thread reçoit un paramètre qui est en fait un pointeur sur HANDLE et ton code de thread devrait ressembler à un truc comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DWORD WINAPI StartThread(LPVOID argThreadHandle)
    {
    // nouveau code
    HANDLE hthread = *((HANDLE *)argThreadHandle);
    // ancien code
    //HANDLE hthread = (HANDLE)argThreadHandle;
    
    ...
          if (SuspendThread(hthread) == FALSE)
    ...
    Pour éviter le risque de variable pas tout à fait finie d'initialiser, il vaudrait mieux dans ce cas utiliser GetCurrentThread() comme cela, tu n'as plus besoin de passer un paramètre à ton thread (ou tu peux l'utiliser pour autre chose)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DWORD WINAPI StartThread(LPVOID argThreadHandle)
    {
    ...
          if (SuspendThread(GetCurrentThread()) == FALSE)
    ...
    Pour GetThreadContext(), c'est peut être le même problème (je ne connais pas cette fonction, je n'ai jamais eu à l'utiliser.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Août 2008
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 239
    Par défaut
    On ne peut plus d'accord avec toi. C'est un peu osé.

    SuspendThread fait à présent son oeuvre.

    Donc, en toute logique je dois mettre [Résolu], bien que GetThreadContext reste une énigme.

    Merci à toi.
    Bonne journée.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Le bouton est en bas à gauche, ce n'est pas utile de modifier le titre du message
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

Discussions similaires

  1. [WIN32] appeler le shell
    Par edfed dans le forum Contribuez
    Réponses: 0
    Dernier message: 14/02/2011, 10h59
  2. Appel d'une DLL Win32 à partir d'une appli DOS 16bit
    Par telghali dans le forum Assembleur
    Réponses: 5
    Dernier message: 23/02/2007, 21h42
  3. [VB.NET]Appel de DLL Win32
    Par NiamorH dans le forum C++/CLI
    Réponses: 3
    Dernier message: 02/10/2006, 10h30
  4. [VB6] création dll win32 et appel par un autre programme
    Par Tankian85 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/03/2006, 08h21

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