次の方法で共有


カーネル拡張属性

Windows 8 以降、NTFS ではカーネル拡張属性 (カーネル CA) がサポートされています。 イメージの署名の検証は、コストのかかる操作です。 以前に検証されたバイナリが変更されたかどうかに関する情報を格納すると、イメージが完全な署名チェックを受ける必要があるインスタンスの数が減ります。 このため、カーネル EA を使用すると、イメージ ファイル署名の検証のパフォーマンスが向上します。

名前プレフィックス $Kernel を持つ EA は、カーネル モードからのみ変更できます。 この文字列で始まる EA は、カーネル EA と見なされます。 必要な更新シーケンス番号 (USN) を取得する前に、まず保留中の USN ジャーナルの更新をファイルにコミットするために FSCTL_WRITE_USN_CLOSE_RECORD を発行する必要があります。 それ以外の場合、カーネル EA を設定した直後に FileUSN 値が変更される可能性があります。

カーネル EA には、少なくとも次の情報が含まれている必要があります。

  • USN UsnJournalID

    • UsnJournalID フィールドは、USN ジャーナル ファイルの現在の化身を識別する GUID です。 USN ジャーナルは、ボリュームごとにユーザー モードから削除および作成できます。 USN ジャーナルが作成されるたびに、新しい UsnJournalID GUID が生成されます。 このフィールドを使用すると、USN ジャーナルが無効にされ、再検証できる期間があったかどうかを確認できます。
  • USNファイルUSN

    • FileUSN 値には、ファイルに対して行われた最後の変更の USN ID が含まれ、指定されたファイルのマスター ファイル テーブル (MFT) レコード内で追跡されます。
      • USN ジャーナルが削除されると、 FileUSN は 0 にリセットされます。

この情報は、特定の使用に必要なその他の情報と共に、カーネル EA としてファイルに設定されます。

カーネル拡張属性の設定

カーネル EA を設定するには、プレフィックス "$Kernel." の後に有効な EA 名文字列が続く必要があります。

ユーザー モードからカーネル EA を設定しようとすると、自動的に無視されます。 要求は STATUS_SUCCESS を返しますが、実際の EA の変更は行われません。

SMB ではネットワーク経由で EA を設定できるため、 ZwSetEaFileFltSetEaFile などの API を呼び出してカーネル EA をカーネル モードから設定するだけでは不十分です。 EA を設定する要求が SMB を介して送信されると、SMB 要求を処理するサーバー上のカーネル モードから発行されます。 ネットワークベースの要求により、カーネル EA がローカルで不適切に設定される可能性があります。

カーネル EA を設定するには、呼び出し元も IRP (I/O 要求パケット) の MinorFunction フィールドに IRP_MN_KERNEL_CALL 値を設定する必要があります。 このフィールドを設定する唯一の方法はカスタム IRP を生成することであるため、ルーチン FsRtlSetKernelEaFile はカーネル EA を設定するサポート関数です。

Windows 10 バージョン 1803 以降では、ユーザーの EA とカーネルの EA を混在させることができます。 カーネル EA を設定しても、USN Journal にUSN_REASON_EA_CHANGEレコードは生成されません。 システムは、ユーザーの拡張属性 (EA) が設定されたときに USN_REASON_EA_CHANGE を生成します。

拡張属性のクエリ

ユーザー モードからファイルに対して EA のクエリを実行すると、通常とカーネルの両方の CA が返されます。 アプリケーションの互換性の問題を最小限に抑えるために、ユーザー モードに戻されます。 通常の ZwQueryEaFile 操作と FltQueryEaFile 操作は、ユーザー モードとカーネル モードの両方から通常の EA とカーネルの両方の EA を返します。

FileObject しか利用できない場合、カーネルモードからカーネル拡張属性 (EAs) を照会するには、FsRtlQueryKernelEaFile を使用する方がより便利かもしれません。

更新シーケンス番号のジャーナル情報のクエリ

FSCTL_QUERY_USN_JOURNAL操作では、IRP の MinorFunction フィールドにIRP_MN_KERNEL_CALL値が設定されていない限り、カーネル モードから発行された場合でも、SE_MANAGE_VOLUME_PRIVILEGEが必要です。 ルーチン FsRtlKernelFsControlFile を使用すると、カーネル モード コンポーネントでこの USN 要求を簡単に発行できます。

手記 Windows 10 バージョン 1703 以降では、この操作でSE_MANAGE_VOLUME_PRIVILEGEは不要になります。

カーネル拡張属性の自動削除

ファイルのUSN IDが変更されたために単純にファイルを再スキャンするのは、費用がかかる場合があります。なぜなら、USNの更新がファイルに行われるのには、多くの無害な理由が存在するからです。 不要な再スキャンを回避するために、カーネル CA を自動削除する機能が 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