Dela via


Utökade kernelattribut

Från och med Windows 8 har NTFS stöd för Kernel Extended Attributes (Kernel EAs). Att verifiera en bilds signatur är en dyr åtgärd. Om du lagrar information om huruvida en tidigare validerad binär har ändrats, minskar det antalet tillfällen där en bild måste genomgå en fullständig signaturkontroll. Om du använder kernel-EA:er av den anledningen ökar prestandan för validering av bildfilsignatur.

Utökade attribut med namnprefixet $Kernel kan bara modifieras från kärnläge. Alla EA som börjar med den här strängen betraktas som kernel-EA. Innan du hämtar det nödvändiga uppdateringssekvensnumret (USN) bör du först utfärda FSCTL_WRITE_USN_CLOSE_RECORD för att genomföra eventuella väntande USN Journal-uppdateringar i filen. Annars kan FileUSN-värdet ändras kort efter att kernel-EA har angetts.

Ett Kernel EA bör innehålla minst följande information:

  • USN UsnJournalID

    • Fältet UsnJournalID är ett GUID som identifierar den aktuella inkarnationen av USN Journal File. USN-journalen kan tas bort och skapas per volym från användarläget. Varje gång USN Journal skapas genereras ett nytt UsnJournalID GUID . Med det här fältet kan du kontrollera om det fanns en tidsperiod då USN-journalen inaktiverades och kan revalideras.
  • USN FilUSN

    • FileUSN-värdet innehåller USN-ID:t för den senaste ändringen som gjordes i filen och spåras i MFT-posten (Master File Table) för den angivna filen.
      • När USN-journalen tas bort återställs FileUSN till noll.

Den här informationen, tillsammans med all annan användning som kan behövas, ställs sedan in på filen som en Kernel EA.

Ange ett utökat kernelattribut

För att kunna ange ett Kernel EA måste det börja med prefixet "$Kernel." följt av en giltig EA-namnsträng.

Ett försök att ställa in en Kernel EA från användarläge ignoreras tyst. Begäran returnerar STATUS_SUCCESS men ingen faktisk EA-ändring görs.

Det räcker inte att anropa ett API som ZwSetEaFile eller FltSetEaFile för att ange kernel-EA från kernelläge eftersom SMB tillåter inställningen av EA i nätverket. När en begäran om att ange ett EA kommer via SMB utfärdas den från kernelläge på servern som hanterar SMB-begäran. Nätverksbaserade begäranden kan felaktigt ange en Kernel EA lokalt.

Om du vill ange ett Kernel EA måste anroparen också ange värdet IRP_MN_KERNEL_CALL i fältet MinorFunction i IRP (I/O-begärandepaketet). Eftersom det enda sättet att ange det här fältet är genom att generera en anpassad IRP, är FsRtlSetKernelEaFile-rutinen supportfunktionen för att ställa in en Kernel EA.

Från och med Windows 10 version 1803 kan användar-EA:er och kernel-EA:er blandas. Om du anger en kernel-EA genereras inte en USN_REASON_EA_CHANGE post till USN Journal. Systemet genererar USN_REASON_EA_CHANGE när några användar-EA har angetts.

Köra frågor mot ett utökat attribut

När du ställer frågor till EA:erna på en fil från användarläget, returneras både normala och kärn-EA:er. De återgår till användarläge för att minimera eventuella programkompatibilitetsproblem. De normala åtgärderna ZwQueryEaFile och FltQueryEaFile returnerar både normala och kernel-EA:er från både användar- och kernellägen.

När endast en FileObject är tillgänglig kan det vara mer bekvämt att använda FsRtlQueryKernelEaFile för att fråga efter Kernel-EA:er från kärnläge.

Förfrågan om uppdateringssekvensnummerjournalinformation

Åtgärden FSCTL_QUERY_USN_JOURNAL kräver SE_MANAGE_VOLUME_PRIVILEGE även när den utfärdas från kernelläge om inte värdet för IRP_MN_KERNEL_CALL angavs i fältet MinorFunction i IRP. Rutinen FsRtlKernelFsControlFile tillåter enkelt kernel-mode-komponenter att utfärda denna USN-begäran.

NOT Från och med Windows 10, version 1703 och senare kräver den här åtgärden inte längre SE_MANAGE_VOLUME_PRIVILEGE.

Automatisk borttagning av utökade kernelattribut

Att enbart skanna om en fil eftersom USN-ID för filen har ändrats kan bli kostsamt, eftersom det finns många ofarliga anledningar till att en USN-uppdatering kan registreras i filen. För att undvika onödig omskanning lades en funktion för automatisk borttagning av kernel-EA:er till i NTFS.

Eftersom inte alla kernel-EA:er kanske vill tas bort i det här scenariot används ett utökat EA-prefixnamn. Om en Kernel EA börjar med: "$Kernel.Purge.", om någon av följande USN-orsaker skrivs till USN-journalen, tar NTFS bort alla Kernel EA:er som finns i filen och som överensstämmer med den angivna namngivningssyntaxen.

  • USN_REASON_DATA_OVERWRITE
  • Datautökning USN_SKÄL
  • USN_REASON_DATA_TRUNCATION
  • USN_REASON_OMTOLKNINGSPUNKT_ÄNDRING

Den här borttagningen av kernel-EA:er lyckas även i situationer med lite minne.

Anmärkningar

Komponenter i användarläge kan inte manipulera kernel-EA:er. Kernel-EA:er kan finnas i samma fil som en vanlig EA.

Se även

FltQueryEaFile
FltSetEaFile
FSCTL_QUERY_USN_JOURNAL
FsRtlQueryKernelEaFileFsRtlSetKernelEaFile
ZwQueryEaFile
ZwSetEaFile