[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.
This commit is contained in:
Timo Kreuzer 2017-08-14 11:02:07 +02:00
parent 30cd606fe2
commit 95827a70e6
2 changed files with 168 additions and 33 deletions

View file

@ -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 <rtltypes.h>
#define PASTE2(x,y) x##y #define PASTE2(x,y) x##y
#define PASTE(x,y) PASTE2(x,y) #define PASTE(x,y) PASTE2(x,y)
@ -13,8 +33,12 @@
#endif #endif
#if (defined(_WIN64) && !defined(EXPLICIT_32BIT)) || defined(EXPLICIT_64BIT) #if (defined(_WIN64) && !defined(EXPLICIT_32BIT)) || defined(EXPLICIT_64BIT)
#define _STRUCT64
#define _SELECT3264(x32, x64) (x64)
#define GDI_HANDLE_BUFFER_SIZE 60 #define GDI_HANDLE_BUFFER_SIZE 60
#else #else
#undef _STRUCT64
#define _SELECT3264(x32, x64) (x32)
#define GDI_HANDLE_BUFFER_SIZE 34 #define GDI_HANDLE_BUFFER_SIZE 34
#endif #endif
@ -157,7 +181,7 @@ typedef struct STRUCT(_PEB)
#undef PPEB #undef PPEB
#if defined(_WIN64) && !defined(EXPLICIT_32BIT) #ifdef _STRUCT64
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Mutant) == 0x08); C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Mutant) == 0x08);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Ldr) == 0x18); C_ASSERT(FIELD_OFFSET(STRUCT(PEB), Ldr) == 0x18);
C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FastPebLock) == 0x038); C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FastPebLock) == 0x038);
@ -220,19 +244,49 @@ typedef struct STRUCT(_TEB)
PTR(PVOID) WOW32Reserved; PTR(PVOID) WOW32Reserved;
LCID CurrentLocale; LCID CurrentLocale;
ULONG FpSoftwareStatusRegister; ULONG FpSoftwareStatusRegister;
PTR(PVOID) SystemReserved1[54];
LONG ExceptionCode; #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10240.16384
#if (NTDDI_VERSION >= NTDDI_LONGHORN) PTR(PVOID) ReservedForDebuggerInstrumentation[16];
PTR(struct _ACTIVATION_CONTEXT_STACK*) ActivationContextStackPointer; PTR(PVOID) SystemReserved1[38];
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))];
#else #else
ACTIVATION_CONTEXT_STACK ActivationContextStack; PTR(PVOID) SystemReserved1[54];
UCHAR SpareBytes1[24];
#endif #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(GDI_TEB_BATCH) GdiTebBatch;
STRUCT(CLIENT_ID) RealClientId; STRUCT(CLIENT_ID) RealClientId;
PTR(PVOID) GdiCachedProcessHandle; PTR(PVOID) GdiCachedProcessHandle;
@ -248,9 +302,15 @@ typedef struct STRUCT(_TEB)
PTR(PVOID) glTable; PTR(PVOID) glTable;
PTR(PVOID) glCurrentRC; PTR(PVOID) glCurrentRC;
PTR(PVOID) glContext; PTR(PVOID) glContext;
NTSTATUS LastStatusValue; ULONG LastStatusValue;
#ifdef _STRUCT64
UCHAR Padding2[4];
#endif
STRUCT(UNICODE_STRING) StaticUnicodeString; STRUCT(UNICODE_STRING) StaticUnicodeString;
WCHAR StaticUnicodeBuffer[261]; WCHAR StaticUnicodeBuffer[261];
#ifdef _STRUCT64
UCHAR Padding3[6];
#endif
PTR(PVOID) DeallocationStack; PTR(PVOID) DeallocationStack;
PTR(PVOID) TlsSlots[64]; PTR(PVOID) TlsSlots[64];
STRUCT(LIST_ENTRY) TlsLinks; STRUCT(LIST_ENTRY) TlsLinks;
@ -262,42 +322,73 @@ typedef struct STRUCT(_TEB)
#else #else
ULONG HardErrorsAreDisabled; ULONG HardErrorsAreDisabled;
#endif #endif
#ifdef _STRUCT64
UCHAR Padding4[4];
#endif
#if (NTDDI_VERSION >= NTDDI_LONGHORN) #if (NTDDI_VERSION >= NTDDI_LONGHORN)
PTR(PVOID) Instrumentation[13 - sizeof(GUID)/sizeof(PTR(PVOID))]; PTR(PVOID) Instrumentation[13 - sizeof(GUID)/sizeof(PTR(PVOID))];
GUID ActivityId; GUID ActivityId;
PTR(PVOID) SubProcessTag; PTR(PVOID) SubProcessTag;
#if (NTDDI_VERSION >= NTDDI_WIN8) // since ???
PTR(PVOID) PerflibData;
#else
PTR(PVOID) EtwLocalData; PTR(PVOID) EtwLocalData;
#endif
PTR(PVOID) EtwTraceData; PTR(PVOID) EtwTraceData;
#elif (NTDDI_VERSION >= NTDDI_WS03) #elif (NTDDI_VERSION >= NTDDI_WS03)
PTR(PVOID) Instrumentation[14]; PTR(PVOID) Instrumentation[14];
PTR(PVOID) SubProcessTag; PTR(PVOID) SubProcessTag;
PTR(PVOID) EtwLocalData; PTR(PVOID) EtwTraceData;
#else #else
PTR(PVOID) Instrumentation[16]; PTR(PVOID) Instrumentation[16];
#endif #endif
PTR(PVOID) WinSockData; PTR(PVOID) WinSockData;
ULONG GdiBatchCount; 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 SpareBool0;
BOOLEAN SpareBool1; BOOLEAN SpareBool1;
BOOLEAN SpareBool2; BOOLEAN SpareBool2;
UCHAR IdealProcessor;
#else #else
BOOLEAN InDbgPrint; BOOLEAN InDbgPrint;
BOOLEAN FreeStackOnTermination; BOOLEAN FreeStackOnTermination;
BOOLEAN HasFiberData; BOOLEAN HasFiberData;
#endif
UCHAR IdealProcessor; UCHAR IdealProcessor;
#endif
#if (NTDDI_VERSION >= NTDDI_WS03) #if (NTDDI_VERSION >= NTDDI_WS03)
ULONG GuaranteedStackBytes; ULONG GuaranteedStackBytes;
#else #else
ULONG Spare3; ULONG Spare3;
#endif
#ifdef _STRUCT64
UCHAR Padding5[4];
#endif #endif
PTR(PVOID) ReservedForPerf; PTR(PVOID) ReservedForPerf;
PTR(PVOID) ReservedForOle; PTR(PVOID) ReservedForOle;
ULONG WaitingOnLoaderLock; ULONG WaitingOnLoaderLock;
#ifdef _STRUCT64
UCHAR Padding6[4];
#endif
#if (NTDDI_VERSION >= NTDDI_LONGHORN) #if (NTDDI_VERSION >= NTDDI_LONGHORN)
PTR(PVOID) SavedPriorityState; PTR(PVOID) SavedPriorityState;
#if (NTDDI_VERSION >= NTDDI_WIN8)
PTR(ULONG_PTR) ReservedForCodeCoverage;
#else
PTR(ULONG_PTR) SoftPatchPtr1; PTR(ULONG_PTR) SoftPatchPtr1;
#endif
PTR(ULONG_PTR) ThreadPoolData; PTR(ULONG_PTR) ThreadPoolData;
#elif (NTDDI_VERSION >= NTDDI_WS03) #elif (NTDDI_VERSION >= NTDDI_WS03)
PTR(ULONG_PTR) SparePointer1; PTR(ULONG_PTR) SparePointer1;
@ -307,35 +398,49 @@ typedef struct STRUCT(_TEB)
Wx86ThreadState Wx86Thread; Wx86ThreadState Wx86Thread;
#endif #endif
PTR(PVOID*) TlsExpansionSlots; PTR(PVOID*) TlsExpansionSlots;
#if defined(_WIN64) && !defined(EXPLICIT_32BIT) #ifdef _STRUCT64
PTR(PVOID) DeallocationBStore; PTR(PVOID) DeallocationBStore;
PTR(PVOID) BStoreLimit; PTR(PVOID) BStoreLimit;
#endif #endif
#if (NTDDI_VERSION >= NTDDI_WIN10)
ULONG MuiGeneration;
#else
ULONG ImpersonationLocale; ULONG ImpersonationLocale;
#endif
ULONG IsImpersonating; ULONG IsImpersonating;
PTR(PVOID) NlsCache; PTR(PVOID) NlsCache;
PTR(PVOID) pShimData; PTR(PVOID) pShimData;
#if (NTDDI_VERSION >= NTDDI_WIN8)
USHORT HeapVirtualAffinity;
USHORT LowFragHeapDataSlot;
#else
ULONG HeapVirtualAffinity; ULONG HeapVirtualAffinity;
#endif
#ifdef _STRUCT64
UCHAR Padding7[4];
#endif
PTR(HANDLE) CurrentTransactionHandle; PTR(HANDLE) CurrentTransactionHandle;
PTR(PTEB_ACTIVE_FRAME) ActiveFrame; PTR(PTEB_ACTIVE_FRAME) ActiveFrame;
#if (NTDDI_VERSION >= NTDDI_WS03) #if (NTDDI_VERSION >= NTDDI_WS03)
PVOID FlsData; PTR(PVOID) FlsData;
#endif #endif
#if (NTDDI_VERSION >= NTDDI_LONGHORN) #if (NTDDI_VERSION >= NTDDI_LONGHORN)
PVOID PreferredLangauges; PTR(PVOID) PreferredLanguages;
PVOID UserPrefLanguages; PTR(PVOID) UserPrefLanguages;
PVOID MergedPrefLanguages; PTR(PVOID) MergedPrefLanguages;
ULONG MuiImpersonation; ULONG MuiImpersonation;
union union
{ {
USHORT CrossTebFlags;
struct struct
{ {
USHORT SpareCrossTebFlags:16; USHORT SpareCrossTebBits:16;
}; };
USHORT CrossTebFlags;
}; };
union union
{ {
USHORT SameTebFlags;
struct struct
{ {
USHORT DbgSafeThunkCall:1; USHORT DbgSafeThunkCall:1;
@ -347,23 +452,45 @@ typedef struct STRUCT(_TEB)
USHORT DbgClonedThread:1; USHORT DbgClonedThread:1;
USHORT SpareSameTebBits:9; USHORT SpareSameTebBits:9;
}; };
USHORT SameTebFlags;
}; };
PTR(PVOID) TxnScopeEntercallback; PTR(PVOID) TxnScopeEnterCallback;
PTR(PVOID) TxnScopeExitCAllback; PTR(PVOID) TxnScopeExitCallback;
PTR(PVOID) TxnScopeContext; PTR(PVOID) TxnScopeContext;
ULONG LockCount; ULONG LockCount;
ULONG ProcessRundown;
ULONG64 LastSwitchTime;
ULONG64 TotalSwitchOutTime;
LARGE_INTEGER WaitReasonBitMap;
#else #else
BOOLEAN SafeThunkCall; BOOLEAN SafeThunkCall;
BOOLEAN BooleanSpare[3]; BOOLEAN BooleanSpare[3];
#endif #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); } 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), EnvironmentPointer) == 0x038);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ExceptionCode) == 0x2C0); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ExceptionCode) == 0x2C0);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiTebBatch) == 0x2F0); 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), WaitingOnLoaderLock) == 0x1760);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ActiveFrame) == 0x17C0); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ActiveFrame) == 0x17C0);
#else #else
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), NtTib) == 0x000);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), EnvironmentPointer) == 0x01C); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), EnvironmentPointer) == 0x01C);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ExceptionCode) == 0x1A4); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ExceptionCode) == 0x1A4);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiTebBatch) == 0x1D4); 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), LastStatusValue) == 0xBF4);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), Vdm) == 0xF18); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), Vdm) == 0xF18);
C_ASSERT(FIELD_OFFSET(STRUCT(TEB), GdiBatchCount) == 0xF70); 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); C_ASSERT(FIELD_OFFSET(STRUCT(TEB), ActiveFrame) == 0xFB0);
#endif #endif
#undef _STRUCT64
#undef _SELECT3264
#undef PTR #undef PTR
#undef STRUCT #undef STRUCT
#undef PASTE #undef PASTE

View file

@ -129,8 +129,12 @@ Abstract:
#define SUBVER(Version) (((Version) & SUBVERSION_MASK)) #define SUBVER(Version) (((Version) & SUBVERSION_MASK))
/* Macros to get the NTDDI for a given WIN32 */ /* 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_WINNT2(Version) Version##0000
#define NTDDI_VERSION_FROM_WIN32_WINNT(Version) NTDDI_VERSION_FROM_WIN32_WINNT2(Version) #define NTDDI_VERSION_FROM_WIN32_WINNT(Version) NTDDI_VERSION_FROM_WIN32_WINNT2(Version)
#endif
/* Select Default _WIN32_WINNT Value */ /* Select Default _WIN32_WINNT Value */
#if !defined(_WIN32_WINNT) && !defined(_CHICAGO_) #if !defined(_WIN32_WINNT) && !defined(_CHICAGO_)