begin process at 2008 07 19 08:53:04
1 212 721 membres
60 nouveaux aujourd'hui
14 165 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SUSPENDRE/GELER UN PROCESSUS/UN THREAD


Information sur la source

Catégorie :Système Classé sous : processus, geler, interrompre, suspendre, thread Niveau : Initié Date de création : 21/02/2005 Date de mise à jour : 10/07/2006 22:26:10 Vu / téléchargé: 8 239 / 626

Note :
9,5 / 10 - par 4 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note


Description

Depuis le temps que je cherchais je finissais par penser que ça n'était pas possible, mais si mais si.
J'ai trouvé ces fonctions sur le blog d'EBArtSoft car il faisait un pti tuto bien interessant sur l'injection de code... Donc merci EB pour m'avoir (involontairement) révélé l'existence de ces deux magnifiques api.
Ce code permet donc de geler / dégeler un thread.
Pour geler un processus, il faut bien sur geler tous les threads du processus : donc je vous ai mis une fonction qui permet de récupérer la liste des threads d'un processus, il n'y a plus qu'à les geler.
Dans le code que je vous met, on précise le nom d'une fenetre et à partir de ça on retrouve le thread associé et on le gèle. Comme ça on peut voir l'effet immédiatement, j'ai mis l'exemple avec wordpad.

Source

  • Je vous met ici juste le code qui gèle le thread pour bien que vous voyez la simplicité de la chose :
  • ' Retrouver une fenetre à partir de son titre
  • Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  • ' Retrouver le thread associé à la fenêtre
  • Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
  • ' Suspend un thread
  • Public Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
  • ' Reprend le thread arreté
  • Public Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
  • ' Accéder au thread
  • Public Declare Function OpenThread Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInherit As Long, ByVal dwThreadId As Long) As Long
  • Public Const THREAD_ALL_ACCESS = &H1F03FF
  • ' Suspendre un thread
  • Public Function mtSuspendThread(ByVal ThreadID As Long)
  • Dim hThread As Long
  • ' Renvoie le handle du thread "ouvert" (pour agir dessus)
  • hThread = OpenThread(THREAD_ALL_ACCESS, 0, ThreadID)
  • ' Suspend le thread
  • SuspendThread hThread
  • ' Ferme le handle
  • CloseHandle hThread
  • End Function
  • ' Reprendre un thread (qui est suspendu)
  • Public Function mtResumeThread(ByVal ThreadID As Long)
  • Dim hThread As Long
  • ' Renvoie le handle du thread "ouvert" (pour agir dessus)
  • hThread = OpenThread(THREAD_ALL_ACCESS, 0, ThreadID)
  • ' Reprend le thread
  • ResumeThread hThread
  • ' Ferme le handle
  • CloseHandle hThread
  • End Function
  • ' Extra : si vous voulez geler un processus, voici une fonction pour récupérer la liste des threads d'un processus. Il n'y a plus qu'à tous les geler
  • Public Sub mtGetThreadListFromProcess(ByVal ProcessID As Long, ByRef tabThreadID() As Long, ByRef Compteur As Long)
  • Dim hSnapshot As Long
  • Dim Thread As THREADENTRY32
  • ReDim tabThreadID(0) As Long
  • Compteur = 0
  • ' On crée une capture des threads du système
  • hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, ProcessID)
  • Thread.dwSize = Len(Thread)
  • ' On prend le premier
  • If Thread32First(hSnapshot, Thread) Then
  • Thread.dwSize = Len(Thread)
  • ' On parcourt tous les threads existants
  • Do
  • ' Si le thread a bien processId pour processus parent, on le liste
  • If Thread.th32OwnerProcessID = ProcessID Then
  • tabThreadID(Compteur) = Thread.th32ThreadID
  • Compteur = Compteur + 1
  • ReDim Preserve tabThreadID(Compteur) As Long
  • End If
  • Loop While Thread32Next(hSnapshot, Thread)
  • End If
  • CloseHandle hSnapshot
  • End Sub
Je vous met ici juste le code qui gèle le thread pour bien que vous voyez la simplicité de la chose :

