Suspendre/geler un processus/un thread

Soyez le premier à donner votre avis sur cette source.

Vue 13 055 fois - Téléchargée 814 fois

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 / Exemple :


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

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
73
Date d'inscription
dimanche 14 octobre 2007
Statut
Membre
Dernière intervention
28 février 2011

Salut,

Super source. 9

>daetips : ntdll.dll n'est présente que sous XP, donc ça ne marche pas pour tous les OS Windows.

Voilà.
Messages postés
142
Date d'inscription
jeudi 10 juillet 2003
Statut
Membre
Dernière intervention
10 novembre 2007

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
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

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
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

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 !
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

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...
Afficher les 19 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.