xref: /reactos/sdk/include/ndk/peb_teb.h (revision 40462c92)
1 /*++ NDK Version: 0098
2 
3 Copyright (c) Alex Ionescu.  All rights reserved.
4 
5 Header Name:
6 
7     peb_teb.h
8 
9 Abstract:
10 
11     Definition of PEB/PEB32/PEB64 and TEB/TEB32/TEB64
12 
13 Author:
14 
15     Timo Kreuzer (timo.kreuzer@reactos.org)
16 
17 --*/
18 
19 #include <rtltypes.h>
20 
21 #define PASTE2(x,y)       x##y
22 #define PASTE(x,y)         PASTE2(x,y)
23 
24 #ifdef EXPLICIT_32BIT
25   #define STRUCT(x) PASTE(x,32)
26   #define PTR(x) ULONG
27 #elif defined(EXPLICIT_64BIT)
28   #define STRUCT(x) PASTE(x,64)
29   #define PTR(x) ULONG64
30 #else
31   #define STRUCT(x) x
32   #define PTR(x) x
33 #endif
34 
35 #if (defined(_WIN64) && !defined(EXPLICIT_32BIT)) || defined(EXPLICIT_64BIT)
36   #define _STRUCT64
37   #define _SELECT3264(x32, x64) (x64)
38   #define GDI_HANDLE_BUFFER_SIZE 60
39 #else
40   #undef _STRUCT64
41   #define _SELECT3264(x32, x64) (x32)
42   #define GDI_HANDLE_BUFFER_SIZE 34
43 #endif
44 
45 #if defined(_NTDDK_INCLUDED_) || defined(_NTIFS_)
46 #define PPEB PPEB_RENAMED
47 #endif
48 
49 typedef struct STRUCT(_PEB)
50 {
51     BOOLEAN InheritedAddressSpace;
52     BOOLEAN ReadImageFileExecOptions;
53     BOOLEAN BeingDebugged;
54 #if (NTDDI_VERSION >= NTDDI_WS03)
55     union
56     {
57         BOOLEAN BitField;
58         struct
59         {
60             BOOLEAN ImageUsesLargePages:1;
61 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
62             BOOLEAN IsProtectedProcess:1;
63             BOOLEAN IsLegacyProcess:1;
64             BOOLEAN IsImageDynamicallyRelocated:1;
65             BOOLEAN SkipPatchingUser32Forwarders:1;
66             BOOLEAN SpareBits:3;
67 #else
68             BOOLEAN SpareBits:7;
69 #endif
70         };
71     };
72 #else
73     BOOLEAN SpareBool;
74 #endif
75     PTR(HANDLE) Mutant;
76     PTR(PVOID) ImageBaseAddress;
77     PTR(PPEB_LDR_DATA) Ldr;
78     PTR(struct _RTL_USER_PROCESS_PARAMETERS*) ProcessParameters;
79     PTR(PVOID) SubSystemData;
80     PTR(PVOID) ProcessHeap;
81     PTR(struct _RTL_CRITICAL_SECTION*) FastPebLock;
82 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
83     PTR(PVOID) AltThunkSListPtr;
84     PTR(PVOID) IFEOKey;
85     union
86     {
87         ULONG CrossProcessFlags;
88         struct
89         {
90             ULONG ProcessInJob:1;
91             ULONG ProcessInitializing:1;
92             ULONG ProcessUsingVEH:1;
93             ULONG ProcessUsingVCH:1;
94             ULONG ReservedBits0:28;
95         };
96     };
97     union
98     {
99         PTR(PVOID) KernelCallbackTable;
100         PTR(PVOID) UserSharedInfoPtr;
101     };
102 #elif (NTDDI_VERSION >= NTDDI_WS03)
103     PTR(PVOID) AltThunkSListPtr;
104     PTR(PVOID) SparePtr2;
105     ULONG EnvironmentUpdateCount;
106     PTR(PVOID) KernelCallbackTable;
107 #else
108     PTR(PPEBLOCKROUTINE) FastPebLockRoutine;
109     PTR(PPEBLOCKROUTINE) FastPebUnlockRoutine;
110     ULONG EnvironmentUpdateCount;
111     PTR(PVOID) KernelCallbackTable;
112 #endif
113     ULONG SystemReserved[1];
114     ULONG SpareUlong; // AtlThunkSListPtr32
115     PTR(PPEB_FREE_BLOCK) FreeList;
116     ULONG TlsExpansionCounter;
117     PTR(PVOID) TlsBitmap;
118     ULONG TlsBitmapBits[2];
119     PTR(PVOID) ReadOnlySharedMemoryBase;
120 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
121     PTR(PVOID) HotpatchInformation;
122 #else
123     PTR(PVOID) ReadOnlySharedMemoryHeap;
124 #endif
125     PTR(PVOID*) ReadOnlyStaticServerData;
126     PTR(PVOID) AnsiCodePageData;
127     PTR(PVOID) OemCodePageData;
128     PTR(PVOID) UnicodeCaseTableData;
129     ULONG NumberOfProcessors;
130     ULONG NtGlobalFlag;
131     LARGE_INTEGER CriticalSectionTimeout;
132     PTR(ULONG_PTR) HeapSegmentReserve;
133     PTR(ULONG_PTR) HeapSegmentCommit;
134     PTR(ULONG_PTR) HeapDeCommitTotalFreeThreshold;
135     PTR(ULONG_PTR) HeapDeCommitFreeBlockThreshold;
136     ULONG NumberOfHeaps;
137     ULONG MaximumNumberOfHeaps;
138     PTR(PVOID*) ProcessHeaps;
139     PTR(PVOID) GdiSharedHandleTable;
140     PTR(PVOID) ProcessStarterHelper;
141     ULONG GdiDCAttributeList;
142     PTR(struct _RTL_CRITICAL_SECTION*) LoaderLock;
143     ULONG OSMajorVersion;
144     ULONG OSMinorVersion;
145     USHORT OSBuildNumber;
146     USHORT OSCSDVersion;
147     ULONG OSPlatformId;
148     ULONG ImageSubsystem;
149     ULONG ImageSubsystemMajorVersion;
150     ULONG ImageSubsystemMinorVersion;
151     PTR(ULONG_PTR) ImageProcessAffinityMask;
152     ULONG GdiHandleBuffer[GDI_HANDLE_BUFFER_SIZE];
153     PTR(PPOST_PROCESS_INIT_ROUTINE) PostProcessInitRoutine;
154     PTR(PVOID) TlsExpansionBitmap;
155     ULONG TlsExpansionBitmapBits[32];
156     ULONG SessionId;
157 #if (NTDDI_VERSION >= NTDDI_WINXP)
158     ULARGE_INTEGER AppCompatFlags;
159     ULARGE_INTEGER AppCompatFlagsUser;
160     PTR(PVOID) pShimData;
161     PTR(PVOID) AppCompatInfo;
162     STRUCT(UNICODE_STRING) CSDVersion;
163     PTR(struct _ACTIVATION_CONTEXT_DATA*) ActivationContextData;
164     PTR(struct _ASSEMBLY_STORAGE_MAP*) ProcessAssemblyStorageMap;
165     PTR(struct _ACTIVATION_CONTEXT_DATA*) SystemDefaultActivationContextData;
166     PTR(struct _ASSEMBLY_STORAGE_MAP*) SystemAssemblyStorageMap;
167     PTR(ULONG_PTR) MinimumStackCommit;
168 #endif
169 #if (NTDDI_VERSION >= NTDDI_WS03)
170     PTR(PVOID*) FlsCallback;
171     STRUCT(LIST_ENTRY) FlsListHead;
172     PTR(PVOID) FlsBitmap;
173     ULONG FlsBitmapBits[4]; // [FLS_MAXIMUM_AVAILABLE/(sizeof(ULONG)*8)];
174     ULONG FlsHighIndex;
175 #endif
176 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
177     PTR(PVOID) WerRegistrationData;
178     PTR(PVOID) WerShipAssertPtr;
179 #endif
180 } STRUCT(PEB), *STRUCT(PPEB);
181 
182 #undef PPEB
183 
184 #ifdef _STRUCT64
185 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Mutant) == 0x08);
186 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Ldr) == 0x18);
187 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FastPebLock) == 0x038);
188 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), TlsExpansionCounter) == 0x070);
189 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), NtGlobalFlag) == 0x0BC);
190 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), GdiSharedHandleTable) == 0x0F8);
191 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), LoaderLock) == 0x110);
192 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), ImageSubsystem) == 0x128);
193 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), ImageProcessAffinityMask) == 0x138);
194 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), PostProcessInitRoutine) == 0x230);
195 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), SessionId) == 0x2C0);
196 #if (NTDDI_VERSION >= NTDDI_WS03)
197 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FlsHighIndex) == 0x350);
198 #endif
199 #else
200 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Mutant) == 0x04);
201 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Ldr) == 0x0C);
202 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FastPebLock) == 0x01C);
203 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), TlsExpansionCounter) == 0x03C);
204 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), NtGlobalFlag) == 0x068);
205 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), GdiSharedHandleTable) == 0x094);
206 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), LoaderLock) == 0x0A0);
207 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), ImageSubsystem) == 0x0B4);
208 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), ImageProcessAffinityMask) == 0x0C0);
209 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), PostProcessInitRoutine) == 0x14C);
210 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), SessionId) == 0x1D4);
211 #if (NTDDI_VERSION >= NTDDI_WS03)
212 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FlsHighIndex) == 0x22C);
213 #endif
214 #endif
215 
216 #define GDI_BATCH_BUFFER_SIZE 0x136
217 //
218 // GDI Batch Descriptor
219 //
220 typedef struct STRUCT(_GDI_TEB_BATCH)
221 {
222     ULONG Offset;
223     PTR(HANDLE) HDC;
224     ULONG Buffer[GDI_BATCH_BUFFER_SIZE];
225 } STRUCT(GDI_TEB_BATCH), *STRUCT(PGDI_TEB_BATCH);
226 
227 //
228 // Thread Environment Block (TEB)
229 //
230 typedef struct STRUCT(_TEB)
231 {
232     STRUCT(NT_TIB)         NtTib;
233     PTR(PVOID)             EnvironmentPointer;
234     STRUCT(CLIENT_ID)      ClientId;
235     PTR(PVOID)             ActiveRpcHandle;
236     PTR(PVOID)             ThreadLocalStoragePointer;
237     PTR(STRUCT(PPEB))      ProcessEnvironmentBlock;
238     ULONG                  LastErrorValue;
239     ULONG                  CountOfOwnedCriticalSections;
240     PTR(PVOID)             CsrClientThread;
241     PTR(PVOID)             Win32ThreadInfo;
242     ULONG                  User32Reserved[26];
243     ULONG                  UserReserved[5];
244     PTR(PVOID)             WOW32Reserved;
245     LCID                   CurrentLocale;
246     ULONG                  FpSoftwareStatusRegister;
247 
248 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10240.16384
249     PTR(PVOID)             ReservedForDebuggerInstrumentation[16];
250     PTR(PVOID)             SystemReserved1[38];
251 #else
252     PTR(PVOID)             SystemReserved1[54];
253 #endif
254     LONG                   ExceptionCode;
255 #ifdef _STRUCT64
256     UCHAR                  Padding0[4];
257 #endif
258 
259 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
260     PTR(PACTIVATION_CONTEXT_STACK) ActivationContextStackPointer;
261 #else
262     STRUCT(ACTIVATION_CONTEXT_STACK) ActivationContextStack;
263 #endif
264 
265 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.9926.0
266     PTR(ULONG_PTR)         InstrumentationCallbackSp;
267     PTR(ULONG_PTR)         InstrumentationCallbackPreviousPc;
268     PTR(ULONG_PTR)         InstrumentationCallbackPreviousSp;
269   #ifdef _STRUCT64
270     ULONG                  TxFsContext;
271     UCHAR                  InstrumentationCallbackDisabled;
272     UCHAR                  Padding1[3];
273   #else
274     UCHAR                  InstrumentationCallbackDisabled;
275     UCHAR                  SpareBytes[23];
276     ULONG                  TxFsContext;
277   #endif
278 #elif (NTDDI_VERSION >= NTDDI_WIN7)
279     UCHAR                  SpareBytes[_SELECT3264(36, 24)];
280     ULONG                  TxFsContext;
281 #elif (NTDDI_VERSION >= NTDDI_VISTA)
282     UCHAR                  SpareBytes1[_SELECT3264(36, 24)];
283     ULONG                  TxFsContext;
284 #elif (NTDDI_VERSION >= NTDDI_WS03SP1)
285     UCHAR                  SpareBytes1[_SELECT3264(40, 28)];
286 #else // only 32 bit version of 2k3 pre-SP1 exist
287     UCHAR                  SpareBytes1[_SELECT3264(24, -1)];
288 #endif
289 
290     STRUCT(GDI_TEB_BATCH)  GdiTebBatch;
291     STRUCT(CLIENT_ID)      RealClientId;
292     PTR(PVOID)             GdiCachedProcessHandle;
293     ULONG                  GdiClientPID;
294     ULONG                  GdiClientTID;
295     PTR(PVOID)             GdiThreadLocalInfo;
296     PTR(SIZE_T)            Win32ClientInfo[62];
297     PTR(PVOID)             glDispatchTable[233];
298     PTR(SIZE_T)            glReserved1[29];
299     PTR(PVOID)             glReserved2;
300     PTR(PVOID)             glSectionInfo;
301     PTR(PVOID)             glSection;
302     PTR(PVOID)             glTable;
303     PTR(PVOID)             glCurrentRC;
304     PTR(PVOID)             glContext;
305     ULONG                  LastStatusValue;
306 #ifdef _STRUCT64
307     UCHAR                  Padding2[4];
308 #endif
309     STRUCT(UNICODE_STRING) StaticUnicodeString;
310     WCHAR                  StaticUnicodeBuffer[261];
311 #ifdef _STRUCT64
312     UCHAR                  Padding3[6];
313 #endif
314     PTR(PVOID)             DeallocationStack;
315     PTR(PVOID)             TlsSlots[64];
316     STRUCT(LIST_ENTRY)     TlsLinks;
317     PTR(PVOID)             Vdm;
318     PTR(PVOID)             ReservedForNtRpc;
319     PTR(PVOID)             DbgSsReserved[2];
320 #if (NTDDI_VERSION >= NTDDI_WS03)
321     ULONG                  HardErrorMode;
322 #else
323     ULONG                  HardErrorsAreDisabled;
324 #endif
325 #ifdef _STRUCT64
326     UCHAR                  Padding4[4];
327 #endif
328 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
329     PTR(PVOID)             Instrumentation[13 - sizeof(GUID)/sizeof(PTR(PVOID))];
330     GUID                   ActivityId;
331     PTR(PVOID)             SubProcessTag;
332 #if (NTDDI_VERSION >= NTDDI_WIN8) // since ???
333     PTR(PVOID)             PerflibData;
334 #else
335     PTR(PVOID)             EtwLocalData;
336 #endif
337     PTR(PVOID)             EtwTraceData;
338 #elif (NTDDI_VERSION >= NTDDI_WS03)
339     PTR(PVOID)             Instrumentation[14];
340     PTR(PVOID)             SubProcessTag;
341     PTR(PVOID)             EtwTraceData;
342 #else
343     PTR(PVOID)             Instrumentation[16];
344 #endif
345     PTR(PVOID)             WinSockData;
346     ULONG                  GdiBatchCount;
347 #if (NTDDI_VERSION >= NTDDI_WIN7)
348     union
349     {
350         PROCESSOR_NUMBER   CurrentIdealProcessor;
351         ULONG32            IdealProcessorValue;
352         struct
353         {
354             UCHAR          ReservedPad0;
355             UCHAR          ReservedPad1;
356             UCHAR          ReservedPad2;
357             UCHAR          IdealProcessor;
358         };
359     };
360 #elif (NTDDI_VERSION >= NTDDI_LONGHORN)
361     BOOLEAN                SpareBool0;
362     BOOLEAN                SpareBool1;
363     BOOLEAN                SpareBool2;
364     UCHAR                  IdealProcessor;
365 #else
366     BOOLEAN                InDbgPrint;
367     BOOLEAN                FreeStackOnTermination;
368     BOOLEAN                HasFiberData;
369     UCHAR                  IdealProcessor;
370 #endif
371 #if (NTDDI_VERSION >= NTDDI_WS03)
372     ULONG                  GuaranteedStackBytes;
373 #else
374     ULONG                  Spare3;
375 #endif
376 #ifdef _STRUCT64
377     UCHAR                  Padding5[4];
378 #endif
379     PTR(PVOID)             ReservedForPerf;
380     PTR(PVOID)             ReservedForOle;
381     ULONG                  WaitingOnLoaderLock;
382 #ifdef _STRUCT64
383     UCHAR                  Padding6[4];
384 #endif
385 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
386     PTR(PVOID)             SavedPriorityState;
387 #if (NTDDI_VERSION >= NTDDI_WIN8)
388     PTR(ULONG_PTR)         ReservedForCodeCoverage;
389 #else
390     PTR(ULONG_PTR)         SoftPatchPtr1;
391 #endif
392     PTR(ULONG_PTR)         ThreadPoolData;
393 #elif (NTDDI_VERSION >= NTDDI_WS03)
394     PTR(ULONG_PTR)         SparePointer1;
395     PTR(ULONG_PTR)         SoftPatchPtr1;
396     PTR(ULONG_PTR)         SoftPatchPtr2;
397 #else
398     Wx86ThreadState        Wx86Thread;
399 #endif
400     PTR(PVOID*)            TlsExpansionSlots;
401 #ifdef _STRUCT64
402     PTR(PVOID)             DeallocationBStore;
403     PTR(PVOID)             BStoreLimit;
404 #endif
405 #if (NTDDI_VERSION >= NTDDI_WIN10)
406     ULONG                  MuiGeneration;
407 #else
408     ULONG                  ImpersonationLocale;
409 #endif
410     ULONG                  IsImpersonating;
411     PTR(PVOID)             NlsCache;
412     PTR(PVOID)             pShimData;
413 #if (NTDDI_VERSION >= NTDDI_WIN8)
414     USHORT                 HeapVirtualAffinity;
415     USHORT                 LowFragHeapDataSlot;
416 #else
417     ULONG                  HeapVirtualAffinity;
418 #endif
419 #ifdef _STRUCT64
420     UCHAR                  Padding7[4];
421 #endif
422     PTR(HANDLE)            CurrentTransactionHandle;
423     PTR(PTEB_ACTIVE_FRAME) ActiveFrame;
424 #if (NTDDI_VERSION >= NTDDI_WS03)
425     PTR(PVOID) FlsData;
426 #endif
427 
428 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
429     PTR(PVOID) PreferredLanguages;
430     PTR(PVOID) UserPrefLanguages;
431     PTR(PVOID) MergedPrefLanguages;
432     ULONG MuiImpersonation;
433     union
434     {
435         USHORT CrossTebFlags;
436         struct
437         {
438             USHORT SpareCrossTebBits:16;
439         };
440     };
441     union
442     {
443         USHORT SameTebFlags;
444         struct
445         {
446             USHORT DbgSafeThunkCall:1;
447             USHORT DbgInDebugPrint:1;
448             USHORT DbgHasFiberData:1;
449             USHORT DbgSkipThreadAttach:1;
450             USHORT DbgWerInShipAssertCode:1;
451             USHORT DbgIssuedInitialBp:1;
452             USHORT DbgClonedThread:1;
453             USHORT SpareSameTebBits:9;
454         };
455     };
456     PTR(PVOID) TxnScopeEnterCallback;
457     PTR(PVOID) TxnScopeExitCallback;
458     PTR(PVOID) TxnScopeContext;
459     ULONG LockCount;
460 #else
461     BOOLEAN SafeThunkCall;
462     BOOLEAN BooleanSpare[3];
463 #endif
464 
465 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10041.0
466     LONG WowTebOffset;
467 #elif (NTDDI_VERSION >= NTDDI_WIN7)
468     ULONG SpareUlong0;
469 #elif (NTDDI_VERSION >= NTDDI_LONGHORN)
470     ULONG ProcessRundown;
471 #endif
472 
473 #if (NTDDI_VERSION >= NTDDI_WIN7)
474     PTR(PVOID) ResourceRetValue;
475 #elif (NTDDI_VERSION >= NTDDI_LONGHORN)
476     ULONG64 LastSwitchTime;
477     ULONG64 TotalSwitchOutTime;
478     LARGE_INTEGER WaitReasonBitMap;
479 #endif
480 
481 #if (NTDDI_VERSION >= NTDDI_WIN8)
482     PTR(PVOID) ReservedForWdf;
483 #endif
484 
485 #if (NTDDI_VERSION >= NTDDI_WIN10)
486     ULONG64 ReservedForCrt;
487     GUID EffectiveContainerId;
488 #endif
489 
490 } STRUCT(TEB), *STRUCT(PTEB);
491 
492 #ifdef _STRUCT64
493 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), NtTib) == 0x000);
494 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), EnvironmentPointer) == 0x038);
495 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ExceptionCode) == 0x2C0);
496 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiTebBatch) == 0x2F0);
497 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), LastStatusValue) == 0x1250);
498 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), Vdm) == 0x1690);
499 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), HardErrorMode) == 0x16B0);
500 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiBatchCount) == 0x1740);
501 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), IdealProcessor) == 0x1747);
502 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), WaitingOnLoaderLock) == 0x1760);
503 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), TlsExpansionSlots) == 0x1780);
504 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), WaitingOnLoaderLock) == 0x1760);
505 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ActiveFrame) == 0x17C0);
506 #else
507 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), NtTib) == 0x000);
508 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), EnvironmentPointer) == 0x01C);
509 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ExceptionCode) == 0x1A4);
510 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiTebBatch) == 0x1D4);
511 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), RealClientId) == 0x6B4);
512 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), LastStatusValue) == 0xBF4);
513 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), Vdm) == 0xF18);
514 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiBatchCount) == 0xF70);
515 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), TlsExpansionSlots) == 0xF94);
516 C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ActiveFrame) == 0xFB0);
517 #endif
518 
519 #undef _STRUCT64
520 #undef _SELECT3264
521 #undef PTR
522 #undef STRUCT
523 #undef PASTE
524 #undef PASTE2
525 #undef GDI_HANDLE_BUFFER_SIZE
526