garslouche
Messages postés583Date d'inscriptionmardi 26 novembre 2002StatutMembreDernière intervention29 mai 2015
-
30 avril 2004 à 15:45
daetips
Messages postés142Date d'inscriptionjeudi 10 juillet 2003StatutMembreDernière intervention10 novembre 2007
-
16 mai 2005 à 22:28
Salut,
je suis en train de faire une source pour masquer un processus au TaskManager (NT, 2000 ou XP) càd la fenêtre du Ctrl+Alt+Suppr
Le problème c'est que pour une raison que j'ignore ça fait planter le taskmanager dès que j'essaie de lire un item de la listview (en revanche je peux utiliser itemcount, etc...)
Voilà le code actuel:
#include "stdafx.h"
#include "commctrl.h" // Pour les fonctions ListView_...
static char hiddenProcess[32]; // Nom du process à masquer
static const char* progName = "HideProcess.exe"; // Nom du programme (à masquer aussi)
/**
* Recherche le nom du processus dans la ListView et supprime l'item associé
*/
void RetireProcessItem(const HWND hList)
{
int nItem;
static LV_FINDINFO findinfo;
findinfo.flags = LVFI_STRING;
// Supprime l'item de "HideProcess.exe"
findinfo.psz = progName;
nItem = ListView_FindItem(hList, -1, &findinfo);
ListView_DeleteItem(hList, nItem);
// Supprime l'item de du processus à masquer
findinfo.psz = hiddenProcess;
nItem = ListView_FindItem(hList, -1, &findinfo);
ListView_DeleteItem(hList, nItem);
}
/**
* Recherche de la ListView de la fenêtre Ctrl+Alt+Suppr
*/
BOOL CALLBACK OnEnumWindows(
HWND hwnd,
LPARAM lParam
)
{
char caption [16];
char className[16];
// On cherche une fenêtre du même type que la celle de Ctrl+Alt+Suppr
::GetClassName(hwnd, className, sizeof(className));
if (strcmp(className, "#32770") == 0)
{
// On récupère le petit-fils
hwnd = ::GetWindow(hwnd, GW_CHILD);
hwnd = ::GetWindow(hwnd, GW_CHILD);
// On regarde si c'est bien l'objet (ListView) qu'on cherche
::GetWindowText(hwnd, caption, sizeof(className));
::GetClassName (hwnd, className, sizeof(className));
if ( strcmp(className, "SysListView32") 0 && strcmp(caption, "Processus") 0 )
{
// On a trouvé la listview
RetireProcessItem(hwnd);
// La recherche est terminée
return FALSE;
}
}
// On poursuit la recherche
return TRUE;
}
/**
* Fonction appelée à intervalle régulier qui lance la recherche de la ListView
*/
VOID CALLBACK OnTimer(
HWND hwnd, // handle to window for timer messages
UINT message, // WM_TIMER message
UINT idTimer, // timer identifier
DWORD dwTime) // current system time
{
// On lance la recherche
::EnumWindows(OnEnumWindows, 0);
};
/**
* Point d'entrée
*/
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
// L'argument est copié dans la variable statique hiddenProcess
strcpy(hiddenProcess, lpCmdLine);
// On cherche la liste des processus toutes les 100 ms
::SetTimer(0, 1, 100, OnTimer);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// Arrête le timer
::KillTimer(0, 1);
return msg.wParam;
}
Le pb se situe dans RetireProcessItem au niveau de ListView_FindItem. Mais je le répète toutes les fonctions accédant au texte des items font planter le taskmanager.
Quelqu'un sait-il pourquoi ? Ou comment empecher ce plantage ?
Merci
On ne force pas une curiosité, on l'éveille. .................................................Daniel Pennac
daetips
Messages postés142Date d'inscriptionjeudi 10 juillet 2003StatutMembreDernière intervention10 novembre 2007 16 mai 2005 à 22:28
C normal que t'es pas acces a la mémoire de l'autre processus.
avec ce cde, fait une dll et injecte la dans le taskmanager.
la tu aura acces a la mémoire de taskmanager, tu pourra alord supprimer l'item