| /* |
| * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #include <stdlib.h> |
| #include <stdarg.h> |
| #include <stdio.h> |
| #include <string.h> |
| |
| #include "windef.h" |
| #include "wine/winbase16.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; |
| } |
| |
| |
| /*********************************************************************** |
| * SetLastError (KERNEL.147) |
| */ |
| void WINAPI SetLastError16( DWORD error ) |
| { |
| SetLastError( error ); |
| } |
| |
| |
| /*********************************************************************** |
| * GetLastError (KERNEL.148) |
| */ |
| DWORD WINAPI GetLastError16(void) |
| { |
| return GetLastError(); |
| } |
| |
| |
| /*********************************************************************** |
| * 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( CONTEXT *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; |
| } |
| } |