Win32 API 日本語リファレンス
ホームSystem.Ioctl › READ_USN_JOURNAL_DATA_V1

READ_USN_JOURNAL_DATA_V1

構造体
サイズx64: 48 バイト / x86: 48 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
StartUsnLONGLONG8+0+0

変更ジャーナルの読み取りを開始する USN です。

ジャーナルの最初のレコードから読み取り操作を開始するには、StartUsn メンバーに 0 を設定します。すべてのジャーナル レコードには USN が含まれているため、実際にどのレコードから読み取り操作が開始されたかは出力バッファーで確認できます。

特定のレコードから読み取り操作を開始するには、そのレコードの USN を StartUsn に設定します。

変更ジャーナル内の最初の USN よりも小さい 0 以外の USN を指定した場合はエラーが発生し、ERROR_JOURNAL_ENTRY_DELETED エラー コードが返されます。このコードは、指定された USN がかつては有効であったものの、その後削除された場合を示していることがあります。

READ_USN_JOURNAL_DATA_V0 で返される変更ジャーナル バッファーの走査について詳しくは、Walking a Buffer of Change Journal Records を参照してください。

ReasonMaskDWORD4+8+8

フラグのマスクです。各フラグは、ファイルまたはディレクトリに対する変更ジャーナル レコードが存在する変更内容を示します。FSCTL_READ_USN_JOURNAL 操作で返されるためには、変更ジャーナル レコードにこれらのフラグの少なくとも 1 つが設定されている必要があります。

有効なフラグは次のとおりです。未使用のビットは予約済みです。

意味
USN_REASON_BASIC_INFO_CHANGE
0x00008000
ユーザーが 1 つ以上のファイルまたはディレクトリの属性 (読み取り専用、隠し、システム、アーカイブ、スパースなどの属性)、または 1 つ以上のタイム スタンプを変更しました。
USN_REASON_CLOSE
0x80000000
ファイルまたはディレクトリが閉じられました。
USN_REASON_COMPRESSION_CHANGE
0x00020000
ファイルまたはディレクトリの圧縮状態が、圧縮状態に変更されたか、圧縮状態から変更されました。
USN_REASON_DATA_EXTEND
0x00000002
ファイルまたはディレクトリにデータが追加されました。
USN_REASON_DATA_OVERWRITE
0x00000001
ファイルまたはディレクトリ内のデータが上書きされました。
USN_REASON_DATA_TRUNCATION
0x00000004
ファイルまたはディレクトリが切り詰められました。
USN_REASON_EA_CHANGE
0x00000400
ユーザーがファイルまたはディレクトリの拡張属性を変更しました。これらの NTFS ファイル システム属性は、Windows ベースのアプリケーションからはアクセスできません。
USN_REASON_ENCRYPTION_CHANGE
0x00040000
ファイルまたはディレクトリが暗号化または復号化されました。
USN_REASON_FILE_CREATE
0x00000100
ファイルまたはディレクトリが初めて作成されました。
USN_REASON_FILE_DELETE
0x00000200
ファイルまたはディレクトリが削除されました。
USN_REASON_HARD_LINK_CHANGE
0x00010000
ファイルまたはディレクトリに対して NTFS ファイル システムのハード リンクが追加または削除されました。NTFS ファイル システムのハード リンクは POSIX のハード リンクに似ており、同一のファイルまたはディレクトリを参照する複数のディレクトリ エントリの 1 つです。
USN_REASON_INDEXABLE_CHANGE
0x00004000
ユーザーが FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 属性を変更しました。つまり、コンテンツのインデックスを作成できるファイルまたはディレクトリからできないものへ、またはその逆へ変更しました。(コンテンツのインデックス作成では、選択されたコンテンツのデータベースを構築することで、データの高速な検索が可能になります。)
USN_REASON_NAMED_DATA_EXTEND
0x00000020
ファイルの 1 つ以上の名前付きデータ ストリームにデータが追加されました。
USN_REASON_NAMED_DATA_OVERWRITE
0x00000010
ファイルの 1 つ以上の名前付きデータ ストリーム内のデータが上書きされました。
USN_REASON_NAMED_DATA_TRUNCATION
0x00000040
ファイルの 1 つ以上の名前付きデータ ストリームが切り詰められました。
USN_REASON_OBJECT_ID_CHANGE
0x00080000
ファイルまたはディレクトリのオブジェクト識別子が変更されました。
USN_REASON_RENAME_NEW_NAME
0x00002000
ファイルまたはディレクトリの名前が変更され、このジャーナル レコードを保持する USN_RECORD_V2 または USN_RECORD_V3 構造体内のファイル名が新しい名前です。
USN_REASON_RENAME_OLD_NAME
0x00001000
ファイルまたはディレクトリの名前が変更され、このジャーナル レコードを保持する USN_RECORD_V2 または USN_RECORD_V3 構造体内のファイル名が変更前の名前です。
USN_REASON_REPARSE_POINT_CHANGE
0x00100000
ファイルまたはディレクトリに含まれる再解析ポイントが変更されたか、ファイルまたはディレクトリに再解析ポイントが追加または削除されました。
USN_REASON_SECURITY_CHANGE
0x00000800
ファイルまたはディレクトリへのアクセス許可が変更されました。
USN_REASON_STREAM_CHANGE
0x00200000
ファイルまたはディレクトリに名前付きストリームが追加または削除されたか、名前付きストリームの名前が変更されました。
ReturnOnlyOnCloseDWORD4+12+12