' Retrouver une fenetre à partir de son titre
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
' Retrouver le thread associé à la fenêtre
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
' Suspend un thread
Public Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
' Reprend le thread arreté
Public Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
' Accéder au thread
Public Declare Function OpenThread Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInherit As Long, ByVal dwThreadId As Long) As Long

Public Const THREAD_ALL_ACCESS = &H1F03FF

' Suspendre un thread
Public Function mtSuspendThread(ByVal ThreadID As Long)
    Dim hThread As Long
    ' Renvoie le handle du thread "ouvert" (pour agir dessus)
    hThread = OpenThread(THREAD_ALL_ACCESS, 0, ThreadID)
    ' Suspend le thread
    SuspendThread hThread
    ' Ferme le handle
    CloseHandle hThread
End Function

' Reprendre un thread (qui est suspendu)
Public Function mtResumeThread(ByVal ThreadID As Long)
    Dim hThread As Long
    ' Renvoie le handle du thread "ouvert" (pour agir dessus)
    hThread = OpenThread(THREAD_ALL_ACCESS, 0, ThreadID)
    ' Reprend le thread
    ResumeThread hThread
    ' Ferme le handle
    CloseHandle hThread
End Function



' Extra : si vous voulez geler un processus, voici une fonction pour récupérer la liste des threads d'un processus. Il n'y a plus qu'à tous les geler
Public Sub mtGetThreadListFromProcess(ByVal ProcessID As Long, ByRef tabThreadID() As Long, ByRef Compteur As Long)
    Dim hSnapshot As Long
    Dim Thread As THREADENTRY32
    ReDim tabThreadID(0) As Long
    Compteur = 0
    ' On crée une capture des threads du système
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, ProcessID)
    Thread.dwSize = Len(Thread)
    ' On prend le premier
    If Thread32First(hSnapshot, Thread) Then
        Thread.dwSize = Len(Thread)
        ' On parcourt tous les threads existants
        Do
            ' Si le thread a bien processId pour processus parent, on le liste
            If Thread.th32OwnerProcessID = ProcessID Then
                tabThreadID(Compteur) = Thread.th32ThreadID
                Compteur = Compteur + 1
                ReDim Preserve tabThreadID(Compteur) As Long
            End If
        Loop While Thread32Next(hSnapshot, Thread)
    End If
    CloseHandle hSnapshot
End Sub

Conclusion

Et enfin je souhaite utiliser ces fonctions pour geler à peut près tout le système pour faire une sorte de Ctrl Alt Suppr comme dans win98 ou tout était bloqué, mais sous XP...
Pensez vous que c'est raisonnable (lol) et y'a t'il des contre-indications docteur...

Si vous avez des réponses ou commentaires, exprimez vous
En espérant que ça vous serve, comme d'ab
MadMatt
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

