Ignore:
Timestamp:
Nov 21, 2000, 12:34:31 PM (25 years ago)
Author:
sandervl
Message:

header updates for TEB changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/win/thread.h

    r3808 r4657  
    1 /* $Id: thread.h,v 1.17 2000-07-08 07:23:09 sandervl Exp $ */
     1/* $Id: thread.h,v 1.18 2000-11-21 11:33:59 sandervl Exp $ */
    22
    33/*
     
    1515  #include "config.h"
    1616  #include "winbase.h"
     17  #include "winuser.h"
     18  #include <ntdef.h>
    1719 #endif
    1820 #include <ntdllsec.h> //PROCESSTHREAD_SECURITYINFO struct
     
    2426
    2527struct _PDB;
    26 
    27 /* Thread exception block */
    28 typedef struct _TEB
    29 {
    30     void        *except;         /* 00 Head of exception handling chain */
    31     void        *stack_top;      /* 04 Top of thread stack */
    32     void        *stack_low;      /* 08 Stack low-water mark */
    33     HTASK16      htask16;        /* 0c Win16 task handle */
    34     WORD         stack_sel;      /* 0e 16-bit stack selector */
    35     DWORD        selman_list;    /* 10 Selector manager list */
    36     DWORD        user_ptr;       /* 14 User pointer */
    37     struct _TEB *self;           /* 18 Pointer to this structure */
    38     WORD         flags;          /* 1c Flags */
    39     WORD         mutex_count;    /* 1e Win16 mutex count */
    40     DWORD        debug_context;  /* 20 Debug context */
    41     DWORD       *ppriority;      /* 24 Pointer to current priority */
    42     HQUEUE16     queue;          /* 28 Message queue */
    43     WORD         pad1;           /* 2a */
    44     LPVOID      *tls_ptr;        /* 2c Pointer to TLS array */
    45     struct _PDB *process;      /* 30 owning process (used by NT3.51 applets)*/
    46 } TEB;
    47 
    48 /* Thread exception flags */
    49 #define TEBF_WIN32  0x0001
    50 #define TEBF_TRAP   0x0002
    5128
    5229#ifndef OS2DEF_INCLUDED
     
    6441#endif
    6542
    66 /* Thread database */
    67 typedef struct _THDB
     43/* Thread exception block
     44
     45  flags in the comment:
     46  1-- win95 field
     47  d-- win95 debug version
     48  -2- nt field
     49  --3 wine special
     50  --n wine unused
     51  !-- or -!- likely or observed  collision
     52  more problems (collected from mailing list):
     53  psapi.dll 0x10/0x30 (expects nt fields)
     54  ie4       0x40
     55  PESHiELD  0x23/0x30 (win95)
     56*/
     57
     58#pragma pack(1)
     59/* Thread exception block */
     60typedef struct _TEB
    6861{
    69     LONG           header[2];      /*  00 Kernel object header */
    70     struct _PDB   *process;        /*  08 Process owning this thread */
    71     HANDLE         event;          /*  0c Thread event */
    72     TEB            teb;            /*  10 Thread exception block */
    73     DWORD          flags;          /*  44 Flags */
    74     DWORD          exit_code;      /*  48 Termination status */
    75     WORD           teb_sel;        /*  4c Selector to TEB */
    76     WORD           emu_sel;        /*  4e 80387 emulator selector */
    77     int            thread_errno;   /*  50 Per-thread errno (was: unknown) */
    78     void          *wait_list;      /*  54 Event waiting list */
    79     int            thread_h_errno; /*  50 Per-thread h_errno (was: unknown) */
    80     void          *ring0_thread;   /*  5c Pointer to ring 0 thread */
    81     void          *ptdbx;          /*  60 Pointer to TDBX structure */
    82     void          *stack_base;     /*  64 Base of the stack */
    83     void          *exit_stack;     /*  68 Stack pointer on thread exit */
    84     void          *emu_data;       /*  6c Related to 80387 emulation */
    85     DWORD          last_error;     /*  70 Last error code */
    86     void          *debugger_CB;    /*  74 Debugger context block */
    87     DWORD          debug_thread;   /*  78 Thread debugging this one (?) */
    88     void          *pcontext;       /*  7c Thread register context */
    89     DWORD          cur_stack;      /*  80 Current stack (was: unknown) */
    90     DWORD          unknown3[2];    /*  84 Unknown */
    91     WORD           current_ss;     /*  8c Another 16-bit stack selector */
    92     WORD           pad2;           /*  8e */
    93     void          *ss_table;       /*  90 Pointer to info about 16-bit stack */
    94     WORD           thunk_ss;       /*  94 Yet another 16-bit stack selector */
    95     WORD           pad3;           /*  96 */
     62/* start of NT_TIB */
     63    void        *except; /* 12- 00 Head of exception handling chain */
     64    void        *stack_top;      /* 12-  04 Top of thread stack */
     65    void        *stack_low;      /* 12-  08 Stack low-water mark */
     66    HTASK16      htask16;        /* 1--  0c Win16 task handle */
     67    WORD         stack_sel;      /* 1--  0e 16-bit stack selector */
     68    DWORD        selman_list;    /* 1-n  10 Selector manager list */
     69    DWORD        user_ptr;       /* 12n  14 User pointer */
     70/* end of NT_TIB */ 
     71    struct _TEB *self;           /* 12-  18 Pointer to this structure */
     72    WORD         tibflags;       /* 1!n  1c Flags (NT: EnvironmentPointer) */
     73    WORD         mutex_count;    /* 1-n  1e Win16 mutex count */
     74    void        *pid;            /* !2-  20 Process id (win95: debug context) */
     75    void        *tid;            /* -2-  24 Thread id */
     76    HQUEUE16     queue;          /* 1!-  28 Message queue (NT: DWORD ActiveRpcHandle)*/
     77    WORD         pad1;           /* --n  2a */
     78    LPVOID      *tls_ptr;        /* 2c Pointer to TLS array */
     79    struct _PDB *process;        /* 12-  30 owning process (win95: PDB; nt: NTPEB !!) */
     80    DWORD        flags;          /* 1-n  34 */
     81    DWORD        exit_code;      /* 1--  38 Termination status */
     82    WORD         teb_sel;        /* 1--  3c Selector to TEB */
     83    WORD         emu_sel;        /* 1-n  3e 80387 emulator selector */
     84    DWORD        unknown1;       /* --n  40 */
     85    DWORD        unknown2;       /* --n  44 */
     86    void       (*startup)(void); /* --3  48 Thread startup routine */
     87    int          thread_errno;   /* --3  4c Per-thread errno (was: ring0_thread) */
     88    int          thread_h_errno; /* --3  50 Per-thread h_errno (was: ptr to tdbx structure) */
     89    void        *stack_base;     /* 1--  54 Base of the stack */
     90    void        *signal_stack;   /* --3  58 Signal stack (was: exit_stack) */
     91    void        *emu_data;       /* --n  5c Related to 80387 emulation */
     92    DWORD        last_error;     /* 1--  60 Last error code */
     93    HANDLE       debug_cb;       /* 1-n  64 Debugger context block */
     94    DWORD        debug_thread;   /* 1-n  68 Thread debugging this one (?) */
     95    void        *pcontext;       /* 1-n  6c Thread register context */
     96    DWORD        cur_stack;      /* --3  70 Current stack (was: unknown) */
     97    DWORD        ThunkConnect;   /* 1-n  74 */
     98    DWORD        NegStackBase;   /* 1-n  78 */
     99    WORD         current_ss;     /* 1-n  7c Another 16-bit stack selector */
     100    WORD         pad2;           /* --n  7e */
     101    void        *ss_table;       /* --n  80 Pointer to info about 16-bit stack */
     102    WORD         thunk_ss;       /* --n  84 Yet another 16-bit stack selector */
     103    WORD         pad3;           /* --n  86 */
     104    DWORD        pad4[15];       /* --n  88 */
     105    ULONG        CurrentLocale;  /* -2-  C4 */
     106    DWORD        pad5[48];       /* --n  C8 */
     107    DWORD        delta_priority; /* 1-n 188 Priority delta */
     108    DWORD        unknown4[7];    /* d-n 18c Unknown */
     109    void        *create_data;    /* d-n 1a8 Pointer to creation structure */
     110    DWORD        suspend_count;  /* d-n 1ac SuspendThread() counter */
     111    void        *entry_point;    /* --3 1b0 Thread entry point (was: unknown) */
     112    void        *entry_arg;      /* --3 1b4 Entry point arg (was: unknown) */
     113    DWORD        unknown5[4];    /* --n 1b8 Unknown */
     114    DWORD        sys_count[4];   /* --3 1c8 Syslevel mutex entry counters */
     115    struct tagSYSLEVEL *sys_mutex[4];   /* --3 1d8 Syslevel mutex pointers */
     116    DWORD        unknown6[5];    /* --n 1e8 Unknown */
     117
     118    union {
    96119#ifdef __WIN32OS2__
    97     LPVOID         tls_array[TLS_MINIMUM_AVAILABLE];  /*  98 Thread local storage */
     120          struct {
     121              struct _TEB   *next;
     122              DWORD          OrgTIBSel;      // Original OS/2 TIB selector (always the same, but let's not assume too much for future compatibility)
     123              ULONG          hmq;            // Thread message queue
     124              ULONG          hab;            // Thread Anchor block
     125              ULONG          hooks[WH_NB_HOOKS]; //list of hooks for this thread queue
     126              ULONG          threadId;       // Thread ID
     127              ULONG          hThread;        // thread handle
     128              ULONG          exceptFrame;    // address of os/2 exception handler frame
     129              ULONG          newWindow;      // Pointer to window object of window that was just created
     130              void*          pWsockData;     // Winsock data pointer (NULL if unused)
     131              DWORD          lParam;         // MessageExtraInfo
     132              WINDOWPOS      wp;             // Used by message translation for WM_WINDOWPOSCHANGED
     133              ULONG          nrOfMsgs;       // Usually 1; some PM messages can generated more than 1 win32 msg
     134              BOOL           fTranslated;    // WM_CHAR already translated or not
     135              ULONG          msgstate;       // odd -> dispatchmessage called, even -> not called
     136              QMSG           os2msg;         // original os2 msg (received with Get- or PeekMessage)
     137              MSG            winmsg;         // temporary storage for translated os2 msg (used in DispatchMessage)
     138              MSG            msg;            // Used by message translation to store translated PM message (sent to win32 window proc in pmwindow.cpp)
     139              MSG            msgWCHAR;       // Used to store extra WM_CHAR message generated by TranslateMessage
     140              DWORD          pidDebuggee;    // process id of debuggee
     141              DWORD          logfile;        // last FILE ptr used for logging (for exception handling in vfprintf)
     142              PROCESSTHREAD_SECURITYINFO threadinfo; //used to store security info for thread tokens
     143              DWORD          lcid;           // thread lcid
     144          } odin;
     145#endif
     146          /* the following are nt specific fields */
     147          DWORD        pad6[633];                  /* --n 214 */
     148    } o;
     149    UNICODE_STRING StaticUnicodeString;      /* -2- bf8 used by advapi32 */
     150    USHORT       StaticUnicodeBuffer[261];   /* -2- c00 used by advapi32 */
     151    DWORD        pad7;                       /* --n e0c */
     152#ifdef __WIN32OS2__
     153    LPVOID         tls_array[TLS_MINIMUM_AVAILABLE];  /* -2- e10 Thread local storage */
    98154#else
    99     LPVOID         tls_array[64];  /*  98 Thread local storage */
     155    LPVOID       tls_array[64];              /* -2- e10 Thread local storage */
    100156#endif
    101     DWORD          delta_priority; /* 198 Priority delta */
    102     DWORD          unknown4[7];    /* 19c Unknown */
    103     void          *create_data;    /* 1b8 Pointer to creation structure */
    104     DWORD          suspend_count;  /* 1bc SuspendThread() counter */
    105     void          *entry_point;    /* 1c0 Thread entry point (was: unknown) */
    106     void          *entry_arg;      /* 1c4 Entry point arg (was: unknown) */
    107     DWORD          unknown5[4];    /* 1c8 Unknown */
    108     DWORD          sys_count[4];   /* 1d8 Syslevel mutex entry counters */
    109     CRITICAL_SECTION *sys_mutex[4];/* 1e8 Syslevel mutex pointers */
    110     DWORD          unknown6[2];    /* 1f8 Unknown */
    111     /* The following are Wine-specific fields */
    112     int            socket;         /* Socket for server communication */
    113     unsigned int   seq;            /* Server sequence number */
    114     void          *server_tid;     /* Server id for this thread */
    115     void         (*startup)(void); /* Thread startup routine */
    116     struct _THDB  *next;           /* Global thread list */
    117 #ifdef __WIN32OS2__
    118     DWORD          OrgTIBSel;      // Original OS/2 TIB selector (always the same, but let's not assume too much for future compatibility)
    119     ULONG          hmq;            // Thread message queue
    120     ULONG          hab;            // Thread Anchor block
    121     ULONG          hooks[WH_NB_HOOKS]; //list of hooks for this thread queue
    122     ULONG          threadId;       // Thread ID
    123     ULONG          hThread;        // thread handle
    124     ULONG          exceptFrame;    // address of os/2 exception handler frame
    125     ULONG          newWindow;      // Pointer to window object of window that was just created
    126     void*          pWsockData;     // Winsock data pointer (NULL if unused)
    127     DWORD          lParam;         // MessageExtraInfo
    128     WINDOWPOS      wp;             // Used by message translation for WM_WINDOWPOSCHANGED
    129     ULONG          nrOfMsgs;       // Usually 1; some PM messages can generated more than 1 win32 msg
    130     BOOL           fTranslated;    // WM_CHAR already translated or not
    131     ULONG          msgstate;       // odd -> dispatchmessage called, even -> not called
    132     QMSG           os2msg;         // original os2 msg (received with Get- or PeekMessage)
    133     MSG            winmsg;         // temporary storage for translated os2 msg (used in DispatchMessage)
    134     MSG            msg;            // Used by message translation to store translated PM message (sent to win32 window proc in pmwindow.cpp)
    135     MSG            msgWCHAR;       // Used to store extra WM_CHAR message generated by TranslateMessage
    136     DWORD          pidDebuggee;    // process id of debuggee
    137     DWORD          logfile;        // last FILE ptr used for logging (for exception handling in vfprintf)
    138     PROCESSTHREAD_SECURITYINFO threadinfo; //used to store security info for thread tokens
    139     DWORD          lcid;           // thread lcid
    140 #endif
    141 } THDB;
     157    DWORD        pad8[3];                    /* --n f10 */
     158    PVOID        ReservedForNtRpc;           /* -2- f1c used by rpcrt4 */
     159    DWORD        pad9[24];                   /* --n f20 */
     160    PVOID        ErrorInfo;                  /* -2- f80 used by ole32 (IErrorInfo*) */
     161} TEB;
     162#pragma pack()
     163
     164/* Thread exception flags */
     165#define TEBF_WIN32  0x0001
     166#define TEBF_TRAP   0x0002
     167
    142168
    143169/* The pseudo handle value returned by GetCurrentThread */
    144170#define CURRENT_THREAD_PSEUDOHANDLE 0xfffffffe
    145171
    146 #ifdef __i386__
    147 /* On the i386, the current thread is in the %fs register */
    148 # define SET_CUR_THREAD(thdb) SET_FS((thdb)->teb_sel)
    149 #else
    150 extern THDB *pCurrentThread;
    151 # define SET_CUR_THREAD(thdb) (pCurrentThread = (thdb))
    152 #endif  /* __i386__ */
    153 
    154 
    155 /* scheduler/thread.c */
    156 extern THDB *THREAD_CreateInitialThread( struct _PDB *pdb, int server_fd );
    157 extern THDB *THREAD_Create( struct _PDB *pdb, DWORD flags,
    158                             DWORD stack_size, BOOL alloc_stack16,
    159                             LPSECURITY_ATTRIBUTES sa, int *server_handle );
    160 extern THDB *THREAD_Current(void);
    161 extern BOOL THREAD_IsWin16( THDB *thdb );
    162 extern THDB *THREAD_IdToTHDB( DWORD id );
    163 
    164 /* scheduler/sysdeps.c */
    165 extern int SYSDEPS_SpawnThread( THDB *thread );
    166 extern void SYSDEPS_ExitThread(void);
    167 extern TEB * WINAPI NtCurrentTeb(void);
    168 
    169172#endif  /* __WINE_THREAD_H */
Note: See TracChangeset for help on using the changeset viewer.