変更ジャーナル レコードをいつ返すかを指定する値です。

変更が発生した時点ではなく、変更されたファイルまたはディレクトリの最後のハンドルが閉じられた時点で通知を受け取るには、ReturnOnlyOnClose に 0 以外の任意の値を設定し、ReasonMask メンバーに USN_REASON_CLOSE フラグを指定します。

ReasonMask のフラグが示すすべての変更は、最終的にファイルが閉じられた時点で変更ジャーナル ソフトウェアの呼び出しを生成します。DeviceIoControl の呼び出しがファイルが閉じられるのを待機している場合、その呼び出しによって DeviceIoControl の呼び出しが戻れるようになります。ボリュームの障害、オペレーティング システムの障害、またはシャットダウンの前にファイルまたはディレクトリが閉じられなかった場合は、次にそのボリュームがマウントされたときに変更ジャーナル ソフトウェアへのクリーンアップ呼び出しが発生します。この呼び出しは、途中でシステムが再起動された場合でも発生します。

各変更が最初にログに記録された時点とクリーンアップ時の両方で通知を受け取るには、ReturnOnlyOnClose に 0 を設定します。

ReturnOnlyOnClose が 0 であるか 0 以外であるかにかかわらず、クリーンアップ時に生成されるレコードには、そのファイルまたはディレクトリに発生した USN 変更のすべての理由が変更ジャーナル内に記録されます。項目に対する最後のクローズ操作が行われるたびに、USN クローズ レコードが変更ジャーナルに書き込まれ、その項目の ReasonMask フラグはすべてリセットされます。

ユーザー データが存在しないファイルまたはディレクトリ (マウントされたフォルダーなど) の場合、最後のクローズ操作は、その項目に対する最後のユーザー ハンドルに対して CloseHandle 関数が呼び出されたときに発生します。

TimeoutULONGLONG8+16+16

BytesToWaitFor メンバーと組み合わせて使用するタイムアウト値 (秒単位) で、FSCTL_READ_USN_JOURNAL 操作が変更ジャーナルに存在する以上のデータを要求した場合の動作をオペレーティング システムに指示します。

Timeout が 0 で BytesToWaitFor が 0 以外の場合に、FSCTL_READ_USN_JOURNAL 操作の呼び出しが返すべきデータを見つけられないまま変更ジャーナルの末尾に達すると、FSCTL_READ_USN_JOURNAL はフィルター処理されていないデータが BytesToWaitFor バイト分だけ変更ジャーナルに追加されるまで待機してから、指定されたレコードを取得します。

Timeout が 0 以外で BytesToWaitFor も 0 以外の場合に、FSCTL_READ_USN_JOURNAL 操作の呼び出しが返すべきデータを見つけられないまま変更ジャーナルの末尾に達すると、FSCTL_READ_USN_JOURNALTimeout 秒間待機してから、指定されたレコードを返そうとします。Timeout 秒の経過後、FSCTL_READ_USN_JOURNAL は指定された範囲内で利用可能なレコードを取得します。

