EVENT_TRACE_PROPERTIES
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Wnode | WNODE_HEADER | 48 | +0 | +0 | WNODE_HEADER 構造体です。BufferSize、Flags、Guid の各メンバーは必ず指定します。ClientContext メンバーは任意で指定できます。 |
| BufferSize | DWORD | 4 | +48 | +48 | 各イベント トレース セッション バッファーに割り当てられるメモリのキロバイト数です。最小のバッファー サイズは 4 (4KB)、最大のバッファー サイズは 16384 (16MB) です。ほとんどのトレース セッションでは、メモリとディスク領域の浪費を避けるために 64KB 以下のバッファー サイズを使用してください。Windows 8 より前: 最大のバッファー サイズは 1024 (1MB) です。 バッファー サイズを小さくすると、セッションのメモリ使用量が減り、ログ ファイルのサイズを抑えるのにも役立ちます。バッファー サイズを大きくすると、より大きなイベントを収集できます。ETW はバッファー境界をまたいでイベントを分割しないため、バッファー サイズより大きいイベントは収集できないからです。データ スループットが極めて高いシナリオでは、バッファー サイズを大きくすることで CPU オーバーヘッドを削減できる場合もあります。
メモ
バッファー サイズにかかわらず、ETW は 64KB を超えるイベントを収集できません。 ETW は特定のシナリオで、要求された BufferSize をより大きい値に調整することがあります。たとえば、トレース ファイルをディスクに書き込む場合、ETW はバッファー サイズをディスクの物理ブロック サイズの倍数に増やすことがあります。 重要
BufferSize はトレース セッションで最も重要なパラメーターの 1 つです。大きなバッファーは通常、メモリとディスク領域を浪費します。大きなバッファー (256KB 以上) を使用するトレース セッションは、診断調査やテストの場合にのみ使用し、実運用のトレースには使用しないでください。 ヒント
トレース セッションのメモリ使用量を制御する目的で BufferSize を使用しないでください。代わりに、セッションのイベント サイズとイベント レートに基づいてバッファー サイズを選択し、MinimumBuffers と MaximumBuffers のパラメーターでセッションのメモリ使用量を調整してください。 |
| MinimumBuffers | DWORD | 4 | +52 | +52 | トレース セッションのバッファー プール用に予約されるバッファーの最小数です。 ETW は特定のシナリオでこの値を調整することがあります。
イベント レートが中程度のファイル モードおよびリアルタイム トレースでは、ほとんどの場合、MinimumBuffers を 0 または小さな最小値 (4 や 8 など) に設定してメモリ使用量を最小限に抑え、プロセッサ数に基づいて ETW が値を引き上げられるようにしてください。ETW はトレースの開始時に、(調整後の) 最小数のバッファーを予約します。処理できる速度よりも速くバッファーが満たされる場合、ETW は MaximumBuffers で指定された数まで追加のバッファーを割り当てようとします。 バッファリング モード (メモリ内循環) のトレースでは、ETW にセッション用として予約させたいメモリの総量に応じて MinimumBuffers パラメーターを設定してください。これは通常、想定されるイベント レートと、トレースで記録したい時間の長さに基づいて算出します。たとえば、毎秒 16KB のデータ レートが想定され、少なくとも 60 秒分のデータを記録したい場合は、960KB が必要になります。バッファー サイズが 32KB であれば、MinimumBuffers に 30 を設定します (合計 960KB ÷ バッファーあたり 32KB = 30 個のバッファー)。ETW はトレースの開始時に、(調整後の) 最小数のバッファーを予約します。すべてのバッファーが満たされると、ETW は最も古い使用済みバッファーを新しいイベント用に再利用します。ETW は追加のバッファーを割り当てないことに注意してください (バッファリング モードのトレースでは、ETW は MaximumBuffers を無視します)。 |
| MaximumBuffers | DWORD | 4 | +56 | +56 | トレース セッションのバッファー プール用に割り当てられるバッファーの最大数です。 ETW は特定のシナリオでこの値を調整することがあります。
ほとんどの場合、まず MinimumBuffers と MaximumBuffers に同じ値を設定して、セッションの調整を始めてください。イベント レートのピーク時にトレースがイベントを取りこぼす場合は、MaximumBuffers の値を増やすとよいでしょう。 高い IRQL で実行されるドライバーによってイベントが生成される場合、ETW はオンデマンドでバッファーを割り当てることができません。トレース セッションで高 IRQL のカーネル モード プロバイダーからのイベントを記録する必要がある場合は、バッファーを事前に割り当てさせるために、MinimumBuffers により大きな値を使用する必要があるかもしれません。 メモ
バッファリング モードのセッション (ログ モードに |
| MaximumFileSize | DWORD | 4 | +60 | +60 | イベントの記録に使用されるファイルの最大サイズ (メガバイト単位) です。サイズの制限を設けない場合は 0 を指定します。通常、このメンバーは LogFileMode に ログ記録にシステム ドライブ (オペレーティング システムが格納されているドライブ) を使用している場合、最大ファイル サイズのパラメーターを使用しているかどうかにかかわらず、ETW は追加で 200MB のディスク空き容量を確認します。したがって、システム ドライブ上のトレース ファイルの最大サイズとして 100MB を指定する場合、そのドライブには 300MB の空き容量が必要です。 |
| LogFileMode | DWORD | 4 | +64 | +64 | イベント トレース セッションのログ記録フラグです。このメンバーは、イベントをメモリ内の循環バッファー、ログ ファイル、リアルタイム コンシューマーのいずれに書き込むかを指定するために使用します。また、プライベート ロガー セッションであることなど、セッションのその他の特性を指定するためにも使用できます。指定可能なフラグの一覧については、Logging Mode Constants を参照してください。 リアルタイム セッションにリアルタイム コンシューマーが存在しない場合、ETW はイベントをバッファリングします。ただし、このバッファリングには制限があります。制限に達すると、新しいイベントは無視され、ログ記録関数は リアルタイム コンシューマーがイベントを消費するのでない限り、リアルタイム ログ記録セッションを開始しないでください。コンシューマーのいないリアルタイム セッションは、システム リソース (CPU、メモリ、およびイベントをバッファリングするためのディスク領域) を浪費します。 コンシューマーがリアルタイム イベントの処理を開始すると、まずバッファリングされたイベントが消費されます。バッファリングされたイベントがすべて消費された後、セッションは新しいイベントの報告を開始します。 |
| FlushTimer | DWORD | 4 | +68 | +68 | 空でないトレース バッファーをフラッシュする間隔 (秒単位) です。最小のフラッシュ時間は 1 秒です。
|
| EnableFlags | EVENT_TRACE_FLAG | 4 | +72 | +72 | システム ロガー セッションでは、トレースに含める SystemTraceProvider のイベントを示すために EnableFlags を設定できます。 メモ
EnableFlags が有効なのはシステム ロガーの場合のみです。つまり、 このメンバーには、次の値のうち 1 つ以上を含めることができます。
|
| Anonymous | _Anonymous_e__Union | 4 | +76 | +76 | AgeLimitとFlushThreshold等を含む共用体。バージョン依存の用途。 |
| NumberOfBuffers | DWORD | 4 | +80 | +80 | 出力時、イベント トレース セッションのバッファー プールに割り当てられたバッファーの数です。 |
| FreeBuffers | DWORD | 4 | +84 | +84 | 出力時、イベント トレース セッションのバッファー プール内で、割り当て済みだが未使用のバッファーの数です。 |
| EventsLost | DWORD | 4 | +88 | +88 | 出力時、記録されなかったイベントの数です。 |
| BuffersWritten | DWORD | 4 | +92 | +92 | 出力時、書き込まれたバッファーの数です。 |
| LogBuffersLost | DWORD | 4 | +96 | +96 | 出力時、ログ ファイルに書き込めなかったバッファーの数です。 |
| RealTimeBuffersLost | DWORD | 4 | +100 | +100 | 出力時、コンシューマーにリアルタイムで配信できなかったバッファーの数です。 |
| LoggerThreadId | HANDLE | 8/4 | +104 | +104 | 出力時、イベント トレース セッションのスレッド識別子です。 |
| LogFileNameOffset | DWORD | 4 | +112 | +108 | この構造体に割り当てられたメモリの先頭から、ログ ファイル名を格納する NULL 終端文字列の先頭までのオフセット (バイト単位) です。 ファイル名には通常 ログ ファイル名は 1,024 文字までに制限されています。LogFileMode に EVENT_TRACE_PRIVATE_LOGGER_MODE または EVENT_TRACE_FILE_MODE_NEWFILE を設定する場合は、プライベート ロガー セッションでファイル名に付加されるプロセス識別子や、新規ファイル ログ モードで作成されるログ ファイルに付加される連番を含められるよう、十分なメモリを確実に予約してください。 イベントをログ ファイルに記録しない場合 (たとえば EVENT_TRACE_REAL_TIME_MODE のみを指定する場合) は、LogFileNameOffset に 0 を設定します。リアルタイムのログ記録のみを指定しつつ、有効なログ ファイル名のオフセットも指定した場合、ETW はそのログ ファイル名を使用して連番付きのログ ファイルを作成し、リアルタイム コンシューマーへイベントを送信することに加えて、そのログ ファイルにもイベントを記録します。LogFileMode が 0 で、有効なログ ファイル名のオフセットを指定した場合にも、ETW は連番付きのログ ファイルを作成します。 イベントをログ ファイルに記録する場合は、構造体の後ろにログ ファイル名とセッション名を含められるだけの十分なメモリを、この構造体用に予約する必要があります。メモリ上では、ログ ファイル名がセッション名の後に配置されていなければなりません。例については解説を参照してください。 トレース ファイルは既定のセキュリティ記述子を使用して作成されます。つまり、ログ ファイルは親ディレクトリと同じ ACL を持ちます。ファイルへのアクセスを制限したい場合は、適切な ACL を設定した親ディレクトリを作成してください。 |
| LoggerNameOffset | DWORD | 4 | +116 | +112 | この構造体に割り当てられたメモリの先頭から、セッション名を格納する NULL 終端文字列の先頭までのオフセット (バイト単位) です。 重要
セッション名から、そのセッションの所有者や用途が判断できるよう、説明的な名前を使用してください。GUID などの説明的でない値は使用しないでください。セッション名を一意にするためにランダムな数字を付加しないでください。ETW セッションは限られたリソースであるため、コンポーネントが複数のセッションを開始すべきではありません。コンポーネントの開始時に、そのコンポーネントのセッションが既に実行されている場合は、2 つ目のセッションを作成するのではなく、取り残されたセッションをクリーンアップしてください。 セッション名は 1,024 文字までに制限されています。セッション名は大文字と小文字を区別しません。同じ名前の別のセッションが既に実行されている場合、システムは新しいセッションを開始しません。 Windows 2000: セッション名は大文字と小文字を区別します。そのため、大文字と小文字の違いだけのセッション名も許可されます。ただし、混乱を避けるため、セッション名が一意になるようにしてください。 |
共用体: _Anonymous_e__Union x64 4B / x86 4B
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| AgeLimit | INT | 4 | +0 | +0 | 使用されません。 Windows 2000: 未使用のバッファーが解放されるまでの遅延時間 (分単位) です。既定値は 15 分です。 |
| FlushThreshold | INT | 4 | +0 | +0 |
公式ドキュメント
EVENT_TRACE_PROPERTIES 構造体は、イベント トレース セッションに関する情報を格納します。この構造体は、セッションのプロパティを定義、更新、または照会するときに、StartTrace や ControlTrace などの API で使用します。
これはバージョン 1 の構造体です。追加のオプションは EVENT_TRACE_PROPERTIES_V2 でサポートされます (FilterDesc や V2Options など)。
解説(Remarks)
この構造体のメモリを割り当てる際は、構造体の後ろにセッション名とログ ファイル名を含められるだけの十分なメモリを割り当てる必要があります。メモリ上では、セッション名がログ ファイル名より前に配置されていなければなりません。ログ ファイル名はオフセットの位置にコピーする必要がありますが、セッション名はオフセットの位置にコピーしません。StartTrace 関数が名前をコピーします。
メンバーを設定する前に、この構造体のメモリを必ず 0 で初期化してください。例:
typedef struct EventTracePropertyData {
EVENT_TRACE_PROPERTIES Props;
WCHAR LoggerName[128];
WCHAR LogFileName[1024];
} EventTracePropertyData;
EventTracePropertyData data = {0};
data.Props.Wnode.BufferSize = sizeof(data);
data.Props.Wnode.Flags = WNODE_FLAG_TRACED_GUID;
data.Props.LogFileNameOffset = offsetof(EventTracePropertyData, LogFileName);
data.Props.LoggerNameOffset = offsetof(EventTracePropertyData, LoggerName);
プロバイダーからのイベントは、セッションのバッファーに書き込まれます。ファイル セッションまたはリアルタイム セッションのバッファーがいっぱいになると (または FlushTimer が満了すると)、セッションはログ ファイルへのイベントの書き込み、リアルタイム コンシューマーへの配信、あるいはその両方によってバッファーをフラッシュします。セッションのバッファーがフラッシュできる速度より速く満たされる場合、MaximumBuffers に達するまで、新しいバッファーが割り当てられてセッションのバッファー プールに追加されます。この上限を超えると、セッションはバッファーが利用可能になるまで、受信したイベントを破棄します。各セッションは、破棄されたイベントの数を記録します (EventsLost メンバーを参照してください)。
セッションの実行中に EventsLost などのセッション統計情報を確認するには、ControlTrace 関数を呼び出し、ControlCode パラメーターに EVENT_TRACE_CONTROL_QUERY を設定します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// WNODE_HEADER (x64 48 / x86 48 バイト)
typedef struct WNODE_HEADER {
DWORD BufferSize;
DWORD ProviderId;
_Anonymous1_e__Union Anonymous1;
_Anonymous2_e__Union Anonymous2;
GUID Guid;
DWORD ClientContext;
DWORD Flags;
} WNODE_HEADER;
// EVENT_TRACE_PROPERTIES (x64 120 / x86 120 バイト)
typedef struct EVENT_TRACE_PROPERTIES {
WNODE_HEADER Wnode;
DWORD BufferSize;
DWORD MinimumBuffers;
DWORD MaximumBuffers;
DWORD MaximumFileSize;
DWORD LogFileMode;
DWORD FlushTimer;
EVENT_TRACE_FLAG EnableFlags;
_Anonymous_e__Union Anonymous;
DWORD NumberOfBuffers;
DWORD FreeBuffers;
DWORD EventsLost;
DWORD BuffersWritten;
DWORD LogBuffersLost;
DWORD RealTimeBuffersLost;
HANDLE LoggerThreadId;
DWORD LogFileNameOffset;
DWORD LoggerNameOffset;
} EVENT_TRACE_PROPERTIES;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WNODE_HEADER
{
public uint BufferSize;
public uint ProviderId;
public _Anonymous1_e__Union Anonymous1;
public _Anonymous2_e__Union Anonymous2;
public Guid Guid;
public uint ClientContext;
public uint Flags;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct EVENT_TRACE_PROPERTIES
{
public WNODE_HEADER Wnode;
public uint BufferSize;
public uint MinimumBuffers;
public uint MaximumBuffers;
public uint MaximumFileSize;
public uint LogFileMode;
public uint FlushTimer;
public uint EnableFlags;
public _Anonymous_e__Union Anonymous;
public uint NumberOfBuffers;
public uint FreeBuffers;
public uint EventsLost;
public uint BuffersWritten;
public uint LogBuffersLost;
public uint RealTimeBuffersLost;
public IntPtr LoggerThreadId;
public uint LogFileNameOffset;
public uint LoggerNameOffset;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WNODE_HEADER
Public BufferSize As UInteger
Public ProviderId As UInteger
Public Anonymous1 As _Anonymous1_e__Union
Public Anonymous2 As _Anonymous2_e__Union
Public Guid As Guid
Public ClientContext As UInteger
Public Flags As UInteger
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure EVENT_TRACE_PROPERTIES
Public Wnode As WNODE_HEADER
Public BufferSize As UInteger
Public MinimumBuffers As UInteger
Public MaximumBuffers As UInteger
Public MaximumFileSize As UInteger
Public LogFileMode As UInteger
Public FlushTimer As UInteger
Public EnableFlags As UInteger
Public Anonymous As _Anonymous_e__Union
Public NumberOfBuffers As UInteger
Public FreeBuffers As UInteger
Public EventsLost As UInteger
Public BuffersWritten As UInteger
Public LogBuffersLost As UInteger
Public RealTimeBuffersLost As UInteger
Public LoggerThreadId As IntPtr
Public LogFileNameOffset As UInteger
Public LoggerNameOffset As UInteger
End Structureimport ctypes
from ctypes import wintypes
class WNODE_HEADER(ctypes.Structure):
_fields_ = [
("BufferSize", wintypes.DWORD),
("ProviderId", wintypes.DWORD),
("Anonymous1", _Anonymous1_e__Union),
("Anonymous2", _Anonymous2_e__Union),
("Guid", GUID),
("ClientContext", wintypes.DWORD),
("Flags", wintypes.DWORD),
]
class EVENT_TRACE_PROPERTIES(ctypes.Structure):
_fields_ = [
("Wnode", WNODE_HEADER),
("BufferSize", wintypes.DWORD),
("MinimumBuffers", wintypes.DWORD),
("MaximumBuffers", wintypes.DWORD),
("MaximumFileSize", wintypes.DWORD),
("LogFileMode", wintypes.DWORD),
("FlushTimer", wintypes.DWORD),
("EnableFlags", wintypes.DWORD),
("Anonymous", _Anonymous_e__Union),
("NumberOfBuffers", wintypes.DWORD),
("FreeBuffers", wintypes.DWORD),
("EventsLost", wintypes.DWORD),
("BuffersWritten", wintypes.DWORD),
("LogBuffersLost", wintypes.DWORD),
("RealTimeBuffersLost", wintypes.DWORD),
("LoggerThreadId", ctypes.c_void_p),
("LogFileNameOffset", wintypes.DWORD),
("LoggerNameOffset", wintypes.DWORD),
]#[repr(C)]
pub struct WNODE_HEADER {
pub BufferSize: u32,
pub ProviderId: u32,
pub Anonymous1: _Anonymous1_e__Union,
pub Anonymous2: _Anonymous2_e__Union,
pub Guid: GUID,
pub ClientContext: u32,
pub Flags: u32,
}
#[repr(C)]
pub struct EVENT_TRACE_PROPERTIES {
pub Wnode: WNODE_HEADER,
pub BufferSize: u32,
pub MinimumBuffers: u32,
pub MaximumBuffers: u32,
pub MaximumFileSize: u32,
pub LogFileMode: u32,
pub FlushTimer: u32,
pub EnableFlags: u32,
pub Anonymous: _Anonymous_e__Union,
pub NumberOfBuffers: u32,
pub FreeBuffers: u32,
pub EventsLost: u32,
pub BuffersWritten: u32,
pub LogBuffersLost: u32,
pub RealTimeBuffersLost: u32,
pub LoggerThreadId: *mut core::ffi::c_void,
pub LogFileNameOffset: u32,
pub LoggerNameOffset: u32,
}import "golang.org/x/sys/windows"
type WNODE_HEADER struct {
BufferSize uint32
ProviderId uint32
Anonymous1 _Anonymous1_e__Union
Anonymous2 _Anonymous2_e__Union
Guid windows.GUID
ClientContext uint32
Flags uint32
}
type EVENT_TRACE_PROPERTIES struct {
Wnode WNODE_HEADER
BufferSize uint32
MinimumBuffers uint32
MaximumBuffers uint32
MaximumFileSize uint32
LogFileMode uint32
FlushTimer uint32
EnableFlags uint32
Anonymous _Anonymous_e__Union
NumberOfBuffers uint32
FreeBuffers uint32
EventsLost uint32
BuffersWritten uint32
LogBuffersLost uint32
RealTimeBuffersLost uint32
LoggerThreadId uintptr
LogFileNameOffset uint32
LoggerNameOffset uint32
}type
WNODE_HEADER = record
BufferSize: DWORD;
ProviderId: DWORD;
Anonymous1: _Anonymous1_e__Union;
Anonymous2: _Anonymous2_e__Union;
Guid: TGUID;
ClientContext: DWORD;
Flags: DWORD;
end;
EVENT_TRACE_PROPERTIES = record
Wnode: WNODE_HEADER;
BufferSize: DWORD;
MinimumBuffers: DWORD;
MaximumBuffers: DWORD;
MaximumFileSize: DWORD;
LogFileMode: DWORD;
FlushTimer: DWORD;
EnableFlags: DWORD;
Anonymous: _Anonymous_e__Union;
NumberOfBuffers: DWORD;
FreeBuffers: DWORD;
EventsLost: DWORD;
BuffersWritten: DWORD;
LogBuffersLost: DWORD;
RealTimeBuffersLost: DWORD;
LoggerThreadId: Pointer;
LogFileNameOffset: DWORD;
LoggerNameOffset: DWORD;
end;const WNODE_HEADER = extern struct {
BufferSize: u32,
ProviderId: u32,
Anonymous1: _Anonymous1_e__Union,
Anonymous2: _Anonymous2_e__Union,
Guid: GUID,
ClientContext: u32,
Flags: u32,
};
const EVENT_TRACE_PROPERTIES = extern struct {
Wnode: WNODE_HEADER,
BufferSize: u32,
MinimumBuffers: u32,
MaximumBuffers: u32,
MaximumFileSize: u32,
LogFileMode: u32,
FlushTimer: u32,
EnableFlags: u32,
Anonymous: _Anonymous_e__Union,
NumberOfBuffers: u32,
FreeBuffers: u32,
EventsLost: u32,
BuffersWritten: u32,
LogBuffersLost: u32,
RealTimeBuffersLost: u32,
LoggerThreadId: ?*anyopaque,
LogFileNameOffset: u32,
LoggerNameOffset: u32,
};type
WNODE_HEADER {.bycopy.} = object
BufferSize: uint32
ProviderId: uint32
Anonymous1: _Anonymous1_e__Union
Anonymous2: _Anonymous2_e__Union
Guid: GUID
ClientContext: uint32
Flags: uint32
EVENT_TRACE_PROPERTIES {.bycopy.} = object
Wnode: WNODE_HEADER
BufferSize: uint32
MinimumBuffers: uint32
MaximumBuffers: uint32
MaximumFileSize: uint32
LogFileMode: uint32
FlushTimer: uint32
EnableFlags: uint32
Anonymous: _Anonymous_e__Union
NumberOfBuffers: uint32
FreeBuffers: uint32
EventsLost: uint32
BuffersWritten: uint32
LogBuffersLost: uint32
RealTimeBuffersLost: uint32
LoggerThreadId: pointer
LogFileNameOffset: uint32
LoggerNameOffset: uint32struct WNODE_HEADER
{
uint BufferSize;
uint ProviderId;
_Anonymous1_e__Union Anonymous1;
_Anonymous2_e__Union Anonymous2;
GUID Guid;
uint ClientContext;
uint Flags;
}
struct EVENT_TRACE_PROPERTIES
{
WNODE_HEADER Wnode;
uint BufferSize;
uint MinimumBuffers;
uint MaximumBuffers;
uint MaximumFileSize;
uint LogFileMode;
uint FlushTimer;
uint EnableFlags;
_Anonymous_e__Union Anonymous;
uint NumberOfBuffers;
uint FreeBuffers;
uint EventsLost;
uint BuffersWritten;
uint LogBuffersLost;
uint RealTimeBuffersLost;
void* LoggerThreadId;
uint LogFileNameOffset;
uint LoggerNameOffset;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; EVENT_TRACE_PROPERTIES サイズ: 120 バイト(x86)
dim st, 30 ; 4byte整数×30(構造体サイズ 120 / 4 切り上げ)
; Wnode : WNODE_HEADER (+0, 48byte) varptr(st)+0 を基点に操作(48byte:入れ子/配列)
; BufferSize : DWORD (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; MinimumBuffers : DWORD (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; MaximumBuffers : DWORD (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; MaximumFileSize : DWORD (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; LogFileMode : DWORD (+64, 4byte) st.16 = 値 / 値 = st.16 (lpoke/lpeek も可)
; FlushTimer : DWORD (+68, 4byte) st.17 = 値 / 値 = st.17 (lpoke/lpeek も可)
; EnableFlags : EVENT_TRACE_FLAG (+72, 4byte) st.18 = 値 / 値 = st.18 (lpoke/lpeek も可)
; Anonymous : _Anonymous_e__Union (+76, 4byte) varptr(st)+76 を基点に操作(4byte:入れ子/配列)
; NumberOfBuffers : DWORD (+80, 4byte) st.20 = 値 / 値 = st.20 (lpoke/lpeek も可)
; FreeBuffers : DWORD (+84, 4byte) st.21 = 値 / 値 = st.21 (lpoke/lpeek も可)
; EventsLost : DWORD (+88, 4byte) st.22 = 値 / 値 = st.22 (lpoke/lpeek も可)
; BuffersWritten : DWORD (+92, 4byte) st.23 = 値 / 値 = st.23 (lpoke/lpeek も可)
; LogBuffersLost : DWORD (+96, 4byte) st.24 = 値 / 値 = st.24 (lpoke/lpeek も可)
; RealTimeBuffersLost : DWORD (+100, 4byte) st.25 = 値 / 値 = st.25 (lpoke/lpeek も可)
; LoggerThreadId : HANDLE (+104, 4byte) st.26 = 値 / 値 = st.26 (lpoke/lpeek も可)
; LogFileNameOffset : DWORD (+108, 4byte) st.27 = 値 / 値 = st.27 (lpoke/lpeek も可)
; LoggerNameOffset : DWORD (+112, 4byte) st.28 = 値 / 値 = st.28 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; EVENT_TRACE_PROPERTIES サイズ: 120 バイト(x64)
dim st, 30 ; 4byte整数×30(構造体サイズ 120 / 4 切り上げ)
; Wnode : WNODE_HEADER (+0, 48byte) varptr(st)+0 を基点に操作(48byte:入れ子/配列)
; BufferSize : DWORD (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; MinimumBuffers : DWORD (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; MaximumBuffers : DWORD (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; MaximumFileSize : DWORD (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; LogFileMode : DWORD (+64, 4byte) st.16 = 値 / 値 = st.16 (lpoke/lpeek も可)
; FlushTimer : DWORD (+68, 4byte) st.17 = 値 / 値 = st.17 (lpoke/lpeek も可)
; EnableFlags : EVENT_TRACE_FLAG (+72, 4byte) st.18 = 値 / 値 = st.18 (lpoke/lpeek も可)
; Anonymous : _Anonymous_e__Union (+76, 4byte) varptr(st)+76 を基点に操作(4byte:入れ子/配列)
; NumberOfBuffers : DWORD (+80, 4byte) st.20 = 値 / 値 = st.20 (lpoke/lpeek も可)
; FreeBuffers : DWORD (+84, 4byte) st.21 = 値 / 値 = st.21 (lpoke/lpeek も可)
; EventsLost : DWORD (+88, 4byte) st.22 = 値 / 値 = st.22 (lpoke/lpeek も可)
; BuffersWritten : DWORD (+92, 4byte) st.23 = 値 / 値 = st.23 (lpoke/lpeek も可)
; LogBuffersLost : DWORD (+96, 4byte) st.24 = 値 / 値 = st.24 (lpoke/lpeek も可)
; RealTimeBuffersLost : DWORD (+100, 4byte) st.25 = 値 / 値 = st.25 (lpoke/lpeek も可)
; LoggerThreadId : HANDLE (+104, 8byte) qpoke st,104,値 / qpeek(st,104) ※IronHSPのみ。3.7/3.8は lpoke st,104,下位 : lpoke st,108,上位
; LogFileNameOffset : DWORD (+112, 4byte) st.28 = 値 / 値 = st.28 (lpoke/lpeek も可)
; LoggerNameOffset : DWORD (+116, 4byte) st.29 = 値 / 値 = st.29 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global GUID, pack=1
#field int Data1
#field short Data2
#field short Data3
#field byte Data4 8
#endstruct
#defstruct global WNODE_HEADER
#field int BufferSize
#field int ProviderId
#field byte Anonymous1 8
#field byte Anonymous2 8
#field GUID Guid
#field int ClientContext
#field int Flags
#endstruct
#defstruct global EVENT_TRACE_PROPERTIES
#field WNODE_HEADER Wnode
#field int BufferSize
#field int MinimumBuffers
#field int MaximumBuffers
#field int MaximumFileSize
#field int LogFileMode
#field int FlushTimer
#field int EnableFlags
#field byte Anonymous 4
#field int NumberOfBuffers
#field int FreeBuffers
#field int EventsLost
#field int BuffersWritten
#field int LogBuffersLost
#field int RealTimeBuffersLost
#field intptr LoggerThreadId
#field int LogFileNameOffset
#field int LoggerNameOffset
#endstruct
stdim st, EVENT_TRACE_PROPERTIES ; NSTRUCT 変数を確保
st->BufferSize = 100
mes "BufferSize=" + st->BufferSize
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。