Lister les processus NT

Demandé et répondu par R&B le 27-Sep-2004 12:14

Lister les processus NT

Merci à DrCharly93 pour ce post sur le NG PCSoft:

Comment lister les processus et modules en cours

Voici un bout de code trouver il y a longtemps sur internet
Procédure ProcesNT()
// Liste des process et modules sous NT
// Ce module pour fonctionner correctement doit être lancer dans une
//  fenêtre disposant d'une table 'TABLE1' composer de 5 colonnes
//  id           numérique entier (index dans la liste)
//  cProcessID   texte
//  cProcessName texte
//  cModuleName  texte
//  cPathName    texte
// Un interrupteur 'INTMODULE' permet de n'afficher
//  que les process (INTMODULE=0)
//  ou les process et modules correspondants (INTMODULE=1)

//
LOCAL
 idTabProcess  est un tableau de 200 entiers longs
 Cb     est un entier long=800  // taille en octets du tableau idTabProcess
 CbNeeded   est un entier long
 NumElements  est un entier long

 hTabModule  est un tableau de 200 entiers longs
 Cb2    est un entier long=800  // taille en octets du tableau hTabModule
 CbNeeded2   est un entier long
 NumModules   est un entier long
 Pname   est une chaine

 FileName   est une chaine fixe sur 260
 BaseName  est une chaine fixe sur 260
 nSize    est un entier long=260  // taille de FileName et BaseName

 lret,l1,l2  est un entier long
 hProcess   est un entier long
 i,i2    est un entier long
    NumDll    est un entier long


NumDll=chargedll('PSAPI.DLL')
si NumDll=0 alors
 erreur('La dll PSAPI n'a pas été chargée')
 renvoyer faux
fin

//
// The EnumProcesses function retrieves the process identifier
//  for each process object in the system.
//
//  BOOL EnumProcesses(
//    DWORD * lpidProcess,  // array to receive the process identifiers
//    DWORD cb,             // size of the array
//    DWORD * cbNeeded      // receives the number of bytes returned
//  );
Lret=appeldll32('PSAPI.DLL','EnumProcesses',&idTabProcess,Cb,&CbNeeded)
NumElements=CbNeeded/4   // Taille renvoyée divisée par la taille d'un
entier long (4 octets)

Pour i=1 a NumElements
    //
 // The OpenProcess function returns a handle to an existing process object.
 //
 //  HANDLE OpenProcess(
 //    DWORD dwDesiredAccess,  // access flag
 //    BOOL bInheritHandle,    // handle inheritance flag
 //    DWORD dwProcessId       // process identifier
 //  );
 //

HProcess=appeldll32('KERNEL32.DLL','OpenProcess',oubinaire(1024,16),0,idTabP
rocess[i])
 si HProcess<>0 alors  // On a un processus. On va rechercher ses modules.
        //
  // The EnumProcessModules function retrieves a handle for each module
  //  in the specified process.
  //
  // BOOL EnumProcessModules(
  //   HANDLE hProcess,      // handle to the process
  //   HMODULE * lphModule,  // array to receive the module handles
  //   DWORD cb,             // size of the array
  //   LPDWORD lpcbNeeded    // receives the number of bytes returned
  // );
  // Process_Query_Information=1024
  // Process_All_Access=16
  //

Lret=Appeldll32('PSAPI.DLL','EnumProcessModules',Hprocess,&hTabModule,Cb2,&C
bNeeded2)
  si LRet<>0 alors
   NumModules=CbNeeded2/4
   SI INTMODULE=0 alors NumModules=1
   Pour i2=1 a NumModules
    // The GetModuleBaseName function retrieves the base name of the
specified module.
    //
    //DWORD GetModuleBaseName(
    //  HANDLE hProcess,    // handle to the process
    //  HMODULE hModule,    // handle to the module
    //  LPTSTR lpBaseName,  // buffer that receives the base name
    //  DWORD nSize         // size of the buffer
    //);
     L1=Appeldll32('PSAPI.DLL','GetModuleBaseNameA',HProcess,hTabModule[i2]
....
                  ,&BaseName,nSize)
     SI L1=0 alors BaseName=''
    Si i2=1 alors Pname=minuscule(BaseName[[1 à L1]])
    //
    // The GetModuleFileNameEx function retrieves the fully qualified path
    //  for the specified module.
    //
    //  DWORD GetModuleFileNameEx(
    //    HANDLE hProcess,    // handle to the process
    //    HMODULE hModule,    // handle to the module
    //    LPTSTR lpFilename,  // buffer that receives the path
    //    DWORD nSize         // size of the buffer
    //  );
    //

L2=Appeldll32('PSAPI.DLL','GetModuleFileNameExA',HProcess,hTabModule[i2] ...
                  ,&FileName,nSize)
    Si L2=0 alors FileName=''
    TABLEAJOUTE('TABLE1',i+i2/1000+TAB+idTabProcess[i]+TAB+PName+...
              TAB+Minuscule(BaseName[[1 à L1]])+...
              tab+Minuscule(FileName[[1 a L2]]))
   fin
  fin
  LRet=Appeldll32('KERNEL32.DLL','CloseHandle',HProcess)
 FIN
fin

si NumDll<>0 alors
 dechargedll(NumDll)
fin

Cette Q&R a été trouvée sur WDForge.org : http://old.wdforge.org/modules/smartfaq/faq.php?faqid=4