Changeset 4224 for trunk/src/kernel32/oslibexcept.cpp
- Timestamp:
- Sep 8, 2000, 8:07:52 PM (25 years ago)
- 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:45sandervl Exp $ */1 /* $Id: oslibexcept.cpp,v 1.3 2000-09-08 18:07:50 sandervl Exp $ */ 2 2 /* 3 3 * Exception handler util. procedures … … 18 18 #include "oslibexcept.h" 19 19 #include <exceptions.h> 20 21 #define DBG_LOCALLOG DBG_oslibexcept 20 #include <wprocess.h> 21 22 #define DBG_LOCALLOG DBG_oslibexcept 22 23 #include "dbglocal.h" 23 24 … … 27 28 // FALSE, otherwise 28 29 //****************************************************************************** 29 BOOL OSLibDispatchException(PEXCEPTIONREPORTRECORD pReportRec,30 PEXCEPTIONREGISTRATIONRECORD pRegistrationRec,31 PCONTEXTRECORD pContextRec, PVOID p)30 BOOL APIENTRY OSLibDispatchException(PEXCEPTIONREPORTRECORD pReportRec, 31 PEXCEPTIONREGISTRATIONRECORD pRegistrationRec, 32 PCONTEXTRECORD pContextRec, PVOID p) 32 33 { 33 34 WINEXCEPTION_RECORD winreportrec; … … 40 41 switch(pReportRec->ExceptionNum) { 41 42 case XCPT_FLOAT_DENORMAL_OPERAND: 42 43 43 winreportrec.ExceptionCode = EXCEPTION_FLT_DENORMAL_OPERAND; 44 break; 44 45 case XCPT_FLOAT_DIVIDE_BY_ZERO: 45 46 46 winreportrec.ExceptionCode = EXCEPTION_FLT_DIVIDE_BY_ZERO; 47 break; 47 48 case XCPT_FLOAT_INEXACT_RESULT: 48 49 49 winreportrec.ExceptionCode = EXCEPTION_FLT_INEXACT_RESULT; 50 break; 50 51 case XCPT_FLOAT_INVALID_OPERATION: 51 52 52 winreportrec.ExceptionCode = EXCEPTION_FLT_INVALID_OPERATION; 53 break; 53 54 case XCPT_FLOAT_OVERFLOW: 54 55 55 winreportrec.ExceptionCode = EXCEPTION_FLT_OVERFLOW; 56 break; 56 57 case XCPT_FLOAT_STACK_CHECK: 57 58 58 winreportrec.ExceptionCode = EXCEPTION_FLT_STACK_CHECK; 59 break; 59 60 case XCPT_FLOAT_UNDERFLOW: 60 61 61 winreportrec.ExceptionCode = EXCEPTION_FLT_UNDERFLOW; 62 break; 62 63 case XCPT_INTEGER_DIVIDE_BY_ZERO: 63 64 64 winreportrec.ExceptionCode = EXCEPTION_INT_DIVIDE_BY_ZERO; 65 break; 65 66 case XCPT_INTEGER_OVERFLOW: 66 67 67 winreportrec.ExceptionCode = EXCEPTION_INT_OVERFLOW; 68 break; 68 69 case XCPT_PRIVILEGED_INSTRUCTION: 69 70 70 winreportrec.ExceptionCode = EXCEPTION_PRIV_INSTRUCTION; 71 break; 71 72 case XCPT_BREAKPOINT: 72 73 73 winreportrec.ExceptionCode = EXCEPTION_BREAKPOINT; 74 break; 74 75 case XCPT_SINGLE_STEP: 75 76 76 winreportrec.ExceptionCode = EXCEPTION_SINGLE_STEP; 77 break; 77 78 case XCPT_ARRAY_BOUNDS_EXCEEDED: 78 79 79 winreportrec.ExceptionCode = EXCEPTION_ARRAY_BOUNDS_EXCEEDED; 80 break; 80 81 case XCPT_DATATYPE_MISALIGNMENT: 81 82 82 winreportrec.ExceptionCode = EXCEPTION_DATATYPE_MISALIGNMENT; 83 break; 83 84 case XCPT_ILLEGAL_INSTRUCTION: 84 85 85 winreportrec.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION; 86 break; 86 87 case XCPT_INVALID_LOCK_SEQUENCE: 87 88 88 winreportrec.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION; 89 break; 89 90 case XCPT_GUARD_PAGE_VIOLATION: 90 91 91 winreportrec.ExceptionCode = EXCEPTION_GUARD_PAGE; 92 break; 92 93 case XCPT_UNABLE_TO_GROW_STACK: 93 94 94 winreportrec.ExceptionCode = EXCEPTION_STACK_OVERFLOW; 95 break; 95 96 case XCPT_IN_PAGE_ERROR: 96 97 97 winreportrec.ExceptionCode = EXCEPTION_IN_PAGE_ERROR; 98 break; 98 99 case XCPT_ACCESS_VIOLATION: 99 100 100 winreportrec.ExceptionCode = EXCEPTION_ACCESS_VIOLATION; 101 break; 101 102 default: //no other exceptions should be dispatched to win32 apps 102 103 return FALSE; 103 104 } 104 105 //TODO: … … 109 110 memset(&wincontextrec, 0, sizeof(wincontextrec)); 110 111 if(pContextRec->ContextFlags & CONTEXT_CONTROL) { 111 112 113 114 115 116 117 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; 118 119 } 119 120 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 128 133 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; 134 141 } 135 142 if(pContextRec->ContextFlags & CONTEXT_FLOATING_POINT) { 136 137 138 139 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)); 140 147 } 141 148 //It doesn't seem correct if we dispatch real exceptions to win32 apps 142 149 //Some just call RtlUnwind and continue as if they were processing an 143 150 //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 145 157 switch(pReportRec->ExceptionNum) { 146 158 case XCPT_FLOAT_DENORMAL_OPERAND: … … 151 163 case XCPT_FLOAT_STACK_CHECK: 152 164 case XCPT_FLOAT_UNDERFLOW: 153 154 165 rc = RtlDispatchException(&winreportrec, &wincontextrec); 166 break; 155 167 156 168 case XCPT_ACCESS_VIOLATION: 157 158 169 rc = RtlDispatchException(&winreportrec, &wincontextrec); 170 break; 159 171 160 172 case XCPT_INTEGER_DIVIDE_BY_ZERO: … … 170 182 case XCPT_UNABLE_TO_GROW_STACK: 171 183 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 174 188 175 189 if(rc == ExceptionContinueExecution) { 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 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 } 193 207 #if 0 194 195 196 197 198 199 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 } 201 215 #endif 202 203 204 205 206 207 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 214 215 216 217 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 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 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; 261 275 } 262 276 dprintf(("Win32 exception handler returned %x", rc));
Note:
See TracChangeset
for help on using the changeset viewer.