Some initialization sequence bugfixes: - Initialize process crst for 16-bit processes. - Don't crash due to uninitialized stack frames in WineLib. - Map system DLLs before calling UserSignalProc. - Signal USIG_PROCESS_CREATE only *after* the env_db is filled.
diff --git a/loader/task.c b/loader/task.c index 4e1dcf2..e69d64b 100644 --- a/loader/task.c +++ b/loader/task.c
@@ -243,6 +243,9 @@ /* Terminate the stack frame chain */ memset(THREAD_STACK16( pTask->thdb ), '\0', sizeof(STACK16FRAME)); + /* Initialize process critical section */ + InitializeCriticalSection( &PROCESS_Current()->crit_section ); + /* Call USER signal proc */ PROCESS_CallUserSignalProc( USIG_THREAD_INIT, 0, 0 ); /* for initial thread */ PROCESS_CallUserSignalProc( USIG_PROCESS_INIT, 0, 0 ); @@ -687,9 +690,9 @@ { /* We need to remove one pair of stackframes (exept for Winelib) */ STACK16FRAME *oldframe16 = CURRENT_STACK16; - STACK32FRAME *oldframe32 = oldframe16->frame32; - STACK16FRAME *newframe16 = PTR_SEG_TO_LIN( oldframe32->frame16 ); - STACK32FRAME *newframe32 = newframe16->frame32; + STACK32FRAME *oldframe32 = oldframe16? oldframe16->frame32 : NULL; + STACK16FRAME *newframe16 = oldframe32? PTR_SEG_TO_LIN( oldframe32->frame16 ) : NULL; + STACK32FRAME *newframe32 = newframe16? newframe16->frame32 : NULL; if (newframe32) { newframe16->entry_ip = oldframe16->entry_ip;