Changeset 617 for trunk/src


Ignore:
Timestamp:
Aug 22, 1999, 1:11:11 PM (26 years ago)
Author:
sandervl
Message:

Exception handler changes

Location:
trunk/src/kernel32
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/KERNEL32.CPP

    r558 r617  
    1 /* $Id: KERNEL32.CPP,v 1.16 1999-08-18 21:54:26 phaller Exp $ */
     1/* $Id: KERNEL32.CPP,v 1.17 1999-08-22 11:11:09 sandervl Exp $ */
    22
    33/*
     
    937937VOID WIN32API UninitializeCriticalSection(CRITICAL_SECTION * lpcsCriticalSection)
    938938{
    939   dprintf(("KERNEL32:  UninitializeCriticalSection\n"));
     939  dprintf(("KERNEL32:  UninitializeCriticalSection NOT IMPLEMENTED\n"));
    940940}
    941941
  • trunk/src/kernel32/devio.cpp

    r120 r617  
    1 /* $Id: devio.cpp,v 1.3 1999-06-19 10:54:41 sandervl Exp $ */
     1/* $Id: devio.cpp,v 1.4 1999-08-22 11:11:09 sandervl Exp $ */
    22
    33/*
     
    2626#include "cio.h"
    2727#include "map.h"
    28 #include "except.h"
     28#include "exceptutil.h"
    2929
    3030static fX86Init  = FALSE;
  • trunk/src/kernel32/exceptions.cpp

    r420 r617  
    1 /* $Id: exceptions.cpp,v 1.9 1999-08-05 13:11:38 phaller Exp $ */
     1/* $Id: exceptions.cpp,v 1.10 1999-08-22 11:11:10 sandervl Exp $ */
    22
    33/*
     
    5555#include <builtin.h>
    5656#include "exceptions.h"
    57 #include "except.h"
     57#include "exceptutil.h"
    5858#include "misc.h"
    5959
     
    450450  excptaddr = getEBX();
    451451
    452   dprintf(("KERNEL32: KillWin32Process: Do you feel lucky, punk?!\n"));
    453 //  sprintf(excptmsg, "Fatal Exception %X at %X", excptnr, excptaddr);
    454 //  WinMessageBox(HWND_DESKTOP, NULL, excptmsg, "Win32 for OS/2", 0, MB_ERROR | MB_OK);
     452  dprintf(("KERNEL32: KillWin32Process: Do you feel lucky, punk? (FS=%d)!\n", GetFS()));
     453  //Restore original OS/2 TIB selector
     454  RestoreOS2FS();
     455
    455456  SetExceptionChain((ULONG)0);
    456457  DosExit(EXIT_PROCESS, 666);
     
    861862#endif
    862863
    863 ERR _System OS2ExceptionHandler(PEXCEPTIONREPORTRECORD       pERepRec,
    864                                 PEXCEPTIONREGISTRATIONRECORD pERegRec,
    865                                 PCONTEXTRECORD               pCtxRec,
    866                                 PVOID                        p)
     864ULONG APIENTRY OS2ExceptionHandler(PEXCEPTIONREPORTRECORD       pERepRec,
     865                                   PEXCEPTIONREGISTRATIONRECORD pERegRec,
     866                                   PCONTEXTRECORD               pCtxRec,
     867                                   PVOID                        p)
    867868{
    868869  //  pERegRec->prev_structure = 0;
     
    885886               pCtxRec->ctx_stack[0].signexp = 0;
    886887
    887       return (ERR)(XCPT_CONTINUE_EXECUTION);
     888      return (XCPT_CONTINUE_EXECUTION);
    888889
    889890    case XCPT_PROCESS_TERMINATE:
     
    911912    pCtxRec->ctx_RegEax = pERepRec->ExceptionNum;
    912913    pCtxRec->ctx_RegEbx = pCtxRec->ctx_RegEip;
    913     return (ERR)(XCPT_CONTINUE_EXECUTION);
     914    return (XCPT_CONTINUE_EXECUTION);
    914915
    915916  default: //non-continuable exceptions
     
    919920}
    920921
     922/*****************************************************************************
     923 * Name      : void OS2SetExceptionHandler
     924 * Purpose   : Sets the main thread exception handler in FS:[0] (original OS/2 FS selector)
     925 * Parameters: exceptframe: pointer to exception handler frame on stack (2 ULONGs)
     926 * Variables :
     927 * Result    :
     928 * Remark    :
     929 * Status    :
     930 *
     931 * Author    : Sander van Leeuwen [Sun, 1999/08/21 12:16]
     932 *****************************************************************************/
     933void OS2SetExceptionHandler(void *exceptframe)
     934{
     935 PEXCEPTIONREGISTRATIONRECORD pExceptRec = (PEXCEPTIONREGISTRATIONRECORD)exceptframe;
     936
     937  pExceptRec->prev_structure   = 0;
     938  pExceptRec->ExceptionHandler = OS2ExceptionHandler;
     939
     940  /* disable trap popups */
     941//  DosError(FERR_DISABLEEXCEPTION | FERR_DISABLEHARDERR);
     942
     943  DosSetExceptionHandler(pExceptRec);
     944}
     945
     946/*****************************************************************************
     947 * Name      : void OS2UnsetExceptionHandler
     948 * Purpose   : Removes the main thread exception handler in FS:[0] (original OS/2 FS selector)
     949 * Parameters: exceptframe: pointer to exception handler frame on stack (2 ULONGs)
     950 * Variables :
     951 * Result    :
     952 * Remark    :
     953 * Status    :
     954 *
     955 * Author    : Sander van Leeuwen [Sun, 1999/08/21 12:16]
     956 *****************************************************************************/
     957void OS2UnsetExceptionHandler(void *exceptframe)
     958{
     959  DosUnsetExceptionHandler((PEXCEPTIONREGISTRATIONRECORD)exceptframe);
     960}
    921961
    922962/*****************************************************************************
  • trunk/src/kernel32/makefile

    r607 r617  
    1 # $Id: makefile,v 1.23 1999-08-21 16:29:27 sandervl Exp $
     1# $Id: makefile,v 1.24 1999-08-22 11:11:10 sandervl Exp $
    22
    33#
     
    2121OBJS = KERNEL32.OBJ KOBJECTS.OBJ CONSOLE.OBJ CONIN.OBJ CONBUFFER.OBJ \
    2222       CONOUT.OBJ UNICODE.OBJ network.OBJ DEVIO.OBJ profile.obj \
    23        THREAD.OBJ virtual.obj THUNK.OBJ \
    24        OBSOLETE.OBJ \
    25        COMM.OBJ \
    26        MESSAGE.OBJ \
    27        RESOURCE.OBJ \
    28        NAMEID.OBJ \
    29        WINRES.OBJ \
    30        WINMOD.OBJ \
    31        OS2NATIVE.OBJ \
    32        EXCEPTIONS.OBJ \
    33        LFILE.OBJ \
    34        NPIPE.OBJ \
    35        MISC.OBJ \
    36        EXCEPT.OBJ \
    37        LANG.OBJ \
    38        ICCIO.OBJ \
    39        MAP.OBJ \
     23       THREAD.OBJ virtual.obj THUNK.OBJ OBSOLETE.OBJ COMM.OBJ \
     24       MESSAGE.OBJ RESOURCE.OBJ NAMEID.OBJ WINRES.OBJ WINMOD.OBJ \
     25       OS2NATIVE.OBJ EXCEPTIONS.OBJ LFILE.OBJ NPIPE.OBJ \
     26       MISC.OBJ EXCEPTUTIL.OBJ LANG.OBJ ICCIO.OBJ MAP.OBJ \
    4027       WIN32UTIL.OBJ \
    4128       heap.OBJ \
     
    9582
    9683kernel32.OBJ: kernel32.cpp \
    97     except.h \
     84    exceptutil.h \
    9885    $(PDWIN32_INCLUDE)\unicode.h \
    9986    $(PDWIN32_INCLUDE)\heap.h \
     
    162149    .\exceptions.cpp \
    163150    $(PDWIN32_INCLUDE)\exceptions.h \
    164     except.h
     151    exceptutil.h
    165152
    166153message.OBJ: \
     
    170157devio.OBJ: \
    171158    .\devio.cpp \
     159    exceptutil.h \
    172160    devio.h \
    173161    map.h \
     
    262250    $(PDWIN32_INCLUDE)\misc.h
    263251
    264 except.OBJ: \
    265     .\except.asm
     252exceptutil.OBJ: \
     253    .\exceptutil.asm
    266254
    267255iccio.OBJ: \
  • trunk/src/kernel32/os2native.cpp

    r130 r617  
    1 /* $Id: os2native.cpp,v 1.4 1999-06-20 12:46:09 sandervl Exp $ */
     1/* $Id: os2native.cpp,v 1.5 1999-08-22 11:11:10 sandervl Exp $ */
    22
    33/*
     
    5252//******************************************************************************
    5353LPVOID WIN32API VirtualAlloc(LPVOID lpvAddress, DWORD cbSize, DWORD fdwAllocationType,
    54                                  DWORD fdwProtect)
     54                             DWORD fdwProtect)
    5555{
    5656 PVOID Address = lpvAddress;
    57  ULONG flag = 0;
     57 ULONG flag = 0, base;
    5858 APIRET rc;
    5959
    6060  dprintf(("VirtualAlloc at %X; %d bytes, fAlloc %d, fProtect %d\n", (int)lpvAddress, cbSize, fdwAllocationType, fdwProtect));
     61
     62  if (cbSize > 0x7fc00000)  /* 2Gb - 4Mb */
     63  {
     64        dprintf(("VirtualAlloc: size too large"));
     65//        SetLastError( ERROR_OUTOFMEMORY );
     66        return NULL;
     67  }
     68
     69  if (!(fdwAllocationType & (MEM_COMMIT | MEM_RESERVE)) ||
     70       (fdwAllocationType & ~(MEM_COMMIT | MEM_RESERVE)))
     71  {
     72        dprintf(("VirtualAlloc: Invalid parameter"));
     73//        SetLastError( ERROR_INVALID_PARAMETER );
     74        return NULL;
     75  }
    6176
    6277  if(fdwAllocationType & MEM_COMMIT) {
     
    117132  }
    118133
    119 //TODO: Set last error in case rc != 0
     134  //TODO: Set last error in case rc != 0
    120135  if(rc) {
    121136        dprintf(("DosSetMem returned %d\n", rc));
     137//        SetLastError( ERROR_OUTOFMEMORY );
    122138        return(NULL);
    123139  }
  • trunk/src/kernel32/thread.cpp

    r532 r617  
    1 /* $Id: thread.cpp,v 1.10 1999-08-17 17:04:52 sandervl Exp $ */
     1/* $Id: thread.cpp,v 1.11 1999-08-22 11:11:10 sandervl Exp $ */
    22
    33/*
     
    1313#include <stdarg.h>
    1414#include "thread.h"
    15 #include "except.h"
     15#include "exceptutil.h"
    1616#include <misc.h>
    1717#include <wprocess.h>
    1818#include <windll.h>
    1919#include <winexe.h>
     20#include <except.h>
    2021
    2122static DWORD OPEN32API Win32ThreadProc(LPVOID lpData);
     
    154155static DWORD OPEN32API Win32ThreadProc(LPVOID lpData)
    155156{
     157 EXCEPTION_FRAME exceptFrame;
    156158 Win32Thread     *me = (Win32Thread *)lpData;
    157159 WIN32THREADPROC  winthread = me->pCallback;
     
    179181  Win32Dll::attachThreadToAllDlls();      //send DLL_THREAD_ATTACH message to all dlls
    180182
     183  //Note: The Win32 exception structure references by FS:[0] is the same
     184  //      in OS/2
     185  OS2SetExceptionHandler((void *)&exceptFrame);
    181186  rc = winthread(userdata);
     187  OS2UnsetExceptionHandler((void *)&exceptFrame);
    182188
    183189  Win32Dll::detachThreadFromAllDlls();  //send DLL_THREAD_DETACH message to all dlls
  • trunk/src/kernel32/windll.cpp

    r550 r617  
    1 /* $Id: windll.cpp,v 1.10 1999-08-18 17:18:00 sandervl Exp $ */
     1/* $Id: windll.cpp,v 1.11 1999-08-22 11:11:11 sandervl Exp $ */
    22
    33/*
     
    2828#include <windll.h>
    2929#include <wprocess.h>
     30#include "exceptions.h"
     31#include "exceptutil.h"
    3032#include "cio.h"
    3133
     
    268270BOOL Win32Dll::attachProcess()
    269271{
     272 WINEXCEPTION_FRAME exceptFrame;
     273 USHORT sel;
    270274 BOOL rc;
    271  USHORT sel;
    272275
    273276  //Allocate TLS index for this module
     
    282285  dprintf(("attachProcess to dll %s", szModule));
    283286
     287  //Note: The Win32 exception structure references by FS:[0] is the same
     288  //      in OS/2
     289  OS2SetExceptionHandler((void *)&exceptFrame);
     290
    284291  sel = SetWin32TIB();
    285292  rc = dllEntryPoint(hinstance, DLL_PROCESS_ATTACH, 0);
    286293  SetFS(sel);
     294
     295  OS2UnsetExceptionHandler((void *)&exceptFrame);
     296
    287297  return rc;
    288298}
     
    291301BOOL Win32Dll::detachProcess()
    292302{
    293  BOOL   rc;
     303 WINEXCEPTION_FRAME exceptFrame;
    294304 USHORT sel;
     305 BOOL rc;
    295306
    296307  if(fSystemDll || fSkipEntryCalls) {
     
    300311
    301312  dprintf(("detachProcess from dll %s", szModule));
     313
     314  //Note: The Win32 exception structure references by FS:[0] is the same
     315  //      in OS/2
     316  OS2SetExceptionHandler((void *)&exceptFrame);
    302317
    303318  fUnloaded = TRUE;
     
    307322  tlsDetachThread();    //destroy TLS (main thread)
    308323  tlsDelete();
     324
     325  OS2UnsetExceptionHandler((void *)&exceptFrame);
     326
    309327  return rc;
    310328}
     
    313331BOOL Win32Dll::attachThread()
    314332{
     333 WINEXCEPTION_FRAME exceptFrame;
     334 BOOL               rc;
     335
    315336  if(fSystemDll || fSkipEntryCalls)
    316337        return(TRUE);
    317338
    318339  dprintf(("attachThread to dll %s", szModule));
    319   return dllEntryPoint(hinstance, DLL_THREAD_ATTACH, 0);
     340  //Note: The Win32 exception structure references by FS:[0] is the same
     341  //      in OS/2
     342  OS2SetExceptionHandler((void *)&exceptFrame);
     343
     344  rc = dllEntryPoint(hinstance, DLL_THREAD_ATTACH, 0);
     345
     346  OS2UnsetExceptionHandler((void *)&exceptFrame);
     347  return rc;
    320348}
    321349//******************************************************************************
     
    323351BOOL Win32Dll::detachThread()
    324352{
     353 WINEXCEPTION_FRAME exceptFrame;
     354 BOOL               rc;
     355
    325356  if(fSystemDll || fSkipEntryCalls)
    326357        return(TRUE);
    327358
    328359  dprintf(("attachThread from dll %s", szModule));
    329   return dllEntryPoint(hinstance, DLL_THREAD_DETACH, 0);
     360
     361  //Note: The Win32 exception structure references by FS:[0] is the same
     362  //      in OS/2
     363  OS2SetExceptionHandler((void *)&exceptFrame);
     364
     365  rc =  dllEntryPoint(hinstance, DLL_THREAD_DETACH, 0);
     366
     367  OS2UnsetExceptionHandler((void *)&exceptFrame);
     368  return rc;
    330369}
    331370//******************************************************************************
  • trunk/src/kernel32/winexe.cpp

    r506 r617  
    1 /* $Id: winexe.cpp,v 1.9 1999-08-16 13:54:32 sandervl Exp $ */
     1/* $Id: winexe.cpp,v 1.10 1999-08-22 11:11:11 sandervl Exp $ */
    22
    33/*
     
    2727#include <wprocess.h>
    2828#include <pefile.h>
     29#include "exceptions.h"
     30#include "exceptutil.h"
    2931#include "cio.h"
    3032
     
    4446//******************************************************************************
    4547Win32Exe::Win32Exe(char *szFileName) : Win32Image(szFileName), fConsoleApp(FALSE),
    46                    cmdline(NULL), OS2InstanceHandle(-1)
     48                   cmdline(NULL)
    4749{
    4850  fConsoleApp = (oh.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI);
     
    6365Win32Exe::Win32Exe(HINSTANCE hinstance, int NameTableId, int Win32TableId) :
    6466         Win32Image(hinstance, NameTableId, Win32TableId),
    65          fConsoleApp(FALSE), cmdline(NULL), OS2InstanceHandle(-1)
     67         fConsoleApp(FALSE), cmdline(NULL)
    6668{
    6769  if(GET_CONSOLE(Win32TableId) == 1) {//console app
     
    8688ULONG Win32Exe::start()
    8789{
     90 WINEXCEPTION_FRAME exceptFrame;
    8891 ULONG rc;
    8992
     
    99102  tlsAttachThread();    //setup TLS (main thread)
    100103
     104  //Note: The Win32 exception structure references by FS:[0] is the same
     105  //      in OS/2
     106  OS2SetExceptionHandler((void *)&exceptFrame);
     107
    101108  SetWin32TIB();
    102109  rc = ((WIN32EXEENTRY)entryPoint)();
    103110  RestoreOS2TIB();
     111
     112  OS2UnsetExceptionHandler((void *)&exceptFrame);
     113
    104114  return rc;
    105115}
  • trunk/src/kernel32/wintls.cpp

    r286 r617  
    1 /* $Id: wintls.cpp,v 1.3 1999-07-09 15:58:54 sandervl Exp $ */
     1/* $Id: wintls.cpp,v 1.4 1999-08-22 11:11:11 sandervl Exp $ */
    22/*
    33 * Win32 TLS API functions
     
    1313#include <thread.h>
    1414#include <wprocess.h>
     15#include <except.h>
     16#include "exceptutil.h"
    1517
    1618//******************************************************************************
     
    4951void Win32Image::tlsAttachThread()      //setup TLS structures for new thread
    5052{
     53 EXCEPTION_FRAME exceptFrame;
    5154 PIMAGE_TLS_CALLBACK *pCallback;
    52  TEB  *winteb;
    53  char *tibmem;
     55 USHORT sel;
     56 TEB   *winteb;
     57 char  *tibmem;
    5458
    5559   if(!tlsAddress)
     
    8690        while(*pCallback) {
    8791                dprintf(("tlsAttachThread: calling TLS Callback %x", *pCallback));
     92
     93                OS2SetExceptionHandler((void *)&exceptFrame);   
     94                sel = SetWin32TIB();
    8895                (*pCallback)((LPVOID)hinstance, DLL_THREAD_ATTACH, 0);
     96                SetFS(sel);
     97                OS2UnsetExceptionHandler((void *)&exceptFrame);
     98
    8999                dprintf(("tlsAttachThread: finished calling TLS Callback %x", *pCallback));
    90100                *pCallback++;
     
    97107void Win32Image::tlsDetachThread()      //destroy TLS structures
    98108{
     109 EXCEPTION_FRAME exceptFrame;
    99110 PIMAGE_TLS_CALLBACK *pCallback;
    100  TEB  *winteb;
     111 USHORT sel;
     112 TEB   *winteb;
    101113
    102114   if(!tlsAddress)
     
    109121        while(*pCallback) {
    110122                dprintf(("tlsDetachThread: calling TLS Callback %x", *pCallback));
     123
     124                OS2SetExceptionHandler((void *)&exceptFrame);   
     125                sel = SetWin32TIB();
    111126                (*pCallback)((LPVOID)hinstance, DLL_THREAD_DETACH, 0);
     127                SetFS(sel);
     128                OS2UnsetExceptionHandler((void *)&exceptFrame);
     129
    112130                dprintf(("tlsDetachThread: finished calling TLS Callback %x", *pCallback));
    113131                *pCallback++;
  • trunk/src/kernel32/wprocess.cpp

    r593 r617  
    1 /* $Id: wprocess.cpp,v 1.23 1999-08-19 22:10:03 sandervl Exp $ */
     1/* $Id: wprocess.cpp,v 1.24 1999-08-22 11:11:11 sandervl Exp $ */
    22
    33/*
     
    2323#endif
    2424
    25 #include "except.h"
     25#include "exceptutil.h"
    2626#include "os2util.h"
    2727
Note: See TracChangeset for help on using the changeset viewer.