2016-04-14 2 views
3

Étant donné que j'ai une liste de tous les descripteurs de fichiers de tous les processus, comment puis-je savoir lesquelles de ces poignées verrouillent réellement un fichier? D'après ce que je comprends, je pourrais simplement essayer d'ouvrir les fichiers et essayer d'obtenir toutes les autorisations et si quelque chose ne va pas, je sais qu'il est verrouillé. Mais ce son est extrêmement inefficace. Je veux dire que j'ai déjà les poignées est-il impossible de vérifier quelles sont les permissions des poignées?Vérifiez si le fichier est verrouillé par un descripteur de fichier de processus

De préférence j'aimerais voir une solution qui fonctionne sur Windows XP et plus.

J'ai déjà recherché dans la fonction GetFileInformationByHandleEx, mais je n'ai rien trouvé à propos des autorisations d'accès. :/

Modifier: Je n'ai pas besoin d'informations en temps réel sur le verrouillage de fichier. Les fichiers sur lesquels je prévois de travailler seront verrouillés jusqu'à ce que certaines applications soient fermées ou ne soient pas verrouillées du tout.

+3

Mieux vaut demander pardon que la permission –

+0

Vous pouvez lire le "verrou" du fichier en essayant d'écrire sur le handle, puisque la lecture/écriture est seulement par le propriétaire du handle. – Joel

+7

Il n'y a aucun moyen de le faire. Tout type de fonction IsFileLocked() ne peut jamais fonctionner de manière fiable sur un système d'exploitation multitâche. La valeur renvoyée est instantanément périmée et ne garantit pas qu'elle est toujours déverrouillée lorsque vous essayez d'accéder au fichier. Vous découvrez en accédant au fichier, c'est atomique. Ce n'est pas inefficace, seulement ce que vous faites quand il est verrouillé pourrait l'être. Ce qui est exactement la même chose que si une hypothétique fonction IsFileLocked() renvoyait TRUE. Evitez tout cela en empêchant un autre processus de verrouiller le fichier lorsque vous l'ouvrez. –

Répondre

0

Cette question est un double de Win32 files locked for reading: how to find out who's locking them.

En outre, le commentaire de Hans Passant est correct: interroger l'état verrouillé de n'importe quel fichier Win32 donne des informations périmées. Ne pas tenir compte de cet avertissement entraînera des bogues difficiles à trouver.

Si vous contrôlez tous les bits de code qui, selon vous, vont accéder aux fichiers, il est préférable d'utiliser un named pipe pour la communication interprocessus, au lieu d'interroger les fichiers verrouillés.

+0

Pas vraiment un doublon. Je ne suis pas seulement intéressé par les verrous de lecture. Je suis intéressé par n'importe quel type de serrure. supprimer, écrire, lire et verrouille également que verrouiller uniquement une zone spécifique dans un fichier. Et encore une fois, cela n'a pas vraiment d'importance. Et je ne prévois pas d'inverser les processus d'ingénierie pour injecter des fonctionnalités de tuyauterie et autres joyeusetés. – Forivin

0

Vous pouvez utiliser NtQueryObject API pour obtenir des informations sur la poignée dont les suivantes:

ULONG Attributes; 
ACCESS_MASK GrantedAccess; 

Ou vous pouvez accéder aux mêmes informations en utilisant NtQueryInformationFileFileModeInformation et FileAccessInformation valeurs pour le paramètre FileInformationClass.

+0

J'ai créé beaucoup de fichiers de test et créé des poignées avec chaque combinaison d'accès en lecture/écriture/suppression et en écriture.Puis dans une autre application qui s'exécute avec SeDebugPrivilege etc. J'ai vérifié GrantedAccess, Attributs, Drapeaux etc. Voici le résultat: http://i.snag.gy/uHOMr.jpg Je pense qu'il est sûr de dire qu'aucun de ceux-ci ne contient aucun informations utiles concernant l'état de verrouillage. – Forivin