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

Soyez le premier à donner votre avis sur cette source.

Vue 20 099 fois - Téléchargée 1 724 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.

C'est une version simplifiée et VB.Net de mon code http://www.vbfrance.com/code.aspx?id=25915.
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 (un manisfest est inclu dans l'exe afin d'avertir l'UAC et de forcer le "Run as Administrator")

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é sur XP Pro 32 et 64bits, 2000, 2003 32bits, Vista 32bits, Seven 32 et 64bits (mode test driver), 2008 R2 x64 (test signing mode).

Le code du driver est fourni. Il est compilable avec le DDK

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

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Merci beaucoup pour le code...
Messages postés
78
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
15 novembre 2018

Bonjour,

Ton code est vraiment très bon.
par contre connait tu un moyen de connaître le hwnd de la fenêtre qui affiche le fichier, je m'explique,
j'ouvre deux fichier pdf
quand j'exécute ton programme il m'affiche bien mes deux fichier pdf mais le pid du programme est le même.
a ton avis c'est possible de retrouver le hwnd de la fenêtre qui affiche le fichier
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
14
Bonjour,

Ce code gère maintenant à la fois x86 et x64 (en mode test signing, car le driver n'est pas signé avec un certificat officiel)

ShareVB
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
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
14
salut,

en retestant j'ai constaté que le deboggueur de VBExpress 2005 est lent comme un escargot...donc le mieux c'est de lancer l'exe dans le dossier bin\ (ou Ctrl-F5 dans vb)

je rappelle aussi que si vous utilisez le bouton STOP de VB alors le driver ne pourra pas être déchargé avant le prochain démarrage (car son handle ne sera jamais fermer) et donc source d'erreur...

ShareVB
Afficher les 24 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.