READ_USN_JOURNAL_DATA_V0
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| StartUsn | LONGLONG | 8 | +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 を参照してください。 | ||||||||||||||||||||||||||||||||||||||||||||
| ReasonMask | DWORD | 4 | +8 | +8 | フラグのマスクです。各フラグは、ファイルまたはディレクトリが変更ジャーナルにレコードを持つ変更内容を示します。FSCTL_READ_USN_JOURNAL 操作で返されるには、変更ジャーナル レコードにこれらのフラグの少なくとも 1 つが設定されている必要があります。 有効なフラグは次のとおりです。未使用のビットは予約済みです。
| ||||||||||||||||||||||||||||||||||||||||||||
| ReturnOnlyOnClose | DWORD | 4 | +12 | +12 | 変更ジャーナル レコードをいつ返すかを指定する値です。 変更が発生した時点ではなく、変更されたファイルまたはディレクトリの最後のハンドルが閉じられた時点で通知を受け取るには、ReturnOnlyOnClose に 0 以外の値を設定し、ReasonMask メンバーに USN_REASON_CLOSE フラグを指定します。 ReasonMask フラグで示されるすべての変更は、最終的にファイルが閉じられた時点で変更ジャーナル ソフトウェアへの呼び出しを発生させます。DeviceIoControl の呼び出しがファイルが閉じられるのを待機している場合、その呼び出しによって DeviceIoControl の呼び出しから制御が戻ります。ボリュームの障害、オペレーティング システムの障害、またはシャットダウンより前にファイルまたはディレクトリが閉じられなかった場合は、次回そのボリュームがマウントされたときに変更ジャーナル ソフトウェアへのクリーンアップ呼び出しが行われます。この呼び出しは、その間にシステムの再起動があった場合でも行われます。 各変更が最初に記録された時点とクリーンアップ時の両方で通知を受け取るには、ReturnOnlyOnClose に 0 を設定します。 ReturnOnlyOnClose が 0 であるか 0 以外であるかにかかわらず、クリーンアップ時に生成されるレコードには、そのファイルまたはディレクトリに発生した USN 変更のすべての理由が変更ジャーナル内に記録されます。項目に対して最後のクローズ操作が行われるたびに、USN クローズ レコードが変更ジャーナルに書き込まれ、その項目の ReasonMask フラグはすべてリセットされます。 ユーザー データが存在しないファイルまたはディレクトリ (マウントされたフォルダーなど) の場合、最後のクローズ操作は、その項目に対する最後のユーザー ハンドルに対して CloseHandle 関数が呼び出されたときに発生します。 | ||||||||||||||||||||||||||||||||||||||||||||
| Timeout | ULONGLONG | 8 | +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_JOURNAL は Timeout 秒間待機してから、指定されたレコードを返そうと試みます。Timeout 秒の経過後、FSCTL_READ_USN_JOURNAL は指定された範囲内で利用可能なレコードを取得します。 いずれの場合も、タイムアウト期間の経過後に変更ジャーナルへ新たに追加されたデータが処理されます。指定されたセットから返すレコードがまだ存在しない場合は、タイムアウト期間が繰り返されます。このモードでは、FSCTL_READ_USN_JOURNAL は少なくとも 1 つのレコードが返されるか、I/O が取り消されるまで未完了のまま保留されます。 BytesToWaitFor が 0 の場合、Timeout は無視されます。また、Timeout は非同期に開かれたハンドルの場合にも無視されます。 | ||||||||||||||||||||||||||||||||||||||||||||
| BytesToWaitFor | ULONGLONG | 8 | +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 操作の呼び出しで DeviceIoControl の lpBytesReturned パラメーターを使用して利用可能なデータ量を判断し、(新しいレコード用の余裕を持たせて) 出力バッファーを再割り当てしてから、再度 DeviceIoControl を呼び出します。 | ||||||||||||||||||||||||||||||||||||||||||||
| UsnJournalID | ULONGLONG | 8 | +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 公式リファレンス: 英語 (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 Structureimport 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: uint64struct 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