xref: /reactos/sdk/include/ndk/peb_teb.h (revision c2c66aff)
1 #define PASTE2(x,y)       x##y
2 #define PASTE(x,y)         PASTE2(x,y)
3 
4 #ifdef EXPLICIT_32BIT
5   #define STRUCT(x) PASTE(x,32)
6   #define PTR(x) ULONG
7 #elif defined(EXPLICIT_64BIT)
8   #define STRUCT(x) PASTE(x,64)
9   #define PTR(x) ULONG64
10 #else
11   #define STRUCT(x) x
12   #define PTR(x) x
13 #endif
14 
15 #if (defined(_WIN64) && !defined(EXPLICIT_32BIT)) || defined(EXPLICIT_64BIT)
16   #define GDI_HANDLE_BUFFER_SIZE 60
17 #else
18   #define GDI_HANDLE_BUFFER_SIZE 34
19 #endif
20 
21 #if defined(_NTDDK_INCLUDED_) || defined(_NTIFS_)
22 #define PPEB PPEB_RENAMED
23 #endif
24 
25 typedef struct STRUCT(_PEB)
26 {
27     BOOLEAN InheritedAddressSpace;
28     BOOLEAN ReadImageFileExecOptions;
29     BOOLEAN BeingDebugged;
30 #if (NTDDI_VERSION >= NTDDI_WS03)
31     union
32     {
33         BOOLEAN BitField;
34         struct
35         {
36             BOOLEAN ImageUsesLargePages:1;
37 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
38             BOOLEAN IsProtectedProcess:1;
39             BOOLEAN IsLegacyProcess:1;
40             BOOLEAN IsImageDynamicallyRelocated:1;
41             BOOLEAN SkipPatchingUser32Forwarders:1;
42             BOOLEAN SpareBits:3;
43 #else
44             BOOLEAN SpareBits:7;
45 #endif
46         };
47     };
48 #else
49     BOOLEAN SpareBool;
50 #endif
51     PTR(HANDLE) Mutant;
52     PTR(PVOID) ImageBaseAddress;
53     PTR(PPEB_LDR_DATA) Ldr;
54     PTR(struct _RTL_USER_PROCESS_PARAMETERS*) ProcessParameters;
55     PTR(PVOID) SubSystemData;
56     PTR(PVOID) ProcessHeap;
57     PTR(struct _RTL_CRITICAL_SECTION*) FastPebLock;
58 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
59     PTR(PVOID) AltThunkSListPtr;
60     PTR(PVOID) IFEOKey;
61     union
62     {
63         ULONG CrossProcessFlags;
64         struct
65         {
66             ULONG ProcessInJob:1;
67             ULONG ProcessInitializing:1;
68             ULONG ProcessUsingVEH:1;
69             ULONG ProcessUsingVCH:1;
70             ULONG ReservedBits0:28;
71         };
72     };
73     union
74     {
75         PTR(PVOID) KernelCallbackTable;
76         PTR(PVOID) UserSharedInfoPtr;
77     };
78 #elif (NTDDI_VERSION >= NTDDI_WS03)
79     PTR(PVOID) AltThunkSListPtr;
80     PTR(PVOID) SparePtr2;
81     ULONG EnvironmentUpdateCount;
82     PTR(PVOID) KernelCallbackTable;
83 #else
84     PTR(PPEBLOCKROUTINE) FastPebLockRoutine;
85     PTR(PPEBLOCKROUTINE) FastPebUnlockRoutine;
86     ULONG EnvironmentUpdateCount;
87     PTR(PVOID) KernelCallbackTable;
88 #endif
89     ULONG SystemReserved[1];
90     ULONG SpareUlong; // AtlThunkSListPtr32
91     PTR(PPEB_FREE_BLOCK) FreeList;
92     ULONG TlsExpansionCounter;
93     PTR(PVOID) TlsBitmap;
94     ULONG TlsBitmapBits[2];
95     PTR(PVOID) ReadOnlySharedMemoryBase;
96 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
97     PTR(PVOID) HotpatchInformation;
98 #else
99     PTR(PVOID) ReadOnlySharedMemoryHeap;
100 #endif
101     PTR(PVOID*) ReadOnlyStaticServerData;
102     PTR(PVOID) AnsiCodePageData;
103     PTR(PVOID) OemCodePageData;
104     PTR(PVOID) UnicodeCaseTableData;
105     ULONG NumberOfProcessors;
106     ULONG NtGlobalFlag;
107     LARGE_INTEGER CriticalSectionTimeout;
108     PTR(ULONG_PTR) HeapSegmentReserve;
109     PTR(ULONG_PTR) HeapSegmentCommit;
110     PTR(ULONG_PTR) HeapDeCommitTotalFreeThreshold;
111     PTR(ULONG_PTR) HeapDeCommitFreeBlockThreshold;
112     ULONG NumberOfHeaps;
113     ULONG MaximumNumberOfHeaps;
114     PTR(PVOID*) ProcessHeaps;
115     PTR(PVOID) GdiSharedHandleTable;
116     PTR(PVOID) ProcessStarterHelper;
117     ULONG GdiDCAttributeList;
118     PTR(struct _RTL_CRITICAL_SECTION*) LoaderLock;
119     ULONG OSMajorVersion;
120     ULONG OSMinorVersion;
121     USHORT OSBuildNumber;
122     USHORT OSCSDVersion;
123     ULONG OSPlatformId;
124     ULONG ImageSubsystem;
125     ULONG ImageSubsystemMajorVersion;
126     ULONG ImageSubsystemMinorVersion;
127     PTR(ULONG_PTR) ImageProcessAffinityMask;
128     ULONG GdiHandleBuffer[GDI_HANDLE_BUFFER_SIZE];
129     PTR(PPOST_PROCESS_INIT_ROUTINE) PostProcessInitRoutine;
130     PTR(PVOID) TlsExpansionBitmap;
131     ULONG TlsExpansionBitmapBits[32];
132     ULONG SessionId;
133 #if (NTDDI_VERSION >= NTDDI_WINXP)
134     ULARGE_INTEGER AppCompatFlags;
135     ULARGE_INTEGER AppCompatFlagsUser;
136     PTR(PVOID) pShimData;
137     PTR(PVOID) AppCompatInfo;
138     STRUCT(UNICODE_STRING) CSDVersion;
139     PTR(struct _ACTIVATION_CONTEXT_DATA*) ActivationContextData;
140     PTR(struct _ASSEMBLY_STORAGE_MAP*) ProcessAssemblyStorageMap;
141     PTR(struct _ACTIVATION_CONTEXT_DATA*) SystemDefaultActivationContextData;
142     PTR(struct _ASSEMBLY_STORAGE_MAP*) SystemAssemblyStorageMap;
143     PTR(ULONG_PTR) MinimumStackCommit;
144 #endif
145 #if (NTDDI_VERSION >= NTDDI_WS03)
146     PTR(PVOID*) FlsCallback;
147     STRUCT(LIST_ENTRY) FlsListHead;
148     PTR(PVOID) FlsBitmap;
149     ULONG FlsBitmapBits[4]; // [FLS_MAXIMUM_AVAILABLE/(sizeof(ULONG)*8)];
150     ULONG FlsHighIndex;
151 #endif
152 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
153     PTR(PVOID) WerRegistrationData;
154     PTR(PVOID) WerShipAssertPtr;
155 #endif
156 } STRUCT(PEB), *STRUCT(PPEB);
157 
158 #undef PPEB
159 
160 #if defined(_WIN64) && !defined(EXPLICIT_32BIT)
161 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Mutant) == 0x08);
162 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Ldr) == 0x18);
163 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FastPebLock) == 0x038);
164 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), TlsExpansionCounter) == 0x070);
165 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), NtGlobalFlag) == 0x0BC);
166 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), GdiSharedHandleTable) == 0x0F8);
167 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), LoaderLock) == 0x110);
168 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), ImageSubsystem) == 0x128);
169 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), ImageProcessAffinityMask) == 0x138);
170 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), PostProcessInitRoutine) == 0x230);
171 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), SessionId) == 0x2C0);
172 #if (NTDDI_VERSION >= NTDDI_WS03)
173 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FlsHighIndex) == 0x350);
174 #endif
175 #else
176 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Mutant) == 0x04);
177 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Ldr) == 0x0C);
178 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FastPebLock) == 0x01C);
179 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), TlsExpansionCounter) == 0x03C);
180 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), NtGlobalFlag) == 0x068);
181 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), GdiSharedHandleTable) == 0x094);
182 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), LoaderLock) == 0x0A0);
183 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), ImageSubsystem) == 0x0B4);
184 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), ImageProcessAffinityMask) == 0x0C0);
185 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), PostProcessInitRoutine) == 0x14C);
186 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), SessionId) == 0x1D4);
187 #if (NTDDI_VERSION >= NTDDI_WS03)
188 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FlsHighIndex) == 0x22C);
189 #endif
190 #endif
191 
192 #define GDI_BATCH_BUFFER_SIZE 0x136
193 //
194 // GDI Batch Descriptor
195 //
196 typedef struct STRUCT(_GDI_TEB_BATCH)
197 {
198     ULONG Offset;
199     PTR(HANDLE) HDC;
200     ULONG Buffer[GDI_BATCH_BUFFER_SIZE];
201 } STRUCT(GDI_TEB_BATCH), *STRUCT(PGDI_TEB_BATCH);
202 
203 //
204 // Thread Environment Block (TEB)
205 //
206 typedef struct STRUCT(_TEB)
207 {
208     STRUCT(NT_TIB)         NtTib;
209     PTR(PVOID)             EnvironmentPointer;
210     STRUCT(CLIENT_ID)      ClientId;
211     PTR(PVOID)             ActiveRpcHandle;
212     PTR(PVOID)             ThreadLocalStoragePointer;
213     PTR(STRUCT(PPEB))      ProcessEnvironmentBlock;
214     ULONG                  LastErrorValue;
215     ULONG                  CountOfOwnedCriticalSections;
216     PTR(PVOID)             CsrClientThread;
217     PTR(PVOID)             Win32ThreadInfo;
218     ULONG                  User32Reserved[26];
219     ULONG                  UserReserved[5];
220     PTR(PVOID)             WOW32Reserved;
221     LCID                   CurrentLocale;
222     ULONG                  FpSoftwareStatusRegister;
223     PTR(PVOID)             SystemReserved1[54];
224     LONG                   ExceptionCode;
225 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
226     PTR(struct _ACTIVATION_CONTEXT_STACK*) ActivationContextStackPointer;
227     UCHAR                  SpareBytes1[0x30 - 3 * sizeof(PTR(PVOID))];
228     ULONG                  TxFsContext;
229 #elif (NTDDI_VERSION >= NTDDI_WS03)
230     PTR(struct _ACTIVATION_CONTEXT_STACK*) ActivationContextStackPointer;
231     UCHAR                  SpareBytes1[0x34 - 3 * sizeof(PTR(PVOID))];
232 #else
233     ACTIVATION_CONTEXT_STACK ActivationContextStack;
234     UCHAR                  SpareBytes1[24];
235 #endif
236     STRUCT(GDI_TEB_BATCH)  GdiTebBatch;
237     STRUCT(CLIENT_ID)      RealClientId;
238     PTR(PVOID)             GdiCachedProcessHandle;
239     ULONG                  GdiClientPID;
240     ULONG                  GdiClientTID;
241     PTR(PVOID)             GdiThreadLocalInfo;
242     PTR(SIZE_T)            Win32ClientInfo[62];
243     PTR(PVOID)             glDispatchTable[233];
244     PTR(SIZE_T)            glReserved1[29];
245     PTR(PVOID)             glReserved2;
246     PTR(PVOID)             glSectionInfo;
247     PTR(PVOID)             glSection;
248     PTR(PVOID)             glTable;
249     PTR(PVOID)             glCurrentRC;
250     PTR(PVOID)             glContext;
251     NTSTATUS               LastStatusValue;
252     STRUCT(UNICODE_STRING) StaticUnicodeString;
253     WCHAR                  StaticUnicodeBuffer[261];
254     PTR(PVOID)             DeallocationStack;
255     PTR(PVOID)             TlsSlots[64];
256     STRUCT(LIST_ENTRY)     TlsLinks;
257     PTR(PVOID)             Vdm;
258     PTR(PVOID)             ReservedForNtRpc;
259     PTR(PVOID)             DbgSsReserved[2];
260 #if (NTDDI_VERSION >= NTDDI_WS03)
261     ULONG                  HardErrorMode;
262 #else
263     ULONG                  HardErrorsAreDisabled;
264 #endif
265 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
266     PTR(PVOID)             Instrumentation[13 - sizeof(GUID)/sizeof(PTR(PVOID))];
267     GUID                   ActivityId;
268     PTR(PVOID)             SubProcessTag;
269     PTR(PVOID)             EtwLocalData;
270     PTR(PVOID)             EtwTraceData;
271 #elif (NTDDI_VERSION >= NTDDI_WS03)
272     PTR(PVOID)             Instrumentation[14];
273     PTR(PVOID)             SubProcessTag;
274     PTR(PVOID)             EtwLocalData;
275 #else
276     PTR(PVOID)             Instrumentation[16];
277 #endif
278     PTR(PVOID)             WinSockData;
279     ULONG                  GdiBatchCount;
280 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
281     BOOLEAN                SpareBool0;
282     BOOLEAN                SpareBool1;
283     BOOLEAN                SpareBool2;
284 #else
285     BOOLEAN                InDbgPrint;
286     BOOLEAN                FreeStackOnTermination;
287     BOOLEAN                HasFiberData;
288 #endif
289     UCHAR                  IdealProcessor;
290 #if (NTDDI_VERSION >= NTDDI_WS03)
291     ULONG                  GuaranteedStackBytes;
292 #else
293     ULONG                  Spare3;
294 #endif
295     PTR(PVOID)             ReservedForPerf;
296     PTR(PVOID)             ReservedForOle;
297     ULONG                  WaitingOnLoaderLock;
298 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
299     PTR(PVOID)             SavedPriorityState;
300     PTR(ULONG_PTR)         SoftPatchPtr1;
301     PTR(ULONG_PTR)         ThreadPoolData;
302 #elif (NTDDI_VERSION >= NTDDI_WS03)
303     PTR(ULONG_PTR)         SparePointer1;
304     PTR(ULONG_PTR)         SoftPatchPtr1;
305     PTR(ULONG_PTR)         SoftPatchPtr2;
306 #else
307     Wx86ThreadState        Wx86Thread;
308 #endif
309     PTR(PVOID*)            TlsExpansionSlots;
310 #if defined(_WIN64) && !defined(EXPLICIT_32BIT)
311     PTR(PVOID)             DeallocationBStore;
312     PTR(PVOID)             BStoreLimit;
313 #endif
314     ULONG                  ImpersonationLocale;
315     ULONG                  IsImpersonating;
316     PTR(PVOID)             NlsCache;
317     PTR(PVOID)             pShimData;
318     ULONG                  HeapVirtualAffinity;
319     PTR(HANDLE)            CurrentTransactionHandle;
320     PTR(PTEB_ACTIVE_FRAME) ActiveFrame;
321 #if (NTDDI_VERSION >= NTDDI_WS03)
322     PVOID FlsData;
323 #endif
324 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
325     PVOID PreferredLangauges;
326     PVOID UserPrefLanguages;
327     PVOID MergedPrefLanguages;
328     ULONG MuiImpersonation;
329     union
330     {
331         struct
332         {
333             USHORT SpareCrossTebFlags:16;
334         };
335         USHORT CrossTebFlags;
336     };
337     union
338     {
339         struct
340         {
341             USHORT DbgSafeThunkCall:1;
342             USHORT DbgInDebugPrint:1;
343             USHORT DbgHasFiberData:1;
344             USHORT DbgSkipThreadAttach:1;
345             USHORT DbgWerInShipAssertCode:1;
346             USHORT DbgIssuedInitialBp:1;
347             USHORT DbgClonedThread:1;
348             USHORT SpareSameTebBits:9;
349         };
350         USHORT SameTebFlags;
351     };
352     PTR(PVOID) TxnScopeEntercallback;
353     PTR(PVOID) TxnScopeExitCAllback;
354     PTR(PVOID) TxnScopeContext;
355     ULONG LockCount;
356     ULONG ProcessRundown;
357     ULONG64 LastSwitchTime;
358     ULONG64 TotalSwitchOutTime;
359     LARGE_INTEGER WaitReasonBitMap;
360 #else
361     BOOLEAN SafeThunkCall;
362     BOOLEAN BooleanSpare[3];
363 #endif
364 } STRUCT(TEB), *STRUCT(PTEB);
365 
366 #if defined(_WIN64) && !defined(EXPLICIT_32BIT)
367 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), EnvironmentPointer) == 0x038);
368 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ExceptionCode) == 0x2C0);
369 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiTebBatch) == 0x2F0);
370 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), LastStatusValue) == 0x1250);
371 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), Vdm) == 0x1690);
372 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), HardErrorMode) == 0x16B0);
373 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiBatchCount) == 0x1740);
374 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), IdealProcessor) == 0x1747);
375 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), WaitingOnLoaderLock) == 0x1760);
376 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), TlsExpansionSlots) == 0x1780);
377 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), WaitingOnLoaderLock) == 0x1760);
378 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ActiveFrame) == 0x17C0);
379 #else
380 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), EnvironmentPointer) == 0x01C);
381 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ExceptionCode) == 0x1A4);
382 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiTebBatch) == 0x1D4);
383 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), LastStatusValue) == 0xBF4);
384 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), Vdm) == 0xF18);
385 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiBatchCount) == 0xF70);
386 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), TlsExpansionSlots) == 0xF94);
387 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ActiveFrame) == 0xFB0);
388 #endif
389 
390 #undef PTR
391 #undef STRUCT
392 #undef PASTE
393 #undef PASTE2
394 #undef GDI_HANDLE_BUFFER_SIZE
395