| #ifndef WINELIB |
| /* |
| static char RCSId[] = "$Id: wine.c,v 1.2 1993/07/04 04:04:21 root Exp root $"; |
| static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; |
| */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include "windows.h" |
| #include "callback.h" |
| #include "stackframe.h" |
| #include "win.h" |
| #include "alias.h" |
| #include "relay32.h" |
| #include "stddebug.h" |
| #include "debug.h" |
| |
| |
| /********************************************************************** |
| * CallWindowProc (USER.122) |
| */ |
| LONG CallWindowProc( WNDPROC func, HWND hwnd, WORD message, |
| WORD wParam, LONG lParam ) |
| { |
| FUNCTIONALIAS *a; |
| WND *wndPtr = WIN_FindWndPtr( hwnd ); |
| |
| if (!wndPtr) return 0; |
| |
| /* check if we have something better than 16 bit relays */ |
| if(!ALIAS_UseAliases || !(a=ALIAS_LookupAlias((DWORD)func)) || |
| (!a->wine && !a->win32)) |
| return CallWndProc( (FARPROC)func, wndPtr->hInstance, |
| hwnd, message, wParam, lParam ); |
| if(a->wine) |
| return ((LONG(*)(WORD,WORD,WORD,LONG))(a->wine)) |
| (hwnd,message,wParam,lParam); |
| if(!a->win32) |
| fprintf(stderr,"Where is the Win32 callback?\n"); |
| if (UsesLParamPtr(message)) |
| return RELAY32_CallWindowProc(a->win32,hwnd,message,wParam,lParam ? PTR_SEG_TO_LIN(lParam): 0); |
| else |
| return RELAY32_CallWindowProc(a->win32,hwnd,message,wParam,lParam); |
| } |
| |
| /********************************************************************** |
| * Catch (KERNEL.55) |
| */ |
| INT Catch( LPCATCHBUF lpbuf ) |
| { |
| STACK16FRAME *pFrame = CURRENT_STACK16; |
| |
| dprintf_catch( stddeb, "Catch: buf=%p ss:sp=%04x:%04x\n", |
| lpbuf, IF1632_Saved16_ss, IF1632_Saved16_sp ); |
| |
| /* Note: we don't save the current ss, as the catch buffer is */ |
| /* only 9 words long. Hopefully no one will have the silly */ |
| /* idea to change the current stack before calling Throw()... */ |
| |
| lpbuf[0] = IF1632_Saved16_sp; |
| lpbuf[1] = LOWORD(IF1632_Saved32_esp); |
| lpbuf[2] = HIWORD(IF1632_Saved32_esp); |
| lpbuf[3] = pFrame->saved_ss; |
| lpbuf[4] = pFrame->saved_sp; |
| lpbuf[5] = pFrame->ds; |
| lpbuf[6] = pFrame->bp; |
| lpbuf[7] = pFrame->ip; |
| lpbuf[8] = pFrame->cs; |
| return 0; |
| } |
| |
| |
| /********************************************************************** |
| * Throw (KERNEL.56) |
| */ |
| int Throw( LPCATCHBUF lpbuf, int retval ) |
| { |
| STACK16FRAME *pFrame; |
| |
| dprintf_catch( stddeb, "Throw: buf=%p val=%04x ss:sp=%04x:%04x\n", |
| lpbuf, retval, IF1632_Saved16_ss, IF1632_Saved16_sp ); |
| |
| IF1632_Saved16_sp = lpbuf[0] - sizeof(WORD); |
| IF1632_Saved32_esp = MAKELONG( lpbuf[1], lpbuf[2] ); |
| pFrame = CURRENT_STACK16; |
| pFrame->saved_ss = lpbuf[3]; |
| pFrame->saved_sp = lpbuf[4]; |
| pFrame->ds = lpbuf[5]; |
| pFrame->bp = lpbuf[6]; |
| pFrame->ip = lpbuf[7]; |
| pFrame->cs = lpbuf[8]; |
| pFrame->es = 0; |
| return retval; |
| } |
| |
| |
| #endif /* !WINELIB */ |