| /* |
| * Log internal errors |
| * |
| * Copyright 1997 Andrew Taylor |
| */ |
| |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include "wintypes.h" |
| #include "stackframe.h" |
| #include "debug.h" |
| |
| #define ErrorString(manifest) { manifest, # manifest } |
| |
| static const struct { |
| int constant; |
| const char *name; |
| } ErrorStrings[] = { |
| |
| ErrorString(ERR_GALLOC), |
| ErrorString(ERR_GREALLOC), |
| ErrorString(ERR_GLOCK), |
| ErrorString(ERR_LALLOC), |
| ErrorString(ERR_LREALLOC), |
| ErrorString(ERR_LLOCK), |
| ErrorString(ERR_ALLOCRES), |
| ErrorString(ERR_LOCKRES), |
| ErrorString(ERR_LOADMODULE), |
| ErrorString(ERR_CREATEDLG), |
| ErrorString(ERR_CREATEDLG2), |
| ErrorString(ERR_REGISTERCLASS), |
| ErrorString(ERR_DCBUSY), |
| ErrorString(ERR_CREATEWND), |
| ErrorString(ERR_STRUCEXTRA), |
| ErrorString(ERR_LOADSTR), |
| ErrorString(ERR_LOADMENU), |
| ErrorString(ERR_NESTEDBEGINPAINT), |
| ErrorString(ERR_BADINDEX), |
| ErrorString(ERR_CREATEMENU), |
| ErrorString(ERR_CREATEDC), |
| ErrorString(ERR_CREATEMETA), |
| ErrorString(ERR_DELOBJSELECTED), |
| ErrorString(ERR_SELBITMAP) |
| }; |
| |
| static const struct { |
| int constant; |
| const char *name; |
| } ParamErrorStrings[] = { |
| |
| ErrorString(ERR_BAD_VALUE), |
| ErrorString(ERR_BAD_FLAGS), |
| ErrorString(ERR_BAD_INDEX), |
| ErrorString(ERR_BAD_DVALUE), |
| ErrorString(ERR_BAD_DFLAGS), |
| ErrorString(ERR_BAD_DINDEX), |
| ErrorString(ERR_BAD_PTR), |
| ErrorString(ERR_BAD_FUNC_PTR), |
| ErrorString(ERR_BAD_SELECTOR), |
| ErrorString(ERR_BAD_STRING_PTR), |
| ErrorString(ERR_BAD_HANDLE), |
| ErrorString(ERR_BAD_HINSTANCE), |
| ErrorString(ERR_BAD_HMODULE), |
| ErrorString(ERR_BAD_GLOBAL_HANDLE), |
| ErrorString(ERR_BAD_LOCAL_HANDLE), |
| ErrorString(ERR_BAD_ATOM), |
| ErrorString(ERR_BAD_HFILE), |
| ErrorString(ERR_BAD_HWND), |
| ErrorString(ERR_BAD_HMENU), |
| ErrorString(ERR_BAD_HCURSOR), |
| ErrorString(ERR_BAD_HICON), |
| ErrorString(ERR_BAD_HDWP), |
| ErrorString(ERR_BAD_CID), |
| ErrorString(ERR_BAD_HDRVR), |
| ErrorString(ERR_BAD_COORDS), |
| ErrorString(ERR_BAD_GDI_OBJECT), |
| ErrorString(ERR_BAD_HDC), |
| ErrorString(ERR_BAD_HPEN), |
| ErrorString(ERR_BAD_HFONT), |
| ErrorString(ERR_BAD_HBRUSH), |
| ErrorString(ERR_BAD_HBITMAP), |
| ErrorString(ERR_BAD_HRGN), |
| ErrorString(ERR_BAD_HPALETTE), |
| ErrorString(ERR_BAD_HMETAFILE) |
| }; |
| |
| #undef ErrorString |
| #define ErrorStringCount (sizeof(ErrorStrings) / sizeof(ErrorStrings[0])) |
| #define ParamErrorStringCount (sizeof(ParamErrorStrings) / sizeof(ParamErrorStrings[0])) |
| |
| /*********************************************************************** |
| * GetErrorString (internal) |
| */ |
| static const char *GetErrorString(UINT16 uErr) |
| { |
| static char buffer[80]; |
| int i; |
| |
| for (i = 0; i < ErrorStringCount; i++) { |
| if (uErr == ErrorStrings[i].constant) |
| return ErrorStrings[i].name; |
| } |
| |
| sprintf(buffer, "%x", uErr); |
| return buffer; |
| } |
| |
| |
| /*********************************************************************** |
| * GetParamErrorString (internal) |
| */ |
| static const char *GetParamErrorString(UINT16 uErr) { |
| static char buffer[80]; |
| |
| if (uErr & ERR_WARNING) { |
| strcpy(buffer, "ERR_WARNING | "); |
| uErr &= ~ERR_WARNING; |
| } else |
| buffer[0] = '\0'; |
| |
| { |
| int i; |
| |
| for (i = 0; i < ParamErrorStringCount; i++) { |
| if (uErr == ParamErrorStrings[i].constant) { |
| strcat(buffer, ParamErrorStrings[i].name); |
| return buffer; |
| } |
| } |
| } |
| |
| sprintf(buffer + strlen(buffer), "%x", uErr); |
| return buffer; |
| } |
| |
| |
| /*********************************************************************** |
| * LogError (KERNEL.324) |
| */ |
| VOID WINAPI LogError(UINT16 uErr, LPVOID lpvInfo) |
| { |
| MSG("(%s, %p)\n", GetErrorString(uErr), lpvInfo); |
| } |
| |
| |
| /*********************************************************************** |
| * LogParamError (KERNEL.325) |
| */ |
| void WINAPI LogParamError(UINT16 uErr, FARPROC16 lpfn, LPVOID lpvParam) |
| { |
| /* FIXME: is it possible to get the module name/function |
| * from the lpfn param? |
| */ |
| MSG("(%s, %p, %p)\n", GetParamErrorString(uErr), lpfn, lpvParam); |
| } |
| |
| /*********************************************************************** |
| * HandleParamError (KERNEL.327) |
| */ |
| void WINAPI HandleParamError( CONTEXT *context ) |
| { |
| UINT16 uErr = BX_reg( context ); |
| FARPROC16 lpfn = (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( CS_reg(context), |
| EIP_reg(context) ); |
| LPVOID lpvParam = (LPVOID)MAKELONG( AX_reg( context ), |
| CX_reg( context ) ); |
| |
| LogParamError( uErr, lpfn, lpvParam ); |
| |
| if (!(uErr & ERR_WARNING)) |
| { |
| /* Abort current procedure: Unwind stack frame and jump |
| to error handler (location at [bp-2]) */ |
| |
| WORD *stack = PTR_SEG_OFF_TO_LIN( SS_reg( context ), |
| BP_reg( context )); |
| SP_reg( context ) = BP_reg( context ) - 2; |
| BP_reg( context ) = stack[0] & 0xfffe; |
| |
| IP_reg( context ) = stack[-1]; |
| |
| EAX_reg( context ) = ECX_reg( context ) = EDX_reg( context ) = 0; |
| ES_reg( context) = 0; |
| } |
| } |
| |