Alexandre Julliard : ntdll: Move the PEB initialization to LdrInitializeThunk().

Alexandre Julliard julliard at winehq.org
Mon Apr 5 16:28:23 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Apr  5 12:05:38 2021 +0200

ntdll: Move the PEB initialization to LdrInitializeThunk().

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

---

 dlls/ntdll/loader.c     | 62 +++++++++++++++++++++----------------------------
 dlls/ntdll/ntdll_misc.h |  1 -
 dlls/ntdll/thread.c     |  7 +-----
 3 files changed, 28 insertions(+), 42 deletions(-)

diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 8863a20d67e..7a714a5aa6d 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -154,7 +154,14 @@ static RTL_CRITICAL_SECTION_DEBUG peb_critsect_debug =
 };
 static RTL_CRITICAL_SECTION peb_lock = { &peb_critsect_debug, -1, 0, 0, 0, 0 };
 
-static PEB_LDR_DATA ldr = { sizeof(ldr), TRUE };
+static PEB_LDR_DATA ldr =
+{
+    sizeof(ldr), TRUE, NULL,
+    { &ldr.InLoadOrderModuleList, &ldr.InLoadOrderModuleList },
+    { &ldr.InMemoryOrderModuleList, &ldr.InMemoryOrderModuleList },
+    { &ldr.InInitializationOrderModuleList, &ldr.InInitializationOrderModuleList }
+};
+
 static RTL_BITMAP tls_bitmap;
 static RTL_BITMAP tls_expansion_bitmap;
 
@@ -3615,6 +3622,24 @@ void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unknown2, ULONG_PTR
     {
         ANSI_STRING func_name;
         WINE_MODREF *kernel32;
+        PEB *peb = NtCurrentTeb()->Peb;
+
+        peb->LdrData            = &ldr;
+        peb->FastPebLock        = &peb_lock;
+        peb->TlsBitmap          = &tls_bitmap;
+        peb->TlsExpansionBitmap = &tls_expansion_bitmap;
+        peb->LoaderLock         = &loader_section;
+        peb->OSMajorVersion     = 5;
+        peb->OSMinorVersion     = 1;
+        peb->OSBuildNumber      = 0xA28;
+        peb->OSPlatformId       = VER_PLATFORM_WIN32_NT;
+        peb->SessionId          = 1;
+        peb->ProcessHeap        = RtlCreateHeap( HEAP_GROWABLE, NULL, 0, 0, NULL, NULL );
+
+        RtlInitializeBitMap( &tls_bitmap, peb->TlsBitmapBits, sizeof(peb->TlsBitmapBits) * 8 );
+        RtlInitializeBitMap( &tls_expansion_bitmap, peb->TlsExpansionBitmapBits,
+                             sizeof(peb->TlsExpansionBitmapBits) * 8 );
+        RtlSetBits( peb->TlsBitmap, 0, 1 ); /* TLS index 0 is reserved and should be initialized to NULL. */
 
         init_user_process_params();
         load_global_options();
@@ -4040,39 +4065,6 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
 }
 
 
-/***********************************************************************
- *           process_init
- */
-static NTSTATUS process_init(void)
-{
-    TEB *teb = NtCurrentTeb();
-    PEB *peb = teb->Peb;
-
-    peb->LdrData            = &ldr;
-    peb->FastPebLock        = &peb_lock;
-    peb->TlsBitmap          = &tls_bitmap;
-    peb->TlsExpansionBitmap = &tls_expansion_bitmap;
-    peb->LoaderLock         = &loader_section;
-    peb->OSMajorVersion     = 5;
-    peb->OSMinorVersion     = 1;
-    peb->OSBuildNumber      = 0xA28;
-    peb->OSPlatformId       = VER_PLATFORM_WIN32_NT;
-    peb->SessionId          = 1;
-    peb->ProcessHeap        = RtlCreateHeap( HEAP_GROWABLE, NULL, 0, 0, NULL, NULL );
-
-    RtlInitializeBitMap( &tls_bitmap, peb->TlsBitmapBits, sizeof(peb->TlsBitmapBits) * 8 );
-    RtlInitializeBitMap( &tls_expansion_bitmap, peb->TlsExpansionBitmapBits,
-                         sizeof(peb->TlsExpansionBitmapBits) * 8 );
-    RtlSetBits( peb->TlsBitmap, 0, 1 ); /* TLS index 0 is reserved and should be initialized to NULL. */
-    init_global_fls_data();
-
-    InitializeListHead( &ldr.InLoadOrderModuleList );
-    InitializeListHead( &ldr.InMemoryOrderModuleList );
-    InitializeListHead( &ldr.InInitializationOrderModuleList );
-
-    return STATUS_SUCCESS;
-}
-
 /***********************************************************************
  *           __wine_set_unix_funcs
  */
@@ -4080,5 +4072,5 @@ NTSTATUS CDECL __wine_set_unix_funcs( int version, const struct unix_funcs *func
 {
     if (version != NTDLL_UNIXLIB_VERSION) return STATUS_REVISION_MISMATCH;
     unix_funcs = funcs;
-    return process_init();
+    return STATUS_SUCCESS;
 }
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index e50d48dc3cc..a4a178a462e 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -106,7 +106,6 @@ static inline void ascii_to_unicode( WCHAR *dst, const char *src, size_t len )
 }
 
 /* FLS data */
-extern void init_global_fls_data(void) DECLSPEC_HIDDEN;
 extern TEB_FLS_DATA *fls_alloc_data(void) DECLSPEC_HIDDEN;
 
 #endif
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 25496609f08..3cb3bd469ba 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -241,7 +241,7 @@ TEB_ACTIVE_FRAME * WINAPI RtlGetFrame(void)
  ***********************************************************************/
 
 
-static GLOBAL_FLS_DATA fls_data;
+static GLOBAL_FLS_DATA fls_data = { { NULL }, { &fls_data.fls_list_head, &fls_data.fls_list_head } };
 
 static RTL_CRITICAL_SECTION fls_section;
 static RTL_CRITICAL_SECTION_DEBUG fls_critsect_debug =
@@ -254,11 +254,6 @@ static RTL_CRITICAL_SECTION fls_section = { &fls_critsect_debug, -1, 0, 0, 0, 0
 
 #define MAX_FLS_DATA_COUNT 0xff0
 
-void init_global_fls_data(void)
-{
-    InitializeListHead( &fls_data.fls_list_head );
-}
-
 static void lock_fls_data(void)
 {
     RtlEnterCriticalSection( &fls_section );




More information about the wine-cvs mailing list