diff --git a/ANNOUNCE b/ANNOUNCE index 64fa51771d1..e2d0c9868c0 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,14 +1,14 @@ -This is release 960331 of Wine the MS Windows emulator. This is still a +This is release 960405 of Wine the MS Windows emulator. This is still a developer's only release. There are many bugs and many unimplemented API features. Most applications still do not work. Patches should be submitted to "julliard@lrc.epfl.ch". Please don't forget to include a ChangeLog entry. -WHAT'S NEW with Wine-960331: (see ChangeLog for details) - - Many improvements to keyboard handling. - - New registry code with Win32 support. - - Support for Italian language. +WHAT'S NEW with Wine-960405: (see ChangeLog for details) + - Faster text display. + - Support for SCO OpenServer 5. + - Cleaner Win32 module handling. - Lots of bug fixes. See the README file in the distribution for installation instructions. @@ -17,10 +17,10 @@ Because of lags created by using mirror, this message may reach you before the release is available at the ftp sites. The sources will be available from the following locations: - sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960331.tar.gz - tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960331.tar.gz - ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960331.tar.gz - aris.com:/pub/linux/ALPHA/Wine/development/Wine-960331.tar.gz + sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960405.tar.gz + tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960405.tar.gz + ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960405.tar.gz + aris.com:/pub/linux/ALPHA/Wine/development/Wine-960405.tar.gz It should also be available from any site that mirrors tsx-11 or sunsite. diff --git a/ChangeLog b/ChangeLog index 88685439e5f..f37c6bd62b5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,75 @@ +---------------------------------------------------------------------- +Fri Apr 5 15:22:55 1996 Alexandre Julliard + + * [controls/button.c] [controls/static.c] + Changes to use WND * wherever possible. + + * [debugger/dbg.y] [debugger/debug.l] + Added 'info module' and 'walk module' commands. + + * [if1632/Makefile.in] [if1632/relay.c] [tools/build.c] + Added assembly code generation to call from Wine into 32-bit code. + Changed all 'call32' references in 'callfrom16' to avoid confusion + with Win32 routines. + + * [include/callback.h] + Added prototypes for 32-bit callbacks. + + * [loader/module.c] [if1632/relay32.c] [tools/build.c] + Unified 16- and 32-bit modules. The fake module for 32-bit DLLs is + now generated by the build program. + + * [include/module.h] + Added extra info to NE_MODULE for Win32 modules to point to the PE + module data. + + * [include/pe_image.h] [loader/pe_image.c] [win32/resource.c] + Removed the wine_files list. The PE data for a module can now be + accessed with the NE_WIN32_MODULE macro. + + * [loader/signal.c] [miscemu/instr.c] + Don't start the BIOS timer at startup, but only after an access to + the 0x40 segment. + + * [memory/local.c] + Changed LOCAL_Lock() to return a 32-bit pointer. + + * [misc/main.c] [include/dlls.h] + Some built-in DLLs (like KERNEL) can no longer be disabled from + the command-line. + +Thu Apr 4 19:54:39 1996 Keith Reynolds + + * [*/*] + A lot of small changes to support SCO OpenServer 5. + +Thu Apr 4 15:38:13 1996 Frans van Dorsselaer + + * [controls/edit.c] + Fixed GetKeyState() call to use 0x8000 convention. + + * [include/windows.h] + Added undocumented messages EM_SCROLL and EM_GETTHUMB. + +Thu Apr 4 09:52:52 1996 John Harvey + + * [if1632/except.S] + Modified code to assemble on unixware. + +Wed Apr 3 09:38:26 1996 Juergen Marquardt + + * [objects/font.c] + Implementation of a second font cache which will be updated + dynamically. + +Mon Apr 1 16:47:40 1996 Robert Pouliot + + * [resources/sysres_Cz.rc] [resources/sysres_Da.rc] + [resources/sysres_De.rc] [resources/sysres_Eo.rc] + [resources/sysres_Es.rc] [resources/sysres_Fi.rc] + [resources/sysres_No.rc] [resources/TODO] + Updated FIND_TEXT and REPLACE_TEXT to work like the English version. + ---------------------------------------------------------------------- Sun Mar 31 13:54:46 1996 Alexandre Julliard diff --git a/Make.rules.in b/Make.rules.in index b07b131ca56..bb56d51a191 100644 --- a/Make.rules.in +++ b/Make.rules.in @@ -3,7 +3,8 @@ # First some useful definitions -CC = @CC@ +SHELL = /bin/sh +CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ DEFS = @DEFS@ diff --git a/Makefile.in b/Makefile.in index 42f935e615d..12bd1b73400 100644 --- a/Makefile.in +++ b/Makefile.in @@ -11,7 +11,8 @@ # First some useful definitions -CC = @CC@ +SHELL = /bin/sh +CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ DEFS = @DEFS@ -DWINE_INI_GLOBAL=\"$(WINE_INI_GLOBAL)\" diff --git a/controls/button.c b/controls/button.c index 80bd0f40a2d..68515db5bc6 100644 --- a/controls/button.c +++ b/controls/button.c @@ -12,14 +12,14 @@ #include "button.h" #include "stackframe.h" -extern void DEFWND_SetText( HWND hwnd, LPSTR text ); /* windows/defwnd.c */ +extern void DEFWND_SetText( WND *wndPtr, LPSTR text ); /* windows/defwnd.c */ -static void PB_Paint( HWND hWnd, HDC hDC, WORD action ); -static void CB_Paint( HWND hWnd, HDC hDC, WORD action ); -static void GB_Paint( HWND hWnd, HDC hDC, WORD action ); -static void UB_Paint( HWND hWnd, HDC hDC, WORD action ); -static void OB_Paint( HWND hWnd, HDC hDC, WORD action ); -static void BUTTON_CheckAutoRadioButton(HWND hWnd); +static void PB_Paint( WND *wndPtr, HDC hDC, WORD action ); +static void CB_Paint( WND *wndPtr, HDC hDC, WORD action ); +static void GB_Paint( WND *wndPtr, HDC hDC, WORD action ); +static void UB_Paint( WND *wndPtr, HDC hDC, WORD action ); +static void OB_Paint( WND *wndPtr, HDC hDC, WORD action ); +static void BUTTON_CheckAutoRadioButton( WND *wndPtr ); #define MAX_BTN_TYPE 12 @@ -40,7 +40,7 @@ static WORD maxCheckState[MAX_BTN_TYPE] = BUTTON_UNCHECKED /* BS_OWNERDRAW */ }; -typedef void (*pfPaint)(HWND,HDC,WORD); +typedef void (*pfPaint)( WND *wndPtr, HDC hdc, WORD action ); static pfPaint btnPaintFunc[MAX_BTN_TYPE] = { @@ -58,11 +58,21 @@ static pfPaint btnPaintFunc[MAX_BTN_TYPE] = OB_Paint /* BS_OWNERDRAW */ }; -#define PAINT_BUTTON(hwnd,style,action) \ +#define PAINT_BUTTON(wndPtr,style,action) \ if (btnPaintFunc[style]) { \ - HDC hdc = GetDC( hwnd ); \ - (btnPaintFunc[style])(hwnd,hdc,action); \ - ReleaseDC( hwnd, hdc ); } + HDC hdc = GetDC( (wndPtr)->hwndSelf ); \ + (btnPaintFunc[style])(wndPtr,hdc,action); \ + ReleaseDC( (wndPtr)->hwndSelf, hdc ); } + +#ifdef WINELIB32 +#define BUTTON_SEND_CTLCOLOR(wndPtr,hdc) \ + SendMessage( GetParent((wndPtr)->hwndSelf), WM_CTLCOLORBTN, \ + (hdc), (wndPtr)->hwndSelf ) +#else +#define BUTTON_SEND_CTLCOLOR(wndPtr,hdc) \ + SendMessage( GetParent((wndPtr)->hwndSelf), WM_CTLCOLOR, (hdc), \ + MAKELPARAM((wndPtr)->hwndSelf, CTLCOLOR_BTN) ) +#endif static HBITMAP hbitmapCheckBoxes = 0; static WORD checkBoxWidth = 0, checkBoxHeight = 0; @@ -93,7 +103,7 @@ LRESULT ButtonWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } case WM_ENABLE: - PAINT_BUTTON( hWnd, style, ODA_DRAWENTIRE ); + PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE ); break; case WM_CREATE: @@ -124,7 +134,7 @@ LRESULT ButtonWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc = BeginPaint( hWnd, &ps ); - (btnPaintFunc[style])( hWnd, hdc, ODA_DRAWENTIRE ); + (btnPaintFunc[style])( wndPtr, hdc, ODA_DRAWENTIRE ); ReleaseDC( hWnd, hdc ); } break; @@ -187,14 +197,14 @@ LRESULT ButtonWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) break; case WM_SETTEXT: - DEFWND_SetText( hWnd, (LPSTR)PTR_SEG_TO_LIN(lParam) ); - PAINT_BUTTON( hWnd, style, ODA_DRAWENTIRE ); + DEFWND_SetText( wndPtr, (LPSTR)PTR_SEG_TO_LIN(lParam) ); + PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE ); return 0; case WM_SETFONT: infoPtr->hFont = (HFONT) wParam; if (lParam) - PAINT_BUTTON( hWnd, style, ODA_DRAWENTIRE ); + PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE ); break; case WM_GETFONT: @@ -202,12 +212,12 @@ LRESULT ButtonWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_SETFOCUS: infoPtr->state |= BUTTON_HASFOCUS; - PAINT_BUTTON( hWnd, style, ODA_FOCUS ); + PAINT_BUTTON( wndPtr, style, ODA_FOCUS ); break; case WM_KILLFOCUS: infoPtr->state &= ~BUTTON_HASFOCUS; - PAINT_BUTTON( hWnd, style, ODA_FOCUS ); + PAINT_BUTTON( wndPtr, style, ODA_FOCUS ); break; case WM_SYSCOLORCHANGE: @@ -219,7 +229,7 @@ LRESULT ButtonWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) wndPtr->dwStyle = (wndPtr->dwStyle & 0xfffffff0) | (wParam & 0x0000000f); style = wndPtr->dwStyle & 0x0000000f; - PAINT_BUTTON( hWnd, style, ODA_DRAWENTIRE ); + PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE ); break; case BM_GETCHECK: @@ -232,10 +242,10 @@ LRESULT ButtonWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if ((infoPtr->state & 3) != wParam) { infoPtr->state = (infoPtr->state & ~3) | wParam; - PAINT_BUTTON( hWnd, style, ODA_SELECT ); + PAINT_BUTTON( wndPtr, style, ODA_SELECT ); } if(style == BS_AUTORADIOBUTTON && wParam==BUTTON_CHECKED) - BUTTON_CheckAutoRadioButton(hWnd); + BUTTON_CheckAutoRadioButton( wndPtr ); break; case BM_GETSTATE: @@ -247,7 +257,7 @@ LRESULT ButtonWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (wParam) infoPtr->state |= BUTTON_HIGHLIGHTED; else infoPtr->state &= ~BUTTON_HIGHLIGHTED; - PAINT_BUTTON( hWnd, style, ODA_SELECT ); + PAINT_BUTTON( wndPtr, style, ODA_SELECT ); } break; @@ -264,7 +274,7 @@ LRESULT ButtonWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) * Push Button Functions */ -static void PB_Paint( HWND hButton, HDC hDC, WORD action ) +static void PB_Paint( WND *wndPtr, HDC hDC, WORD action ) { RECT rc; HPEN hOldPen; @@ -272,19 +282,13 @@ static void PB_Paint( HWND hButton, HDC hDC, WORD action ) char *text; DWORD dwTextSize; TEXTMETRIC tm; - WND *wndPtr = WIN_FindWndPtr( hButton ); BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra; - GetClientRect(hButton, &rc); + GetClientRect(wndPtr->hwndSelf, &rc); /* Send WM_CTLCOLOR to allow changing the font (the colors are fixed) */ if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont ); -#ifdef WINELIB32 - SendMessage( GetParent(hButton), WM_CTLCOLORBTN, hDC, hButton ); -#else - SendMessage( GetParent(hButton), WM_CTLCOLOR, (WORD)hDC, - MAKELPARAM(hButton, CTLCOLOR_BTN) ); -#endif + BUTTON_SEND_CTLCOLOR( wndPtr, hDC ); hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowFrame); hOldBrush = (HBRUSH)SelectObject(hDC, sysColorObjects.hbrushBtnFace); SetBkMode(hDC, TRANSPARENT); @@ -347,7 +351,7 @@ static void PB_Paint( HWND hButton, HDC hDC, WORD action ) * Check Box & Radio Button Functions */ -static void CB_Paint( HWND hWnd, HDC hDC, WORD action ) +static void CB_Paint( WND *wndPtr, HDC hDC, WORD action ) { RECT rc; HBRUSH hBrush; @@ -355,18 +359,12 @@ static void CB_Paint( HWND hWnd, HDC hDC, WORD action ) char *text; TEXTMETRIC tm; SIZE size; - WND *wndPtr = WIN_FindWndPtr(hWnd); BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra; - GetClientRect(hWnd, &rc); + GetClientRect(wndPtr->hwndSelf, &rc); if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont ); -#ifdef WINELIB32 /* JBP: Different in Win32 */ - hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLORBTN, hDC, hWnd); -#else - hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, hDC, - MAKELPARAM(hWnd, CTLCOLOR_BTN)); -#endif + hBrush = BUTTON_SEND_CTLCOLOR( wndPtr, hDC ); if (action == ODA_DRAWENTIRE) FillRect(hDC, &rc, hBrush); GetTextMetrics(hDC, &tm); @@ -412,14 +410,15 @@ static void CB_Paint( HWND hWnd, HDC hDC, WORD action ) /********************************************************************** * BUTTON_CheckAutoRadioButton * - * hWnd is checked, uncheck everything else in group + * wndPtr is checked, uncheck everything else in group */ -static void BUTTON_CheckAutoRadioButton(HWND hWnd) +static void BUTTON_CheckAutoRadioButton( WND *wndPtr ) { - HWND parent = GetParent(hWnd); - HWND sibling; - for(sibling = GetNextDlgGroupItem(parent,hWnd,FALSE); - sibling != hWnd; + HWND parent, sibling; + if (!(wndPtr->dwStyle & WS_CHILD)) return; + parent = wndPtr->parent->hwndSelf; + for(sibling = GetNextDlgGroupItem(parent,wndPtr->hwndSelf,FALSE); + sibling != wndPtr->hwndSelf; sibling = GetNextDlgGroupItem(parent,sibling,FALSE)) SendMessage(sibling,BM_SETCHECK,BUTTON_UNCHECKED,0); } @@ -429,26 +428,20 @@ static void BUTTON_CheckAutoRadioButton(HWND hWnd) * Group Box Functions */ -static void GB_Paint( HWND hWnd, HDC hDC, WORD action ) +static void GB_Paint( WND *wndPtr, HDC hDC, WORD action ) { RECT rc; char *text; SIZE size; - WND *wndPtr = WIN_FindWndPtr( hWnd ); BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra; if (action != ODA_DRAWENTIRE) return; if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont ); -#ifdef WINELIB32 - SendMessage( GetParent(hWnd), WM_CTLCOLORBTN, hDC, hWnd ); -#else - SendMessage( GetParent(hWnd), WM_CTLCOLOR, hDC, - MAKELPARAM(hWnd, CTLCOLOR_BTN)); -#endif + BUTTON_SEND_CTLCOLOR( wndPtr, hDC ); SelectObject( hDC, sysColorObjects.hpenWindowFrame ); - GetClientRect(hWnd, &rc); + GetClientRect( wndPtr->hwndSelf, &rc); MoveTo( hDC, rc.left, rc.top+2 ); LineTo( hDC, rc.right-1, rc.top+2 ); @@ -471,24 +464,18 @@ static void GB_Paint( HWND hWnd, HDC hDC, WORD action ) * User Button Functions */ -static void UB_Paint( HWND hWnd, HDC hDC, WORD action ) +static void UB_Paint( WND *wndPtr, HDC hDC, WORD action ) { RECT rc; HBRUSH hBrush; - WND *wndPtr = WIN_FindWndPtr( hWnd ); BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra; if (action == ODA_SELECT) return; - GetClientRect(hWnd, &rc); + GetClientRect( wndPtr->hwndSelf, &rc); if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont ); -#ifdef WINELIB32 - hBrush = SendMessage( GetParent(hWnd), WM_CTLCOLORBTN, hDC, hWnd ); -#else - hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC, - MAKELPARAM(hWnd, CTLCOLOR_BTN)); -#endif + hBrush = BUTTON_SEND_CTLCOLOR( wndPtr, hDC ); FillRect(hDC, &rc, hBrush); if ((action == ODA_FOCUS) || @@ -501,10 +488,9 @@ static void UB_Paint( HWND hWnd, HDC hDC, WORD action ) * Ownerdrawn Button Functions */ -static void OB_Paint( HWND hWnd, HDC hDC, WORD action ) +static void OB_Paint( WND *wndPtr, HDC hDC, WORD action ) { DRAWITEMSTRUCT dis; - WND *wndPtr = WIN_FindWndPtr( hWnd ); BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra; dis.CtlType = ODT_BUTTON; @@ -514,9 +500,10 @@ static void OB_Paint( HWND hWnd, HDC hDC, WORD action ) dis.itemState = (infoPtr->state & BUTTON_HASFOCUS) ? ODS_FOCUS : 0 | (infoPtr->state & BUTTON_HIGHLIGHTED) ? ODS_SELECTED : 0 | (wndPtr->dwStyle & WS_DISABLED) ? ODS_DISABLED : 0; - dis.hwndItem = hWnd; + dis.hwndItem = wndPtr->hwndSelf; dis.hDC = hDC; - GetClientRect( hWnd, &dis.rcItem ); + GetClientRect( wndPtr->hwndSelf, &dis.rcItem ); dis.itemData = 0; - SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM) MAKE_SEGPTR(&dis) ); + SendMessage( GetParent(wndPtr->hwndSelf), WM_DRAWITEM, 1, + (LPARAM)MAKE_SEGPTR(&dis) ); } diff --git a/controls/edit.c b/controls/edit.c index 6b1154c5f92..37d95adc105 100644 --- a/controls/edit.c +++ b/controls/edit.c @@ -135,16 +135,7 @@ static HLOCAL EDIT_HeapAlloc(HWND hwnd, int bytes, WORD flags) */ static void *EDIT_HeapLock(HWND hwnd, HANDLE handle) { - HINSTANCE hinstance = WIN_GetWindowInstance( hwnd ); -#if defined(WINELIB) - return LOCAL_Lock( hinstance, handle ); -#else - HANDLE offs; - - if (handle == 0) return 0; - offs = LOCAL_Lock( hinstance, handle ); - return PTR_SEG_OFF_TO_LIN( hinstance, offs ); -#endif + return LOCAL_Lock( WIN_GetWindowInstance(hwnd), handle ); } /********************************************************************* @@ -2798,7 +2789,7 @@ static void EDIT_WM_KeyDown(HWND hwnd, WPARAM wParam) return; } - if(motionKey && (0x80 & GetKeyState(VK_SHIFT))) { + if(motionKey && (0x8000 & GetKeyState(VK_SHIFT))) { EDIT_ExtendSel(hwnd, es->WndCol, es->WndRow*es->txtht); } else { EDIT_SetAnchor(hwnd, es->CurrLine, es->CurrCol); diff --git a/controls/static.c b/controls/static.c index eb5196139b9..9f470b5c215 100644 --- a/controls/static.c +++ b/controls/static.c @@ -3,8 +3,7 @@ * * Copyright David W. Metcalfe, 1993 * -static char Copyright[] = "Copyright David W. Metcalfe, 1993"; -*/ + */ #include #include @@ -12,35 +11,35 @@ static char Copyright[] = "Copyright David W. Metcalfe, 1993"; #include "user.h" #include "static.h" -extern void DEFWND_SetText( HWND hwnd, LPSTR text ); /* windows/defwnd.c */ +extern void DEFWND_SetText( WND *wndPtr, LPSTR text ); /* windows/defwnd.c */ -static void PaintTextfn( HWND hwnd, HDC hdc ); -static void PaintRectfn( HWND hwnd, HDC hdc ); -static void PaintIconfn( HWND hwnd, HDC hdc ); +static void STATIC_PaintTextfn( WND *wndPtr, HDC hdc ); +static void STATIC_PaintRectfn( WND *wndPtr, HDC hdc ); +static void STATIC_PaintIconfn( WND *wndPtr, HDC hdc ); static COLORREF color_windowframe, color_background, color_window; -typedef void (*pfPaint)(HWND, HDC); +typedef void (*pfPaint)( WND *, HDC); #define LAST_STATIC_TYPE SS_LEFTNOWORDWRAP static pfPaint staticPaintFunc[LAST_STATIC_TYPE+1] = { - PaintTextfn, /* SS_LEFT */ - PaintTextfn, /* SS_CENTER */ - PaintTextfn, /* SS_RIGHT */ - PaintIconfn, /* SS_ICON */ - PaintRectfn, /* SS_BLACKRECT */ - PaintRectfn, /* SS_GRAYRECT */ - PaintRectfn, /* SS_WHITERECT */ - PaintRectfn, /* SS_BLACKFRAME */ - PaintRectfn, /* SS_GRAYFRAME */ - PaintRectfn, /* SS_WHITEFRAME */ + STATIC_PaintTextfn, /* SS_LEFT */ + STATIC_PaintTextfn, /* SS_CENTER */ + STATIC_PaintTextfn, /* SS_RIGHT */ + STATIC_PaintIconfn, /* SS_ICON */ + STATIC_PaintRectfn, /* SS_BLACKRECT */ + STATIC_PaintRectfn, /* SS_GRAYRECT */ + STATIC_PaintRectfn, /* SS_WHITERECT */ + STATIC_PaintRectfn, /* SS_BLACKFRAME */ + STATIC_PaintRectfn, /* SS_GRAYFRAME */ + STATIC_PaintRectfn, /* SS_WHITEFRAME */ NULL, /* Not defined */ - PaintTextfn, /* SS_SIMPLE */ - PaintTextfn /* SS_LEFTNOWORDWRAP */ + STATIC_PaintTextfn, /* SS_SIMPLE */ + STATIC_PaintTextfn /* SS_LEFTNOWORDWRAP */ }; @@ -49,10 +48,9 @@ static pfPaint staticPaintFunc[LAST_STATIC_TYPE+1] = * * Set the icon for an SS_ICON control. */ -static HICON STATIC_SetIcon( HWND hwnd, HICON hicon ) +static HICON STATIC_SetIcon( WND *wndPtr, HICON hicon ) { HICON prevIcon; - WND *wndPtr = WIN_FindWndPtr( hwnd ); STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra; if ((wndPtr->dwStyle & 0x0f) != SS_ICON) return 0; @@ -61,7 +59,7 @@ static HICON STATIC_SetIcon( HWND hwnd, HICON hicon ) if (hicon) { CURSORICONINFO *info = (CURSORICONINFO *) GlobalLock( hicon ); - SetWindowPos( hwnd, 0, 0, 0, info->nWidth, info->nHeight, + SetWindowPos( wndPtr->hwndSelf, 0, 0, 0, info->nWidth, info->nHeight, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER ); GlobalUnlock( hicon ); } @@ -94,7 +92,7 @@ LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) createStruct->lpszName ); if (!hicon) /* Try OEM icon (FIXME: is this right?) */ hicon = LoadIcon( 0, createStruct->lpszName ); - STATIC_SetIcon( hWnd, hicon ); + STATIC_SetIcon( wndPtr, hicon ); } return 1; } @@ -115,7 +113,7 @@ LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_NCDESTROY: if (style == SS_ICON) - DestroyIcon( STATIC_SetIcon( hWnd, 0 ) ); + DestroyIcon( STATIC_SetIcon( wndPtr, 0 ) ); else lResult = DefWindowProc(hWnd, uMsg, wParam, lParam); break; @@ -125,7 +123,7 @@ LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) PAINTSTRUCT ps; BeginPaint( hWnd, &ps ); if (staticPaintFunc[style]) - (staticPaintFunc[style])( hWnd, ps.hdc ); + (staticPaintFunc[style])( wndPtr, ps.hdc ); EndPaint( hWnd, &ps ); } break; @@ -140,10 +138,10 @@ LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_SETTEXT: if (style == SS_ICON) /* FIXME : should we also return the previous hIcon here ??? */ - STATIC_SetIcon( hWnd, LoadIcon( wndPtr->hInstance, - (SEGPTR)lParam )); + STATIC_SetIcon( wndPtr, LoadIcon( wndPtr->hInstance, + (SEGPTR)lParam )); else - DEFWND_SetText( hWnd, (LPSTR)PTR_SEG_TO_LIN(lParam) ); + DEFWND_SetText( wndPtr, (LPSTR)PTR_SEG_TO_LIN(lParam) ); InvalidateRect( hWnd, NULL, FALSE ); UpdateWindow( hWnd ); break; @@ -171,7 +169,7 @@ LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return infoPtr->hIcon; case STM_SETICON: - lResult = STATIC_SetIcon( hWnd, (HICON)wParam ); + lResult = STATIC_SetIcon( wndPtr, (HICON)wParam ); InvalidateRect( hWnd, NULL, FALSE ); UpdateWindow( hWnd ); break; @@ -185,18 +183,17 @@ LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } -static void PaintTextfn( HWND hwnd, HDC hdc ) +static void STATIC_PaintTextfn( WND *wndPtr, HDC hdc ) { RECT rc; HBRUSH hBrush; char *text; WORD wFormat; - WND *wndPtr = WIN_FindWndPtr(hwnd); LONG style = wndPtr->dwStyle; STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra; - GetClientRect(hwnd, &rc); + GetClientRect( wndPtr->hwndSelf, &rc); text = USER_HEAP_LIN_ADDR( wndPtr->hText ); switch (style & 0x0000000F) @@ -230,24 +227,23 @@ static void PaintTextfn( HWND hwnd, HDC hdc ) if (infoPtr->hFont) SelectObject( hdc, infoPtr->hFont ); #ifdef WINELIB32 - hBrush = SendMessage( GetParent(hwnd), WM_CTLCOLORSTATIC, hdc, hwnd ); + hBrush = SendMessage( GetParent(wndPtr->hwndSelf), WM_CTLCOLORSTATIC, + hdc, wndPtr->hwndSelf ); #else - hBrush = SendMessage( GetParent(hwnd), WM_CTLCOLOR, (WORD)hdc, - MAKELONG(hwnd, CTLCOLOR_STATIC)); + hBrush = SendMessage( GetParent(wndPtr->hwndSelf), WM_CTLCOLOR, (WORD)hdc, + MAKELONG(wndPtr->hwndSelf, CTLCOLOR_STATIC)); #endif if (!hBrush) hBrush = GetStockObject(WHITE_BRUSH); FillRect(hdc, &rc, hBrush); if (text) DrawText( hdc, text, -1, &rc, wFormat ); } -static void PaintRectfn( HWND hwnd, HDC hdc ) +static void STATIC_PaintRectfn( WND *wndPtr, HDC hdc ) { RECT rc; HBRUSH hBrush; - WND *wndPtr = WIN_FindWndPtr(hwnd); - - GetClientRect(hwnd, &rc); + GetClientRect( wndPtr->hwndSelf, &rc); switch (wndPtr->dwStyle & 0x0f) { @@ -282,19 +278,19 @@ static void PaintRectfn( HWND hwnd, HDC hdc ) } -static void PaintIconfn( HWND hwnd, HDC hdc ) +static void STATIC_PaintIconfn( WND *wndPtr, HDC hdc ) { RECT rc; HBRUSH hbrush; - WND *wndPtr = WIN_FindWndPtr(hwnd); STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra; - GetClientRect(hwnd, &rc); + GetClientRect( wndPtr->hwndSelf, &rc); #ifdef WINELIB32 - hbrush = SendMessage( GetParent(hwnd), WM_CTLCOLORSTATIC, hdc, hwnd ); + hbrush = SendMessage( GetParent(wndPtr->hwndSelf), WM_CTLCOLORSTATIC, + hdc, wndPtr->hwndSelf ); #else - hbrush = SendMessage( GetParent(hwnd), WM_CTLCOLOR, hdc, - MAKELONG(hwnd, CTLCOLOR_STATIC)); + hbrush = SendMessage( GetParent(wndPtr->hwndSelf), WM_CTLCOLOR, hdc, + MAKELONG(wndPtr->hwndSelf, CTLCOLOR_STATIC)); #endif FillRect( hdc, &rc, hbrush ); if (infoPtr->hIcon) DrawIcon( hdc, rc.left, rc.top, infoPtr->hIcon ); diff --git a/debugger/break.c b/debugger/break.c index 78e4cc67822..edbddb8936a 100644 --- a/debugger/break.c +++ b/debugger/break.c @@ -7,6 +7,7 @@ #include #include +#include #include #include "windows.h" #include "debugger.h" diff --git a/debugger/dbg.y b/debugger/dbg.y index 206247b0c81..b1ae0e48391 100644 --- a/debugger/dbg.y +++ b/debugger/dbg.y @@ -10,6 +10,7 @@ #include #include #include "class.h" +#include "module.h" #include "options.h" #include "queue.h" #include "win.h" @@ -38,7 +39,7 @@ int yyerror(char *); %token tCONT tSTEP tLIST tNEXT tQUIT tHELP tBACKTRACE tINFO tWALK %token tENABLE tDISABLE tBREAK tDELETE tSET tMODE tPRINT tEXAM tDEFINE tABORT -%token tCLASS tSTACK tSEGMENTS tREGS tWND tQUEUE +%token tCLASS tMODULE tSTACK tSEGMENTS tREGS tWND tQUEUE %token tNO_SYMBOL tEOL %token tSYMBOLFILE @@ -129,6 +130,7 @@ break_command: info_command: tINFO tBREAK tEOL { DEBUG_InfoBreakpoints(); } | tINFO tCLASS expr tEOL { CLASS_DumpClass( $3 ); } + | tINFO tMODULE expr tEOL { MODULE_DumpModule( $3 ); } | tINFO tQUEUE expr tEOL { QUEUE_DumpQueue( $3 ); } | tINFO tREGS tEOL { DEBUG_InfoRegisters(); } | tINFO tSEGMENTS expr tEOL { LDT_Print( SELECTOR_TO_ENTRY($3), 1 ); } @@ -138,6 +140,7 @@ info_command: walk_command: tWALK tCLASS tEOL { CLASS_WalkClasses(); } + | tWALK tMODULE tEOL { MODULE_WalkModules(); } | tWALK tQUEUE tEOL { QUEUE_WalkQueues(); } | tWALK tWND tEOL { WIN_WalkWindows( 0, 0 ); } | tWALK tWND tNUM tEOL { WIN_WalkWindows( $3, 0 ); } diff --git a/debugger/debug.l b/debugger/debug.l index abacf8e285c..0806e05348a 100644 --- a/debugger/debug.l +++ b/debugger/debug.l @@ -94,6 +94,7 @@ walk|w { return tWALK; } x { return tEXAM; } class|clas|cla { return tCLASS; } +module|modul|modu|mod { return tMODULE; } queue|queu|que { return tQUEUE; } registers|regs|reg|re { return tREGS; } segments|segment|segm|seg|se { return tSEGMENTS; } diff --git a/files/dos_fs.c b/files/dos_fs.c index 2b736ca56a2..65653611b2c 100644 --- a/files/dos_fs.c +++ b/files/dos_fs.c @@ -13,7 +13,7 @@ #include #include #include -#ifdef __svr4__ +#if defined(__svr4__) || defined(_SCO_DS) #include #endif diff --git a/files/drive.c b/files/drive.c index 648faf5de2a..948f9b633c1 100644 --- a/files/drive.c +++ b/files/drive.c @@ -18,7 +18,7 @@ #include #include #endif -#ifdef __svr4__ +#if defined(__svr4__) || defined(_SCO_DS) #include #endif @@ -437,7 +437,7 @@ int DRIVE_GetFreeSpace( int drive, DWORD *size, DWORD *available ) return 0; } -#ifdef __svr4__ +#if defined(__svr4__) || defined(_SCO_DS) if (statfs( DOSDrives[drive].root, &info, 0, 0) < 0) #else if (statfs( DOSDrives[drive].root, &info) < 0) @@ -449,7 +449,7 @@ int DRIVE_GetFreeSpace( int drive, DWORD *size, DWORD *available ) } *size = info.f_bsize * info.f_blocks; -#ifdef __svr4__ +#if defined(__svr4__) || defined(_SCO_DS) *available = info.f_bfree * info.f_bsize; #else *available = info.f_bavail * info.f_bsize; diff --git a/if1632/Makefile.in b/if1632/Makefile.in index 311fcab2950..d55fe40ba01 100644 --- a/if1632/Makefile.in +++ b/if1632/Makefile.in @@ -50,10 +50,11 @@ C_SRCS = \ ASM_SRCS = \ $(SPEC_FILES) \ - call16.S \ - call32.S \ - except.S \ - stdcall.S + callfrom16.S \ + callfrom32.S \ + callto16.S \ + callto32.S \ + except.S .SUFFIXES: .spec @@ -69,16 +70,19 @@ $(SPEC_FILES): $(BUILD) $(BUILD) checkbuild: cd $(TOPSRC)/tools; $(SUBMAKE) build -call16.S: $(TOPSRC)/include/callback.h $(BUILD) - $(BUILD) -call16 `cat $(TOPSRC)/include/callback.h | grep "extern.*CallTo16_" | sed 's/.*CallTo16_\(.*\)(.*/\1/' | sort | uniq` > call16.S +callfrom16.S: $(SPEC_FILES) + $(BUILD) -callfrom16 `cat $(SPEC_FILES) | grep CallFrom16_ | sed 's/.*CallFrom16_\(.*\)/\1/' | sort | uniq` > callfrom16.S -call32.S: $(SPEC_FILES) - $(BUILD) -call32 `cat $(SPEC_FILES) | grep CallTo32_ | sed 's/.*CallTo32_\(.*\)/\1/' | sort | uniq` > call32.S +callfrom32.S: $(SPEC_FILES) + $(BUILD) -callfrom32 `cat $(SPEC_FILES) | grep CallFrom32_ | sed 's/.*CallFrom32_\([0-9]*\)/\1/' | sort | uniq` > callfrom32.S -stdcall.S: $(SPEC_FILES) - $(BUILD) -stdcall `cat $(SPEC_FILES) | grep Stdcall_ | sed 's/.*Stdcall_\([0-9]*\)/\1/' | sort | uniq` > stdcall.S +callto16.S: $(TOPSRC)/include/callback.h $(BUILD) + $(BUILD) -callto16 `cat $(TOPSRC)/include/callback.h | grep "extern.*CallTo16_" | sed 's/.*CallTo16_\(.*\)(.*/\1/' | sort | uniq` > callto16.S + +callto32.S: $(TOPSRC)/include/callback.h $(BUILD) + $(BUILD) -callto32 `cat $(TOPSRC)/include/callback.h | grep "extern.*CallTo32_" | sed 's/.*CallTo32_\(.*\)(.*/\1/' | sort | uniq` > callto32.S clean:: - rm -f $(SPEC_FILES) call32.S call16.S stdcall.S + rm -f $(SPEC_FILES) callfrom16.S callfrom32.S callto16.S callto32.S ### Dependencies: diff --git a/if1632/callback.c b/if1632/callback.c index 7d22b17d457..91e91e2fdc8 100644 --- a/if1632/callback.c +++ b/if1632/callback.c @@ -39,8 +39,7 @@ LONG CallWindowProc( WNDPROC func, HWND hwnd, WORD message, fprintf(stderr,"Where is the Win32 callback?\n"); if (UsesLParamPtr(message)) return RELAY32_CallWindowProcConvStruct(a->win32,hwnd,message,wParam,lParam); - else - return RELAY32_CallWindowProc(a->win32,hwnd,message,wParam,lParam); + return CallWndProc32( (FARPROC)a->win32, hwnd, message, wParam, lParam ); } /********************************************************************** diff --git a/if1632/except.S b/if1632/except.S index 60cd71085b7..2b522ca8b03 100644 --- a/if1632/except.S +++ b/if1632/except.S @@ -4,17 +4,20 @@ * Copyright (c) 1996 Onno Hovers, (onno@stack.urc.tue.nl) * */ +#if defined(__svr4__) || defined(_SCO_DS) +#define __ELF__ 1 +#endif #ifndef __ELF__ + .globl _EXC_CallUnhandledExceptionFilter - .extern _pTopExcHandler - _EXC_CallUnhandledExceptionFilter: -#else /* __ELF__ */ - .globl EXC_CallUnhandledExceptionFilter - .extern pTopExcHandler +#else /* __ELF__ */ + + .globl EXC_CallUnhandledExceptionFilter EXC_CallUnhandledExceptionFilter: + #endif /* __ELF__ */ leal 4(%esp),%eax pushl %eax @@ -45,56 +48,55 @@ * we pass the function to be called as a fifth parameter to ContextCall * */ - .equ CONTEXT_SegSs, -4 - .equ CONTEXT_Esp, -8 - .equ CONTEXT_EFlags, -12 - .equ CONTEXT_SegCs, -16 - .equ CONTEXT_Eip, -20 - .equ CONTEXT_Ebp, -24 - .equ CONTEXT_Eax, -28 - .equ CONTEXT_Ecx, -32 - .equ CONTEXT_Edx, -36 - .equ CONTEXT_Ebx, -40 - .equ CONTEXT_Esi, -44 - .equ CONTEXT_Edi, -48 - .equ CONTEXT_SegDs, -52 - .equ CONTEXT_SegEs, -56 - .equ CONTEXT_SegFs, -60 - .equ CONTEXT_SegGs, -64 - .equ FLOAT_Cr0NpxState, -68 - .equ FLOAT_RegisterArea, -148 - .equ FLOAT_DataSelector, -152 - .equ FLOAT_DataOffset, -156 - .equ FLOAT_ErrorSelector, -160 - .equ FLOAT_ErrorOffset, -164 - .equ FLOAT_TagWord, -168 - .equ FLOAT_StatusWord, -172 - .equ FLOAT_ControlWord, -176 - .equ CONTEXT_FloatSave, -176 - .equ CONTEXT_Dr7, -180 - .equ CONTEXT_Dr6, -184 - .equ CONTEXT_Dr3, -188 - .equ CONTEXT_Dr2, -192 - .equ CONTEXT_Dr1, -196 - .equ CONTEXT_Dr0, -200 - .equ CONTEXT_ContextFlags, -204 - .equ CONTEXT, -204 - .equ CONTEXTSIZE, 204 - .equ CONTEXTFLAGS, 0x10007 +#define CONTEXT_SegSs -4 +#define CONTEXT_Esp -8 +#define CONTEXT_EFlags -12 +#define CONTEXT_SegCs -16 +#define CONTEXT_Eip -20 +#define CONTEXT_Ebp -24 +#define CONTEXT_Eax -28 +#define CONTEXT_Ecx -32 +#define CONTEXT_Edx -36 +#define CONTEXT_Ebx -40 +#define CONTEXT_Esi -44 +#define CONTEXT_Edi -48 +#define CONTEXT_SegDs -52 +#define CONTEXT_SegEs -56 +#define CONTEXT_SegFs -60 +#define CONTEXT_SegGs -64 +#define FLOAT_Cr0NpxState -68 +#define FLOAT_RegisterArea -148 +#define FLOAT_DataSelector -152 +#define FLOAT_DataOffset -156 +#define FLOAT_ErrorSelector -160 +#define FLOAT_ErrorOffset -164 +#define FLOAT_TagWord -168 +#define FLOAT_StatusWord -172 +#define FLOAT_ControlWord -176 +#define CONTEXT_FloatSave -176 +#define CONTEXT_Dr7 -180 +#define CONTEXT_Dr6 -184 +#define CONTEXT_Dr3 -188 +#define CONTEXT_Dr2 -192 +#define CONTEXT_Dr1 -196 +#define CONTEXT_Dr0 -200 +#define CONTEXT_ContextFlags -204 +#define CONTEXT -204 +#define CONTEXTSIZE 204 +#define CONTEXTFLAGS 0x10007 - .equ ORIG_ESP, 16 /** cdecl !!! **/ - .equ PARM_ARG4, 28 - .equ PARM_ARG3, 24 - .equ PARM_ARG2, 20 - .equ PARM_ARG1, 16 - .equ PARM_RETURN, 12 - .equ PARM_CALLFUNC, 8 - .equ PARM_EBP, 4 - .equ PARM_EFLAGS, 0 +#define ORIG_ESP 16 /** cdecl !!! **/ +#define PARM_ARG4 28 +#define PARM_ARG3 24 +#define PARM_ARG2 20 +#define PARM_ARG1 16 +#define PARM_RETURN 12 +#define PARM_CALLFUNC 8 +#define PARM_EBP 4 +#define PARM_EFLAGS 0 #ifndef __ELF__ .globl _RaiseException - .extern _EXC_RaiseException _RaiseException: push $_EXC_RaiseException @@ -107,7 +109,6 @@ #else /* __ELF__ */ .globl RaiseException - .extern EXC_RaiseException RaiseException: push $EXC_RaiseException diff --git a/if1632/relay.c b/if1632/relay.c index c3960ba5878..9daacc173d0 100644 --- a/if1632/relay.c +++ b/if1632/relay.c @@ -25,43 +25,59 @@ dprintf_relay BUILTIN_DLL dll_builtin_table[] = { - DLL_ENTRY( KERNEL, 0), - DLL_ENTRY( USER, 0), - DLL_ENTRY( GDI, 0), - DLL_ENTRY( WIN87EM, DLL_FLAG_NOT_USED), - DLL_ENTRY( SHELL, 0), - DLL_ENTRY( SOUND, 0), - DLL_ENTRY( KEYBOARD, 0), - DLL_ENTRY( WINSOCK, 0), - DLL_ENTRY( STRESS, 0), - DLL_ENTRY( MMSYSTEM, 0), - DLL_ENTRY( SYSTEM, 0), - DLL_ENTRY( TOOLHELP, 0), - DLL_ENTRY( MOUSE, 0), - DLL_ENTRY( COMMDLG, DLL_FLAG_NOT_USED), - DLL_ENTRY( OLE2, DLL_FLAG_NOT_USED), - DLL_ENTRY( OLE2CONV, DLL_FLAG_NOT_USED), - DLL_ENTRY( OLE2DISP, DLL_FLAG_NOT_USED), - DLL_ENTRY( OLE2NLS, DLL_FLAG_NOT_USED), - DLL_ENTRY( OLE2PROX, DLL_FLAG_NOT_USED), - DLL_ENTRY( OLECLI, DLL_FLAG_NOT_USED), - DLL_ENTRY( OLESVR, DLL_FLAG_NOT_USED), - DLL_ENTRY( COMPOBJ, DLL_FLAG_NOT_USED), - DLL_ENTRY( STORAGE, DLL_FLAG_NOT_USED), - DLL_ENTRY( WINPROCS, 0), - DLL_ENTRY( DDEML, DLL_FLAG_NOT_USED), - DLL_ENTRY( LZEXPAND, 0), - { NULL, } /* Last entry */ + /* Win16 DLLs */ + DLL_ENTRY( KERNEL, DLL_FLAG_ALWAYS_USED), + DLL_ENTRY( USER, DLL_FLAG_ALWAYS_USED), + DLL_ENTRY( GDI, DLL_FLAG_ALWAYS_USED), + DLL_ENTRY( WIN87EM, DLL_FLAG_NOT_USED), + DLL_ENTRY( SHELL, 0), + DLL_ENTRY( SOUND, 0), + DLL_ENTRY( KEYBOARD, 0), + DLL_ENTRY( WINSOCK, 0), + DLL_ENTRY( STRESS, 0), + DLL_ENTRY( MMSYSTEM, 0), + DLL_ENTRY( SYSTEM, 0), + DLL_ENTRY( TOOLHELP, 0), + DLL_ENTRY( MOUSE, 0), + DLL_ENTRY( COMMDLG, DLL_FLAG_NOT_USED), + DLL_ENTRY( OLE2, DLL_FLAG_NOT_USED), + DLL_ENTRY( OLE2CONV, DLL_FLAG_NOT_USED), + DLL_ENTRY( OLE2DISP, DLL_FLAG_NOT_USED), + DLL_ENTRY( OLE2NLS, DLL_FLAG_NOT_USED), + DLL_ENTRY( OLE2PROX, DLL_FLAG_NOT_USED), + DLL_ENTRY( OLECLI, DLL_FLAG_NOT_USED), + DLL_ENTRY( OLESVR, DLL_FLAG_NOT_USED), + DLL_ENTRY( COMPOBJ, DLL_FLAG_NOT_USED), + DLL_ENTRY( STORAGE, DLL_FLAG_NOT_USED), + DLL_ENTRY( WINPROCS, DLL_FLAG_ALWAYS_USED), + DLL_ENTRY( DDEML, DLL_FLAG_NOT_USED), + DLL_ENTRY( LZEXPAND, 0), + /* Win32 DLLs */ + DLL_ENTRY( ADVAPI32, 0), + DLL_ENTRY( COMCTL32, 0), + DLL_ENTRY( COMDLG32, 0), + DLL_ENTRY( OLE32, 0), + DLL_ENTRY( GDI32, 0), + DLL_ENTRY( KERNEL32, DLL_FLAG_ALWAYS_USED), + DLL_ENTRY( SHELL32, 0), + DLL_ENTRY( USER32, 0), + DLL_ENTRY( WINPROCS32, DLL_FLAG_ALWAYS_USED), + DLL_ENTRY( WINSPOOL, 0), + /* Last entry */ + { NULL, } }; - /* Saved 16-bit stack */ + /* Saved 16-bit stack for current process (Win16 only) */ WORD IF1632_Saved16_ss = 0; WORD IF1632_Saved16_sp = 0; - /* Saved 32-bit stack */ + /* Saved 32-bit stack for current process (Win16 only) */ DWORD IF1632_Saved32_esp = 0; SEGPTR IF1632_Stack32_base = 0; -DWORD IF1632_Original32_esp = 0; + + /* Original Unix stack */ +DWORD IF1632_Original32_esp; + /*********************************************************************** * RELAY_Init @@ -72,20 +88,20 @@ BOOL RELAY_Init(void) /* Allocate the code selector for CallTo16 routines */ - extern void CALL16_Start(), CALL16_End(); - extern void CALL16_Ret_word(), CALL16_Ret_long(); - extern DWORD CALL16_RetAddr_word, CALL16_RetAddr_long; + extern void CALLTO16_Start(), CALLTO16_End(); + extern void CALLTO16_Ret_word(), CALLTO16_Ret_long(); + extern DWORD CALLTO16_RetAddr_word, CALLTO16_RetAddr_long; - codesel = GLOBAL_CreateBlock( GMEM_FIXED, (void *)CALL16_Start, - (int)CALL16_End - (int)CALL16_Start, + codesel = GLOBAL_CreateBlock( GMEM_FIXED, (void *)CALLTO16_Start, + (int)CALLTO16_End - (int)CALLTO16_Start, 0, TRUE, TRUE, FALSE, NULL ); if (!codesel) return FALSE; /* Patch the return addresses for CallTo16 routines */ - CALL16_RetAddr_word = MAKELONG( (int)CALL16_Ret_word - (int)CALL16_Start, + CALLTO16_RetAddr_word=MAKELONG( (int)CALLTO16_Ret_word-(int)CALLTO16_Start, codesel ); - CALL16_RetAddr_long = MAKELONG( (int)CALL16_Ret_long - (int)CALL16_Start, + CALLTO16_RetAddr_long=MAKELONG( (int)CALLTO16_Ret_long-(int)CALLTO16_Start, codesel ); return TRUE; @@ -93,10 +109,10 @@ BOOL RELAY_Init(void) /*********************************************************************** - * RELAY_DebugCall32 + * RELAY_DebugCallFrom16 */ -void RELAY_DebugCall32( int func_type, char *args, - void *entry_point, int args32 ) +void RELAY_DebugCallFrom16( int func_type, char *args, + void *entry_point, int args32 ) { STACK16FRAME *frame; struct dll_table_s *table; @@ -162,9 +178,9 @@ void RELAY_DebugCall32( int func_type, char *args, /*********************************************************************** - * RELAY_DebugReturn + * RELAY_DebugCallFrom16Ret */ -void RELAY_DebugReturn( int func_type, int ret_val, int args32 ) +void RELAY_DebugCallFrom16Ret( int func_type, int ret_val, int args32 ) { STACK16FRAME *frame; struct dll_table_s *table; @@ -230,7 +246,7 @@ void RELAY_Unimplemented16(void) * * This function is called for unimplemented 32-bit entry points (declared * as 'stub' in the spec file). - * (The args are the same than for RELAY_DebugStdcall). + * (The args are the same than for RELAY_DebugCallFrom32). */ void RELAY_Unimplemented32( int nb_args, void *entry_point, const char *func_name ) @@ -241,7 +257,7 @@ void RELAY_Unimplemented32( int nb_args, void *entry_point, /*********************************************************************** - * RELAY_DebugCall16 + * RELAY_DebugCallTo16 * * 'stack' points to the called function address on the 32-bit stack. * Stack layout: @@ -251,7 +267,7 @@ void RELAY_Unimplemented32( int nb_args, void *entry_point, * (stack+4) 16-bit ds * (stack) func to call */ -void RELAY_DebugCall16( int* stack, int nbargs ) +void RELAY_DebugCallTo16( int* stack, int nbargs ) { if (!debugging_relay) return; @@ -264,10 +280,11 @@ void RELAY_DebugCall16( int* stack, int nbargs ) /*********************************************************************** - * RELAY_DebugStdcall + * RELAY_DebugCallFrom32 */ -void RELAY_DebugStdcall( int nb_args, void *entry_point, const char *func_name, - int ebp, int ret_addr, int arg1 ) +void RELAY_DebugCallFrom32( int nb_args, void *entry_point, + const char *func_name, int ebp, int ret_addr, + int arg1 ) { int *parg; if (!debugging_relay) return; @@ -282,12 +299,28 @@ void RELAY_DebugStdcall( int nb_args, void *entry_point, const char *func_name, /*********************************************************************** - * RELAY_DebugStdcallRet + * RELAY_DebugCallFrom32Ret */ -void RELAY_DebugStdcallRet( int ret_val, void *entry_point, - const char *func_name, int ebp, int ret_addr ) +void RELAY_DebugCallFrom32Ret( int ret_val, void *entry_point, + const char *func_name, int ebp, int ret_addr ) { if (!debugging_relay) return; printf( "Ret %s() retval=0x%08x ret=%08x\n", func_name, ret_val, ret_addr ); } + + +/*********************************************************************** + * RELAY_DebugCallTo32 + */ +void RELAY_DebugCallTo32( unsigned int func, int nbargs, unsigned int arg1 ) +{ + unsigned int *argptr; + + if (!debugging_relay) return; + + printf( "CallTo32(func=%08x", func ); + for (argptr = &arg1; nbargs; nbargs--, argptr++) + printf( ",%08x", *argptr ); + printf( ")\n" ); +} diff --git a/if1632/relay32.c b/if1632/relay32.c index 418f1cccf23..14d98a4340a 100644 --- a/if1632/relay32.c +++ b/if1632/relay32.c @@ -11,10 +11,10 @@ #include #include #include "windows.h" +#include "callback.h" #include "dlls.h" #include "module.h" #include "neexe.h" -#include "pe_image.h" #include "peexe.h" #include "relay32.h" #include "struct32.h" @@ -24,116 +24,57 @@ #include "stddebug.h" #include "debug.h" -#define DLL_ENTRY(name) \ - { #name, (WIN32_function *)name##_Module_Start, \ - (WIN32_function *)name##_Module_End, (int *)name##_Data_Start, NULL } - -static WIN32_builtin WIN32_builtin_list[] = +typedef struct { - DLL_ENTRY(ADVAPI32), - DLL_ENTRY(COMCTL32), - DLL_ENTRY(COMDLG32), - DLL_ENTRY(OLE32), - DLL_ENTRY(GDI32), - DLL_ENTRY(KERNEL32), - DLL_ENTRY(SHELL32), - DLL_ENTRY(USER32), - DLL_ENTRY(WINPROCS32), - DLL_ENTRY(WINSPOOL) -}; + char *name; + void *definition; +} WIN32_function; -#define NB_DLLS (sizeof(WIN32_builtin_list)/sizeof(WIN32_builtin_list[0])) - -static void RELAY32_MakeFakeModule(WIN32_builtin*dll); - -int RELAY32_Init(void) +typedef struct { + int base; + int size; + WIN32_function functions[1]; +} WIN32_DLL_INFO; + + +void *RELAY32_GetEntryPoint(BUILTIN_DLL *dll, char *item, int hint) +{ + const WIN32_DLL_INFO *info = (const WIN32_DLL_INFO *)dll->data_start; int i; - for (i = 0; i < NB_DLLS; i++) - RELAY32_MakeFakeModule( &WIN32_builtin_list[i] ); + dprintf_module(stddeb, "Looking for %s in %s, hint %x\n", + item ? item: "(no name)", dll->name, hint); + if(!dll) return 0; - /* Why should it fail, anyways? */ - return 1; -} + /* import by ordinal */ + if(!item) + { + if(hint && hint < info->size) + return info->functions[hint - info->base].definition; + return 0; + } -WIN32_builtin *RELAY32_GetBuiltinDLL(char *name) -{ - WIN32_builtin *it; - size_t len; - char *cp; - int i; + /* hint is correct */ + if (hint && hint < info->size && + info->functions[hint].name && + strcmp(item,info->functions[hint].name)==0) + return info->functions[hint].definition; - len = (cp=strchr(name,'.')) ? (cp-name) : strlen(name); - for(i = NB_DLLS, it = WIN32_builtin_list; (i > 0); i--, it++) - if (!lstrncmpi(name,it->name,len)) return it; - return NULL; -} + /* hint is incorrect, search for name */ + for(i=0;i < info->size;i++) + if (info->functions[i].name && !strcmp(item,info->functions[i].name)) + return info->functions[i].definition; -void RELAY32_Unimplemented(char *dll, int item) -{ - WIN32_builtin *Dll; - fprintf( stderr, "No handler for routine %s.%d", dll, item); - Dll=RELAY32_GetBuiltinDLL(dll); - if(Dll && Dll->functions[item].name) - fprintf(stderr, "(%s?)\n", Dll->functions[item].name); - else - fprintf(stderr, "\n"); - fflush(stderr); - exit(1); -} - -void *RELAY32_GetEntryPoint(WIN32_builtin *dll, char *item, int hint) -{ - int i, size; - - dprintf_module(stddeb, "Looking for %s in %s, hint %x\n", - item ? item: "(no name)", dll->name, hint); - if(!dll) - return 0; - size = (int)(dll->last_func - dll->functions); - - /* import by ordinal */ - if(!item){ - if(hint && hint < size) - return dll->functions[hint - *dll->base].definition; - return 0; - } - /* hint is correct */ - if(hint && hint < size && - dll->functions[hint].name && - strcmp(item,dll->functions[hint].name)==0) - return dll->functions[hint].definition; - /* hint is incorrect, search for name */ - for(i=0;i < size;i++) - if (dll->functions[i].name && !strcmp(item,dll->functions[i].name)) - return dll->functions[i].definition; - - /* function at hint has no name (unimplemented) */ - if(hint && hint < size && !dll->functions[hint].name) - { - dll->functions[hint].name=xstrdup(item); - dprintf_module(stddeb, "Returning unimplemented function %s.%d\n", - dll->name,hint); - return dll->functions[hint].definition; - } - return 0; -} - -LONG RELAY32_CallWindowProc( WNDPROC func, int hwnd, int message, - int wParam, int lParam ) -{ - int ret; - __asm__ ( - "push %1;" - "push %2;" - "push %3;" - "push %4;" - "call %5;" - : "=a" (ret) - : "g" (lParam), "g" (wParam), "g" (message), "g" (hwnd), "g" (func) - ); - return ret; + /* function at hint has no name (unimplemented) */ + if(hint && hint < info->size && !info->functions[hint].name) + { +/* info->functions[hint].name=xstrdup(item); */ + dprintf_module(stddeb,"Returning unimplemented function %s.%d (%s?)\n", + dll->name,hint,item); + return info->functions[hint].definition; + } + return 0; } LONG RELAY32_CallWindowProcConvStruct( WNDPROC func, int hwnd, int message, @@ -149,18 +90,18 @@ LONG RELAY32_CallWindowProcConvStruct( WNDPROC func, int hwnd, int message, LONG result; void *lParam; if(!lParam16) - return RELAY32_CallWindowProc(func,hwnd,message,wParam,(int)lParam16); + return CallWndProc32(func,hwnd,message,wParam,(int)lParam16); lParam = PTR_SEG_TO_LIN(lParam16); switch(message) { case WM_GETMINMAXINFO: STRUCT32_MINMAXINFO16to32(lParam,&st.mmi); - result=RELAY32_CallWindowProc(func,hwnd,message,wParam,(int)&st.mmi); + result=CallWndProc32(func,hwnd,message,wParam,(int)&st.mmi); STRUCT32_MINMAXINFO32to16(&st.mmi,lParam); return result; case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: STRUCT32_WINDOWPOS16to32(lParam,&wp); - result=RELAY32_CallWindowProc(func,hwnd,message,wParam,(int)&wp); + result=CallWndProc32(func,hwnd,message,wParam,(int)&wp); STRUCT32_WINDOWPOS32to16(&wp,lParam); return result; case WM_NCCALCSIZE: @@ -170,7 +111,7 @@ LONG RELAY32_CallWindowProcConvStruct( WNDPROC func, int hwnd, int message, st.nccs.lppos=℘ } else st.nccs.lppos= 0; - result=RELAY32_CallWindowProc(func,hwnd,message,wParam,(int)&st.nccs); + result=CallWndProc32(func,hwnd,message,wParam,(int)&st.nccs); STRUCT32_NCCALCSIZE32to16Flat(&st.nccs,lParam); if(((NCCALCSIZE_PARAMS*)lParam)->lppos) STRUCT32_WINDOWPOS32to16(&wp,((NCCALCSIZE_PARAMS*)lParam)->lppos); @@ -182,7 +123,7 @@ LONG RELAY32_CallWindowProcConvStruct( WNDPROC func, int hwnd, int message, PTR_SEG_TO_LIN(lpcs->lpszName) : (char*)lpcs->lpszName; st.cs.lpszClass = HIWORD(lpcs->lpszClass) ? PTR_SEG_TO_LIN(lpcs->lpszClass) : (char*)lpcs->lpszClass; - result=RELAY32_CallWindowProc(func,hwnd,message,wParam,(int)&st.cs); + result=CallWndProc32(func,hwnd,message,wParam,(int)&st.cs); STRUCT32_CREATESTRUCT32to16(&st.cs,lParam); lpcs->lpszName = HIWORD(st.cs.lpszName) ? MAKE_SEGPTR(st.cs.lpszName) : (SEGPTR)st.cs.lpszName; @@ -191,71 +132,9 @@ LONG RELAY32_CallWindowProcConvStruct( WNDPROC func, int hwnd, int message, return result; case WM_GETTEXT: case WM_SETTEXT: - return RELAY32_CallWindowProc(func,hwnd,message,wParam,(int)lParam); + return CallWndProc32(func,hwnd,message,wParam,(int)lParam); default: fprintf(stderr,"No conversion function for message %d\n",message); } - return RELAY32_CallWindowProc(func,hwnd,message,wParam,(int)lParam); + return CallWndProc32(func,hwnd,message,wParam,(int)lParam); } - -static void RELAY32_MakeFakeModule(WIN32_builtin*dll) -{ - NE_MODULE *pModule; - struct w_files *wpnt; - int size; - HMODULE hModule; - OFSTRUCT *pFileInfo; - char *pStr; - wpnt=xmalloc(sizeof(struct w_files)); - wpnt->hinstance=0; - wpnt->hModule=0; - wpnt->initialised=1; - wpnt->mz_header=wpnt->pe=0; - size=sizeof(NE_MODULE) + - /* loaded file info */ - sizeof(*pFileInfo) - sizeof(pFileInfo->szPathName) + - strlen(dll->name) + 1 + - /* name table */ - 12 + - /* several empty tables */ - 8; - hModule = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, size ); - wpnt->hModule = hModule; - FarSetOwner( hModule, hModule ); - pModule = (NE_MODULE*)GlobalLock(hModule); - /* Set all used entries */ - pModule->magic=NE_SIGNATURE; - pModule->count=1; - pModule->next=0; - pModule->flags=NE_FFLAGS_WIN32; - pModule->dgroup=0; - pModule->ss=0; - pModule->cs=0; - pModule->heap_size=0; - pModule->stack_size=0; - pModule->seg_count=0; - pModule->modref_count=0; - pModule->nrname_size=0; - pModule->seg_table=0; - pModule->fileinfo=sizeof(NE_MODULE); - pModule->os_flags=NE_OSFLAGS_WINDOWS; - pModule->expected_version=0x30A; - pFileInfo=(OFSTRUCT *)(pModule + 1); - pFileInfo->cBytes = sizeof(*pFileInfo) - sizeof(pFileInfo->szPathName) - + strlen(dll->name); - strcpy( pFileInfo->szPathName, dll->name ); - pStr = ((char*)pFileInfo) + pFileInfo->cBytes + 1; - pModule->name_table=(int)pStr-(int)pModule; - *pStr=strlen(dll->name); - strcpy(pStr+1,dll->name); - pStr += *pStr+1; - pModule->res_table=pModule->import_table=pModule->entry_table= - (int)pStr-(int)pModule; - MODULE_RegisterModule(hModule); - wpnt->builtin=dll; - wpnt->next=wine_files; - wine_files=wpnt; -} - - - diff --git a/include/callback.h b/include/callback.h index 2a33b6fca56..3eb529b2c24 100644 --- a/include/callback.h +++ b/include/callback.h @@ -12,11 +12,12 @@ #include "stackframe.h" -extern int CallTo32_LargeStack( int (*func)(), int nbargs, ... ); +extern +int CallTo32_LargeStack( int (*func)(), int nbargs, ... ); /* List of the 16-bit callback functions. This list is used */ -/* by the build program to generate the file if1632/call16.S */ +/* by the build program to generate the file if1632/callto16.S */ /* func ds parameters */ extern WORD CallTo16_word_ ( FARPROC, WORD ); @@ -68,6 +69,22 @@ extern WORD CallTo16_regs_( FARPROC func, WORD ds, WORD es, WORD bp, WORD ax, #define CallWordBreakProc( func, lpch, ichCurrent, cch, code ) \ CallTo16_word_lwww( func, CURRENT_DS, lpch, ichCurrent, cch, code ) + +/* List of the 32-bit callback functions. This list is used */ +/* by the build program to generate the file if1632/callto32.S */ + +extern LONG CallTo32_0( FARPROC ); +extern LONG CallTo32_3( FARPROC, DWORD, DWORD, DWORD ); +extern LONG CallTo32_4( FARPROC, DWORD, DWORD, DWORD, DWORD ); + +#define CallTaskStart32( func ) \ + CallTo32_0( func ) +#define CallDLLEntryProc32( func, hmodule, a, b ) \ + CallTo32_3( func, hmodule, a, b ) +#define CallWndProc32( func, hwnd, msg, wParam, lParam ) \ + CallTo32_4( func, hwnd, msg, wParam, lParam ) + + #else /* WINELIB */ #define CallEnumChildProc( func, hwnd, lParam ) \ diff --git a/include/debugger.h b/include/debugger.h index 42b42064d42..1f1a7afffb2 100644 --- a/include/debugger.h +++ b/include/debugger.h @@ -40,6 +40,10 @@ typedef struct DEBUG_PrintAddress(addr,dbg_mode), \ fprintf(stderr,"\n"),0)) +#ifdef REG_SP /* Some Sun includes define this */ +#undef REG_SP +#endif + enum debug_regs { REG_EAX, REG_EBX, REG_ECX, REG_EDX, REG_ESI, diff --git a/include/dlls.h b/include/dlls.h index 2e5bcbcadc5..304b1420e3e 100644 --- a/include/dlls.h +++ b/include/dlls.h @@ -20,8 +20,9 @@ typedef struct dll_table_s } BUILTIN_DLL; /* DLL flags */ -#define DLL_FLAG_NOT_USED 1 /* Use original Windows DLL if possible */ -#define DLL_FLAG_WIN32 2 /* DLL is a Win32 DLL */ +#define DLL_FLAG_NOT_USED 0x01 /* Use original Windows DLL if possible */ +#define DLL_FLAG_ALWAYS_USED 0x02 /* Always use built-in DLL */ +#define DLL_FLAG_WIN32 0x04 /* DLL is a Win32 DLL */ #define DECLARE_DLL(name) \ extern const BYTE name##_Code_Start[]; \ diff --git a/include/local.h b/include/local.h index 93b4cbeb102..d3f12f7c21e 100644 --- a/include/local.h +++ b/include/local.h @@ -20,7 +20,7 @@ extern HLOCAL LOCAL_Handle( HANDLE ds, WORD addr ); extern WORD LOCAL_Size( HANDLE ds, HLOCAL handle ); extern WORD LOCAL_Flags( HANDLE ds, HLOCAL handle ); extern WORD LOCAL_HeapSize( HANDLE ds ); -extern NPVOID LOCAL_Lock( HANDLE ds, HLOCAL handle ); +extern LPSTR LOCAL_Lock( HANDLE ds, HLOCAL handle ); extern BOOL LOCAL_Unlock( HANDLE ds, HLOCAL handle ); #endif /* __WINE_LOCAL_H */ diff --git a/include/module.h b/include/module.h index bc23e1c2816..01561f1ae5f 100644 --- a/include/module.h +++ b/include/module.h @@ -51,6 +51,14 @@ typedef struct WORD self_loading_sel; /* Selector used for self-loading apps. procs */ } NE_MODULE; + + /* Extra module info appended to NE_MODULE for Win32 modules */ +typedef struct +{ + DWORD pe_module; +} NE_WIN32_EXTRAINFO; + + /* In-memory segment table */ typedef struct { @@ -61,6 +69,7 @@ typedef struct HANDLE selector; /* Selector of segment in memory */ } SEGTABLEENTRY; + /* Self-loading modules contain this structure in their first segment */ typedef struct @@ -97,11 +106,17 @@ typedef struct #define NE_MODULE_NAME(pModule) \ (((OFSTRUCT *)((char*)(pModule) + (pModule)->fileinfo))->szPathName) +#define NE_WIN32_MODULE(pModule) \ + ((struct pe_data *)(((pModule)->flags & NE_FFLAGS_WIN32) ? \ + ((NE_WIN32_EXTRAINFO *)((pModule) + 1))->pe_module : 0)) + #ifndef WINELIB #pragma pack(4) #endif extern BOOL MODULE_Init(void); +extern void MODULE_DumpModule( HMODULE hmodule ); +extern void MODULE_WalkModules(void); extern int MODULE_OpenFile( HMODULE hModule ); extern LPSTR MODULE_GetModuleName( HMODULE hModule ); extern void MODULE_RegisterModule( HMODULE hModule ); diff --git a/include/pe_image.h b/include/pe_image.h index 799392a7212..e97d4187e0e 100644 --- a/include/pe_image.h +++ b/include/pe_image.h @@ -3,6 +3,7 @@ #include #include "windows.h" +#include "dlls.h" struct pe_data { struct pe_header_s *pe_header; @@ -17,40 +18,7 @@ struct pe_data { int resource_offset; /* offset to resource typedirectory in file */ }; -typedef struct _WIN32_function{ - char *name; - void *definition; -} WIN32_function; - -typedef struct _WIN32_builtin{ - char *name; - WIN32_function *functions; - WIN32_function *last_func; - const int *base; - struct _WIN32_builtin *next; -} WIN32_builtin; - -struct w_files -{ - struct w_files * next; - char * name; /* Name, as it appears in the windows binaries */ - char * filename; /* Actual name of the unix file that satisfies this */ - int type; /* DLL or EXE */ - HINSTANCE hinstance; - HMODULE hModule; - int initialised; - struct mz_header_s *mz_header; - struct pe_data *pe; - OFSTRUCT ofs; - unsigned int load_addr; - WIN32_builtin* builtin; -}; - - -extern int PE_unloadImage(struct w_files *wpnt); -extern int PE_StartProgram(struct w_files *wpnt); -extern void PE_InitDLL(HMODULE hModule); +extern int PE_unloadImage(HMODULE hModule); extern void my_wcstombs(char * result, u_short * source, int len); -extern struct w_files *wine_files; #endif /* __WINE_PE_IMAGE_H */ diff --git a/include/registers.h b/include/registers.h index 93a9567ce53..98f28ee3ccc 100644 --- a/include/registers.h +++ b/include/registers.h @@ -10,7 +10,7 @@ #include #include "wine.h" -#ifndef __svr4__ +#if !defined(__svr4__) && !defined(_SCO_DS) #define EAX_reg(context) ((context)->sc_eax) #define EBX_reg(context) ((context)->sc_ebx) @@ -65,7 +65,11 @@ #define SET_CFLAG(context) (EFL_reg(context) |= 0x0001) #define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe) -#else /* __svr4__ */ +#else /* __svr4__ || _SCO_DS */ + +#ifdef _SCO_DS +#define gregs regs +#endif #define EAX_reg(context) ((context)->uc_mcontext.gregs[EAX]) #define EBX_reg(context) ((context)->uc_mcontext.gregs[EBX]) @@ -122,6 +126,6 @@ #define SET_CFLAG(context) (EFL_reg(context) |= 0x0001) #define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe) -#endif /* __svr4__ */ +#endif /* __svr4__ || _SCO_DS */ #endif /* __WINE_REGISTERS_H */ diff --git a/include/relay32.h b/include/relay32.h index c0cf4996bcf..06b87417425 100644 --- a/include/relay32.h +++ b/include/relay32.h @@ -4,16 +4,13 @@ * Copyright 1995 Martin von Loewis */ -#ifndef _RELAY32_H -#define _RELAY32_H -#include "pe_image.h" +#ifndef __WINE_RELAY32_H +#define __WINE_RELAY32_H + +#include "dlls.h" #include "struct32.h" -void RELAY32_Unimplemented(char *dll, int item); -WIN32_builtin *RELAY32_GetBuiltinDLL(char *name); -void *RELAY32_GetEntryPoint(WIN32_builtin *dll, char *item, int hint); -LONG RELAY32_CallWindowProc(WNDPROC,int,int,int,int); -void RELAY32_DebugEnter(char *dll,char *name); +void *RELAY32_GetEntryPoint(BUILTIN_DLL *dll, char *item, int hint); typedef struct tagWNDCLASSA{ UINT style; diff --git a/include/stackframe.h b/include/stackframe.h index a9d4020be5c..0b4451d914c 100644 --- a/include/stackframe.h +++ b/include/stackframe.h @@ -14,7 +14,7 @@ #pragma pack(1) #endif - /* 16-bit stack layout after CallTo32() */ + /* 16-bit stack layout after CallFrom16() */ typedef struct { WORD saved_ss; /* saved previous 16-bit stack */ @@ -49,13 +49,15 @@ typedef struct #pragma pack(4) #endif - /* Saved 16-bit stack */ + /* Saved 16-bit stack for current process (Win16 only) */ extern WORD IF1632_Saved16_ss; extern WORD IF1632_Saved16_sp; - /* Saved 32-bit stack */ + /* Saved 32-bit stack for current process (Win16 only) */ extern DWORD IF1632_Saved32_esp; extern SEGPTR IF1632_Stack32_base; + + /* Original Unix stack */ extern DWORD IF1632_Original32_esp; #ifndef WINELIB diff --git a/include/windows.h b/include/windows.h index b823ad3dd94..c25d916fe3c 100644 --- a/include/windows.h +++ b/include/windows.h @@ -2158,6 +2158,9 @@ typedef struct tagDRAGINFO { #define EM_SETWORDBREAKPROC (WM_USER+32) #define EM_GETWORDBREAKPROC (WM_USER+33) #define EM_GETPASSWORDCHAR (WM_USER+34) +/* Edit control undocumented messages */ +#define EM_SCROLL (WM_USER+5) +#define EM_GETTHUMB (WM_USER+14) typedef int (CALLBACK *EDITWORDBREAKPROC)(LPSTR lpch, int ichCurrent, int cch, int code); diff --git a/include/wine.h b/include/wine.h index e8b4cfadc39..af1be181559 100644 --- a/include/wine.h +++ b/include/wine.h @@ -46,8 +46,11 @@ struct sigcontext_struct #define WINE_CODE_SELECTOR 0x17 #endif -#ifdef __svr4__ +#if defined(__svr4__) || defined(_SCO_DS) #include +#ifdef _SCO_DS +#include +#endif #include #define sigcontext_struct ucontext #define WINE_DATA_SELECTOR 0x1f diff --git a/library/miscstubs.c b/library/miscstubs.c index 0c3f8c111f7..8ed3f2470d4 100644 --- a/library/miscstubs.c +++ b/library/miscstubs.c @@ -57,7 +57,7 @@ HLOCAL LOCAL_Alloc(WORD ds, WORD flags, WORD size) { return LocalAlloc(flags,size); } HLOCAL LOCAL_ReAlloc(WORD ds, HLOCAL handle, WORD size, WORD flags) { return LocalReAlloc(handle,size,flags); } -NPVOID LOCAL_Lock( WORD ds, HLOCAL handle ) +LPSTR LOCAL_Lock( WORD ds, HLOCAL handle ) { return LocalLock(handle); } BOOL LOCAL_Unlock( WORD ds, HLOCAL handle ) { return LocalUnlock(handle); } @@ -129,12 +129,7 @@ HGLOBAL GlobalHandle(LPCVOID a) return 0; } -WIN32_builtin *RELAY32_GetBuiltinDLL(char *name) -{ - return NULL; -} - -void *RELAY32_GetEntryPoint(WIN32_builtin *dll, char *item, int hint) +void *RELAY32_GetEntryPoint(BUILTIN_DLL *dll, char *item, int hint) { return NULL; } diff --git a/loader/main.c b/loader/main.c index 0c490375978..b06e261bd41 100644 --- a/loader/main.c +++ b/loader/main.c @@ -49,7 +49,6 @@ void init_wine_signals(void); int MAIN_Init(void) { extern BOOL RELAY_Init(void); - extern BOOL RELAY32_Init(void); int queueSize; @@ -62,9 +61,6 @@ int MAIN_Init(void) #ifndef WINELIB /* Initialize relay code */ if (!RELAY_Init()) return 0; - - /* Initialize Win32 relay code */ - if (!RELAY32_Init()) return 0; #endif /* Create built-in modules */ diff --git a/loader/module.c b/loader/module.c index fce734c6156..060c286f95e 100644 --- a/loader/module.c +++ b/loader/module.c @@ -47,7 +47,7 @@ static HMODULE MODULE_LoadBuiltin( LPCSTR name, BOOL force ) HMODULE hModule; NE_MODULE *pModule; SEGTABLEENTRY *pSegTable; - struct dll_table_s *table; + BUILTIN_DLL *table; char dllname[16], *p; /* Fix the name in case we have a full path and extension */ @@ -71,25 +71,31 @@ static HMODULE MODULE_LoadBuiltin( LPCSTR name, BOOL force ) dprintf_module( stddeb, "Built-in %s: hmodule=%04x\n", table->name, hModule ); - - /* Allocate the code segment */ - pModule = (NE_MODULE *)GlobalLock( hModule ); - pSegTable = NE_SEG_TABLE( pModule ); - pSegTable->selector = GLOBAL_CreateBlock( GMEM_FIXED, table->code_start, - pSegTable->minsize, hModule, - TRUE, TRUE, FALSE, NULL ); - if (!pSegTable->selector) return 0; - pSegTable++; + if (pModule->flags & NE_FFLAGS_WIN32) + { + ((NE_WIN32_EXTRAINFO*)(pModule+1))->pe_module = (DWORD)table; + } + else /* Win16 module */ + { + /* Allocate the code segment */ - /* Allocate the data segment */ + pSegTable = NE_SEG_TABLE( pModule ); + pSegTable->selector = GLOBAL_CreateBlock(GMEM_FIXED, table->code_start, + pSegTable->minsize, hModule, + TRUE, TRUE, FALSE, NULL ); + if (!pSegTable->selector) return 0; + pSegTable++; - pSegTable->selector = GLOBAL_Alloc( GMEM_FIXED, pSegTable->minsize, - hModule, FALSE, FALSE, FALSE ); - if (!pSegTable->selector) return 0; - memcpy( GlobalLock( pSegTable->selector ), - table->data_start, pSegTable->minsize ); + /* Allocate the data segment */ + + pSegTable->selector = GLOBAL_Alloc( GMEM_FIXED, pSegTable->minsize, + hModule, FALSE, FALSE, FALSE ); + if (!pSegTable->selector) return 0; + memcpy( GlobalLock( pSegTable->selector ), + table->data_start, pSegTable->minsize ); + } pModule->next = hFirstModule; hFirstModule = hModule; @@ -104,13 +110,14 @@ static HMODULE MODULE_LoadBuiltin( LPCSTR name, BOOL force ) */ BOOL MODULE_Init(void) { - /* For these, built-in modules are always used */ - #ifndef WINELIB32 - if (!MODULE_LoadBuiltin( "KERNEL", TRUE ) || - !MODULE_LoadBuiltin( "GDI", TRUE ) || - !MODULE_LoadBuiltin( "USER", TRUE ) || - !MODULE_LoadBuiltin( "WINPROCS", TRUE )) return FALSE; + BUILTIN_DLL *dll; + + /* Load all modules marked as always used */ + + for (dll = dll_builtin_table; dll->name; dll++) + if (dll->flags & DLL_FLAG_ALWAYS_USED) + if (!MODULE_LoadBuiltin(dll->name, TRUE)) return FALSE; #endif /* Initialize KERNEL.178 (__WINFLAGS) with the correct flags value */ @@ -120,9 +127,9 @@ BOOL MODULE_Init(void) /*********************************************************************** - * MODULE_PrintModule + * MODULE_DumpModule */ -void MODULE_PrintModule( HMODULE hmodule ) +void MODULE_DumpModule( HMODULE hmodule ) { int i, ordinal; SEGTABLEENTRY *pSeg; @@ -130,6 +137,12 @@ void MODULE_PrintModule( HMODULE hmodule ) WORD *pword; NE_MODULE *pModule = (NE_MODULE *)GlobalLock( hmodule ); + if (!pModule || (pModule->magic != NE_SIGNATURE)) + { + fprintf( stderr, "**** %04x is not a module handle\n", hmodule ); + return; + } + /* Dump the module info */ printf( "Module %04x:\n", hmodule ); @@ -142,6 +155,8 @@ void MODULE_PrintModule( HMODULE hmodule ) printf( "os_flags=%d swap_area=%d version=%04x\n", pModule->os_flags, pModule->min_swap_area, pModule->expected_version ); + if (pModule->flags & NE_FFLAGS_WIN32) + printf( "PE module=%08x\n", (unsigned int)NE_WIN32_MODULE(pModule) ); /* Dump the file info */ @@ -250,6 +265,31 @@ void MODULE_PrintModule( HMODULE hmodule ) } +/*********************************************************************** + * MODULE_WalkModules + * + * Walk the module list and print the modules. + */ +void MODULE_WalkModules(void) +{ + HMODULE hModule = hFirstModule; + fprintf( stderr, "Module Flags Name\n" ); + while (hModule) + { + NE_MODULE *pModule = (NE_MODULE *)GlobalLock( hModule ); + if (!pModule || (pModule->magic != NE_SIGNATURE)) + { + fprintf( stderr, "**** Bad module %04x in list\n", hModule ); + return; + } + fprintf( stderr, " %04x %04x %.*s\n", hModule, pModule->flags, + *((char *)pModule + pModule->name_table), + (char *)pModule + pModule->name_table + 1 ); + hModule = pModule->next; + } +} + + /*********************************************************************** * MODULE_OpenFile */ @@ -591,7 +631,7 @@ HMODULE MODULE_LoadExeHeader( HFILE hFile, OFSTRUCT *ofs ) } else pModule->dlls_to_init = 0; - if (debugging_module) MODULE_PrintModule( hModule ); + if (debugging_module) MODULE_DumpModule( hModule ); pModule->next = hFirstModule; hFirstModule = hModule; return hModule; diff --git a/loader/pe_image.c b/loader/pe_image.c index ced45d012b2..ad822886b78 100644 --- a/loader/pe_image.c +++ b/loader/pe_image.c @@ -18,6 +18,7 @@ #include #include #include "windows.h" +#include "callback.h" #include "dlls.h" #include "neexe.h" #include "peexe.h" @@ -33,8 +34,6 @@ #include "debug.h" #include "xmalloc.h" -struct w_files *wine_files = NULL; - void my_wcstombs(char * result, u_short * source, int len) { while(len--) { @@ -57,7 +56,7 @@ char * xmmap(char * vaddr, unsigned int v_size, unsigned int r_size, if(r_size) v_size=r_size; else -#ifdef __svr4__ +#if defined(__svr4__) || defined(_SCO_DS) fprintf(stderr,"xmmap: %s line %d doesn't support MAP_ANON\n",__FILE__, __LINE__); #else flags |= MAP_ANON; @@ -104,10 +103,10 @@ void dump_exports(struct PE_Export_Directory * pe_exports, unsigned int load_add } } -DWORD PE_FindExportedFunction(struct w_files* wpnt, char* funcName) +static DWORD PE_FindExportedFunction(struct pe_data *pe, char* funcName) { - struct PE_Export_Directory * exports = wpnt->pe->pe_export; - unsigned load_addr = wpnt->pe->load_addr; + struct PE_Export_Directory * exports = pe->pe_export; + unsigned load_addr = pe->load_addr; u_short * ordinal; u_long * function; u_char ** name, *ename; @@ -136,25 +135,28 @@ DWORD PE_FindExportedFunction(struct w_files* wpnt, char* funcName) DWORD PE_GetProcAddress(HMODULE hModule, char* function) { - struct w_files *wpnt; - for(wpnt=wine_files;wpnt;wpnt=wpnt->next) - if(wpnt->hModule==hModule) break; - if(!wpnt)return 0; - if(wpnt->builtin) - { - if(HIWORD(function)) - return RELAY32_GetEntryPoint(wpnt->builtin,function,0); - else - return RELAY32_GetEntryPoint(wpnt->builtin,0,(int)function); - } - return PE_FindExportedFunction(wpnt,function); + NE_MODULE *pModule; + struct pe_data *pe; + + if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return 0; + if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0; + if (pModule->flags & NE_FFLAGS_BUILTIN) + { + BUILTIN_DLL *dll = (BUILTIN_DLL *)NE_WIN32_MODULE(pModule); + if(HIWORD(function)) + return RELAY32_GetEntryPoint(dll,function,0); + else + return RELAY32_GetEntryPoint(dll,0,(int)function); + } + if (!(pe = NE_WIN32_MODULE(pModule))) return 0; + return PE_FindExportedFunction( pe, function ); } -void fixup_imports(struct w_files* wpnt) +void fixup_imports(struct pe_data *pe, HMODULE hModule) { struct PE_Import_Directory * pe_imp; int fixup_failed=0; - unsigned int load_addr = wpnt->pe->load_addr; + unsigned int load_addr = pe->load_addr; int i; NE_MODULE *ne_mod; HMODULE *mod_ptr; @@ -163,21 +165,19 @@ void fixup_imports(struct w_files* wpnt) dprintf_win32(stddeb, "\nDumping imports list\n"); /* first, count the number of imported non-internal modules */ - pe_imp = wpnt->pe->pe_import; + pe_imp = pe->pe_import; for(i=0;pe_imp->ModuleName;pe_imp++) i++; /* Now, allocate memory for dlls_to_init */ - ne_mod = GlobalLock(wpnt->hModule); + ne_mod = GlobalLock(hModule); ne_mod->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT,(i+1) * sizeof(HMODULE), - wpnt->hModule, FALSE, FALSE, FALSE ); + hModule, FALSE, FALSE, FALSE ); mod_ptr = GlobalLock(ne_mod->dlls_to_init); /* load the modules and put their handles into the list */ - for(i=0,pe_imp = wpnt->pe->pe_import;pe_imp->ModuleName;pe_imp++) + for(i=0,pe_imp = pe->pe_import;pe_imp->ModuleName;pe_imp++) { char *name = (char*)load_addr+pe_imp->ModuleName; - if(RELAY32_GetBuiltinDLL(name)) - continue; mod_ptr[i] = LoadModule(name,(LPVOID)-1); if(mod_ptr[i]<=(HMODULE)32) { @@ -186,7 +186,7 @@ void fixup_imports(struct w_files* wpnt) } i++; } - pe_imp = wpnt->pe->pe_import; + pe_imp = pe->pe_import; while (pe_imp->ModuleName) { char * Module; @@ -267,35 +267,35 @@ void fixup_imports(struct w_files* wpnt) if(fixup_failed)exit(1); } -static void calc_vma_size(struct w_files *wpnt) +static void calc_vma_size(struct pe_data *pe) { int i; dprintf_win32(stddeb, "Dump of segment table\n"); dprintf_win32(stddeb, " Name VSz Vaddr SzRaw Fileadr *Reloc *Lineum #Reloc #Linum Char\n"); - for(i=0; i< wpnt->pe->pe_header->coff.NumberOfSections; i++) + for(i=0; i< pe->pe_header->coff.NumberOfSections; i++) { dprintf_win32(stddeb, "%8s: %4.4lx %8.8lx %8.8lx %8.8lx %8.8lx %8.8lx %4.4x %4.4x %8.8lx\n", - wpnt->pe->pe_seg[i].Name, - wpnt->pe->pe_seg[i].Virtual_Size, - wpnt->pe->pe_seg[i].Virtual_Address, - wpnt->pe->pe_seg[i].Size_Of_Raw_Data, - wpnt->pe->pe_seg[i].PointerToRawData, - wpnt->pe->pe_seg[i].PointerToRelocations, - wpnt->pe->pe_seg[i].PointerToLinenumbers, - wpnt->pe->pe_seg[i].NumberOfRelocations, - wpnt->pe->pe_seg[i].NumberOfLinenumbers, - wpnt->pe->pe_seg[i].Characteristics); - wpnt->pe->vma_size = max(wpnt->pe->vma_size, - wpnt->pe->pe_seg[i].Virtual_Address + - wpnt->pe->pe_seg[i].Size_Of_Raw_Data); + pe->pe_seg[i].Name, + pe->pe_seg[i].Virtual_Size, + pe->pe_seg[i].Virtual_Address, + pe->pe_seg[i].Size_Of_Raw_Data, + pe->pe_seg[i].PointerToRawData, + pe->pe_seg[i].PointerToRelocations, + pe->pe_seg[i].PointerToLinenumbers, + pe->pe_seg[i].NumberOfRelocations, + pe->pe_seg[i].NumberOfLinenumbers, + pe->pe_seg[i].Characteristics); + pe->vma_size = max(pe->vma_size, + pe->pe_seg[i].Virtual_Address + + pe->pe_seg[i].Size_Of_Raw_Data); } } -static void do_relocations(struct w_files *wpnt) +static void do_relocations(struct pe_data *pe) { - int delta = wpnt->pe->load_addr - wpnt->pe->base_addr; - struct PE_Reloc_Block *r = wpnt->pe->pe_reloc; + int delta = pe->load_addr - pe->base_addr; + struct PE_Reloc_Block *r = pe->pe_reloc; int hdelta = (delta >> 16) & 0xFFFF; int ldelta = delta & 0xFFFF; /* int reloc_size = */ @@ -304,7 +304,7 @@ static void do_relocations(struct w_files *wpnt) return; while(r->PageRVA) { - char *page = (char*)wpnt->pe->load_addr + r->PageRVA; + char *page = (char*)pe->load_addr + r->PageRVA; int count = (r->BlockSize - 8)/2; int i; dprintf_fixup(stddeb, "%x relocations for page %lx\n", @@ -357,179 +357,177 @@ static void do_relocations(struct w_files *wpnt) * PE_LoadImage * Load one PE format executable into memory */ -static HINSTANCE PE_LoadImage( int fd, struct w_files *wpnt ) +static struct pe_data *PE_LoadImage( int fd, HMODULE hModule, WORD offset ) { - int i, result; + struct pe_data *pe; + int i, result; unsigned int load_addr; - struct Directory dir; + struct Directory dir; - wpnt->pe = xmalloc(sizeof(struct pe_data)); - memset(wpnt->pe,0,sizeof(struct pe_data)); - wpnt->pe->pe_header = xmalloc(sizeof(struct pe_header_s)); + pe = xmalloc(sizeof(struct pe_data)); + memset(pe,0,sizeof(struct pe_data)); + pe->pe_header = xmalloc(sizeof(struct pe_header_s)); /* read PE header */ - lseek( fd, wpnt->mz_header->ne_offset, SEEK_SET); - read( fd, wpnt->pe->pe_header, sizeof(struct pe_header_s)); + lseek( fd, offset, SEEK_SET); + read( fd, pe->pe_header, sizeof(struct pe_header_s)); /* read sections */ - wpnt->pe->pe_seg = xmalloc(sizeof(struct pe_segment_table) * - wpnt->pe->pe_header->coff.NumberOfSections); - read( fd, wpnt->pe->pe_seg, sizeof(struct pe_segment_table) * - wpnt->pe->pe_header->coff.NumberOfSections); + pe->pe_seg = xmalloc(sizeof(struct pe_segment_table) * + pe->pe_header->coff.NumberOfSections); + read( fd, pe->pe_seg, sizeof(struct pe_segment_table) * + pe->pe_header->coff.NumberOfSections); - load_addr = wpnt->pe->pe_header->opt_coff.BaseOfImage; - wpnt->pe->base_addr=load_addr; - wpnt->pe->vma_size=0; + load_addr = pe->pe_header->opt_coff.BaseOfImage; + pe->base_addr=load_addr; + pe->vma_size=0; dprintf_win32(stddeb, "Load addr is %x\n",load_addr); - calc_vma_size(wpnt); + calc_vma_size(pe); /* We use malloc here, while a huge part of that address space does not be supported by actual memory. It has to be contiguous, though. I don't know if mmap("/dev/null"); would do any better. What I'd really like to do is a Win32 style VirtualAlloc/MapViewOfFile sequence */ - load_addr = wpnt->pe->load_addr = malloc(wpnt->pe->vma_size); + load_addr = pe->load_addr = malloc(pe->vma_size); dprintf_win32(stddeb, "Load addr is really %x, range %x\n", - wpnt->pe->load_addr, wpnt->pe->vma_size); + pe->load_addr, pe->vma_size); - for(i=0; i < wpnt->pe->pe_header->coff.NumberOfSections; i++) + for(i=0; i < pe->pe_header->coff.NumberOfSections; i++) { /* load only non-BSS segments */ - if(wpnt->pe->pe_seg[i].Characteristics & + if(pe->pe_seg[i].Characteristics & ~ IMAGE_SCN_TYPE_CNT_UNINITIALIZED_DATA) - if(lseek(fd,wpnt->pe->pe_seg[i].PointerToRawData,SEEK_SET) == -1 - || read(fd,load_addr + wpnt->pe->pe_seg[i].Virtual_Address, - wpnt->pe->pe_seg[i].Size_Of_Raw_Data) - != wpnt->pe->pe_seg[i].Size_Of_Raw_Data) + if(lseek(fd,pe->pe_seg[i].PointerToRawData,SEEK_SET) == -1 + || read(fd,load_addr + pe->pe_seg[i].Virtual_Address, + pe->pe_seg[i].Size_Of_Raw_Data) + != pe->pe_seg[i].Size_Of_Raw_Data) { fprintf(stderr,"Failed to load section %x\n", i); exit(0); } - result = load_addr + wpnt->pe->pe_seg[i].Virtual_Address; + result = load_addr + pe->pe_seg[i].Virtual_Address; #if 0 if(!load_addr) { - result = (int)xmmap((char *)0, wpnt->pe->pe_seg[i].Virtual_Size, - wpnt->pe->pe_seg[i].Size_Of_Raw_Data, 7, - MAP_PRIVATE, fd, wpnt->pe->pe_seg[i].PointerToRawData); - load_addr = (unsigned int) result - wpnt->pe->pe_seg[i].Virtual_Address; + result = (int)xmmap((char *)0, pe->pe_seg[i].Virtual_Size, + pe->pe_seg[i].Size_Of_Raw_Data, 7, + MAP_PRIVATE, fd, pe->pe_seg[i].PointerToRawData); + load_addr = (unsigned int) result - pe->pe_seg[i].Virtual_Address; } else { - result = (int)xmmap((char *) load_addr + wpnt->pe->pe_seg[i].Virtual_Address, - wpnt->pe->pe_seg[i].Virtual_Size, - wpnt->pe->pe_seg[i].Size_Of_Raw_Data, 7, MAP_PRIVATE | MAP_FIXED, - fd, wpnt->pe->pe_seg[i].PointerToRawData); + result = (int)xmmap((char *) load_addr + pe->pe_seg[i].Virtual_Address, + pe->pe_seg[i].Virtual_Size, + pe->pe_seg[i].Size_Of_Raw_Data, 7, MAP_PRIVATE | MAP_FIXED, + fd, pe->pe_seg[i].PointerToRawData); } if(result==-1){ fprintf(stderr,"Could not load section %x to desired address %lx\n", - i, load_addr+wpnt->pe->pe_seg[i].Virtual_Address); + i, load_addr+pe->pe_seg[i].Virtual_Address); fprintf(stderr,"Need to implement relocations now\n"); exit(0); } #endif - if(strcmp(wpnt->pe->pe_seg[i].Name, ".bss") == 0) + if(strcmp(pe->pe_seg[i].Name, ".bss") == 0) memset((void *)result, 0, - wpnt->pe->pe_seg[i].Virtual_Size ? - wpnt->pe->pe_seg[i].Virtual_Size : - wpnt->pe->pe_seg[i].Size_Of_Raw_Data); + pe->pe_seg[i].Virtual_Size ? + pe->pe_seg[i].Virtual_Size : + pe->pe_seg[i].Size_Of_Raw_Data); - if(strcmp(wpnt->pe->pe_seg[i].Name, ".idata") == 0) - wpnt->pe->pe_import = (struct PE_Import_Directory *) result; + if(strcmp(pe->pe_seg[i].Name, ".idata") == 0) + pe->pe_import = (struct PE_Import_Directory *) result; - if(strcmp(wpnt->pe->pe_seg[i].Name, ".edata") == 0) - wpnt->pe->pe_export = (struct PE_Export_Directory *) result; + if(strcmp(pe->pe_seg[i].Name, ".edata") == 0) + pe->pe_export = (struct PE_Export_Directory *) result; - if(strcmp(wpnt->pe->pe_seg[i].Name, ".rsrc") == 0) { - wpnt->pe->pe_resource = (struct PE_Resource_Directory *) result; + if(strcmp(pe->pe_seg[i].Name, ".rsrc") == 0) { + pe->pe_resource = (struct PE_Resource_Directory *) result; #if 0 /* FIXME pe->resource_offset should be deleted from structure if this ifdef doesn't break anything */ /* save offset for PE_FindResource */ - wpnt->pe->resource_offset = wpnt->pe->pe_seg[i].Virtual_Address - - wpnt->pe->pe_seg[i].PointerToRawData; + pe->resource_offset = pe->pe_seg[i].Virtual_Address - + pe->pe_seg[i].PointerToRawData; #endif } - if(strcmp(wpnt->pe->pe_seg[i].Name, ".reloc") == 0) - wpnt->pe->pe_reloc = (struct PE_Reloc_Block *) result; + if(strcmp(pe->pe_seg[i].Name, ".reloc") == 0) + pe->pe_reloc = (struct PE_Reloc_Block *) result; } /* There is word that the actual loader does not care about the section names, and only goes for the DataDirectory */ - dir=wpnt->pe->pe_header->opt_coff.DataDirectory[IMAGE_FILE_EXPORT_DIRECTORY]; + dir=pe->pe_header->opt_coff.DataDirectory[IMAGE_FILE_EXPORT_DIRECTORY]; if(dir.Size) { - if(wpnt->pe->pe_export && - wpnt->pe->pe_export!=load_addr+dir.Virtual_address) + if(pe->pe_export && + pe->pe_export!=load_addr+dir.Virtual_address) fprintf(stderr,"wrong export directory??\n"); /* always trust the directory */ - wpnt->pe->pe_export = load_addr+dir.Virtual_address; + pe->pe_export = load_addr+dir.Virtual_address; } - dir=wpnt->pe->pe_header->opt_coff.DataDirectory[IMAGE_FILE_IMPORT_DIRECTORY]; + dir=pe->pe_header->opt_coff.DataDirectory[IMAGE_FILE_IMPORT_DIRECTORY]; if(dir.Size) { - if(wpnt->pe->pe_import && - wpnt->pe->pe_import!=load_addr+dir.Virtual_address) + if(pe->pe_import && + pe->pe_import!=load_addr+dir.Virtual_address) fprintf(stderr,"wrong import directory??\n"); - wpnt->pe->pe_import = load_addr+dir.Virtual_address; + pe->pe_import = load_addr+dir.Virtual_address; } - dir=wpnt->pe->pe_header->opt_coff.DataDirectory[IMAGE_FILE_RESOURCE_DIRECTORY]; + dir=pe->pe_header->opt_coff.DataDirectory[IMAGE_FILE_RESOURCE_DIRECTORY]; if(dir.Size) { - if(wpnt->pe->pe_resource && - wpnt->pe->pe_resource!=load_addr+dir.Virtual_address) + if(pe->pe_resource && + pe->pe_resource!=load_addr+dir.Virtual_address) fprintf(stderr,"wrong resource directory??\n"); - wpnt->pe->pe_resource = load_addr+dir.Virtual_address; + pe->pe_resource = load_addr+dir.Virtual_address; } - dir=wpnt->pe->pe_header->opt_coff.DataDirectory[IMAGE_FILE_BASE_RELOCATION_TABLE]; + dir=pe->pe_header->opt_coff.DataDirectory[IMAGE_FILE_BASE_RELOCATION_TABLE]; if(dir.Size) { - if(wpnt->pe->pe_reloc && - wpnt->pe->pe_reloc!=load_addr+dir.Virtual_address) + if(pe->pe_reloc && + pe->pe_reloc!=load_addr+dir.Virtual_address) fprintf(stderr,"wrong relocation list??\n"); - wpnt->pe->pe_reloc = load_addr+dir.Virtual_address; + pe->pe_reloc = load_addr+dir.Virtual_address; } - if(wpnt->pe->pe_header->opt_coff.DataDirectory + if(pe->pe_header->opt_coff.DataDirectory [IMAGE_FILE_EXCEPTION_DIRECTORY].Size) dprintf_win32(stdnimp,"Exception directory ignored\n"); - if(wpnt->pe->pe_header->opt_coff.DataDirectory + if(pe->pe_header->opt_coff.DataDirectory [IMAGE_FILE_SECURITY_DIRECTORY].Size) dprintf_win32(stdnimp,"Security directory ignored\n"); - if(wpnt->pe->pe_header->opt_coff.DataDirectory + if(pe->pe_header->opt_coff.DataDirectory [IMAGE_FILE_DEBUG_DIRECTORY].Size) dprintf_win32(stdnimp,"Debug directory ignored\n"); - if(wpnt->pe->pe_header->opt_coff.DataDirectory + if(pe->pe_header->opt_coff.DataDirectory [IMAGE_FILE_DESCRIPTION_STRING].Size) dprintf_win32(stdnimp,"Description string ignored\n"); - if(wpnt->pe->pe_header->opt_coff.DataDirectory + if(pe->pe_header->opt_coff.DataDirectory [IMAGE_FILE_MACHINE_VALUE].Size) dprintf_win32(stdnimp,"Machine Value ignored\n"); - if(wpnt->pe->pe_header->opt_coff.DataDirectory + if(pe->pe_header->opt_coff.DataDirectory [IMAGE_FILE_THREAD_LOCAL_STORAGE].Size) dprintf_win32(stdnimp,"Thread local storage ignored\n"); - if(wpnt->pe->pe_header->opt_coff.DataDirectory + if(pe->pe_header->opt_coff.DataDirectory [IMAGE_FILE_CALLBACK_DIRECTORY].Size) dprintf_win32(stdnimp,"Callback directory ignored\n"); - if(wpnt->pe->pe_import) fixup_imports(wpnt); - if(wpnt->pe->pe_export) dump_exports(wpnt->pe->pe_export,load_addr); - if(wpnt->pe->pe_reloc) do_relocations(wpnt); - - wpnt->hinstance = (HINSTANCE)0x8000; - wpnt->load_addr = load_addr; - return (wpnt->hinstance); + if(pe->pe_import) fixup_imports(pe, hModule); + if(pe->pe_export) dump_exports(pe->pe_export,load_addr); + if(pe->pe_reloc) do_relocations(pe); + return pe; } HINSTANCE MODULE_CreateInstance(HMODULE hModule,LOADPARAMS *params); @@ -537,31 +535,27 @@ void InitTask(struct sigcontext_struct context); HINSTANCE PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params ) { - struct w_files *wpnt; + struct pe_data *pe; int size, of_size; NE_MODULE *pModule; + NE_WIN32_EXTRAINFO *pExtraInfo; SEGTABLEENTRY *pSegment; char *pStr; DWORD cts; HMODULE hModule; HINSTANCE hInstance; + struct mz_header_s mz_header; ALIAS_UseAliases=1; - wpnt=xmalloc(sizeof(struct w_files)); - wpnt->ofs=*ofs; - wpnt->type=0; - wpnt->hinstance=0; - wpnt->hModule=0; - wpnt->initialised=0; - wpnt->builtin=0; lseek(fd,0,SEEK_SET); - wpnt->mz_header=xmalloc(sizeof(struct mz_header_s)); - read(fd,wpnt->mz_header,sizeof(struct mz_header_s)); + read( fd, &mz_header, sizeof(mz_header) ); of_size = sizeof(OFSTRUCT) - sizeof(ofs->szPathName) + strlen(ofs->szPathName) + 1; size = sizeof(NE_MODULE) + + /* extra module info */ + sizeof(NE_WIN32_EXTRAINFO) + /* loaded file info */ of_size + /* segment table: DS,CS */ @@ -572,7 +566,6 @@ HINSTANCE PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params ) 8; hModule = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, size ); - wpnt->hModule=hModule; if (!hModule) return (HINSTANCE)11; /* invalid exe */ FarSetOwner( hModule, hModule ); @@ -593,17 +586,19 @@ HINSTANCE PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params ) pModule->seg_count=1; pModule->modref_count=0; pModule->nrname_size=0; - pModule->seg_table=sizeof(NE_MODULE) + of_size; - pModule->fileinfo=sizeof(NE_MODULE); + pModule->fileinfo=sizeof(NE_MODULE) + sizeof(NE_WIN32_EXTRAINFO); pModule->os_flags=NE_OSFLAGS_WINDOWS; pModule->expected_version=0x30A; - /* Set loaded file information */ - memcpy( pModule + 1, ofs, of_size ); - ((OFSTRUCT *)(pModule+1))->cBytes = of_size - 1; + /* Set extra info */ + pExtraInfo = (NE_WIN32_EXTRAINFO *)(pModule + 1); - pSegment=(SEGTABLEENTRY*)((char*)(pModule + 1) + of_size); - pModule->dgroup_entry=(int)pSegment-(int)pModule; + /* Set loaded file information */ + memcpy( pExtraInfo + 1, ofs, of_size ); + ((OFSTRUCT *)(pExtraInfo+1))->cBytes = of_size - 1; + + pSegment=(SEGTABLEENTRY*)((char*)(pExtraInfo + 1) + of_size); + pModule->seg_table=pModule->dgroup_entry=(int)pSegment-(int)pModule; pSegment->size=0; pSegment->flags=NE_SEGFLAGS_DATA; pSegment->minsize=0x1000; @@ -630,32 +625,23 @@ HINSTANCE PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params ) MODULE_RegisterModule(hModule); - PE_LoadImage( fd, wpnt ); + pe = PE_LoadImage( fd, hModule, mz_header.ne_offset ); + pExtraInfo->pe_module = (DWORD)pe; pModule->heap_size=0x1000; pModule->stack_size=0xE000; /* CreateInstance allocates now 64KB */ hInstance=MODULE_CreateInstance(hModule,NULL /* FIX: NULL? really? */); - wpnt->hinstance=hInstance; - - if (wpnt->pe->pe_export) { - pStr = ((unsigned char *)(wpnt->load_addr))+wpnt->pe->pe_export->Name; - wpnt->name = xstrdup(pStr); - } else { - wpnt->name = xstrdup( ofs->szPathName ); - } - - wpnt->next=wine_files; - wine_files=wpnt; /* FIXME: Is this really the correct place to initialise the DLL? */ - if ((wpnt->pe->pe_header->coff.Characteristics & IMAGE_FILE_DLL)) { - PE_InitDLL(hModule); + if ((pe->pe_header->coff.Characteristics & IMAGE_FILE_DLL)) { +/* PE_InitDLL(hModule); */ } else { TASK_CreateTask(hModule,hInstance,0, params->hEnvironment,(LPSTR)PTR_SEG_TO_LIN(params->cmdLine), *((WORD*)PTR_SEG_TO_LIN(params->showCmd)+1)); + PE_InitializeDLLs(hModule); } return hInstance; } @@ -665,41 +651,48 @@ void PE_InitTEB(int hTEB); void PE_Win32CallToStart(struct sigcontext_struct context) { - int fs; - struct w_files *wpnt=wine_files; - dprintf_win32(stddeb,"Going to start Win32 program\n"); - InitTask(context); - USER_InitApp(wpnt->hModule); - fs=(int)GlobalAlloc(GHND,0x10000); - PE_InitTEB(fs); - __asm__ __volatile__("movw %w0,%%fs"::"r" (fs)); - ((void(*)())(wpnt->load_addr+wpnt->pe->pe_header->opt_coff.AddressOfEntryPoint))(); + int fs; + HMODULE hModule; + struct pe_data *pe; + + dprintf_win32(stddeb,"Going to start Win32 program\n"); + InitTask(context); + hModule = GetExePtr( GetCurrentTask() ); + USER_InitApp( hModule ); + fs=(int)GlobalAlloc(GHND,0x10000); + PE_InitTEB(fs); + pe = NE_WIN32_MODULE( (NE_MODULE *)GlobalLock(hModule) ); + __asm__ __volatile__("movw %w0,%%fs"::"r" (fs)); +/* ((void(*)())(pe->load_addr+pe->pe_header->opt_coff.AddressOfEntryPoint))(); */ + CallTaskStart32( (FARPROC)(pe->load_addr + + pe->pe_header->opt_coff.AddressOfEntryPoint) ); } -int PE_UnloadImage(struct w_files *wpnt) +int PE_UnloadImage( HMODULE hModule ) { printf("PEunloadImage() called!\n"); /* free resources, image, unmap */ return 1; } -void PE_InitDLL(HMODULE hModule) +static void PE_InitDLL(HMODULE hModule) { - struct w_files *wpnt; - hModule = GetExePtr(hModule); - for(wpnt = wine_files;wpnt && wpnt->hModule != hModule; - wpnt = wpnt->next) /*nothing*/; - if(!wpnt || wpnt->initialised) - return; - /* FIXME: What are the correct values for parameters 2 and 3? */ + NE_MODULE *pModule; + struct pe_data *pe; + hModule = GetExePtr(hModule); + if (!(pModule = (NE_MODULE *)GlobalLock(hModule))) return; + if (!(pModule->flags & NE_FFLAGS_WIN32)) return; + if (!(pe = NE_WIN32_MODULE(pModule))) return; + /* FIXME: What are the correct values for parameters 2 and 3? */ - /* Is this a library? */ - if (wpnt->pe->pe_header->coff.Characteristics & IMAGE_FILE_DLL) { - /* Should call DLLEntryPoint here */ - printf("InitPEDLL() called!\n"); - wpnt->initialised = 1; - ((void(*)())(wpnt->load_addr+wpnt->pe->pe_header->opt_coff.AddressOfEntryPoint))(wpnt->hModule, 0, 0); - } + /* Is this a library? */ + if (pe->pe_header->coff.Characteristics & IMAGE_FILE_DLL) + { + printf("InitPEDLL() called!\n"); + CallDLLEntryProc32( (FARPROC)(pe->load_addr + + pe->pe_header->opt_coff.AddressOfEntryPoint), + hModule, 0, 0 ); + } } diff --git a/loader/signal.c b/loader/signal.c index 8ebc0b6883a..d9b72ab6869 100644 --- a/loader/signal.c +++ b/loader/signal.c @@ -10,8 +10,10 @@ #include #include -#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__svr4__) +#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__svr4__) || defined(_SCO_DS) +#ifndef _SCO_DS #include +#endif #include #else #include @@ -76,7 +78,7 @@ static void wine_timer(int signal, int code, struct sigcontext *context) static void win_fault(int signal, struct sigcontext_struct context_struct) { struct sigcontext_struct *context = &context_struct; -#elif defined(__svr4__) +#elif defined(__svr4__) || defined(_SCO_DS) static void win_fault(int signal, void *siginfo, ucontext_t *context) { #else @@ -128,7 +130,7 @@ static void SIGNAL_SetHandler( int sig, void (*func)() ) #ifdef linux sig_act.sa_handler = func; - sig_act.sa_flags = SA_RESTART; + sig_act.sa_flags = SA_RESTART | SA_NOMASK; /* Point to the top of the stack, minus 4 just in case, and make it aligned */ sig_act.sa_restorer = @@ -145,14 +147,14 @@ static void SIGNAL_SetHandler( int sig, void (*func)() ) ret = sigaction( sig, &sig_act, NULL ); #endif /* __FreeBSD__ || __NetBSD__ */ -#if defined (__svr4__) +#if defined (__svr4__) || defined(_SCO_DS) sigset_t sig_mask; sigemptyset(&sig_mask); sig_act.sa_handler = func; sig_act.sa_flags = SA_ONSTACK | SA_SIGINFO; sig_act.sa_mask = sig_mask; ret = sigaction( sig, &sig_act, NULL ); -#endif /* __svr4__ */ +#endif /* __svr4__ || _SCO_DS */ if (ret < 0) { @@ -189,7 +191,7 @@ void init_wine_signals(void) } #endif /* __FreeBSD__ || __NetBSD__ */ -#if defined (__svr4__) +#if defined (__svr4__) || defined(_SCO_DS) struct sigaltstack ss; if ((ss.ss_sp = malloc(SIGSTKSZ) ) == NULL) { @@ -203,7 +205,7 @@ void init_wine_signals(void) perror("sigstack"); exit(1); } -#endif /* __svr4__ */ +#endif /* __svr4__ || _SCO_DS */ SIGNAL_SetHandler( SIGALRM, (void (*)())wine_timer ); SIGNAL_SetHandler( SIGSEGV, (void (*)())win_fault ); @@ -217,19 +219,21 @@ void init_wine_signals(void) #ifdef CONFIG_IPC SIGNAL_SetHandler( SIGUSR2, (void (*)())stop_wait ); /* For IPC */ #endif - SIGNAL_StartBIOSTimer(); } /********************************************************************** - * SIGNAL_StartTimer + * SIGNAL_StartBIOSTimer * * Start the BIOS tick timer. */ void SIGNAL_StartBIOSTimer(void) { struct itimerval vt_timer; + static int timer_started = 0; + if (timer_started) return; + timer_started = 1; vt_timer.it_interval.tv_sec = 0; vt_timer.it_interval.tv_usec = 54929; vt_timer.it_value = vt_timer.it_interval; diff --git a/loader/task.c b/loader/task.c index 0fc4a674fd6..0a2a3b8d19f 100644 --- a/loader/task.c +++ b/loader/task.c @@ -384,7 +384,7 @@ HTASK TASK_CreateTask( HMODULE hModule, HANDLE hInstance, HANDLE hPrevInstance, char *stack16Top, *stack32Top; STACK16FRAME *frame16; STACK32FRAME *frame32; - extern DWORD CALL16_RetAddr_word; + extern DWORD CALLTO16_RetAddr_word; #endif if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return 0; @@ -529,8 +529,8 @@ HTASK TASK_CreateTask( HMODULE hModule, HANDLE hInstance, HANDLE hPrevInstance, frame16->ordinal_number = 24; /* WINPROCS.24 is TASK_Reschedule */ frame16->dll_id = 24; /* WINPROCS */ frame16->bp = 0; - frame16->ip = LOWORD( CALL16_RetAddr_word ); - frame16->cs = HIWORD( CALL16_RetAddr_word ); + frame16->ip = LOWORD( CALLTO16_RetAddr_word ); + frame16->cs = HIWORD( CALLTO16_RetAddr_word ); pTask->sp -= sizeof(STACK16FRAME); /* If there's no 16-bit stack yet, use a part of the new task stack */ diff --git a/memory/ldt.c b/memory/ldt.c index 86ab2ef8ade..e5267d7c98b 100644 --- a/memory/ldt.c +++ b/memory/ldt.c @@ -22,7 +22,7 @@ _syscall3(int, modify_ldt, int, func, void *, ptr, unsigned long, bytecount) #endif /* linux */ -#ifdef __svr4__ +#if defined(__svr4__) || defined(_SCO_DS) #include #include #endif @@ -153,7 +153,7 @@ int LDT_SetEntry( int entry, const ldt_entry *content ) } } #endif /* __NetBSD__ || __FreeBSD__ */ -#ifdef __svr4__ +#if defined(__svr4__) || defined(_SCO_DS) { struct ssd ldt_mod; int i; diff --git a/memory/local.c b/memory/local.c index e1134963737..f249a8016a1 100644 --- a/memory/local.c +++ b/memory/local.c @@ -823,16 +823,14 @@ HLOCAL LOCAL_ReAlloc( HANDLE ds, HLOCAL handle, WORD size, WORD flags ) /*********************************************************************** - * LOCAL_Lock + * LOCAL_InternalLock */ -HANDLE LOCAL_Lock( HANDLE ds, HLOCAL handle ) +static HLOCAL LOCAL_InternalLock( LPSTR heap, HLOCAL handle ) { - char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ); - dprintf_local( stddeb, "LocalLock: %04x ", handle ); if (HANDLE_MOVEABLE(handle)) { - LOCALHANDLEENTRY *pEntry = (LOCALHANDLEENTRY *)(ptr + handle); + LOCALHANDLEENTRY *pEntry = (LOCALHANDLEENTRY *)(heap + handle); if (pEntry->lock < 255) pEntry->lock++; handle = pEntry->addr; } @@ -841,6 +839,16 @@ HANDLE LOCAL_Lock( HANDLE ds, HLOCAL handle ) } +/*********************************************************************** + * LOCAL_Lock + */ +LPSTR LOCAL_Lock( HANDLE ds, HLOCAL handle ) +{ + char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ); + return handle ? ptr + LOCAL_InternalLock( ptr, handle ) : NULL; +} + + /*********************************************************************** * LOCAL_Unlock */ @@ -929,7 +937,8 @@ HLOCAL LocalFree( HLOCAL handle ) */ NPVOID LocalLock( HLOCAL handle ) { - return LOCAL_Lock( CURRENT_DS, handle ); + char *ptr = PTR_SEG_OFF_TO_LIN( CURRENT_DS, 0 ); + return (NPVOID)LOCAL_InternalLock( ptr, handle ); } diff --git a/misc/comm.c b/misc/comm.c index 467912d082d..d0dfef32829 100644 --- a/misc/comm.c +++ b/misc/comm.c @@ -54,7 +54,7 @@ void COMM_Init(void) } stat(temp, &st); if (!S_ISCHR(st.st_mode)) - fprintf(stderr,"comm: can 't use `%s' as %s !\n", temp, option); + fprintf(stderr,"comm: can't use `%s' as %s !\n", temp, option); else if ((COM[x].devicename = malloc(strlen(temp)+1)) == NULL) fprintf(stderr,"comm: can't malloc for device info!\n"); @@ -77,7 +77,7 @@ void COMM_Init(void) else { stat(temp, &st); if (!S_ISCHR(st.st_mode)) - fprintf(stderr,"comm: can 't use `%s' as %s !\n", temp, option); + fprintf(stderr,"comm: can't use `%s' as %s !\n", temp, option); else if ((LPT[x].devicename = malloc(strlen(temp)+1)) == NULL) fprintf(stderr,"comm: can't malloc for device info!\n"); @@ -352,15 +352,19 @@ LONG EscapeCommFunction(int fd, int nFunction) return 0x80 + max; break; +#ifdef TIOCM_DTR case CLRDTR: port.c_cflag &= TIOCM_DTR; break; +#endif +#ifdef TIOCM_RTS case CLRRTS: port.c_cflag &= TIOCM_RTS; break; +#endif -#ifndef __svr4__ +#ifdef CRTSCTS case SETDTR: port.c_cflag |= CRTSCTS; break; @@ -464,7 +468,11 @@ int SetCommState(DCB FAR *lpdcb) port.c_cc[VMIN] = 0; port.c_cc[VTIME] = 1; +#ifdef IMAXBEL port.c_iflag &= ~(ISTRIP|BRKINT|IGNCR|ICRNL|INLCR|IMAXBEL); +#else + port.c_iflag &= ~(ISTRIP|BRKINT|IGNCR|ICRNL|INLCR); +#endif port.c_iflag |= (IGNBRK); port.c_oflag &= ~(OPOST); @@ -622,7 +630,7 @@ int SetCommState(DCB FAR *lpdcb) commerror = IE_BYTESIZE; return -1; } -#ifndef __svr4__ +#ifdef CRTSCTS if (lpdcb->fDtrflow || lpdcb->fRtsflow || lpdcb->fOutxCtsFlow) port.c_cflag |= CRTSCTS; @@ -730,7 +738,7 @@ int GetCommState(int fd, DCB FAR *lpdcb) lpdcb->fBinary = 1; lpdcb->fDtrDisable = 0; -#ifndef __svr4__ +#ifdef CRTSCTS if (port.c_cflag & CRTSCTS) { lpdcb->fDtrflow = 1; diff --git a/misc/main.c b/misc/main.c index caa253f4e2e..e7bfddab84d 100644 --- a/misc/main.c +++ b/misc/main.c @@ -266,7 +266,7 @@ BOOL ParseDebugOptions(char *options) */ static BOOL MAIN_ParseDLLOptions(char *options) { - int i, l; + int l; BUILTIN_DLL *dll; if (strlen(options)<3) return FALSE; @@ -280,7 +280,11 @@ static BOOL MAIN_ParseDLLOptions(char *options) if (!lstrncmpi(options+1,dll->name,l-1)) { if (*options == '+') dll->flags &= ~DLL_FLAG_NOT_USED; - else dll->flags |= DLL_FLAG_NOT_USED; + else + { + if (dll->flags & DLL_FLAG_ALWAYS_USED) return FALSE; + dll->flags |= DLL_FLAG_NOT_USED; + } break; } } @@ -438,8 +442,9 @@ static void MAIN_ParseOptions( int *argc, char *argv[] ) fprintf(stderr,"%s: Syntax: -dll +xxx,... or -dll -xxx,...\n",argv[0]); fprintf(stderr,"Example: -dll -ole2 Do not use emulated OLE2.DLL\n"); fprintf(stderr,"Available DLLs\n"); - for (dll = dll_builtin_table; dll->name; dll++) - fprintf(stderr,"%-9s%c",dll->name, (((i+2)%8==0)?'\n':' ')); + for (i = 0, dll = dll_builtin_table; dll->name; dll++) + if (!(dll->flags & DLL_FLAG_ALWAYS_USED)) + fprintf(stderr,"%-9s%c",dll->name, (((++i)%8==0)?'\n':' ')); fprintf(stderr,"\n\n"); exit(1); } diff --git a/misc/port.c b/misc/port.c index 751750c2114..165a6df280f 100644 --- a/misc/port.c +++ b/misc/port.c @@ -9,8 +9,7 @@ unsigned int usleep (unsigned int useconds) delay.tv_sec = 0; delay.tv_usec = useconds; - (void) select (0, (fd_set *) NULL, (fd_set *) NULL, (fd_set *) NULL, - &delay); + (void) select (0, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &delay); return 0; } diff --git a/misc/registry.c b/misc/registry.c index 1cff39f3280..64830784711 100644 --- a/misc/registry.c +++ b/misc/registry.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "windows.h" #include "win.h" #include "winerror.h" @@ -76,7 +77,7 @@ add_handle(HKEY hkey,LPKEYSTRUCT lpkey,REGSAM accessmask) { } static LPKEYSTRUCT -get_handle(hkey) { +get_handle(HKEY hkey) { int i; for (i=0;i #include #include -#ifdef __svr4__ +#if defined__svr4__ #include #include #endif @@ -29,6 +29,11 @@ #include "stddebug.h" #include "debug.h" +#ifdef _SCO_DS +#define _IOR _IOSR +#define _IOW _IOSW +#endif + static WORD wsa_errno; static int wsa_initted; static key_t wine_key = 0; @@ -208,7 +213,9 @@ static WORD wsaerrno(void) #ifdef EPROCLIM case EPROCLIM: return WSAEPROCLIM; #endif +#ifdef EUSERS case EUSERS: return WSAEUSERS; +#endif #ifdef EDQUOT case EDQUOT: return WSAEDQUOT; #endif diff --git a/miscemu/dosmem.c b/miscemu/dosmem.c index d3d5fa9eb83..a4c156a2844 100644 --- a/miscemu/dosmem.c +++ b/miscemu/dosmem.c @@ -138,7 +138,7 @@ BOOL DOSMEM_Init(void) */ void DOSMEM_Tick(void) { - pBiosData->Ticks++; + if (pBiosData) pBiosData->Ticks++; } @@ -149,8 +149,6 @@ void DOSMEM_Tick(void) */ void DOSMEM_FillBiosSegment(void) { - extern void SIGNAL_StartBIOSTimer(void); - pBiosData = (BIOSDATA *)GlobalLock( DOSMEM_BiosSeg ); /* Clear all unused values */ @@ -175,7 +173,5 @@ void DOSMEM_FillBiosSegment(void) pBiosData->NbHardDisks = 2; pBiosData->KbdBufferStart = 0x1e; pBiosData->KbdBufferEnd = 0x3e; - - SIGNAL_StartBIOSTimer(); } diff --git a/miscemu/instr.c b/miscemu/instr.c index 14ac461321e..767f4e8298b 100644 --- a/miscemu/instr.c +++ b/miscemu/instr.c @@ -28,8 +28,10 @@ static WORD INSTR_ReplaceSelector( struct sigcontext_struct *context, WORD sel) { if (sel == 0x40) { + extern void SIGNAL_StartBIOSTimer(void); fprintf( stderr, "Direct access to segment 0x40 (cs:ip=%04x:%04lx).\n", CS_reg(context), EIP_reg(context) ); + SIGNAL_StartBIOSTimer(); return DOSMEM_BiosSeg; } return 0; /* Can't replace selector */ diff --git a/miscemu/int21.c b/miscemu/int21.c index 08f300ee8b6..53e0769f1c9 100644 --- a/miscemu/int21.c +++ b/miscemu/int21.c @@ -28,8 +28,8 @@ #include "xmalloc.h" #include "stddebug.h" #include "debug.h" -#ifdef __svr4__ -/* SVR4 DOESNTdo locking the same way must implement properly */ +#if defined(__svr4__) || defined(_SCO_DS) +/* SVR4 DOESNT do locking the same way must implement properly */ #define LOCK_EX 0 #define LOCK_SH 1 #define LOCK_NB 8 @@ -346,7 +346,7 @@ void OpenExistingFile(struct sigcontext_struct *context) int result,retries=sharing_retries; { -#ifdef __svr4__ +#if defined(__svr4__) || defined(_SCO_DS) printf("Should call flock and needs porting to lockf\n"); result = 0; retries = 0; diff --git a/multimedia/time.c b/multimedia/time.c index f0e21fe3e9e..b49dfb782a1 100644 --- a/multimedia/time.c +++ b/multimedia/time.c @@ -12,6 +12,7 @@ #include "windows.h" #include "win.h" #include "ldt.h" +#include "module.h" #include "callback.h" #include "user.h" #include "driver.h" diff --git a/objects/font.c b/objects/font.c index 114c8eaaea5..41c8d38531c 100644 --- a/objects/font.c +++ b/objects/font.c @@ -3,6 +3,10 @@ * * Copyright 1993 Alexandre Julliard * + * Enhacements by Juergen Marquardt 1996 + * + * Implementation of a second font cache which + * will be updated dynamically */ #include @@ -17,6 +21,7 @@ #include "stddebug.h" #include "debug.h" +#define FONTCACHE 32 /* dynamic font cache size */ #define MAX_FONTS 256 static LPLOGFONT lpLogFontList[MAX_FONTS] = { NULL }; @@ -139,10 +144,15 @@ static XFontStruct * FONT_MatchFont( LOGFONT * font, DC * dc ) if (height == 0) height = 120; /* Default height = 12 */ else if (height < 0) { - /* If height is negative, it means the height of the characters */ - /* *without* the internal leading. So we adjust it a bit to */ - /* compensate. 5/4 seems to give good results for small fonts. */ - height = 10 * (-height * 8 / 7); + /* If height is negative, it means the height of the characters */ + /* *without* the internal leading. So we adjust it a bit to */ + /* compensate. 5/4 seems to give good results for small fonts. */ + /* + * J.M.: This causes wrong font size for bigger fonts e.g. in Winword & Write + height = 10 * (-height * 9 / 8); + * may be we have to use an non linear function + */ + height *= -10; } else height *= 10; width = 10 * (font->lfWidth * dc->w.VportExtY / dc->w.WndExtY); @@ -151,10 +161,17 @@ static XFontStruct * FONT_MatchFont( LOGFONT * font, DC * dc ) width, font->lfWidth ); width = -width; } + spacing = (font->lfPitchAndFamily & FIXED_PITCH) ? 'm' : (font->lfPitchAndFamily & VARIABLE_PITCH) ? 'p' : '*'; + + charset = (font->lfCharSet == ANSI_CHARSET) ? "iso8859-1" : "*-*"; - if (*font->lfFaceName) family = FONT_TranslateName( font->lfFaceName ); + if (*font->lfFaceName) { + family = FONT_TranslateName( font->lfFaceName ); + /* FIX ME: I don't if that's correct but it works J.M. */ + spacing = '*'; + } else switch(font->lfPitchAndFamily & 0xf0) { case FF_ROMAN: @@ -191,6 +208,7 @@ static XFontStruct * FONT_MatchFont( LOGFONT * font, DC * dc ) names = XListFonts( display, pattern, 1, &count ); if (count > 0) break; if (spacing == 'm') /* try 'c' if no 'm' found */ { + spacing = 'c'; continue; } else if (spacing == 'p') /* try '*' if no 'p' found */ { @@ -367,6 +385,15 @@ int FONT_GetObject( FONTOBJ * font, int count, LPSTR buffer ) HFONT FONT_SelectObject( DC * dc, HFONT hfont, FONTOBJ * font ) { static X_PHYSFONT stockFonts[LAST_STOCK_FONT-FIRST_STOCK_FONT+1]; + + static struct { + HFONT id; + LOGFONT logfont; + int access; + int used; + X_PHYSFONT cacheFont; } cacheFonts[FONTCACHE], *cacheFontsMin; + int i; + X_PHYSFONT * stockPtr; HFONT prevHandle = dc->w.hFont; XFontStruct * fontStruct; @@ -393,9 +420,46 @@ HFONT FONT_SelectObject( DC * dc, HFONT hfont, FONTOBJ * font ) if ((hfont >= FIRST_STOCK_FONT) && (hfont <= LAST_STOCK_FONT)) stockPtr = &stockFonts[hfont - FIRST_STOCK_FONT]; - else + else { stockPtr = NULL; - + /* + * Ok, It's not a stock font but + * may be it's cached in dynamic cache + */ + for(i=0; ilogfont), sizeof(LOGFONT))) { + /* No: remove handle id from dynamic font cache */ + cacheFonts[i].access=0; + cacheFonts[i].used=0; + cacheFonts[i].id=0; + /* may be there is an unused handle which contains the font */ + for(i=0; ilogfont), sizeof(LOGFONT)))== 0) { + /* got it load from cache and set new handle id */ + stockPtr = &cacheFonts[i].cacheFont; + cacheFonts[i].access=1; + cacheFonts[i].used=1; + cacheFonts[i].id=hfont; + dprintf_font(stddeb,"FONT_SelectObject: got font from unused handle\n"); + break; + } + } + + } + else { + /* Yes: load from dynamic font cache */ + stockPtr = &cacheFonts[i].cacheFont; + cacheFonts[i].access++; + cacheFonts[i].used++; + } + break; + } + } if (!stockPtr || !stockPtr->fstruct) { if (!(fontStruct = FONT_MatchFont( &font->logfont, dc ))) @@ -422,16 +486,14 @@ HFONT FONT_SelectObject( DC * dc, HFONT hfont, FONTOBJ * font ) hfont, fontStruct ); } - /* Free previous font */ - - if ((prevHandle < FIRST_STOCK_FONT) || (prevHandle > LAST_STOCK_FONT)) - { - if (dc->u.x.font.fstruct) - XFreeFont( display, dc->u.x.font.fstruct ); - } + /* Unuse previous font */ + for (i=0; i < FONTCACHE; i++) { + if (cacheFonts[i].id == prevHandle) { + cacheFonts[i].used--; + } + } /* Store font */ - dc->w.hFont = hfont; if (stockPtr) { @@ -444,8 +506,31 @@ HFONT FONT_SelectObject( DC * dc, HFONT hfont, FONTOBJ * font ) } else { - dc->u.x.font.fstruct = fontStruct; - FONT_GetMetrics( &font->logfont, fontStruct, &dc->u.x.font.metrics ); + /* + * Check in cacheFont + */ + cacheFontsMin=NULL; + for (i=0; i < FONTCACHE; i++) { + if (cacheFonts[i].used==0) + if ((!cacheFontsMin) || ((cacheFontsMin) && (cacheFontsMin->access > cacheFonts[i].access))) + cacheFontsMin=&cacheFonts[i]; + } + if (!cacheFontsMin) + fprintf(stderr,"No unused font cache entry !!!!\n" ); + + if (cacheFontsMin->id!=0) { + dprintf_font(stddeb, + "FONT_SelectObject: Freeing %04x \n",cacheFontsMin->id ); + XFreeFont( display, cacheFontsMin->cacheFont.fstruct ); + } + cacheFontsMin->cacheFont.fstruct = fontStruct; + FONT_GetMetrics( &font->logfont, fontStruct, &cacheFontsMin->cacheFont.metrics ); + cacheFontsMin->access=1; + cacheFontsMin->used=1; + cacheFontsMin->id=hfont; + memcpy( &dc->u.x.font, &(cacheFontsMin->cacheFont), sizeof(cacheFontsMin->cacheFont) ); + memcpy(&cacheFontsMin->logfont,&(font->logfont), sizeof(LOGFONT)); + } return prevHandle; } diff --git a/resources/TODO b/resources/TODO index db771cc964b..e391bd37aa5 100644 --- a/resources/TODO +++ b/resources/TODO @@ -1,20 +1,29 @@ -Due to the implementation of FindText() and ReplaceText() in /misc/commdlg.c -I had to change the definition in sysres_En.rc of the dialogs FIND_TEXT and -REPLACE_TEXT. These changes should also be made for the other languages. -Not only should the definitions in sysres_??.rc made up to date with the -Enlish version, but also the dimensions of the controls should be changed so -that they will be big enough to contain the text for every individual -language. +The dimensions of the controls should be changed so that they will be big +enough to contain the text for every individual language. Therefore: -- Definitions of FIND_TEXT and REPLACE_TEXT in sysres_??.rc should match - those in sysres_En.rc - Dimensions of controls are based on sysres_En.rc. Other languages should change these dimensions in order to make the text fit. +I (krynos@qbc.clic.net) will try to make sysres_Fr.rc fit correctly, if +someone is interrested in others languages, message me. I may correct +others languages after, but not soon. + +Here are structure of each line (for example): +PUSHBUTTON "&Help", 1038, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP +1038: The ID of this button, you shouldn't change this. +174 : X-offset of the button with respect to the upper-left corner of + the dialog box. +75 : Y-offset +50 : The width of the button +14 : The height +flags (WS_??? etc): They control how the dialog behaves. Things like: + changing the focus with a TAB, scrolling to a list + of radiobuttons with up/down keys, etc. If you're + not sure: leave them as they are (in the english + version). + + Frans van Dorsselaer dorssel@rulhm1.LeidenUniv.nl - - -Robert Pouliot (krynos@qbc.clic.net): Changes to sysres_Fr.rc have been made. diff --git a/resources/sysres_Cz.rc b/resources/sysres_Cz.rc index 9dc052f3eed..e7129d6ae9f 100644 --- a/resources/sysres_Cz.rc +++ b/resources/sysres_Cz.rc @@ -165,36 +165,38 @@ FONT 8, "Helv" } -FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 84 +FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Hledání" FONT 8, "Helv" { - LTEXT "&Vyhledat:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - CHECKBOX "Pouze &celá slova", 1040, 20, 30, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "&Rozlišovat malá a velká písmena", 1041, 20, 50, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - GROUPBOX "Smìr", 1072, 90, 40, 80, 40, BS_GROUPBOX - RADIOBUTTON "&Nahoru", 1056, 100, 50, 50, 12 - RADIOBUTTON "&Dolu", 1057, 150, 50, 50, 12 - DEFPUSHBUTTON "Vyhledat d&alší", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Zavĝít", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&Vyhledat:", -1, 4, 8, 42, 8 + EDITTEXT 1152, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "Pouze &celá slova", 1040, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Rozlišovat malá a velká písmena", 1041, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "Smìr", 1072, 107, 26, 68, 28 + CONTROL "N&ahoru", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 + CONTROL "&Dolu", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 + DEFPUSHBUTTON "Vyhledat d&alší", 1, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Zavĝít", 2, 182, 23, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Nápovìda", 1038, 182, 45, 50, 14, WS_GROUP | WS_TABSTOP } -REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 114 +REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Zámìna" FONT 8, "Helv" { - LTEXT "&Vyhledat:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - LTEXT "&Zamìnit za:", 1090, 6, 26, 40, 9 - LTEXT "", 1091, 60, 26, 150, 9 - CHECKBOX "Pouze &celá slova", 1040, 20, 40, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "&Rozlišovat malá a velká písmena", 1041, 20, 60, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - DEFPUSHBUTTON "Vyhledat d&alší", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Za&mìnit", 1024, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Zamìnit ve vŭ&bìru", 1025, 206, 44, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Zavĝít", 2, 206, 64, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&Vyhledat:", -1, 4, 9, 48, 8 + EDITTEXT 1152, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Zamìnit za:", -1, 4, 26, 48, 8 + EDITTEXT 1153, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "Pouze &celá slova", 1040, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Rozlišovat malá a velká písmena", 1041, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_TABSTOP + DEFPUSHBUTTON "Vyhledat d&alší", 1, 174, 4, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Za&mìnit", 1024, 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Zamìnit ve vŭ&bìru", 1025, 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Zavĝít", 2, 174, 55, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Nápovìda", 1038, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP } diff --git a/resources/sysres_Da.rc b/resources/sysres_Da.rc index df9c11f8f54..9a7c7002eed 100644 --- a/resources/sysres_Da.rc +++ b/resources/sysres_Da.rc @@ -165,36 +165,38 @@ FONT 8, "Helv" } -FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 84 +FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Find" FONT 8, "Helv" { - LTEXT "&Find hvad:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - CHECKBOX "Kun &hele ord", 1040, 20, 30, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "Forskel pċ store/smċ &bogstaver", 1041, 20, 50, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - GROUPBOX "Retning", 1072, 90, 40, 80, 40, BS_GROUPBOX - RADIOBUTTON "&Op", 1056, 100, 50, 50, 12 - RADIOBUTTON "&Ned", 1057, 150, 50, 50, 12 - DEFPUSHBUTTON "&Find nĉste", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Annuller", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&Find hvad:", -1, 4, 8, 42, 8 + EDITTEXT 1152, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&Kun hele ord", 1040, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Forskel pċ store/smċ &bogstaver", 1041, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "Retning", 1072, 107, 26, 68, 28 + CONTROL "&Op", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 + CONTROL "&Ned", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 + DEFPUSHBUTTON "&Find nĉste", 1, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Annuller", 2, 182, 23, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Hjĉlp", 1038, 182, 45, 50, 14, WS_GROUP | WS_TABSTOP } -REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 114 +REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Erstat" FONT 8, "Helv" { - LTEXT "&Find hvad:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - LTEXT "&Erstat med:", 1090, 6, 26, 40, 9 - LTEXT "", 1091, 60, 26, 150, 9 - CHECKBOX "Kun &hele ord", 1040, 20, 40, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "Forskel pċ store/smċ &bogstaver", 1041, 20, 60, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - DEFPUSHBUTTON "&Find nĉste", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Erstat", 1024, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Erstat &alle", 1025, 206, 44, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Afbryd", 2, 206, 64, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&Find hvad:", -1, 4, 9, 48, 8 + EDITTEXT 1152, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Erstat med:", -1, 4, 26, 48, 8 + EDITTEXT 1153, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&Kun hele ord", 1040, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "Forskel pċ store/smċ &bogstaver", 1041, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_TABSTOP + DEFPUSHBUTTON "&Find nĉste", 1, 174, 4, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Erstat", 1024, 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Erstat &alle", 1025, 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Annuller", 2, 174, 55, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Hjĉlp", 1038, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP } diff --git a/resources/sysres_De.rc b/resources/sysres_De.rc index 770d0111a61..abb8f604303 100644 --- a/resources/sysres_De.rc +++ b/resources/sysres_De.rc @@ -165,37 +165,38 @@ FONT 8, "Helv" } -FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 84 +FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Suchen" FONT 8, "Helv" { - LTEXT "S&uchen nach:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - CHECKBOX "Nur ganze &Worte", 1040, 20, 30, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "Beachte Groß/Kleinschreibung", 1041, 20, 50, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - GROUPBOX "Richtung", 1072, 90, 40, 80, 40, BS_GROUPBOX - RADIOBUTTON "&Hoch", 1056, 100, 50, 50, 12 - RADIOBUTTON "&Runter", 1057, 150, 50, 50, 12 - DEFPUSHBUTTON "&Nächsten finden", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Abbrechen", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "S&uchen nach:", -1, 4, 8, 42, 8 + EDITTEXT 1152, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "Nur ganze &Worte", 1040, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Beachte Groß/Kleinschreibung", 1041, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "Richtung", 1072, 107, 26, 68, 28 + CONTROL "H&och", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 + CONTROL "&Runter", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 + DEFPUSHBUTTON "&Nächsten finden", 1, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Abbrechen", 2, 182, 23, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Hilfe", 1038, 182, 45, 50, 14, WS_GROUP | WS_TABSTOP } -REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 114 +REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Ersetzen" FONT 8, "Helv" { - LTEXT "S&uchen nach:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - LTEXT "Ersetzen &durch:", 1090, 6, 26, 40, 9 - LTEXT "", 1091, 60, 26, 150, 9 - CHECKBOX "Nur ganze &Worte", 1040, 20, 40, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "Beachte Groß/Kleinschreibung", 1041, 20, 60, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - DEFPUSHBUTTON "&Nächsten finden", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Ersetzen", 1024, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Alle ersetzen", 1025, 206, 44, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Abbrechen", 2, 206, 64, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "S&uchen nach:", -1, 4, 9, 48, 8 + EDITTEXT 1152, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "Ersetzen &durch:", -1, 4, 26, 48, 8 + EDITTEXT 1153, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "Nur ganze &Worte", 1040, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Beachte Groß/Kleinschreibung", 1041, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_TABSTOP + DEFPUSHBUTTON "&Nächsten finden", 1, 174, 4, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Ersetzen", 1024, 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Alle ersetzen", 1025, 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Abbrechen", 2, 174, 55, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Hilfe", 1038, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP } - diff --git a/resources/sysres_Eo.rc b/resources/sysres_Eo.rc index 09b3a939aec..da223ee88d3 100644 --- a/resources/sysres_Eo.rc +++ b/resources/sysres_Eo.rc @@ -165,37 +165,38 @@ FONT 8, "Helv" } -FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 84 +FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Serĉu" FONT 8, "Helv" { - LTEXT "&Serĉu:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - CHECKBOX "Nur tutan &vorton", 1040, 20, 30, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "Atentu &Usklecon", 1041, 20, 50, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - GROUPBOX "Direkto", 1072, 90, 40, 80, 40, BS_GROUPBOX - RADIOBUTTON "&Retro", 1056, 100, 50, 50, 12 - RADIOBUTTON "&Antaŭen", 1057, 150, 50, 50, 12 - DEFPUSHBUTTON "&Pluserĉu", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Nuligu", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&Serĉu:", -1, 4, 8, 42, 8 + EDITTEXT 1152, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "Nur tutan &vorton", 1040, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Atentu &Usklecon", 1041, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "Direkto", 1072, 107, 26, 68, 28 + CONTROL "&Retro", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 + CONTROL "&Antaŭen", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 + DEFPUSHBUTTON "&Pluserĉu", 1, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Nuligu", 2, 182, 23, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Helpu", 1038, 182, 45, 50, 14, WS_GROUP | WS_TABSTOP } -REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 114 +REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Anstataŭigu" FONT 8, "Helv" { - LTEXT "Anstataŭigu:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - LTEXT "&per:", 1090, 6, 26, 40, 9 - LTEXT "", 1091, 60, 26, 150, 9 - CHECKBOX "Nur tutan &vorton", 1040, 20, 40, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "Atentu &Usklecon", 1041, 20, 60, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - DEFPUSHBUTTON "Plu&serĉu", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Anstataŭigu", 1024, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Anstataŭigu ĉ&iujn", 1025, 206, 44, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Nuligu", 2, 206, 64, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "Anstataŭigu:", -1, 4, 9, 48, 8 + EDITTEXT 1152, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&per:", -1, 4, 26, 48, 8 + EDITTEXT 1153, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "Nur tutan &vorton", 1040, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Atentu &Usklecon", 1041, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_TABSTOP + DEFPUSHBUTTON "Plu&serĉu", 1, 174, 4, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Anstataŭigu", 1024, 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Anstataŭigu ĉ&iujn", 1025, 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Nuligu", 2, 174, 55, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Helpu", 1038, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP } - diff --git a/resources/sysres_Es.rc b/resources/sysres_Es.rc index c472ae95048..235fdd94b13 100644 --- a/resources/sysres_Es.rc +++ b/resources/sysres_Es.rc @@ -166,37 +166,38 @@ FONT 8, "Helv" } -FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 84 +FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Buscar" FONT 8, "Helv" { - LTEXT "Buscar:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - CHECKBOX "&Comparar palabra entera solamente", 1040, 20, 30, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "&Mayúsculas/minúsculas", 1041, 20, 50, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - GROUPBOX "Dirección", 1072, 90, 40, 80, 40, BS_GROUPBOX - RADIOBUTTON "A&rriba", 1056, 100, 50, 50, 12 - RADIOBUTTON "&Abajo", 1057, 150, 50, 50, 12 - DEFPUSHBUTTON "Buscar &siguiente", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Cancelar", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "Buscar:", -1, 4, 8, 42, 8 + EDITTEXT 1152, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&Comparar palabra entera solamente", 1040, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Mayúsculas/minúsculas", 1041, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "Dirección", 1072, 107, 26, 68, 28 + CONTROL "A&rriba", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 + CONTROL "&Abajo", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 + DEFPUSHBUTTON "Buscar &siguiente", 1, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancelar", 2, 182, 23, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "A&yuda", 1038, 182, 45, 50, 14, WS_GROUP | WS_TABSTOP } -REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 114 +REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "R&eemplazar" FONT 8, "Helv" { - LTEXT "Buscar:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - LTEXT "Re&place With:", 1090, 6, 26, 40, 9 - LTEXT "", 1091, 60, 26, 150, 9 - CHECKBOX "&Comparar palabra entera solamente", 1040, 20, 40, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "&Mayúsculas/minúsculas", 1041, 20, 60, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - DEFPUSHBUTTON "Reemplazar &siguiente", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Reemplazar", 1024, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Reemplazar &todo", 1025, 206, 44, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Cancelar", 2, 206, 64, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "Buscar:", -1, 4, 9, 48, 8 + EDITTEXT 1152, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "Re&emplazar por:", 1090, -1, 4, 26, 48, 8 + EDITTEXT 1153, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&Comparar palabra entera solamente", 1040, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Mayúsculas/minúsculas", 1041, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_TABSTOP + DEFPUSHBUTTON "Reemplazar &siguiente", 1, 174, 4, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Reemplazar", 1024, 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Reemplazar &todo", 1025, 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancelar", 2, 174, 55, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "A&yuda", 1038, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP } - diff --git a/resources/sysres_Fi.rc b/resources/sysres_Fi.rc index 9a9f7a239d9..447f42673e4 100644 --- a/resources/sysres_Fi.rc +++ b/resources/sysres_Fi.rc @@ -165,36 +165,38 @@ FONT 8, "Helv" } -FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 84 +FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Etsi" FONT 8, "Helv" { - LTEXT "&Etsittävä:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - CHECKBOX "&Koko sana", 1040, 20, 30, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "Kirjaink&oko", 1041, 20, 50, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - GROUPBOX "Suunta", 1072, 90, 40, 80, 40, BS_GROUPBOX - RADIOBUTTON "&Ylös", 1056, 100, 50, 50, 12 - RADIOBUTTON "&Alas", 1057, 150, 50, 50, 12 - DEFPUSHBUTTON "Etsi &seuraava", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Peruuta", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&Etsittävä:", -1, 4, 8, 42, 8 + EDITTEXT 1152, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&Koko sana", 1040, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Kirjaink&oko", 1041, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "Suunta", 1072, 107, 26, 68, 28 + CONTROL "&Ylös", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 + CONTROL "&Alas", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 + DEFPUSHBUTTON "Etsi &seuraava", 1, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Peruuta", 2, 182, 23, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "O&hje", 1038, 182, 45, 50, 14, WS_GROUP | WS_TABSTOP } -REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 114 +REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Korvaa" FONT 8, "Helv" { - LTEXT "&Etsittävä:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - LTEXT "Ko&rvattava:", 1090, 6, 26, 40, 9 - LTEXT "", 1091, 60, 26, 150, 9 - CHECKBOX "&Koko sana", 1040, 20, 40, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "Kirjaink&oko", 1041, 20, 60, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - DEFPUSHBUTTON "Etsi &seuraava", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Korv&aa", 1024, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Korvaa ka&ikki", 1025, 206, 44, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "S&ulje", 2, 206, 64, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&Etsittävä:", -1, 4, 9, 48, 8 + EDITTEXT 1152, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "Ko&rvattava:", -1, 4, 26, 48, 8 + EDITTEXT 1153, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&Koko sana", 1040, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Kirjaink&oko", 1041, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_TABSTOP + DEFPUSHBUTTON "Etsi &seuraava", 1, 174, 4, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Korv&aa", 1024, 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Korvaa ka&ikki", 1025, 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "S&ulje", 2, 174, 55, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "O&hje", 1038, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP } diff --git a/resources/sysres_No.rc b/resources/sysres_No.rc index f7ca6252792..f208f752d87 100644 --- a/resources/sysres_No.rc +++ b/resources/sysres_No.rc @@ -165,36 +165,38 @@ FONT 8, "Helv" } -FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 84 +FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Finn" FONT 8, "Helv" { - LTEXT "&Finn hva:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - CHECKBOX "&Kun hele ord", 1040, 20, 30, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "&Skill pċ store/smċ bokstaver", 1041, 20, 50, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - GROUPBOX "Retning", 1072, 90, 40, 80, 40, BS_GROUPBOX - RADIOBUTTON "&Opp", 1056, 100, 50, 50, 12 - RADIOBUTTON "&Ned", 1057, 150, 50, 50, 12 - DEFPUSHBUTTON "&Finn neste", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Avbryt", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&Finn hva:", -1, 4, 8, 42, 8 + EDITTEXT 1152, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&Kun hele ord", 1040, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Skill pċ store/smċ bokstaver", 1041, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "Retning", 1072, 107, 26, 68, 28 + CONTROL "&Opp", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 + CONTROL "&Ned", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 + DEFPUSHBUTTON "&Finn neste", 1, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Avbryt", 2, 182, 23, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Hjelp", 1038, 182, 45, 50, 14, WS_GROUP | WS_TABSTOP } -REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 114 +REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Bytt" FONT 8, "Helv" { - LTEXT "&Finn hva:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - LTEXT "&Bytt med:", 1090, 6, 26, 40, 9 - LTEXT "", 1091, 60, 26, 150, 9 - CHECKBOX "&Kun hele ord", 1040, 20, 40, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "&Skill pċ store/smċ bokstaver", 1041, 20, 60, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - DEFPUSHBUTTON "&Finn neste", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Bytt", 1024, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Bytt alt", 1025, 206, 44, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Avbryt", 2, 206, 64, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&Finn hva:", -1, 4, 9, 48, 8 + EDITTEXT 1152, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Bytt med:", -1, 4, 26, 48, 8 + EDITTEXT 1153, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&Kun hele ord", 1040, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Skill pċ store/smċ bokstaver", 1041, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "&Finn neste", 1, 174, 4, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Bytt", 1024, 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Bytt alt", 1025, 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Avbryt", 2, 174, 55, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Hjelp", 1038, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP } diff --git a/tools/build.c b/tools/build.c index 04f7a68e218..9e994f0a4ba 100644 --- a/tools/build.c +++ b/tools/build.c @@ -1,21 +1,23 @@ /* * Copyright 1993 Robert J. Amstadt - * Copyright 1995 Alexandre Julliard * Copyright 1995 Martin von Loewis + * Copyright 1995, 1996 Alexandre Julliard */ +#ifndef WINELIB + #include #include #include #include -#include "wine.h" +#include "registers.h" #include "winerror.h" /* for ERROR_CALL_NOT_IMPLEMENTED */ #include "module.h" #include "neexe.h" #include "windows.h" /* ELF symbols do not have an underscore in front */ -#if defined (__ELF__) || defined (__svr4__) +#if defined (__ELF__) || defined (__svr4__) || defined(_SCO_DS) #define PREFIX #else #define PREFIX "_" @@ -91,19 +93,8 @@ static int debugging = 1; /* Offset of register relative to the end of the context struct */ #define CONTEXTOFFSET(reg) \ - ((int)&(((struct sigcontext_struct *)1)->reg) - 1 \ - - sizeof(struct sigcontext_struct)) -#ifdef __svr4__ -#define sc_eax uc_mcontext.gregs[EAX] -#define sc_ebx uc_mcontext.gregs[EBX] -#define sc_ecx uc_mcontext.gregs[ECX] -#define sc_edx uc_mcontext.gregs[EDX] -#define sc_esi uc_mcontext.gregs[ESI] -#define sc_edi uc_mcontext.gregs[EDI] -#define sc_ds uc_mcontext.gregs[DS] -#define sc_es uc_mcontext.gregs[ES] -#define sc_eflags uc_mcontext.gregs[EFL] -#endif + ((int)®##_reg((struct sigcontext_struct *)0) \ + - sizeof(struct sigcontext_struct)) static void *xmalloc (size_t size) { @@ -527,39 +518,77 @@ static int ParseTopLevel(void) } -static int OutputVariableCode( char *storage, ORDDEF *odp ) +/******************************************************************* + * StoreVariableCode + * + * Store a list of ints into a byte array. + */ +static int StoreVariableCode( unsigned char *buffer, int size, ORDDEF *odp ) { ORDVARDEF *vdp; int i; vdp = odp->additional_data; - printf( "\t.data\n" ); - for (i = 0; i < vdp->n_values; i++) + switch(size) { - if ((i & 7) == 0) - printf( "\t%s\t", storage); - - printf( "%d", vdp->values[i]); - - if ((i & 7) == 7 || i == vdp->n_values - 1) printf( "\n"); - else printf( ", "); + case 1: + for (i = 0; i < vdp->n_values; i++) + buffer[i] = vdp->values[i]; + break; + case 2: + for (i = 0; i < vdp->n_values; i++) + ((unsigned short *)buffer)[i] = vdp->values[i]; + break; + case 4: + for (i = 0; i < vdp->n_values; i++) + ((unsigned int *)buffer)[i] = vdp->values[i]; + break; } - printf( "\n"); - printf( "\t.text\n" ); - return vdp->n_values; + return vdp->n_values * size; } /******************************************************************* - * BuildModule + * DumpBytes * - * Build the in-memory representation of the module, and dump it + * Dump a byte stream into the assembly code. + */ +static void DumpBytes( const unsigned char *data, int len, + const char *section, const char *label_start, + const char *label_end ) +{ + int i; + if (section) printf( "\t%s\n", section ); + if (label_start) + { + printf( "\t.globl " PREFIX "%s_%s\n", DLLName, label_start ); + printf( PREFIX "%s_%s:\n", DLLName, label_start ); + } + for (i = 0; i < len; i++) + { + if (!(i & 0x0f)) printf( "\t.byte " ); + printf( "%d", *data++ ); + if (i < len - 1) printf( "%c", ((i & 0x0f) != 0x0f) ? ',' : '\n' ); + } + printf( "\n" ); + if (label_end) + { + printf( "\t.globl " PREFIX "%s_%s\n", DLLName, label_end ); + printf( PREFIX "%s_%s:\n", DLLName, label_end ); + } +} + + +/******************************************************************* + * BuildModule16 + * + * Build the in-memory representation of a 16-bit NE module, and dump it * as a byte stream into the assembly code. */ -static void BuildModule( int max_code_offset, int max_data_offset ) +static void BuildModule16( int max_code_offset, int max_data_offset ) { ORDDEF *odp; - int i, size; + int i; char *buffer; NE_MODULE *pModule; SEGTABLEENTRY *pSegment; @@ -728,18 +757,120 @@ static void BuildModule( int max_code_offset, int max_data_offset ) /* Dump the module content */ - printf( "\t.data\n" ); - printf( "\t.globl " PREFIX "%s_Module_Start\n", DLLName ); - printf( PREFIX "%s_Module_Start:\n", DLLName ); - size = (int)pstr - (int)pModule; - for (i = 0, pstr = buffer; i < size; i++, pstr++) - { - if (!(i & 7)) printf( "\t.byte " ); - printf( "%d%c", *pstr, ((i & 7) != 7) ? ',' : '\n' ); - } - if (i & 7) printf( "0\n" ); - printf( "\t.globl " PREFIX "%s_Module_End\n", DLLName ); - printf( PREFIX "%s_Module_End:\n", DLLName ); + DumpBytes( (char *)pModule, (int)pstr - (int)pModule, + ".data", "Module_Start", "Module_End" ); +} + + +/******************************************************************* + * BuildModule32 + * + * Build the in-memory representation of a 32-bit pseudo-NE module, and dump it + * as a byte stream into the assembly code. + */ +static void BuildModule32(void) +{ + char *buffer; + NE_MODULE *pModule; + NE_WIN32_EXTRAINFO *pExtraInfo; + OFSTRUCT *pFileInfo; + BYTE *pstr; + WORD *pword; + + /* Module layout: + * NE_MODULE Module + * NE_WIN32_EXTRAINFO Win32 module extra info + * OFSTRUCT File information + * SEGTABLEENTRY Segment table (empty) + * WORD[2] Resource table (empty) + * BYTE[2] Imported names (empty) + * BYTE[n] Resident names table (1 entry) + * BYTE[n] Entry table (empty) + */ + + buffer = xmalloc( 0x10000 ); + + pModule = (NE_MODULE *)buffer; + pModule->magic = NE_SIGNATURE; + pModule->count = 1; + pModule->next = 0; + pModule->flags = NE_FFLAGS_SINGLEDATA | NE_FFLAGS_BUILTIN | + NE_FFLAGS_LIBMODULE | NE_FFLAGS_WIN32; + pModule->dgroup = 0; + pModule->heap_size = 0; + pModule->stack_size = 0; + pModule->ip = 0; + pModule->cs = 0; + pModule->sp = 0; + pModule->ss = 0; + pModule->seg_count = 0; + pModule->modref_count = 0; + pModule->nrname_size = 0; + pModule->modref_table = 0; + pModule->nrname_fpos = 0; + pModule->moveable_entries = 0; + pModule->alignment = 0; + pModule->truetype = 0; + pModule->os_flags = NE_OSFLAGS_WINDOWS; + pModule->misc_flags = 0; + pModule->dlls_to_init = 0; + pModule->nrname_handle = 0; + pModule->min_swap_area = 0; + pModule->expected_version = 0x030a; + + /* Win32 extra info */ + + pExtraInfo = (NE_WIN32_EXTRAINFO *)(pModule + 1); + pExtraInfo->pe_module = 0; + + /* File information */ + + pFileInfo = (OFSTRUCT *)(pExtraInfo + 1); + pModule->fileinfo = (int)pFileInfo - (int)pModule; + memset( pFileInfo, 0, sizeof(*pFileInfo) - sizeof(pFileInfo->szPathName) ); + pFileInfo->cBytes = sizeof(*pFileInfo) - sizeof(pFileInfo->szPathName) + + strlen(DLLName) + 4; + sprintf( pFileInfo->szPathName, "%s.DLL", DLLName ); + pstr = (char *)pFileInfo + pFileInfo->cBytes + 1; + + /* Segment table */ + + pModule->seg_table = (int)pstr - (int)pModule; + + /* Resource table */ + + pword = (WORD *)pstr; + pModule->res_table = (int)pword - (int)pModule; + *pword++ = 0; + *pword++ = 0; + + /* Imported names table */ + + pstr = (char *)pword; + pModule->import_table = (int)pstr - (int)pModule; + *pstr++ = 0; + *pstr++ = 0; + + /* Resident names table */ + + pModule->name_table = (int)pstr - (int)pModule; + /* First entry is module name */ + *pstr = strlen(DLLName ); + strcpy( pstr + 1, DLLName ); + pstr += *pstr + 1; + *(WORD *)pstr = 0; + pstr += sizeof(WORD); + *pstr++ = 0; + + /* Entry table */ + + pModule->entry_table = (int)pstr - (int)pModule; + *pstr++ = 0; + + /* Dump the module content */ + + DumpBytes( (char *)pModule, (int)pstr - (int)pModule, + ".data", "Module_Start", "Module_End" ); } @@ -757,6 +888,7 @@ static void BuildSpec32Files(void) printf( "/* File generated automatically; do not edit! */\n" ); printf( "\t.text\n" ); + printf( "\t.align 4\n" ); printf( "\t.globl " PREFIX "%s_Code_Start\n", DLLName ); printf( PREFIX "%s_Code_Start:\n\n", DLLName ); @@ -773,11 +905,9 @@ static void BuildSpec32Files(void) printf( "\t.align 4\n" ); printf( "%s_%d:\n", DLLName, i ); printf( "\tpushl %%ebp\n" ); - printf( "\tpushl $%s_%d_Name\n", DLLName, i ); + printf( "\tpushl $Name_%d\n", i ); printf( "\tpushl $" PREFIX "%s\n", STUB_CALLBACK ); - printf( "\tjmp " PREFIX "Stdcall_0\n" ); - printf( "%s_%d_Name:\n", DLLName, i ); - printf( "\t.ascii \"%s_%d\\0\"\n", DLLName, i ); + printf( "\tjmp " PREFIX "CallFrom32_0\n" ); break; case TYPE_STDCALL: @@ -787,11 +917,9 @@ static void BuildSpec32Files(void) printf( "\t.align 4\n" ); printf( "%s_%d:\n", DLLName, i ); printf( "\tpushl %%ebp\n" ); - printf( "\tpushl $%s_%d_Name\n", DLLName, i ); + printf( "\tpushl $Name_%d\n", i ); printf( "\tpushl $" PREFIX "%s\n", fdp->internal_name ); - printf( "\tjmp " PREFIX "Stdcall_%d\n", strlen(fdp->arg_types) ); - printf( "%s_%d_Name:\n", DLLName, i ); - printf( "\t.ascii \"%s\\0\"\n", odp->export_name ); + printf( "\tjmp " PREFIX "CallFrom32_%d\n", strlen(fdp->arg_types)); break; case TYPE_RETURN: @@ -804,8 +932,6 @@ static void BuildSpec32Files(void) printf( "\tmovl $%d,%%eax\n", rdp->ret_value ); if (rdp->arg_size) printf( "\tret $%d\n", rdp->arg_size ); else printf( "\tret\n" ); - printf( "%s_%d_Name:\n", DLLName, i ); - printf( "\t.ascii \"%s\\0\"\n", odp->export_name ); break; default: @@ -815,9 +941,13 @@ static void BuildSpec32Files(void) } } + BuildModule32(); + + printf( "\t.text\n" ); + printf( "\t.globl " PREFIX "%s_Data_Start\n", DLLName ); + printf( PREFIX "%s_Data_Start:\n", DLLName ); + printf( "\t.long %d,%d\n", Base, Limit ); printf( "\n/* Function table */\n" ); - printf( "\t.globl " PREFIX "%s_Module_Start\n", DLLName ); - printf( PREFIX "%s_Module_Start:\n", DLLName ); odp = OrdinalDefinitions; for (i = 0; i <= Limit; i++, odp++) @@ -825,17 +955,19 @@ static void BuildSpec32Files(void) if (odp->type == TYPE_INVALID) printf( "\t.long 0,%s_%d\n", DLLName, i ); else - printf( "\t.long %s_%d_Name,%s_%d\n", - DLLName, i, DLLName, i ); + printf( "\t.long Name_%d,%s_%d\n", i, DLLName, i ); } - - printf( "\t.globl " PREFIX "%s_Module_End\n", DLLName ); - printf( PREFIX "%s_Module_End:\n", DLLName ); printf( "\t.long 0,0\n" ); - printf( "\t.globl " PREFIX "%s_Data_Start\n", DLLName ); - printf( PREFIX "%s_Data_Start:\n", DLLName ); - printf( "\t.long %d\n", Base ); + printf( "\n/* Name table */\n" ); + for (i = 0, odp = OrdinalDefinitions; i <= Limit; i++, odp++) + { + printf( "Name_%d:\t", i ); + if (odp->type == TYPE_INVALID) + printf( ".ascii \"%s.%d\\0\"\n", DLLName, i ); + else + printf( ".ascii \"%s\\0\"\n", odp->export_name ); + } } @@ -851,17 +983,13 @@ static void BuildSpec16Files(void) ORDRETDEF *rdp; int i; int code_offset, data_offset; + unsigned char *data; + + data = (unsigned char *)xmalloc( 0x10000 ); + memset( data, 0, 16 ); + data_offset = 16; printf( "/* File generated automatically; do not edit! */\n" ); - printf( "\t.data\n" ); - printf( "\t.globl " PREFIX "%s_Data_Start\n", DLLName ); - printf( PREFIX "%s_Data_Start:\n", DLLName ); -#ifdef __svr4__ - printf( "\t.4byte 0,0,0,0,0,0,0,0\n" ); -#else - printf( "\t.word 0,0,0,0,0,0,0,0\n" ); -#endif - data_offset = 16; printf( "\t.text\n" ); printf( "\t.globl " PREFIX "%s_Code_Start\n", DLLName ); printf( PREFIX "%s_Code_Start:\n", DLLName ); @@ -886,23 +1014,19 @@ static void BuildSpec16Files(void) case TYPE_BYTE: printf( "/* %s.%d */\n", DLLName, i); odp->offset = data_offset; - data_offset += OutputVariableCode( ".byte", odp); + data_offset += StoreVariableCode( data, 1, odp); break; case TYPE_WORD: printf( "/* %s.%d */\n", DLLName, i); odp->offset = data_offset; -#ifdef __svr4__ - data_offset += 2 * OutputVariableCode( ".4byte", odp); -#else - data_offset += 2 * OutputVariableCode( ".word", odp); -#endif + data_offset += StoreVariableCode( data, 2, odp); break; case TYPE_LONG: printf( "/* %s.%d */\n", DLLName, i); odp->offset = data_offset; - data_offset += 4 * OutputVariableCode( ".long", odp); + data_offset += StoreVariableCode( data, 4, odp); break; case TYPE_RETURN: @@ -911,12 +1035,15 @@ static void BuildSpec16Files(void) printf( "\tmovw $%d,%%dx\n", (rdp->ret_value >> 16) & 0xffff); printf( "\t.byte 0x66\n"); if (rdp->arg_size != 0) - printf( "\tlret $%d\n", rdp->arg_size); + printf( "\tlret $%d\n\n", rdp->arg_size); else + { printf( "\tlret\n"); + printf( "\tnop\n"); + printf( "\tnop\n\n"); + } odp->offset = code_offset; - code_offset += 10; /* Assembly code is 10 bytes long */ - if (rdp->arg_size != 0) code_offset += 2; + code_offset += 12; /* Assembly code is 12 bytes long */ break; case TYPE_REGISTER: @@ -927,7 +1054,7 @@ static void BuildSpec16Files(void) printf( "\tpushw %%bp\n" ); printf( "\tpushl $0x%08x\n", (DLLId << 16) | i); printf( "\tpushl $" PREFIX "%s\n", fdp->internal_name ); - printf( "\tljmp $0x%04x, $" PREFIX "CallTo32_%s_%s\n\n", + printf( "\tljmp $0x%04x, $" PREFIX "CallFrom16_%s_%s\n", WINE_CODE_SELECTOR, (odp->type == TYPE_REGISTER) ? "regs" : (odp->type == TYPE_PASCAL) ? "long" : "word", @@ -936,7 +1063,7 @@ static void BuildSpec16Files(void) printf( "\tnop\n" ); printf( "\tnop\n" ); printf( "\tnop\n" ); - printf( "\tnop\n" ); + printf( "\tnop\n\n" ); odp->offset = code_offset; code_offset += 24; /* Assembly code is 24 bytes long */ break; @@ -954,7 +1081,13 @@ static void BuildSpec16Files(void) code_offset++; } - BuildModule( code_offset, data_offset ); + /* Output data segment */ + + DumpBytes( data, data_offset, NULL, "Data_Start", NULL ); + + /* Build the module */ + + BuildModule16( code_offset, data_offset ); } @@ -1166,22 +1299,18 @@ static void BuildContext(void) /* Store the registers */ - printf( "\tpopl %d(%%ebx)\n", CONTEXTOFFSET(sc_ebx) ); /* Get ebx from stack */ - printf( "\tmovl %%eax,%d(%%ebx)\n", CONTEXTOFFSET(sc_eax) ); - printf( "\tmovl %%ecx,%d(%%ebx)\n", CONTEXTOFFSET(sc_ecx) ); - printf( "\tmovl %%edx,%d(%%ebx)\n", CONTEXTOFFSET(sc_edx) ); - printf( "\tmovl %%esi,%d(%%ebx)\n", CONTEXTOFFSET(sc_esi) ); - printf( "\tmovl %%edi,%d(%%ebx)\n", CONTEXTOFFSET(sc_edi) ); + printf( "\tpopl %d(%%ebx)\n", CONTEXTOFFSET(EBX) ); /* Get ebx from stack*/ + printf( "\tmovl %%eax,%d(%%ebx)\n", CONTEXTOFFSET(EAX) ); + printf( "\tmovl %%ecx,%d(%%ebx)\n", CONTEXTOFFSET(ECX) ); + printf( "\tmovl %%edx,%d(%%ebx)\n", CONTEXTOFFSET(EDX) ); + printf( "\tmovl %%esi,%d(%%ebx)\n", CONTEXTOFFSET(ESI) ); + printf( "\tmovl %%edi,%d(%%ebx)\n", CONTEXTOFFSET(EDI) ); printf( "\tmovw -10(%%ebp),%%ax\n" ); /* Get saved ds from stack */ - printf( "\tmovw %%ax,%d(%%ebx)\n", CONTEXTOFFSET(sc_ds) ); + printf( "\tmovw %%ax,%d(%%ebx)\n", CONTEXTOFFSET(DS) ); printf( "\tmovw -12(%%ebp),%%ax\n" ); /* Get saved es from stack */ - printf( "\tmovw %%ax,%d(%%ebx)\n", CONTEXTOFFSET(sc_es) ); + printf( "\tmovw %%ax,%d(%%ebx)\n", CONTEXTOFFSET(ES) ); printf( "\tpushfl\n" ); -#ifndef __FreeBSD__ - printf( "\tpopl %d(%%ebx)\n", CONTEXTOFFSET(sc_eflags) ); -#else - printf( "\tpopl %d(%%ebx)\n", CONTEXTOFFSET(sc_efl) ); -#endif + printf( "\tpopl %d(%%ebx)\n", CONTEXTOFFSET(EFL) ); } @@ -1198,28 +1327,24 @@ static void RestoreContext(void) /* Restore the registers */ - printf( "\tmovl %d(%%ebx),%%ecx\n", CONTEXTOFFSET(sc_ecx) ); - printf( "\tmovl %d(%%ebx),%%edx\n", CONTEXTOFFSET(sc_edx) ); - printf( "\tmovl %d(%%ebx),%%esi\n", CONTEXTOFFSET(sc_esi) ); - printf( "\tmovl %d(%%ebx),%%edi\n", CONTEXTOFFSET(sc_edi) ); + printf( "\tmovl %d(%%ebx),%%ecx\n", CONTEXTOFFSET(ECX) ); + printf( "\tmovl %d(%%ebx),%%edx\n", CONTEXTOFFSET(EDX) ); + printf( "\tmovl %d(%%ebx),%%esi\n", CONTEXTOFFSET(ESI) ); + printf( "\tmovl %d(%%ebx),%%edi\n", CONTEXTOFFSET(EDI) ); printf( "\tpopl %%eax\n" ); /* Remove old ds and es from stack */ - printf( "\tpushw %d(%%ebx)\n", CONTEXTOFFSET(sc_ds) ); /* Push new ds */ - printf( "\tpushw %d(%%ebx)\n", CONTEXTOFFSET(sc_es) ); /* Push new es */ -#ifndef __FreeBSD__ - printf( "\tpushl %d(%%ebx)\n", CONTEXTOFFSET(sc_eflags) ); -#else - printf( "\tpushl %d(%%ebx)\n", CONTEXTOFFSET(sc_efl) ); -#endif + printf( "\tpushw %d(%%ebx)\n", CONTEXTOFFSET(DS) ); /* Push new ds */ + printf( "\tpushw %d(%%ebx)\n", CONTEXTOFFSET(ES) ); /* Push new es */ + printf( "\tpushl %d(%%ebx)\n", CONTEXTOFFSET(EFL) ); printf( "\tpopfl\n" ); - printf( "\tmovl %d(%%ebx),%%eax\n", CONTEXTOFFSET(sc_eax) ); - printf( "\tmovl %d(%%ebx),%%ebx\n", CONTEXTOFFSET(sc_ebx) ); + printf( "\tmovl %d(%%ebx),%%eax\n", CONTEXTOFFSET(EAX) ); + printf( "\tmovl %d(%%ebx),%%ebx\n", CONTEXTOFFSET(EBX) ); } /******************************************************************* - * BuildCall32Func + * BuildCallFrom16Func * - * Build a 32-bit callback function. The syntax of the function + * Build a 16-bit-to-Wine callback function. The syntax of the function * profile is: type_xxxxx, where 'type' is one of 'regs', 'word' or * 'long' and each 'x' is an argument ('w'=word, 's'=signed word, * 'l'=long, 'p'=pointer). @@ -1236,7 +1361,7 @@ static void RestoreContext(void) * (sp) entrypoint (long) * */ -static void BuildCall32Func( char *profile ) +static void BuildCallFrom16Func( char *profile ) { int argsize = 0; int short_ret = 0; @@ -1256,11 +1381,11 @@ static void BuildCall32Func( char *profile ) /* Function header */ printf( "/**********\n" ); - printf( " * " PREFIX "CallTo32_%s\n", profile ); + printf( " * " PREFIX "CallFrom16_%s\n", profile ); printf( " **********/\n" ); printf( "\t.align 4\n" ); - printf( "\t.globl " PREFIX "CallTo32_%s\n\n", profile ); - printf( PREFIX "CallTo32_%s:\n", profile ); + printf( "\t.globl " PREFIX "CallFrom16_%s\n\n", profile ); + printf( PREFIX "CallFrom16_%s:\n", profile ); /* Setup bp to point to its copy on the stack */ @@ -1320,9 +1445,9 @@ static void BuildCall32Func( char *profile ) if (debugging) { printf( "\tpushl %%eax\n" ); - printf( "\tpushl $CALL32_Str_%s\n", profile ); + printf( "\tpushl $Profile_%s\n", profile ); printf( "\tpushl $%d\n", reg_func ? 2 : (short_ret ? 1 : 0) ); - printf( "\tcall " PREFIX "RELAY_DebugCall32\n" ); + printf( "\tcall " PREFIX "RELAY_DebugCallFrom16\n" ); printf( "\tpopl %%eax\n" ); printf( "\tpopl %%eax\n" ); printf( "\tpopl %%eax\n" ); @@ -1338,7 +1463,7 @@ static void BuildCall32Func( char *profile ) { printf( "\tpushl %%eax\n" ); printf( "\tpushl $%d\n", reg_func ? 2 : (short_ret ? 1 : 0) ); - printf( "\tcall " PREFIX "RELAY_DebugReturn\n" ); + printf( "\tcall " PREFIX "RELAY_DebugCallFrom16Ret\n" ); printf( "\tpopl %%eax\n" ); printf( "\tpopl %%eax\n" ); } @@ -1436,9 +1561,9 @@ static void BuildCall32Func( char *profile ) /******************************************************************* - * BuildCall16Func + * BuildCallTo16Func * - * Build a 16-bit callback function. + * Build a Wine-to-16-bit callback function. * * Stack frame of the callback function: * ... ... @@ -1457,7 +1582,7 @@ static void BuildCall32Func( char *profile ) * WORD ax, WORD bx, WORD cx, WORD dx, * WORD si, WORD di ); */ -static void BuildCall16Func( char *profile ) +static void BuildCallTo16Func( char *profile ) { int short_ret = 0; int reg_func = 0; @@ -1514,7 +1639,7 @@ static void BuildCall16Func( char *profile ) printf( "\taddl $12,%%eax\n" ); printf( "\tpushl $%d\n", reg_func ? 8 : strlen(args) ); printf( "\tpushl %%eax\n" ); - printf( "\tcall " PREFIX "RELAY_DebugCall16\n" ); + printf( "\tcall " PREFIX "RELAY_DebugCallTo16\n" ); printf( "\tpopl %%eax\n" ); printf( "\tpopl %%eax\n" ); } @@ -1545,7 +1670,7 @@ static void BuildCall16Func( char *profile ) { int pos = 20; /* first argument position */ - /* Make %bp point to the previous stackframe (built by CallTo32) */ + /* Make %bp point to the previous stackframe (built by CallFrom16) */ printf( "\tmovw %%sp,%%bp\n" ); printf( "\taddw $16,%%bp\n" ); @@ -1566,7 +1691,7 @@ static void BuildCall16Func( char *profile ) /* Push the return address */ - printf( "\tpushl " PREFIX "CALL16_RetAddr_%s\n", + printf( "\tpushl " PREFIX "CALLTO16_RetAddr_%s\n", short_ret ? "word" : "long" ); /* Push the called routine address */ @@ -1605,16 +1730,16 @@ static void BuildCall16Func( char *profile ) */ static void BuildRet16Func() { - printf( "\t.globl " PREFIX "CALL16_Ret_word\n" ); - printf( "\t.globl " PREFIX "CALL16_Ret_long\n" ); + printf( "\t.globl " PREFIX "CALLTO16_Ret_word\n" ); + printf( "\t.globl " PREFIX "CALLTO16_Ret_long\n" ); /* Put return value into eax */ - printf( PREFIX "CALL16_Ret_long:\n" ); + printf( PREFIX "CALLTO16_Ret_long:\n" ); printf( "\tpushw %%dx\n" ); printf( "\tpushw %%ax\n" ); printf( "\tpopl %%eax\n" ); - printf( PREFIX "CALL16_Ret_word:\n" ); + printf( PREFIX "CALLTO16_Ret_word:\n" ); /* Restore 32-bit segment registers */ @@ -1653,18 +1778,19 @@ static void BuildRet16Func() /* Declare the return address variables */ printf( "\t.data\n" ); - printf( "\t.globl " PREFIX "CALL16_RetAddr_word\n" ); - printf( "\t.globl " PREFIX "CALL16_RetAddr_long\n" ); - printf( PREFIX "CALL16_RetAddr_word:\t.long 0\n" ); - printf( PREFIX "CALL16_RetAddr_long:\t.long 0\n" ); + printf( "\t.globl " PREFIX "CALLTO16_RetAddr_word\n" ); + printf( "\t.globl " PREFIX "CALLTO16_RetAddr_long\n" ); + printf( PREFIX "CALLTO16_RetAddr_word:\t.long 0\n" ); + printf( PREFIX "CALLTO16_RetAddr_long:\t.long 0\n" ); printf( "\t.text\n" ); } /******************************************************************* - * BuildStdcallFunc + * BuildCallFrom32Func * - * Build a stdcall call-back function. 'args' is the number of dword arguments. + * Build a 32-bit-to-Wine call-back function. + * 'args' is the number of dword arguments. * * Stack layout: * ... ... @@ -1675,35 +1801,27 @@ static void BuildRet16Func() * (ebp-4) func name * (ebp-8) entry point */ -static void BuildStdcallFunc( int args ) +static void BuildCallFrom32Func( int args ) { /* Function header */ printf( "/**********\n" ); - printf( " * " PREFIX "Stdcall_%d\n", args ); + printf( " * " PREFIX "CallFrom32_%d\n", args ); printf( " **********/\n" ); printf( "\t.align 4\n" ); - printf( "\t.globl " PREFIX "Stdcall_%d\n\n", args ); - printf( PREFIX "Stdcall_%d:\n", args ); + printf( "\t.globl " PREFIX "CallFrom32_%d\n\n", args ); + printf( PREFIX "CallFrom32_%d:\n", args ); /* Entry code */ printf( "\tleal 8(%%esp),%%ebp\n" ); -#if 0 - /* Switch to the internal stack */ - - printf( "\tpushl " PREFIX "IF1632_Saved32_esp\n" ); - printf( "\tmovl %%esp, " PREFIX "IF1632_Saved32_esp\n" ); - printf( "\tmovl " PREFIX "IF1632_Original32_esp, %%esp\n" ); -#endif - /* Print the debugging info */ if (debugging) { printf( "\tpushl $%d\n", args ); - printf( "\tcall " PREFIX "RELAY_DebugStdcall\n" ); + printf( "\tcall " PREFIX "RELAY_DebugCallFrom32\n" ); printf( "\tadd $4, %%esp\n" ); } @@ -1732,15 +1850,10 @@ static void BuildStdcallFunc( int args ) { printf( "\tadd $%d,%%esp\n", args ? (args * 4) : 4 ); printf( "\tpushl %%eax\n" ); - printf( "\tcall " PREFIX "RELAY_DebugStdcallRet\n" ); + printf( "\tcall " PREFIX "RELAY_DebugCallFrom32Ret\n" ); printf( "\tpopl %%eax\n" ); } - /* Switch back to the normal stack */ - -#if 0 - printf( "\tmovl -12(%%ebp)," PREFIX "IF1632_Saved32_esp\n" ); -#endif printf( "\tmovl %%ebp,%%esp\n" ); printf( "\tpopl %%ebp\n" ); @@ -1751,12 +1864,75 @@ static void BuildStdcallFunc( int args ) } +/******************************************************************* + * BuildCallTo32Func + * + * Build a Wine-to-32-bit callback function. + * + * Stack frame of the callback function: + * ... ... + * (ebp+16) arg2 + * (ebp+12) arg1 + * (ebp+8) func to call + * (ebp+4) return address + * (ebp) previous ebp + * + * Prototype for the CallTo32 functions: + * extern LONG CallTo32_nn( FARPROC func, args... ); + */ +static void BuildCallTo32Func( int args ) +{ + /* Function header */ + + printf( "/**********\n" ); + printf( " * " PREFIX "CallTo32_%d\n", args ); + printf( " **********/\n" ); + printf( "\t.align 4\n" ); + printf( "\t.globl " PREFIX "CallTo32_%d\n\n", args ); + printf( PREFIX "CallTo32_%d:\n", args ); + + /* Entry code */ + + printf( "\tpushl %%ebp\n" ); + printf( "\tmovl %%esp,%%ebp\n" ); + + /* Transfer arguments */ + + if (args) + { + int i; + for (i = args; i > 0; i--) printf( "\tpushl %d(%%ebp)\n", 4 * i + 8 ); + } + + /* Print the debugging output */ + + if (debugging) + { + printf( "\tpushl $%d\n", args ); + printf( "\tpushl 8(%%ebp)\n" ); + printf( "\tcall " PREFIX "RELAY_DebugCallTo32\n" ); + printf( "\taddl $8,%%esp\n" ); + } + + /* Call the function */ + + printf( "\tcall 8(%%ebp)\n" ); + + /* Return to Wine */ + + printf( "\tmovl %%ebp,%%esp\n" ); + printf( "\tpopl %%ebp\n" ); + printf( "\tret\n" ); +} + + static void usage(void) { fprintf(stderr, "usage: build -spec SPECNAMES\n" - " build -call32 FUNCTION_PROFILES\n" - " build -call16 FUNCTION_PROFILES\n" - " build -stdcall FUNCTION_PROFILES\n" ); + " build -callfrom16 FUNCTION_PROFILES\n" + " build -callto16 FUNCTION_PROFILES\n" + " build -callfrom32 FUNCTION_PROFILES\n" + " build -callto32 FUNCTION_PROFILES\n" ); exit(1); } @@ -1771,7 +1947,7 @@ int main(int argc, char **argv) { for (i = 2; i < argc; i++) BuildSpecFiles( argv[i] ); } - else if (!strcmp( argv[1], "-call32" )) /* 32-bit callbacks */ + else if (!strcmp( argv[1], "-callfrom16" )) /* 16-bit-to-Wine callbacks */ { /* File header */ @@ -1784,7 +1960,7 @@ int main(int argc, char **argv) /* Build the callback functions */ - for (i = 2; i < argc; i++) BuildCall32Func( argv[i] ); + for (i = 2; i < argc; i++) BuildCallFrom16Func( argv[i] ); /* Output the argument debugging strings */ @@ -1793,32 +1969,32 @@ int main(int argc, char **argv) printf( "/* Argument strings */\n" ); for (i = 2; i < argc; i++) { - printf( "CALL32_Str_%s:\n", argv[i] ); + printf( "Profile_%s:\n", argv[i] ); printf( "\t.ascii \"%s\\0\"\n", argv[i] + 5 ); } } } - else if (!strcmp( argv[1], "-call16" )) /* 16-bit callbacks */ + else if (!strcmp( argv[1], "-callto16" )) /* Wine-to-16-bit callbacks */ { /* File header */ printf( "/* File generated automatically. Do not edit! */\n\n" ); printf( "\t.text\n" ); - printf( "\t.globl " PREFIX "CALL16_Start\n" ); - printf( PREFIX "CALL16_Start:\n" ); + printf( "\t.globl " PREFIX "CALLTO16_Start\n" ); + printf( PREFIX "CALLTO16_Start:\n" ); /* Build the callback functions */ - for (i = 2; i < argc; i++) BuildCall16Func( argv[i] ); + for (i = 2; i < argc; i++) BuildCallTo16Func( argv[i] ); /* Output the 16-bit return code */ BuildRet16Func(); - printf( "\t.globl " PREFIX "CALL16_End\n" ); - printf( PREFIX "CALL16_End:\n" ); + printf( "\t.globl " PREFIX "CALLTO16_End\n" ); + printf( PREFIX "CALLTO16_End:\n" ); } - else if (!strcmp( argv[1], "-stdcall" )) /* stdcall callbacks */ + else if (!strcmp( argv[1], "-callfrom32" )) /* 32-bit-to-Wine callbacks */ { /* File header */ @@ -1827,9 +2003,22 @@ int main(int argc, char **argv) /* Build the callback functions */ - for (i = 2; i < argc; i++) BuildStdcallFunc( atoi(argv[i]) ); + for (i = 2; i < argc; i++) BuildCallFrom32Func( atoi(argv[i]) ); + } + else if (!strcmp( argv[1], "-callto32" )) /* Wine-to-32-bit callbacks */ + { + /* File header */ + + printf( "/* File generated automatically. Do not edit! */\n\n" ); + printf( "\t.text\n" ); + + /* Build the callback functions */ + + for (i = 2; i < argc; i++) BuildCallTo32Func( atoi(argv[i]) ); } else usage(); return 0; } + +#endif /* WINELIB */ diff --git a/win32/environment.c b/win32/environment.c index a9152f1d688..eff905022fe 100644 --- a/win32/environment.c +++ b/win32/environment.c @@ -10,8 +10,8 @@ #include "windows.h" #include "winerror.h" #include "kernel32.h" +#include "module.h" #include "task.h" -#include "pe_image.h" #include "stddebug.h" #include "debug.h" @@ -26,7 +26,7 @@ LPSTR GetCommandLineA(void) PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() ); #ifndef WINELIB - strcpy(buffer, wine_files->name); + strcpy(buffer, MODULE_GetModuleName( GetExePtr(GetCurrentTask()) ) ); cp = buffer+strlen(buffer); *cp++ = ' '; #else diff --git a/win32/except.c b/win32/except.c index e789cf815fe..93de02f1d50 100644 --- a/win32/except.c +++ b/win32/except.c @@ -39,17 +39,14 @@ #include "stddebug.h" #include "debug.h" #include "except.h" -#include "relay32.h" - -WINAPI DWORD KERNEL32_537(PEXCEPTION_POINTERS ptrs); LPTOP_LEVEL_EXCEPTION_FILTER pTopExcHandler = NULL; void EXC_Init(void) { - WIN32_builtin *dll = RELAY32_GetBuiltinDLL("KERNEL32"); - pTopExcHandler = (LPTOP_LEVEL_EXCEPTION_FILTER)RELAY32_GetEntryPoint( dll, - "UnhandledExceptionFilter", 537 ); + pTopExcHandler = (LPTOP_LEVEL_EXCEPTION_FILTER)PE_GetProcAddress( + GetModuleHandle("KERNEL32"), + "UnhandledExceptionFilter" ); } /* diff --git a/win32/init.c b/win32/init.c index 6de4c20a49c..0d53749c9d0 100644 --- a/win32/init.c +++ b/win32/init.c @@ -12,7 +12,6 @@ #include "kernel32.h" #include "handle32.h" #include "except.h" -#include "pe_image.h" #include "task.h" #include "stddebug.h" #define DEBUG_WIN32 diff --git a/win32/resource.c b/win32/resource.c index 19a9e4181a1..7d55ec9dece 100644 --- a/win32/resource.c +++ b/win32/resource.c @@ -16,6 +16,7 @@ #include "windows.h" #include "kernel32.h" #include "pe_image.h" +#include "module.h" #include "handle32.h" #include "libres.h" #include "resource32.h" @@ -92,7 +93,8 @@ PIMAGE_RESOURCE_DIRECTORY GetResDirEntry(PIMAGE_RESOURCE_DIRECTORY resdirptr, HANDLE32 FindResource32( HINSTANCE hModule, LPCWSTR name, LPCWSTR type ) { #ifndef WINELIB - struct w_files *wptr = wine_files; + struct pe_data *pe; + NE_MODULE *pModule; PIMAGE_RESOURCE_DIRECTORY resdirptr; DWORD root; HANDLE32 result; @@ -103,11 +105,11 @@ HANDLE32 FindResource32( HINSTANCE hModule, LPCWSTR name, LPCWSTR type ) dprintf_resource( stddeb, " name=" ); PrintId( name ); dprintf_resource( stddeb, "\n" ); - while (wptr != NULL && (wptr->hModule != hModule)) - wptr = wptr->next; - if ((wptr == NULL) || (wptr->pe == NULL) || (wptr->pe->pe_resource == NULL)) - return 0; - resdirptr = (PIMAGE_RESOURCE_DIRECTORY) wptr->pe->pe_resource; + if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return 0; + if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0; /* FIXME? */ + if (!(pe = NE_WIN32_MODULE(pModule)) || !pe->pe_resource) return 0; + + resdirptr = (PIMAGE_RESOURCE_DIRECTORY) pe->pe_resource; root = (DWORD) resdirptr; if ((resdirptr = GetResDirEntry(resdirptr, type, root)) == NULL) return 0; @@ -129,17 +131,18 @@ HANDLE32 FindResource32( HINSTANCE hModule, LPCWSTR name, LPCWSTR type ) HANDLE32 LoadResource32( HINSTANCE hModule, HANDLE32 hRsrc ) { #ifndef WINELIB - struct w_files *wptr = wine_files; + struct pe_data *pe; + NE_MODULE *pModule; hModule = GetExePtr( hModule ); /* In case we were passed an hInstance */ dprintf_resource(stddeb, "LoadResource: module=%04x res=%04x\n", hModule, hRsrc ); if (!hRsrc) return 0; - while (wptr != NULL && (wptr->hModule != hModule)) - wptr = wptr->next; - if ((wptr == NULL) || (wptr->pe == NULL) || (wptr->pe->pe_resource == NULL)) - return 0; - return (HANDLE32) (wptr->load_addr+((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData); + + if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return 0; + if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0; /* FIXME? */ + if (!(pe = NE_WIN32_MODULE(pModule)) || !pe->pe_resource) return 0; + return (HANDLE32) (pe->load_addr+((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData); #else return LIBRES_LoadResource( hModule, hRsrc ); #endif diff --git a/windows/defwnd.c b/windows/defwnd.c index d081f22ae59..5eccbf4b81f 100644 --- a/windows/defwnd.c +++ b/windows/defwnd.c @@ -33,10 +33,9 @@ static short iMenuSysKey = 0; * * Set the window text. */ -void DEFWND_SetText( HWND hwnd, LPSTR text ) +void DEFWND_SetText( WND *wndPtr, LPSTR text ) { LPSTR textPtr; - WND *wndPtr = WIN_FindWndPtr( hwnd ); if (!text) text = ""; if (wndPtr->hText) USER_HEAP_FREE( wndPtr->hText ); @@ -66,7 +65,7 @@ LRESULT DefWindowProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { CREATESTRUCT *createStruct = (CREATESTRUCT*)PTR_SEG_TO_LIN(lParam); if (createStruct->lpszName) - DEFWND_SetText( hwnd, + DEFWND_SetText( wndPtr, (LPSTR)PTR_SEG_TO_LIN(createStruct->lpszName) ); return 1; } @@ -249,7 +248,7 @@ LRESULT DefWindowProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) } case WM_SETTEXT: - DEFWND_SetText( hwnd, (LPSTR)PTR_SEG_TO_LIN(lParam) ); + DEFWND_SetText( wndPtr, (LPSTR)PTR_SEG_TO_LIN(lParam) ); NC_HandleNCPaint( hwnd , (HRGN)1 ); /* Repaint caption */ return 0; diff --git a/windows/msgbox.c b/windows/msgbox.c index c8215fdc6a7..ebacf129a97 100644 --- a/windows/msgbox.c +++ b/windows/msgbox.c @@ -182,7 +182,6 @@ int MessageBox(HWND hWnd, LPCSTR text, LPCSTR title, WORD type) HANDLE handle; MSGBOX mbox; int ret; - DWORD WineProc,Win16Proc,Win32Proc; mbox.title = title; mbox.text = text; diff --git a/windows/win.c b/windows/win.c index 5c0b2ab4ed4..9a41b5dc603 100644 --- a/windows/win.c +++ b/windows/win.c @@ -272,7 +272,7 @@ void WIN_SendParentNotify( HWND hwnd, WORD event, WORD idChild, LONG lValue ) /* if lValue contains cursor coordinates they have to be * mapped to the client area of parent window */ - if (bMouse) MapWindowPoints(0, hwnd, lppt, 2); + if (bMouse) MapWindowPoints(0, hwnd, lppt, 1); #ifndef WINELIB32 else lValue = MAKELONG( LOWORD(lValue), idChild ); #endif diff --git a/wine.ini b/wine.ini index 51a6745e713..f0690ec90a5 100644 --- a/wine.ini +++ b/wine.ini @@ -40,6 +40,9 @@ SymbolTableFile=./wine.sym system=*-helvetica mssansserif=*-helvetica msserif=*-times +courier new=adobe-courier +times new roman=adobe-times +symbol=adobe-symbol fixedsys=*-fixed arial=*-helvetica helv=*-helvetica