커널 확장 특성
Windows 8부터 NTFS는 커널 EA(커널 확장 특성)를 지원합니다. 이미지의 서명을 확인하는 것은 비용이 많이 드는 작업입니다. 이전에 유효성이 검사된 이진 파일이 변경되었는지 여부에 대한 정보를 저장하면 이미지가 전체 서명 검사를 받아야 하는 인스턴스 수가 줄어듭니다. 이러한 이유로 커널 EA를 사용하면 이미지 파일 서명 유효성 검사의 성능이 향상됩니다.
이름 접두 $Kernel
사를 가진 EA는 커널 모드에서만 수정할 수 있습니다. 이 문자열로 시작하는 모든 EA는 커널 EA로 간주됩니다. 필요한 USN(업데이트 시퀀스 번호)을 검색하기 전에 먼저 FSCTL_WRITE_USN_CLOSE_RECORD 발급하여 이전에 발생했을 수 있는 파일에서 보류 중인 USN 저널 업데이트를 커밋하는 것이 좋습니다. 그렇지 않으면 커널 EA를 설정한 직후 FileUSN 값이 변경 될 수 있습니다.
커널 EA에는 적어도 다음 정보가 포함되어 있는 것이 좋습니다.
USN UsnJournalID
- UsnJournalID 필드는 USN 저널 파일의 현재 화신을 식별하는 GUID입니다. USN 저널은 볼륨당 사용자 모드에서 삭제하고 만들 수 있습니다. USN 저널이 만들어질 때마다 새 UsnJournalID GUID가 생성됩니다. 이 필드를 사용하면 USN 저널이 비활성화되어 유효성을 다시 검사할 수 있는 기간이 있었는지 확인할 수 있습니다.
- 이 값은 FSCTL_QUERY_USN_JOURNAL 사용하여 검색할 수 있습니다.
- UsnJournalID 필드는 USN 저널 파일의 현재 화신을 식별하는 GUID입니다. USN 저널은 볼륨당 사용자 모드에서 삭제하고 만들 수 있습니다. USN 저널이 만들어질 때마다 새 UsnJournalID GUID가 생성됩니다. 이 필드를 사용하면 USN 저널이 비활성화되어 유효성을 다시 검사할 수 있는 기간이 있었는지 확인할 수 있습니다.
USN FileUSN
- FileUSN 값은 파일에 대해 마지막으로 변경된 USN ID를 포함하며 지정된 파일에 대한 MFT(마스터 파일 테이블) 레코드 내에서 추적됩니다.
- USN 저널이 삭제 되면 FileUSN 이 0으로 다시 설정됩니다.
- FileUSN 값은 파일에 대해 마지막으로 변경된 USN ID를 포함하며 지정된 파일에 대한 MFT(마스터 파일 테이블) 레코드 내에서 추적됩니다.
이 정보는 지정된 사용량과 함께 파일에 커널 EA로 설정됩니다.
커널 확장 특성 설정
커널 EA를 설정하려면 접두 "$Kernel."
사 뒤에 유효한 EA 이름 문자열로 시작해야 합니다. 사용자 모드에서 커널 EA를 설정하려는 시도는 자동으로 무시됩니다. 요청은 STATUS_SUCCESS 반환하지만 실제 EA 수정은 이루어지지 않습니다. SMB는 네트워크를 통해 EA 설정을 지원하고 해당 요청은 서버의 커널 모드에서 발급되기 때문에 ZwSetEaFile 또는 FltSetEaFile과 같은 API를 호출하여 커널 모드에서 커널 EA를 설정하는 것으로는 충분하지 않습니다.
커널 EA를 설정하려면 호출자는 IRP(I/O 요청 패킷)의 MinorFunction 필드에서도 IRP_MN_KERNEL_CALL 값을 설정해야 합니다. 이 필드를 설정하는 유일한 방법은 사용자 지정 IRP를 생성하는 것뿐이므로 FsRtl 패키지에서 커널 EA를 설정하는 지원 함수로 루틴 FsRtlSetKernelEaFile 을 내보냅니다.
Windows 10 버전 1803부터 사용자 EA 및 커널 EA를 섞을 수 있습니다. 커널 EA를 설정해도 USN 저널에 USN_REASON_EA_CHANGE 레코드가 생성되지 않습니다. 시스템은 모든 사용자 EA가 설정되면 USN_REASON_EA_CHANGE 생성합니다.
확장 특성 쿼리
사용자 모드에서 파일의 EA를 쿼리하면 일반 EAS와 커널 EA가 모두 반환됩니다. 애플리케이션 호환성 문제를 최소화하기 위해 사용자 모드로 돌아갑니다. 일반 ZwQueryEaFile 및 FltQueryEaFile 작업은 사용자 모드와 커널 모드 모두에서 일반 및 커널 EA를 모두 반환합니다.
FileObject만 사용할 수 있는 경우 FsRtlQueryKernelEaFile을 사용하면 커널 모드에서 커널 EA를 쿼리하는 데 더 편리할 수 있습니다.
업데이트 시퀀스 번호 저널 정보 쿼리
FSCTL_QUERY_USN_JOURNAL 작업은 IRP_MN_KERNEL_CALL 값이 IRP의 MinorFunction 필드에 설정되지 않은 한 커널 모드에서 발급된 경우에도 SE_MANAGE_VOLUME_PRIVILEGE 필요합니다. 커널 모드 구성 요소가 이 USN 요청을 쉽게 발급할 수 있도록 일상적인 FsRtlKernelFsControlFile 이 커널의 FsRtl 패키지에서 내보내졌습니다.
참고 Windows 10 버전 1703 이상부터 이 작업에는 더 이상 SE_MANAGE_VOLUME_PRIVILEGE 필요하지 않습니다.
커널 확장 특성 자동 삭제
USN 업데이트가 파일에 게시될 수 있는 많은 무해한 이유가 있기 때문에 변경된 파일의 USN ID는 비용이 많이 들 수 있으므로 파일을 다시 검색하기만 하면 됩니다. 이를 간소화하기 위해 커널 EAs 기능의 자동 삭제가 NTFS에 추가되었습니다.
이 시나리오에서 모든 커널 EA를 삭제하려는 것은 아니므로 확장된 EA 접두사 이름이 사용됩니다. 커널 EA로 시작하는 경우: "$Kernel.Purge."
다음 USN 이유 중 어느 것이 USN 저널에 기록되면 NTFS는 지정된 명명 구문을 준수하는 해당 파일에 있는 모든 커널 EA를 삭제합니다.
- USN_REASON_DATA_OVERWRITE
- USN_REASON_DATA_EXTEND
- USN_REASON_DATA_TRUNCATION
- USN_REASON_REPARSE_POINT_CHANGE
커널 EA의 이 삭제는 메모리 부족 상황에서도 성공합니다.
설명
사용자 모드 구성 요소는 커널 EA를 변조할 수 없습니다. 커널 EA는 일반 EA와 동일한 파일에 있을 수 있습니다.
참고 항목
FltQueryEaFile
FltSetEaFile
FSCTL_QUERY_USN_JOURNAL
FsRtlQueryKernelEaFileFsRtlSetKernelEaFile
ZwQueryEaFile
ZwSetEaFile