いずれの場合も、タイムアウト期間の経過後に変更ジャーナルへ新たに追加されたデータが処理されます。指定されたセットから返すレコードがまだ存在しない場合は、タイムアウト期間が繰り返されます。このモードでは、FSCTL_READ_USN_JOURNAL は、少なくとも 1 つのレコードが返されるか、I/O がキャンセルされるまで未完了のままになります。

BytesToWaitFor が 0 の場合、Timeout は無視されます。また、非同期で開かれたハンドルに対しても Timeout は無視されます。

BytesToWaitForULONGLONG8+24+24

変更ジャーナルに追加された、フィルター処理されていないデータのバイト数です。この値を Timeout と組み合わせて使用し、FSCTL_READ_USN_JOURNAL 操作が変更ジャーナルに存在する以上のデータを要求した場合の動作をオペレーティング システムに指示します。

BytesToWaitFor が 0 の場合、Timeout は無視されます。この場合、FSCTL_READ_USN_JOURNAL 操作は、変更ジャーナル ファイルの末尾に達したときに常に正常に戻ります。また、次の FSCTL_READ_USN_JOURNAL 操作で使用すべき USN も取得します。返された次の USN が指定した StartUsn と同じ場合、利用可能なレコードはありません。呼び出し元プロセスは、すぐに FSCTL_READ_USN_JOURNAL を再度使用すべきではありません。

BytesToWaitFor が 0 の場合は返されるデータ量を予測できないため、出力バッファーがオーバーフローするおそれがあります。このリスクを減らすには、変更ジャーナル内のすべてのレコードを取り尽くすまで、FSCTL_READ_USN_JOURNAL 操作を繰り返す際に BytesToWaitFor に 0 以外の値を指定します。その後、新しいレコードを待機するために 0 を指定します。

あるいは、FSCTL_READ_USN_JOURNAL 操作の呼び出しにおける DeviceIoControllpBytesReturned パラメーターを使用して利用可能なデータ量を判断し、(新しいレコード用の余裕を持たせて) 出力バッファーを再割り当てしてから、DeviceIoControl を再度呼び出します。

UsnJournalIDULONGLONG8+32+32

そのボリュームで現在有効なジャーナル インスタンスの識別子です。

変更ジャーナルが停止して再開された場合や、削除されて再作成された場合、NTFS ファイル システムは変更ジャーナルへのイベントの記録を取りこぼすことがあります。これらのいずれかが発生すると、NTFS ファイル システムはジャーナルに新しい識別子を割り当てます。ジャーナル識別子が現在のジャーナル識別子と一致しない場合、DeviceIoControl の呼び出しは失敗し、適切なエラー コードを返します。新しいジャーナル識別子を取得するには、FSCTL_QUERY_USN_JOURNAL 操作を指定して DeviceIoControl を呼び出します。

MinMajorVersionWORD2+40+40受け入れ可能なUSNレコードの最小メジャーバージョン。
MaxMajorVersionWORD2+42+42受け入れ可能なUSNレコードの最大メジャーバージョン。

公式ドキュメント

