Condividi tramite


Attributi estesi del kernel

A partire da Windows 8, NTFS supporta gli attributi estesi del kernel (EA del kernel). La verifica della firma di un'immagine è un'operazione costosa. L'archiviazione di informazioni sull'eventuale modifica di un file binario convalidato in precedenza riduce il numero di istanze in cui un'immagine deve essere sottoposta a un controllo della firma completo. L'uso di EA del kernel per questo motivo aumenta le prestazioni della convalida della firma dei file di immagine.

Gli EA con il prefisso del nome $Kernel possono essere modificati solo dalla modalità kernel. Qualsiasi EA che inizia con questa stringa è considerato un EA di tipo Kernel. Prima di recuperare il numero di sequenza di aggiornamento necessario (USN), è necessario eseguire prima di tutto FSCTL_WRITE_USN_CLOSE_RECORD per eseguire il commit di eventuali aggiornamenti USN Journal in sospeso nel file. In caso contrario, il valore FileUSN potrebbe cambiare poco dopo l'impostazione del Kernel EA.

Un kernel EA deve contenere almeno le informazioni seguenti:

  • USN UsnJournalID

    • Il campo UsnJournalID è un GUID che identifica l'attuale incarnazione del file del journal USN. Il journal USN può essere eliminato e creato in modalità utente per ciascun volume. Ogni volta che viene creato un nuovo USN Journal, viene generato un GUID UsnJournalID. Con questo campo è possibile stabilire se c'è stato un periodo di tempo in cui il Journal USN è stato disabilitato e può essere riconvalidato.
  • USN FileUSN

    • Il valore FileUSN contiene l'ID USN dell'ultima modifica apportata al file e viene rilevato all'interno del record MFT (Master File Table) per il file specificato.
      • Quando il journal USN viene eliminato, FileUSN viene reimpostato su zero.

Queste informazioni, insieme a qualsiasi altra necessità d'uso specifico, vengono quindi impostate sul file come Kernel EA.

Impostazione di un attributo esteso del kernel

Per impostare un kernel EA, deve iniziare con il prefisso "$Kernel." seguito da una stringa del nome EA valida.

Un tentativo di impostare un kernel EA dalla modalità utente viene ignorato automaticamente. La richiesta restituisce STATUS_SUCCESS ma non viene apportata alcuna modifica EA effettiva.

La chiamata dell'API come ZwSetEaFile o FltSetEaFile per impostare un Kernel EA in modalità kernel non è sufficiente perché SMB consente l'impostazione di EA in rete. Quando una richiesta di impostazione di un Attributo Esteso passa attraverso SMB, è emesso in modalità kernel sul server che gestisce la richiesta SMB. Le richieste basate sulla rete potrebbero impostare in modo non appropriato un kernel EA in locale.

Per impostare un EA kernel, il chiamante deve anche impostare il valore IRP_MN_KERNEL_CALL nel campo MinorFunction del pacchetto di richiesta IRP (I/O request). Poiché l'unico modo per impostare questo campo consiste nel generare un IRP personalizzato, la routine FsRtlSetKernelEaFile è la funzione di supporto per configurare un kernel EA.

A partire da Windows 10 versione 1803, gli EA utente e gli EA del kernel possono essere mescolati. L'impostazione di un kernel EA non genera un record USN_REASON_EA_CHANGE nel registro USN. Il sistema genera USN_REASON_EA_CHANGE quando vengono impostati gli EA utente.

Esecuzione di query su un attributo esteso

Interrogare gli EA in un file dalla modalità utente restituisce sia gli EA normali che quelli del kernel. Vengono restituiti alla modalità utente per ridurre al minimo eventuali problemi di compatibilità delle applicazioni. Le normali operazioni ZwQueryEaFile e FltQueryEaFile restituiscono sia gli EA normali che i kernel dalle modalità utente e kernel.

Quando è disponibile solo un FileObject , l'uso di FsRtlQueryKernelEaFile potrebbe essere più utile eseguire una query per gli EA del kernel dalla modalità kernel.

Consultazione delle informazioni del registro sul numero di sequenza di aggiornamento

L'operazione FSCTL_QUERY_USN_JOURNAL richiede SE_MANAGE_VOLUME_PRIVILEGE anche quando viene eseguita in modalità kernel, a meno che il valore IRP_MN_KERNEL_CALL non sia stato impostato nel campo MinorFunction dell'IRP. La routine FsRtlKernelFsControlFile consente facilmente ai componenti in modalità kernel di inviare questa richiesta USN.

NOTA A partire da Windows 10, versione 1703 e successive, questa operazione non richiede più SE_MANAGE_VOLUME_PRIVILEGE.

Eliminazione automatica degli attributi estesi del kernel

Eseguire semplicemente il rescanning di un file perché l'ID USN è cambiato può risultare costoso, poiché ci sono molte ragioni innocue per cui un aggiornamento USN potrebbe essere applicato al file. Per evitare di eseguire nuovamente ri-scansioni non necessarie, è stata aggiunta una funzionalità per l'eliminazione automatica degli EAs del kernel su NTFS.

Poiché non tutti gli EA kernel potrebbero voler essere eliminati in questo scenario, viene usato un nome di prefisso EA esteso. Se un EA del kernel inizia con: "$Kernel.Purge.", allora se uno dei motivi USN seguenti viene scritto nel journal USN, NTFS elimina tutti gli EA del kernel presenti in tale file che rispettano la sintassi di denominazione specificata.

  • USN_RAGIONE_SOVRASCRITTURA_DATI
  • USN_REASON_DATA_EXTEND
  • Motivo_USN_Tagliodati
  • USN_REASON_REPARSE_POINT_CHANGE

Questa eliminazione di EA kernel ha esito positivo anche in situazioni di memoria insufficiente.

Osservazioni

I componenti in modalità utente non possono manomettere le EA del kernel. Gli EA del kernel possono esistere nello stesso file di una normale EA.

Vedere anche

FltQueryEaFile
FltSetEaFile
FSCTL_QUERY_USN_JOURNAL
FsRtlQueryKernelEaFileFsRtlSetKernelEaFile
ZwQueryEaFile
ZwSetEaFile