Freigeben über


Erweiterte Kernelattribute

Ab Windows 8 unterstützt NTFS Kernel Extended Attributes (Kernel-EAs). Das Überprüfen der Signatur eines Images ist ein teurer Vorgang. Das Speichern von Informationen darüber, ob eine zuvor überprüfte Binärdatei geändert wurde, verringert die Anzahl der Instanzen, in denen ein Image einer vollständigen Signaturprüfung unterzogen werden muss. Die Verwendung von Kernel-EAs aus diesem Grund erhöht die Leistung der Überprüfung der Imagedateisignatur.

EAs mit dem Namenspräfix $Kernel können nur im Kernelmodus geändert werden. Jede EA, die mit dieser Zeichenfolge beginnt, wird als Kernel EA betrachtet. Vor dem Abrufen der erforderlichen Updatesequenznummer (USN) wird empfohlen, zuerst FSCTL_WRITE_USN_CLOSE_RECORD auszustellen, um alle ausstehenden USN Journal-Updates für die Datei zu committen, die möglicherweise zuvor aufgetreten sind. Andernfalls kann sich der FileUSN-Wert kurz nach dem Festlegen des Kernel-EA ändern.

Es wird empfohlen, dass ein Kernel EA mindestens die folgenden Informationen enthält:

  • USN UsnJournalID

    • Das Feld UsnJournalID ist eine GUID, die die aktuelle Inkarnation der USN-Journaldatei identifiziert. Das USN-Journal kann aus dem Benutzermodus pro Volume gelöscht und erstellt werden. Jedes Mal, wenn das USN-Journal erstellt wird, wird eine neue UsnJournalID-GUID generiert. Mit diesem Feld können Sie erkennen, ob es einen Zeitraum gab, in dem das USN-Journal deaktiviert wurde, und sie können einen Überprüfungstermin ausführen.
  • USN FileUSN

    • Der FileUSN-Wert enthält die USN-ID der letzten Änderung, die an der Datei vorgenommen wurde, und wird innerhalb des MFT-Eintrags (Master File Table) für die angegebene Datei nachverfolgt.
      • Wenn das USN-Journal gelöscht wird, wird FileUSN auf 0 zurückgesetzt.

Diese Informationen, zusammen mit allen anderen, die eine bestimmte Verwendung benötigt, werden dann für die Datei als Kernel-EA festgelegt.

Festlegen eines erweiterten Kernel-Attributs

Um einen Kernel-EA festzulegen, muss er mit dem Präfix "$Kernel." gefolgt von einer gültigen EA-Namenszeichenfolge beginnen. Ein Versuch, einen Kernel EA aus dem Benutzermodus festzulegen, wird im Hintergrund ignoriert. Die Anforderung gibt STATUS_SUCCESS zurück, aber es wird keine tatsächliche EA-Änderung vorgenommen. Das Aufrufen einer API wie ZwSetEaFile oder FltSetEaFile zum Festlegen eines Kernel-EA aus dem Kernelmodus ist nicht ausreichend, da SMB die Einstellung von EAs im Netzwerk unterstützt und diese Anforderungen aus dem Kernelmodus auf dem Server ausgegeben werden.

Um einen Kernel-EA festzulegen, muss der Aufrufer auch den IRP_MN_KERNEL_CALL Wert im Feld MinorFunction des IRP (E/A-Anforderungspaket) festlegen. Da die einzige Möglichkeit zum Festlegen dieses Felds das Generieren eines benutzerdefinierten IRP ist, wurde die Routine FsRtlSetKernelEaFile aus dem FsRtl-Paket als Unterstützungsfunktion zum Einrichten eines Kernel-EA exportiert.

Ab Windows 10 Version 1803 können Benutzer-EAs und Kernel-EAs gemischt werden. Durch das Festlegen eines Kernel-EA wird kein USN_REASON_EA_CHANGE Datensatz für das USN-Journal generiert. Das System generiert USN_REASON_EA_CHANGE, wenn Benutzer-EAs festgelegt sind.

Abfragen eines erweiterten Attributs

Das Abfragen der EAs für eine Datei aus dem Benutzermodus gibt sowohl normale als auch Kernel-EAs zurück. Sie werden wieder in den Benutzermodus versetzt, um Anwendungskompatibilitätsprobleme zu minimieren. Die normalen Vorgänge ZwQueryEaFile und FltQueryEaFile geben sowohl normale EAs als auch Kernel-EAs aus dem Benutzer- und Kernelmodus zurück.

Wenn nur ein FileObject verfügbar ist, kann die Verwendung von FsRtlQueryKernelEaFile für die Abfrage von Kernel-EAs aus dem Kernelmodus bequemer sein.

Abfragen von Journalinformationen zur Updatesequenznummer

Der FSCTL_QUERY_USN_JOURNAL Vorgang erfordert SE_MANAGE_VOLUME_PRIVILEGE , auch wenn er aus dem Kernelmodus ausgegeben wird, es sei denn, der IRP_MN_KERNEL_CALL Wert wurde im Feld MinorFunction des IRP festgelegt. Die Routinemäßige FsRtlKernelFsControlFile wurde aus dem FsRtl-Paket im Kernel exportiert, damit Kernelmoduskomponenten diese USN-Anforderung problemlos ausgeben können.

HINWEIS Ab Windows 10, Version 1703 und höher, ist für diesen Vorgang keine SE_MANAGE_VOLUME_PRIVILEGE mehr erforderlich.

Automatisches Löschen von erweiterten Kernelattributen

Das einfache erneute Scannen einer Datei, da die USN-ID der geänderten Datei teuer sein kann, da es viele gute Gründe gibt, warum ein USN-Update in die Datei gepostet wird. Um dies zu vereinfachen, wurde NTFS ein Automatisches Löschen von Kernel-EAs hinzugefügt.

Da in diesem Szenario möglicherweise nicht alle Kernel-EAs gelöscht werden sollen, wird ein erweiterter EA-Präfixname verwendet. Wenn ein Kernel-EA mit beginnt, "$Kernel.Purge." löscht NTFS alle Kernel-EAs, die in dieser Datei vorhanden sind und der angegebenen Namenssyntax entsprechen, wenn einer der folgenden USN-Gründe in das USN-Journal geschrieben wird:

  • USN_REASON_DATA_OVERWRITE
  • USN_REASON_DATA_EXTEND
  • USN_REASON_DATA_TRUNCATION
  • USN_REASON_REPARSE_POINT_CHANGE

Dieses Löschen von Kernel-EAs ist auch in Situationen mit geringem Arbeitsspeicher erfolgreich.

Hinweise

Benutzermoduskomponenten können Kernel-EAs nicht manipulieren. Kernel-EAs können in derselben Datei wie ein normaler EA vorhanden sein.

Weitere Informationen

FltQueryEaFile
FltSetEaFile
FSCTL_QUERY_USN_JOURNAL
FsRtlQueryKernelEaFileFsRtlSetKernelEaFile
ZwQueryEaFile
ZwSetEaFile