Alexandre Julliard : ntdll: Move the plaform-independent thread data to the GdiTebBatch TEB field.

Alexandre Julliard julliard at winehq.org
Wed Jul 19 16:05:33 CDT 2017


Module: wine
Branch: master
Commit: b87c66dd656f37b0ad6d78da552c8ce8a0114d9e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b87c66dd656f37b0ad6d78da552c8ce8a0114d9e

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jul 19 15:18:29 2017 +0200

ntdll: Move the plaform-independent thread data to the GdiTebBatch TEB field.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/ntdll_misc.h | 35 +++++++++++++----------------------
 dlls/ntdll/thread.c     | 10 +++++-----
 include/winternl.h      |  2 +-
 3 files changed, 19 insertions(+), 28 deletions(-)

diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index 1e71fae..ba296d2 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -212,37 +212,28 @@ struct debug_info
     char  output[1024];  /* current output line */
 };
 
-/* thread private data, stored in NtCurrentTeb()->SpareBytes1 */
+/* thread private data, stored in NtCurrentTeb()->GdiTebBatch */
 struct ntdll_thread_data
 {
 #ifdef __i386__
-    DWORD              dr0;           /* 1bc Debug registers */
-    DWORD              dr1;           /* 1c0 */
-    DWORD              dr2;           /* 1c4 */
-    DWORD              dr3;           /* 1c8 */
-    DWORD              dr6;           /* 1cc */
-    DWORD              dr7;           /* 1d0 */
-    DWORD              fs;            /* 1d4 TEB selector */
-    DWORD              gs;            /* 1d8 libc selector; update winebuild if you move this! */
-    void              *vm86_ptr;      /* 1dc data for vm86 mode */
-#else
-    void              *exit_frame;    /*    /2e8 exit frame pointer */
+    WINE_VM86_TEB_INFO __vm86;        /* FIXME: placeholder for vm86 data from struct x86_thread_data */
 #endif
-    struct debug_info *debug_info;    /* 1e0/2f0 info for debugstr functions */
-    int                request_fd;    /* 1e4/2f8 fd for sending server requests */
-    int                reply_fd;      /* 1e8/2fc fd for receiving server replies */
-    int                wait_fd[2];    /* 1ec/300 fd for sleeping server requests */
-    BOOL               wow64_redir;   /* 1f4/308 Wow64 filesystem redirection flag */
-    pthread_t          pthread_id;    /* 1f8/310 pthread thread id */
+    struct debug_info *debug_info;    /* info for debugstr functions */
+    int                request_fd;    /* fd for sending server requests */
+    int                reply_fd;      /* fd for receiving server replies */
+    int                wait_fd[2];    /* fd for sleeping server requests */
+    BOOL               wow64_redir;   /* Wow64 filesystem redirection flag */
+    pthread_t          pthread_id;    /* pthread thread id */
+};
+
+C_ASSERT( sizeof(struct ntdll_thread_data) <= sizeof(((TEB *)0)->GdiTebBatch) );
 #ifdef __i386__
-    WINE_VM86_TEB_INFO vm86;          /* 1fc vm86 private data */
-    void              *exit_frame;    /* 204 exit frame pointer */
+C_ASSERT( offsetof( TEB, GdiTebBatch ) + offsetof( struct ntdll_thread_data, __vm86 ) == 0x1fc );
 #endif
-};
 
 static inline struct ntdll_thread_data *ntdll_get_thread_data(void)
 {
-    return (struct ntdll_thread_data *)NtCurrentTeb()->SpareBytes1;
+    return (struct ntdll_thread_data *)&NtCurrentTeb()->GdiTebBatch;
 }
 
 extern mode_t FILE_umask DECLSPEC_HIDDEN;
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 5089f39..ba1be0f 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -332,7 +332,7 @@ HANDLE thread_init(void)
     teb->StaticUnicodeString.Buffer = teb->StaticUnicodeBuffer;
     teb->StaticUnicodeString.MaximumLength = sizeof(teb->StaticUnicodeBuffer);
 
-    thread_data = (struct ntdll_thread_data *)teb->SpareBytes1;
+    thread_data = (struct ntdll_thread_data *)&teb->GdiTebBatch;
     thread_data->request_fd = -1;
     thread_data->reply_fd   = -1;
     thread_data->wait_fd[0] = -1;
@@ -440,7 +440,7 @@ void exit_thread( int status )
 
     if ((teb = interlocked_xchg_ptr( &prev_teb, NtCurrentTeb() )))
     {
-        struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)teb->SpareBytes1;
+        struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)&teb->GdiTebBatch;
 
         if (thread_data->pthread_id)
         {
@@ -465,7 +465,7 @@ void exit_thread( int status )
 static void start_thread( struct startup_info *info )
 {
     TEB *teb = info->teb;
-    struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)teb->SpareBytes1;
+    struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)&teb->GdiTebBatch;
     PRTL_THREAD_START_ROUTINE func = info->entry_point;
     void *arg = info->entry_arg;
     struct debug_info debug_info;
@@ -585,7 +585,7 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR *
     info->entry_point = start;
     info->entry_arg   = param;
 
-    thread_data = (struct ntdll_thread_data *)teb->SpareBytes1;
+    thread_data = (struct ntdll_thread_data *)&teb->GdiTebBatch;
     thread_data->request_fd  = request_pipe[1];
     thread_data->reply_fd    = -1;
     thread_data->wait_fd[0]  = -1;
@@ -1027,7 +1027,7 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class,
                     {
                         if (sel == (wine_get_cs() & ~3))
                             tdi->Entry.HighWord.Bits.Type |= 8;  /* code segment */
-                        else if (sel == (ntdll_get_thread_data()->fs & ~3))
+                        else if (sel == (wine_get_fs() & ~3))
                         {
                             ULONG_PTR fs_base = (ULONG_PTR)NtCurrentTeb();
                             tdi->Entry.BaseLow                   = fs_base & 0xffff;
diff --git a/include/winternl.h b/include/winternl.h
index 5cd1664..9dd9fb1 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -330,7 +330,7 @@ typedef struct _TEB
     ACTIVATION_CONTEXT_STACK     ActivationContextStack;            /* 1a8/02c8 */
     BYTE                         SpareBytes1[24];                   /* 1bc/02e8 used for ntdll private data in Wine */
     PVOID                        SystemReserved2[10];               /* 1d4/0300 used for ntdll private data in Wine */
-    GDI_TEB_BATCH                GdiTebBatch;                       /* 1fc/0350 used for vm86 private data in Wine */
+    GDI_TEB_BATCH                GdiTebBatch;                       /* 1fc/0350 used for ntdll private data in Wine */
     HANDLE                       gdiRgn;                            /* 6dc/0838 */
     HANDLE                       gdiPen;                            /* 6e0/0840 */
     HANDLE                       gdiBrush;                          /* 6e4/0848 */




More information about the wine-cvs mailing list