Wie greifen wir über C # auf MFT zu?

8

Ich muss auf Windows MFT (Master File Table) mit C # in meiner .net-Anwendung zugreifen.
Ich habe darüber gegoogelt und konnte keine guten Ergebnisse finden. Ich habe nach den Informationen der letzten 2 Tage gesucht, konnte aber keine Informationen darüber finden.

Ich bin nicht auf der Suche nach genauem Code, um das Gleiche zu tun, ich suche nur nach Informationen, mit denen ich anfangen kann.

Das Einzige, was ich herausgefunden habe, ist, dass ich P / Invoke verwenden muss.
Ich möchte die Funktionen wissen, die ich verwenden würde, um Zugriff auf MFT zu haben.
Wenn Sie ein Codebeispiel bereitstellen können, wäre das großartig.

    
Pratik Singhal 09.02.2014, 16:37
quelle

3 Antworten

20

Zuerst müssen Sie genügend Privilegien besitzen und geltend machen, um auf die MFT zugreifen zu können - das ist ein Schmerz für sich. Dann müssen Sie eine Handle zu einer Datei / Ordner auf dem Datenträger - für die Aufrufe im letzten Schritt ... das heißt eine Windows-API (genannt DeviceIOControl) in einer Schleife aufrufen und die Einträge aus dem zurückgegebenen API-Aufruf lesen - und das sind seine eigenen Kopfschmerzen.

Vom Konzept her sieht das so aus:

%Vor%

Wenn Sie jedes dieser Elemente nacheinander verwenden, ist die Angabe ausreichender Privilegien der dunkelste Teil. Es gibt eine Windows-API zum Ändern der Berechtigungen des ausgeführten Tokens - und Sie verwenden diese, um die erforderlichen Berechtigungen hinzuzufügen. Hier ist ein Auszug aus einer Klasse, mit der ich diese Privilegien geltend mache. Sie könnten einige Privilegien geltend machen - aber das sollte ausreichen, um die MFT zu lesen.

Ihre Anwendung muss unter einem Konto ausgeführt werden, das die erforderlichen Berechtigungen tatsächlich erhalten kann - ein Administratorkonto ist gut. Außerdem wird ein Sicherungsoperator funktionieren.

%Vor%

Sobald Sie diese Hürde hinter sich haben, ist der Rest - naja ... immer noch ein Festival der Dunkelheit. Sie müssen eine Handle zu einer Datei oder einem Ordner bekommen - mit Backup-Semantik. Sie können mehr als nur einfach einen FileStream für eine alte Datei auf dem Volume öffnen, das Sie suchen, und der FileStream verfügt über eine Kennung, die Sie für nachfolgende Aufrufe verwenden können. Dies ist nicht genau das, was meine Anwendung getan hat - aber meine App musste Dinge tun, die diese Antwort nicht zu tun hat.

%Vor%

Für ReadMft - Es gibt eine ziemlich komplexe Windows-API-Funktion - DeviceIOControl -, die Puffer mit einer epischen Vielfalt von Eingaben verwendet und Puffer mit einer überwältigenden Vielfalt von Ausgaben zurückgibt. Es ist eine Art Catch-All-API für die Abfrage von Informationen über verschiedene Geräte - und das Volume, das die MFT enthält, ist ein Gerät.

Um die MFT zu lesen, rufen Sie DeviceIOControl mit einem Geräte-IO-Steuercode von FSCTL_ENUM_USN_DATA auf, der für jeden Datensatz in der MFT einen USN-Datensatz zurückgibt. Es gibt viele Datensätze für jeden Aufruf - und nach jedem Aufruf parametrieren Sie den nächsten Aufruf in der Schleife mit dem ersten Bit der vom vorherigen Aufruf zurückgegebenen Informationen.

BTW - Ich habe die Windows-API-Aufrufe in meinem Code umbenannt, damit sie mehr wie .Net aussehen. Ich bin mir nicht sicher, ob ich das in Zukunft machen würde.

Spezielle Anmerkung hier : Sie erhalten einen Datensatz für jede Datei - unabhängig davon, wie viele feste Verbindungen es gibt - Sie müssen zusätzliche Aufrufe ausführen, um die festen Verbindungen aufzuzählen.

Die Dateisystemhierarchie ist in den FileReferenceNumber- und ParentFileReferenceNumber-Strukturen der Strukturen verschlüsselt, die Sie aus dem Aufruf erhalten. Sie würden diese usn-Datensätze normalerweise in einer Liste speichern, sortiert nach FileReferenceNumber und einen sekundären Index für die ParentFileReferenceNumber - oder etwas Ähnliches erstellen. Zur Veranschaulichung, dieser Code speichert nur die MFT-Einträge.

In diesem Beispiel wird unsicherer Code verwendet - und der Speicherort der Puffer, die die Eingabe und Ausgabe enthalten, wird korrigiert. Es gibt verschiedene Möglichkeiten, dies zu erreichen - aber das ist schön und zippy. Wenn Sie dies verwenden, müssen Sie unsicheren Code in Ihren Projekteinstellungen erlauben.

%Vor%

Ich mache etwas wahrscheinlich kitschiges, um mir eine Menge Arbeit zu ersparen - ich füge Pseudoserialisierungsmethoden zu Windows-API-Strukturen hinzu - damit sie sich selbst aus Streams herauslesen können. Zum Beispiel ist das usnRecord, das zum Lesen des Puffers im vorhergehenden Code verwendet wird, eine Windows-API-Struktur - jedoch mit einer implementierten Serialisierungsschnittstelle:

%Vor%

... wo IBinarySerialze ist:

%Vor%

In dieser Struktur werden Stream-Erweiterungsmethoden verwendet. Im Grunde sind sie von BinaryReader aufgehoben. Warum? Weil in .Net 3.5 - wo ich das ursprünglich schreiben musste - der BCL BinaryReader den Stream schließen würde, um den man ihn wickelte - und ich hatte viele Orte, wo das nur unerträglich war.

%Vor%

Und hier sind die nativen Methoden, Enums, Konstanten und Rauschen. Die meisten stammen von PInvoke.net, aber wiederum ... die Namen vieler dieser Dinge waren .Net-ified. Entschuldigung für die Puristen.

%Vor%     
Clay 11.08.2015, 00:07
quelle
2

Sie können diese Open Source-Bibliothek Ссылка verwenden, die von Danny Couture in C # geschrieben wurde.

Ich habe es getestet und seine Leistung ist gut. Es kann ein NTFS-Laufwerk mit mehr als 100000 Eintrag (Datei und Ordner) in weniger als 2 Sekunden analysieren.

    
Msf vtp 12.08.2017 05:18
quelle
-1

Everything.exe (Desktop-Suchanwendung) greifen auch auf das gleiche zu. Ich hoffe, Sie könnten es finden einige Informationen in Quellcode von everything.exe.

  

Wenn Everything.exe zum ersten Mal ausgeführt wird, erstellt es einen Index der Namen aller Dateien und Ordner auf dem Volume aus den Dateimetadaten in der NTFS-Master-Dateitabelle. [3] Standardmäßig sind alle gemounteten NTFS-Volumes indiziert. [4] Nach der Erstellung wird der Index von der Anwendung aus dem NTFS-Änderungsjournal kontinuierlich aktualisiert. [5] Alles durchsucht diesen Index nach Dateinamen, die einem Benutzersuchausdruck entsprechen, der ein Fragment des Zieldateinamens oder ein regulärer Ausdruck sein kann, [6] der beim Eingeben des Suchbegriffs Zwischenergebnisse anzeigt.

    
Harish Bugata 04.04.2015 07:00
quelle

Tags und Links