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

TEB

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

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

フィールド

フィールドサイズx64x86説明
Reserved1void*96/48+0+0システム内部用の予約ポインタ配列。直接使用しない。
ProcessEnvironmentBlockPEB*8/4+96+48このスレッドが属するプロセスのPEBへのポインタ。
Reserved2void*3192/1596+104+52システム内部用の予約ポインタ配列。直接使用しない。
Reserved3BYTE1952+3296+1648システム内部用の予約バイト配列。直接使用しない。
TlsSlotsvoid*512/256+5248+3600スレッドローカルストレージ(TLS)スロットの配列。
Reserved4BYTE8+5760+3856システム内部用の予約バイト配列。直接使用しない。
Reserved5void*208/104+5768+3864システム内部用の予約ポインタ配列。直接使用しない。
ReservedForOlevoid*8/4+5976+3968OLEが使用するために予約されたポインタ。
Reserved6void*32/16+5984+3972システム内部用の予約ポインタ配列。直接使用しない。
TlsExpansionSlotsvoid*8/4+6016+3988TLS拡張スロットへのポインタ。標準スロット数を超える分を保持する。

各言語での定義

#include <windows.h>

// TEB  (x64 6024 / x86 3992 バイト)
typedef struct TEB {
    void* Reserved1[12];
    PEB* ProcessEnvironmentBlock;
    void* Reserved2[399];
    BYTE Reserved3[1952];
    void* TlsSlots[64];
    BYTE Reserved4[8];
    void* Reserved5[26];
    void* ReservedForOle;
    void* Reserved6[4];
    void* TlsExpansionSlots;
} TEB;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TEB
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public IntPtr[] Reserved1;
    public IntPtr ProcessEnvironmentBlock;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 399)] public IntPtr[] Reserved2;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1952)] public byte[] Reserved3;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public IntPtr[] TlsSlots;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] Reserved4;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)] public IntPtr[] Reserved5;
    public IntPtr ReservedForOle;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public IntPtr[] Reserved6;
    public IntPtr TlsExpansionSlots;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TEB
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=12)> Public Reserved1() As IntPtr
    Public ProcessEnvironmentBlock As IntPtr
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=399)> Public Reserved2() As IntPtr
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=1952)> Public Reserved3() As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> Public TlsSlots() As IntPtr
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public Reserved4() As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=26)> Public Reserved5() As IntPtr
    Public ReservedForOle As IntPtr
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Public Reserved6() As IntPtr
    Public TlsExpansionSlots As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class TEB(ctypes.Structure):
    _fields_ = [
        ("Reserved1", ctypes.c_void_p * 12),
        ("ProcessEnvironmentBlock", ctypes.c_void_p),
        ("Reserved2", ctypes.c_void_p * 399),
        ("Reserved3", ctypes.c_ubyte * 1952),
        ("TlsSlots", ctypes.c_void_p * 64),
        ("Reserved4", ctypes.c_ubyte * 8),
        ("Reserved5", ctypes.c_void_p * 26),
        ("ReservedForOle", ctypes.c_void_p),
        ("Reserved6", ctypes.c_void_p * 4),
        ("TlsExpansionSlots", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct TEB {
    pub Reserved1: [*mut core::ffi::c_void; 12],
    pub ProcessEnvironmentBlock: *mut core::ffi::c_void,
    pub Reserved2: [*mut core::ffi::c_void; 399],
    pub Reserved3: [u8; 1952],
    pub TlsSlots: [*mut core::ffi::c_void; 64],
    pub Reserved4: [u8; 8],
    pub Reserved5: [*mut core::ffi::c_void; 26],
    pub ReservedForOle: *mut core::ffi::c_void,
    pub Reserved6: [*mut core::ffi::c_void; 4],
    pub TlsExpansionSlots: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type TEB struct {
	Reserved1 [12]uintptr
	ProcessEnvironmentBlock uintptr
	Reserved2 [399]uintptr
	Reserved3 [1952]byte
	TlsSlots [64]uintptr
	Reserved4 [8]byte
	Reserved5 [26]uintptr
	ReservedForOle uintptr
	Reserved6 [4]uintptr
	TlsExpansionSlots uintptr
}
type
  TEB = record
    Reserved1: array[0..11] of Pointer;
    ProcessEnvironmentBlock: Pointer;
    Reserved2: array[0..398] of Pointer;
    Reserved3: array[0..1951] of Byte;
    TlsSlots: array[0..63] of Pointer;
    Reserved4: array[0..7] of Byte;
    Reserved5: array[0..25] of Pointer;
    ReservedForOle: Pointer;
    Reserved6: array[0..3] of Pointer;
    TlsExpansionSlots: Pointer;
  end;
const TEB = extern struct {
    Reserved1: [12]?*anyopaque,
    ProcessEnvironmentBlock: ?*anyopaque,
    Reserved2: [399]?*anyopaque,
    Reserved3: [1952]u8,
    TlsSlots: [64]?*anyopaque,
    Reserved4: [8]u8,
    Reserved5: [26]?*anyopaque,
    ReservedForOle: ?*anyopaque,
    Reserved6: [4]?*anyopaque,
    TlsExpansionSlots: ?*anyopaque,
};
type
  TEB {.bycopy.} = object
    Reserved1: array[12, pointer]
    ProcessEnvironmentBlock: pointer
    Reserved2: array[399, pointer]
    Reserved3: array[1952, uint8]
    TlsSlots: array[64, pointer]
    Reserved4: array[8, uint8]
    Reserved5: array[26, pointer]
    ReservedForOle: pointer
    Reserved6: array[4, pointer]
    TlsExpansionSlots: pointer
struct TEB
{
    void*[12] Reserved1;
    void* ProcessEnvironmentBlock;
    void*[399] Reserved2;
    ubyte[1952] Reserved3;
    void*[64] TlsSlots;
    ubyte[8] Reserved4;
    void*[26] Reserved5;
    void* ReservedForOle;
    void*[4] Reserved6;
    void* TlsExpansionSlots;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; TEB サイズ: 3992 バイト(x86)
dim st, 998    ; 4byte整数×998(構造体サイズ 3992 / 4 切り上げ)
; Reserved1 : void* (+0, 48byte)  varptr(st)+0 を基点に操作(48byte:入れ子/配列)
; ProcessEnvironmentBlock : PEB* (+48, 4byte)  varptr(st)+48 を基点に操作(4byte:入れ子/配列)
; Reserved2 : void* (+52, 1596byte)  varptr(st)+52 を基点に操作(1596byte:入れ子/配列)
; Reserved3 : BYTE (+1648, 1952byte)  varptr(st)+1648 を基点に操作(1952byte:入れ子/配列)
; TlsSlots : void* (+3600, 256byte)  varptr(st)+3600 を基点に操作(256byte:入れ子/配列)
; Reserved4 : BYTE (+3856, 8byte)  varptr(st)+3856 を基点に操作(8byte:入れ子/配列)
; Reserved5 : void* (+3864, 104byte)  varptr(st)+3864 を基点に操作(104byte:入れ子/配列)
; ReservedForOle : void* (+3968, 4byte)  st.992 = 値  /  値 = st.992   (lpoke/lpeek も可)
; Reserved6 : void* (+3972, 16byte)  varptr(st)+3972 を基点に操作(16byte:入れ子/配列)
; TlsExpansionSlots : void* (+3988, 4byte)  st.997 = 値  /  値 = st.997   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; TEB サイズ: 6024 バイト(x64)
dim st, 1506    ; 4byte整数×1506(構造体サイズ 6024 / 4 切り上げ)
; Reserved1 : void* (+0, 96byte)  varptr(st)+0 を基点に操作(96byte:入れ子/配列)
; ProcessEnvironmentBlock : PEB* (+96, 8byte)  varptr(st)+96 を基点に操作(8byte:入れ子/配列)
; Reserved2 : void* (+104, 3192byte)  varptr(st)+104 を基点に操作(3192byte:入れ子/配列)
; Reserved3 : BYTE (+3296, 1952byte)  varptr(st)+3296 を基点に操作(1952byte:入れ子/配列)
; TlsSlots : void* (+5248, 512byte)  varptr(st)+5248 を基点に操作(512byte:入れ子/配列)
; Reserved4 : BYTE (+5760, 8byte)  varptr(st)+5760 を基点に操作(8byte:入れ子/配列)
; Reserved5 : void* (+5768, 208byte)  varptr(st)+5768 を基点に操作(208byte:入れ子/配列)
; ReservedForOle : void* (+5976, 8byte)  qpoke st,5976,値 / qpeek(st,5976)  ※IronHSPのみ。3.7/3.8は lpoke st,5976,下位 : lpoke st,5980,上位
; Reserved6 : void* (+5984, 32byte)  varptr(st)+5984 を基点に操作(32byte:入れ子/配列)
; TlsExpansionSlots : void* (+6016, 8byte)  qpoke st,6016,値 / qpeek(st,6016)  ※IronHSPのみ。3.7/3.8は lpoke st,6016,下位 : lpoke st,6020,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global TEB
    #field intptr Reserved1 12
    #field intptr ProcessEnvironmentBlock
    #field intptr Reserved2 399
    #field byte Reserved3 1952
    #field intptr TlsSlots 64
    #field byte Reserved4 8
    #field intptr Reserved5 26
    #field intptr ReservedForOle
    #field intptr Reserved6 4
    #field intptr TlsExpansionSlots
#endstruct

stdim st, TEB        ; NSTRUCT 変数を確保