/*********************************************************************** * USER initialisation routine */ static BOOL process_attach(void) { HINSTANCE16 instance; /* Create USER heap */ if ((instance = LoadLibrary16( "USER.EXE" )) >= 32) USER_HeapSel = instance | 7; else { USER_HeapSel = GlobalAlloc16( GMEM_FIXED, 65536 ); LocalInit16( USER_HeapSel, 32, 65534 ); } /* some Win9x dlls expect keyboard to be loaded */ if (GetVersion() & 0x80000000) LoadLibrary16( "keyboard.drv" ); winstation_init(); /* Initialize system colors and metrics */ SYSPARAMS_Init(); /* Setup palette function pointers */ palette_init(); /* Initialize built-in window classes */ CLASS_RegisterBuiltinClasses(); /* Initialize message spying */ if (!SPY_Init()) return FALSE; return TRUE; }
/*********************************************************************** * InitTask (KERNEL.91) * * Called by the application startup code. */ void WINAPI InitTask16( CONTEXT *context ) { TDB *pTask; INSTANCEDATA *pinstance; SEGPTR ptr; context->Eax = 0; if (!(pTask = TASK_GetCurrent())) return; /* Note: we need to trust that BX/CX contain the stack/heap sizes, as some apps, notably Visual Basic apps, *modify* the heap/stack size of the instance data segment before calling InitTask() */ /* Initialize the INSTANCEDATA structure */ pinstance = MapSL( MAKESEGPTR(CURRENT_DS, 0) ); pinstance->stackmin = OFFSETOF(NtCurrentTeb()->WOW32Reserved) + sizeof( STACK16FRAME ); pinstance->stackbottom = pinstance->stackmin; /* yup, that's right. Confused me too. */ pinstance->stacktop = ( pinstance->stackmin > LOWORD(context->Ebx) ? pinstance->stackmin - LOWORD(context->Ebx) : 0 ) + 150; /* Initialize the local heap */ if (LOWORD(context->Ecx)) LocalInit16( GlobalHandleToSel16(pTask->hInstance), 0, LOWORD(context->Ecx) ); /* Initialize implicitly loaded DLLs */ NE_InitializeDLLs( pTask->hModule ); NE_DllProcessAttach( pTask->hModule ); /* Registers on return are: * ax 1 if OK, 0 on error * cx stack limit in bytes * dx cmdShow parameter * si instance handle of the previous instance * di instance handle of the new task * es:bx pointer to command line inside PSP * * 0 (=%bp) is pushed on the stack */ ptr = stack16_push( sizeof(WORD) ); *(WORD *)MapSL(ptr) = 0; context->Esp -= 2; context->Eax = 1; if (!pTask->pdb.cmdLine[0]) context->Ebx = 0x80; else { LPBYTE p = &pTask->pdb.cmdLine[1]; while ((*p == ' ') || (*p == '\t')) p++; context->Ebx = 0x80 + (p - pTask->pdb.cmdLine); } context->Ecx = pinstance->stacktop; context->Edx = pTask->nCmdShow; context->Esi = (DWORD)pTask->hPrevInstance; context->Edi = (DWORD)pTask->hInstance; context->SegEs = (WORD)pTask->hPDB; }