Release 960405

Fri Apr  5 15:22:55 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [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 <keithr@sco.COM>

	* [*/*]
	A lot of small changes to support SCO OpenServer 5.

Thu Apr  4 15:38:13 1996  Frans van Dorsselaer <dorssel@rulhm1.leidenuniv.nl>

	* [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 <john@division.co.uk>

	* [if1632/except.S]
	Modified code to assemble on unixware.

Wed Apr  3 09:38:26 1996  Juergen Marquardt <marqu@lunar.advantest.de>

	* [objects/font.c]
	Implementation of a second font cache which will be updated
	dynamically.

Mon Apr  1 16:47:40 1996  Robert Pouliot <krynos@qbc.clic.net>

	* [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.
This commit is contained in:
Alexandre Julliard 1996-04-05 14:58:24 +00:00
parent c981d0bf88
commit 8664b890b0
63 changed files with 1451 additions and 1118 deletions

View File

@ -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.

View File

@ -1,3 +1,75 @@
----------------------------------------------------------------------
Fri Apr 5 15:22:55 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
* [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 <keithr@sco.COM>
* [*/*]
A lot of small changes to support SCO OpenServer 5.
Thu Apr 4 15:38:13 1996 Frans van Dorsselaer <dorssel@rulhm1.leidenuniv.nl>
* [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 <john@division.co.uk>
* [if1632/except.S]
Modified code to assemble on unixware.
Wed Apr 3 09:38:26 1996 Juergen Marquardt <marqu@lunar.advantest.de>
* [objects/font.c]
Implementation of a second font cache which will be updated
dynamically.
Mon Apr 1 16:47:40 1996 Robert Pouliot <krynos@qbc.clic.net>
* [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 <julliard@lrc.epfl.ch>

View File

@ -3,7 +3,8 @@
# First some useful definitions
CC = @CC@
SHELL = /bin/sh
CC = @CC@
CPP = @CPP@
CFLAGS = @CFLAGS@
DEFS = @DEFS@

View File

@ -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)\"

View File

@ -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) );
}

View File

@ -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);

View File

@ -3,8 +3,7 @@
*
* Copyright David W. Metcalfe, 1993
*
static char Copyright[] = "Copyright David W. Metcalfe, 1993";
*/
*/
#include <stdio.h>
#include <windows.h>
@ -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 );

View File

@ -7,6 +7,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/mman.h>
#include "windows.h"
#include "debugger.h"

View File

@ -10,6 +10,7 @@
#include <signal.h>
#include <unistd.h>
#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 ); }

View File

@ -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; }

View File

@ -13,7 +13,7 @@
#include <stdio.h>
#include <sys/stat.h>
#include <time.h>
#ifdef __svr4__
#if defined(__svr4__) || defined(_SCO_DS)
#include <sys/statfs.h>
#endif

View File

@ -18,7 +18,7 @@
#include <sys/mount.h>
#include <sys/errno.h>
#endif
#ifdef __svr4__
#if defined(__svr4__) || defined(_SCO_DS)
#include <sys/statfs.h>
#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;

View File

@ -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:

View File

@ -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 );
}
/**********************************************************************

View File

@ -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

View File

@ -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" );
}

View File

@ -11,10 +11,10 @@
#include <unistd.h>
#include <errno.h>
#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=&wp;
} 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;
}

View File

@ -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 ) \

View File

@ -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,

View File

@ -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[]; \

View File

@ -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 */

View File

@ -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 );

View File

@ -3,6 +3,7 @@
#include <sys/types.h>
#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 */

View File

@ -10,7 +10,7 @@
#include <windows.h>
#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 */

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -46,8 +46,11 @@ struct sigcontext_struct
#define WINE_CODE_SELECTOR 0x17
#endif
#ifdef __svr4__
#if defined(__svr4__) || defined(_SCO_DS)
#include <signal.h>
#ifdef _SCO_DS
#include <sys/regset.h>
#endif
#include <sys/ucontext.h>
#define sigcontext_struct ucontext
#define WINE_DATA_SELECTOR 0x1f

View File

@ -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;
}

View File

@ -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 */

View File

@ -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;

View File

@ -18,6 +18,7 @@
#include <sys/types.h>
#include <sys/mman.h>
#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 );
}
}

View File

@ -10,8 +10,10 @@
#include <sys/time.h>
#include <sys/timeb.h>
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__svr4__)
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__svr4__) || defined(_SCO_DS)
#ifndef _SCO_DS
#include <sys/syscall.h>
#endif
#include <sys/param.h>
#else
#include <syscall.h>
@ -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;

View File

@ -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 */

View File

@ -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 <sys/sysi86.h>
#include <sys/seg.h>
#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;

View File

@ -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 );
}

View File

@ -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;

View File

@ -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);
}

View File

@ -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;
}

View File

@ -9,6 +9,7 @@
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <errno.h>
#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<nrofopenhandles;i++)

View File

@ -11,7 +11,7 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/ioctl.h>
#ifdef __svr4__
#if defined__svr4__
#include <sys/filio.h>
#include <sys/ioccom.h>
#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

View File

@ -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();
}

View File

@ -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 */

View File

@ -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;

View File

@ -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"

View File

@ -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 <stdio.h>
@ -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; i<FONTCACHE; i++) /* search for same handle */
if (cacheFonts[i].id==hfont) { /* Got the handle */
/*
* Check if Handle matches the font
*/
if(memcmp(&cacheFonts[i].logfont,&(font->logfont), 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; i<FONTCACHE; i++) {
if((cacheFonts[i].used == 0) &&
(memcmp(&cacheFonts[i].logfont,&(font->logfont), 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;
}

View File

@ -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.

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#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##_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 */

View File

@ -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

View File

@ -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" );
}
/*

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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