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