Récuperer la liste des pid en cours


Propriétés du code


Date de création : 30/11/2006 à 20:00:00
3 Commentaire(s)
  sebdraluorg

 

Présentation


Ce code montre comment recuperer la liste des Pid via NtQuerySystemInformation, j'ai essayer de
l'optimiser au maximum mais on peut surement faire mieux...

Petit exemple d'utilisation:

Dim pList() As Long
Dim i As Long
Dim pListCount As Long

pListCount = GetProcessPidList(pList())

For i = 0 To pListCount - 1
List1.AddItem pList(i)
Next i

MsgBox pListCount & " Processus en cours"

 

Code


 

Public Function GetProcessPidList(ByRef PidList() As Long) As Long

    Dim NextProcess         As Long
    Dim X                   As Long
    Dim Length              As Long
    Dim Process()           As SYSTEM_PROCESSES
    Dim ArrProcess          As SafeArray1d
    Dim m_BufferLen         As Long
    Dim ProcessBuffer()     As Byte
    
    Erase PidList
    Length = &H1000
    
    ReDim ProcessBuffer(Length) As Byte
    
    'boucle jusqu'a ce que le buffer "ProcessBuffer()" soit assez grand
    Do While NtQuerySystemInformation(SystemProcessesAndThreadsInformation, ByVal VarPtr(ProcessBuffer(0)), Length, m_BufferLen) = STATUS_INFO_LENGTH_MISMATCH
        Length = Length + &H1000
        ReDim ProcessBuffer(Length)
    Loop
    
    Do
        'initialisation du tableau
        With ArrProcess
            .cbElements = 184
            .cDims = 1
            .cElements = 1
            .fFeatures = FADF_AUTO Or FADF_FIXEDSIZE
            .lLbound = 0
            .pvData = VarPtr(ProcessBuffer(NextProcess))
        End With
        
        ReDim Preserve PidList(X) As Long
        
        'copie du tableau
        CopyMemory ByVal VarPtrArray(Process), VarPtr(ArrProcess), 4
        
        PidList(X) = Process(0).ProcessID
        X = X + 1
        
        If Process(0).NextEntryDelta = 0 Then Exit Do
        
        'definition de l'entree du prochain process dans le tableau "ProcessBuffer()"
        NextProcess = NextProcess + Process(0).NextEntryDelta
        
    Loop
    
        'release du tableau
    With ArrProcess
        .cbElements = 0
        .cDims = 0
        .pvData = 0
    End With

    GetProcessPidList = X
    
End Function

 


 
 

Modifier le code

Seul les admins et l'auteur du code lui même peuvent modifier ce code.

 

Commentaires


De MadMatt le 30/11/2006 à 23:37


Salut, un grand merci pour ce code, vraiment génial ! tout simplement.
La rapidité au sens pur ^^

Et en fait c'est pas si compliqué que ça finalement, c'est juste que l'information à traiter à l'air bien brute. En fait si j'ai bien compris, y'a un tableau de SYSTEM_PROCESSES en mémoire, alors on copie chaque élément dans une variable VB et on traite les propriétés dont on a besoin... C'est excellent !

 

De ratala le 22/01/2007 à 19:29


Pas de declaration d'API ?

 

De sebdraluorg le 22/01/2007 à 20:09


Salut Ratala,

Eh si les declarations sont dans le poste "Declaration NTQuerySystemInformation"

elles sont relativement longue et la classe process reposant sur ces declarations on a choisi de les poster une seul fois.

++

 

Ajouter un commentaire


Vous devez être connecté pour pouvoir poster un commentaire.

 
 

Valid HTML 4.01 Transitional Valid CSS

Site web de Vb System Library version 1.3
Developpement et design réalisé par : Matthieu Napoli (MadMatt)
© 2007 Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
Temps d'execution de la page : 0.012 s
www.mnapoli.fr