From 95827a70e66a1458898447bef455ac4af9d913d1 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 14 Aug 2017 11:02:07 +0200 Subject: [PATCH] [NDK] Fix/improve definition of TEB This also changes the default definition for NTDDI_VERSION in sdkddkver.h to NTDDI_WS03SP1, when _WIN32_WINNT is _WIN32_WINNT_WS03. --- sdk/include/ndk/peb_teb.h | 197 +++++++++++++++++++++++++++++------ sdk/include/psdk/sdkddkver.h | 4 + 2 files changed, 168 insertions(+), 33 deletions(-) diff --git a/sdk/include/ndk/peb_teb.h b/sdk/include/ndk/peb_teb.h index ba70ebc3fb0..c52b161dc70 100644 --- a/sdk/include/ndk/peb_teb.h +++ b/sdk/include/ndk/peb_teb.h @@ -1,3 +1,23 @@ +/*++ NDK Version: 0098 + +Copyright (c) Alex Ionescu. All rights reserved. + +Header Name: + + peb_teb.h + +Abstract: + + Definition of PEB/PEB32/PEB64 and TEB/TEB32/TEB64 + +Author: + + Timo Kreuzer (timo.kreuzer@reactos.org) + +--*/ + +#include + #define PASTE2(x,y) x##y #define PASTE(x,y) PASTE2(x,y) @@ -13,8 +33,12 @@ #endif #if (defined(_WIN64) && !defined(EXPLICIT_32BIT)) || defined(EXPLICIT_64BIT) + #define _STRUCT64 + #define _SELECT3264(x32, x64) (x64) #define GDI_HANDLE_BUFFER_SIZE 60 #else + #undef _STRUCT64 + #define _SELECT3264(x32, x64) (x32) #define GDI_HANDLE_BUFFER_SIZE 34 #endif @@ -157,7 +181,7 @@ typedef struct STRUCT(_PEB) #undef PPEB -#if defined(_WIN64) && !defined(EXPLICIT_32BIT) +#ifdef _STRUCT64 C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Mutant) == 0x08); C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Ldr) == 0x18); C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FastPebLock) == 0x038); @@ -220,19 +244,49 @@ typedef struct STRUCT(_TEB) PTR(PVOID) WOW32Reserved; LCID CurrentLocale; ULONG FpSoftwareStatusRegister; - PTR(PVOID) SystemReserved1[54]; - LONG ExceptionCode; -#if (NTDDI_VERSION >= NTDDI_LONGHORN) - PTR(struct _ACTIVATION_CONTEXT_STACK*) ActivationContextStackPointer; - UCHAR SpareBytes1[0x30 - 3 * sizeof(PTR(PVOID))]; - ULONG TxFsContext; -#elif (NTDDI_VERSION >= NTDDI_WS03) - PTR(struct _ACTIVATION_CONTEXT_STACK*) ActivationContextStackPointer; - UCHAR SpareBytes1[0x34 - 3 * sizeof(PTR(PVOID))]; + +#if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10240.16384 + PTR(PVOID) ReservedForDebuggerInstrumentation[16]; + PTR(PVOID) SystemReserved1[38]; #else - ACTIVATION_CONTEXT_STACK ActivationContextStack; - UCHAR SpareBytes1[24]; + PTR(PVOID) SystemReserved1[54]; #endif + LONG ExceptionCode; +#ifdef _STRUCT64 + UCHAR Padding0[4]; +#endif + +#if (NTDDI_VERSION >= NTDDI_WS03SP1) + PTR(PACTIVATION_CONTEXT_STACK) ActivationContextStackPointer; +#else + STRUCT(ACTIVATION_CONTEXT_STACK) ActivationContextStack; +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.9926.0 + PTR(ULONG_PTR) InstrumentationCallbackSp; + PTR(ULONG_PTR) InstrumentationCallbackPreviousPc; + PTR(ULONG_PTR) InstrumentationCallbackPreviousSp; + #ifdef _STRUCT64 + ULONG TxFsContext; + UCHAR InstrumentationCallbackDisabled; + UCHAR Padding1[3]; + #else + UCHAR InstrumentationCallbackDisabled; + UCHAR SpareBytes[23]; + ULONG TxFsContext; + #endif +#elif (NTDDI_VERSION >= NTDDI_WIN7) + UCHAR SpareBytes[_SELECT3264(36, 24)]; + ULONG TxFsContext; +#elif (NTDDI_VERSION >= NTDDI_VISTA) + UCHAR SpareBytes1[_SELECT3264(36, 24)]; + ULONG TxFsContext; +#elif (NTDDI_VERSION >= NTDDI_WS03SP1) + UCHAR SpareBytes1[_SELECT3264(40, 28)]; +#else // only 32 bit version of 2k3 pre-SP1 exist + UCHAR SpareBytes1[_SELECT3264(24, -1)]; +#endif + STRUCT(GDI_TEB_BATCH) GdiTebBatch; STRUCT(CLIENT_ID) RealClientId; PTR(PVOID) GdiCachedProcessHandle; @@ -248,9 +302,15 @@ typedef struct STRUCT(_TEB) PTR(PVOID) glTable; PTR(PVOID) glCurrentRC; PTR(PVOID) glContext; - NTSTATUS LastStatusValue; + ULONG LastStatusValue; +#ifdef _STRUCT64 + UCHAR Padding2[4]; +#endif STRUCT(UNICODE_STRING) StaticUnicodeString; WCHAR StaticUnicodeBuffer[261]; +#ifdef _STRUCT64 + UCHAR Padding3[6]; +#endif PTR(PVOID) DeallocationStack; PTR(PVOID) TlsSlots[64]; STRUCT(LIST_ENTRY) TlsLinks; @@ -262,42 +322,73 @@ typedef struct STRUCT(_TEB) #else ULONG HardErrorsAreDisabled; #endif +#ifdef _STRUCT64 + UCHAR Padding4[4]; +#endif #if (NTDDI_VERSION >= NTDDI_LONGHORN) PTR(PVOID) Instrumentation[13 - sizeof(GUID)/sizeof(PTR(PVOID))]; GUID ActivityId; PTR(PVOID) SubProcessTag; +#if (NTDDI_VERSION >= NTDDI_WIN8) // since ??? + PTR(PVOID) PerflibData; +#else PTR(PVOID) EtwLocalData; +#endif PTR(PVOID) EtwTraceData; #elif (NTDDI_VERSION >= NTDDI_WS03) PTR(PVOID) Instrumentation[14]; PTR(PVOID) SubProcessTag; - PTR(PVOID) EtwLocalData; + PTR(PVOID) EtwTraceData; #else PTR(PVOID) Instrumentation[16]; #endif PTR(PVOID) WinSockData; ULONG GdiBatchCount; -#if (NTDDI_VERSION >= NTDDI_LONGHORN) +#if (NTDDI_VERSION >= NTDDI_WIN10) + union + { + PROCESSOR_NUMBER CurrentIdealProcessor; + ULONG32 IdealProcessorValue; + struct + { + UCHAR ReservedPad0; + UCHAR ReservedPad1; + UCHAR ReservedPad2; + UCHAR IdealProcessor; + }; + }; +#elif (NTDDI_VERSION >= NTDDI_LONGHORN) BOOLEAN SpareBool0; BOOLEAN SpareBool1; BOOLEAN SpareBool2; + UCHAR IdealProcessor; #else BOOLEAN InDbgPrint; BOOLEAN FreeStackOnTermination; BOOLEAN HasFiberData; -#endif UCHAR IdealProcessor; +#endif #if (NTDDI_VERSION >= NTDDI_WS03) ULONG GuaranteedStackBytes; #else ULONG Spare3; +#endif +#ifdef _STRUCT64 + UCHAR Padding5[4]; #endif PTR(PVOID) ReservedForPerf; PTR(PVOID) ReservedForOle; ULONG WaitingOnLoaderLock; +#ifdef _STRUCT64 + UCHAR Padding6[4]; +#endif #if (NTDDI_VERSION >= NTDDI_LONGHORN) PTR(PVOID) SavedPriorityState; +#if (NTDDI_VERSION >= NTDDI_WIN8) + PTR(ULONG_PTR) ReservedForCodeCoverage; +#else PTR(ULONG_PTR) SoftPatchPtr1; +#endif PTR(ULONG_PTR) ThreadPoolData; #elif (NTDDI_VERSION >= NTDDI_WS03) PTR(ULONG_PTR) SparePointer1; @@ -307,35 +398,49 @@ typedef struct STRUCT(_TEB) Wx86ThreadState Wx86Thread; #endif PTR(PVOID*) TlsExpansionSlots; -#if defined(_WIN64) && !defined(EXPLICIT_32BIT) - PTR(PVOID) DeallocationBStore; - PTR(PVOID) BStoreLimit; +#ifdef _STRUCT64 + PTR(PVOID) DeallocationBStore; + PTR(PVOID) BStoreLimit; #endif +#if (NTDDI_VERSION >= NTDDI_WIN10) + ULONG MuiGeneration; +#else ULONG ImpersonationLocale; +#endif ULONG IsImpersonating; PTR(PVOID) NlsCache; PTR(PVOID) pShimData; +#if (NTDDI_VERSION >= NTDDI_WIN8) + USHORT HeapVirtualAffinity; + USHORT LowFragHeapDataSlot; +#else ULONG HeapVirtualAffinity; +#endif +#ifdef _STRUCT64 + UCHAR Padding7[4]; +#endif PTR(HANDLE) CurrentTransactionHandle; PTR(PTEB_ACTIVE_FRAME) ActiveFrame; #if (NTDDI_VERSION >= NTDDI_WS03) - PVOID FlsData; + PTR(PVOID) FlsData; #endif + #if (NTDDI_VERSION >= NTDDI_LONGHORN) - PVOID PreferredLangauges; - PVOID UserPrefLanguages; - PVOID MergedPrefLanguages; + PTR(PVOID) PreferredLanguages; + PTR(PVOID) UserPrefLanguages; + PTR(PVOID) MergedPrefLanguages; ULONG MuiImpersonation; union { + USHORT CrossTebFlags; struct { - USHORT SpareCrossTebFlags:16; + USHORT SpareCrossTebBits:16; }; - USHORT CrossTebFlags; }; union { + USHORT SameTebFlags; struct { USHORT DbgSafeThunkCall:1; @@ -347,23 +452,45 @@ typedef struct STRUCT(_TEB) USHORT DbgClonedThread:1; USHORT SpareSameTebBits:9; }; - USHORT SameTebFlags; }; - PTR(PVOID) TxnScopeEntercallback; - PTR(PVOID) TxnScopeExitCAllback; + PTR(PVOID) TxnScopeEnterCallback; + PTR(PVOID) TxnScopeExitCallback; PTR(PVOID) TxnScopeContext; ULONG LockCount; - ULONG ProcessRundown; - ULONG64 LastSwitchTime; - ULONG64 TotalSwitchOutTime; - LARGE_INTEGER WaitReasonBitMap; #else BOOLEAN SafeThunkCall; BOOLEAN BooleanSpare[3]; #endif + +#if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10041.0 + LONG WowTebOffset; +#elif (NTDDI_VERSION >= NTDDI_WIN7) + ULONG SpareUlong0; +#elif (NTDDI_VERSION >= NTDDI_LONGHORN) + ULONG ProcessRundown; +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + PTR(PVOID) ResourceRetValue; +#elif (NTDDI_VERSION >= NTDDI_LONGHORN) + ULONG64 LastSwitchTime; + ULONG64 TotalSwitchOutTime; + LARGE_INTEGER WaitReasonBitMap; +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN8) + PTR(PVOID) ReservedForWdf; +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN10) + ULONG64 ReservedForCrt; + GUID EffectiveContainerId; +#endif + } STRUCT(TEB), *STRUCT(PTEB); -#if defined(_WIN64) && !defined(EXPLICIT_32BIT) +#ifdef _STRUCT64 +C_ASSERT(FIELD_OFFSET(STRUCT(TEB), NtTib) == 0x000); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), EnvironmentPointer) == 0x038); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ExceptionCode) == 0x2C0); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiTebBatch) == 0x2F0); @@ -377,9 +504,11 @@ C_ASSERT(FIELD_OFFSET(STRUCT(TEB), TlsExpansionSlots) == 0x1780); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), WaitingOnLoaderLock) == 0x1760); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ActiveFrame) == 0x17C0); #else +C_ASSERT(FIELD_OFFSET(STRUCT(TEB), NtTib) == 0x000); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), EnvironmentPointer) == 0x01C); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ExceptionCode) == 0x1A4); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiTebBatch) == 0x1D4); +C_ASSERT(FIELD_OFFSET(STRUCT(TEB), RealClientId) == 0x6B4); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), LastStatusValue) == 0xBF4); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), Vdm) == 0xF18); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiBatchCount) == 0xF70); @@ -387,6 +516,8 @@ C_ASSERT(FIELD_OFFSET(STRUCT(TEB), TlsExpansionSlots) == 0xF94); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ActiveFrame) == 0xFB0); #endif +#undef _STRUCT64 +#undef _SELECT3264 #undef PTR #undef STRUCT #undef PASTE diff --git a/sdk/include/psdk/sdkddkver.h b/sdk/include/psdk/sdkddkver.h index 1b923a22372..58160de7d53 100644 --- a/sdk/include/psdk/sdkddkver.h +++ b/sdk/include/psdk/sdkddkver.h @@ -129,8 +129,12 @@ Abstract: #define SUBVER(Version) (((Version) & SUBVERSION_MASK)) /* Macros to get the NTDDI for a given WIN32 */ +#if (_WIN32_WINNT == _WIN32_WINNT_WS03) +#define NTDDI_VERSION_FROM_WIN32_WINNT(Version) NTDDI_WS03SP1 +#else #define NTDDI_VERSION_FROM_WIN32_WINNT2(Version) Version##0000 #define NTDDI_VERSION_FROM_WIN32_WINNT(Version) NTDDI_VERSION_FROM_WIN32_WINNT2(Version) +#endif /* Select Default _WIN32_WINNT Value */ #if !defined(_WIN32_WINNT) && !defined(_CHICAGO_)