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

READ_USN_JOURNAL_DATA_V0

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

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

フィールド

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

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

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

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

変更ジャーナル内の最初の 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 操作を繰り返す際に 0 以外の BytesToWaitFor 値を指定します。その後、新しいレコードを待機するために 0 を指定します。

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

UsnJournalIDULONGLONG8+32+32

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

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

公式ドキュメント

呼び出し元プロセスに返す一連の更新シーケンス番号 (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_V0  (x64 40 / x86 40 バイト)
typedef struct READ_USN_JOURNAL_DATA_V0 {
    LONGLONG StartUsn;
    DWORD ReasonMask;
    DWORD ReturnOnlyOnClose;
    ULONGLONG Timeout;
    ULONGLONG BytesToWaitFor;
    ULONGLONG UsnJournalID;
} READ_USN_JOURNAL_DATA_V0;
using System;
using System.Runtime.InteropServices;

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

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

class READ_USN_JOURNAL_DATA_V0(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),
    ]
#[repr(C)]
pub struct READ_USN_JOURNAL_DATA_V0 {
    pub StartUsn: i64,
    pub ReasonMask: u32,
    pub ReturnOnlyOnClose: u32,
    pub Timeout: u64,
    pub BytesToWaitFor: u64,
    pub UsnJournalID: u64,
}
import "golang.org/x/sys/windows"

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

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_V0 サイズ: 40 バイト(x64)
dim st, 10    ; 4byte整数×10(構造体サイズ 40 / 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,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global READ_USN_JOURNAL_DATA_V0
    #field int64 StartUsn
    #field int ReasonMask
    #field int ReturnOnlyOnClose
    #field int64 Timeout
    #field int64 BytesToWaitFor
    #field int64 UsnJournalID
#endstruct

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