呼び出し元プロセスに返す更新シーケンス番号 (USN) 変更ジャーナル レコードのセットを定義する情報を格納します。この構造体は FSCTL_QUERY_USN_JOURNAL および FSCTL_READ_USN_JOURNAL 制御コードで使用されます。Windows 8 および Windows Server 2012 より前では、この構造体は READ_USN_JOURNAL_DATA という名前でした。古い SDK やコンパイラーでコンパイルする場合は、その名前を使用してください。Windows Server 2012 では、ReFS で使用される 128 ビットのファイル識別子をサポートするために READ_USN_JOURNAL_DATA_V1 が導入されました。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// READ_USN_JOURNAL_DATA_V1  (x64 48 / x86 48 バイト)
typedef struct READ_USN_JOURNAL_DATA_V1 {
    LONGLONG StartUsn;
    DWORD ReasonMask;
    DWORD ReturnOnlyOnClose;
    ULONGLONG Timeout;
    ULONGLONG BytesToWaitFor;
    ULONGLONG UsnJournalID;
    WORD MinMajorVersion;
    WORD MaxMajorVersion;
} READ_USN_JOURNAL_DATA_V1;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct READ_USN_JOURNAL_DATA_V1
{
    public long StartUsn;
    public uint ReasonMask;
    public uint ReturnOnlyOnClose;
    public ulong Timeout;
    public ulong BytesToWaitFor;
    public ulong UsnJournalID;
    public ushort MinMajorVersion;
    public ushort MaxMajorVersion;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure READ_USN_JOURNAL_DATA_V1
    Public StartUsn As Long
    Public ReasonMask As UInteger
    Public ReturnOnlyOnClose As UInteger
    Public Timeout As ULong
    Public BytesToWaitFor As ULong
    Public UsnJournalID As ULong
    Public MinMajorVersion As UShort
    Public MaxMajorVersion As UShort
End Structure
import ctypes
from ctypes import wintypes

class READ_USN_JOURNAL_DATA_V1(ctypes.Structure):
    _fields_ = [
        ("StartUsn", ctypes.c_longlong),
        ("ReasonMask", wintypes.DWORD),
        ("ReturnOnlyOnClose", wintypes.DWORD),
        ("Timeout", ctypes.c_ulonglong),
        ("BytesToWaitFor", ctypes.c_ulonglong),
        ("UsnJournalID", ctypes.c_ulonglong),
        ("MinMajorVersion", ctypes.c_ushort),
        ("MaxMajorVersion", ctypes.c_ushort),
    ]
#[repr(C)]
pub struct READ_USN_JOURNAL_DATA_V1 {
    pub StartUsn: i64,
    pub ReasonMask: u32,
    pub ReturnOnlyOnClose: u32,
    pub Timeout: u64,
    pub BytesToWaitFor: u64,
    pub UsnJournalID: u64,
    pub MinMajorVersion: u16,
    pub MaxMajorVersion: u16,
}
import "golang.org/x/sys/windows"

type READ_USN_JOURNAL_DATA_V1 struct {
	StartUsn int64
	ReasonMask uint32
	ReturnOnlyOnClose uint32
	Timeout uint64
	BytesToWaitFor uint64
	UsnJournalID uint64
	MinMajorVersion uint16
	MaxMajorVersion uint16
}
type
  READ_USN_JOURNAL_DATA_V1 = record
    StartUsn: Int64;
    ReasonMask: DWORD;
    ReturnOnlyOnClose: DWORD;
    Timeout: UInt64;
    BytesToWaitFor: UInt64;
    UsnJournalID: UInt64;
    MinMajorVersion: Word;
    MaxMajorVersion: Word;
  end;
const READ_USN_JOURNAL_DATA_V1 = extern struct {
    StartUsn: i64,
    ReasonMask: u32,
    ReturnOnlyOnClose: u32,
    Timeout: u64,
    BytesToWaitFor: u64,
    UsnJournalID: u64,
    MinMajorVersion: u16,
    MaxMajorVersion: u16,
};
type
  READ_USN_JOURNAL_DATA_V1 {.bycopy.} = object
    StartUsn: int64
    ReasonMask: uint32
    ReturnOnlyOnClose: uint32
    Timeout: uint64
    BytesToWaitFor: uint64
    UsnJournalID: uint64
    MinMajorVersion: uint16
    MaxMajorVersion: uint16
struct READ_USN_JOURNAL_DATA_V1
{
    long StartUsn;
    uint ReasonMask;
    uint ReturnOnlyOnClose;
    ulong Timeout;
    ulong BytesToWaitFor;
    ulong UsnJournalID;
    ushort MinMajorVersion;
    ushort MaxMajorVersion;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; READ_USN_JOURNAL_DATA_V1 サイズ: 48 バイト(x64)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; StartUsn : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; ReasonMask : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; ReturnOnlyOnClose : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; Timeout : ULONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; BytesToWaitFor : ULONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; UsnJournalID : ULONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; MinMajorVersion : WORD (+40, 2byte)  wpoke st,40,値  /  値 = wpeek(st,40)
; MaxMajorVersion : WORD (+42, 2byte)  wpoke st,42,値  /  値 = wpeek(st,42)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global READ_USN_JOURNAL_DATA_V1
    #field int64 StartUsn
    #field int ReasonMask
    #field int ReturnOnlyOnClose
    #field int64 Timeout
    #field int64 BytesToWaitFor
    #field int64 UsnJournalID
    #field short MinMajorVersion
    #field short MaxMajorVersion
#endstruct

stdim st, READ_USN_JOURNAL_DATA_V1        ; NSTRUCT 変数を確保
st->StartUsn = 100
mes "StartUsn=" + st->StartUsn