LISTER LES HANDLES (FICHIERS, CLÉ DE REGISTRES,...) OUVERTS PAR UN PROGRAMME (NT

Signaler
Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
-
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39333-lister-les-handles-fichiers-cle-de-registres-ouverts-par-un-programme-nt-2000-xp-en-vb-net

Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Brunews parle de l'API Win32.

Pour inclure çà dans du VB.Net faut utiliser le namespace
System.Runtime.InteropServices

et déclarer la fonction comme décrit ici : http://www.pinvoke.net/default.aspx/kernel32/CreateFile.html

Sinon CreateFile c'est bien, mais çà ne permet pas de savoir quel process a ouvert le fichier. Pour connaitre le process, pas le choix, faut énumérer les handles ouverts sur le système et déterminer, en fonction du nom du fichier, quel est le handle concerné pour avoir son ProcessId associé.
@+
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Si je parle API c'est API sinon j'aurais dit autre chose.
http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx
Messages postés
257
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
22 décembre 2012
1
BRUNEWS

Je m'étonne car quand je fais la commande que tu dis, je n'ai pas le choix dans les options de la commande :

File.Create(entree, 0, FileOptions.None)

Sinon filecreate n'existe pas, à moins de faire un imports mais lequel ?

D'avance merci
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Pas besoin de choses compliquées:
Fais un CreateFile sur le nom de fichier avec 0 en SHARE_MODE et OPEN_EXISING.
Si handle = -1 alors est indisponible.
Sinon CloseHandle et est dispo.
L'API ne déclenche jamais d'erreurs.
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
bidouille007 => Salut, si c'est bien çà, mais il faut regarder les handles ouverts de type "fichier" (file).

Par contre pour éviter l'erreur "fichier occupé par un autre processus", il faudrait fermer le handle ouvert par le process, mais çà risque d'impacter sur son comportement.

@+
Messages postés
257
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
22 décembre 2012
1
Bonjour

Je ne noterai pas ce code fort intéressant mais hélas ne semble pas correspondre à ma recherche qui est :

Déterminé quel processus occupe un fichier afin d'éviter l'erreur fichier occupé par un autre processus (peut être un processus système pour une image affiché dans l'explorateur en mode miniature ou pellicule)

Ai je mal utilisé le code ?

Bidouille
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Salut,

j'ai ENFIN réussi à convertir entièrement ce code pour qu'il soit utilisable indifférement sur un OS 32-bits ou 64-bits. Enfin, côté .Net, parce que le driver en 64-bits je l'ai pas, je connais pas assez le C pour m'y attaquer pour le moment.
Bref, j'arrive à faire fonctionner ce code pour qu'il fonctionne parfaitement aussi bien sur 32 que sur 64 bits, mais la récupération du Name des objets de type File ne fonctionne que sur 32-bits (car pas de driver 64-bits).

Comme toutes les structures changent en 64-bits (pointeurs sur 8 octets), le code diffère pas mal (allocations mémoire différentes, utilisation de IntPtr qui implique de ne plus utiliser des offsets en dur...etc).


Pour info, ce code est vraiment très très utile, puisqu'il permet d'obtenir des tonnes d'infos sur le système (possibilité d'énumérer les processus via les handles de csrss, possibilité d'énumérer les jobs en cours après récupération du ObjectTypeNumber de "Job"...).

Bref si quelqu'un veut la version qui fonctionne sur x64, contactez moi (je poste pas là parce que tout le code est refait)
@+
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Salut,

quelqu'un a des infos pour l'utilisation de GetObjectTypeNumber dans ce code avec un OS 64bits ?

@+
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Juste pour rajouter :
- GetThreadId sur Vista uniquement
- GetProcessIdOfThread sur Vista uniquement
- GetProcessId XP SP1 et Vista

@+
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Salut,

Je passe juste pour dire qu'il est possible d'utiliser ces fonctions de Kernel32 :
- GetThreadId
- GetProcessIdOfThread
- GetProcessId

pour récupérer les ID et noms des processus/threads ouverts (à mettre dans RetrieveObject avec hHandle en paramètre).

@+ et merci pour l'excellente source.
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
20
Pour le driver j'avoue que je n'ai pas encore le niveau pour me permettre d'en développer un.
Mais oui il m'a été demandé dans un cahier des charges de surveiller quels fichiers sont ouverts par les utilisateurs à partir d'un programme bien précis.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Tu pourrais entrer dans chaque prog par SetWindowHookEx et intercepter ZwCreateFile MAIS...
Ben oui il y a toujours un "mais":
SetWindowHookEx ne fait que du hook user mode, on n'entre pas dans les services systèmes ainsi.
Pour résumer, la seule méthode valable est le hook en driver. A toi de savoir si tu as vraiment besoin de récupérer les actions des composants système.
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
20
Oui j'y ai pensé mais si je pouvais me passer de faire un driver et faire juste un hook sur ZwCreateFile.
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
14
salut,

pour obtenir la liste des ouvertures de fichiers, on peut aussi se mettre directement dans un driver comme Filesystem filter et on récupère tout les évènements fichiers...comme filemon...

ShareVB
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
20
Question bete mais peut-on faire un hook sur une api avec SetWindowsHookEx ?
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

Eh bin disons que si CurrDir + WindowName n'est pas valide dans ce cas le fichier se trouve bien dans CommandLine...

Mais bon tu as raison sur les présupposés, sauf que j'ai juste donne une solution supplementaire pour determiner les fichiers ouverts et j'ai precise dans le cas de notepad par exemple. Apres tous les softs ne sont pas fait pour etre distribues et etre utilises par tous, on code des fois (souvent) des ptits trucs pour soi-meme et donc ce n'est plus faire un soft sur des présupposés, mais se faire un petit outil perso pour un usage precis.

++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
OUPS et ultra OUPS, c'est faux aussi pour notepad.
Notepad ne modife pas sa currDir de lui même, c'est qu'il ne met pas le flag OFN_NOCHANGEDIR sur fichier->ouvrir donc sa currDir change, MAIS si on lance notepad avec un fichier sur la ligne de commande alors currDir n'est pas sur le fichier lu.
Comme quoi les présupposés...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Exact pour notepad, je viens de vérifier.
De là à présumer pour les autres... On ne peut pas batir un prog sur des présupposés.
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

Eh vi biensure qu'on peut ouvrir un fichier sans affecter son CurrDir, mais notepad modifie automatiquement son CurrDir en fonction du fichier ouvert, et c'est surement pas le seul...

++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Le "CurrentDirectory" ???
Un prog accède à un fichier nimporte où sans pour cela qu'il soit dans la currDir du prog.
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

lol toute de suite les grands mots!

Bon on va dire: recuperer le CurrentDirectory plus le WindowName et ca te donne le nom du fichier "ouvert"

Ca permet par exemple, a un administrateur de voir d'un coup d'oeil ce qui est en cours sur le systeme.

++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Liste des handles, ok je comprends mais progs comme notepad qui n'ont pas de fichiers ouverts ???
Si vraiment on veut savoir les fichiers accédés, faut hooker ZwCreateFile (possible en vb ?).
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

Eh bin ca sert a le savoir deja :P

++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
A quoi servirait de savoir ce qui a été lu dans notepad (ou autre) ???
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

Eh oui, sauf que si on prend l'exemple de Notepad, tu n'aura que le nom du fichier (sans son chemin)

++
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
20
Notepad était un exemple, mais les programmes dont je veux savoir quels fichiers l'utilisateur à ouvert avec fonctionnent comme notepad.

Mais bon comme avec notepad ils fournissent dans le titre de leurs fenêtres le nom du fichier ouvert. GetWindowText fera l'affaire finalement.
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

Salut,

Tu peux toujours recuperer le nom du fichier ouvert par notepad en recuperant son CommandLine ;)

++
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
20
Arf alors sa me fait de meme avec les 3/4 des programmes. Pas de chance.
Merci de l'info.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
notepas ne tient pas de handle sur un fichier. Il ouvre, remplit un buffer et referme.
Simple à tester, affiche un fichier dans notepad et va dans dans l'explorateur supprimer ce fichier, tu verras que aucun message d'impossibilité.
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
20
Salut,
Est-ce normal que si j'ouvre dans le bloc-note un fichier .txt je ne retrouve pas dans la liste le nom de ce fichier ?
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

Heyhey ^^

Merci :)

Je regarde ca des que j'ai une minute

++
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
14
salut,

voilà une source pour lister les drivers : http://www.vbfrance.com/code.aspx?ID=39470

ShareVB
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

Ok merci pour ta reponse et pour le lien :)

++
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
14
salut,

euh, la différence : c'est juste que ca affiche (et lit) la liste de tous les handles...et effectivement, il y a peu de différences dans les classes

pour la liste des drivers, si tu aimes le C : http://www.internals.com/utilities/winnt/ntdriverlist/NtDriverList.zip

ShareVB
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

Salut ShareVB, salut a tous

Eh y a un petit truc qui m'echape, quelle est la difference entre les fichiers ouvert lister par ce code, et ceux dans la source ou tu ne liste que les fichiers ouverts ?

Sinon c'est cool d'avoir mis le code du driver ^^

Au passage, tu ne connaitrais pas un moyen de lister les drivers en cours sur le systeme ?

Bonne continuation
++
Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
1
Bonjour,
c'est pas mal... (lorsqu'on click sur devenv on se rend tout de suite compte pourkoi le .net est d'une lenteur incroyable)