Win32 API 日本語リファレンス
ホームSystem.Diagnostics.Debug.Extensions › DBG_THREAD_ATTRIBUTES

DBG_THREAD_ATTRIBUTES

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

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

フィールド

フィールドサイズx64x86説明
ThreadIndexDWORD4+0+0スレッドのインデックス番号。
ProcessIDULONGLONG8+8+8スレッドが属するプロセスのID。
ThreadIDULONGLONG8+16+16スレッドのID。
AttributeBitsULONGLONG8+24+24スレッドの各種属性を示すビットマスク。
BoolBitsDWORD4+32+32ブール属性をまとめたビットフィールド。
BlockedOnPIDULONGLONG8+40+40ブロック原因となっているプロセスのID。なければ0。
BlockedOnTIDULONGLONG8+48+48ブロック原因となっているスレッドのID。なければ0。
CritSecAddressULONGLONG8+56+56待機しているクリティカルセクションのアドレス。
Timeout_msecDWORD4+64+64待機のタイムアウト時間(ミリ秒)。
StringDataCHAR100+68+68スレッドに関する説明文字列(ASCII)。
SymNameCHAR100+168+168関連するシンボル名(ASCII)。

各言語での定義

#include <windows.h>

// DBG_THREAD_ATTRIBUTES  (x64 272 / x86 272 バイト)
typedef struct DBG_THREAD_ATTRIBUTES {
    DWORD ThreadIndex;
    ULONGLONG ProcessID;
    ULONGLONG ThreadID;
    ULONGLONG AttributeBits;
    DWORD BoolBits;
    ULONGLONG BlockedOnPID;
    ULONGLONG BlockedOnTID;
    ULONGLONG CritSecAddress;
    DWORD Timeout_msec;
    CHAR StringData[100];
    CHAR SymName[100];
} DBG_THREAD_ATTRIBUTES;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DBG_THREAD_ATTRIBUTES
{
    public uint ThreadIndex;
    public ulong ProcessID;
    public ulong ThreadID;
    public ulong AttributeBits;
    public uint BoolBits;
    public ulong BlockedOnPID;
    public ulong BlockedOnTID;
    public ulong CritSecAddress;
    public uint Timeout_msec;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] public sbyte[] StringData;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] public sbyte[] SymName;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DBG_THREAD_ATTRIBUTES
    Public ThreadIndex As UInteger
    Public ProcessID As ULong
    Public ThreadID As ULong
    Public AttributeBits As ULong
    Public BoolBits As UInteger
    Public BlockedOnPID As ULong
    Public BlockedOnTID As ULong
    Public CritSecAddress As ULong
    Public Timeout_msec As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Public StringData() As SByte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Public SymName() As SByte
End Structure
import ctypes
from ctypes import wintypes

class DBG_THREAD_ATTRIBUTES(ctypes.Structure):
    _fields_ = [
        ("ThreadIndex", wintypes.DWORD),
        ("ProcessID", ctypes.c_ulonglong),
        ("ThreadID", ctypes.c_ulonglong),
        ("AttributeBits", ctypes.c_ulonglong),
        ("BoolBits", wintypes.DWORD),
        ("BlockedOnPID", ctypes.c_ulonglong),
        ("BlockedOnTID", ctypes.c_ulonglong),
        ("CritSecAddress", ctypes.c_ulonglong),
        ("Timeout_msec", wintypes.DWORD),
        ("StringData", ctypes.c_byte * 100),
        ("SymName", ctypes.c_byte * 100),
    ]
#[repr(C)]
pub struct DBG_THREAD_ATTRIBUTES {
    pub ThreadIndex: u32,
    pub ProcessID: u64,
    pub ThreadID: u64,
    pub AttributeBits: u64,
    pub BoolBits: u32,
    pub BlockedOnPID: u64,
    pub BlockedOnTID: u64,
    pub CritSecAddress: u64,
    pub Timeout_msec: u32,
    pub StringData: [i8; 100],
    pub SymName: [i8; 100],
}
import "golang.org/x/sys/windows"

type DBG_THREAD_ATTRIBUTES struct {
	ThreadIndex uint32
	ProcessID uint64
	ThreadID uint64
	AttributeBits uint64
	BoolBits uint32
	BlockedOnPID uint64
	BlockedOnTID uint64
	CritSecAddress uint64
	Timeout_msec uint32
	StringData [100]int8
	SymName [100]int8
}
type
  DBG_THREAD_ATTRIBUTES = record
    ThreadIndex: DWORD;
    ProcessID: UInt64;
    ThreadID: UInt64;
    AttributeBits: UInt64;
    BoolBits: DWORD;
    BlockedOnPID: UInt64;
    BlockedOnTID: UInt64;
    CritSecAddress: UInt64;
    Timeout_msec: DWORD;
    StringData: array[0..99] of Shortint;
    SymName: array[0..99] of Shortint;
  end;
const DBG_THREAD_ATTRIBUTES = extern struct {
    ThreadIndex: u32,
    ProcessID: u64,
    ThreadID: u64,
    AttributeBits: u64,
    BoolBits: u32,
    BlockedOnPID: u64,
    BlockedOnTID: u64,
    CritSecAddress: u64,
    Timeout_msec: u32,
    StringData: [100]i8,
    SymName: [100]i8,
};
type
  DBG_THREAD_ATTRIBUTES {.bycopy.} = object
    ThreadIndex: uint32
    ProcessID: uint64
    ThreadID: uint64
    AttributeBits: uint64
    BoolBits: uint32
    BlockedOnPID: uint64
    BlockedOnTID: uint64
    CritSecAddress: uint64
    Timeout_msec: uint32
    StringData: array[100, int8]
    SymName: array[100, int8]
struct DBG_THREAD_ATTRIBUTES
{
    uint ThreadIndex;
    ulong ProcessID;
    ulong ThreadID;
    ulong AttributeBits;
    uint BoolBits;
    ulong BlockedOnPID;
    ulong BlockedOnTID;
    ulong CritSecAddress;
    uint Timeout_msec;
    byte[100] StringData;
    byte[100] SymName;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DBG_THREAD_ATTRIBUTES サイズ: 272 バイト(x64)
dim st, 68    ; 4byte整数×68(構造体サイズ 272 / 4 切り上げ)
; ThreadIndex : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; ProcessID : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; ThreadID : ULONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; AttributeBits : ULONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; BoolBits : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; BlockedOnPID : ULONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; BlockedOnTID : ULONGLONG (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; CritSecAddress : ULONGLONG (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; Timeout_msec : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; StringData : CHAR (+68, 100byte)  varptr(st)+68 を基点に操作(100byte:入れ子/配列)
; SymName : CHAR (+168, 100byte)  varptr(st)+168 を基点に操作(100byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global DBG_THREAD_ATTRIBUTES
    #field int ThreadIndex
    #field int64 ProcessID
    #field int64 ThreadID
    #field int64 AttributeBits
    #field int BoolBits
    #field int64 BlockedOnPID
    #field int64 BlockedOnTID
    #field int64 CritSecAddress
    #field int Timeout_msec
    #field byte StringData 100
    #field byte SymName 100
#endstruct

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