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

On traite la valeur retournée par la fonction WaitForMultipleObjects.
Puis on retourne a la surveillance par :

function FindNextChangeNotification(hChangeHandle:HANDLE):WINBOOL;

ou le parametre hChangeHandle est le Handle du répertoire modifié precedement.
Ce Handle est récuperable dans la liste des Handles THandleList passé a la fonction WaitForMultipleObjects a l'index retourné par cette méme fonction… (suis-je bien claire ???)

Exemple de code :

   // vIndex: integer;
   // vHandleList : THandleList (voir ci-dessus)
   // FCount = nombre de handle dans la liste vHandleList
   // FWaitMs = nombre de millisecondes a attendre
   // FDirChangedHandle = Handle du Find Change Notifier du répertoire qui a été modifié
   // Le Handle du Find Change Notifier est retourné par la function FindFirstChangeNotification (voir ci-dessus)
         while not Terminated do
           begin
            vIndex := WaitForMultipleObjects(FCount, vHandleList[0], False, FWaitMs);
            if (vIndex >= WAIT_OBJECT_0) and
               (vIndex < WAIT_OBJECT_0 + FNHandleList.Count)  then
              begin
                  FDirChangedHandle :=FHandleList[vIndex - WAIT_OBJECT_0];
                  ...
                  FindNextChangeNotification( FDirChangedHandle);
              end;
           end;

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é.