Problème avec CreateToolhelp32Snapshot [Résolu]

MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention - 3 sept. 2006 à 18:04 - Dernière réponse : Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention
- 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
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 4 sept. 2006 à 09:55
3
Merci
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

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 117 internautes ce mois-ci

Commenter la réponse de Renfield
Meilleure réponse
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 4 sept. 2006 à 12:32
3
Merci
ah! , vi, le ByVal du PID

Renfield
Admin CodeS-SourceS- MVP Visual Basic

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 117 internautes ce mois-ci

Commenter la réponse de Renfield
MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention - 4 sept. 2006 à 12:10
0
Merci
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
Commenter la réponse de MadM@tt
MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention - 4 sept. 2006 à 13:02
0
Merci
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
Commenter la réponse de MadM@tt
MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention - 4 sept. 2006 à 13:07
0
Merci
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
Commenter la réponse de MadM@tt
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 4 sept. 2006 à 14:26
0
Merci
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
Commenter la réponse de Renfield

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.