| /* | |
| * Log internal errors | |
| * | |
| * Copyright 1997 Andrew Taylor | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| */ | |
| #include <stdlib.h> | |
| #include <stdarg.h> | |
| #include <stdio.h> | |
| #include <string.h> | |
| #include "windef.h" | |
| #include "winbase.h" | |
| #include "stackframe.h" | |
| #include "wine/debug.h" | |
| /* LogParamError and LogError values */ | |
| /* Error modifier bits */ | |
| #define ERR_WARNING 0x8000 | |
| #define ERR_PARAM 0x4000 | |
| #define ERR_SIZE_MASK 0x3000 | |
| #define ERR_BYTE 0x1000 | |
| #define ERR_WORD 0x2000 | |
| #define ERR_DWORD 0x3000 | |
| /* LogParamError() values */ | |
| /* Generic parameter values */ | |
| #define ERR_BAD_VALUE 0x6001 | |
| #define ERR_BAD_FLAGS 0x6002 | |
| #define ERR_BAD_INDEX 0x6003 | |
| #define ERR_BAD_DVALUE 0x7004 | |
| #define ERR_BAD_DFLAGS 0x7005 | |
| #define ERR_BAD_DINDEX 0x7006 | |
| #define ERR_BAD_PTR 0x7007 | |
| #define ERR_BAD_FUNC_PTR 0x7008 | |
| #define ERR_BAD_SELECTOR 0x6009 | |
| #define ERR_BAD_STRING_PTR 0x700a | |
| #define ERR_BAD_HANDLE 0x600b | |
| /* KERNEL parameter errors */ | |
| #define ERR_BAD_HINSTANCE 0x6020 | |
| #define ERR_BAD_HMODULE 0x6021 | |
| #define ERR_BAD_GLOBAL_HANDLE 0x6022 | |
| #define ERR_BAD_LOCAL_HANDLE 0x6023 | |
| #define ERR_BAD_ATOM 0x6024 | |
| #define ERR_BAD_HFILE 0x6025 | |
| /* USER parameter errors */ | |
| #define ERR_BAD_HWND 0x6040 | |
| #define ERR_BAD_HMENU 0x6041 | |
| #define ERR_BAD_HCURSOR 0x6042 | |
| #define ERR_BAD_HICON 0x6043 | |
| #define ERR_BAD_HDWP 0x6044 | |
| #define ERR_BAD_CID 0x6045 | |
| #define ERR_BAD_HDRVR 0x6046 | |
| /* GDI parameter errors */ | |
| #define ERR_BAD_COORDS 0x7060 | |
| #define ERR_BAD_GDI_OBJECT 0x6061 | |
| #define ERR_BAD_HDC 0x6062 | |
| #define ERR_BAD_HPEN 0x6063 | |
| #define ERR_BAD_HFONT 0x6064 | |
| #define ERR_BAD_HBRUSH 0x6065 | |
| #define ERR_BAD_HBITMAP 0x6066 | |
| #define ERR_BAD_HRGN 0x6067 | |
| #define ERR_BAD_HPALETTE 0x6068 | |
| #define ERR_BAD_HMETAFILE 0x6069 | |
| /* LogError() values */ | |
| /* KERNEL errors */ | |
| #define ERR_GALLOC 0x0001 | |
| #define ERR_GREALLOC 0x0002 | |
| #define ERR_GLOCK 0x0003 | |
| #define ERR_LALLOC 0x0004 | |
| #define ERR_LREALLOC 0x0005 | |
| #define ERR_LLOCK 0x0006 | |
| #define ERR_ALLOCRES 0x0007 | |
| #define ERR_LOCKRES 0x0008 | |
| #define ERR_LOADMODULE 0x0009 | |
| /* USER errors */ | |
| #define ERR_CREATEDLG 0x0040 | |
| #define ERR_CREATEDLG2 0x0041 | |
| #define ERR_REGISTERCLASS 0x0042 | |
| #define ERR_DCBUSY 0x0043 | |
| #define ERR_CREATEWND 0x0044 | |
| #define ERR_STRUCEXTRA 0x0045 | |
| #define ERR_LOADSTR 0x0046 | |
| #define ERR_LOADMENU 0x0047 | |
| #define ERR_NESTEDBEGINPAINT 0x0048 | |
| #define ERR_BADINDEX 0x0049 | |
| #define ERR_CREATEMENU 0x004a | |
| /* GDI errors */ | |
| #define ERR_CREATEDC 0x0080 | |
| #define ERR_CREATEMETA 0x0081 | |
| #define ERR_DELOBJSELECTED 0x0082 | |
| #define ERR_SELBITMAP 0x0083 | |
| #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]; | |
| unsigned int n; | |
| for (n = 0; n < ErrorStringCount; n++) { | |
| if (uErr == ErrorStrings[n].constant) | |
| return ErrorStrings[n].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'; | |
| { | |
| unsigned int n; | |
| for (n = 0; n < ParamErrorStringCount; n++) { | |
| if (uErr == ParamErrorStrings[n].constant) { | |
| strcat(buffer, ParamErrorStrings[n].name); | |
| return buffer; | |
| } | |
| } | |
| } | |
| sprintf(buffer + strlen(buffer), "%x", uErr); | |
| return buffer; | |
| } | |
| /*********************************************************************** | |
| * LogError (KERNEL.324) | |
| */ | |
| VOID WINAPI LogError16(UINT16 uErr, LPVOID lpvInfo) | |
| { | |
| MESSAGE("(%s, %p)\n", GetErrorString(uErr), lpvInfo); | |
| } | |
| /*********************************************************************** | |
| * LogParamError (KERNEL.325) | |
| */ | |
| void WINAPI LogParamError16(UINT16 uErr, FARPROC16 lpfn, LPVOID lpvParam) | |
| { | |
| /* FIXME: is it possible to get the module name/function | |
| * from the lpfn param? | |
| */ | |
| MESSAGE("(%s, %p, %p)\n", GetParamErrorString(uErr), lpfn, lpvParam); | |
| } | |
| /*********************************************************************** | |
| * K327 (KERNEL.327) | |
| */ | |
| void WINAPI HandleParamError( CONTEXT86 *context ) | |
| { | |
| UINT16 uErr = LOWORD(context->Ebx); | |
| FARPROC16 lpfn = (FARPROC16)MAKESEGPTR( context->SegCs, context->Eip ); | |
| LPVOID lpvParam = (LPVOID)MAKELONG( LOWORD(context->Eax), LOWORD(context->Ecx) ); | |
| LogParamError16( uErr, lpfn, lpvParam ); | |
| if (!(uErr & ERR_WARNING)) | |
| { | |
| /* Abort current procedure: Unwind stack frame and jump | |
| to error handler (location at [bp-2]) */ | |
| WORD *stack = MapSL( MAKESEGPTR( context->SegSs, LOWORD(context->Ebp) )); | |
| context->Esp = LOWORD(context->Ebp) - 2; | |
| context->Ebp = stack[0] & 0xfffe; | |
| context->Eip = stack[-1]; | |
| context->Eax = context->Ecx = context->Edx = 0; | |
| context->SegEs = 0; | |
| } | |
| } |