Win32 API 日本語リファレンス
ホームStorage.FileSystem › TXF_LOG_RECORD_WRITE

TXF_LOG_RECORD_WRITE

構造体
サイズx64: 68 バイト / x86: 68 バイトパッキング4

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

フィールド

フィールドサイズx64x86説明
VersionWORD2+0+0ログレコードのバージョン番号。
RecordTypeWORD2+2+2ログレコードの種類。書き込みレコードを示す。
RecordLengthDWORD4+4+4ログレコード全体のバイト長。
FlagsDWORD4+8+8書き込みに関するフラグ。
TxfFileIdTXF_ID16+12+12対象ファイルのTxFファイルID。
KtmGuidGUID16+28+28関連するKTMトランザクションのGUID。
ByteOffsetInFileLONGLONG8+44+44ファイル内の書き込み開始オフセット。バイト単位。
NumBytesWrittenDWORD4+52+52書き込まれたバイト数。
ByteOffsetInStructureDWORD4+56+56本構造体内のデータ部へのオフセット。バイト単位。
FileNameLengthDWORD4+60+60ファイル名のバイト長。
FileNameByteOffsetInStructureDWORD4+64+64本構造体内のファイル名へのオフセット。バイト単位。

各言語での定義

#include <windows.h>

// TXF_ID  (x64 16 / x86 16 バイト)
#pragma pack(push, 4)
typedef struct TXF_ID {
    _Anonymous_e__Struct Anonymous;
} TXF_ID;
#pragma pack(pop)

// TXF_LOG_RECORD_WRITE  (x64 68 / x86 68 バイト)
#pragma pack(push, 4)
typedef struct TXF_LOG_RECORD_WRITE {
    WORD Version;
    WORD RecordType;
    DWORD RecordLength;
    DWORD Flags;
    TXF_ID TxfFileId;
    GUID KtmGuid;
    LONGLONG ByteOffsetInFile;
    DWORD NumBytesWritten;
    DWORD ByteOffsetInStructure;
    DWORD FileNameLength;
    DWORD FileNameByteOffsetInStructure;
} TXF_LOG_RECORD_WRITE;
#pragma pack(pop)
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)]
public struct TXF_ID
{
    public _Anonymous_e__Struct Anonymous;
}

[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)]
public struct TXF_LOG_RECORD_WRITE
{
    public ushort Version;
    public ushort RecordType;
    public uint RecordLength;
    public uint Flags;
    public TXF_ID TxfFileId;
    public Guid KtmGuid;
    public long ByteOffsetInFile;
    public uint NumBytesWritten;
    public uint ByteOffsetInStructure;
    public uint FileNameLength;
    public uint FileNameByteOffsetInStructure;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, Pack:=4, CharSet:=CharSet.Unicode)>
Public Structure TXF_ID
    Public Anonymous As _Anonymous_e__Struct
End Structure

<StructLayout(LayoutKind.Sequential, Pack:=4, CharSet:=CharSet.Unicode)>
Public Structure TXF_LOG_RECORD_WRITE
    Public Version As UShort
    Public RecordType As UShort
    Public RecordLength As UInteger
    Public Flags As UInteger
    Public TxfFileId As TXF_ID
    Public KtmGuid As Guid
    Public ByteOffsetInFile As Long
    Public NumBytesWritten As UInteger
    Public ByteOffsetInStructure As UInteger
    Public FileNameLength As UInteger
    Public FileNameByteOffsetInStructure As UInteger
End Structure
import ctypes
from ctypes import wintypes

class TXF_ID(ctypes.Structure):
    _pack_ = 4
    _fields_ = [
        ("Anonymous", _Anonymous_e__Struct),
    ]

class TXF_LOG_RECORD_WRITE(ctypes.Structure):
    _pack_ = 4
    _fields_ = [
        ("Version", ctypes.c_ushort),
        ("RecordType", ctypes.c_ushort),
        ("RecordLength", wintypes.DWORD),
        ("Flags", wintypes.DWORD),
        ("TxfFileId", TXF_ID),
        ("KtmGuid", GUID),
        ("ByteOffsetInFile", ctypes.c_longlong),
        ("NumBytesWritten", wintypes.DWORD),
        ("ByteOffsetInStructure", wintypes.DWORD),
        ("FileNameLength", wintypes.DWORD),
        ("FileNameByteOffsetInStructure", wintypes.DWORD),
    ]
#[repr(C, packed(4))]
pub struct TXF_ID {
    pub Anonymous: _Anonymous_e__Struct,
}

