Ignore:
Timestamp:
Sep 8, 2000, 8:07:52 PM (25 years ago)
Author:
sandervl
Message:

exception changes, implemented enumresourcelanguages + put back some old code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/oslibexcept.cpp

    r2803 r4224  
    1 /* $Id: oslibexcept.cpp,v 1.2 2000-02-16 14:25:45 sandervl Exp $ */
     1/* $Id: oslibexcept.cpp,v 1.3 2000-09-08 18:07:50 sandervl Exp $ */
    22/*
    33 * Exception handler util. procedures
     
    1818#include "oslibexcept.h"
    1919#include <exceptions.h>
    20 
    21 #define DBG_LOCALLOG    DBG_oslibexcept
     20#include <wprocess.h>
     21
     22#define DBG_LOCALLOG    DBG_oslibexcept
    2223#include "dbglocal.h"
    2324
     
    2728//         FALSE, otherwise
    2829//******************************************************************************
    29 BOOL OSLibDispatchException(PEXCEPTIONREPORTRECORD pReportRec,
    30                             PEXCEPTIONREGISTRATIONRECORD pRegistrationRec,
    31                             PCONTEXTRECORD pContextRec, PVOID p)
     30BOOL APIENTRY OSLibDispatchException(PEXCEPTIONREPORTRECORD pReportRec,
     31                                     PEXCEPTIONREGISTRATIONRECORD pRegistrationRec,
     32                                     PCONTEXTRECORD pContextRec, PVOID p)
    3233{
    3334 WINEXCEPTION_RECORD winreportrec;
     
    4041  switch(pReportRec->ExceptionNum) {
    4142  case XCPT_FLOAT_DENORMAL_OPERAND:
    42         winreportrec.ExceptionCode = EXCEPTION_FLT_DENORMAL_OPERAND;
    43         break;
     43        winreportrec.ExceptionCode = EXCEPTION_FLT_DENORMAL_OPERAND;
     44        break;
    4445  case XCPT_FLOAT_DIVIDE_BY_ZERO:
    45         winreportrec.ExceptionCode = EXCEPTION_FLT_DIVIDE_BY_ZERO;
    46         break;
     46        winreportrec.ExceptionCode = EXCEPTION_FLT_DIVIDE_BY_ZERO;
     47        break;
    4748  case XCPT_FLOAT_INEXACT_RESULT:
    48         winreportrec.ExceptionCode = EXCEPTION_FLT_INEXACT_RESULT;
    49         break;
     49        winreportrec.ExceptionCode = EXCEPTION_FLT_INEXACT_RESULT;
     50        break;
    5051  case XCPT_FLOAT_INVALID_OPERATION:
    51         winreportrec.ExceptionCode = EXCEPTION_FLT_INVALID_OPERATION;
    52         break;
     52        winreportrec.ExceptionCode = EXCEPTION_FLT_INVALID_OPERATION;
     53        break;
    5354  case XCPT_FLOAT_OVERFLOW:
    54         winreportrec.ExceptionCode = EXCEPTION_FLT_OVERFLOW;
    55         break;
     55        winreportrec.ExceptionCode = EXCEPTION_FLT_OVERFLOW;
     56        break;
    5657  case XCPT_FLOAT_STACK_CHECK:
    57         winreportrec.ExceptionCode = EXCEPTION_FLT_STACK_CHECK;
    58         break;
     58        winreportrec.ExceptionCode = EXCEPTION_FLT_STACK_CHECK;
     59        break;
    5960  case XCPT_FLOAT_UNDERFLOW:
    60         winreportrec.ExceptionCode = EXCEPTION_FLT_UNDERFLOW;
    61         break;
     61        winreportrec.ExceptionCode = EXCEPTION_FLT_UNDERFLOW;
     62        break;
    6263  case XCPT_INTEGER_DIVIDE_BY_ZERO:
    63         winreportrec.ExceptionCode = EXCEPTION_INT_DIVIDE_BY_ZERO;
    64         break;
     64        winreportrec.ExceptionCode = EXCEPTION_INT_DIVIDE_BY_ZERO;
     65        break;
    6566  case XCPT_INTEGER_OVERFLOW:
    66         winreportrec.ExceptionCode = EXCEPTION_INT_OVERFLOW;
    67         break;
     67        winreportrec.ExceptionCode = EXCEPTION_INT_OVERFLOW;
     68        break;
    6869  case XCPT_PRIVILEGED_INSTRUCTION:
    69         winreportrec.ExceptionCode = EXCEPTION_PRIV_INSTRUCTION;
    70         break;
     70        winreportrec.ExceptionCode = EXCEPTION_PRIV_INSTRUCTION;
     71        break;
    7172  case XCPT_BREAKPOINT:
    72         winreportrec.ExceptionCode = EXCEPTION_BREAKPOINT;
    73         break;
     73        winreportrec.ExceptionCode = EXCEPTION_BREAKPOINT;
     74        break;
    7475  case XCPT_SINGLE_STEP:
    75         winreportrec.ExceptionCode = EXCEPTION_SINGLE_STEP;
    76         break;
     76        winreportrec.ExceptionCode = EXCEPTION_SINGLE_STEP;
     77        break;
    7778  case XCPT_ARRAY_BOUNDS_EXCEEDED:
    78         winreportrec.ExceptionCode = EXCEPTION_ARRAY_BOUNDS_EXCEEDED;
    79         break;
     79        winreportrec.ExceptionCode = EXCEPTION_ARRAY_BOUNDS_EXCEEDED;
     80        break;
    8081  case XCPT_DATATYPE_MISALIGNMENT:
    81         winreportrec.ExceptionCode = EXCEPTION_DATATYPE_MISALIGNMENT;
    82         break;
     82        winreportrec.ExceptionCode = EXCEPTION_DATATYPE_MISALIGNMENT;
     83        break;
    8384  case XCPT_ILLEGAL_INSTRUCTION:
    84         winreportrec.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;
    85         break;
     85        winreportrec.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;
     86        break;
    8687  case XCPT_INVALID_LOCK_SEQUENCE:
    87         winreportrec.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;
    88         break;
     88        winreportrec.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;
     89        break;
    8990  case XCPT_GUARD_PAGE_VIOLATION:
    90         winreportrec.ExceptionCode = EXCEPTION_GUARD_PAGE;
    91         break;
     91        winreportrec.ExceptionCode = EXCEPTION_GUARD_PAGE;
     92        break;
    9293  case XCPT_UNABLE_TO_GROW_STACK:
    93         winreportrec.ExceptionCode = EXCEPTION_STACK_OVERFLOW;
    94         break;
     94        winreportrec.ExceptionCode = EXCEPTION_STACK_OVERFLOW;
     95        break;
    9596  case XCPT_IN_PAGE_ERROR:
    96         winreportrec.ExceptionCode = EXCEPTION_IN_PAGE_ERROR;
    97         break;
     97        winreportrec.ExceptionCode = EXCEPTION_IN_PAGE_ERROR;
     98        break;
    9899  case XCPT_ACCESS_VIOLATION:
    99         winreportrec.ExceptionCode = EXCEPTION_ACCESS_VIOLATION;
    100         break;
     100        winreportrec.ExceptionCode = EXCEPTION_ACCESS_VIOLATION;
     101        break;
    101102  default: //no other exceptions should be dispatched to win32 apps
    102         return FALSE;
     103        return FALSE;
    103104  }
    104105  //TODO:
     
    109110  memset(&wincontextrec, 0, sizeof(wincontextrec));
    110111  if(pContextRec->ContextFlags & CONTEXT_CONTROL) {
    111         wincontextrec.ContextFlags |= WINCONTEXT_CONTROL;
    112         wincontextrec.Ebp     = pContextRec->ctx_RegEbp;
    113         wincontextrec.Eip     = pContextRec->ctx_RegEip;
    114         wincontextrec.SegCs   = pContextRec->ctx_SegCs;
    115         wincontextrec.EFlags  = pContextRec->ctx_EFlags;
    116         wincontextrec.Esp     = pContextRec->ctx_RegEsp;
    117         wincontextrec.SegSs   = pContextRec->ctx_SegSs;
     112        wincontextrec.ContextFlags |= WINCONTEXT_CONTROL;
     113        wincontextrec.Ebp     = pContextRec->ctx_RegEbp;
     114        wincontextrec.Eip     = pContextRec->ctx_RegEip;
     115        wincontextrec.SegCs   = pContextRec->ctx_SegCs;
     116        wincontextrec.EFlags  = pContextRec->ctx_EFlags;
     117        wincontextrec.Esp     = pContextRec->ctx_RegEsp;
     118        wincontextrec.SegSs   = pContextRec->ctx_SegSs;
    118119  }
    119120  if(pContextRec->ContextFlags & CONTEXT_INTEGER) {
    120         wincontextrec.ContextFlags |= WINCONTEXT_INTEGER;
    121         wincontextrec.Edi     = pContextRec->ctx_RegEdi;
    122         wincontextrec.Esi     = pContextRec->ctx_RegEsi;
    123         wincontextrec.Ebx     = pContextRec->ctx_RegEbx;
    124         wincontextrec.Edx     = pContextRec->ctx_RegEdx;
    125         wincontextrec.Ecx     = pContextRec->ctx_RegEcx;
    126         wincontextrec.Eax     = pContextRec->ctx_RegEax;
    127   }
     121        wincontextrec.ContextFlags |= WINCONTEXT_INTEGER;
     122        wincontextrec.Edi     = pContextRec->ctx_RegEdi;
     123        wincontextrec.Esi     = pContextRec->ctx_RegEsi;
     124        wincontextrec.Ebx     = pContextRec->ctx_RegEbx;
     125        wincontextrec.Edx     = pContextRec->ctx_RegEdx;
     126        wincontextrec.Ecx     = pContextRec->ctx_RegEcx;
     127        wincontextrec.Eax     = pContextRec->ctx_RegEax;
     128  }
     129
     130  TEB  *winteb = GetThreadTEB();
     131  THDB *thdb   = (THDB *)(winteb+1);
     132
    128133  if(pContextRec->ContextFlags & CONTEXT_SEGMENTS) {
    129         wincontextrec.ContextFlags |= WINCONTEXT_SEGMENTS;
    130         wincontextrec.SegGs   = pContextRec->ctx_SegGs;
    131         wincontextrec.SegFs   = pContextRec->ctx_SegFs;
    132         wincontextrec.SegEs   = pContextRec->ctx_SegEs;
    133         wincontextrec.SegDs   = pContextRec->ctx_SegDs;
     134        wincontextrec.ContextFlags |= WINCONTEXT_SEGMENTS;
     135        wincontextrec.SegGs   = pContextRec->ctx_SegGs;
     136//   This resets FS to 0x150B - we DON'T want that!!
     137//      wincontextrec.SegFs   = pContextRec->ctx_SegFs;
     138        wincontextrec.SegFs   = thdb->teb_sel;
     139        wincontextrec.SegEs   = pContextRec->ctx_SegEs;
     140        wincontextrec.SegDs   = pContextRec->ctx_SegDs;
    134141  }
    135142  if(pContextRec->ContextFlags & CONTEXT_FLOATING_POINT) {
    136         wincontextrec.ContextFlags |= WINCONTEXT_FLOATING_POINT;
    137         //TODO: First 7 dwords the same?
    138         memcpy(&wincontextrec.FloatSave, pContextRec->ctx_env, sizeof(pContextRec->ctx_env));
    139         memcpy(&wincontextrec.FloatSave.RegisterArea, pContextRec->ctx_stack, sizeof(pContextRec->ctx_stack));
     143        wincontextrec.ContextFlags |= WINCONTEXT_FLOATING_POINT;
     144        //TODO: First 7 dwords the same?
     145        memcpy(&wincontextrec.FloatSave, pContextRec->ctx_env, sizeof(pContextRec->ctx_env));
     146        memcpy(&wincontextrec.FloatSave.RegisterArea, pContextRec->ctx_stack, sizeof(pContextRec->ctx_stack));
    140147  }
    141148  //It doesn't seem correct if we dispatch real exceptions to win32 apps
    142149  //Some just call RtlUnwind and continue as if they were processing an
    143150  //exception thrown by C++ code. (instead of real OS exception)
    144 #if 0
     151#if 1
     152  // We need to reset FS to its original (Win32) value, otherwise we'll likely
     153  // fuck up the Win32 exception handlers. They could end up using the wrong
     154  // exception chain if they access FS:[0] directly.
     155  DWORD oldsel = SetReturnFS(thdb->teb_sel);
     156
    145157  switch(pReportRec->ExceptionNum) {
    146158  case XCPT_FLOAT_DENORMAL_OPERAND:
     
    151163  case XCPT_FLOAT_STACK_CHECK:
    152164  case XCPT_FLOAT_UNDERFLOW:
    153         rc = RtlDispatchException(&winreportrec, &wincontextrec);
    154         break;
     165        rc = RtlDispatchException(&winreportrec, &wincontextrec);
     166        break;
    155167
    156168  case XCPT_ACCESS_VIOLATION:
    157         rc = RtlDispatchException(&winreportrec, &wincontextrec);
    158         break;
     169        rc = RtlDispatchException(&winreportrec, &wincontextrec);
     170        break;
    159171
    160172  case XCPT_INTEGER_DIVIDE_BY_ZERO:
     
    170182  case XCPT_UNABLE_TO_GROW_STACK:
    171183  case XCPT_IN_PAGE_ERROR:
    172         return FALSE; //let's no dispatch those for now
    173   }
     184        SetFS(oldsel);  //restore FS
     185        return FALSE; //let's not dispatch those for now
     186  }
     187  SetFS(oldsel);        //restore FS
    174188
    175189  if(rc == ExceptionContinueExecution) {
    176         dprintf(("Win32 exception handler returned ExceptionContinueExecution"));
    177         if(wincontextrec.ContextFlags & WINCONTEXT_CONTROL) {
    178                 pContextRec->ctx_RegEbp = wincontextrec.Ebp;
    179                 pContextRec->ctx_RegEip = wincontextrec.Eip;
    180                 pContextRec->ctx_SegCs  = wincontextrec.SegCs;
    181                 pContextRec->ctx_EFlags = wincontextrec.EFlags;
    182                 pContextRec->ctx_RegEsp = wincontextrec.Esp;
    183                 pContextRec->ctx_SegSs  = wincontextrec.SegSs;
    184         }
    185         if(wincontextrec.ContextFlags & WINCONTEXT_INTEGER) {
    186                 pContextRec->ctx_RegEdi = wincontextrec.Edi;
    187                 pContextRec->ctx_RegEsi = wincontextrec.Esi;
    188                 pContextRec->ctx_RegEbx = wincontextrec.Ebx;
    189                 pContextRec->ctx_RegEdx = wincontextrec.Edx;
    190                 pContextRec->ctx_RegEcx = wincontextrec.Ecx;
    191                 pContextRec->ctx_RegEax = wincontextrec.Eax;
    192         }
     190        dprintf(("Win32 exception handler returned ExceptionContinueExecution"));
     191        if(wincontextrec.ContextFlags & WINCONTEXT_CONTROL) {
     192                pContextRec->ctx_RegEbp = wincontextrec.Ebp;
     193                pContextRec->ctx_RegEip = wincontextrec.Eip;
     194                pContextRec->ctx_SegCs  = wincontextrec.SegCs;
     195                pContextRec->ctx_EFlags = wincontextrec.EFlags;
     196                pContextRec->ctx_RegEsp = wincontextrec.Esp;
     197                pContextRec->ctx_SegSs  = wincontextrec.SegSs;
     198        }
     199        if(wincontextrec.ContextFlags & WINCONTEXT_INTEGER) {
     200                pContextRec->ctx_RegEdi = wincontextrec.Edi;
     201                pContextRec->ctx_RegEsi = wincontextrec.Esi;
     202                pContextRec->ctx_RegEbx = wincontextrec.Ebx;
     203                pContextRec->ctx_RegEdx = wincontextrec.Edx;
     204                pContextRec->ctx_RegEcx = wincontextrec.Ecx;
     205                pContextRec->ctx_RegEax = wincontextrec.Eax;
     206        }
    193207#if 0
    194         //This is not a good idea
    195         if(wincontextrec.ContextFlags & WINCONTEXT_SEGMENTS) {
    196                 pContextRec->ctx_SegGs = wincontextrec.SegGs;
    197                 pContextRec->ctx_SegFs = wincontextrec.SegFs;
    198                 pContextRec->ctx_SegEs = wincontextrec.SegEs;
    199                 pContextRec->ctx_SegDs = wincontextrec.SegDs;
    200         }
     208        //This is not a good idea
     209        if(wincontextrec.ContextFlags & WINCONTEXT_SEGMENTS) {
     210                pContextRec->ctx_SegGs = wincontextrec.SegGs;
     211                pContextRec->ctx_SegFs = wincontextrec.SegFs;
     212                pContextRec->ctx_SegEs = wincontextrec.SegEs;
     213                pContextRec->ctx_SegDs = wincontextrec.SegDs;
     214        }
    201215#endif
    202         if(wincontextrec.ContextFlags & WINCONTEXT_FLOATING_POINT) {
    203                 //TODO: First 7 dwords the same?
    204                 memcpy(pContextRec->ctx_env, &wincontextrec.FloatSave, sizeof(pContextRec->ctx_env));
    205                 memcpy(pContextRec->ctx_stack, &wincontextrec.FloatSave.RegisterArea, sizeof(pContextRec->ctx_stack));
    206         }
    207         if (pContextRec->ContextFlags & CONTEXT_CONTROL)         /* check flags */
    208                 dprintf(("   SS:ESP=%04x:%08x EFLAGS=%08x\n"
    209                              "   CS:EIP=%04x:%08x EBP   =%08x\n",
    210                              pContextRec->ctx_SegSs,
    211                              pContextRec->ctx_RegEsp,
    212                              pContextRec->ctx_EFlags,
    213                              pContextRec->ctx_SegCs,
    214                              pContextRec->ctx_RegEip,
    215                              pContextRec->ctx_RegEbp));
    216 
    217         if (pContextRec->ContextFlags & CONTEXT_INTEGER)         /* check flags */
    218                     dprintf(("   EAX=%08x EBX=%08x ESI=%08x\n"
    219                              "   ECX=%08x EDX=%08x EDI=%08x\n",
    220                              pContextRec->ctx_RegEax,
    221                              pContextRec->ctx_RegEbx,
    222                              pContextRec->ctx_RegEsi,
    223                              pContextRec->ctx_RegEcx,
    224                              pContextRec->ctx_RegEdx,
    225                              pContextRec->ctx_RegEdi));
    226                
    227         if (pContextRec->ContextFlags & CONTEXT_SEGMENTS)        /* check flags */
    228                     dprintf(("   DS=%04x     ES=%08x"
    229                              "   FS=%04x     GS=%04x\n",
    230                               pContextRec->ctx_SegDs,
    231                               pContextRec->ctx_SegEs,
    232                               pContextRec->ctx_SegFs,
    233                               pContextRec->ctx_SegGs));
    234 
    235         if (pContextRec->ContextFlags & CONTEXT_FLOATING_POINT)  /* check flags */
    236         {
    237             ULONG ulCounter;                 /* temporary local counter for fp stack */
    238 
    239                 dprintf(("   Env[0]=%08x Env[1]=%08x Env[2]=%08x Env[3]=%08x\n",
    240                              pContextRec->ctx_env[0],
    241                              pContextRec->ctx_env[1],
    242                              pContextRec->ctx_env[2],
    243                              pContextRec->ctx_env[3]));
    244                
    245                 dprintf(("   Env[4]=%08x Env[5]=%08x Env[6]=%08x\n",
    246                              pContextRec->ctx_env[4],
    247                              pContextRec->ctx_env[5],
    248                              pContextRec->ctx_env[6]));
    249 
    250                 for (ulCounter = 0;
    251                      ulCounter < 8; /* see TOOLKIT\INCLUDE\BSEEXPT.H, _CONTEXT structure */
    252                      ulCounter ++)
    253                       dprintf(("   FP-Stack[%u] losig=%08x hisig=%08x signexp=%04x\n",
    254                                ulCounter,
    255                                pContextRec->ctx_stack[0].losig,
    256                                pContextRec->ctx_stack[0].hisig,
    257                                pContextRec->ctx_stack[0].signexp));
    258         }
    259        
    260         return TRUE;
     216        if(wincontextrec.ContextFlags & WINCONTEXT_FLOATING_POINT) {
     217                //TODO: First 7 dwords the same?
     218                memcpy(pContextRec->ctx_env, &wincontextrec.FloatSave, sizeof(pContextRec->ctx_env));
     219                memcpy(pContextRec->ctx_stack, &wincontextrec.FloatSave.RegisterArea, sizeof(pContextRec->ctx_stack));
     220        }
     221        if (pContextRec->ContextFlags & CONTEXT_CONTROL)         /* check flags */
     222                dprintf(("   SS:ESP=%04x:%08x EFLAGS=%08x\n",
     223                             pContextRec->ctx_SegSs,
     224                             pContextRec->ctx_RegEsp,
     225                             pContextRec->ctx_EFlags));
     226                dprintf(("   CS:EIP=%04x:%08x EBP   =%08x\n",
     227                             pContextRec->ctx_SegCs,
     228                             pContextRec->ctx_RegEip,
     229                             pContextRec->ctx_RegEbp));
     230
     231        if (pContextRec->ContextFlags & CONTEXT_INTEGER)         /* check flags */
     232                    dprintf(("   EAX=%08x EBX=%08x ESI=%08x\n",
     233                             pContextRec->ctx_RegEax,
     234                             pContextRec->ctx_RegEbx,
     235                             pContextRec->ctx_RegEsi));
     236                    dprintf(("   ECX=%08x EDX=%08x EDI=%08x\n",
     237                             pContextRec->ctx_RegEcx,
     238                             pContextRec->ctx_RegEdx,
     239                             pContextRec->ctx_RegEdi));
     240
     241        if (pContextRec->ContextFlags & CONTEXT_SEGMENTS)        /* check flags */
     242                    dprintf(("   DS=%04x     ES=%08x"
     243                             "   FS=%04x     GS=%04x\n",
     244                              pContextRec->ctx_SegDs,
     245                              pContextRec->ctx_SegEs,
     246                              pContextRec->ctx_SegFs,
     247                              pContextRec->ctx_SegGs));
     248
     249        if (pContextRec->ContextFlags & CONTEXT_FLOATING_POINT)  /* check flags */
     250        {
     251            ULONG ulCounter;                 /* temporary local counter for fp stack */
     252
     253                dprintf(("   Env[0]=%08x Env[1]=%08x Env[2]=%08x Env[3]=%08x\n",
     254                             pContextRec->ctx_env[0],
     255                             pContextRec->ctx_env[1],
     256                             pContextRec->ctx_env[2],
     257                             pContextRec->ctx_env[3]));
     258
     259                dprintf(("   Env[4]=%08x Env[5]=%08x Env[6]=%08x\n",
     260                             pContextRec->ctx_env[4],
     261                             pContextRec->ctx_env[5],
     262                             pContextRec->ctx_env[6]));
     263
     264                for (ulCounter = 0;
     265                     ulCounter < 8; /* see TOOLKIT\INCLUDE\BSEEXPT.H, _CONTEXT structure */
     266                     ulCounter ++)
     267                      dprintf(("   FP-Stack[%u] losig=%08x hisig=%08x signexp=%04x\n",
     268                               ulCounter,
     269                               pContextRec->ctx_stack[0].losig,
     270                               pContextRec->ctx_stack[0].hisig,
     271                               pContextRec->ctx_stack[0].signexp));
     272        }
     273
     274        return TRUE;
    261275  }
    262276  dprintf(("Win32 exception handler returned %x", rc));
Note: See TracChangeset for help on using the changeset viewer.