22 novembre 2005 18:27:08 :
Ajout des mots clés
10 juillet 2006 22:22:30 :
Ajout de la fonction qui liste les threads d'un processus
10 juillet 2006 22:26:10 :
ajout du mot clé "thread"
  • signaler à un administrateur
    Commentaire de odan71 le 23/02/2005 08:26:23

    Même si c'est "simple" à mettre en oeuvre, les histoires de threads c'est pas du niveau 1...
    en tout cas merci, ça peut etre utile.

  • signaler à un administrateur
    Commentaire de legion91 le 24/02/2005 00:40:37

    très interressant.

  • signaler à un administrateur
    Commentaire de PostIt le 24/02/2005 09:53:18

    Ptit question à la con...

    Pour une application multi-thread (comme Word par exemple), comment se comporte ton programme ?
    D'après les API utilisés, il semblerait que tu ne gèle que le thread de la fenêtre courante de l'application visé. Hors si d'autre thread on besoin d'interagir avec le thread de la fenêtre courante, que se passe-t-il ?

    A creuser...

  • signaler à un administrateur
    Commentaire de MadM@tt le 24/02/2005 11:26:45

    C'est exactement une question que je me posais PostIt,
    à la limite je testerai sous Word, mais le mieux pour geler un processus serait alors de geler tous les threads qui ont comme parent le processus visé non ?
    Enfin au moins avec ça on sait geler un processus, depuis le temps que je cherchais c'était tout con, mais personne ne l'avais jamais mis sur vbfrance, c'est rare...
    Et merci pour vos commentaires ;)

  • signaler à un administrateur
    Commentaire de azerty25 le 23/03/2005 23:01:30

    C'est une super source ! J'ai testé sous Word, qui a 2 threads, et ça à fonctionné, comme wordpad, lui aussi a plusieurs threads (2).
    Sinon, vu qu'il y a des connaisseurs en threads, je vais en profiter pour demander une ptite chose ...^^
    Je fait un client mail en ce moment, et quand le programme démarre, j'ai déja 4 threads, alors qu'il n'est pas volontairement multithreads. Ca viendrai des OCX externes que j'utilise dedans ? Et celon vous, si j'ai un control Winsock sur la form, d'index 9999, et que j'en charge 2 autres dynamiquement (le 0 et le 1), peuvent-il travailler undépendament l'un de l'autre avec 2 serveurs diffiférents "simultanément" (ceux d'index 0 et 1)? parce que, je sais pas si c'est une erreur de moi ou quoi, mais quand un recoi/envoi des données, aléatoirement, il s'arrete et laisse place à l'autre, il y a une sorte de parasitage.
    Merci à ceux qui me répondront s'ils y en a ;-)

  • signaler à un administrateur
    Commentaire de MadM@tt le 24/03/2005 19:35:22

    Euh perso je ne m'y connais pas assez en thread et je cherche des sources en vain...
    Tu dis que tu a 4 threads déjà quand tu lance ton prog, mais comment tu vois ça ? Ctrl Alt Suppr ?
    ou alors une source ?? parce que c'est ce que je cherche : visualiser, récupérer ... les threads d'un processus.
    Parce qu'ici je récupère le thread lié à la fenetre et non au processus... enfin bon si qqn a une source ça ferait très plaisir.

    Sinon Azerty, merki pour ton commentaire, pour faire un programme multithread c'est assez simple j'ai trouvé, il y a pas mal d'exemple sur vbfrance. Si j'avais bien compris les sources en fait le multithread c'est juste tu demande à l'api adequat d'executer une fonction, sub... en parallèleà ton prog, donc je pense que pour tes winsock c'est possible si tu arrive a faire en sorte que tout ton code qui gère ton winsock s'execute dans une seule fonction, enfin il faudrait qu'il y ait tjrs une fonction d'active pour conserver ton thread "vivant", car dès que la fonction est finie normalement le thread se supprime...
    Est ce que tu me suis lol ?? Regarde des exemples tu verras je pense que tu comprendras ce que je veux dire.

    A+

  • signaler à un administrateur
    Commentaire de azerty25 le 24/03/2005 21:37:04

    Je regardé avec le alt ctrl suppr, il suffit dans le menu affichage de sélectionner les colonnes et puis afficher les threads. Pour Winsock, je suis en train de regarder, j'ai déja vaguement entendu parlé qu'il fallait conserver la routine "threadée" sinon, elle était bien sure détruite, l'astuce consisterai à faire une boucle. Mais je me demandai si, rien qu'a travers le fait de créé plusieurs fois le controle, plusieurs threads n'étaient pas créés automatiquement, car au démarrage, j'en ai 4, et en pleine réception des mails avec 2 serveurs, donc 3 controles winsock (le 9999 que je ne touche jamais, le 0 et 1), j'ai 3 treads en plus....
    Voila, merci pour ta réponse en tout cas ;-)

  • signaler à un administrateur
    Commentaire de acrcorp le 02/04/2005 14:00:39

    J'ai essayé de suspendre le thread "Belle mère".
    C fut un lamentable échec...
    Dommage, c'était prometteur...

  • signaler à un administrateur
    Commentaire de MadM@tt le 03/04/2005 19:53:55

    Cool chu content pour toi ;)...
    Détaille... Ou est ce que ça a planté?
    C'est quoi "Belle mère" ?
    Je pense que c'est du au fait que certains processus ont des privilèges, donc on ne peut ptet pas agir dessus...
    Dis moi quel processus c'est, ou quel programme... Et comment tu a procédé.
    Merci a+

  • signaler à un administrateur
    Commentaire de acrcorp le 04/04/2005 00:55:37

    le thread belle mère est une sorte de référence pendante qui découle du thread femme. Ce dernier a en effet la facheuse abitude de solicité des ressources pour passer des boucles de temps dans dans le thread Belle mère. Il en résulte une énorme perte de cycle...
    C'est très affreux le thread belle mère :)

  • signaler à un administrateur
    Commentaire de MadM@tt le 05/04/2005 22:06:57

    mdrrr jme sens complétement con la...
    Faudrait que j'arrete d'etre serieu des fois lol
    bien vu kan meme ;)

  • signaler à un administrateur
    Commentaire de acrcorp le 05/04/2005 22:31:09

    hi hi :)

  • signaler à un administrateur
    Commentaire de azerty25 le 07/05/2005 21:26:44

    mdr

  • signaler à un administrateur
    Commentaire de SkyRocKo le 24/12/2005 20:31:18

    Superbe source, intéressant !

    Par contre, j'ai vu que quand on gèle WordPad et que l'on clique sur "Ouvrir", rien ne se passe mais le CommonDialog "Ouvrir" apparaît dès que l'on dégèle.

    Y-a-t'il moyen de pouvoir geler complètement (les évênements n'apparaissent pas quand l'on dégèle) ?

    Bonne continuation !

    SkyRocKo

  • signaler à un administrateur
    Commentaire de MadM@tt le 09/07/2006 17:45:48

    SkyRocko > je répond un peu tard désolé, mais au cas ou ça puisse servir quelqu'un. A mon avis quand on gèle le process, tous les évenements sont mis dans une file, et quand on dégèle le process reprend les évenements enregistrés. Comme ça je ne saurais pas trop comment faire pour empecher ça, mais peut etre en faisant du subclassing, comme ça on intercepte tous les evenements qui surviennent dans la fenetre et on les supprime.
    Enfin facile à dire quoi ^^, perso je ne m'y connais pas trop encore en subclassing, mais ça peut rester un bon projet, avec en + la gestion des processus multi-thread...
    Ahhhh il reste encore tellement à faire...

  • signaler à un administrateur
    Commentaire de MadM@tt le 10/07/2006 22:25:00

    Wouhou !!!
    J'ai enfin.... trouvé l'api pour récupérer la liste de tous les threads du système, et par la meme occasion la liste des threads d'un processus.
    Donc voilà, j'ai mis le tout sous forme de fonction et j'ai balancé ça en haut dans la partie code.
    Par contre j'ai pas mis à jour le zip, j'ai une crise de flemmagite aigue la, mais si y'en a qui en ont besoin demandez moi je le ferais.
    (Pour ceux qui ont pas compris maintenant on peut geler les processus multi-threads;)

    Bonne prog !

  • signaler à un administrateur
    Commentaire de MadM@tt le 10/07/2006 22:28:08

    Ah oui (désolé pour le multi post:()
    J'ai pas encore testé la fonction qui liste les threads, dites moi si vous trouvez des fautes ou bugs.
    Merci

  • signaler à un administrateur
    Commentaire de daetips le 11/03/2008 01:31:45

    Je sais que ce code est un peu vieux mais bon
    pour geler un processus:

    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function NtSuspendProcess Lib "ntdll.dll" (ByVal hProc As Long) As Long
    Private Declare Function NtResumeProcess Lib "ntdll.dll" (ByVal hProc As Long) As Long
    Private Const PROCESS_SUSPEND_RESUME        As Long = &H800


    Public Function SuspendProcess(ByVal PID As Long) As Long
    Dim lProcess As Long
    lProcess = OpenProcess(PROCESS_SUSPEND_RESUME, 0&, PID)
    SuspendProcess = NtSuspendProcess(lProcess)
    CloseHandle lProcess
    End Function

    Public Function ResumeProcess(ByVal PID As Long) As Long
    Dim lProcess As Long
    lProcess = OpenProcess(PROCESS_SUSPEND_RESUME, 0&, PID)
    ResumeProcess = NtResumeProcess(lProcess)
    CloseHandle lProcess
    End Function

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS