Alexandre Julliard : kernel32: Moved the allocation of the process stack to ntdll.

Alexandre Julliard julliard at winehq.org
Thu Mar 27 07:21:37 CDT 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Mar 26 17:08:38 2008 +0100

kernel32: Moved the allocation of the process stack to ntdll.

---

 dlls/kernel32/process.c |   47 +-------------------------
 dlls/ntdll/loader.c     |   82 +++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 71 insertions(+), 58 deletions(-)

diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index 054fbc0..8d040bd 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -52,10 +52,6 @@
 #include "wine/unicode.h"
 #include "wine/debug.h"
 
-#ifdef HAVE_VALGRIND_MEMCHECK_H
-#include <valgrind/memcheck.h>
-#endif
-
 WINE_DEFAULT_DEBUG_CHANNEL(process);
 WINE_DECLARE_DEBUG_CHANNEL(file);
 WINE_DECLARE_DEBUG_CHANNEL(relay);
@@ -818,44 +814,6 @@ static HANDLE start_wineboot(void)
 
 
 /***********************************************************************
- *           init_stack
- *
- * Allocate the stack of new process.
- */
-static void *init_stack(void)
-{
-    void *base;
-    SIZE_T stack_size, page_size = getpagesize();
-    IMAGE_NT_HEADERS *nt = RtlImageNtHeader( NtCurrentTeb()->Peb->ImageBaseAddress );
-
-    stack_size = max( nt->OptionalHeader.SizeOfStackReserve, nt->OptionalHeader.SizeOfStackCommit );
-    stack_size += page_size;  /* for the guard page */
-    stack_size = (stack_size + 0xffff) & ~0xffff;  /* round to 64K boundary */
-    if (stack_size < 1024 * 1024) stack_size = 1024 * 1024;  /* Xlib needs a large stack */
-
-    if (!(base = VirtualAlloc( NULL, stack_size, MEM_COMMIT, PAGE_READWRITE )))
-    {
-        ERR( "failed to allocate main process stack\n" );
-        ExitProcess( 1 );
-    }
-
-    /* note: limit is lower than base since the stack grows down */
-    NtCurrentTeb()->DeallocationStack = base;
-    NtCurrentTeb()->Tib.StackBase     = (char *)base + stack_size;
-    NtCurrentTeb()->Tib.StackLimit    = (char *)base + page_size;
-
-#ifdef VALGRIND_STACK_REGISTER
-    /* no need to de-register the stack as it's the one of the main thread */
-    VALGRIND_STACK_REGISTER(NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase);
-#endif
-
-    /* setup guard page */
-    VirtualProtect( base, page_size, PAGE_NOACCESS, NULL );
-    return NtCurrentTeb()->Tib.StackBase;
-}
-
-
-/***********************************************************************
  *           start_process
  *
  * Startup routine of a new process. Runs on the new process stack.
@@ -868,8 +826,6 @@ static void start_process( void *arg )
         IMAGE_NT_HEADERS *nt;
         LPTHREAD_START_ROUTINE entry;
 
-        LdrInitializeThunk( 0, 0, 0, 0 );
-
         nt = RtlImageNtHeader( peb->ImageBaseAddress );
         entry = (LPTHREAD_START_ROUTINE)((char *)peb->ImageBaseAddress +
                                          nt->OptionalHeader.AddressOfEntryPoint);
@@ -1000,8 +956,9 @@ void __wine_kernel_init(void)
         CloseHandle( boot_event );
     }
 
+    LdrInitializeThunk( 0, 0, 0, 0 );
     /* switch to the new stack */
-    wine_switch_to_stack( start_process, NULL, init_stack() );
+    wine_switch_to_stack( start_process, NULL, NtCurrentTeb()->Tib.StackBase );
 
  error:
     ExitProcess( GetLastError() );
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 811540b..f17c0c0 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -24,6 +24,12 @@
 
 #include <assert.h>
 #include <stdarg.h>
+#ifdef HAVE_SYS_MMAN_H
+# include <sys/mman.h>
+#endif
+#ifdef HAVE_VALGRIND_MEMCHECK_H
+# include <valgrind/memcheck.h>
+#endif
 
 #define NONAMELESSUNION
 #define NONAMELESSSTRUCT
@@ -2313,6 +2319,65 @@ PIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE hModule)
 }
 
 
+/***********************************************************************
+ *           alloc_process_stack
+ *
+ * Allocate the stack of new process.
+ */
+static NTSTATUS alloc_process_stack( IMAGE_NT_HEADERS *nt )
+{
+    NTSTATUS status;
+    void *base = NULL;
+    SIZE_T stack_size, page_size = getpagesize();
+
+    stack_size = max( nt->OptionalHeader.SizeOfStackReserve, nt->OptionalHeader.SizeOfStackCommit );
+    stack_size += page_size;  /* for the guard page */
+    stack_size = (stack_size + 0xffff) & ~0xffff;  /* round to 64K boundary */
+    if (stack_size < 1024 * 1024) stack_size = 1024 * 1024;  /* Xlib needs a large stack */
+
+    if ((status = NtAllocateVirtualMemory( GetCurrentProcess(), &base, 16, &stack_size,
+                                           MEM_COMMIT, PAGE_READWRITE )))
+        return status;
+
+    /* note: limit is lower than base since the stack grows down */
+    NtCurrentTeb()->DeallocationStack = base;
+    NtCurrentTeb()->Tib.StackBase     = (char *)base + stack_size;
+    NtCurrentTeb()->Tib.StackLimit    = (char *)base + page_size;
+
+#ifdef VALGRIND_STACK_REGISTER
+    /* no need to de-register the stack as it's the one of the main thread */
+    VALGRIND_STACK_REGISTER(NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase);
+#endif
+
+    /* setup guard page */
+    NtProtectVirtualMemory( GetCurrentProcess(), &base, &page_size, PAGE_NOACCESS, NULL );
+    return STATUS_SUCCESS;
+}
+
+
+/***********************************************************************
+ *           attach_process_dlls
+ *
+ * Initial attach to all the dlls loaded by the process.
+ */
+static NTSTATUS attach_process_dlls( void *wm )
+{
+    NTSTATUS status;
+
+    RtlEnterCriticalSection( &loader_section );
+    if ((status = process_attach( wm, (LPVOID)1 )) != STATUS_SUCCESS)
+    {
+        if (last_failed_modref)
+            ERR( "%s failed to initialize, aborting\n",
+                 debugstr_w(last_failed_modref->ldr.BaseDllName.Buffer) + 1 );
+        return status;
+    }
+    attach_implicitly_loaded_dlls( (LPVOID)1 );
+    RtlLeaveCriticalSection( &loader_section );
+    return status;
+}
+
+
 /******************************************************************
  *		LdrInitializeThunk (NTDLL.@)
  *
@@ -2344,8 +2409,8 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3,
     RemoveEntryList( &wm->ldr.InLoadOrderModuleList );
     InsertHeadList( &peb->LdrData->InLoadOrderModuleList, &wm->ldr.InLoadOrderModuleList );
 
-    status = server_init_process_done();
-    if (status != STATUS_SUCCESS) goto error;
+    if ((status = alloc_process_stack( nt )) != STATUS_SUCCESS) goto error;
+    if ((status = server_init_process_done()) != STATUS_SUCCESS) goto error;
 
     actctx_init();
     load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer;
@@ -2355,17 +2420,8 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3,
 
     pthread_functions.sigprocmask( SIG_UNBLOCK, &server_block_set, NULL );
 
-    RtlEnterCriticalSection( &loader_section );
-
-    if ((status = process_attach( wm, (LPVOID)1 )) != STATUS_SUCCESS)
-    {
-        if (last_failed_modref)
-            ERR( "%s failed to initialize, aborting\n", debugstr_w(last_failed_modref->ldr.BaseDllName.Buffer) + 1 );
-        goto error;
-    }
-    attach_implicitly_loaded_dlls( (LPVOID)1 );
-
-    RtlLeaveCriticalSection( &loader_section );
+    status = wine_call_on_stack( attach_process_dlls, wm, NtCurrentTeb()->Tib.StackBase );
+    if (status != STATUS_SUCCESS) goto error;
 
     if (nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE) VIRTUAL_UseLargeAddressSpace();
     return;




More information about the wine-cvs mailing list