#[repr(C, packed(4))]
pub struct TXF_LOG_RECORD_WRITE {
    pub Version: u16,
    pub RecordType: u16,
    pub RecordLength: u32,
    pub Flags: u32,
    pub TxfFileId: TXF_ID,
    pub KtmGuid: GUID,
    pub ByteOffsetInFile: i64,
    pub NumBytesWritten: u32,
    pub ByteOffsetInStructure: u32,
    pub FileNameLength: u32,
    pub FileNameByteOffsetInStructure: u32,
}
import "golang.org/x/sys/windows"

type TXF_ID struct {
	Anonymous _Anonymous_e__Struct
}

type TXF_LOG_RECORD_WRITE struct {
	Version uint16
	RecordType uint16
	RecordLength uint32
	Flags uint32
	TxfFileId TXF_ID
	KtmGuid windows.GUID
	ByteOffsetInFile int64
	NumBytesWritten uint32
	ByteOffsetInStructure uint32
	FileNameLength uint32
	FileNameByteOffsetInStructure uint32
}
type
  TXF_ID = packed record
    Anonymous: _Anonymous_e__Struct;
  end;

  TXF_LOG_RECORD_WRITE = packed record
    Version: Word;
    RecordType: Word;
    RecordLength: DWORD;
    Flags: DWORD;
    TxfFileId: TXF_ID;
    KtmGuid: TGUID;
    ByteOffsetInFile: Int64;
    NumBytesWritten: DWORD;
    ByteOffsetInStructure: DWORD;
    FileNameLength: DWORD;
    FileNameByteOffsetInStructure: DWORD;
  end;
const TXF_ID = extern struct {
    Anonymous: _Anonymous_e__Struct,
};

const TXF_LOG_RECORD_WRITE = extern struct {
    Version: u16,
    RecordType: u16,
    RecordLength: u32,
    Flags: u32,
    TxfFileId: TXF_ID,
    KtmGuid: GUID,
    ByteOffsetInFile: i64,
    NumBytesWritten: u32,
    ByteOffsetInStructure: u32,
    FileNameLength: u32,
    FileNameByteOffsetInStructure: u32,
};
type
  TXF_ID {.packed.} = object
    Anonymous: _Anonymous_e__Struct

  TXF_LOG_RECORD_WRITE {.packed.} = object
    Version: uint16
    RecordType: uint16
    RecordLength: uint32
    Flags: uint32
    TxfFileId: TXF_ID
    KtmGuid: GUID
    ByteOffsetInFile: int64
    NumBytesWritten: uint32
    ByteOffsetInStructure: uint32
    FileNameLength: uint32
    FileNameByteOffsetInStructure: uint32
align(4)
struct TXF_ID
{
    _Anonymous_e__Struct Anonymous;
}

align(4)
struct TXF_LOG_RECORD_WRITE
{
    ushort Version;
    ushort RecordType;
    uint RecordLength;
    uint Flags;
    TXF_ID TxfFileId;
    GUID KtmGuid;
    long ByteOffsetInFile;
    uint NumBytesWritten;
    uint ByteOffsetInStructure;
    uint FileNameLength;
    uint FileNameByteOffsetInStructure;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; TXF_LOG_RECORD_WRITE サイズ: 68 バイト(x64)
dim st, 17    ; 4byte整数×17(構造体サイズ 68 / 4 切り上げ)
; Version : WORD (+0, 2byte)  wpoke st,0,値  /  値 = wpeek(st,0)
; RecordType : WORD (+2, 2byte)  wpoke st,2,値  /  値 = wpeek(st,2)
; RecordLength : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; Flags : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; TxfFileId : TXF_ID (+12, 16byte)  varptr(st)+12 を基点に操作(16byte:入れ子/配列)
; KtmGuid : GUID (+28, 16byte)  varptr(st)+28 を基点に操作(16byte:入れ子/配列)
; ByteOffsetInFile : LONGLONG (+44, 8byte)  qpoke st,44,値 / qpeek(st,44)  ※IronHSPのみ。3.7/3.8は lpoke st,44,下位 : lpoke st,48,上位
; NumBytesWritten : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; ByteOffsetInStructure : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; FileNameLength : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; FileNameByteOffsetInStructure : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global TXF_ID, pack=4
    #field _Anonymous_e__Struct Anonymous
#endstruct

#defstruct global GUID, pack=1
    #field int Data1
    #field short Data2
    #field short Data3
    #field byte Data4 8
#endstruct

#defstruct global TXF_LOG_RECORD_WRITE, pack=4
    #field short Version
    #field short RecordType
    #field int RecordLength
    #field int Flags
    #field TXF_ID TxfFileId
    #field GUID KtmGuid
    #field int64 ByteOffsetInFile
    #field int NumBytesWritten
    #field int ByteOffsetInStructure
    #field int FileNameLength
    #field int FileNameByteOffsetInStructure
#endstruct

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