Ceci est une ancienne révision du document !


Surveiller modification Fichier/Répertoire

Pistes de recherches

FindFirstChangeNotification

Cette méthode est documentée ici → Obtention de notifications de modification de répertoire

Apparemment cette méthode permet de savoir si un dossier a été modifier, mais pas de connaitre les modification apportées. Quel fichier modifié ? Quel fichier ajouté ou supprimé ?

Comment ça marche ?

Pour faire simple :

On récupere les Handle des répértoires a surveiller avec

function FindFirstChangeNotification(lpPathName:LPCSTR; bWatchSubtree:WINBOOL; dwNotifyFilter:DWORD):HANDLE;
  • lpPathname = PChar('C:\MonRepertoire\Etc\')
  • bWatchSubtree = boolean → on surveille juste le répertoire (False) ou le répertoire et ses enfants ? (True)
  • dwNotifyFilter = dWord → Changement que l'on veut capturer (Filename, Dirname, Attributes, Size…) plus d'infos ici

On met ces Handle dans un array de ce type : (par exemple)

THandleList = array [0..MAXIMUM_WAIT_OBJECTS - 1] of THandle;

Ensuite on attends une modification avec :

function WaitForMultipleObjects( nCount:DWORD; lpHandles : PWOHandleArray; bWaitAll:WINBOOL; dwMilliseconds:DWORD):DWORD
  • nCount = nombre de handle dans la liste
  • lpHandles = pointer vers le premier enregistrement de la liste de type THandleList (voir ci-dessus) (dans notre cas=@HandleList[0])
  • bWaitAll = Boolean → On attend toutes les modifs ??? (False dans notre cas)
  • dwMilliseconds = Temps d'attente en Millisecondes

La fonction WaitForMultipleObjects retourne un DWord qui peut être interprété de la façon suivante:

  • $102 (258) = TIMEOUT, le temps d'attente (dwMilliseconds) s'est écoulé.
  • $FFFFFFFF (-1) = FAILED !
  • $0..$40 = Index (+WAIT_OBJECT_0) du Handle dans la liste correspondant au répertoire qui a été modifié
  • $80..$C0 = Index (+WAIT_ABANDONED_0) du Handle qui… je sais pas trop

Plus d'infos → Valeur de retour de la fonction WaitForMultipleObjects

Titre

A la Procmon

Procmon est un excellent utilitaire qui montre en temps réel les accès aux fichiers par les processus.
Reste a savoir comment il fait ?

Apparemment cette solution impliquerai l'utilisation d'un drivers annexe, ce qui reste relativement fastidieux…

Piste OpenFilesView de Nirsoft

Une piste peut etre sur la page→https://www.nirsoft.net/utils/opened_files_view.html.
Un programme de Nirsoft apparement similaire a Procmon qui fonctionne de la facon suivante:

OpenedFilesView utilise l'API NtQuerySystemInformation pour énumérer tous les handles dans le système.
Après avoir filtré les handles non-fichiers, il utilise un driver temporaire - NirSoftOpenedFilesDriver.sys pour lire les informations sur chaque handle depuis la mémoire du noyau.
Ce driver est automatiquement déchargé du système lorsque vous quittez l'utilitaire OpenedFilesView.

Projet de ShareVB

En vrac à étudier

Sources & Ressources

Vous pourriez laisser un commentaire si vous étiez connecté.