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

MFC Discussion :

Listing des process sous Win NT


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Listing des process sous Win NT
    je cherche un moyen pour obtenir la liste des process avec le lien père-fils sous Windows NT 4.0.
    Avec EnumProcesses, on obtient le ProcessId mais pas le ParentProcessId.

    Sous Windows 2000, on peut utiliser :
    CreateToolhelp32Snapshot(...) et on a le processId (pe32.th32ProcessID) et le parentProcessId (pe32.th32ParentProcessID)

    Alors comment pourrais-je faire pour NT.
    Merci d'avance

  2. #2
    fd
    fd est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    cherche tlist.c ds le msdn

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    g l'ai déjà le tlist.c, mais il n'y a pas l'option "-t" qui faire de faire l'affichage sous forme d'arbre, donc de donner les liens fils-père

  4. #4
    fd
    fd est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    Salut,

    J'ai un peu regardé ds le MSDN (psapi et tout ça) j'ai rien trouvé
    J'ai bien une solution mais elle fait appel a une API native (ds ntdll.dll)
    c'est :
    NtQueryInformationProcess (ou ZwQueryInformationProcess c'est à peu prés la même chose)

    si ça t'interesse tu trouvera des références :
    http://www.sysinternals.com/ntw2k/info/ntdll.shtml

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    justement, je l'ai trouver aussi hier, je suis en train de l'implémenter et si c OK, je te tiendrais au courant.

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 15
    Points : 9
    Points
    9
    Par défaut

    g trouvé la solution, 1 coup de NtQueryInformationProcess en redéfinissant la structure ProcessBasicInformation avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct _PROCESS_BASIC_INFORMATION {
        NTSTATUS ExitStatus;
        PPEB PebBaseAddress;
        KAFFINITY AffinityMask;
        KPRIORITY BasePriority;
        ULONG UniqueProcessId;
        ULONG InheritedFromUniqueProcessId;
    } PROCESS_BASIC_INFORMATION;
    typedef PROCESS_BASIC_INFORMATION *PPROCESS_BASIC_INFORMATION;
    bien sûr, il a fallut importer cette fonction de la librairie NTDLL.DLL.

    Voici le code l'utilisant :
    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
     
    BOOL QueryProcessInformation(   DWORD pid,
                                    PROCESSINFOCLASS infoEnum,
                                    void * pBuffer,
                                    unsigned cbBuffer )
    {
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, pid );
        if ( !hProcess )
            return FALSE;
     
        // Zero the input buffer that NtQueryInformationProcess sees
        memset( pBuffer, 0, cbBuffer );
     
        DWORD retLen;
        int retValue;
     
    	//Recup fonction NtQueryInformationProcess
    	HMODULE hModNt;
    	PROC pmNtQueryInformationProcess;
    		hModNt = ::LoadLibrary("NTDLL.DLL");
    	if (NULL != hModNt)
    	{
    		pmNtQueryInformationProcess = ::GetProcAddress(
    			hModNt, "NtQueryInformationProcess");
    		::FreeLibrary(hModNt);
    	}
     
    	PFNNTQUERYINFORMATIONPROCESS m_pmNtQueryInformationProcess;
    	HINSTANCE hInstLib = ::LoadLibrary("Ntdll.dll");
    	if ( hInstLib )
    		m_pmNtQueryInformationProcess = (PFNNTQUERYINFORMATIONPROCESS)
    							::GetProcAddress(hInstLib, "NtQueryInformationProcess");
     
    	if ( m_pmNtQueryInformationProcess )
    		retValue = (int)m_pmNtQueryInformationProcess(hProcess, infoEnum,
                                                pBuffer, cbBuffer, &retLen );
     
    	::FreeLibrary(hInstLib);
        CloseHandle( hProcess );
     
        if ( retValue < 0 ) // NtQueryInformationProcess returns a negative
            return FALSE;   // value if it fails
     
        return TRUE;
    }
     
    //---------------------------------------------------------------------------
    // RecupNtQueryInformationProcess
    //
    // Recherche du parent process Id 
    //---------------------------------------------------------------------------
    DWORD RecupNtQueryInformationProcess( DWORD pid)
    {
    	PROCESS_BASIC_INFORMATION pbi;
        if ( QueryProcessInformation(   pid, ProcessBasicInformation,
                                        &pbi, sizeof(pbi)) )
        {
            //printf( "Process Id UniqueProcessId: %d\n", pbi.UniqueProcessId );
            //printf( "Parent Id InheritedFromProcessId: %d\n\n",
            //                    pbi.InheritedFromUniqueProcessId );
    		return pbi.InheritedFromUniqueProcessId;
        }
    	else
    		return 0;
    }
    Dans le main, après avoir récupérer l'ID du process avec EnumProcess
    ou une autre méthode il suffit d'appeler la fonction ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    parentProcessId = RecupNtQueryInformationProcess(dwProcessId);
    sans oublier le .h avec :
    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
     
    typedef struct _PROCESS_BASIC_INFORMATION {
        NTSTATUS ExitStatus;
        PPEB PebBaseAddress;
        KAFFINITY AffinityMask;
        KPRIORITY BasePriority;
        ULONG UniqueProcessId;
        ULONG InheritedFromUniqueProcessId;
    } PROCESS_BASIC_INFORMATION;
    typedef PROCESS_BASIC_INFORMATION *PPROCESS_BASIC_INFORMATION;
     
    typedef HANDLE (WINAPI * PFNNTQUERYINFORMATIONPROCESS)(
    	IN HANDLE ProcessHandle,
    	IN PROCESSINFOCLASS ProcessInformationClass,
    	OUT PVOID ProcessInformation,
    	IN ULONG ProcessInformationLength,
    	OUT PULONG ReturnLength OPTIONAL
    	);

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

Discussions similaires

  1. Liste des process sous NT4
    Par Nono40 dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 23/02/2013, 10h44
  2. boucle de la liste des utilisateurs sous shell
    Par lulut dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 14/05/2007, 12h06
  3. Réponses: 1
    Dernier message: 19/09/2006, 18h19
  4. liste des Process en execution
    Par sofienems dans le forum ASP
    Réponses: 1
    Dernier message: 19/07/2006, 15h26
  5. Liste des pilotes sous debian
    Par Eusebius dans le forum Administration système
    Réponses: 18
    Dernier message: 08/06/2006, 16h27

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