Savoir quel fichier est utilisé par telle application : la liste des fichiers ouverts sur le système (pour nt/2k/xp)

Soyez le premier à donner votre avis sur cette source.

Vue 21 595 fois - Téléchargée 1 841 fois

Description

Ce code permet d'avoir la liste des fichiers ouverts sur le système. Il emploie des fonctions non documentées.Il contient un module de classe pour obtenir cette liste.

L'application de ce projet pourrait être : quand on ouvre un fichier et que l'on obtient une erreur, on peut afficher l'application qui utilise le fichier actuellement. Le seul problème, c'est que ce code nécessite les droits d'ADMINISTRATEUR...

Si l'on a les droits appropriés (administrateur), on peut obtenir la liste des fichiers ouverts, même des processus système (privilège SeDebugPrivilege).

Le driver est juste là, car, parmi les fichiers il y a les pipes...et le probleme des pipes est qu'ils peuvent créer des deadlocks (blocage dû au fait qu'on attend après une ressource (le pipe) qui ne sera jamais libérée)...Or dans les objets kernels (au sens de structure mais bon c le terme) correspondants aux handles, il y a un membre de la structure dudit objet qui renseigne sur "l'occupation" de l'objet...Mais on ne peut accéder aux objets kernels qu'en mode kernel donc dans un driver...
bref, le driver regarde si un appel à NtQueryObject créera ou non un deadlock :
- si pas deadlock, il appelle ObQueryNameString (<=> NtQueryObject) pour obtenir le nom de l'objet
- si deadlock, il se débrouille avec les pointeurs vers les noms et les objets eux-mêmes pour trouver le nom complet

Ce code devrait être fonctionnel sur toutes les versions de Windows depuis Windows 2000 en version 32 ou 64 bits.

Note sur le x64 : ce code utilisant un driver "non signé", il ne peut fonctionner sous les versions x64 de 2003, 2008, Vista, Seven qu'en mode "test signing" (mode qui désactive la vérification des signatures de drivers) (voir http://msdn.microsoft.com/en-us/library/windows/hardware/ff553484%28v=vs.85%29.aspx)

Conclusion :


Pour plus d'infos sur les API Native de Windows NT/2000/XP, regarder le livre "Windows NT/2000 NATIVE API Reference" de Gary Nebbett

Ce code ne fonctionne pas sous 9x/ME. Testé sous XP 32, Vista 32 et Seven 32 et 64

Projet Delphi 2010, Delphi 7 et XE2

N'hésitez pas à commenter et à noter...

si vous avez un problème avec ce code, supprimer la clé KernelMemory et son contenu dans HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services...et au prochain redémarrage, le code devrait fonctionner...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
14
Sorry for the delay, the only document I used was http://msdn.microsoft.com/en-us/windows/hardware/gg487358 but in your case, porting to x64 may involve finding another method because some kernel memory changes are not allowed

ShareVB
Messages postés
4
Date d'inscription
jeudi 3 janvier 2008
Statut
Membre
Dernière intervention
4 octobre 2011

Cool ShareVB! Do you have any references about how to make x64 version from x32 version? Actually, I use a driver to hook process creation but it doesn't work in x64 machine so I will learn you latest code.
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
14
A working version on x64 is available (however in test signing because I have no certificate to sign the driver)

ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
14
To allow to run this code on x64, modification of Delphi and Driver code along to run your x64 OS in testsigning...but I did it on VB.Net verson of this code and will do it soon on this version

ShareVB
Messages postés
4
Date d'inscription
jeudi 3 janvier 2008
Statut
Membre
Dernière intervention
4 octobre 2011

If I want to make this code run under x64, what should i do, compile the .pas with Delphi XE2 or only modifying the .c file?
Afficher les 29 commentaires

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.