[R] Récupérer un handle avec l'API OpenProcess

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

[R] Récupérer un handle avec l'API OpenProcess

#1

Message par orax »

Bonjour, je chercher à récupérer l'utilisation du CPU par un processus. Pour cela je vu que je devais utiliser l'API GetProcessTimes. Pour pouvoir l'utiliser j'ai besoin d'obtenir un handle du processus concerné, donc j'utilise OpenProcess, et c'est là où se trouve le problème.
Dans l'exemple ci-dessous, on peut récupérer le handle du processus explorer.exe mais par contre pour lsass.exe ça ne marche pas -> IsHWnd() me retourne 0.

Je précise que je suis sur Win Vista et que je ne souhaite pas utiliser le WMI (trop lent).
► Afficher le texte
Modifié en dernier par orax le sam. 25 avr. 2009 21:24, modifié 1 fois.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Récupérer un handle avec l'API OpenProcess

#2

Message par sylvanie »

Sujet intéressant !
Pour les droits, effectivement la piste est bonne (j'ai honteusement utilisé la valeur brute de fonderie ... à embellir avec un nom de variable plus explicite, il était tard hier soir ...)

DllCall("kernel32.dll", "hwnd", "OpenProcess",... renvoie un tableau , mais chaque composante est une string casté à la volée des fois en int, mais pas un handle
Mais ce n'est pas grave ! car ce qu'on passe à DllCall("kernel32.dll", "int", "GetProcessTimes", ... c'est une String castée en "hwnd" (et non "int", attention !).

Par contre le gros problème de l'appel, c'est les pointeurs, car là, DllStructGetPtr ne marche pas comme ça ...

Il faut créer des Structures via Dllstructcreate, pour pouvoir en extraire des pointeur. Ce n'est pas aussi souple qu'en C (c'est rare qu'on dise que le C est plus simple qu'Autoit ^^)

Donc ici voici le script remodifié, avec des pointeur pointant vers des structure de type FILETIME comme expliquer ici http://msdn.microsoft.com/en-us/library ... S.85).aspx

J'affiche à la fin les différents retours. D'après ce qu'ils disent, il s'agit de 2 * 32bits à concaténer pour avoir une expression dont l'unité est 100 nano secondes.

voilà :
► Afficher le texte
le TODO restant serai d'utiliser "FileTimeToSystemTime" pour convertir ces types de valeur en une structure de type SYSTEMTIME (voir le lien sur http://msdn.microsoft.com/en-us/library ... S.85).aspx )
qui est ainsi :
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;

bon courrage ^^
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Récupérer un handle avec l'API OpenProcess

#3

Message par sylvanie »

deuxième mouture avec les modifs en questions. Par contre la convertion en therme Année, jours... pour les temps kernel et user sont à discuter (mais ok pour la convertion msec, sec,min,heure). En revenche ça marche bien pour l'heure de création
► Afficher le texte
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Récupérer un handle avec l'API OpenProcess

#4

Message par orax »

Merci pour toutes ces explications ! Je commence à y voir plus clair en ce qui concerne les conversions.
Le bout de script que j'avais posté était incomplet et donc je ne savais pas encore que mon utilisation de DllStructGetPtr était mauvaise. Je ne pouvais pas récupérer un handle du processus lsass.exe puisque je n'avais pas les privilèges (d'après ce que j'ai pu comprendre). Il faut utiliser l'API AdjustTokenPrivileges, j'ai d'ailleurs trouvé une fonction toute faite sur le forum officiel :
(Dans cette fonction j'utilise actuellement "SeDebugPrivilege" => SetPrivilege("SeDebugPrivilege", True) mais je suppose qu'il n'y a peut-être pas besoin d'utiliser un privilège aussi élevé.
► Afficher le texte
Pour ce qui est de la conversion j'avais vaguement vu l'API FileTimeToSystemTime mais sans l'avoir essayé. En tout cas votre exemple pour son utilisation dans Autoit me sera utile.
Concernant l'utilisation du CPU par le processus j'avais trouvé ceci http://www.autoitscript.com/forum/index ... t&p=605045 où $Process_CPU_Usage dans la fonction _GetProcTime renvoie l'utilisation du CPU.

Je n'ai pas encore mis tout ça en pratique mais je pense avoir désormais tous les outils pour faire. Merci bien !
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Répondre