IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

liste des processus en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 46
    Par défaut liste des processus en C
    Bonjour,
    J'aimerais récupérer la liste des processus actifs en C pour vérifier si un processus en particulier est actif.
    J'ai essayé plusieurs codes dont celui ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #define _WIN32_WINNT 0x0501
     
    #include <windows.h>
    #include <tchar.h>
    #include <psapi.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
    	TCHAR fichier[5000];
    	DWORD pids[500];
    	DWORD returned;
    	unsigned int i;
    	int t;
    	EnumProcesses(pids,500,&returned);
            HANDLE h;
     
     
    	for(i=0;i<returned/sizeof(DWORD);i++)
    	{
    		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;
    }
    Cependant ce code me renvoit que très peu de processus. Sur beaucoup de lignes, il y a écrit error handle code 5.
    De plus, il me renvoit le chemin entier des processus alors que j'aimerais avoir seulement le nom du processus.
    Pourriez vous me dire comment il faudrait que je fasse ?

    Cordialement

    Sybess

  2. #2
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Travailles-tu avec la documentation ? Si ce n'est pas le cas il est temps de changer.
    Je n'ai jamais utilisé les APIs windows mais une simple recherche m'a tout donné.

    Un petit tour dans la documentation :
    https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx
    ERROR_ACCESS_DENIED

    5 (0x5)

    Access is denied.
    Et un autre tour dans la documentation :
    https://msdn.microsoft.com/fr-fr/lib...=vs.85%29.aspx
    If the specified process is the Idle process or one of the CSRSS processes, this function fails and the last error code is ERROR_ACCESS_DENIED because their access restrictions prevent user-level code from opening them.
    To open a handle to another local process and obtain full access rights, you must enable the SeDebugPrivilege privilege. For more information, see Changing Privileges in a Token.
    Citation Envoyé par sybess
    De plus, il me renvoit le chemin entier des processus alors que j'aimerais avoir seulement le nom du processus.
    Il suffit de recopier à partir du dernier slash pour n'obtenir que le nom si je comprends bien la question.

  3. #3
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 786
    Par défaut
    Hello,

    Je sais que ce n'est pas la pratique du forum de donner des codes tout fait, mais dans le cas présent, l'api windows est assez imperméable (oserais-je aller jusqu'à abstruse ?) .

    Tu as commis une grosse erreur: celle de ne pas lire convenablement la doc. Par exemple, EnumProcesses() ne prend pas un nombre d'entrées, mais un nombre de bytes (et renvoie un nombre de bytes). Et le fait d'avoir des GetLastError() à 5 a été expliqué par transgohan: pas le droit d'avoir l'information.

    Il faut donc changer les privilèges du programme. J'ai eu l'occasion de me frotter à ces fameux privilèges pour pouvoir, par programme, éteindre un ordinateur. Voici un code qui fait ce que tu souhaites: (_classic(): ce que tu as écrit (avec correction), _privilegied() ma version)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    #define _WIN32_WINNT 0x0501
     
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    #include <psapi.h>
     
    void listProcesses_classic(void) {
    	DWORD pids[1024];
    	DWORD i,rc;
     
    	EnumProcesses(pids,sizeof(pids),&rc);
    	printf("Number of entries: %u\n",rc/sizeof(pids[0]));
    	for(i=0;i<rc/sizeof(pids[0]);i++) {
    		HANDLE hdl;
    		printf("%4u: pid=%4u ",i,pids[i]);
    		hdl=OpenProcess(READ_CONTROL|PROCESS_QUERY_INFORMATION,0,pids[i]);
    		if(hdl==NULL)
    			printf("- handle error %u\n",GetLastError());
    		else {
    			char buffer[MAX_PATH];
    			if(GetProcessImageFileName(hdl,buffer,sizeof(buffer))==0)
    				printf("- GetProcessImageFilename() error %u\n",GetLastError());
    			else {
    				char *progname;
    				progname=strrchr(buffer,'\\');
    				if(progname==NULL)
    					progname=buffer;
    				else
    					progname++;
    				printf("- %s\n",progname);
    			}
    			CloseHandle(hdl);
    		}
    	}
    	puts("");
    }
     
    void listProcesses_privilegied(void) {
    	LUID luid;
     
    	if(LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&luid)==0)
    		printf("\tLookupPrivilegeValue() error: %u\n",GetLastError());
    	else {
    		HANDLE hToken;
    		if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)==0)
    			printf("\tOpenProcessToken() error %u\n",GetLastError());
    		else {
    			TOKEN_PRIVILEGES tp;
    			tp.PrivilegeCount=1;
    			tp.Privileges[0].Luid=luid;
    			tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    			if(AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES)NULL,(PDWORD)NULL)==0)
    				printf("AdjustTokenPrivileges() error: %u\n",GetLastError());
    			else
    				if(GetLastError()==ERROR_NOT_ALL_ASSIGNED)
    					puts("\tThe token does not have the specified privilege");
    				else {
    					DWORD pids[1024];
    					DWORD i,rc;
    					EnumProcesses(pids,sizeof(pids),&rc);
    					printf("Number of entries: %u\n",rc/sizeof(pids[0]));
    					for(i=0;i<rc/sizeof(pids[0]);i++) {
    						HANDLE hdl;
    						printf("%4u: pid=%4u ",i,pids[i]);
    						hdl=OpenProcess(READ_CONTROL|PROCESS_QUERY_INFORMATION,0,pids[i]);
    						if(hdl==NULL)
    							printf("- handle error %u\n",GetLastError());
    						else {
    							char buffer[MAX_PATH];
    							if(GetProcessImageFileName(hdl,buffer,sizeof(buffer))==0)
    								printf("- GetProcessImageFilename() error %u\n",GetLastError());
    							else {
    								char *progname;
    								progname=strrchr(buffer,'\\');
    								if(progname==NULL)
    									progname=buffer;
    								else
    									progname++;
    								printf("- %s\n",progname);
    							}
    							CloseHandle(hdl);
    						}
    					}
    				}
    		}
    		CloseHandle(hToken);
    	}
    	puts("");
    }
    int main(void) {
    	listProcesses_classic();
    	listProcesses_privilegied();
     
    	return(0);
    }

    Attention: à exécuter en mode administrateur (ou ouvrir une console en mode administrateur)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Liste des processus
    Par dorian53 dans le forum Administration système
    Réponses: 3
    Dernier message: 17/01/2006, 10h48
  2. liste des processus
    Par cyrill.gremaud dans le forum VBScript
    Réponses: 9
    Dernier message: 30/12/2005, 10h56
  3. Comment obtenir la liste des processus ?
    Par grenouyefr dans le forum Général Python
    Réponses: 4
    Dernier message: 09/12/2005, 10h39
  4. Réponses: 2
    Dernier message: 21/01/2005, 12h55
  5. Réponses: 2
    Dernier message: 04/10/2002, 09h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo