Allocate/free the 16-bit thread stack in the kernel dll init routine.
diff --git a/dlls/kernel/kernel_main.c b/dlls/kernel/kernel_main.c
index 442d059..aa7296b 100644
--- a/dlls/kernel/kernel_main.c
+++ b/dlls/kernel/kernel_main.c
@@ -38,6 +38,8 @@
#include "miscemu.h"
#include "module.h"
#include "task.h"
+#include "thread.h"
+#include "stackframe.h"
#include "wincon.h"
#include "console_private.h"
@@ -64,6 +66,31 @@
LeaveCriticalSection( &ldt_section );
}
+
+/***********************************************************************
+ * KERNEL thread initialisation routine
+ */
+static void thread_attach(void)
+{
+ /* allocate the 16-bit stack (FIXME: should be done lazily) */
+ HGLOBAL16 hstack = K32WOWGlobalAlloc16( GMEM_FIXED, 0x10000 );
+ NtCurrentTeb()->stack_sel = GlobalHandleToSel16( hstack );
+ NtCurrentTeb()->cur_stack = MAKESEGPTR( NtCurrentTeb()->stack_sel,
+ 0x10000 - sizeof(STACK16FRAME) );
+}
+
+
+/***********************************************************************
+ * KERNEL thread finalisation routine
+ */
+static void thread_detach(void)
+{
+ /* free the 16-bit stack */
+ K32WOWGlobalFree16( NtCurrentTeb()->stack_sel );
+ NtCurrentTeb()->cur_stack = 0;
+}
+
+
/***********************************************************************
* KERNEL process initialisation routine
*/
@@ -144,6 +171,7 @@
if (main_create_flags & CREATE_NEW_PROCESS_GROUP)
SetConsoleCtrlHandler(NULL, TRUE);
+ thread_attach();
return TRUE;
}
@@ -156,6 +184,12 @@
{
case DLL_PROCESS_ATTACH:
return process_attach();
+ case DLL_THREAD_ATTACH:
+ thread_attach();
+ break;
+ case DLL_THREAD_DETACH:
+ thread_detach();
+ break;
case DLL_PROCESS_DETACH:
WriteOutProfiles16();
break;