ホーム › System.Threading › TEB
TEB
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Reserved1 | void* | 96/48 | +0 | +0 | システム内部用の予約ポインタ配列。直接使用しない。 |
| ProcessEnvironmentBlock | PEB* | 8/4 | +96 | +48 | このスレッドが属するプロセスのPEBへのポインタ。 |
| Reserved2 | void* | 3192/1596 | +104 | +52 | システム内部用の予約ポインタ配列。直接使用しない。 |
| Reserved3 | BYTE | 1952 | +3296 | +1648 | システム内部用の予約バイト配列。直接使用しない。 |
| TlsSlots | void* | 512/256 | +5248 | +3600 | スレッドローカルストレージ(TLS)スロットの配列。 |
| Reserved4 | BYTE | 8 | +5760 | +3856 | システム内部用の予約バイト配列。直接使用しない。 |
| Reserved5 | void* | 208/104 | +5768 | +3864 | システム内部用の予約ポインタ配列。直接使用しない。 |
| ReservedForOle | void* | 8/4 | +5976 | +3968 | OLEが使用するために予約されたポインタ。 |
| Reserved6 | void* | 32/16 | +5984 | +3972 | システム内部用の予約ポインタ配列。直接使用しない。 |
| TlsExpansionSlots | void* | 8/4 | +6016 | +3988 | TLS拡張スロットへのポインタ。標準スロット数を超える分を保持する。 |
各言語での定義
#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 Structureimport 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: pointerstruct 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 変数を確保