1*b1cdbd2cSJim Jagielski #pragma once 2*b1cdbd2cSJim Jagielski // ************************************************************* 3*b1cdbd2cSJim Jagielski // 4*b1cdbd2cSJim Jagielski // Licensed to the Apache Software Foundation (ASF) under one 5*b1cdbd2cSJim Jagielski // or more contributor license agreements. See the NOTICE file 6*b1cdbd2cSJim Jagielski // distributed with this work for additional information 7*b1cdbd2cSJim Jagielski // regarding copyright ownership. The ASF licenses this file 8*b1cdbd2cSJim Jagielski // to you under the Apache License, Version 2.0 (the 9*b1cdbd2cSJim Jagielski // "License"); you may not use this file except in compliance 10*b1cdbd2cSJim Jagielski // with the License. You may obtain a copy of the License at 11*b1cdbd2cSJim Jagielski // 12*b1cdbd2cSJim Jagielski // http://www.apache.org/licenses/LICENSE-2.0 13*b1cdbd2cSJim Jagielski // 14*b1cdbd2cSJim Jagielski // Unless required by applicable law or agreed to in writing, 15*b1cdbd2cSJim Jagielski // software distributed under the License is distributed on an 16*b1cdbd2cSJim Jagielski // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17*b1cdbd2cSJim Jagielski // KIND, either express or implied. See the License for the 18*b1cdbd2cSJim Jagielski // specific language governing permissions and limitations 19*b1cdbd2cSJim Jagielski // under the License. 20*b1cdbd2cSJim Jagielski // 21*b1cdbd2cSJim Jagielski // ************************************************************* 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski //Kernel32 objects 24*b1cdbd2cSJim Jagielski 25*b1cdbd2cSJim Jagielski #define K32OBJ_SEMAPHORE 0x1 26*b1cdbd2cSJim Jagielski #define K32OBJ_EVENT 0x2 27*b1cdbd2cSJim Jagielski #define K32OBJ_MUTEX 0x3 28*b1cdbd2cSJim Jagielski #define K32OBJ_CRITICAL_SECTION 0x4 29*b1cdbd2cSJim Jagielski #define K32OBJ_PROCESS 0x5 30*b1cdbd2cSJim Jagielski #define K32OBJ_THREAD 0x6 31*b1cdbd2cSJim Jagielski #define K32OBJ_FILE 0x7 32*b1cdbd2cSJim Jagielski #define K32OBJ_CHANGE 0x8 33*b1cdbd2cSJim Jagielski #define K32OBJ_CONSOLE 0x9 34*b1cdbd2cSJim Jagielski #define K32OBJ_SCREEN_BUFFER 0xA 35*b1cdbd2cSJim Jagielski #define K32OBJ_MEM_MAPPED_FILE 0xB 36*b1cdbd2cSJim Jagielski #define K32OBJ_SERIAL 0xC 37*b1cdbd2cSJim Jagielski #define K32OBJ_DEVICE_IOCTL 0xD 38*b1cdbd2cSJim Jagielski #define K32OBJ_PIPE 0xE 39*b1cdbd2cSJim Jagielski #define K32OBJ_MAILSLOT 0xF 40*b1cdbd2cSJim Jagielski #define K32OBJ_TOOLHELP_SNAPSHOT 0x10 41*b1cdbd2cSJim Jagielski #define K32OBJ_SOCKET 0x11 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski //Process Database flags 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski #define fDebugSingle 0x00000001 47*b1cdbd2cSJim Jagielski #define fCreateProcessEvent 0x00000002 48*b1cdbd2cSJim Jagielski #define fExitProcessEvent 0x00000004 49*b1cdbd2cSJim Jagielski #define fWin16Process 0x00000008 50*b1cdbd2cSJim Jagielski #define fDosProcess 0x00000010 51*b1cdbd2cSJim Jagielski #define fConsoleProcess 0x00000020 52*b1cdbd2cSJim Jagielski #define fFileApisAreOem 0x00000040 53*b1cdbd2cSJim Jagielski #define fNukeProcess 0x00000080 54*b1cdbd2cSJim Jagielski #define fServiceProcess 0x00000100 55*b1cdbd2cSJim Jagielski #define fLoginScriptHack 0x00000800 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski //Thread Database flags 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski #define fCreateThreadEvent 0x00000001 61*b1cdbd2cSJim Jagielski #define fCancelExceptionAbort 0x00000002 62*b1cdbd2cSJim Jagielski #define fOnTempStack 0x00000004 63*b1cdbd2cSJim Jagielski #define fGrowableStack 0x00000008 64*b1cdbd2cSJim Jagielski #define fDelaySingleStep 0x00000010 65*b1cdbd2cSJim Jagielski #define fOpenExeAsImmovableFile 0x00000020 66*b1cdbd2cSJim Jagielski #define fCreateSuspended 0x00000040 67*b1cdbd2cSJim Jagielski #define fStackOverflow 0x00000080 68*b1cdbd2cSJim Jagielski #define fNestedCleanAPCs 0x00000100 69*b1cdbd2cSJim Jagielski #define fWasOemNowAnsi 0x00000200 70*b1cdbd2cSJim Jagielski #define fOKToSetThreadOem 0x00000400 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski #ifdef _MSC_VER 73*b1cdbd2cSJim Jagielski #pragma warning(disable:4103) 74*b1cdbd2cSJim Jagielski #endif 75*b1cdbd2cSJim Jagielski #pragma pack(1) 76*b1cdbd2cSJim Jagielski 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski //MODREF and IMTE structures 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski typedef struct _MODREF { 81*b1cdbd2cSJim Jagielski struct _MODREF *pNextModRef; // 00h 82*b1cdbd2cSJim Jagielski DWORD un1; // 04h 83*b1cdbd2cSJim Jagielski DWORD un2; // 08h 84*b1cdbd2cSJim Jagielski DWORD un3; // 0Ch 85*b1cdbd2cSJim Jagielski WORD mteIndex; // 10h 86*b1cdbd2cSJim Jagielski WORD un4; // 12h 87*b1cdbd2cSJim Jagielski DWORD un5; // 14h 88*b1cdbd2cSJim Jagielski PVOID ppdb; // 18h Pointer to process database 89*b1cdbd2cSJim Jagielski DWORD un6; // 1Ch 90*b1cdbd2cSJim Jagielski DWORD un7; // 20h 91*b1cdbd2cSJim Jagielski DWORD un8; // 24h 92*b1cdbd2cSJim Jagielski } MODREF, *PMODREF; 93*b1cdbd2cSJim Jagielski 94*b1cdbd2cSJim Jagielski typedef struct _IMTE { 95*b1cdbd2cSJim Jagielski DWORD un1; // 00h 96*b1cdbd2cSJim Jagielski PIMAGE_NT_HEADERS pNTHdr; // 04h 97*b1cdbd2cSJim Jagielski DWORD un2; // 08h 98*b1cdbd2cSJim Jagielski PSTR pszFileName; // 0Ch 99*b1cdbd2cSJim Jagielski PSTR pszModName; // 10h 100*b1cdbd2cSJim Jagielski WORD cbFileName; // 14h 101*b1cdbd2cSJim Jagielski WORD cbModName; // 16h 102*b1cdbd2cSJim Jagielski DWORD un3; // 18h 103*b1cdbd2cSJim Jagielski DWORD cSections; // 1Ch 104*b1cdbd2cSJim Jagielski DWORD un5; // 20h 105*b1cdbd2cSJim Jagielski DWORD baseAddress; // 24h 106*b1cdbd2cSJim Jagielski WORD hModule16; // 28h 107*b1cdbd2cSJim Jagielski WORD cUsage; // 2Ah 108*b1cdbd2cSJim Jagielski DWORD un7; // 2Ch 109*b1cdbd2cSJim Jagielski PSTR pszFileName2; // 30h 110*b1cdbd2cSJim Jagielski WORD cbFileName2; // 34h 111*b1cdbd2cSJim Jagielski DWORD pszModName2; // 36h 112*b1cdbd2cSJim Jagielski WORD cbModName2; // 3Ah 113*b1cdbd2cSJim Jagielski } IMTE, *PIMTE; 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski //Process Database structure 117*b1cdbd2cSJim Jagielski 118*b1cdbd2cSJim Jagielski typedef struct _ENVIRONMENT_DATABASE { 119*b1cdbd2cSJim Jagielski PSTR pszEnvironment; // 00h Pointer to Environment 120*b1cdbd2cSJim Jagielski DWORD un1; // 04h 121*b1cdbd2cSJim Jagielski PSTR pszCmdLine; // 08h Pointer to command line 122*b1cdbd2cSJim Jagielski PSTR pszCurrDirectory; // 0Ch Pointer to current directory 123*b1cdbd2cSJim Jagielski LPSTARTUPINFOA pStartupInfo;// 10h Pointer to STARTUPINFOA struct 124*b1cdbd2cSJim Jagielski HANDLE hStdIn; // 14h Standard Input 125*b1cdbd2cSJim Jagielski HANDLE hStdOut; // 18h Standard Output 126*b1cdbd2cSJim Jagielski HANDLE hStdErr; // 1Ch Standard Error 127*b1cdbd2cSJim Jagielski DWORD un2; // 20h 128*b1cdbd2cSJim Jagielski DWORD InheritConsole; // 24h 129*b1cdbd2cSJim Jagielski DWORD BreakType; // 28h 130*b1cdbd2cSJim Jagielski DWORD BreakSem; // 2Ch 131*b1cdbd2cSJim Jagielski DWORD BreakEvent; // 30h 132*b1cdbd2cSJim Jagielski DWORD BreakThreadID; // 34h 133*b1cdbd2cSJim Jagielski DWORD BreakHandlers; // 38h 134*b1cdbd2cSJim Jagielski } ENVIRONMENT_DATABASE, *PENVIRONMENT_DATABASE; 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski typedef struct _KERNEL_OBJECT { 137*b1cdbd2cSJim Jagielski DWORD Type; // 00h KERNEL32 object type (5) 138*b1cdbd2cSJim Jagielski DWORD cReference; // 04h Number of references to process 139*b1cdbd2cSJim Jagielski } KERNEL_OBJECT, *PKERNEL_OBJECT; 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski typedef struct _HANDLE_TABLE_ENTRY { 142*b1cdbd2cSJim Jagielski DWORD flags; // Valid flags depend on what type of object this is 143*b1cdbd2cSJim Jagielski PKERNEL_OBJECT pObject; // Pointer to the object that the handle refers to 144*b1cdbd2cSJim Jagielski } HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY; 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski typedef struct _HANDLE_TABLE { 147*b1cdbd2cSJim Jagielski DWORD cEntries; // Max number of handles in table 148*b1cdbd2cSJim Jagielski HANDLE_TABLE_ENTRY array[1]; // An array (number is given by cEntries) 149*b1cdbd2cSJim Jagielski } HANDLE_TABLE, *PHANDLE_TABLE; 150*b1cdbd2cSJim Jagielski 151*b1cdbd2cSJim Jagielski 152*b1cdbd2cSJim Jagielski typedef struct _PROCESS_DATABASE { 153*b1cdbd2cSJim Jagielski DWORD Type; // 00h KERNEL32 object type (5) 154*b1cdbd2cSJim Jagielski DWORD cReference; // 04h Number of references to process 155*b1cdbd2cSJim Jagielski DWORD un1; // 08h 156*b1cdbd2cSJim Jagielski DWORD someEvent; // 0Ch An event object (What's it used for???) 157*b1cdbd2cSJim Jagielski DWORD TerminationStatus; // 10h Returned by GetExitCodeProcess 158*b1cdbd2cSJim Jagielski DWORD un2; // 14h 159*b1cdbd2cSJim Jagielski DWORD DefaultHeap; // 18h Address of the process heap 160*b1cdbd2cSJim Jagielski DWORD MemoryContext; // 1Ch pointer to the process's context 161*b1cdbd2cSJim Jagielski DWORD flags; // 20h 162*b1cdbd2cSJim Jagielski // 0x00000001 - fDebugSingle 163*b1cdbd2cSJim Jagielski // 0x00000002 - fCreateProcessEvent 164*b1cdbd2cSJim Jagielski // 0x00000004 - fExitProcessEvent 165*b1cdbd2cSJim Jagielski // 0x00000008 - fWin16Process 166*b1cdbd2cSJim Jagielski // 0x00000010 - fDosProcess 167*b1cdbd2cSJim Jagielski // 0x00000020 - fConsoleProcess 168*b1cdbd2cSJim Jagielski // 0x00000040 - fFileApisAreOem 169*b1cdbd2cSJim Jagielski // 0x00000080 - fNukeProcess 170*b1cdbd2cSJim Jagielski // 0x00000100 - fServiceProcess 171*b1cdbd2cSJim Jagielski // 0x00000800 - fLoginScriptHack 172*b1cdbd2cSJim Jagielski DWORD pPSP; // 24h Linear address of PSP? 173*b1cdbd2cSJim Jagielski WORD PSPSelector; // 28h 174*b1cdbd2cSJim Jagielski WORD MTEIndex; // 2Ah 175*b1cdbd2cSJim Jagielski WORD cThreads; // 2Ch 176*b1cdbd2cSJim Jagielski WORD cNotTermThreads; // 2Eh 177*b1cdbd2cSJim Jagielski WORD un3; // 30h 178*b1cdbd2cSJim Jagielski WORD cRing0Threads; // 32h number of ring 0 threads 179*b1cdbd2cSJim Jagielski HANDLE HeapHandle; // 34h Heap to allocate handle tables out of 180*b1cdbd2cSJim Jagielski // This seems to always be the KERNEL32 heap 181*b1cdbd2cSJim Jagielski HTASK W16TDB; // 38h Win16 Task Database selector 182*b1cdbd2cSJim Jagielski DWORD MemMapFiles; // 3Ch memory mapped file list (?) 183*b1cdbd2cSJim Jagielski PENVIRONMENT_DATABASE pEDB; // 40h Pointer to Environment Database 184*b1cdbd2cSJim Jagielski PHANDLE_TABLE pHandleTable; // 44h Pointer to process handle table 185*b1cdbd2cSJim Jagielski struct _PROCESS_DATABASE *ParentPDB; // 48h Parent process database 186*b1cdbd2cSJim Jagielski PMODREF MODREFlist; // 4Ch Module reference list 187*b1cdbd2cSJim Jagielski DWORD ThreadList; // 50h Threads in this process 188*b1cdbd2cSJim Jagielski DWORD DebuggeeCB; // 54h Debuggee Context block? 189*b1cdbd2cSJim Jagielski DWORD LocalHeapFreeHead; // 58h Head of free list in process heap 190*b1cdbd2cSJim Jagielski DWORD InitialRing0ID; // 5Ch 191*b1cdbd2cSJim Jagielski CRITICAL_SECTION crst; // 60h 192*b1cdbd2cSJim Jagielski DWORD un4[3]; // 78h 193*b1cdbd2cSJim Jagielski DWORD pConsole; // 84h Pointer to console for process 194*b1cdbd2cSJim Jagielski DWORD tlsInUseBits1; // 88h // Represents TLS indices 0 - 31 195*b1cdbd2cSJim Jagielski DWORD tlsInUseBits2; // 8Ch // Represents TLS indices 32 - 63 196*b1cdbd2cSJim Jagielski DWORD ProcessDWORD; // 90h 197*b1cdbd2cSJim Jagielski struct _PROCESS_DATABASE *ProcessGroup; // 94h 198*b1cdbd2cSJim Jagielski DWORD pExeMODREF; // 98h pointer to EXE's MODREF 199*b1cdbd2cSJim Jagielski DWORD TopExcFilter; // 9Ch Top Exception Filter? 200*b1cdbd2cSJim Jagielski DWORD BasePriority; // A0h Base scheduling priority for process 201*b1cdbd2cSJim Jagielski DWORD HeapOwnList; // A4h Head of the list of process heaps 202*b1cdbd2cSJim Jagielski DWORD HeapHandleBlockList;// A8h Pointer to head of heap handle block list 203*b1cdbd2cSJim Jagielski DWORD pSomeHeapPtr; // ACh normally zero, but can a pointer to a 204*b1cdbd2cSJim Jagielski // moveable handle block in the heap 205*b1cdbd2cSJim Jagielski DWORD pConsoleProvider; // B0h Process that owns the console we're using? 206*b1cdbd2cSJim Jagielski WORD EnvironSelector; // B4h Selector containing process environment 207*b1cdbd2cSJim Jagielski WORD ErrorMode; // B6H SetErrorMode value (also thunks to Win16) 208*b1cdbd2cSJim Jagielski DWORD pevtLoadFinished; // B8h Pointer to event LoadFinished? 209*b1cdbd2cSJim Jagielski WORD UTState; // BCh 210*b1cdbd2cSJim Jagielski } PROCESS_DATABASE, *PPROCESS_DATABASE; 211*b1cdbd2cSJim Jagielski 212*b1cdbd2cSJim Jagielski 213*b1cdbd2cSJim Jagielski //TIB (Thread Information Block) structure 214*b1cdbd2cSJim Jagielski 215*b1cdbd2cSJim Jagielski typedef struct _SEH_record { 216*b1cdbd2cSJim Jagielski struct _SEH_record *pNext; 217*b1cdbd2cSJim Jagielski FARPROC pfnHandler; 218*b1cdbd2cSJim Jagielski } SEH_record, *PSEH_record; 219*b1cdbd2cSJim Jagielski 220*b1cdbd2cSJim Jagielski // This is semi-documented in the NTDDK.H file from the NT DDK 221*b1cdbd2cSJim Jagielski typedef struct _TIB { 222*b1cdbd2cSJim Jagielski PSEH_record pvExcept; // 00h Head of exception record list 223*b1cdbd2cSJim Jagielski PVOID pvStackUserTop; // 04h Top of user stack 224*b1cdbd2cSJim Jagielski PVOID pvStackUserBase; // 08h Base of user stack 225*b1cdbd2cSJim Jagielski WORD pvTDB; // 0Ch TDB 226*b1cdbd2cSJim Jagielski WORD pvThunksSS; // 0Eh SS selector used for thunking to 16 bits 227*b1cdbd2cSJim Jagielski DWORD SelmanList; // 10h 228*b1cdbd2cSJim Jagielski PVOID pvArbitrary; // 14h Available for application use 229*b1cdbd2cSJim Jagielski struct _tib *ptibSelf; // 18h Linear address of TIB structure 230*b1cdbd2cSJim Jagielski WORD TIBFlags; // 1Ch 231*b1cdbd2cSJim Jagielski WORD Win16MutexCount; // 1Eh 232*b1cdbd2cSJim Jagielski DWORD DebugContext; // 20h 233*b1cdbd2cSJim Jagielski DWORD pCurrentPriority; // 24h 234*b1cdbd2cSJim Jagielski DWORD pvQueue; // 28h Message Queue selector 235*b1cdbd2cSJim Jagielski PVOID *pvTLSArray; // 2Ch Thread Local Storage array 236*b1cdbd2cSJim Jagielski } TIB, *PTIB; 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski 239*b1cdbd2cSJim Jagielski //TDBX structure 240*b1cdbd2cSJim Jagielski 241*b1cdbd2cSJim Jagielski typedef struct _TDBX { 242*b1cdbd2cSJim Jagielski DWORD ptdb; // 00h // PTHREAD_DATABASE 243*b1cdbd2cSJim Jagielski DWORD ppdb; // 04h // PPROCESDS_DATABASE 244*b1cdbd2cSJim Jagielski DWORD ContextHandle; // 08h 245*b1cdbd2cSJim Jagielski DWORD un1; // 0Ch 246*b1cdbd2cSJim Jagielski DWORD TimeOutHandle; // 10h 247*b1cdbd2cSJim Jagielski DWORD WakeParam; // 14h 248*b1cdbd2cSJim Jagielski DWORD BlockHandle; // 18h 249*b1cdbd2cSJim Jagielski DWORD BlockState; // 1Ch 250*b1cdbd2cSJim Jagielski DWORD SuspendCount; // 20h 251*b1cdbd2cSJim Jagielski DWORD SuspendHandle; // 24h 252*b1cdbd2cSJim Jagielski DWORD MustCompleteCount; // 28h 253*b1cdbd2cSJim Jagielski DWORD WaitExFlags; // 2Ch 254*b1cdbd2cSJim Jagielski // 0x00000001 - WAITEXBIT 255*b1cdbd2cSJim Jagielski // 0x00000002 - WAITACKBIT 256*b1cdbd2cSJim Jagielski // 0x00000004 - SUSPEND_APC_PENDING 257*b1cdbd2cSJim Jagielski // 0x00000008 - SUSPEND_TERMINATED 258*b1cdbd2cSJim Jagielski // 0x00000010 - BLOCKED_FOR_TERMINATION 259*b1cdbd2cSJim Jagielski // 0x00000020 - EMULATE_NPX 260*b1cdbd2cSJim Jagielski // 0x00000040 - WIN32_NPX 261*b1cdbd2cSJim Jagielski // 0x00000080 - EXTENDED_HANDLES 262*b1cdbd2cSJim Jagielski // 0x00000100 - FROZEN 263*b1cdbd2cSJim Jagielski // 0x00000200 - DONT_FREEZE 264*b1cdbd2cSJim Jagielski // 0x00000400 - DONT_UNFREEZE 265*b1cdbd2cSJim Jagielski // 0x00000800 - DONT_TRACE 266*b1cdbd2cSJim Jagielski // 0x00001000 - STOP_TRACING 267*b1cdbd2cSJim Jagielski // 0x00002000 - WAITING_FOR_CRST_SAFE 268*b1cdbd2cSJim Jagielski // 0x00004000 - CRST_SAFE 269*b1cdbd2cSJim Jagielski // 0x00040000 - BLOCK_TERMINATE_APC 270*b1cdbd2cSJim Jagielski DWORD SyncWaitCount; // 30h 271*b1cdbd2cSJim Jagielski DWORD QueuedSyncFuncs; // 34h 272*b1cdbd2cSJim Jagielski DWORD UserAPCList; // 38h 273*b1cdbd2cSJim Jagielski DWORD KernAPCList; // 3Ch 274*b1cdbd2cSJim Jagielski DWORD pPMPSPSelector; // 40h 275*b1cdbd2cSJim Jagielski DWORD BlockedOnID; // 44h 276*b1cdbd2cSJim Jagielski DWORD un2[7]; // 48h 277*b1cdbd2cSJim Jagielski DWORD TraceRefData; // 64h 278*b1cdbd2cSJim Jagielski DWORD TraceCallBack; // 68h 279*b1cdbd2cSJim Jagielski DWORD TraceEventHandle; // 6Ch 280*b1cdbd2cSJim Jagielski WORD TraceOutLastCS; // 70h 281*b1cdbd2cSJim Jagielski WORD K16TDB; // 72h 282*b1cdbd2cSJim Jagielski WORD K16PDB; // 74h 283*b1cdbd2cSJim Jagielski WORD DosPDBSeg; // 76h 284*b1cdbd2cSJim Jagielski WORD ExceptionCount; // 78h 285*b1cdbd2cSJim Jagielski } TDBX, *PTDBX; 286*b1cdbd2cSJim Jagielski 287*b1cdbd2cSJim Jagielski 288*b1cdbd2cSJim Jagielski //Thread Database structure 289*b1cdbd2cSJim Jagielski 290*b1cdbd2cSJim Jagielski typedef struct _THREAD_DATABASE { 291*b1cdbd2cSJim Jagielski DWORD Type; // 00h 292*b1cdbd2cSJim Jagielski DWORD cReference; // 04h 293*b1cdbd2cSJim Jagielski PPROCESS_DATABASE pProcess; // 08h 294*b1cdbd2cSJim Jagielski DWORD someEvent; // 0Ch An event object (What's it used for???) 295*b1cdbd2cSJim Jagielski DWORD pvExcept; // 10h This field through field 3CH is a TIB 296*b1cdbd2cSJim Jagielski // structure (see TIB.H) 297*b1cdbd2cSJim Jagielski DWORD TopOfStack; // 14h 298*b1cdbd2cSJim Jagielski DWORD StackLow; // 18h 299*b1cdbd2cSJim Jagielski WORD W16TDB; // 1Ch 300*b1cdbd2cSJim Jagielski WORD StackSelector16; // 1Eh Used when thunking down to 16 bits 301*b1cdbd2cSJim Jagielski DWORD SelmanList; // 20h 302*b1cdbd2cSJim Jagielski DWORD UserPointer; // 24h 303*b1cdbd2cSJim Jagielski PTIB pTIB; // 28h 304*b1cdbd2cSJim Jagielski WORD TIBFlags; // 2Ch TIBF_WIN32 = 1, TIBF_TRAP = 2 305*b1cdbd2cSJim Jagielski WORD Win16MutexCount; // 2Eh 306*b1cdbd2cSJim Jagielski DWORD DebugContext; // 30h 307*b1cdbd2cSJim Jagielski PDWORD pCurrentPriority; // 34h 308*b1cdbd2cSJim Jagielski DWORD MessageQueue; // 38h 309*b1cdbd2cSJim Jagielski DWORD pTLSArray; // 3Ch 310*b1cdbd2cSJim Jagielski PPROCESS_DATABASE pProcess2;// 40h Another copy of the thread's process??? 311*b1cdbd2cSJim Jagielski DWORD Flags; // 44h 312*b1cdbd2cSJim Jagielski // 0x00000001 - fCreateThreadEvent 313*b1cdbd2cSJim Jagielski // 0x00000002 - fCancelExceptionAbort 314*b1cdbd2cSJim Jagielski // 0x00000004 - fOnTempStack 315*b1cdbd2cSJim Jagielski // 0x00000008 - fGrowableStack 316*b1cdbd2cSJim Jagielski // 0x00000010 - fDelaySingleStep 317*b1cdbd2cSJim Jagielski // 0x00000020 - fOpenExeAsImmovableFile 318*b1cdbd2cSJim Jagielski // 0x00000040 - fCreateSuspended 319*b1cdbd2cSJim Jagielski // 0x00000080 - fStackOverflow 320*b1cdbd2cSJim Jagielski // 0x00000100 - fNestedCleanAPCs 321*b1cdbd2cSJim Jagielski // 0x00000200 - fWasOemNowAnsi 322*b1cdbd2cSJim Jagielski // 0x00000400 - fOKToSetThreadOem 323*b1cdbd2cSJim Jagielski DWORD TerminationStatus; // 48h Returned by GetExitCodeThread 324*b1cdbd2cSJim Jagielski WORD TIBSelector; // 4Ch 325*b1cdbd2cSJim Jagielski WORD EmulatorSelector; // 4Eh 326*b1cdbd2cSJim Jagielski DWORD cHandles; // 50h 327*b1cdbd2cSJim Jagielski DWORD WaitNodeList; // 54h 328*b1cdbd2cSJim Jagielski DWORD un4; // 58h 329*b1cdbd2cSJim Jagielski DWORD Ring0Thread; // 5Ch 330*b1cdbd2cSJim Jagielski PTDBX pTDBX; // 60 331*b1cdbd2cSJim Jagielski DWORD StackBase; // 64h 332*b1cdbd2cSJim Jagielski DWORD TerminationStack; // 68h 333*b1cdbd2cSJim Jagielski DWORD EmulatorData; // 6Ch 334*b1cdbd2cSJim Jagielski DWORD GetLastErrorCode; // 70h 335*b1cdbd2cSJim Jagielski DWORD DebuggerCB; // 74h 336*b1cdbd2cSJim Jagielski DWORD DebuggerThread; // 78h 337*b1cdbd2cSJim Jagielski PCONTEXT ThreadContext; // 7Ch // register context defined in WINNT.H 338*b1cdbd2cSJim Jagielski DWORD Except16List; // 80h 339*b1cdbd2cSJim Jagielski DWORD ThunkConnect; // 84h 340*b1cdbd2cSJim Jagielski DWORD NegStackBase; // 88h 341*b1cdbd2cSJim Jagielski DWORD CurrentSS; // 8Ch 342*b1cdbd2cSJim Jagielski DWORD SSTable; // 90h 343*b1cdbd2cSJim Jagielski DWORD ThunkSS16; // 94h 344*b1cdbd2cSJim Jagielski DWORD TLSArray[64]; // 98h 345*b1cdbd2cSJim Jagielski DWORD DeltaPriority; // 198h 346*b1cdbd2cSJim Jagielski 347*b1cdbd2cSJim Jagielski // The retail version breaks off somewhere around here. 348*b1cdbd2cSJim Jagielski // All the remaining fields are most likely only in the debug version 349*b1cdbd2cSJim Jagielski 350*b1cdbd2cSJim Jagielski DWORD un5[7]; // 19Ch 351*b1cdbd2cSJim Jagielski DWORD pCreateData16; // 1B8h 352*b1cdbd2cSJim Jagielski DWORD APISuspendCount; // 1BCh # of times SuspendThread has been called 353*b1cdbd2cSJim Jagielski DWORD un6; // 1C0h 354*b1cdbd2cSJim Jagielski DWORD WOWChain; // 1C4h 355*b1cdbd2cSJim Jagielski WORD wSSBig; // 1C8h 356*b1cdbd2cSJim Jagielski WORD un7; // 1CAh 357*b1cdbd2cSJim Jagielski DWORD lp16SwitchRec; // 1CCh 358*b1cdbd2cSJim Jagielski DWORD un8[6]; // 1D0h 359*b1cdbd2cSJim Jagielski DWORD pSomeCritSect1; // 1E8h 360*b1cdbd2cSJim Jagielski DWORD pWin16Mutex; // 1ECh 361*b1cdbd2cSJim Jagielski DWORD pWin32Mutex; // 1F0h 362*b1cdbd2cSJim Jagielski DWORD pSomeCritSect2; // 1F4h 363*b1cdbd2cSJim Jagielski DWORD un9; // 1F8h 364*b1cdbd2cSJim Jagielski DWORD ripString; // 1FCh 365*b1cdbd2cSJim Jagielski DWORD LastTlsSetValueEIP[64]; // 200h (parallel to TlsArray, contains EIP 366*b1cdbd2cSJim Jagielski // where TLS value was last set from) 367*b1cdbd2cSJim Jagielski } THREAD_DATABASE, *PTHREAD_DATABASE; 368*b1cdbd2cSJim Jagielski 369