Implemented PROCESS_CallUserSignalProc().
Send USER signals at various appropriate places.
Moved [GS]etProcessDword() to scheduler/process.c.

diff --git a/loader/task.c b/loader/task.c
index ca7c9a7..f48c20f 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -238,6 +238,12 @@
     /* Terminate the stack frame chain */
     memset(THREAD_STACK16( pTask->thdb ), '\0', sizeof(STACK16FRAME));
 
+    /* Call USER signal proc */
+    PROCESS_CallUserSignalProc( USIG_THREAD_INIT, 0 );  /* for initial thread */
+    PROCESS_CallUserSignalProc( USIG_PROCESS_INIT, 0 );
+    PROCESS_CallUserSignalProc( USIG_PROCESS_LOADED, 0 );
+    PROCESS_CallUserSignalProc( USIG_PROCESS_RUNNING, 0 );
+
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
         ERR( task, "Called for Win32 task!\n" );
@@ -297,7 +303,7 @@
                   HINSTANCE16 hPrevInstance, UINT16 cmdShow)
 {
     HTASK16 hTask;
-    TDB *pTask, *pInitialTask;
+    TDB *pTask;
     LPSTR cmd_line;
     WORD sp;
     char *stack32Top;
@@ -396,12 +402,6 @@
     pTask->dta = PTR_SEG_OFF_TO_SEGPTR( pTask->hPDB, 
                                 (int)&pTask->pdb.cmdLine - (int)&pTask->pdb );
 
-    /* Inherit default UserSignalHandler from initial process */
-
-    pInitialTask = (TDB *)GlobalLock16( PROCESS_Initial()->task );
-    if ( pInitialTask )
-        pTask->userhandler = pInitialTask->userhandler;
-
     /* If we have a DGROUP/hInstance, use it for 16-bit stack */
  
     if ( hInstance )
@@ -571,9 +571,13 @@
     /* Perform USER cleanup */
 
     if (pTask->userhandler)
-        pTask->userhandler( hCurrentTask, USIG_TERMINATION, 0,
+        pTask->userhandler( hTask, USIG16_TERMINATION, 0,
                             pTask->hInstance, pTask->hQueue );
 
+    PROCESS_CallUserSignalProc( USIG_PROCESS_EXIT, 0 );
+    PROCESS_CallUserSignalProc( USIG_THREAD_EXIT, 0 );     /* FIXME */
+    PROCESS_CallUserSignalProc( USIG_PROCESS_DESTROY, 0 );
+
     if (nTaskCount <= 1)
     {
         TRACE(task, "this is the last task, exiting\n" );