Udostępnij przez


Atrybuty rozszerzone jądra systemu

Począwszy od systemu Windows 8 system NTFS obsługuje atrybuty rozszerzone jądra (EAs jądra). Weryfikowanie podpisu obrazu jest kosztowną operacją. Przechowywanie informacji o tym, czy wcześniej zweryfikowany plik binarny uległ zmianie, zmniejsza liczbę sytuacji, w których plik ten musi przejść pełną weryfikację podpisu. Korzystanie z EA jądra z tego powodu zwiększa wydajność walidacji podpisu pliku obrazu.

EAs z prefiksem nazwy $Kernel można modyfikować tylko w trybie jądra. Każdy EA rozpoczynający się od tego ciągu jest uważany za jądrowy EA. Przed pobraniem niezbędnego numeru sekwencji aktualizacji (USN) należy najpierw wydać FSCTL_WRITE_USN_CLOSE_RECORD, aby zatwierdzić wszelkie oczekujące w pliku aktualizacje dziennika USN. W przeciwnym razie wartość FileUSN może ulec zmianie wkrótce po ustawieniu rozszerzonych atrybutów jądra.

Umowa EA jądra powinna zawierać co najmniej następujące informacje:

  • USN UsnJournalID

    • Pole UsnJournalID jest identyfikatorem GUID, który określa aktualną wersję pliku USN Journal. Dziennik USN można usunąć i utworzyć w trybie użytkownika dla każdego woluminu. Za każdym razem, gdy jest tworzony dziennik USN, jest generowany nowy identyfikator GUID UsnJournalID . Za pomocą tego pola można sprawdzić, czy był okres, w którym dziennik USN został wyłączony i można ponownie potwierdzić jego ważność.
  • USN FileUSN

    • Wartość FileUSN zawiera identyfikator USN ostatniej zmiany wprowadzonej w pliku i jest śledzony wewnątrz rekordu tabeli plików głównych (MFT) dla danego pliku.
      • Po usunięciu dziennika USN nazwa FileUSN zostanie zresetowana do zera.

Te informacje, wraz z innymi danymi, które mogą być potrzebne w danym zastosowaniu, są następnie ustawiane w pliku jako atrybut rozszerzony jądra (Kernel EA).

Ustawianie rozszerzonego atrybutu jądra

Aby ustawić EA jądra, musi zaczynać się od prefiksu "$Kernel.", po którym następuje prawidłowy ciąg nazwy EA.

Próba ustawienia rozszerzonego atrybutu jądra z trybu użytkownika jest ignorowana bez powiadomienia. Żądanie zwraca STATUS_SUCCESS, ale nie wprowadzono żadnych rzeczywistych modyfikacji umowy EA.

Wywoływanie interfejsu API, takiego jak ZwSetEaFile lub FltSetEaFile w celu ustawienia EA jądra z poziomu trybu jądra nie jest wystarczające, ponieważ protokół SMB umożliwia ustawienie EA w całej sieci. Gdy żądanie ustawienia EA jest wysyłane przez protokół SMB, jest wystawiane z trybu jądra systemu na serwerze obsługującym żądanie SMB. Żądania oparte na sieci mogą niewłaściwie ustawić atrybuty rozszerzone jądra w lokalnym systemie.

Aby ustawić Kernel EA, obiekt wywołujący musi również ustawić wartość IRP_MN_KERNEL_CALL w polu MinorFunction pakietu żądania IRP (I/O request packet). Ponieważ jedynym sposobem ustawienia tego pola jest wygenerowanie niestandardowego IRP, procedura FsRtlSetKernelEaFile jest funkcją pomocniczą do konfigurowania atrybutu rozszerzonego jądra.

Począwszy od systemu Windows 10 w wersji 1803, EA użytkownika i EA jądra mogą być ze sobą mieszane. Ustawienie EA jądra nie generuje rekordu USN_REASON_EA_CHANGE w dzienniku USN. System generuje USN_REASON_EA_CHANGE, gdy są ustawione jakiekolwiek konta EA użytkownika.

Wykonywanie zapytań względem atrybutu rozszerzonego

Wykonywanie zapytań dotyczących EAs w pliku z trybu użytkownika zwraca zarówno normalne, jak i jądrowe EAs. Są one zwracane do trybu użytkownika, aby zminimalizować wszelkie problemy ze zgodnością aplikacji. Normalne operacje ZwQueryEaFile i FltQueryEaFile zwracają zarówno normalne, jak i jądrowe EA z trybu użytkownika i trybu jądra.

Jeśli jest dostępny tylko obiekt FileObject , użycie fsRtlQueryKernelEaFile może być wygodniejsze do wykonywania zapytań dotyczących EA jądra z trybu jądra.

Pobieranie informacji o dzienniku sekwencji numerów aktualizacji

Operacja FSCTL_QUERY_USN_JOURNAL wymaga SE_MANAGE_VOLUME_PRIVILEGE, nawet gdy jest wykonywana z trybu jądra, chyba że wartość IRP_MN_KERNEL_CALL była ustawiona w polu MinorFunction protokołu IRP. Procedura FsRtlKernelFsControlFile łatwo pozwala składnikom trybu jądra na wystawianie tego żądania USN.

NUTA Począwszy od systemu Windows 10 w wersji 1703 i nowszej, ta operacja nie wymaga już SE_MANAGE_VOLUME_PRIVILEGE.

Automatyczne usuwanie atrybutów rozszerzonych jądra

Wykonanie ponownego skanowania pliku tylko dlatego, że zmienił się identyfikator USN, może być kosztowne, ponieważ istnieje wiele nieszkodliwych powodów, dla których aktualizacja USN mogła zostać zastosowana do pliku. Aby uniknąć niepotrzebnego ponownego skanowania, funkcja automatycznego usunięcia EA jądra została dodana do systemu plików NTFS.

Ponieważ w tym scenariuszu nie wszystkie rozszerzone atrybuty (EA) jądra mogą być usuwane, używana jest przedłużona nazwa prefiksu EA. Jeśli wpis EA jądra zaczyna się od: "$Kernel.Purge.", to jeśli którykolwiek z następujących powodów USN zostanie zapisany w dzienniku USN, NTFS usuwa wszystkie EA jądra istniejące w tym pliku, które są zgodne z daną składnią nazewnictwa.

  • USN_REASON_DATA_OVERWRITE
  • USN_REASON_DATA_EXTEND
  • USN_REASON_DATA_TRUNCATION
  • USN_REASON_ZMIANA_PUNKTU_PONOWNEGO_PARSE'OWANIA

Usunięcie rozszerzonych atrybutów jądra przebiegło pomyślnie nawet w przypadku niskiego poziomu pamięci.

Uwagi

Składniki trybu użytkownika nie mogą manipulować rozszerzonymi atrybutami jądra. EA systemu może istnieć w tym samym pliku co zwykłe EA.

Zobacz też

FltQueryEaFile
FltSetEaFile
FSCTL_QUERY_USN_JOURNAL
FsRtlQueryKernelEaFileFsRtlSetKernelEaFile
ZwQueryEaFile
ZwSetEaFile