Récupérer liste processus et nom de l'EXE associé.

Récupérer liste processus et nom de l'EXE associé.

EnumProcesses,OpenProcess,GetProcessImageFileName

Voir version :

Pas de dépendances

Télécharger :

#include <windows.h>
#include <tchar.h>
#include <psapi.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib,"Psapi.lib")

int main()
{
    TCHAR fichier[5000];
    DWORD pids[500];
    DWORD returned;
    unsigned int i;
    int t;
    EnumProcesses(pids,500,&returned);
    for(i=0;i<returned/sizeof(DWORD);i++)
    {
        HANDLE h = OpenProcess(READ_CONTROL|PROCESS_QUERY_INFORMATION,0,pids[i]);
        printf("PID = %d  ",pids[i]);
        if (h==NULL)
        {
            DWORD err = GetLastError();
            printf("ECHEC HANDLE : Code %d\n",err);
            continue;
        }
        t = GetProcessImageFileName(h,fichier,5000);
        if (t==0)
        {
            DWORD err = GetLastError();
            printf("ECHEC RECUP NOM : Code %d\n",err);
            continue;
        }
        _tprintf(_T("  %s\n"),fichier);
        CloseHandle(h);
    }
    return 0;
}



Commentaires


Note : un programme intéressant, puisqu'il énumere les processus du systeme

Il faut inclure le header, et linker la lib suivante

#include <psapi.h>
#pragma comment(lib,"Psapi.lib")

NOTE : Ce programme ne compile pas sous Visual 6.0 : trop vieux.
J'ai fait ce test sous Visual 2005 sous Windows XP sp2.
Je pense que tout compilateur récent saura compiler ce tuto.

La fonction EnumProcesses va me retourner les PID de tous les processus.
Pour chacun d'entre eux, je les ouvre avec OpenProcess.
je décide d'ouvrir ces processus avec les options READ_CONTROL|PROCESS_QUERY_INFORMATION
Sans PROCESS_QUERY_INFORMATION, le GetProcessImageFileName n'aurait pas acces au processus.

Le lien suivant mentionne toutes les options d'ouverture pour OpenProcess
http://msdn2.microsoft.com/en-us/library/ms684880.aspx

Pour les codes d'erreur :
http://msdn2.microsoft.com/en-us/library/ms681381.aspx

Note, le premier et 2e processus correspondent, il me semble au processus inactif du systeme et au scheduler : 
donc intouchables.

Ne pas oublier CloseHandle a la fin.



Laissez un commentaire / post a comment