Comment obtenir le fichier MFT entrée / inode en utilisant Java ou C ++
-
28-10-2019 - |
Question
J'ai écrit un chercheur en double en Java, mais je dois inclure le support de lien dur pour elle. Malheureusement, il semble y avoir aucun moyen de creuser une entrée de fichier MFT en Java.
Bien qu'il y ait une méthode appelée fileKey () dans la classe BasicFileAttributeView, il ne fonctionnera pas sur le système de fichiers NTFS (je n'ai pas encore testé sur ext).
Je trouve aussi la méthode isSameFile () (en java.nio.file.Path). Est-ce que quelqu'un sait comment cette méthode fonctionne? Il semble faire la bonne chose, mais il renvoie une valeur booléenne, il est donc sans valeur pour moi (je veux mettre les résultats en une carte et de les regrouper par leurs entrées MFT).
Je peux toujours comparer les temps de création, de modification, temps etc. pour chaque fichier, mais cela est tout simplement abandonner.
Est-il possible d'accomplir ce que je suis en train de faire dans C ++ ou Java? Je me soucie plus de faire fonctionner sur NTFS que poste.
La solution
Vous devez utiliser la structure FILE_ID_FULL_DIRECTORY_INFORMATION
en même temps que la fonction NtQueryDirectoryFile
(ou FILE_INTERNAL_INFORMATION
structure avec la balise NtQueryInformationFile
, si vous avez déjà une poignée) à l'intérieur ntdll.dll
(disponible depuis Windows XP, sinon plus tôt ) pour obtenir les identifiants de fichiers 8 octets et vérifier si elles sont les mêmes.
Cela vous dira si elles sont les mêmes fichier , mais pas si elles sont les mêmes flux du même fichier.
Je ne sais pas comment détecter si deux fichiers sont le même flux de mode utilisateur - il y a une structure nommée
Autres conseils
La détection des liens durs est habituellement accompli en appelant FindFirstFileNameW
. Mais il existe un moyen de niveau inférieur.
Pour obtenir l'équivalent NTFS à inodes, essayez FSCTL_GET_OBJECT_ID
Code ioctl.
Il est un identifiant unique (jusqu'à ce que le fichier est supprimé) dans la section structure BY_HANDLE_FILE_INFORMATION
ainsi.
Si le volume a un permis USN journal des modifications, vous pouvez utiliser la structure USN_RECORD
En Java, vous pouvez utiliser sun.nio.ch.FileKey
qui est une enceinte non transparente pour NTFS Inode. Tous les liens durs partagent la même Inode.
Par conséquent, si vous avez besoin de collecter des liens durs, vous pouvez créer FileKey
de chaque suspect et de les comparer (par exemple en mettant des paires de FileKey -> dans un fichier Multimap
)