2009-08-21 7 views
2

Je prévois d'écrire un exemple de programme qui identifie un fichier (un fichier dll) verrouillé par/utilisé par un processus.Identifiez si un fichier (dll/exe) est verrouillé ou non par un processus ou une bibliothèque

Comment pouvons-nous atteindre ce programme en utilisant l'API WIN (une fonction C/C++)? En fait, lorsque nous effectuons un processus de mise à niveau de logiciel, un autre processus pourrait utiliser la bibliothèque qui échouera provisoirement à l'opération de mise à niveau.

Le meilleur exemple que je voudrais apporter ici est l'outil Unlocker qui répertorie tous les processus/dll qui utilisent un fichier particulier.

Répondre

1

Je ne pense pas qu'il soit possible de déterminer les processus sans écrire un pilote. Heureusement, Russinovich's Handle tool inclut un tel pilote; Je suggère que vous exécutiez cet outil.

+0

Je ne suis pas intéressé par le processus qui verrouille le fichier, je suis plutôt intéressé si le fichier est verrouillé ou non. une API qui renvoie une valeur si un fichier est verrouillé ou non serait beaucoup mieux quelque chose comme "getFileLockStatus (nom de fichier)" – Venkat

+0

Je ne vois pas le point. Si vous avez une API qui peut vous dire exactement quels processus ont verrouillé un fichier, alors vous avez une API qui peut vous dire simplement si un fichier est verrouillé ou non. Il ne peut pas être difficile d'écrire une fonction courte qui renvoie un booléen s'il n'y en a pas un intégré. –

4

Vous pouvez essayer d'ouvrir le (s) fichier (s) vous-même pour un accès exclusif. Si un autre processus les a ouverts, cela devrait échouer.

1

Si vous n'avez pas besoin de savoir quels processus utilisent le fichier en question, vous pouvez simplement ouvrir le fichier pour un accès exclusif à l'aide de CreateFile.

::CreateFile(filename, 0, 0, 0, OPEN_EXISTING, 0, 0); 
1

Dans Windows, un fichier n'est pas 'verrouillé' ou 'déverrouillé'. Si un fichier est ouvert, le mode de partage spécifié lors de l'ouverture détermine si et dans quelles circonstances les autres tentatives d'ouverture du fichier aboutissent.

Si l'indicateur FILE_SHARE_NONE est spécifié, le fichier est complètement verrouillé et aucune autre tentative d'ouverture du fichier ne sera effectuée. Si FILE_SHARE_READ a été spécifié, les tentatives d'ouverture du fichier avec l'accès GENERIC_READ aboutiront, mais GENERIC_WRITE échouera, par exemple. FILE_SHARE_WRITE permet d'ouvrir d'autres handles pour l'accès en écriture, et FILE_SHARE_DELETE le même pour la suppression. Une fois que vous avez décidé du niveau d'exclusion que vous considérez comme 'verrouillé', vous pouvez simplement essayer d'ouvrir chaque fichier avec l'accès approprié et voir s'il échoue avec ERROR_SHARING_VIOLATION ou non.

0

Il me semble que l'API de windows fournit EnumProcesses() pour obtenir facilement une liste des processID et EnumProcessModules actifs pour obtenir une liste des handles de module (si EXE et DLL sont associés) pour chaque processus; Enfin GetModuleFileNameEx() vous donne le chemin complet et le nom de fichier du module chargé.

Ainsi vous pouvez facilement passer en revue tous les noms de DLL chargés et au moins savoir quel processus les tenait si vous avez détecté un problème - et peut-être même terminer automatiquement ce processus.

Questions connexes