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_WIN10) 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