Problème avec CreateToolhelp32Snapshot

Résolu
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 - 3 sept. 2006 à 18:04
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 4 sept. 2006 à 14:26
Salut à tous,

Voilà je voulais juste lister les modules (des processus) qui tournent sur mon pc, rien de bien méchant.
Seulement, ça marche pas, tout au début : voici le début du code

{Déclarations de variables diverses}

hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPMODULE, ProcessID)

avec ProcessID bien égal à l'id d'un process (pas de doute la dessus) et TH32CS_SNAPMODULE bien égal à 8, pas de doutes non plus.

Et après l'appel, hSnapShot = -1, donc derrière l'énumération des modules ne marche pas...

Je me suis dit que ça venait peut etre d'une question de privilèges, alors j'ai rajouté un appel à la fonction suivante avant CreateToolhelpSnapshot :
'autorise le privilège SeDebugPrivilege
Public Sub EnableDebug()
    Dim hProc As Long 'handle du processus actuel
    Dim hToken As Long 'handle du token
    Dim mLUID As LUID 'LUID du privilège
    Dim mPriv As TOKEN_PRIVILEGES 'privilèges
    Dim mNewPriv As TOKEN_PRIVILEGES 'nouveaux privilèges
    'renvoie le processus actuel
    hProc = GetCurrentProcess()
    'ouvre le token
    OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
    'regarde la valeur du privilège
    LookupPrivilegeValue "", "SeDebugPrivilege", mLUID
    'nombre de privilèges
    mPriv.PrivilegeCount = 1
    'attribut ENABLED
    mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
    'LUID de privilège
    mPriv.Privileges(0).pLuid = mLUID
    'ajuste le token
    AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)
    'fermer le handle de token
    CloseHandle hToken
End Sub

(au passage c'est une fonction de ShareVB)

Merci si vous voyez d'ou ça peut planter ???

Ciaò
[mailto:madmatt_12@msn.com MadMatt]

www.madmatt.fr.st

6 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 sept. 2006 à 09:55
Pour voir si c'est une question de droits, ou d'erreur quelque part, tu peux tester en faisant :

Private Const TH32CS_SNAPMODULE As Long = &H8

Private Declare Function CreateToolhelp32Snapshot Lib "KERNEL32.dll" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long

Private Sub Form_Load()
Dim hPid As Long
    hPid = Shell("Calc.exe")
    MsgBox CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, hPid)
End Sub

(NB: testé chez moi, ca tourne impeccable)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 sept. 2006 à 12:32
ah! , vi, le ByVal du PID

Renfield
Admin CodeS-SourceS- MVP Visual Basic
3
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
4 sept. 2006 à 12:10
Arff ça marche, pourtant j'avais aussi essayé de tester un code aussi simple mais ça n'avait pas marché non plus. En fait ça vient de la déclaration de l'api, ma déclaration qui marchait pas c'était ça :
Public Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long

Et pourtant, VB n'indiquait aucune erreur, et pour le listing des process ou des threads ça marche bien, je ne comprend pas. (note : je suis bien en option explicit)

Ciaò
[mailto:madmatt_12@msn.com MadMatt]
www.madmatt.fr.st
0
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
4 sept. 2006 à 13:02
oula c'est exigant , je savais pas que ça pouvait poser problème

En tout cas merci

Ciaò
[mailto:madmatt_12@msn.com MadMatt]
www.madmatt.fr.st
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
4 sept. 2006 à 13:07
Ah par contre je sais pas si tu as la réponse, mais en listant les modules je me rend compte qu'ils ont tous leurs ModuleID=1
Donc en gros je sais pas comment je pourrais les identifier (leur trouver un identifiant unique), il y a hModule mais je ne sais pas si c'est unique, et qu'est ce que signifie cette valeur.

Le type Module :
'des infos sur les modules
Public Type MODULEENTRY32
    dwSize As Long                  'taille de cette structure (à initialiser avant l'appel à Module32First ou Module32Next)
    th32ModuleID As Long            'ID du module
    th32ProcessID As Long           'ID du processus qui utilise le module
    GlblcntUsage As Long            'compteur d'usage global pour toutes les instances présentes dans la mémoire du système
    ProccntUsage As Long            'commteur d'usage du module pour le processus
    modBaseAddr As Long             'adresse de début du module en mémoire
    modBaseSize As Long             'taille du module en mémoire
    hModule As Long                 'HMODULE du module
    szModule As String * 256        'nom du module
    szExeFile As String * MAX_PATH  'chemin du module
End Type

Si t'as une idée, merci d'avance ;)
Ciaò
[mailto:madmatt_12@msn.com MadMatt]
www.madmatt.fr.st
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 sept. 2006 à 14:26
ByRef étant par defaut, en VB6, sans le ByVal, pout Windows, ce que tu luyi transmets, c'est l'adresse (pointeur) de l'endroit où se trouve le pid, et non le pid lui même.

concernant le moduleId :
http://windowssdk.msdn.microsoft.com/en-us/library/ms684225.aspx

* th32ModuleID : <dd>This member is no longer used, and is always set to one.
et pour le hModule :
* hModule : <dd>Handle to the module in the context of the owning process.
le coté 'in the context of the owning process' ne nous aide pas pour nous en servir comme identifiant.

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Rejoignez-nous