// typedef struct _NT_TIB // see winnt.h / ntddk.h
// {
// /*000*/ struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
// /*004*/ PVOID StackBase;
// /*008*/ PVOID StackLimit;
// /*00C*/ PVOID SubSystemTib;
// /*010*/ union
// {
// /*010*/ PVOID FiberData;
// /*010*/ ULONG Version;
// };
// /*014*/ PVOID ArbitraryUserPointer;
// /*018*/ struct _NT_TIB *Self;
// /*01C*/ }
// NT_TIB,
// * PNT_TIB,
// **PPNT_TIB;
// -----------------------------------------------------------------
// located at 0x7FFDE000, 0x7FFDD000, ...
typedef struct _TEB
{
/*000*/ NT_TIB Tib;
/*01C*/ PVOID EnvironmentPointer;
/*020*/ CLIENT_ID Cid;
/*028*/ HANDLE RpcHandle;
/*02C*/ PPVOID ThreadLocalStorage;
/*030*/ PPEB Peb;
/*034*/ DWORD LastErrorValue;
/*038*/ }
TEB,
* PTEB,
**PPTEB;
#define TEB_ \
sizeof (TEB)
typedef struct _MODULE_HEADER
{
/*000*/ DWORD d000;
/*004*/ DWORD d004;
/*008*/ LIST_ENTRY List1;
/*010*/ LIST_ENTRY List2;
/*018*/ LIST_ENTRY List3;
/*020*/ }
MODULE_HEADER,
* PMODULE_HEADER,
**PPMODULE_HEADER;
#define MODULE_HEADER_ \
sizeof (MODULE_HEADER)
// -----------------------------------------------------------------
typedef struct _PROCESS_MODULE_INFO
{
/*000*/ DWORD Size; // 0x24
/*004*/ MODULE_HEADER ModuleHeader;
/*024*/ }
PROCESS_MODULE_INFO,
* PPROCESS_MODULE_INFO,
**PPPROCESS_MODULE_INFO;
#define PROCESS_MODULE_INFO_ \
sizeof (PROCESS_MODULE_INFO)
// -----------------------------------------------------------------
// see RtlCreateProcessParameters()
typedef struct _PROCESS_PARAMETERS
{
/*000*/ DWORD Allocated;
/*004*/ DWORD Size;
/*008*/ DWORD Flags; // bit 0: all pointers normalized
/*00C*/ DWORD Reserved1;
/*010*/ LONG Console;
/*014*/ DWORD ProcessGroup;
/*018*/ HANDLE StdInput;
/*01C*/ HANDLE StdOutput;
/*020*/ HANDLE StdError;
/*024*/ UNICODE_STRING WorkingDirectoryName;
/*02C*/ HANDLE WorkingDirectoryHandle;
/*030*/ UNICODE_STRING SearchPath;
/*038*/ UNICODE_STRING ImagePath;
/*040*/ UNICODE_STRING CommandLine;
/*048*/ PWORD Environment;
/*04C*/ DWORD X;
/*050*/ DWORD Y;
/*054*/ DWORD XSize;
/*058*/ DWORD YSize;
/*05C*/ DWORD XCountChars;
/*060*/ DWORD YCountChars;
/*064*/ DWORD FillAttribute;
/*068*/ DWORD Flags2;
/*06C*/ WORD ShowWindow;
/*06E*/ WORD Reserved2;
/*070*/ UNICODE_STRING Title;
/*078*/ UNICODE_STRING Desktop;
/*080*/ UNICODE_STRING Reserved3;
/*088*/ UNICODE_STRING Reserved4;
/*090*/ }
PROCESS_PARAMETERS,
* PPROCESS_PARAMETERS,
**PPPROCESS_PARAMETERS;
#define PROCESS_PARAMETERS_ \
sizeof (PROCESS_PARAMETERS)
// -----------------------------------------------------------------
typedef struct _SYSTEM_STRINGS
{
/*000*/ UNICODE_STRING SystemRoot; // d:\WINNT
/*008*/ UNICODE_STRING System32Root; // d:\WINNT\System32
/*010*/ UNICODE_STRING BaseNamedObjects; // \BaseNamedObjects
/*018*/ }
SYSTEM_STRINGS,
* PSYSTEM_STRINGS,
**PPSYSTEM_STRINGS;
#define SYSTEM_STRINGS_ \
sizeof (SYSTEM_STRINGS)
// -----------------------------------------------------------------
typedef struct _TEXT_INFO
{
/*000*/ PVOID Reserved;
/*004*/ PSYSTEM_STRINGS SystemStrings;
/*008*/ }
TEXT_INFO,
* PTEXT_INFO,
**PPTEXT_INFO;
#define TEXT_INFO_ \
sizeof (TEXT_INFO)
// -----------------------------------------------------------------
// located at 0x7FFDF000
typedef struct _PEB
{
/*000*/ BOOLEAN InheritedAddressSpace;
/*001*/ BOOLEAN ReadImageFileExecOptions;
/*002*/ BOOLEAN BeingDebugged;
/*003*/ BYTE b003;
/*004*/ DWORD d004;
/*008*/ PVOID SectionBaseAddress;
/*00C*/ PPROCESS_MODULE_INFO ProcessModuleInfo;
/*010*/ PPROCESS_PARAMETERS ProcessParameters;
/*014*/ DWORD SubSystemData;
/*018*/ HANDLE ProcessHeap;
/*01C*/ PCRITICAL_SECTION FastPebLock;
/*020*/ PVOID AcquireFastPebLock; // function
/*024*/ PVOID ReleaseFastPebLock; // function
/*028*/ DWORD d028;
/*02C*/ PPVOID User32Dispatch; // function
/*030*/ DWORD d030;
/*034*/ DWORD d034;
/*038*/ DWORD d038;
/*03C*/ DWORD TlsBitMapSize; // number of bits
/*040*/ PRTL_BITMAP TlsBitMap; // ntdll!TlsBitMap
/*044*/ DWORD TlsBitMapData [2]; // 64 bits
/*04C*/ PVOID p04C;
/*050*/ PVOID p050;
/*054*/ PTEXT_INFO TextInfo;
/*058*/ PVOID InitAnsiCodePageData;
/*05C*/ PVOID InitOemCodePageData;
/*060*/ PVOID InitUnicodeCaseTableData;
/*064*/ DWORD KeNumberProcessors;
/*068*/ DWORD NtGlobalFlag;
/*06C*/ DWORD d6C;
/*070*/ LARGE_INTEGER MmCriticalSectionTimeout;
/*078*/ DWORD MmHeapSegmentReserve;
/*07C*/ DWORD MmHeapSegmentCommit;
/*080*/ DWORD MmHeapDeCommitTotalFreeThreshold;
/*084*/ DWORD MmHeapDeCommitFreeBlockThreshold;
/*088*/ DWORD NumberOfHeaps;
/*08C*/ DWORD AvailableHeaps; // 16, *2 if exhausted
/*090*/ PHANDLE ProcessHeapsListBuffer;
/*094*/ DWORD d094;
/*098*/ DWORD d098;
/*09C*/ DWORD d09C;
/*0A0*/ PCRITICAL_SECTION LoaderLock;
/*0A4*/ DWORD NtMajorVersion;
/*0A8*/ DWORD NtMinorVersion;
/*0AC*/ WORD NtBuildNumber;
/*0AE*/ WORD CmNtCSDVersion;
/*0B0*/ DWORD PlatformId;
/*0B4*/ DWORD Subsystem;
/*0B8*/ DWORD MajorSubsystemVersion;
/*0BC*/ DWORD MinorSubsystemVersion;
/*0C0*/ KAFFINITY AffinityMask;
/*0C4*/ DWORD ad0C4 [35];
/*150*/ PVOID p150;
/*154*/ DWORD ad154 [32];
/*1D4*/ HANDLE Win32WindowStation;
/*1D8*/ DWORD d1D8;
/*1DC*/ DWORD d1DC;
/*1E0*/ PWORD CSDVersion;
/*1E4*/ DWORD d1E4;
/*1E8*/ }
PEB,
* PPEB,
**PPPEB;
#define PEB_ \
sizeof (PEB)