Release 960705
Fri Jul 5 16:27:43 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
* [controls/desktop.c]
Use Windows file I/O routines to load the desktop bitmap.
* [files/file.c]
Implemented RemoveDirectory* and DeleteFile*.
* [include/wine.h]
Added SIGCONTEXT typedef to replace #define sigcontext_struct.
* [loader/task.c]
Fixed initial breakpoint setting for Win32 tasks.
* [misc/wsprintf.c]
Ignore Unicode formats for wsprintf16().
* [objects/font.c]
Implemented Win32 version of GetTextMetrics.
* [windows/winproc.c] [windows/win.c] [windows/class.c]
[windows/dialog.c]
Modified windows procedures to use thunks, to ensure that the
procedure can be called directly from the Windows program.
* [windows/win.c]
Added function WIN_BuildWinArray() to make it easier to enumerate
windows. Implemented Win32 version of EnumWindows() and friends.
Fri Jul 5 11:56:22 1996 Andreas Kirschbaum <ank@rbg.informatik.th-darmstadt.de>
* [controls/button.c] [windows/win.c]
Operator precedence fixes.
* [controls/edit.c]
Implemented ES_PASSWORD, ES_LOWERCASE and ES_UPPERCASE styles.
Fixed word wrap with long words.
* [debugger/debug.l]
New alias "where" for command "backtrace".
* [if1632/gdi.spec]
Corrected parameter of ExtTextOut.
* [loader/module.c]
Corrected printing of table of modules.
* [misc/spy.c]
Removed superfluous \n in message name.
* [windows/message.c]
Declared MSG_SendMessage as static.
Changed parameter of DirectedYield() from queue handle to task handle.
Removed warning mesages for argument of printf.
* [windows/nonclient.c]
Added the flag DT_NOPREFIX when drawing window titles.
* [windows/win.c]
WIN_WalkWindows now prints the invalid window handle.
Added a warning if Get-/SetWindowWord/-Long gets an invalid offset.
* [windows/winproc.c]
Allows creating dialog windows with NULL as dialog function.
Wed Jul 3 09:26:41 1996 Andrew Lewycky <plewycky@oise.utoronto.ca>
* [windows/event.c]
EVENT_key: Fixes to VK_ code generation for space bar and
punctuation.
* [files/file.c]
GetTempFileName: first character in temporary name is "~".
* [memory/heap.c]
HEAP_MakeInUseBlockFree now frees the whole subheap if possible.
* [objects/text.c]
ExtTextOut16(): handle NULL lpRect and ETO_OPAQUE.
* [misc/driver.c]
Removed some bugs and reformatted. Actually loads drivers now.
* [include/callback.h]
Added CallDriverProc() and CallWindowsExitProc().
* [loader/module.c]
MODULE_CallWEP(): new function.
* [misc/lzexpand.c]
LZSeek(): return new pointer, not old one.
* [misc/ver.c]
find_ne_resource(): fixed dependence on LZSeek() bug.
GetFileResource(): initialize reslen before using it.
* [windows/class.c]
SetClassWord(): add missing else.
* [objects/font.c]
lpFontList is now MAX_FONTS+1. It used to overwrite the array.
InitFontList: allocate one huge array of structures.
FONT_MatchFont: uppercase the face name.
Thu Jun 27 12:41:40 1996 Bruce Milner <bruce@genetics.utah.edu>
* [memory/heap.c]
Fixed a typo in HeapReAlloc().
Tue Jun 25 22:22:03 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [files/directory.c] [files/drive.c] [if1632/kernel.spec]
[if1632/kernel32.spec] [if1632/shell.spec] [include/windows.h]
GetTempPath* added
GetDriveType* fixed, updated to NewNameStandard.
GetCurrentDirectory* fixed (needs to prepend X:\).
* [controls/listbox.c]
Missing NULL check added.
* [if1632/winmm.spec] [loader/builtin.c]
winmm.dll (32bit mmsystem equivalent) specs added.
* [memory/string.c] [if1632/kernel32.spec] [include/windows.h]
Rtl{Move,Zero,Fill}Memory added.
* [misc/registry.c]
Some NULL ptr dereference bugs fixed.
* [multimedia/mcicda.c][multimedia/mcistring.c][multimedia/mmsystem.c]
Check for NULL ptr.
Fill mciOpenDrv when mixing mciOpen and mciSendString("open ..").
Aliasing should work for all MCI devices.
* [windows/win.c]
Allow passing invalid window handles to CloseWindow().
Tue Jun 25 20:02:15 1996 Jukka Iivonen <iivonen@cc.helsinki.fi>
* [files/directory.c] [if1632/kernel32.spec]
GetSystemDirectory32A and GetSystemDirectory32W added.
* [misc/main.c] [if1632/kernel32.spec]
Beep and SetEnvironmentVariable32W added.
diff --git a/ANNOUNCE b/ANNOUNCE
index 76dac67..decf527 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,12 +1,12 @@
-This is release 960623 of Wine, the MS Windows emulator. This is still a
+This is release 960705 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 correctly.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry.
-WHAT'S NEW with Wine-960623: (see ChangeLog for details)
- - More Win32 code.
+WHAT'S NEW with Wine-960705: (see ChangeLog for details)
+ - New window procedure thunks.
- Lots of bug fixes.
See the README file in the distribution for installation instructions.
@@ -15,10 +15,10 @@
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-960623.tar.gz
- tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960623.tar.gz
- ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960623.tar.gz
- aris.com:/pub/linux/ALPHA/Wine/development/Wine-960623.tar.gz
+ sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960705.tar.gz
+ tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960705.tar.gz
+ ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960705.tar.gz
+ aris.com:/pub/linux/ALPHA/Wine/development/Wine-960705.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite.
diff --git a/ChangeLog b/ChangeLog
index e94ed93..7b3b3bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,150 @@
----------------------------------------------------------------------
+Fri Jul 5 16:27:43 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
+
+ * [controls/desktop.c]
+ Use Windows file I/O routines to load the desktop bitmap.
+
+ * [files/file.c]
+ Implemented RemoveDirectory* and DeleteFile*.
+
+ * [include/wine.h]
+ Added SIGCONTEXT typedef to replace #define sigcontext_struct.
+
+ * [loader/task.c]
+ Fixed initial breakpoint setting for Win32 tasks.
+
+ * [misc/wsprintf.c]
+ Ignore Unicode formats for wsprintf16().
+
+ * [objects/font.c]
+ Implemented Win32 version of GetTextMetrics.
+
+ * [windows/winproc.c] [windows/win.c] [windows/class.c]
+ [windows/dialog.c]
+ Modified windows procedures to use thunks, to ensure that the
+ procedure can be called directly from the Windows program.
+
+ * [windows/win.c]
+ Added function WIN_BuildWinArray() to make it easier to enumerate
+ windows. Implemented Win32 version of EnumWindows() and friends.
+
+Fri Jul 5 11:56:22 1996 Andreas Kirschbaum <ank@rbg.informatik.th-darmstadt.de>
+
+ * [controls/button.c] [windows/win.c]
+ Operator precedence fixes.
+
+ * [controls/edit.c]
+ Implemented ES_PASSWORD, ES_LOWERCASE and ES_UPPERCASE styles.
+ Fixed word wrap with long words.
+
+ * [debugger/debug.l]
+ New alias "where" for command "backtrace".
+
+ * [if1632/gdi.spec]
+ Corrected parameter of ExtTextOut.
+
+ * [loader/module.c]
+ Corrected printing of table of modules.
+
+ * [misc/spy.c]
+ Removed superfluous \n in message name.
+
+ * [windows/message.c]
+ Declared MSG_SendMessage as static.
+ Changed parameter of DirectedYield() from queue handle to task handle.
+ Removed warning mesages for argument of printf.
+
+ * [windows/nonclient.c]
+ Added the flag DT_NOPREFIX when drawing window titles.
+
+ * [windows/win.c]
+ WIN_WalkWindows now prints the invalid window handle.
+ Added a warning if Get-/SetWindowWord/-Long gets an invalid offset.
+
+ * [windows/winproc.c]
+ Allows creating dialog windows with NULL as dialog function.
+
+Wed Jul 3 09:26:41 1996 Peter Lewycky <plewycky@oise.utoronto.ca>
+
+ * [windows/event.c]
+ EVENT_key: Fixes to VK_ code generation for space bar and
+ punctuation.
+
+ * [files/file.c]
+ GetTempFileName: first character in temporary name is "~".
+
+ * [memory/heap.c]
+ HEAP_MakeInUseBlockFree now frees the whole subheap if possible.
+
+ * [objects/text.c]
+ ExtTextOut16(): handle NULL lpRect and ETO_OPAQUE.
+
+ * [misc/driver.c]
+ Removed some bugs and reformatted. Actually loads drivers now.
+
+ * [include/callback.h]
+ Added CallDriverProc() and CallWindowsExitProc().
+
+ * [loader/module.c]
+ MODULE_CallWEP(): new function.
+
+ * [misc/lzexpand.c]
+ LZSeek(): return new pointer, not old one.
+
+ * [misc/ver.c]
+ find_ne_resource(): fixed dependence on LZSeek() bug.
+ GetFileResource(): initialize reslen before using it.
+
+ * [windows/class.c]
+ SetClassWord(): add missing else.
+
+ * [objects/font.c]
+ lpFontList is now MAX_FONTS+1. It used to overwrite the array.
+ InitFontList: allocate one huge array of structures.
+ FONT_MatchFont: uppercase the face name.
+
+Thu Jun 27 12:41:40 1996 Bruce Milner <bruce@genetics.utah.edu>
+
+ * [memory/heap.c]
+ Fixed a typo in HeapReAlloc().
+
+Tue Jun 25 22:22:03 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+
+ * [files/directory.c] [files/drive.c] [if1632/kernel.spec]
+ [if1632/kernel32.spec] [if1632/shell.spec] [include/windows.h]
+ GetTempPath* added
+ GetDriveType* fixed, updated to NewNameStandard.
+ GetCurrentDirectory* fixed (needs to prepend X:\).
+
+ * [controls/listbox.c]
+ Missing NULL check added.
+
+ * [if1632/winmm.spec] [loader/builtin.c]
+ winmm.dll (32bit mmsystem equivalent) specs added.
+
+ * [memory/string.c] [if1632/kernel32.spec] [include/windows.h]
+ Rtl{Move,Zero,Fill}Memory added.
+
+ * [misc/registry.c]
+ Some NULL ptr dereference bugs fixed.
+
+ * [multimedia/mcicda.c][multimedia/mcistring.c][multimedia/mmsystem.c]
+ Check for NULL ptr.
+ Fill mciOpenDrv when mixing mciOpen and mciSendString("open ..").
+ Aliasing should work for all MCI devices.
+
+ * [windows/win.c]
+ Allow passing invalid window handles to CloseWindow().
+
+Tue Jun 25 20:02:15 1996 Jukka Iivonen <iivonen@cc.helsinki.fi>
+
+ * [files/directory.c] [if1632/kernel32.spec]
+ GetSystemDirectory32A and GetSystemDirectory32W added.
+
+ * [misc/main.c] [if1632/kernel32.spec]
+ Beep and SetEnvironmentVariable32W added.
+
+----------------------------------------------------------------------
Wed Jun 19 14:49:27 1996 Marcus Meissner <msmeissn@faui45.informatik.uni-erlangen.de>
* [files/drive.c]
diff --git a/controls/button.c b/controls/button.c
index 3181a56..620f288 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -313,7 +313,7 @@
{
short xdelta, ydelta;
dwTextSize = GetTextExtent(hDC,wndPtr->text,strlen(wndPtr->text));
- GetTextMetrics( hDC, &tm );
+ GetTextMetrics16( hDC, &tm );
xdelta = ((rc.right - rc.left) - LOWORD(dwTextSize) - 1) / 2;
ydelta = ((rc.bottom - rc.top) - tm.tmHeight - 1) / 2;
if (xdelta < 0) xdelta = 0;
@@ -382,7 +382,7 @@
hBrush = BUTTON_SEND_CTLCOLOR( wndPtr, hDC );
if (action == ODA_DRAWENTIRE) FillRect16( hDC, &rc, hBrush );
- GetTextMetrics(hDC, &tm);
+ GetTextMetrics16(hDC, &tm);
delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
/* Draw the check-box bitmap */
@@ -512,9 +512,9 @@
dis.CtlID = wndPtr->wIDmenu;
dis.itemID = 0;
dis.itemAction = 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.itemState = ((infoPtr->state & BUTTON_HASFOCUS) ? ODS_FOCUS : 0) |
+ ((infoPtr->state & BUTTON_HIGHLIGHTED) ? ODS_SELECTED : 0) |
+ ((wndPtr->dwStyle & WS_DISABLED) ? ODS_DISABLED : 0);
dis.hwndItem = wndPtr->hwndSelf;
dis.hDC = hDC;
dis.itemData = 0;
diff --git a/controls/desktop.c b/controls/desktop.c
index a71a6f8..9b01ae7 100644
--- a/controls/desktop.c
+++ b/controls/desktop.c
@@ -4,16 +4,15 @@
* Copyright 1994 Alexandre Julliard
*/
-#include <fcntl.h>
#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "win.h"
#include "desktop.h"
#include "directory.h"
-#include "dos_fs.h"
+#include "file.h"
#include "graphics.h"
+#include "heap.h"
/***********************************************************************
@@ -26,47 +25,46 @@
BITMAPFILEHEADER *fileHeader;
BITMAPINFO *bitmapInfo;
HBITMAP hbitmap;
- char *buffer;
- const char *unixFileName;
- int file;
- long size;
+ HFILE file;
+ LPSTR buffer;
+ LONG size;
- /* Read all the file into memory */
+ /* Read all the file into memory */
- if (!(unixFileName = DOSFS_GetUnixFileName( filename, TRUE )))
+ if ((file = _lopen( filename, OF_READ )) == HFILE_ERROR)
{
- int len = DIR_GetWindowsUnixDir( NULL, 0 );
- if (!(buffer = malloc( len + strlen(filename) + 2 ))) return 0;
- DIR_GetWindowsUnixDir( buffer, len + 1 );
- strcat( buffer, "/" );
+ UINT32 len = GetWindowsDirectory( NULL, 0 );
+ if (!(buffer = HeapAlloc( SystemHeap, 0, len + strlen(filename) + 2 )))
+ return 0;
+ GetWindowsDirectory( buffer, len + 1 );
+ strcat( buffer, "\\" );
strcat( buffer, filename );
- unixFileName = DOSFS_GetUnixFileName( buffer, TRUE );
- free( buffer );
- if (!unixFileName) return 0;
+ file = _lopen( buffer, OF_READ );
+ HeapFree( SystemHeap, 0, buffer );
}
- if ((file = open( unixFileName, O_RDONLY )) == -1) return 0;
- size = lseek( file, 0, SEEK_END );
- if (!(buffer = (char *)malloc( size )))
+ if (file == HFILE_ERROR) return 0;
+ size = _llseek( file, 0, 2 );
+ if (!(buffer = HeapAlloc( SystemHeap, 0, size )))
{
- close( file );
+ _lclose( file );
return 0;
}
- lseek( file, 0, SEEK_SET );
- size = read( file, buffer, size );
- close( file );
+ _llseek( file, 0, 0 );
+ size = FILE_Read( file, buffer, size );
+ _lclose( file );
fileHeader = (BITMAPFILEHEADER *)buffer;
bitmapInfo = (BITMAPINFO *)(buffer + sizeof(BITMAPFILEHEADER));
/* Check header content */
if ((fileHeader->bfType != 0x4d42) || (size < fileHeader->bfSize))
{
- free( buffer );
+ HeapFree( SystemHeap, 0, buffer );
return 0;
}
hbitmap = CreateDIBitmap( hdc, &bitmapInfo->bmiHeader, CBM_INIT,
buffer + fileHeader->bfOffBits,
bitmapInfo, DIB_RGB_COLORS );
- free( buffer );
+ HeapFree( SystemHeap, 0, buffer );
return hbitmap;
}
diff --git a/controls/edit.c b/controls/edit.c
index 7db7bd4..62be0ea 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -79,6 +79,9 @@
#define IsHScrollBar(wndPtr) ((wndPtr)->dwStyle & WS_HSCROLL)
#define IsReadOnly(wndPtr) ((wndPtr)->dwStyle & ES_READONLY)
#define IsWordWrap(wndPtr) (((wndPtr)->dwStyle & ES_AUTOHSCROLL) == 0)
+#define IsPassword(wndPtr) ((wndPtr)->dwStyle & ES_PASSWORD)
+#define IsLower(wndPtr) ((wndPtr)->dwStyle & ES_LOWERCASE)
+#define IsUpper(wndPtr) ((wndPtr)->dwStyle & ES_UPPERCASE)
#define EDITSTATEPTR(wndPtr) (*(EDITSTATE **)((wndPtr)->wExtra))
@@ -127,6 +130,7 @@
static UINT EDIT_GetLineHeight(WND *wndPtr);
static void EDIT_GetLineRect(WND *wndPtr, UINT line, UINT scol, UINT ecol, LPRECT16 rc);
static char * EDIT_GetPointer(WND *wndPtr);
+static char * EDIT_GetPasswordPointer(WND *wndPtr);
static LRESULT EDIT_GetRect(WND *wndPtr, WPARAM wParam, LPARAM lParam);
static BOOL EDIT_GetRedraw(WND *wndPtr);
static UINT EDIT_GetTextWidth(WND *wndPtr);
@@ -504,14 +508,14 @@
* EDIT_BuildLineDefs
*
* Build array of pointers to text lines.
- * Lines can end with '\0' (last line), nothing (if it is to long),
+ * Lines can end with '\0' (last line), nothing (if it is too long),
* a delimiter (usually ' '), a soft return '\r\r\n' or a hard return '\r\n'
*
*/
static void EDIT_BuildLineDefs(WND *wndPtr)
{
EDITSTATE *es = EDITSTATEPTR(wndPtr);
- char *text = EDIT_GetPointer(wndPtr);
+ char *text = EDIT_GetPasswordPointer(wndPtr);
int ww = EDIT_GetWndWidth(wndPtr);
HDC hdc;
HFONT hFont;
@@ -562,16 +566,23 @@
width = LOWORD(GetTabbedTextExtent(hdc, start, next,
es->NumTabStops, es->TabStops));
} while (width <= ww);
- if (prev) {
- length = prev;
- if (EDIT_CallWordBreakProc(wndPtr, start, length - 1,
- length, WB_ISDELIMITER)) {
- length--;
- ending = END_DELIMIT;
- } else
- ending = END_NONE;
- } else {
+ if (!prev) {
+ next = 0;
+ do {
+ prev = next;
+ next++;
+ width = LOWORD(GetTabbedTextExtent(hdc, start, next,
+ es->NumTabStops, es->TabStops));
+ } while (width <= ww);
+ if(!prev) prev = 1;
}
+ length = prev;
+ if (EDIT_CallWordBreakProc(wndPtr, start, length - 1,
+ length, WB_ISDELIMITER)) {
+ length--;
+ ending = END_DELIMIT;
+ } else
+ ending = END_NONE;
width = LOWORD(GetTabbedTextExtent(hdc, start, length,
es->NumTabStops, es->TabStops));
}
@@ -602,6 +613,8 @@
if (hFont)
SelectObject(hdc, oldFont);
ReleaseDC(wndPtr->hwndSelf, hdc);
+
+ free(text);
}
@@ -755,6 +768,30 @@
/*********************************************************************
*
+ * EDIT_GetPasswordPointer
+ *
+ *
+ */
+static char *EDIT_GetPasswordPointer(WND *wndPtr)
+{
+ EDITSTATE *es = EDITSTATEPTR(wndPtr);
+ char *text = xstrdup(EDIT_GetPointer(wndPtr));
+ char *p;
+
+ if(es->PasswordChar) {
+ p = text;
+ while(*p != '\0') {
+ if(*p != '\r' && *p != '\n')
+ *p = es->PasswordChar;
+ p++;
+ }
+ }
+ return text;
+}
+
+
+/*********************************************************************
+ *
* EDIT_GetRect
*
* Beware: This is not the function called on EM_GETRECT.
@@ -1272,11 +1309,12 @@
SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
}
- text = EDIT_GetPointer(wndPtr);
+ text = EDIT_GetPasswordPointer(wndPtr);
li = (UINT)EDIT_EM_LineIndex(wndPtr, line, 0L);
xoff = EDIT_GetXOffset(wndPtr);
ret = LOWORD(TabbedTextOut(hdc, x, y, text + li + col, count,
- es->NumTabStops, es->TabStops, -xoff));
+ es->NumTabStops, es->TabStops, -xoff));
+ free(text);
if (rev) {
SetBkColor(hdc, BkColor);
SetTextColor(hdc, TextColor);
@@ -1341,6 +1379,10 @@
p[strl] = p[0];
for (i = 0 , p = text + e ; i < strl ; i++)
p[i] = str[i];
+ if(IsUpper(wndPtr))
+ AnsiUpperBuff(p, strl);
+ else if(IsLower(wndPtr))
+ AnsiLowerBuff(p, strl);
EDIT_BuildLineDefs(wndPtr);
e += strl;
EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(e, e));
@@ -1403,7 +1445,7 @@
static INT EDIT_WndXFromCol(WND *wndPtr, UINT line, UINT col)
{
EDITSTATE *es = EDITSTATEPTR(wndPtr);
- char *text = EDIT_GetPointer(wndPtr);
+ char *text = EDIT_GetPasswordPointer(wndPtr);
INT ret;
HDC hdc;
HFONT hFont;
@@ -1425,6 +1467,7 @@
if (hFont)
SelectObject(hdc, oldFont);
ReleaseDC(wndPtr->hwndSelf, hdc);
+ free(text);
return ret;
}
@@ -2753,7 +2796,7 @@
hdc = GetDC(wndPtr->hwndSelf);
if (es->hFont)
oldFont = SelectObject(hdc, es->hFont);
- GetTextMetrics(hdc, &tm);
+ GetTextMetrics16(hdc, &tm);
es->LineHeight = HIWORD(GetTextExtent(hdc, "X", 1));
es->AveCharWidth = tm.tmAveCharWidth;
if (es->hFont)
diff --git a/controls/listbox.c b/controls/listbox.c
index b6f1f79..0a31780 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -107,7 +107,7 @@
if ((hdc = GetDC(0)))
{
TEXTMETRIC16 tm;
- GetTextMetrics( hdc, &tm );
+ GetTextMetrics16( hdc, &tm );
lphl->StdItemHeight = tm.tmHeight;
dprintf_listbox(stddeb,"CreateListBoxStruct: font height %d\n",
lphl->StdItemHeight);
@@ -1273,7 +1273,7 @@
if ((hdc = GetDC(0)))
{
TEXTMETRIC16 tm;
- GetTextMetrics( hdc, &tm );
+ GetTextMetrics16( hdc, &tm );
lphl->StdItemHeight = tm.tmHeight;
dprintf_listbox(stddeb,"LBSetFont: new font %d with height %d\n",
lphl->hFont, lphl->StdItemHeight);
@@ -2094,7 +2094,7 @@
{
char mask[20];
- if (!filespec[0]) strcpy( mask, "*.*" );
+ if (!filespec || !filespec[0]) strcpy( mask, "*.*" );
else
{
/* If the path exists and is a directory, chdir to it */
diff --git a/controls/menu.c b/controls/menu.c
index bf6a69d..a99da2a 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -732,7 +732,7 @@
/***********************************************************************
* MENU_SwitchTPWndTo
*/
-BOOL MENU_SwitchTPWndTo( HTASK hTask)
+static BOOL MENU_SwitchTPWndTo( HTASK hTask)
{
/* This is supposed to be called when popup is hidden */
diff --git a/debugger/break.c b/debugger/break.c
index 1726c16..be92e1f 100644
--- a/debugger/break.c
+++ b/debugger/break.c
@@ -71,7 +71,7 @@
* Determine if the instruction at CS:EIP is an instruction that
* we need to step over (like a call or a repetitive string move).
*/
-static BOOL DEBUG_IsStepOverInstr( struct sigcontext_struct *context )
+static BOOL DEBUG_IsStepOverInstr( SIGCONTEXT *context )
{
BYTE *instr = (BYTE *)PTR_SEG_OFF_TO_LIN(CS_reg(context),EIP_reg(context));
@@ -135,7 +135,7 @@
*
* Set or remove all the breakpoints.
*/
-void DEBUG_SetBreakpoints( BOOL set )
+void DEBUG_SetBreakpoints( BOOL32 set )
{
int i;
@@ -236,7 +236,7 @@
*
* Enable or disable a break point.
*/
-void DEBUG_EnableBreakpoint( int num, BOOL enable )
+void DEBUG_EnableBreakpoint( int num, BOOL32 enable )
{
if ((num <= 0) || (num >= next_bp) || !breakpoints[num].in_use)
{
@@ -275,8 +275,7 @@
* Determine if we should continue execution after a SIGTRAP signal when
* executing in the given mode.
*/
-BOOL DEBUG_ShouldContinue( struct sigcontext_struct *context,
- enum exec_mode mode )
+BOOL32 DEBUG_ShouldContinue( SIGCONTEXT *context, enum exec_mode mode )
{
DBG_ADDR addr;
int bpnum;
@@ -316,8 +315,8 @@
* Set the breakpoints to the correct state to restart execution
* in the given mode.
*/
-void DEBUG_RestartExecution( struct sigcontext_struct *context,
- enum exec_mode mode, int instr_len )
+void DEBUG_RestartExecution( SIGCONTEXT *context, enum exec_mode mode,
+ int instr_len )
{
DBG_ADDR addr;
diff --git a/debugger/dbg.y b/debugger/dbg.y
index e6064ca..45e806b 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -229,7 +229,7 @@
}
-void wine_debug( int signal, struct sigcontext_struct *regs )
+void wine_debug( int signal, SIGCONTEXT *regs )
{
static int loaded_symbols = 0;
char SymbolTableFile[256];
@@ -239,7 +239,7 @@
#endif
yyin = stdin;
- DEBUG_context = (struct sigcontext_struct *)regs;
+ DEBUG_context = regs;
DEBUG_SetBreakpoints( FALSE );
diff --git a/debugger/debug.l b/debugger/debug.l
index 0806e05..709c23a 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -103,7 +103,8 @@
help|hel|he|"?" { return tHELP; }
-backtrace|bt { return tBACKTRACE; }
+backtrace|backtrac|backtra|backt|back|bac|ba|bt { return tBACKTRACE; }
+where|wher|whe { return tBACKTRACE; }
cont|con|co|c { return tCONT; }
step|ste|st|s { return tSTEP; }
diff --git a/debugger/hash.c b/debugger/hash.c
index 56af9e5..39dbdab 100644
--- a/debugger/hash.c
+++ b/debugger/hash.c
@@ -66,7 +66,7 @@
*
* Get the address of a named symbol.
*/
-BOOL DEBUG_GetSymbolValue( const char * name, DBG_ADDR *addr )
+BOOL32 DEBUG_GetSymbolValue( const char * name, DBG_ADDR *addr )
{
char buffer[256];
struct name_hash *nh;
@@ -93,7 +93,7 @@
*
* Set the address of a named symbol.
*/
-BOOL DEBUG_SetSymbolValue( const char * name, const DBG_ADDR *addr )
+BOOL32 DEBUG_SetSymbolValue( const char * name, const DBG_ADDR *addr )
{
char buffer[256];
struct name_hash *nh;
diff --git a/debugger/memory.c b/debugger/memory.c
index 49108c2..cfe16a2 100644
--- a/debugger/memory.c
+++ b/debugger/memory.c
@@ -15,7 +15,7 @@
*
* Check if we are allowed to read memory at 'address'.
*/
-BOOL DEBUG_IsBadReadPtr( const DBG_ADDR *address, int size )
+BOOL32 DEBUG_IsBadReadPtr( const DBG_ADDR *address, int size )
{
if (address->seg) /* segmented addr */
return IsBadReadPtr( (SEGPTR)MAKELONG( (WORD)address->off,
@@ -31,7 +31,7 @@
*
* Check if we are allowed to write memory at 'address'.
*/
-BOOL DEBUG_IsBadWritePtr( const DBG_ADDR *address, int size )
+BOOL32 DEBUG_IsBadWritePtr( const DBG_ADDR *address, int size )
{
if (address->seg) /* segmented addr */
/* Note: we use IsBadReadPtr here because we are */
diff --git a/debugger/registers.c b/debugger/registers.c
index a8b66a5..57aaf96 100644
--- a/debugger/registers.c
+++ b/debugger/registers.c
@@ -8,7 +8,7 @@
#include "debugger.h"
-struct sigcontext_struct *DEBUG_context;
+SIGCONTEXT *DEBUG_context;
diff --git a/files/directory.c b/files/directory.c
index 432b8c4..285468e 100644
--- a/files/directory.c
+++ b/files/directory.c
@@ -15,8 +15,10 @@
#include "msdos.h"
#include "options.h"
#include "xmalloc.h"
+#include "string32.h"
#include "stddebug.h"
#include "debug.h"
+#include "string32.h"
#define MAX_PATH_ELEMENTS 20
@@ -178,9 +180,9 @@
/***********************************************************************
- * DIR_GetTempDosDir
+ * GetTempPath32A (KERNEL32.292)
*/
-UINT DIR_GetTempDosDir( LPSTR path, UINT count )
+UINT32 GetTempPath32A( UINT32 count, LPSTR path )
{
if (path) lstrcpyn32A( path, DIR_TempDosDir, count );
return strlen( DIR_TempDosDir );
@@ -188,6 +190,19 @@
/***********************************************************************
+ * GetTempPath32W (KERNEL32.293)
+ */
+UINT32 GetTempPath32W( UINT32 count, LPWSTR path )
+{
+ LPSTR tmp = (char*)xmalloc(count);
+ UINT32 len = GetTempPath32A( count, tmp );
+ if (path) STRING32_AnsiToUni( path, tmp );
+ free(tmp);
+ return len;
+}
+
+
+/***********************************************************************
* DIR_GetTempUnixDir
*/
UINT DIR_GetTempUnixDir( LPSTR path, UINT count )
@@ -248,10 +263,34 @@
/***********************************************************************
- * GetSystemDirectory (KERNEL.135)
+ * GetSystemDirectory16 (KERNEL.135)
*/
-UINT GetSystemDirectory( LPSTR path, UINT count )
+UINT16 GetSystemDirectory16( LPSTR path, UINT16 count )
+{
+ return (UINT16)GetSystemDirectory32A( path, count );
+}
+
+
+/***********************************************************************
+ * GetSystemDirectory32A (KERNEL32.282)
+ */
+UINT32 GetSystemDirectory32A( LPSTR path, UINT32 count )
{
if (path) lstrcpyn32A( path, DIR_SystemDosDir, count );
return strlen( DIR_SystemDosDir );
}
+
+
+/***********************************************************************
+ * GetSystemDirectory32W (KERNEL32.283)
+ */
+UINT32 GetSystemDirectory32W( LPWSTR path, UINT32 count )
+{
+ if (path)
+ {
+ LPWSTR tmp = STRING32_DupAnsiToUni( DIR_SystemDosDir );
+ lstrcpyn32W( path, tmp, count );
+ free (tmp);
+ }
+ return strlen( DIR_SystemDosDir );
+}
diff --git a/files/drive.c b/files/drive.c
index f886bda..b57267b 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -525,9 +525,9 @@
/***********************************************************************
- * GetDriveType (KERNEL.136)
+ * GetDriveType16 (KERNEL.136)
*/
-WORD GetDriveType( INT drive )
+UINT16 GetDriveType16( UINT16 drive )
{
dprintf_dosfs( stddeb, "GetDriveType(%c:)\n", 'A' + drive );
switch(DRIVE_GetType(drive))
@@ -543,9 +543,9 @@
/***********************************************************************
- * GetDriveType32A (KERNEL32.)
+ * GetDriveType32A (KERNEL32.208)
*/
-WORD GetDriveType32A( LPCSTR root )
+UINT32 GetDriveType32A( LPCSTR root )
{
dprintf_dosfs( stddeb, "GetDriveType32A(%s)\n", root );
if ((root[1] != ':') || (root[2] != '\\'))
@@ -566,18 +566,61 @@
/***********************************************************************
- * GetCurrentDirectory (KERNEL.411) (KERNEL32.196)
+ * GetDriveType32W (KERNEL32.209)
*/
-UINT32 GetCurrentDirectory( UINT32 buflen, LPSTR buf )
+UINT32 GetDriveType32W( LPCWSTR root )
{
+ LPSTR xpath=STRING32_DupUniToAnsi(root);
+ UINT32 ret;
+
+ ret = GetDriveType32A(xpath);
+ free(xpath);
+ return ret;
+}
+
+
+/***********************************************************************
+ * GetCurrentDirectory16 (KERNEL.411)
+ */
+UINT16 GetCurrentDirectory16( UINT16 buflen, LPSTR buf )
+{
+ return (UINT16)GetCurrentDirectory32A( buflen, buf );
+}
+
+
+/***********************************************************************
+ * GetCurrentDirectory32A (KERNEL32.196)
+ *
+ * Returns "X:\\path\\etc\\".
+ */
+UINT32 GetCurrentDirectory32A( UINT32 buflen, LPSTR buf )
+{
+ char *pref = "A:\\";
const char *s = DRIVE_GetDosCwd( DRIVE_GetCurrentDrive() );
if (!s)
{
*buf = '\0';
return 0;
}
- lstrcpyn32A( buf, s, buflen );
- return strlen(s); /* yes */
+ lstrcpyn32A( buf, pref, 3 );
+ if (buflen) buf[0] += DRIVE_GetCurrentDrive();
+ if (buflen >= 3) lstrcpyn32A( buf + 3, s, buflen - 3 );
+ return strlen(s) + 3; /* length of WHOLE current directory */
+}
+
+
+/***********************************************************************
+ * GetCurrentDirectory32W (KERNEL32.197)
+ */
+UINT32 GetCurrentDirectory32W( UINT32 buflen, LPWSTR buf )
+{
+ LPSTR xpath=(char*)xmalloc(buflen+1);
+ UINT32 ret;
+
+ ret = GetCurrentDirectory32A(buflen,xpath);
+ STRING32_AnsiToUni(buf,xpath);
+ free(xpath);
+ return ret;
}
diff --git a/files/file.c b/files/file.c
index 390b6de..e324d3f 100644
--- a/files/file.c
+++ b/files/file.c
@@ -385,32 +385,6 @@
/***********************************************************************
- * FILE_Unlink
- */
-int FILE_Unlink( LPCSTR path )
-{
- const char *unixName;
-
- dprintf_file(stddeb, "FILE_Unlink: '%s'\n", path );
-
- if ((unixName = DOSFS_IsDevice( path )) != NULL)
- {
- dprintf_file(stddeb, "FILE_Unlink: removing device '%s'!\n", unixName);
- DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
- return 0;
- }
-
- if (!(unixName = DOSFS_GetUnixFileName( path, TRUE ))) return 0;
- if (unlink( unixName ) == -1)
- {
- FILE_SetDosError();
- return 0;
- }
- return 1;
-}
-
-
-/***********************************************************************
* FILE_Stat
*
* Stat a Unix path name. Return 1 if OK.
@@ -485,31 +459,6 @@
/***********************************************************************
- * FILE_RemoveDir
- */
-int FILE_RemoveDir( LPCSTR path )
-{
- const char *unixName;
-
- dprintf_file(stddeb, "FILE_RemoveDir: '%s'\n", path );
-
- if ((unixName = DOSFS_IsDevice( path )) != NULL)
- {
- dprintf_file(stddeb, "FILE_RemoveDir: device '%s'!\n", unixName);
- DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
- return 0;
- }
- if (!(unixName = DOSFS_GetUnixFileName( path, TRUE ))) return 0;
- if (rmdir( unixName ) == -1)
- {
- FILE_SetDosError();
- return 0;
- }
- return 1;
-}
-
-
-/***********************************************************************
* FILE_Dup
*
* dup() function for DOS handles.
@@ -599,11 +548,12 @@
}
else
{
- DIR_GetTempDosDir( buffer, 132 ); /* buffer must be at least 144 */
+ GetTempPath32A( 132, buffer ); /* buffer must be at least 144 */
strcat( buffer, "\\" );
}
p = buffer + strlen(buffer);
+ *p++ = '~';
for (i = 3; (i > 0) && (*prefix); i--) *p++ = *prefix++;
sprintf( p, "%04x.tmp", num );
@@ -668,7 +618,7 @@
{
if (!(dosName = DOSFS_GetDosTrueName( name, FALSE ))) goto error;
lstrcpyn32A( ofs->szPathName, dosName, sizeof(ofs->szPathName) );
- ofs->fFixedDisk = (GetDriveType( dosName[0]-'A' ) != DRIVE_REMOVABLE);
+ ofs->fFixedDisk = (GetDriveType16( dosName[0]-'A' ) != DRIVE_REMOVABLE);
dprintf_file( stddeb, "OpenFile(%s): OF_PARSE, res = '%s', %d\n",
name, ofs->szPathName, hFileRet );
/* Return the handle, but close it first */
@@ -723,7 +673,7 @@
/* Try the Windows system directory */
- GetSystemDirectory( ofs->szPathName, len );
+ GetSystemDirectory32A( ofs->szPathName, len );
strcat( ofs->szPathName, "\\" );
strcat( ofs->szPathName, name );
if ((unixName = DOSFS_GetUnixFileName( ofs->szPathName, TRUE )) != NULL)
@@ -1080,6 +1030,53 @@
/***********************************************************************
+ * DeleteFile16 (KERNEL.146)
+ */
+BOOL16 DeleteFile16( LPCSTR path )
+{
+ return DeleteFile32A( path );
+}
+
+
+/***********************************************************************
+ * DeleteFile32A (KERNEL32.71)
+ */
+BOOL32 DeleteFile32A( LPCSTR path )
+{
+ const char *unixName;
+
+ dprintf_file(stddeb, "DeleteFile: '%s'\n", path );
+
+ if ((unixName = DOSFS_IsDevice( path )) != NULL)
+ {
+ dprintf_file(stddeb, "DeleteFile: removing device '%s'!\n", unixName);
+ DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
+ return FALSE;
+ }
+
+ if (!(unixName = DOSFS_GetUnixFileName( path, TRUE ))) return FALSE;
+ if (unlink( unixName ) == -1)
+ {
+ FILE_SetDosError();
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * DeleteFile32W (KERNEL32.72)
+ */
+BOOL32 DeleteFile32W( LPCWSTR path )
+{
+ LPSTR xpath = STRING32_DupUniToAnsi(path);
+ BOOL32 ret = RemoveDirectory32A( xpath );
+ free(xpath);
+ return ret;
+}
+
+
+/***********************************************************************
* CreateDirectory16 (KERNEL.144)
*/
BOOL16 CreateDirectory16( LPCSTR path, LPVOID dummy )
@@ -1123,3 +1120,49 @@
free(xpath);
return ret;
}
+
+
+/***********************************************************************
+ * RemoveDirectory16 (KERNEL)
+ */
+BOOL16 RemoveDirectory16( LPCSTR path )
+{
+ return (BOOL16)RemoveDirectory32A( path );
+}
+
+
+/***********************************************************************
+ * RemoveDirectory32A (KERNEL32.437)
+ */
+BOOL32 RemoveDirectory32A( LPCSTR path )
+{
+ const char *unixName;
+
+ dprintf_file(stddeb, "RemoveDirectory: '%s'\n", path );
+
+ if ((unixName = DOSFS_IsDevice( path )) != NULL)
+ {
+ dprintf_file(stddeb, "RemoveDirectory: device '%s'!\n", unixName);
+ DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
+ return FALSE;
+ }
+ if (!(unixName = DOSFS_GetUnixFileName( path, TRUE ))) return FALSE;
+ if (rmdir( unixName ) == -1)
+ {
+ FILE_SetDosError();
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * RemoveDirectory32W (KERNEL32.438)
+ */
+BOOL32 RemoveDirectory32W( LPCWSTR path )
+{
+ LPSTR xpath = STRING32_DupUniToAnsi(path);
+ BOOL32 ret = RemoveDirectory32A( xpath );
+ free(xpath);
+ return ret;
+}
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index c4bd7cc..d54fde2 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -41,6 +41,7 @@
version.spec \
w32sys.spec \
win87em.spec \
+ winmm.spec \
winsock.spec \
winspool.spec \
wprocs.spec \
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 635e163..1dfb7a6 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -100,7 +100,7 @@
90 pascal GetTextColor(word) GetTextColor
91 pascal GetTextExtent(word ptr s_word) GetTextExtent
92 pascal16 GetTextFace(word s_word ptr) GetTextFace
-93 pascal16 GetTextMetrics(word ptr) GetTextMetrics
+93 pascal16 GetTextMetrics(word ptr) GetTextMetrics16
94 pascal GetViewportExt(word) GetViewportExt
95 pascal GetViewportOrg(word) GetViewportOrg
96 pascal GetWindowExt(word) GetWindowExt
@@ -235,7 +235,7 @@
s_word s_word) Chord
349 pascal SetMapperFlags(word long) SetMapperFlags
350 pascal16 GetCharWidth(word word word ptr) GetCharWidth
-351 pascal16 ExtTextOut(word s_word s_word word ptr ptr s_word ptr) ExtTextOut16
+351 pascal16 ExtTextOut(word s_word s_word word ptr ptr word ptr) ExtTextOut16
352 stub GetPhysicalFontHandle
353 stub GetAspectRatioFilter
354 stub ShrinkGDIHeap
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index e7dc132..5305d54 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -238,8 +238,8 @@
0233 stdcall GetTextExtentPointW(long ptr long ptr) GetTextExtentPoint32W
0234 stub GetTextFaceA
0235 stub GetTextFaceW
-0236 stub GetTextMetricsA
-0237 stub GetTextMetricsW
+0236 stdcall GetTextMetricsA(long ptr) GetTextMetrics32A
+0237 stdcall GetTextMetricsW(long ptr) GetTextMetrics32W
0238 stub GetTransform
0239 stub GetViewportExtEx
0240 stub GetViewportOrgEx
@@ -314,8 +314,9 @@
0309 stub SetColorAdjustment
0310 stub SetColorSpace
0311 stub SetDIBColorTable
-0312 stub SetDIBits
-0313 stub SetDIBitsToDevice
+0312 stdcall SetDIBits(long long long long ptr ptr long) SetDIBits
+0313 stdcall SetDIBitsToDevice(long long long long long long long long long
+ ptr ptr long) SetDIBitsToDevice
0314 stub SetDeviceGammaRamp
0315 stub SetEnhMetaFileBits
0316 stub SetFontEnumeration
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 9ff222e..11723e1 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -23,8 +23,8 @@
20 pascal GlobalSize(word) GlobalSize16
21 pascal GlobalHandle(word) GlobalHandle16
22 pascal16 GlobalFlags(word) GlobalFlags16
-23 pascal16 LockSegment(word) LockSegment
-24 pascal16 UnlockSegment(word) UnlockSegment
+23 pascal16 LockSegment(word) LockSegment16
+24 pascal16 UnlockSegment(word) UnlockSegment16
25 pascal GlobalCompact(long) GlobalCompact16
26 pascal16 GlobalFreeAll(word) GlobalFreeAll
27 stub GetModuleName
@@ -42,13 +42,13 @@
41 return EnableDos 0 0
42 return DisableDos 0 0
45 pascal16 LoadModule(ptr ptr) LoadModule
-46 pascal16 FreeModule(word) FreeModule
+46 pascal16 FreeModule(word) FreeModule16
47 pascal16 GetModuleHandle(segptr) WIN16_GetModuleHandle
48 pascal16 GetModuleUsage(word) GetModuleUsage
49 pascal16 GetModuleFileName(word ptr s_word) GetModuleFileName
50 pascal GetProcAddress(word segptr) GetProcAddress
-51 pascal MakeProcInstance(segptr word) MakeProcInstance
-52 pascal16 FreeProcInstance(segptr) FreeProcInstance
+51 pascal MakeProcInstance(segptr word) MakeProcInstance16
+52 pascal16 FreeProcInstance(segptr) FreeProcInstance16
53 stub CallProcInstance
54 pascal16 GetInstanceData(word word word) GetInstanceData
55 pascal16 Catch(ptr) Catch
@@ -133,8 +133,8 @@
132 pascal GetWinFlags() GetWinFlags
133 pascal16 GetExePtr(word) GetExePtr
134 pascal16 GetWindowsDirectory(ptr word) GetWindowsDirectory
-135 pascal16 GetSystemDirectory(ptr word) GetSystemDirectory
-136 pascal16 GetDriveType(byte) GetDriveType
+135 pascal16 GetSystemDirectory(ptr word) GetSystemDirectory16
+136 pascal16 GetDriveType(byte) GetDriveType16
137 pascal FatalAppExit(word ptr) FatalAppExit
138 pascal GetHeapSpaces(word) GetHeapSpaces
139 stub DoSignal
@@ -143,8 +143,8 @@
142 stub GetProfileSectionNames
143 stub GetPrivateProfileSectionNames
144 pascal16 CreateDirectory(ptr ptr) CreateDirectory16
-145 stub RemoveDirectory
-146 stub DeleteFile
+145 pascal16 RemoveDirectory(ptr) RemoveDirectory16
+146 pascal16 DeleteFile(ptr) DeleteFile16
147 stub SetLastError
148 stub GetLastError
149 stub GetVersionEx
@@ -270,7 +270,7 @@
404 pascal16 FarGetOwner(word) FarGetOwner
406 stub WritePrivateProfileStruct
407 stub GetPrivateProfileStruct
-411 pascal GetCurrentDirectory(long ptr) GetCurrentDirectory
+411 pascal GetCurrentDirectory(long ptr) GetCurrentDirectory16
412 pascal16 SetCurrentDirectory(ptr) SetCurrentDirectory
413 stub FindFirstFile
414 stub FindNextFile
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 5a3b4b2..7a60849 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -13,7 +13,7 @@
0008 stub BackupWrite
0009 stub BaseAttachCompleteThunk
0010 stub BasepDebugDump
-0011 stub Beep
+0011 stdcall Beep(long long) Beep
0012 stub BeginUpdateResourceA
0013 stub BeginUpdateResourceW
0014 stub BuildCommDCBA
@@ -73,8 +73,8 @@
0068 stub DefineDosDeviceW
0069 stub DeleteAtom
0070 stdcall DeleteCriticalSection(ptr) DeleteCriticalSection
-0071 stub DeleteFileA
-0072 stub DeleteFileW
+0071 stdcall DeleteFileA(ptr) DeleteFile32A
+0072 stdcall DeleteFileW(ptr) DeleteFile32W
0073 stub DeviceIoControl
0074 stub DisableThreadLibraryCalls
0075 stub DisconnectNamedPipe
@@ -198,9 +198,9 @@
0193 stub GetCurrencyFormatA
0194 stub GetCurrencyFormatW
0195 stub GetCurrentConsoleFont
-0196 stdcall GetCurrentDirectoryA(ptr ptr) GetCurrentDirectory
-0197 stub GetCurrentDirectoryW
-0198 stdcall GetCurrentProcess() GetCurrentProcess
+0196 stdcall GetCurrentDirectoryA(long ptr) GetCurrentDirectory32A
+0197 stdcall GetCurrentDirectoryW(long ptr) GetCurrentDirectory32W
+0198 stdcall GetCurrentProcess() GetCurrentProcess
0199 stdcall GetCurrentProcessId() GetCurrentThreadId
0200 stdcall GetCurrentThread() GetCurrentThread
0201 stdcall GetCurrentThreadId() GetCurrentThreadId
@@ -211,7 +211,7 @@
0206 stdcall GetDiskFreeSpaceA(ptr ptr ptr ptr ptr) GetDiskFreeSpace32A
0207 stdcall GetDiskFreeSpaceW(ptr ptr ptr ptr ptr) GetDiskFreeSpace32W
0208 stdcall GetDriveTypeA(ptr) GetDriveType32A
-0209 stub GetDriveTypeW
+0209 stdcall GetDriveTypeW(ptr) GetDriveType32W
0210 stdcall GetEnvironmentStrings() GetEnvironmentStrings
0211 stub GetEnvironmentStringsA
0212 stdcall GetEnvironmentStringsW() GetEnvironmentStringsW
@@ -284,8 +284,8 @@
0279 stub GetStringTypeW
0280 stdcall GetSystemDefaultLCID() GetSystemDefaultLCID
0281 stub GetSystemDefaultLangID
-0282 stub GetSystemDirectoryA
-0283 stub GetSystemDirectoryW
+0282 stdcall GetSystemDirectoryA(ptr long) GetSystemDirectory32A
+0283 stdcall GetSystemDirectoryW(ptr long) GetSystemDirectory32W
0284 stub GetSystemInfo
0285 stdcall GetSystemTime(ptr) GetSystemTime
0286 stub GetSystemTimeAdjustment
@@ -294,8 +294,8 @@
0289 stub GetTapeStatus
0290 stub GetTempFileNameA
0291 stub GetTempFileNameW
-0292 stub GetTempPathA
-0293 stub GetTempPathW
+0292 stdcall GetTempPathA(long ptr) GetTempPath32A
+0293 stdcall GetTempPathW(long ptr) GetTempPath32W
0294 stdcall GetThreadContext(long ptr) GetThreadContext
0295 stub GetThreadLocale
0296 stub GetThreadPriority
@@ -439,14 +439,14 @@
0434 stub RegisterWowExec
0435 stdcall ReleaseMutex(long) ReleaseMutex
0436 stub ReleaseSemaphore
-0437 stub RemoveDirectoryA
-0438 stub RemoveDirectoryW
+0437 stdcall RemoveDirectoryA(ptr) RemoveDirectory32A
+0438 stdcall RemoveDirectoryW(ptr) RemoveDirectory32W
0439 stdcall ResetEvent(long) ResetEvent
0440 stub ResumeThread
-0441 stub RtlFillMemory
-0442 stub RtlMoveMemory
-0443 stdcall RtlUnwind(ptr long ptr long) RtlUnwind
-0444 stub RtlZeroMemory
+0441 stdcall RtlFillMemory(ptr long long) RtlFillMemory
+0442 stdcall RtlMoveMemory(ptr ptr long) RtlMoveMemory
+0443 stdcall RtlUnwind(ptr long ptr long) RtlUnwind
+0444 stdcall RtlZeroMemory(ptr long) RtlZeroMemory
0445 stub ScrollConsoleScreenBufferA
0446 stub ScrollConsoleScreenBufferW
0447 stub SearchPathA
@@ -486,8 +486,8 @@
0481 stub SetDefaultCommConfigA
0482 stub SetDefaultCommConfigW
0483 stub SetEndOfFile
-0484 stdcall SetEnvironmentVariableA(ptr ptr) SetEnvironmentVariableA
-0485 stub SetEnvironmentVariableW
+0484 stdcall SetEnvironmentVariableA(ptr ptr) SetEnvironmentVariable32A
+0485 stdcall SetEnvironmentVariableW(ptr ptr) SetEnvironmentVariable32W
0486 stdcall SetErrorMode(long) SetErrorMode
0487 stdcall SetEvent(long) SetEvent
0488 stub SetFileApisToANSI
diff --git a/if1632/ntdll.spec b/if1632/ntdll.spec
index ea49e96..5835922 100644
--- a/if1632/ntdll.spec
+++ b/if1632/ntdll.spec
@@ -362,7 +362,7 @@
358 stub RtlExtendedIntegerMultiply
359 stub RtlExtendedLargeIntegerDivide
360 stub RtlExtendedMagicDivide
-361 stub RtlFillMemory
+361 stdcall RtlFillMemory(ptr long long) RtlFillMemory
362 stub RtlFillMemoryUlong
363 stub RtlFindClearBits
364 stub RtlFindClearBitsAndSet
@@ -436,7 +436,7 @@
432 stub RtlLookupElementGenericTable
433 stub RtlMakeSelfRelativeSD
434 stub RtlMapGenericMask
-435 stub RtlMoveMemory
+435 stdcall RtlMoveMemory(ptr ptr long) RtlMoveMemory
436 stub RtlMultiByteToUnicodeN
437 stub RtlMultiByteToUnicodeSize
438 stub RtlNewInstanceSecurityObject
@@ -539,7 +539,7 @@
535 stub RtlWalkHeap
536 stub RtlWriteRegistryValue
537 stub RtlZeroHeap
-538 stub RtlZeroMemory
+538 stdcall RtlZeroMemory(ptr long) RtlZeroMemory
539 stub RtlpInitializeRtl
540 stub RtlpNtCreateKey
541 stub RtlpNtEnumerateSubKey
diff --git a/if1632/relay.c b/if1632/relay.c
index f14fd3b..6d4c75e 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -9,6 +9,7 @@
#include "module.h"
#include "registers.h"
#include "stackframe.h"
+#include "task.h"
#include "stddebug.h"
/* #define DEBUG_RELAY */
#include "debug.h"
@@ -122,7 +123,7 @@
if (func_type == 2) /* register function */
{
- struct sigcontext_struct *context = (struct sigcontext_struct *)&args32;
+ SIGCONTEXT *context = (SIGCONTEXT *)&args32;
printf( " AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x ES=%04x EFL=%08lx\n",
AX_reg(context), BX_reg(context), CX_reg(context),
DX_reg(context), SI_reg(context), DI_reg(context),
@@ -170,7 +171,7 @@
printf( "retval=none ret=%04x:%04x ds=%04x\n",
frame->cs, frame->ip, frame->ds );
{
- struct sigcontext_struct *context = (struct sigcontext_struct *)&args32;
+ SIGCONTEXT *context = (SIGCONTEXT *)&args32;
printf( " AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x ES=%04x EFL=%08lx\n",
AX_reg(context), BX_reg(context), CX_reg(context),
DX_reg(context), SI_reg(context), DI_reg(context),
@@ -195,11 +196,11 @@
NE_MODULE *pModule = BUILTIN_GetEntryPoint( frame->entry_cs,
frame->entry_ip,
&ordinal, &name );
- fprintf( stderr, "No handler for routine %.*s.%d (%.*s)\n",
+ fprintf( stderr, "No handler for Win16 routine %.*s.%d (%.*s) called from %04x:%04x\n",
*((BYTE *)pModule + pModule->name_table),
(char *)pModule + pModule->name_table + 1,
- ordinal, *name, name + 1 );
- exit(1);
+ ordinal, *name, name + 1, frame->cs, frame->ip );
+ TASK_KillCurrentTask(1);
}
@@ -211,10 +212,11 @@
* (The args are the same than for RELAY_DebugCallFrom32).
*/
void RELAY_Unimplemented32( int nb_args, void *entry_point,
- const char *func_name )
+ const char *func_name, int ebp, int ret_addr )
{
- fprintf( stderr, "No handler for Win32 routine %s\n", func_name );
- exit(1);
+ fprintf( stderr, "No handler for Win32 routine %s called from %08x\n",
+ func_name, ret_addr );
+ TASK_KillCurrentTask(1);
}
diff --git a/if1632/shell.spec b/if1632/shell.spec
index a6d722d..8b53f1e 100644
--- a/if1632/shell.spec
+++ b/if1632/shell.spec
@@ -35,7 +35,7 @@
# 157 RESTARTDIALOG
# 166 PICKICONDLG
-262 pascal16 DriveType(long) GetDriveType
+262 pascal16 DriveType(long) GetDriveType16
# 263 SH16TO32DRIVEIOCTL
# 264 SH16TO32INT2526
diff --git a/if1632/user.spec b/if1632/user.spec
index 9afd4b4..c0828b8 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -54,8 +54,8 @@
#51 BEAR51
52 pascal16 AnyPopup() AnyPopup
53 pascal16 DestroyWindow(word) DestroyWindow
-54 pascal16 EnumWindows(segptr long) EnumWindows
-55 pascal16 EnumChildWindows(word segptr long) EnumChildWindows
+54 pascal16 EnumWindows(segptr long) EnumWindows16
+55 pascal16 EnumChildWindows(word segptr long) EnumChildWindows16
56 pascal16 MoveWindow(word word word word word word) MoveWindow
57 pascal16 RegisterClass(ptr) RegisterClass16
58 pascal16 GetClassName(word ptr word) GetClassName16
@@ -225,7 +225,7 @@
222 pascal16 GetKeyboardState(ptr) GetKeyboardState
223 pascal16 SetKeyboardState(ptr) SetKeyboardState
224 pascal16 GetWindowTask(word) GetWindowTask
-225 pascal16 EnumTaskWindows(word segptr long) EnumTaskWindows
+225 pascal16 EnumTaskWindows(word segptr long) EnumTaskWindows16
226 stub LockInput
227 pascal16 GetNextDlgGroupItem(word word word) GetNextDlgGroupItem
228 pascal16 GetNextDlgTabItem(word word word) GetNextDlgTabItem
diff --git a/if1632/user32.spec b/if1632/user32.spec
index 3580e6e..c7c2316 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -181,7 +181,7 @@
0174 stub EndMenu
0175 stdcall EndPaint(long ptr) EndPaint32
0176 stub EndTask
-0177 stub EnumChildWindows
+0177 stdcall EnumChildWindows(long ptr long) EnumChildWindows32
0178 stub EnumClipboardFormats
0179 stub EnumDesktopsA
0180 stub EnumDesktopsW
@@ -193,10 +193,10 @@
0186 stub EnumPropsExA
0187 stub EnumPropsExW
0188 stub EnumPropsW
-0189 stub EnumThreadWindows
+0189 stdcall EnumThreadWindows(long ptr long) EnumThreadWindows
0190 stub EnumWindowStationsA
0191 stub EnumWindowStationsW
-0192 stub EnumWindows
+0192 stdcall EnumWindows(ptr long) EnumWindows32
0193 stdcall EqualRect(ptr ptr) EqualRect32
0194 stdcall ExcludeUpdateRgn(long long) ExcludeUpdateRgn
0195 stub ExitWindowsEx
diff --git a/if1632/winmm.spec b/if1632/winmm.spec
new file mode 100644
index 0000000..b5c47c4
--- /dev/null
+++ b/if1632/winmm.spec
@@ -0,0 +1,185 @@
+name winmm
+type win32
+
+0004 stub CloseDriver
+0005 stub DefDriverProc
+0006 stub DriverCallback
+0007 stub DrvClose
+0008 stub DrvDefDriverProc
+0009 stub DrvGetModuleHandle
+0010 stub DrvOpen
+0011 stub DrvOpenA
+0012 stub DrvSendMessage
+0013 stub GetDriverFlags
+0014 stub GetDriverModuleHandle
+0015 stub OpenDriver
+0016 stub OpenDriverA
+0017 stub PlaySound
+0001 stub PlaySoundA
+0018 stub PlaySoundW
+0019 stub SendDriverMessage
+0020 stub auxGetDevCapsA
+0021 stub auxGetDevCapsW
+0022 stub auxGetNumDevs
+0023 stub auxGetVolume
+0024 stub auxOutMessage
+0025 stub auxSetVolume
+0026 stub joyConfigChanged
+0027 stub joyGetDevCapsA
+0028 stub joyGetDevCapsW
+0029 stub joyGetNumDevs
+0030 stub joyGetPos
+0031 stub joyGetPosEx
+0032 stub joyGetThreshold
+0033 stub joyReleaseCapture
+0034 stub joySetCapture
+0035 stub joySetThreshold
+0036 stub mciDriverNotify
+0037 stub mciDriverYield
+0038 stub mciExecute
+0039 stub mciFreeCommandResource
+0040 stub mciGetCreatorTask
+0041 stub mciGetDeviceIDA
+0042 stub mciGetDeviceIDFromElementIDW
+0043 stub mciGetDeviceIDW
+0044 stub mciGetDriverData
+0045 stub mciGetErrorStringA
+0046 stub mciGetErrorStringW
+0047 stub mciGetYieldProc
+0048 stub mciLoadCommandResource
+0049 stub mciSendCommandA
+0050 stub mciSendCommandW
+0051 stub mciSendStringA
+0052 stub mciSendStringW
+0053 stub mciSetDriverData
+0054 stub mciSetYieldProc
+0055 stub midiConnect
+0056 stub midiDisconnect
+0057 stub midiInAddBuffer
+0058 stub midiInClose
+0059 stub midiInGetDevCapsA
+0060 stub midiInGetDevCapsW
+0061 stub midiInGetErrorTextA
+0062 stub midiInGetErrorTextW
+0063 stub midiInGetID
+0064 stub midiInGetNumDevs
+0065 stub midiInMessage
+0066 stub midiInOpen
+0067 stub midiInPrepareHeader
+0068 stub midiInReset
+0069 stub midiInStart
+0070 stub midiInStop
+0071 stub midiInUnprepareHeader
+0072 stub midiOutCacheDrumPatches
+0073 stub midiOutCachePatches
+0074 stub midiOutClose
+0075 stub midiOutGetDevCapsA
+0076 stub midiOutGetDevCapsW
+0077 stub midiOutGetErrorTextA
+0078 stub midiOutGetErrorTextW
+0079 stub midiOutGetID
+0080 stub midiOutGetNumDevs
+0081 stub midiOutGetVolume
+0082 stub midiOutLongMsg
+0083 stub midiOutMessage
+0084 stub midiOutOpen
+0085 stub midiOutPrepareHeader
+0086 stub midiOutReset
+0087 stub midiOutSetVolume
+0088 stub midiOutShortMsg
+0089 stub midiOutUnprepareHeader
+0090 stub midiStreamClose
+0091 stub midiStreamOpen
+0092 stub midiStreamOut
+0093 stub midiStreamPause
+0094 stub midiStreamPosition
+0095 stub midiStreamProperty
+0096 stub midiStreamRestart
+0097 stub midiStreamStop
+0098 stub mixerClose
+0099 stub mixerGetControlDetailsA
+0100 stub mixerGetControlDetailsW
+0101 stub mixerGetDevCapsA
+0102 stub mixerGetDevCapsW
+0103 stub mixerGetID
+0104 stub mixerGetLineControlsA
+0105 stub mixerGetLineControlsW
+0106 stub mixerGetLineInfoA
+0107 stub mixerGetLineInfoW
+0108 stub mixerGetNumDevs
+0109 stub mixerMessage
+0110 stub mixerOpen
+0111 stub mixerSetControlDetails
+0112 stub mmioAdvance
+0113 stub mmioAscend
+0114 stub mmioClose
+0115 stub mmioCreateChunk
+0116 stub mmioDescend
+0117 stub mmioFlush
+0118 stub mmioGetInfo
+0119 stub mmioInstallIOProc16
+0120 stub mmioInstallIOProcA
+0121 stub mmioInstallIOProcW
+0122 stub mmioOpenA
+0123 stub mmioOpenW
+0124 stub mmioRead
+0125 stub mmioRenameA
+0126 stub mmioRenameW
+0127 stub mmioSeek
+0128 stub mmioSendMessage
+0129 stub mmioSetBuffer
+0130 stub mmioSetInfo
+0131 stub mmioStringToFOURCCA
+0132 stub mmioStringToFOURCCW
+0133 stub mmioWrite
+0134 stub mmsystemGetVersion
+0135 stub sndPlaySoundA
+0136 stub sndPlaySoundW
+0137 stub timeBeginPeriod
+0138 stub timeEndPeriod
+0139 stub timeGetDevCaps
+0140 stub timeGetSystemTime
+0141 stub timeGetTime
+0142 stub timeKillEvent
+0143 stub timeSetEvent
+0144 stub waveInAddBuffer
+0145 stub waveInClose
+0146 stub waveInGetDevCapsA
+0147 stub waveInGetDevCapsW
+0148 stub waveInGetErrorTextA
+0149 stub waveInGetErrorTextW
+0150 stub waveInGetID
+0151 stub waveInGetNumDevs
+0152 stub waveInGetPosition
+0153 stub waveInMessage
+0154 stub waveInOpen
+0155 stub waveInPrepareHeader
+0156 stub waveInReset
+0157 stub waveInStart
+0158 stub waveInStop
+0159 stub waveInUnprepareHeader
+0160 stub waveOutBreakLoop
+0161 stub waveOutClose
+0162 stub waveOutGetDevCapsA
+0163 stub waveOutGetDevCapsW
+0164 stub waveOutGetErrorTextA
+0165 stub waveOutGetErrorTextW
+0166 stub waveOutGetID
+0167 stdcall waveOutGetNumDevs() waveOutGetNumDevs
+0168 stub waveOutGetPitch
+0169 stub waveOutGetPlaybackRate
+0170 stub waveOutGetPosition
+0171 stub waveOutGetVolume
+0172 stub waveOutMessage
+0173 stub waveOutOpen
+0174 stub waveOutPause
+0175 stub waveOutPrepareHeader
+0176 stub waveOutReset
+0177 stub waveOutRestart
+0178 stub waveOutSetPitch
+0179 stub waveOutSetPlaybackRate
+0180 stub waveOutSetVolume
+0181 stub waveOutUnprepareHeader
+0182 stub waveOutWrite
+0183 stub winmmf_ThunkData32
+0184 stub winmmsl_ThunkData32
diff --git a/if1632/wprocs.spec b/if1632/wprocs.spec
index 531b647..4e47f58 100644
--- a/if1632/wprocs.spec
+++ b/if1632/wprocs.spec
@@ -1,6 +1,7 @@
name wprocs
type win16
+1 pascal WINPROC_CallProc16To32A(word word word long long) WINPROC_CallProc16To32A
2 pascal StaticWndProc(word word word long) StaticWndProc
3 pascal ScrollBarWndProc(word word word long) ScrollBarWndProc
4 pascal ListBoxWndProc(word word word long) ListBoxWndProc
@@ -25,7 +26,6 @@
26 register Win32CallToStart() PE_Win32CallToStart
27 pascal EntryAddrProc(word word) MODULE_GetEntryPoint
28 pascal MyAlloc(word word word) MODULE_AllocateSegment
-29 pascal16 ActivateAppProc(word long) ACTIVATEAPP_callback
30 pascal FormatCharDlgProc(word word word long) FormatCharDlgProc
31 pascal16 FontStyleEnumProc(ptr ptr word long) FontStyleEnumProc
32 pascal16 FontFamilyEnumProc(ptr ptr word long) FontFamilyEnumProc
diff --git a/include/callback.h b/include/callback.h
index 537cfa9..b45373b 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -24,6 +24,7 @@
#ifndef WINELIB
+extern WORD CallTo16_word_w (FARPROC16, WORD, WORD);
extern WORD CallTo16_word_ww (FARPROC16, WORD, WORD, WORD);
extern WORD CallTo16_word_wl (FARPROC16, WORD, WORD, LONG);
extern WORD CallTo16_word_ll (FARPROC16, WORD, LONG, LONG);
@@ -36,6 +37,7 @@
extern WORD CallTo16_word_lwww (FARPROC16, WORD, LONG, WORD, WORD, WORD);
extern WORD CallTo16_word_wwll (FARPROC16, WORD, WORD, WORD, LONG, LONG);
extern WORD CallTo16_word_wllwl(FARPROC16, WORD, WORD, LONG, LONG, WORD, LONG);
+extern LONG CallTo16_long_lwwll(FARPROC16, WORD, LONG, WORD, WORD, LONG, LONG);
extern WORD CallTo16_word_wwlll(FARPROC16, WORD, WORD, WORD, LONG, LONG, LONG);
extern LONG CallTo16_long_lllllllwlwwwl( FARPROC16, WORD, LONG, LONG, LONG,
LONG, LONG, LONG, LONG, WORD, LONG,
@@ -44,6 +46,10 @@
extern WORD CallTo16_regs_( FARPROC16 func, WORD ds, WORD es, WORD bp, WORD ax,
WORD bx, WORD cx, WORD dx, WORD si, WORD di );
+#define CallDCHookProc( func, hdc, code, data, lparam) \
+ CallTo16_word_wwll( func, CURRENT_DS, hdc, code, data, lparam )
+#define CallDriverProc( func, dwId, msg, hdrvr, lparam1, lparam2 ) \
+ CallTo16_long_lwwll( func, CURRENT_DS, dwId, msg, hdrvr, lparam1, lparam2 )
#define CallEnumChildProc( func, hwnd, lParam ) \
CallTo16_word_wl( func, CURRENT_DS, hwnd, lParam )
#define CallEnumFontFamProc( func, lpfont, lpmetric, type, lParam ) \
@@ -58,7 +64,7 @@
CallTo16_word_wlw( func, CURRENT_DS, hwnd, lpstr, data )
#define CallEnumTaskWndProc( func, hwnd, lParam ) \
CallTo16_word_wl( func, CURRENT_DS, hwnd, lParam )
-#define CallEnumWindowsProc( func, hwnd, lParam ) \
+#define CallEnumWindowsProc16( func, hwnd, lParam ) \
CallTo16_word_wl( func, CURRENT_DS, hwnd, lParam )
#define CallLineDDAProc( func, xPos, yPos, lParam ) \
CallTo16_word_wwl( func, CURRENT_DS, xPos, yPos, lParam )
@@ -68,12 +74,12 @@
CallTo16_long_wwl( func, CURRENT_DS, code, wParam, lParam )
#define CallTimeFuncProc( func, id, msg, dwUser, dw1, dw2 ) \
CallTo16_word_wwlll( func, CURRENT_DS, id, msg, dwUser, dw1, dw2 )
+#define CallWindowsExitProc( func, nExitType ) \
+ CallTo16_word_w( func, CURRENT_DS, nExitType )
#define CallWndProc16( func, ds, hwnd, msg, wParam, lParam ) \
CallTo16_long_wwwl( func, ds, hwnd, msg, wParam, lParam )
#define CallWordBreakProc( func, lpch, ichCurrent, cch, code ) \
CallTo16_word_lwww( func, CURRENT_DS, lpch, ichCurrent, cch, code )
-#define CallDCHookProc( func, hdc, code, data, lparam) \
- CallTo16_word_wwll( func, CURRENT_DS, hdc, code, data, lparam )
#define CallWndProcNCCREATE16( func, ds, exStyle, clsName, winName, style, \
x, y, cx, cy, hparent, hmenu, instance, \
params, hwnd, msg, wParam, lParam ) \
@@ -86,6 +92,7 @@
/* by the build program to generate the file if1632/callto32.S */
extern LONG CallTo32_0( FARPROC32 );
+extern LONG CallTo32_2( FARPROC32, DWORD, DWORD );
extern LONG CallTo32_3( FARPROC32, DWORD, DWORD, DWORD );
extern LONG CallTo32_4( FARPROC32, DWORD, DWORD, DWORD, DWORD );
@@ -93,12 +100,18 @@
CallTo32_0( func )
#define CallDLLEntryProc32( func, hmodule, a, b ) \
CallTo32_3( func, hmodule, a, b )
+#define CallEnumWindowsProc32( func, hwnd, lParam ) \
+ CallTo32_2( func, hwnd, lParam )
#define CallWndProc32( func, hwnd, msg, wParam, lParam ) \
CallTo32_4( func, hwnd, msg, wParam, lParam )
#else /* WINELIB */
+#define CallDCHookProc( func, hdc, code, data, lparam ) \
+ (*func)( hdc, code, data, lparam )
+#define CallDriverProc( func, dwId, msg, hdrvr, lparam1, lparam2 ) \
+ (*func)( dwId, msg, hdrvr, lparam1, lparam2 )
#define CallEnumChildProc( func, hwnd, lParam ) \
(*func)( hwnd, lParam )
#define CallEnumFontFamProc( func, lpfont, lpmetric, type, lParam ) \
@@ -113,7 +126,9 @@
(*func)( hwnd, (LPCTSTR)(lpstr), data )
#define CallEnumTaskWndProc( func, hwnd, lParam ) \
(*func)( hwnd, lParam )
-#define CallEnumWindowsProc( func, hwnd, lParam ) \
+#define CallEnumWindowsProc16( func, hwnd, lParam ) \
+ (*func)( hwnd, lParam )
+#define CallEnumWindowsProc32( func, hwnd, lParam ) \
(*func)( hwnd, lParam )
#define CallLineDDAProc( func, xPos, yPos, lParam ) \
(*func)( xPos, yPos, lParam )
@@ -123,16 +138,15 @@
(*func)( code, wParam, lParam )
#define CallTimeFuncProc( func, id, msg, dwUser, dw1, dw2 ) \
(*func)( id, msg, dwUser, dw1, dw2 )
+#define CallWindowsExitProc( func, nExitType ) \
+ (*func)( nExitType )
#define CallWndProc16( func, ds, hwnd, msg, wParam, lParam ) \
(*func)( hwnd, msg, wParam, lParam )
#define CallWndProc32( func, hwnd, msg, wParam, lParam ) \
(*func)( hwnd, msg, wParam, lParam )
-#define CallDCHookProc( func, hdc, code, data, lparam ) \
- (*func)( hdc, code, data, lparam )
#define CallWordBreakProc( func, lpch, ichCurrent, cch, code ) \
(*func)( lpch, ichCurrent, cch, code )
-
#endif /* WINELIB */
diff --git a/include/class.h b/include/class.h
index 8cd8d06..dda909c 100644
--- a/include/class.h
+++ b/include/class.h
@@ -8,6 +8,7 @@
#define CLASS_H
#include "windows.h"
+#include "winproc.h"
#define CLASS_MAGIC ('C' | ('L' << 8) | ('A' << 16) | ('S' << 24))
@@ -17,7 +18,7 @@
UINT32 magic; /* Magic number */
UINT32 cWindows; /* Count of existing windows */
UINT32 style; /* Class style */
- HANDLE32 winproc; /* Window procedure */
+ HWINDOWPROC winproc; /* Window procedure */
INT32 cbClsExtra; /* Class extra bytes */
INT32 cbWndExtra; /* Window extra bytes */
LPSTR menuNameA; /* Default menu name (ASCII string) */
@@ -34,7 +35,7 @@
extern void CLASS_DumpClass( CLASS *class );
extern void CLASS_WalkClasses(void);
-extern void CLASS_FreeModuleClasses( HMODULE hModule );
+extern void CLASS_FreeModuleClasses( HMODULE16 hModule );
extern CLASS *CLASS_FindClassByAtom( ATOM atom, HINSTANCE16 hinstance );
extern CLASS * CLASS_FindClassByName( SEGPTR name, HINSTANCE hinstance );
diff --git a/include/debugger.h b/include/debugger.h
index 866e202..6cb3e97 100644
--- a/include/debugger.h
+++ b/include/debugger.h
@@ -61,29 +61,28 @@
EXEC_STEP_INSTR /* Single-stepping an instruction */
};
-extern struct sigcontext_struct *DEBUG_context; /* debugger/registers.c */
+extern SIGCONTEXT *DEBUG_context; /* debugger/registers.c */
extern unsigned int dbg_mode;
/* debugger/break.c */
-extern void DEBUG_SetBreakpoints( BOOL set );
+extern void DEBUG_SetBreakpoints( BOOL32 set );
extern int DEBUG_FindBreakpoint( const DBG_ADDR *addr );
extern void DEBUG_AddBreakpoint( const DBG_ADDR *addr );
extern void DEBUG_DelBreakpoint( int num );
-extern void DEBUG_EnableBreakpoint( int num, BOOL enable );
+extern void DEBUG_EnableBreakpoint( int num, BOOL32 enable );
extern void DEBUG_InfoBreakpoints(void);
-extern BOOL DEBUG_HandleTrap( struct sigcontext_struct *context );
-extern BOOL DEBUG_ShouldContinue( struct sigcontext_struct *context,
- enum exec_mode mode );
-extern void DEBUG_RestartExecution( struct sigcontext_struct *context,
- enum exec_mode mode, int instr_len );
+extern BOOL32 DEBUG_HandleTrap( SIGCONTEXT *context );
+extern BOOL32 DEBUG_ShouldContinue( SIGCONTEXT *context, enum exec_mode mode );
+extern void DEBUG_RestartExecution( SIGCONTEXT *context, enum exec_mode mode,
+ int instr_len );
/* debugger/db_disasm.c */
extern void DEBUG_Disasm( DBG_ADDR *addr );
/* debugger/hash.c */
extern void DEBUG_AddSymbol( const char *name, const DBG_ADDR *addr );
-extern BOOL DEBUG_GetSymbolValue( const char * name, DBG_ADDR *addr );
-extern BOOL DEBUG_SetSymbolValue( const char * name, const DBG_ADDR *addr );
+extern BOOL32 DEBUG_GetSymbolValue( const char * name, DBG_ADDR *addr );
+extern BOOL32 DEBUG_SetSymbolValue( const char * name, const DBG_ADDR *addr );
extern const char * DEBUG_FindNearestSymbol( const DBG_ADDR *addr );
extern void DEBUG_ReadSymbolTable( const char * filename );
extern void DEBUG_LoadEntryPoints(void);
@@ -95,8 +94,8 @@
extern void DEBUG_List( DBG_ADDR *addr, int count );
/* debugger/memory.c */
-extern BOOL DEBUG_IsBadReadPtr( const DBG_ADDR *address, int size );
-extern BOOL DEBUG_IsBadWritePtr( const DBG_ADDR *address, int size );
+extern BOOL32 DEBUG_IsBadReadPtr( const DBG_ADDR *address, int size );
+extern BOOL32 DEBUG_IsBadWritePtr( const DBG_ADDR *address, int size );
extern int DEBUG_ReadMemory( const DBG_ADDR *address );
extern void DEBUG_WriteMemory( const DBG_ADDR *address, int value );
extern void DEBUG_ExamineMemory( const DBG_ADDR *addr, int count, char format);
@@ -112,6 +111,6 @@
/* debugger/dbg.y */
extern void DEBUG_EnterDebugger(void);
-extern void wine_debug( int signal, struct sigcontext_struct * regs );
+extern void wine_debug( int signal, SIGCONTEXT *regs );
#endif /* DEBUGGER_H */
diff --git a/include/dialog.h b/include/dialog.h
index bb4b677..fefdc45 100644
--- a/include/dialog.h
+++ b/include/dialog.h
@@ -8,6 +8,7 @@
#define DIALOG_H
#include "windows.h"
+#include "winproc.h"
/* Dialog info structure.
* This structure is stored into the window extra bytes (cbWndExtra).
@@ -15,16 +16,16 @@
*/
typedef struct
{
- INT32 msgResult; /* Result of EndDialog() / Default button id */
- HANDLE32 dlgProc; /* Dialog procedure */
- LONG userInfo; /* User information (for DWL_USER) */
- HWND hwndFocus; /* Current control with focus */
- HFONT hUserFont; /* Dialog font */
- HMENU hMenu; /* Dialog menu */
- WORD xBaseUnit; /* Dialog units (depends on the font) */
- WORD yBaseUnit;
- WORD fEnd; /* EndDialog() called for this dialog */
- HANDLE hDialogHeap;
+ INT32 msgResult; /* Result of EndDialog() / Default button id */
+ HWINDOWPROC dlgProc; /* Dialog procedure */
+ LONG userInfo; /* User information (for DWL_USER) */
+ HWND hwndFocus; /* Current control with focus */
+ HFONT hUserFont; /* Dialog font */
+ HMENU hMenu; /* Dialog menu */
+ WORD xBaseUnit; /* Dialog units (depends on the font) */
+ WORD yBaseUnit;
+ WORD fEnd; /* EndDialog() called for this dialog */
+ HANDLE hDialogHeap;
} DIALOGINFO;
extern BOOL DIALOG_Init(void);
diff --git a/include/directory.h b/include/directory.h
index c466af8..28e5d64 100644
--- a/include/directory.h
+++ b/include/directory.h
@@ -11,7 +11,6 @@
extern UINT DIR_GetWindowsUnixDir( LPSTR path, UINT count );
extern UINT DIR_GetSystemUnixDir( LPSTR path, UINT count );
extern UINT DIR_GetTempUnixDir( LPSTR path, UINT count );
-extern UINT DIR_GetTempDosDir( LPSTR path, UINT count );
extern UINT DIR_GetDosPath( int element, LPSTR path, UINT count );
extern UINT DIR_GetUnixPath( int element, LPSTR path, UINT count );
diff --git a/include/driver.h b/include/driver.h
index 5c2a08e..63e0651 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -37,29 +37,32 @@
LPCSTR lpszDCIAliasName;
} DRVCONFIGINFO, *LPDRVCONFIGINFO;
-typedef struct {
- UINT length;
- HDRVR hDriver;
- HINSTANCE hModule;
- char szAliasName[128];
-} DRIVERINFOSTRUCT, *LPDRIVERINFOSTRUCT;
+typedef struct
+{
+ UINT16 length;
+ HDRVR16 hDriver;
+ HINSTANCE16 hModule;
+ CHAR szAliasName[128];
+} DRIVERINFOSTRUCT16, *LPDRIVERINFOSTRUCT16;
-typedef struct {
- DRIVERINFOSTRUCT dis;
- WORD count;
- void *lpPrevItem;
- void *lpNextItem;
- DRIVERPROC lpDrvProc;
+typedef struct tagDRIVERITEM
+{
+ DRIVERINFOSTRUCT16 dis;
+ WORD count;
+ struct tagDRIVERITEM *lpPrevItem;
+ struct tagDRIVERITEM *lpNextItem;
+ DRIVERPROC lpDrvProc;
} DRIVERITEM, *LPDRIVERITEM;
-LRESULT DefDriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg,
- DWORD dwParam1, DWORD dwParam2);
-HDRVR OpenDriver(LPSTR szDriverName, LPSTR szSectionName, LPARAM lParam2);
-LRESULT CloseDriver(HDRVR hDriver, LPARAM lParam1, LPARAM lParam2);
-LRESULT SendDriverMessage(HDRVR hDriver, WORD message, LPARAM lParam1, LPARAM lParam2);
-HINSTANCE GetDriverModuleHandle(HDRVR hDriver);
-HDRVR GetNextDriver(HDRVR, DWORD);
-BOOL GetDriverInfo(HDRVR, DRIVERINFOSTRUCT *);
+LRESULT DefDriverProc(DWORD dwDevID, HDRVR hDriv, UINT16 wMsg,
+ LPARAM dwParam1, LPARAM dwParam2);
+HDRVR16 OpenDriver(LPSTR szDriverName, LPSTR szSectionName, LPARAM lParam2);
+LRESULT CloseDriver(HDRVR16 hDriver, LPARAM lParam1, LPARAM lParam2);
+LRESULT SendDriverMessage( HDRVR16 hDriver, UINT16 message, LPARAM lParam1,
+ LPARAM lParam2 );
+HMODULE16 GetDriverModuleHandle(HDRVR16 hDriver);
+HDRVR16 GetNextDriver(HDRVR16, DWORD);
+BOOL16 GetDriverInfo(HDRVR16, DRIVERINFOSTRUCT16 *);
diff --git a/include/file.h b/include/file.h
index 82f7b80..8a63e3d 100644
--- a/include/file.h
+++ b/include/file.h
@@ -18,8 +18,6 @@
extern int FILE_SetDateTime( HFILE hFile, WORD date, WORD time );
extern int FILE_Fstat( HFILE hFile, BYTE *pattr, DWORD *psize,
WORD *pdate, WORD *ptime );
-extern int FILE_Unlink( LPCSTR path );
-extern int FILE_RemoveDir( LPCSTR path );
extern HFILE FILE_Dup( HFILE hFile );
extern HFILE FILE_Dup2( HFILE hFile1, HFILE hFile2 );
extern INT32 FILE_Read( HFILE hFile, LPVOID buffer, UINT32 count );
diff --git a/include/gdi.h b/include/gdi.h
index 398b9c5..7bb9aa1 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -34,7 +34,7 @@
typedef struct tagGDIOBJHDR
{
- HANDLE hNext;
+ HANDLE16 hNext;
WORD wMagic;
DWORD dwCount;
WORD wMetaList;
@@ -86,16 +86,16 @@
int flags;
DeviceCaps *devCaps;
- HANDLE hMetaFile;
- HRGN hClipRgn; /* Clip region (may be 0) */
- HRGN hVisRgn; /* Visible region (must never be 0) */
- HRGN hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */
+ HANDLE16 hMetaFile;
+ HRGN16 hClipRgn; /* Clip region (may be 0) */
+ HRGN16 hVisRgn; /* Visible region (must never be 0) */
+ HRGN16 hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */
HPEN16 hPen;
- HBRUSH hBrush;
- HFONT hFont;
- HBITMAP hBitmap;
- HBITMAP hFirstBitmap; /* Bitmap selected at creation of the DC */
- HANDLE hDevice;
+ HBRUSH16 hBrush;
+ HFONT16 hFont;
+ HBITMAP16 hBitmap;
+ HBITMAP16 hFirstBitmap; /* Bitmap selected at creation of the DC */
+ HANDLE16 hDevice;
HPALETTE16 hPalette;
WORD ROPmode;
@@ -164,8 +164,8 @@
/* X physical palette information */
typedef struct
{
- HANDLE hMapping; /* Color mapping table (or 0 for identity) */
- HANDLE hRevMapping; /* Reverse color mapping table */
+ HANDLE16 hMapping; /* Color mapping table (or 0 for identity) */
+ HANDLE16 hRevMapping; /* Reverse color mapping table */
WORD mappingSize;
} X_PHYSPALETTE;
@@ -187,7 +187,7 @@
WORD saveLevel;
DWORD dwHookData;
FARPROC16 hookProc;
- HDC hSelf;
+ HDC16 hSelf;
WIN_DC_INFO w;
union
{
@@ -275,10 +275,10 @@
#endif /* WINELIB */
-extern BOOL GDI_Init(void);
-extern HANDLE GDI_AllocObject( WORD, WORD );
-extern BOOL GDI_FreeObject( HANDLE );
-extern GDIOBJHDR * GDI_GetObjPtr( HANDLE, WORD );
+extern BOOL32 GDI_Init(void);
+extern HANDLE16 GDI_AllocObject( WORD, WORD );
+extern BOOL32 GDI_FreeObject( HANDLE16 );
+extern GDIOBJHDR * GDI_GetObjPtr( HANDLE16, WORD );
extern FARPROC16 GDI_GetDefDCHook(void);
extern Display * display;
diff --git a/include/hook.h b/include/hook.h
index 23aa709..eb04e86 100644
--- a/include/hook.h
+++ b/include/hook.h
@@ -18,12 +18,12 @@
/* Hook data (pointed to by a HHOOK) */
typedef struct
{
- HANDLE next; /* 00 Next hook in chain */
- HOOKPROC proc WINE_PACKED; /* 02 Hook procedure */
- short id; /* 06 Hook id (WH_xxx) */
- HQUEUE ownerQueue; /* 08 Owner queue (0 for system hook) */
- HMODULE ownerModule; /* 0a Owner module */
- WORD inHookProc; /* 0c TRUE if in this->proc */
+ HANDLE16 next; /* 00 Next hook in chain */
+ HOOKPROC proc WINE_PACKED; /* 02 Hook procedure */
+ short id; /* 06 Hook id (WH_xxx) */
+ HQUEUE16 ownerQueue; /* 08 Owner queue (0 for system hook) */
+ HMODULE16 ownerModule; /* 0a Owner module */
+ WORD inHookProc; /* 0c TRUE if in this->proc */
} HOOKDATA;
#ifndef WINELIB
@@ -35,7 +35,7 @@
extern HANDLE HOOK_GetHook( short id , HQUEUE hQueue );
extern DWORD HOOK_CallHooks( short id, short code,
WPARAM wParam, LPARAM lParam );
-extern void HOOK_FreeModuleHooks( HMODULE hModule );
-extern void HOOK_FreeQueueHooks( HQUEUE hQueue );
+extern void HOOK_FreeModuleHooks( HMODULE16 hModule );
+extern void HOOK_FreeQueueHooks( HQUEUE16 hQueue );
#endif /* __WINE_HOOK_H */
diff --git a/include/kernel32.h b/include/kernel32.h
index 834cc2f..ab3b567 100644
--- a/include/kernel32.h
+++ b/include/kernel32.h
@@ -27,7 +27,7 @@
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
- HANDLE hEvent;
+ HANDLE32 hEvent;
} OVERLAPPED, *LPOVERLAPPED;
/* Process startup information.
@@ -48,9 +48,9 @@
WORD wShowWindow;
WORD cbReserved2;
BYTE *lpReserved2;
- HANDLE hStdInput;
- HANDLE hStdOutput;
- HANDLE hStdError;
+ HANDLE32 hStdInput;
+ HANDLE32 hStdOutput;
+ HANDLE32 hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
typedef struct {
@@ -119,6 +119,6 @@
#define FILE_ATTRIBUTE_ATOMIC_WRITE 0x0200
#define FILE_ATTRIBUTE_XACTION_WRITE 0x0400
-BOOL SetTimeZoneInformation(const TIME_ZONE_INFORMATION*);
+BOOL32 SetTimeZoneInformation(const TIME_ZONE_INFORMATION*);
#endif /* __WINE_KERNEL32_H */
diff --git a/include/local.h b/include/local.h
index 5561078..114a92f 100644
--- a/include/local.h
+++ b/include/local.h
@@ -23,6 +23,6 @@
extern UINT16 LOCAL_HeapSize( HANDLE16 ds );
extern UINT16 LOCAL_CountFree( HANDLE16 ds );
extern LPSTR LOCAL_Lock( HANDLE16 ds, HLOCAL16 handle );
-extern BOOL LOCAL_Unlock( HANDLE16 ds, HLOCAL16 handle );
+extern BOOL16 LOCAL_Unlock( HANDLE16 ds, HLOCAL16 handle );
#endif /* __WINE_LOCAL_H */
diff --git a/include/miscemu.h b/include/miscemu.h
index 0ee35f6..dd05077 100644
--- a/include/miscemu.h
+++ b/include/miscemu.h
@@ -17,7 +17,7 @@
extern HANDLE DOSMEM_BiosSeg;
/* miscemu/instr.c */
-extern BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context );
+extern BOOL INSTR_EmulateInstruction( SIGCONTEXT *context );
/* miscemu/interrupts.c */
extern BOOL INT_Init(void);
diff --git a/include/module.h b/include/module.h
index 6ded804..4eed450 100644
--- a/include/module.h
+++ b/include/module.h
@@ -20,7 +20,7 @@
WORD magic; /* 00 'NE' signature */
WORD count; /* 02 Usage count */
WORD entry_table; /* 04 Near ptr to entry table */
- HMODULE next; /* 06 Selector to next module */
+ HMODULE16 next; /* 06 Selector to next module */
WORD dgroup_entry; /* 08 Near ptr to segment entry for DGROUP */
WORD fileinfo; /* 0a Near ptr to file info (OFSTRUCT) */
WORD flags; /* 0c Module flags */
@@ -45,13 +45,13 @@
WORD truetype; /* 34 Set to 2 if TrueType font */
BYTE os_flags; /* 36 Operating system flags */
BYTE misc_flags; /* 37 Misc. flags */
- HANDLE dlls_to_init; /* 38 List of DLLs to initialize */
- HANDLE nrname_handle; /* 3a Handle to non-resident name table */
+ HANDLE16 dlls_to_init; /* 38 List of DLLs to initialize */
+ HANDLE16 nrname_handle; /* 3a Handle to non-resident name table */
WORD min_swap_area; /* 3c Min. swap area size */
WORD expected_version; /* 3e Expected Windows version */
/* From here, these are extra fields not present in normal Windows */
PE_MODULE *pe_module; /* 40 PE module handle for Win32 modules */
- HMODULE self; /* 44 Handle for this module */
+ HMODULE16 self; /* 44 Handle for this module */
WORD self_loading_sel; /* 46 Selector used for self-loading apps. */
} NE_MODULE;
@@ -59,11 +59,11 @@
/* In-memory segment table */
typedef struct
{
- WORD filepos; /* Position in file, in sectors */
- WORD size; /* Segment size on disk */
- WORD flags; /* Segment flags */
- WORD minsize; /* Min. size of segment in memory */
- HANDLE selector; /* Selector of segment in memory */
+ WORD filepos; /* Position in file, in sectors */
+ WORD size; /* Segment size on disk */
+ WORD flags; /* Segment flags */
+ WORD minsize; /* Min. size of segment in memory */
+ HANDLE16 selector; /* Selector of segment in memory */
} SEGTABLEENTRY;
@@ -71,27 +71,27 @@
typedef struct
{
- WORD version; /* Must be 0xA0 */
- WORD reserved;
- FARPROC BootApp; /* startup procedure */
- FARPROC LoadAppSeg; /* procedure to load a segment */
- FARPROC reserved2;
- FARPROC MyAlloc; /* memory allocation procedure,
- * wine must write this field */
- FARPROC EntryAddrProc;
- FARPROC ExitProc; /* exit procedure */
- WORD reserved3[4];
- FARPROC SetOwner; /* Set Owner procedure, exported by wine */
+ WORD version; /* Must be 0xA0 */
+ WORD reserved;
+ FARPROC16 BootApp; /* startup procedure */
+ FARPROC16 LoadAppSeg; /* procedure to load a segment */
+ FARPROC16 reserved2;
+ FARPROC16 MyAlloc; /* memory allocation procedure,
+ * wine must write this field */
+ FARPROC16 EntryAddrProc;
+ FARPROC16 ExitProc; /* exit procedure */
+ WORD reserved3[4];
+ FARPROC16 SetOwner; /* Set Owner procedure, exported by wine */
} SELFLOADHEADER;
/* Parameters for LoadModule() */
typedef struct
{
- HANDLE hEnvironment; /* Environment segment */
- SEGPTR cmdLine; /* Command-line */
- SEGPTR showCmd; /* Code for ShowWindow() */
- SEGPTR reserved;
+ HANDLE16 hEnvironment; /* Environment segment */
+ SEGPTR cmdLine; /* Command-line */
+ SEGPTR showCmd; /* Code for ShowWindow() */
+ SEGPTR reserved;
} LOADPARAMS;
/* Resource types */
@@ -116,30 +116,31 @@
#endif
/* module.c */
-extern NE_MODULE *MODULE_GetPtr( HMODULE hModule );
-extern void MODULE_DumpModule( HMODULE hmodule );
+extern NE_MODULE *MODULE_GetPtr( HMODULE16 hModule );
+extern void MODULE_DumpModule( HMODULE16 hmodule );
extern void MODULE_WalkModules(void);
-extern int MODULE_OpenFile( HMODULE hModule );
-extern LPSTR MODULE_GetModuleName( HMODULE hModule );
+extern int MODULE_OpenFile( HMODULE16 hModule );
+extern LPSTR MODULE_GetModuleName( HMODULE16 hModule );
extern void MODULE_RegisterModule( NE_MODULE *pModule );
-extern HINSTANCE MODULE_GetInstance( HMODULE hModule );
-extern WORD MODULE_GetOrdinal( HMODULE hModule, const char *name );
-extern SEGPTR MODULE_GetEntryPoint( HMODULE hModule, WORD ordinal );
-extern BOOL MODULE_SetEntryPoint( HMODULE hModule, WORD ordinal, WORD offset );
+extern HINSTANCE16 MODULE_GetInstance( HMODULE16 hModule );
+extern WORD MODULE_GetOrdinal( HMODULE16 hModule, const char *name );
+extern SEGPTR MODULE_GetEntryPoint( HMODULE16 hModule, WORD ordinal );
+extern BOOL16 MODULE_SetEntryPoint( HMODULE16 hModule, WORD ordinal,
+ WORD offset );
extern FARPROC16 MODULE_GetWndProcEntry16( const char *name );
/* builtin.c */
-extern BOOL BUILTIN_Init(void);
-extern HMODULE BUILTIN_LoadModule( LPCSTR name, BOOL force );
+extern BOOL16 BUILTIN_Init(void);
+extern HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL16 force );
extern NE_MODULE *BUILTIN_GetEntryPoint( WORD cs, WORD ip,
WORD *pOrd, char **ppName );
extern DWORD BUILTIN_GetProcAddress32( NE_MODULE *pModule, char *function );
-extern BOOL BUILTIN_ParseDLLOptions( const char *str );
+extern BOOL16 BUILTIN_ParseDLLOptions( const char *str );
extern void BUILTIN_PrintDLLs(void);
/* ne_image.c */
-extern BOOL NE_LoadSegment( HMODULE hModule, WORD segnum );
+extern BOOL16 NE_LoadSegment( HMODULE16 hModule, WORD segnum );
extern void NE_FixupPrologs( NE_MODULE *pModule );
-extern void NE_InitializeDLLs( HMODULE hModule );
+extern void NE_InitializeDLLs( HMODULE16 hModule );
#endif /* _WINE_MODULE_H */
diff --git a/include/pe_image.h b/include/pe_image.h
index b9c74d8..a60c893 100644
--- a/include/pe_image.h
+++ b/include/pe_image.h
@@ -19,7 +19,7 @@
typedef struct pe_data PE_MODULE;
-extern int PE_unloadImage(HMODULE hModule);
+extern int PE_unloadImage(HMODULE32 hModule);
extern void my_wcstombs(char * result, u_short * source, int len);
#endif /* __WINE_PE_IMAGE_H */
diff --git a/include/queue.h b/include/queue.h
index cffd7e3..f0e254f 100644
--- a/include/queue.h
+++ b/include/queue.h
@@ -54,8 +54,8 @@
WORD wakeBits; /* 44 Queue wake-up bits */
WORD wakeMask; /* 46 Queue wake-up mask */
WORD SendMsgReturnPtrs[3]; /* 48 Near ptr to return values (?) */
- HANDLE hCurHook; /* 4e Current hook */
- HANDLE hooks[WH_NB_HOOKS]; /* 50 Task hooks list */
+ HANDLE16 hCurHook; /* 4e Current hook */
+ HANDLE16 hooks[WH_NB_HOOKS]; /* 50 Task hooks list */
WORD reserved4[3]; /* 68 Unknown */
QMSG messages[1]; /* 6e Queue messages */
} MESSAGEQUEUE;
diff --git a/include/region.h b/include/region.h
index 552f5c5..e73fc23 100644
--- a/include/region.h
+++ b/include/region.h
@@ -17,7 +17,7 @@
} RGNOBJ;
-extern BOOL REGION_DeleteObject( HRGN hrgn, RGNOBJ * obj );
-extern BOOL REGION_FrameRgn( HRGN dest, HRGN src, INT32 x, INT32 y );
+extern BOOL16 REGION_DeleteObject( HRGN32 hrgn, RGNOBJ * obj );
+extern BOOL16 REGION_FrameRgn( HRGN32 dest, HRGN32 src, INT32 x, INT32 y );
#endif /* __WINE_REGION_H */
diff --git a/include/registers.h b/include/registers.h
index 98f28ee..1f919a5 100644
--- a/include/registers.h
+++ b/include/registers.h
@@ -62,9 +62,6 @@
#define IP_reg(context) (*(WORD*)(&(context)->sc_eip))
#define SP_reg(context) (*(WORD*)(&(context)->sc_esp))
-#define SET_CFLAG(context) (EFL_reg(context) |= 0x0001)
-#define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe)
-
#else /* __svr4__ || _SCO_DS */
#ifdef _SCO_DS
@@ -123,9 +120,9 @@
#define SP_reg(context) (*(WORD*)(&(context)->uc_mcontext.gregs[ESP]))
#endif
+#endif /* __svr4__ || _SCO_DS */
+
#define SET_CFLAG(context) (EFL_reg(context) |= 0x0001)
#define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe)
-#endif /* __svr4__ || _SCO_DS */
-
#endif /* __WINE_REGISTERS_H */
diff --git a/include/selectors.h b/include/selectors.h
index e826d8d..f5e3800 100644
--- a/include/selectors.h
+++ b/include/selectors.h
@@ -11,10 +11,10 @@
#include "ldt.h"
extern WORD SELECTOR_AllocBlock( const void *base, DWORD size,
- enum seg_type type, BOOL is32bit,
- BOOL readonly );
+ enum seg_type type, BOOL32 is32bit,
+ BOOL32 readonly );
extern WORD SELECTOR_ReallocBlock( WORD sel, const void *base, DWORD size,
- enum seg_type type, BOOL is32bit,
- BOOL readonly );
+ enum seg_type type, BOOL32 is32bit,
+ BOOL32 readonly );
#endif /* __WINE_SELECTORS_H */
diff --git a/include/task.h b/include/task.h
index b00f6fb..f9a8b9c 100644
--- a/include/task.h
+++ b/include/task.h
@@ -13,10 +13,6 @@
#pragma pack(1)
#endif
-
-extern BOOL TASK_Init(void);
-extern void TASK_KillCurrentTask( int exitCode );
-
/* Process database (i.e. a normal DOS PSP) */
typedef struct
@@ -115,8 +111,10 @@
#pragma pack(4)
#endif
+extern BOOL TASK_Init(void);
extern HTASK TASK_CreateTask( HMODULE hModule, HANDLE hInstance,
HANDLE hPrevInstance, HANDLE hEnvironment,
char *cmdLine, WORD cmdShow );
+extern void TASK_KillCurrentTask( int exitCode );
#endif /* _WINE_TASK_H */
diff --git a/include/toolhelp.h b/include/toolhelp.h
index e161101..c1d9836 100644
--- a/include/toolhelp.h
+++ b/include/toolhelp.h
@@ -20,19 +20,19 @@
typedef struct
{
- DWORD dwSize;
- DWORD dwAddress;
- DWORD dwBlockSize;
- HGLOBAL hBlock;
- WORD wcLock;
- WORD wcPageLock;
- WORD wFlags;
- BOOL wHeapPresent;
- HGLOBAL hOwner;
- WORD wType;
- WORD wData;
- DWORD dwNext;
- DWORD dwNextAlt;
+ DWORD dwSize;
+ DWORD dwAddress;
+ DWORD dwBlockSize;
+ HGLOBAL16 hBlock;
+ WORD wcLock;
+ WORD wcPageLock;
+ WORD wFlags;
+ BOOL16 wHeapPresent;
+ HGLOBAL16 hOwner;
+ WORD wType;
+ WORD wData;
+ DWORD dwNext;
+ DWORD dwNextAlt;
} GLOBALENTRY;
/* GlobalFirst()/GlobalNext() flags */
@@ -74,11 +74,11 @@
/* wFlags values */
#define GF_PDB_OWNER 0x0100 /* Low byte is KERNEL flags */
-BOOL GlobalInfo( GLOBALINFO *pInfo );
-BOOL GlobalFirst( GLOBALENTRY *pGlobal, WORD wFlags );
-BOOL GlobalNext( GLOBALENTRY *pGlobal, WORD wFlags) ;
-BOOL GlobalEntryHandle( GLOBALENTRY *pGlobal, HGLOBAL16 hItem );
-BOOL GlobalEntryModule( GLOBALENTRY *pGlobal, HMODULE16 hModule, WORD wSeg );
+BOOL16 GlobalInfo( GLOBALINFO *pInfo );
+BOOL16 GlobalFirst( GLOBALENTRY *pGlobal, WORD wFlags );
+BOOL16 GlobalNext( GLOBALENTRY *pGlobal, WORD wFlags) ;
+BOOL16 GlobalEntryHandle( GLOBALENTRY *pGlobal, HGLOBAL16 hItem );
+BOOL16 GlobalEntryModule( GLOBALENTRY *pGlobal, HMODULE16 hModule, WORD wSeg );
/* Local heap */
@@ -152,55 +152,55 @@
#define LT_USER_HANDLETABLE 32
#define LT_USER_MAX LT_USER_HANDLETABLE
-BOOL LocalInfo( LOCALINFO *pLocalInfo, HGLOBAL handle );
-BOOL LocalFirst( LOCALENTRY *pLocalEntry, HGLOBAL handle );
-BOOL LocalNext( LOCALENTRY *pLocalEntry );
+BOOL16 LocalInfo( LOCALINFO *pLocalInfo, HGLOBAL16 handle );
+BOOL16 LocalFirst( LOCALENTRY *pLocalEntry, HGLOBAL16 handle );
+BOOL16 LocalNext( LOCALENTRY *pLocalEntry );
/* modules */
-typedef struct {
- DWORD dwSize;
- char szModule[MAX_MODULE_NAME + 1];
- HMODULE hModule;
- WORD wcUsage;
- char szExePath[MAX_PATH + 1];
- HANDLE wNext;
-} MODULEENTRY;
-typedef MODULEENTRY *LPMODULEENTRY;
+typedef struct
+{
+ DWORD dwSize;
+ char szModule[MAX_MODULE_NAME + 1];
+ HMODULE16 hModule;
+ WORD wcUsage;
+ char szExePath[MAX_PATH + 1];
+ HANDLE16 wNext;
+} MODULEENTRY, *LPMODULEENTRY;
-BOOL ModuleFirst(MODULEENTRY *lpModule);
-BOOL ModuleNext(MODULEENTRY *lpModule);
-BOOL ModuleFindName(MODULEENTRY *lpModule, LPCSTR lpstrName);
-BOOL ModuleFindHandle(MODULEENTRY *lpModule, HMODULE hModule);
+BOOL16 ModuleFirst(MODULEENTRY *lpModule);
+BOOL16 ModuleNext(MODULEENTRY *lpModule);
+BOOL16 ModuleFindName(MODULEENTRY *lpModule, LPCSTR lpstrName);
+BOOL16 ModuleFindHandle(MODULEENTRY *lpModule, HMODULE16 hModule);
/* tasks */
-typedef struct tagTASKENTRY {
- DWORD dwSize;
- HTASK hTask;
- HTASK hTaskParent;
- HINSTANCE hInst;
- HMODULE hModule;
- WORD wSS;
- WORD wSP;
- WORD wStackTop;
- WORD wStackMinimum;
- WORD wStackBottom;
- WORD wcEvents;
- HGLOBAL hQueue;
- char szModule[MAX_MODULE_NAME + 1];
- WORD wPSPOffset;
- HANDLE hNext;
-} TASKENTRY;
-typedef TASKENTRY *LPTASKENTRY;
+typedef struct
+{
+ DWORD dwSize;
+ HTASK16 hTask;
+ HTASK16 hTaskParent;
+ HINSTANCE16 hInst;
+ HMODULE16 hModule;
+ WORD wSS;
+ WORD wSP;
+ WORD wStackTop;
+ WORD wStackMinimum;
+ WORD wStackBottom;
+ WORD wcEvents;
+ HGLOBAL16 hQueue;
+ char szModule[MAX_MODULE_NAME + 1];
+ WORD wPSPOffset;
+ HANDLE16 hNext;
+} TASKENTRY, *LPTASKENTRY;
-BOOL TaskFirst(LPTASKENTRY lpTask);
-BOOL TaskNext(LPTASKENTRY lpTask);
-BOOL TaskFindHandle(LPTASKENTRY lpTask, HTASK hTask);
-DWORD TaskSetCSIP(HTASK hTask, WORD wCS, WORD wIP);
-DWORD TaskGetCSIP(HTASK hTask);
-BOOL TaskSwitch(HTASK hTask, DWORD dwNewCSIP);
+BOOL16 TaskFirst(LPTASKENTRY lpTask);
+BOOL16 TaskNext(LPTASKENTRY lpTask);
+BOOL16 TaskFindHandle(LPTASKENTRY lpTask, HTASK16 hTask);
+DWORD TaskSetCSIP(HTASK16 hTask, WORD wCS, WORD wIP);
+DWORD TaskGetCSIP(HTASK16 hTask);
+BOOL16 TaskSwitch(HTASK16 hTask, DWORD dwNewCSIP);
/* mem info */
@@ -221,15 +221,15 @@
typedef struct
{
- DWORD dwSize;
- WORD wUserFreePercent;
- WORD wGDIFreePercent;
- HGLOBAL hUserSegment;
- HGLOBAL hGDISegment;
+ DWORD dwSize;
+ WORD wUserFreePercent;
+ WORD wGDIFreePercent;
+ HGLOBAL16 hUserSegment;
+ HGLOBAL16 hGDISegment;
} SYSHEAPINFO;
-BOOL MemManInfo(LPMEMMANINFO lpEnhMode);
-BOOL SystemHeapInfo( SYSHEAPINFO *pHeapInfo );
+BOOL16 MemManInfo(LPMEMMANINFO lpEnhMode);
+BOOL16 SystemHeapInfo( SYSHEAPINFO *pHeapInfo );
/* timer info */
@@ -239,20 +239,20 @@
DWORD dwmsThisVM;
} TIMERINFO;
-BOOL TimerCount( TIMERINFO *pTimerInfo );
+BOOL16 TimerCount( TIMERINFO *pTimerInfo );
/* Window classes */
typedef struct
{
DWORD dwSize;
- HMODULE hInst; /* This is really an hModule */
+ HMODULE16 hInst; /* This is really an hModule */
char szClassName[MAX_CLASSNAME + 1];
- HANDLE wNext;
+ HANDLE16 wNext;
} CLASSENTRY;
-BOOL ClassFirst( CLASSENTRY *pClassEntry );
-BOOL ClassNext( CLASSENTRY *pClassEntry );
+BOOL16 ClassFirst( CLASSENTRY *pClassEntry );
+BOOL16 ClassNext( CLASSENTRY *pClassEntry );
/* Memory read/write */
@@ -267,7 +267,7 @@
#define NF_TASKSWITCH 1 /* get taskswitch information */
#define NF_RIP 2 /* get debugerrors of system */
-BOOL NotifyRegister(HTASK htask,FARPROC lpfnCallback,WORD wFlags);
+BOOL16 NotifyRegister(HTASK16 htask,FARPROC16 lpfnCallback,WORD wFlags);
#define NFY_UNKNOWN 0
#define NFY_LOADSEG 1
@@ -285,10 +285,10 @@
/* called when loading/starting a DLL */
#define NFY_STARTDLL 3
struct {
- DWORD dwSize;
- HMODULE hModule;
- WORD wCS;
- WORD wIP;
+ DWORD dwSize;
+ HMODULE16 hModule;
+ WORD wCS;
+ WORD wIP;
} NFYSTARTDLL;
/* called when starting a task. dwData is CS:IP */
@@ -331,16 +331,16 @@
#define NFY_LOGERROR 12
struct {
DWORD dwSize;
- UINT wErrCode;
+ UINT16 wErrCode;
VOID *lpInfo; /* depends on wErrCode */
} NFYLOGERROR;
/* called for parameter errors? */
#define NFY_LOGPARAMERROR 13
struct {
- DWORD dwSize;
- UINT wErrCode;
- FARPROC lpfnErrorAddr;
- void **lpBadParam;
+ DWORD dwSize;
+ UINT16 wErrCode;
+ FARPROC16 lpfnErrorAddr;
+ void **lpBadParam;
} NFYLOGPARAMERROR;
#endif /* __TOOLHELP_H */
diff --git a/include/win.h b/include/win.h
index 81e0c08..7a36cec 100644
--- a/include/win.h
+++ b/include/win.h
@@ -11,6 +11,7 @@
#include "ldt.h"
#include "class.h"
+#include "winproc.h"
#define WND_MAGIC 0x444e4957 /* 'WIND' */
@@ -34,7 +35,7 @@
struct tagWND *parent; /* Window parent (from CreateWindow) */
struct tagWND *owner; /* Window owner */
CLASS *class; /* Window class */
- HANDLE32 winproc; /* Window procedure */
+ HWINDOWPROC winproc; /* Window procedure */
DWORD dwMagic; /* Magic number (must be WND_MAGIC) */
HWND16 hwndSelf; /* Handle of this window */
HINSTANCE16 hInstance; /* Window hInstance (from CreateWindow) */
@@ -71,6 +72,7 @@
#define WIN_NEED_SIZE 0x0040 /* Internal WM_SIZE is needed */
#define WIN_NCACTIVATED 0x0080 /* last WM_NCACTIVATE was positive */
#define WIN_MANAGED 0x0100 /* Window managed by the X wm */
+#define WIN_ISDIALOG 0x0200 /* Window is a dialog */
/* Window functions */
extern WND *WIN_FindWndPtr( HWND hwnd );
@@ -86,6 +88,7 @@
extern BOOL WIN_CreateDesktopWindow(void);
extern HWND WIN_GetTopParent( HWND hwnd );
extern HINSTANCE WIN_GetWindowInstance( HWND hwnd );
+extern WND **WIN_BuildWinArray( WND *wndPtr );
extern void DEFWND_SetText( WND *wndPtr, LPCSTR text ); /* windows/defwnd.c */
diff --git a/include/winbase.h b/include/winbase.h
index 1a5317d..f221fa2 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -3,14 +3,6 @@
#include "wintypes.h"
-#ifdef UNICODE
-#define LoadAccelerators LoadAcceleratorsW
-#define TranslateAccelat
-#else
-#define LoadAccelerators LoadAcceleratorsA
-#endif
-
-
#define INVALID_HANDLE_VALUE ((HANDLE32) -1)
#define WAIT_FAILED 0xffffffff
@@ -116,8 +108,8 @@
LPVOID DebugInfo;
LONG LockCount;
LONG RecursionCount;
- HANDLE OwningThread;
- HANDLE LockSemaphore;
+ HANDLE32 OwningThread;
+ HANDLE32 LockSemaphore;
DWORD Reserved;
}CRITICAL_SECTION;
@@ -150,36 +142,16 @@
BOOL32 GetVersionEx32W(OSVERSIONINFO32W*);
#define GetVersionEx WINELIB_NAME_AW(GetVersionEx)
-int WinMain(HINSTANCE, HINSTANCE prev, char *cmd, int show);
+/*int WinMain(HINSTANCE, HINSTANCE prev, char *cmd, int show);*/
-#define GMEM_FIXED 0x0000
-#define GMEM_MOVEABLE 0x0002
-
-HACCEL32 LoadAcceleratorsA( HINSTANCE, const char *);
-#define FreeModule(hLibModule) FreeLibrary((hLibModule))
-#define MakeProcInstance(lpProc,hInstance) (lpProc)
-#define FreeProcInstance(lpProc) (lpProc)
-
+HACCEL32 LoadAcceleratorsA( HINSTANCE32, const char *);
void DeleteCriticalSection(CRITICAL_SECTION *lpCrit);
void EnterCriticalSection(CRITICAL_SECTION *lpCrit);
int GetCurrentProcessId(void);
-HANDLE32 GetProcessHeap(void);
-LPVOID HeapAlloc(HANDLE32,DWORD,DWORD);
-DWORD HeapCompact(HANDLE32,DWORD);
-HANDLE32 HeapCreate(DWORD,DWORD,DWORD);
-BOOL HeapDestroy(HANDLE32);
-BOOL HeapFree(HANDLE32,DWORD,LPVOID);
-BOOL HeapLock(HANDLE32);
-LPVOID HeapReAlloc(HANDLE32,DWORD,LPVOID,DWORD);
-DWORD HeapSize(HANDLE32,DWORD,LPVOID);
-BOOL HeapUnlock(HANDLE32);
-BOOL HeapValidate(HANDLE32,DWORD,LPVOID);
void InitializeCriticalSection(CRITICAL_SECTION *lpCrit);
void LeaveCriticalSection(CRITICAL_SECTION *lpCrit);
-HANDLE OpenProcess(DWORD access, BOOL inherit, DWORD id);
-int TerminateProcess(HANDLE h, int ret);
-LPVOID VirtualAlloc(LPVOID addr,DWORD size,DWORD type,DWORD protect);
-BOOL VirtualFree( LPVOID addr, DWORD size, DWORD type );
+HANDLE32 OpenProcess(DWORD access, BOOL32 inherit, DWORD id);
+int TerminateProcess(HANDLE32 h, int ret);
#endif /* __WINE_WINBASE_H */
diff --git a/include/windows.h b/include/windows.h
index 41d242b..16e6f80 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1,5 +1,3 @@
-/* Initial draft attempt of windows.h, by Peter MacDonald, pmacdona@sanjuan.uvic.ca */
-
#ifndef __WINE_WINDOWS_H
#define __WINE_WINDOWS_H
@@ -478,6 +476,10 @@
#define MSGF_MAINLOOP 8
#define MSGF_USER 4096
+ /* Windows Exit Procedure flag values */
+#define WEP_FREE_DLL 0
+#define WEP_SYSTEM_EXIT 1
+
/* Journalling hook structure */
typedef struct
@@ -3145,8 +3147,13 @@
/* Declarations for functions that exist only in Win16 */
+WORD AllocSelector(WORD);
+WORD AllocSelectorArray(WORD);
VOID FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
+WORD FreeSelector(WORD);
DWORD GetBitmapDimension(HBITMAP16);
+HTASK16 GetCurrentTask(void);
+BOOL16 LocalInit(HANDLE16,WORD,WORD);
DWORD OffsetViewportOrg(HDC16,INT16,INT16);
DWORD OffsetWindowOrg(HDC16,INT16,INT16);
VOID PaintRect(HWND16,HWND16,HDC16,HBRUSH16,const RECT16*);
@@ -3161,15 +3168,38 @@
/* Declarations for functions that exist only in Win32 */
+BOOL32 Beep(DWORD,DWORD);
+BOOL32 EnumThreadWindows(DWORD,WNDENUMPROC32,LPARAM);
BOOL32 FlushFileBuffers(HFILE);
DWORD GetLogicalDrives(void);
+HANDLE32 GetProcessHeap(void);
+LPVOID HeapAlloc(HANDLE32,DWORD,DWORD);
+DWORD HeapCompact(HANDLE32,DWORD);
+HANDLE32 HeapCreate(DWORD,DWORD,DWORD);
+BOOL32 HeapDestroy(HANDLE32);
+BOOL32 HeapFree(HANDLE32,DWORD,LPVOID);
+BOOL32 HeapLock(HANDLE32);
+LPVOID HeapReAlloc(HANDLE32,DWORD,LPVOID,DWORD);
+DWORD HeapSize(HANDLE32,DWORD,LPVOID);
+BOOL32 HeapUnlock(HANDLE32);
+BOOL32 HeapValidate(HANDLE32,DWORD,LPVOID);
+VOID RtlFillMemory(LPVOID,UINT32,UINT32);
+VOID RtlMoveMemory(LPVOID,LPCVOID,UINT32);
+VOID RtlZeroMemory(LPVOID,UINT32);
+LPVOID VirtualAlloc(LPVOID,DWORD,DWORD,DWORD);
+BOOL32 VirtualFree(LPVOID,DWORD,DWORD);
/* Declarations for functions that are the same in Win16 and Win32 */
+INT16 CombineRgn(HRGN32,HRGN32,HRGN32,INT32);
HBITMAP16 CreateBitmap(INT32,INT32,UINT32,UINT32,LPCVOID);
HBITMAP16 CreateCompatibleBitmap(HDC32,INT32,INT32);
HBITMAP16 CreateDiscardableBitmap(HDC32,INT32,INT32);
+HRGN16 CreateEllipticRgn(INT32,INT32,INT32,INT32);
+HRGN16 CreateRectRgn(INT32,INT32,INT32,INT32);
+HRGN16 CreateRoundRectRgn(INT32,INT32,INT32,INT32,INT32,INT32);
BOOL16 EndDialog(HWND32,INT32);
+BOOL16 EqualRgn(HRGN32,HRGN32);
INT16 ExcludeUpdateRgn(HDC32,HWND32);
DWORD GetAppCompatFlags(HTASK32);
LONG GetBitmapBits(HBITMAP32,LONG,LPVOID);
@@ -3177,10 +3207,14 @@
INT16 GetUpdateRgn(HWND32,HRGN32,BOOL32);
WORD GetWindowWord(HWND32,INT32);
INT16 OffsetRgn(HRGN32,INT32,INT32);
+BOOL16 PtInRegion(HRGN32,INT32,INT32);
DWORD RegCloseKey(HKEY);
DWORD RegFlushKey(HKEY);
LONG SetBitmapBits(HBITMAP32,LONG,LPCVOID);
WORD SetClassWord(HWND32,INT32,WORD);
+INT16 SetDIBits(HDC32,HBITMAP32,UINT32,UINT32,LPCVOID,const BITMAPINFO*,UINT32);
+INT16 SetDIBitsToDevice(HDC32,INT32,INT32,DWORD,DWORD,INT32,INT32,UINT32,UINT32,LPCVOID,const BITMAPINFO*,UINT32);
+VOID SetRectRgn(HRGN32,INT32,INT32,INT32,INT32);
WORD SetWindowWord(HWND32,INT32,WORD);
/* Declarations for functions that change between Win16 and Win32 */
@@ -3287,6 +3321,10 @@
LRESULT DefWindowProc32A(HWND32,UINT32,WPARAM32,LPARAM);
LRESULT DefWindowProc32W(HWND32,UINT32,WPARAM32,LPARAM);
#define DefWindowProc WINELIB_NAME_AW(DefWindowProc)
+BOOL16 DeleteFile16(LPCSTR);
+BOOL32 DeleteFile32A(LPCSTR);
+BOOL32 DeleteFile32W(LPCWSTR);
+#define DeleteFile WINELIB_NAME_AW(DeleteFile)
INT16 DialogBox16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16);
#define DialogBox32A(inst,template,owner,func) \
DialogBoxParam32A(inst,template,owner,func,0)
@@ -3324,6 +3362,16 @@
BOOL16 EndPaint16(HWND16,const PAINTSTRUCT16*);
BOOL32 EndPaint32(HWND32,const PAINTSTRUCT32*);
#define EndPaint WINELIB_NAME(EndPaint)
+BOOL16 EnumChildWindows16(HWND16,WNDENUMPROC16,LPARAM);
+BOOL32 EnumChildWindows32(HWND32,WNDENUMPROC32,LPARAM);
+#define EnumChildWindows WINELIB_NAME(EnumChildWindows)
+BOOL16 EnumTaskWindows16(HTASK16,WNDENUMPROC16,LPARAM);
+#define EnumTaskWindows32(handle,proc,lparam) \
+ EnumThreadWindows(handle,proc,lparam)
+#define EnumTaskWindows WINELIB_NAME(EnumTaskWindows)
+BOOL16 EnumWindows16(WNDENUMPROC16,LPARAM);
+BOOL32 EnumWindows32(WNDENUMPROC32,LPARAM);
+#define EnumWindows WINELIB_NAME(EnumWindows)
BOOL16 EqualRect16(const RECT16*,const RECT16*);
BOOL32 EqualRect32(const RECT32*,const RECT32*);
#define EqualRect WINELIB_NAME(EqualRect)
@@ -3345,6 +3393,12 @@
INT16 FrameRect16(HDC16,const RECT16*,HBRUSH16);
INT32 FrameRect32(HDC32,const RECT32*,HBRUSH32);
#define FrameRect WINELIB_NAME(FrameRect)
+BOOL16 FreeModule16(HMODULE16);
+#define FreeModule32(handle) FreeLibrary32(handle)
+#define FreeModule WINELIB_NAME(FreeModule)
+void FreeProcInstance16(FARPROC16);
+#define FreeProcInstance32(proc) (proc)
+#define FreeProcInstance WINELIB_NAME(FreeProcInstance)
BOOL16 GetBitmapDimensionEx16(HBITMAP16,LPSIZE16);
BOOL32 GetBitmapDimensionEx32(HBITMAP32,LPSIZE32);
#define GetBitmapDimensionEx WINELIB_NAME(GetBitmapDimensionEx)
@@ -3379,6 +3433,10 @@
void GetClipCursor16(LPRECT16);
void GetClipCursor32(LPRECT32);
#define GetClipCursor WINELIB_NAME(GetClipCursor)
+UINT16 GetCurrentDirectory16(UINT16,LPSTR);
+UINT32 GetCurrentDirectory32A(UINT32,LPSTR);
+UINT32 GetCurrentDirectory32W(UINT32,LPWSTR);
+#define GetCurrentDirectory WINELIB_NAME_AW(GetCurrentDirectory)
BOOL16 GetCurrentPositionEx16(HDC16,LPPOINT16);
BOOL32 GetCurrentPositionEx32(HDC32,LPPOINT32);
#define GetCurrentPositionEx WINELIB_NAME(GetCurrentPositionEx)
@@ -3393,6 +3451,10 @@
INT32 GetDlgItemText32A(HWND32,INT32,LPSTR,UINT32);
INT32 GetDlgItemText32W(HWND32,INT32,LPWSTR,UINT32);
#define GetDlgItemText WINELIB_NAME_AW(GetDlgItemText)
+UINT16 GetDriveType16(UINT16); /* yes, the arguments differ */
+UINT32 GetDriveType32A(LPCSTR);
+UINT32 GetDriveType32W(LPCWSTR);
+#define GetDriveType WINELIB_NAME_AW(GetDriveType)
UINT16 GetInternalWindowPos16(HWND16,LPRECT16,LPPOINT16);
UINT32 GetInternalWindowPos32(HWND32,LPRECT32,LPPOINT32);
#define GetInternalWindowPos WINELIB_NAME(GetInternalWindowPos)
@@ -3406,10 +3468,21 @@
INT16 GetRgnBox16(HRGN16,LPRECT16);
INT32 GetRgnBox32(HRGN32,LPRECT32);
#define GetRgnBox WINELIB_NAME(GetRgnBox)
+UINT16 GetSystemDirectory16(LPSTR,UINT16);
+UINT32 GetSystemDirectory32A(LPSTR,UINT32);
+UINT32 GetSystemDirectory32W(LPWSTR,UINT32);
+#define GetSystemDirectory WINELIB_NAME_AW(GetSystemDirectory)
+UINT32 GetTempPath32A(UINT32,LPSTR);
+UINT32 GetTempPath32W(UINT32,LPWSTR);
+#define GetTempPath WINELIB_NAME_AW(GetTempPath)
BOOL16 GetTextExtentPoint16(HDC16,LPCSTR,INT16,LPSIZE16);
BOOL32 GetTextExtentPoint32A(HDC32,LPCSTR,INT32,LPSIZE32);
BOOL32 GetTextExtentPoint32W(HDC32,LPCWSTR,INT32,LPSIZE32);
#define GetTextExtentPoint WINELIB_NAME_AW(GetTextExtentPoint)
+BOOL16 GetTextMetrics16(HDC16,LPTEXTMETRIC16);
+BOOL32 GetTextMetrics32A(HDC32,LPTEXTMETRIC32A);
+BOOL32 GetTextMetrics32W(HDC32,LPTEXTMETRIC32W);
+#define GetTextMetrics WINELIB_NAME_AW(GetTextMetrics)
BOOL16 GetUpdateRect16(HWND16,LPRECT16,BOOL16);
BOOL32 GetUpdateRect32(HWND32,LPRECT32,BOOL32);
#define GetUpdateRect WINELIB_NAME(GetUpdateRect)
@@ -3534,9 +3607,15 @@
BOOL16 LocalUnlock16(HLOCAL16);
BOOL32 LocalUnlock32(HLOCAL32);
#define LocalUnlock WINELIB_NAME(LocalUnlock)
+HGLOBAL16 LockSegment16(HGLOBAL16);
+#define LockSegment32(handle) GlobalFix((HANDLE32)(handle))
+#define LockSegment WINELIB_NAME(LockSegment)
BOOL16 LPtoDP16(HDC16,LPPOINT16,INT16);
BOOL32 LPtoDP32(HDC32,LPPOINT32,INT32);
#define LPtoDP WINELIB_NAME(LPtoDP)
+FARPROC16 MakeProcInstance16(FARPROC16,HANDLE16);
+#define MakeProcInstance32(proc,inst) (proc)
+#define MakeProcInstance WINELIB_NAME(MakeProcInstance)
void MapDialogRect16(HWND16,LPRECT16);
void MapDialogRect32(HWND32,LPRECT32);
#define MapDialogRect WINELIB_NAME(MapDialogRect)
@@ -3659,6 +3738,10 @@
DWORD RegSetValueEx32A(HKEY,LPSTR,DWORD,DWORD,LPBYTE,DWORD);
DWORD RegSetValueEx32W(HKEY,LPWSTR,DWORD,DWORD,LPBYTE,DWORD);
#define RegSetValueEx WINELIB_NAME_AW(RegSetValueEx)
+BOOL16 RemoveDirectory16(LPCSTR);
+BOOL32 RemoveDirectory32A(LPCSTR);
+BOOL32 RemoveDirectory32W(LPCWSTR);
+#define RemoveDirectory WINELIB_NAME_AW(RemoveDirectory)
BOOL16 ScaleViewportExtEx16(HDC16,INT16,INT16,INT16,INT16,LPSIZE16);
BOOL32 ScaleViewportExtEx32(HDC32,INT32,INT32,INT32,INT32,LPSIZE32);
#define ScaleViewportExtEx WINELIB_NAME(ScaleViewportExtEx)
@@ -3690,6 +3773,9 @@
void SetDlgItemText32A(HWND32,INT32,LPCSTR);
void SetDlgItemText32W(HWND32,INT32,LPCWSTR);
#define SetDlgItemText WINELIB_NAME_AW(SetDlgItemText)
+BOOL32 SetEnvironmentVariable32A(LPCSTR,LPCSTR);
+BOOL32 SetEnvironmentVariable32W(LPCWSTR,LPCWSTR);
+#define SetEnvironmentVariable WINELIB_NAME_AW(SetEnvironmentVariable)
void SetInternalWindowPos16(HWND16,UINT16,LPRECT16,LPPOINT16);
void SetInternalWindowPos32(HWND32,UINT32,LPRECT32,LPPOINT32);
#define SetInternalWindowPos WINELIB_NAME(SetInternalWindowPos)
@@ -3735,6 +3821,9 @@
BOOL16 UnionRect16(LPRECT16,const RECT16*,const RECT16*);
BOOL32 UnionRect32(LPRECT32,const RECT32*,const RECT32*);
#define UnionRect WINELIB_NAME(UnionRect)
+void UnlockSegment16(HGLOBAL16);
+#define UnlockSegment32(handle) GlobalUnfix((HANDLE32)(handle))
+#define UnlockSegment WINELIB_NAME(UnlockSegment)
BOOL16 UnregisterClass16(SEGPTR,HINSTANCE16);
BOOL32 UnregisterClass32A(LPCSTR,HINSTANCE32);
BOOL32 UnregisterClass32W(LPCWSTR,HINSTANCE32);
@@ -3847,7 +3936,6 @@
/*typedef int (*MFENUMPROC)(HDC,HANDLETABLE*,METARECORD*,int,LPARAM);*/
typedef int (*MFENUMPROC)(HDC,void*,void*,int,LPARAM);
typedef BOOL (*PROPENUMPROC)(HWND,LPCTSTR,HANDLE);
-typedef LRESULT (*WNDENUMPROC)(HWND,LPARAM);
#else
typedef SEGPTR DRIVERPROC;
typedef SEGPTR EDITWORDBREAKPROC;
@@ -3855,12 +3943,9 @@
typedef SEGPTR GOBJENUMPROC;
typedef SEGPTR MFENUMPROC;
typedef SEGPTR PROPENUMPROC;
-typedef SEGPTR WNDENUMPROC;
#endif
typedef FARPROC HOOKPROC;
-#endif /* NO_TRANSITION_TYPES */
-
INT AccessResource(HINSTANCE,HRSRC);
ATOM AddAtom(SEGPTR);
@@ -3868,8 +3953,6 @@
WORD AllocCStoDSAlias(WORD);
WORD AllocDStoCSAlias(WORD);
HGLOBAL AllocResource(HINSTANCE,HRSRC,DWORD);
-WORD AllocSelector(WORD);
-WORD AllocSelectorArray(WORD);
BOOL AnimatePalette(HPALETTE16,UINT,UINT,LPPALETTEENTRY);
LPSTR AnsiLower(LPSTR);
UINT AnsiLowerBuff(LPSTR,UINT);
@@ -3902,7 +3985,6 @@
HMETAFILE CloseMetaFile(HDC);
void CloseSound(void);
BOOL CloseWindow(HWND);
-INT16 CombineRgn(HRGN32,HRGN32,HRGN32,INT32);
int ConvertRequest(HWND,LPKANJISTRUCT);
#ifdef WINELIB32
HCURSOR CopyCursor(HCURSOR); /* Win32 */
@@ -3922,7 +4004,6 @@
HDC CreateDC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
HBRUSH CreateDIBPatternBrush(HGLOBAL,UINT);
HBITMAP CreateDIBitmap(HDC,BITMAPINFOHEADER*,DWORD,LPVOID,BITMAPINFO*,UINT);
-HRGN CreateEllipticRgn(INT32,INT32,INT32,INT32);
HFONT CreateFont(INT,INT,INT,INT,INT,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPCSTR);
HFONT CreateFontIndirect(const LOGFONT16*);
HBRUSH CreateHatchBrush(INT,COLORREF);
@@ -3935,8 +4016,6 @@
HPEN16 CreatePen(INT,INT,COLORREF);
HPEN16 CreatePenIndirect(const LOGPEN16*);
HMENU CreatePopupMenu(void);
-HRGN CreateRectRgn(INT32,INT32,INT32,INT32);
-HRGN CreateRoundRectRgn(INT32,INT32,INT32,INT32,INT32,INT32);
HBRUSH CreateSolidBrush(COLORREF);
void DebugBreak(void);
DWORD DefHookProc(short,WORD,DWORD,HHOOK*);
@@ -3969,16 +4048,12 @@
BOOL EnableScrollBar(HWND,UINT,UINT);
BOOL EnableWindow(HWND,BOOL);
BOOL EndDeferWindowPos(HDWP16);
-BOOL EnumChildWindows(HWND,WNDENUMPROC,LPARAM);
UINT EnumClipboardFormats(UINT);
INT EnumFontFamilies(HDC,LPCSTR,FONTENUMPROC,LPARAM);
INT EnumFonts(HDC,LPCSTR,FONTENUMPROC,LPARAM);
BOOL EnumMetaFile(HDC,HMETAFILE,MFENUMPROC,LPARAM);
INT EnumObjects(HDC,INT,GOBJENUMPROC,LPARAM);
INT EnumProps(HWND,PROPENUMPROC);
-BOOL EnumTaskWindows(HTASK,WNDENUMPROC,LPARAM);
-BOOL EnumWindows(WNDENUMPROC,LPARAM);
-BOOL EqualRgn(HRGN32,HRGN32);
INT Escape(HDC,INT,INT,LPCSTR,LPVOID);
LONG EscapeCommFunction(int,int);
int ExcludeClipRect(HDC,short,short,short,short);
@@ -3986,8 +4061,8 @@
BOOL ExitWindows(DWORD,WORD);
BOOL ExtFloodFill(HDC,INT,INT,COLORREF,WORD);
HICON ExtractIcon(HINSTANCE,LPCSTR,WORD);
-WORD FarGetOwner(HANDLE);
-void FarSetOwner(HANDLE,HANDLE);
+HANDLE16 FarGetOwner(HANDLE16);
+void FarSetOwner(HANDLE16,HANDLE16);
void FatalAppExit(UINT,LPCSTR);
void FatalExit(int);
BOOL FillRgn(HDC,HRGN,HBRUSH);
@@ -3999,10 +4074,7 @@
int FlushComm(int,int);
BOOL FrameRgn(HDC,HRGN,HBRUSH,int,int);
void FreeLibrary(HANDLE);
-BOOL FreeModule(HANDLE);
-void FreeProcInstance(FARPROC);
BOOL FreeResource(HGLOBAL);
-WORD FreeSelector(WORD);
UINT GDIRealizePalette(HDC);
HPALETTE16 GDISelectPalette(HDC,HPALETTE16);
HWND GetActiveWindow(void);
@@ -4028,10 +4100,8 @@
UINT GetCommEventMask(int,int);
int GetCommState(int,DCB*);
HBRUSH GetControlBrush(HWND,HDC,WORD);
-UINT32 GetCurrentDirectory(UINT32,LPSTR);
HANDLE GetCurrentPDB(void);
DWORD GetCurrentPosition(HDC);
-HANDLE GetCurrentTask(void);
DWORD GetCurrentTime(void);
HCURSOR GetCursor(void);
HDC GetDC(HWND);
@@ -4049,12 +4119,11 @@
HWND GetDlgItem(HWND,WORD);
WORD GetDlgItemInt(HWND,WORD,BOOL*,BOOL);
WORD GetDoubleClickTime(void);
-WORD GetDriveType(INT);
int GetEnvironment(LPSTR,LPSTR,WORD);
HMODULE GetExePtr(HANDLE);
HWND GetFocus(void);
DWORD GetFreeSpace(UINT16);
-DWORD GetHeapSpaces(HMODULE);
+DWORD GetHeapSpaces(HMODULE16);
BOOL GetInputState(void);
int GetInstanceData(HANDLE,WORD,int);
int GetKBCodePage(void);
@@ -4079,7 +4148,7 @@
HANDLE GetMetaFile(LPSTR);
HANDLE GetMetaFileBits(HANDLE);
int GetModuleFileName(HANDLE,LPSTR,short);
-HANDLE GetModuleHandle(LPCSTR);
+HMODULE16 GetModuleHandle(LPCSTR);
int GetModuleUsage(HANDLE);
FARPROC GetMouseEventProc(void);
DWORD GetNearestColor(HDC,DWORD);
@@ -4113,7 +4182,6 @@
HMENU GetSubMenu(HMENU,short);
COLORREF GetSysColor(short);
HWND GetSysModalWindow(void);
-UINT GetSystemDirectory(LPSTR,UINT);
HMENU GetSystemMenu(HWND,BOOL);
int GetSystemMetrics(WORD);
WORD GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
@@ -4130,7 +4198,6 @@
COLORREF GetTextColor(HDC);
DWORD GetTextExtent(HDC,LPCSTR,short);
INT GetTextFace(HDC,INT,LPSTR);
-BOOL GetTextMetrics(HDC,LPTEXTMETRIC16);
LPINT16 GetThresholdEvent(void);
int GetThresholdStatus(void);
DWORD GetTickCount(void);
@@ -4157,7 +4224,7 @@
void GlobalNotify(FARPROC);
WORD GlobalPageLock(HGLOBAL16);
WORD GlobalPageUnlock(HGLOBAL16);
-BOOL GlobalUnWire(HGLOBAL16);
+BOOL16 GlobalUnWire(HGLOBAL16);
void GlobalUnfix(HGLOBAL16);
SEGPTR GlobalWire(HGLOBAL16);
BOOL GrayString(HDC,HBRUSH,FARPROC,LPARAM,INT,INT,INT,INT,INT);
@@ -4208,12 +4275,9 @@
HANDLE LoadModule(LPCSTR,LPVOID);
HGLOBAL LoadResource(HINSTANCE,HRSRC);
int LoadString(HANDLE,WORD,LPSTR,int);
-BOOL LocalInit(HANDLE,WORD,WORD);
FARPROC LocalNotify(FARPROC);
LPVOID LockResource(HGLOBAL);
-HGLOBAL LockSegment(HGLOBAL);
HMENU LookupMenuHandle(HMENU,INT);
-FARPROC MakeProcInstance(FARPROC,HANDLE);
WORD MapVirtualKey(WORD,WORD);
void MessageBeep(WORD);
int MessageBox(HWND,LPCSTR,LPCSTR,WORD);
@@ -4247,7 +4311,6 @@
void ProfSetup(int,int);
void ProfStart(void);
void ProfStop(void);
-BOOL PtInRegion(HRGN32,INT32,INT32);
BOOL PtVisible(HDC,short,short);
int ReadComm(int,LPSTR,int);
WORD RealizeDefaultPalette(HDC);
@@ -4295,12 +4358,10 @@
void SetCursorPos(short,short);
BOOL SetDCHook(HDC,FARPROC16,DWORD);
void SetDCState(HDC,HDC);
-int SetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
-int SetDIBitsToDevice(HDC,short,short,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
BOOL SetDeskPattern(void);
BOOL SetDeskWallPaper(LPCSTR);
void SetDoubleClickTime(WORD);
-int SetEnvironment(LPSTR,LPSTR,WORD);
+int SetEnvironment(LPCSTR,LPCSTR,WORD);
UINT SetErrorMode(UINT);
HWND SetFocus(HWND);
WORD SetHandleCount(WORD);
@@ -4318,7 +4379,6 @@
WORD SetPolyFillMode(HDC,WORD);
BOOL SetProp(HWND,SEGPTR,HANDLE);
WORD SetROP2(HDC,WORD);
-void SetRectRgn(HRGN32,INT32,INT32,INT32,INT32);
WORD SetRelAbs(HDC,WORD);
FARPROC SetResourceHandler(HANDLE,LPSTR,FARPROC);
int SetScrollPos(HWND,int,int,BOOL);
@@ -4378,7 +4438,6 @@
int UngetCommChar(int,char);
BOOL UnhookWindowsHook(short,FARPROC);
BOOL UnhookWindowsHookEx(HHOOK);
-void UnlockSegment(HGLOBAL);
BOOL UnrealizeObject(HBRUSH);
int UpdateColors(HDC);
void UpdateWindow(HWND32);
@@ -4408,6 +4467,7 @@
INT _lread(HFILE,SEGPTR,WORD);
INT _lwrite(HFILE,LPCSTR,WORD);
+#endif /* NO_TRANSITION_TYPES */
#ifdef WINELIB
#define WINELIB_UNIMP(x) fprintf (stderr, "WineLib: Unimplemented %s\n", x)
diff --git a/include/wine.h b/include/wine.h
index af1be18..bcfffca 100644
--- a/include/wine.h
+++ b/include/wine.h
@@ -9,8 +9,8 @@
#ifndef WINELIB
-#if defined ( linux)
-struct sigcontext_struct
+#ifdef linux
+typedef struct
{
unsigned short sc_gs, __gsh;
unsigned short sc_fs, __fsh;
@@ -34,17 +34,17 @@
unsigned long i387;
unsigned long oldmask;
unsigned long cr2;
-};
+} SIGCONTEXT;
#define WINE_DATA_SELECTOR 0x2b
#define WINE_CODE_SELECTOR 0x23
#endif /* linux */
#ifdef __NetBSD__
#include <signal.h>
-#define sigcontext_struct sigcontext
+typedef struct sigcontext SIGCONTEXT;
#define WINE_DATA_SELECTOR 0x1f
#define WINE_CODE_SELECTOR 0x17
-#endif
+#endif /* NetBSD */
#if defined(__svr4__) || defined(_SCO_DS)
#include <signal.h>
@@ -52,17 +52,23 @@
#include <sys/regset.h>
#endif
#include <sys/ucontext.h>
-#define sigcontext_struct ucontext
+typedef struct ucontext SIGCONTEXT;
#define WINE_DATA_SELECTOR 0x1f
#define WINE_CODE_SELECTOR 0x17
-#endif
+#endif /* svr4 || SCO_DS */
#ifdef __FreeBSD__
#include <signal.h>
-#define sigcontext_struct sigcontext
+typedef struct sigcontext SIGCONTEXT;
#define WINE_DATA_SELECTOR 0x27
#define WINE_CODE_SELECTOR 0x1f
-#endif
+#endif /* FreeBSD */
+
+#else /* WINELIB */
+
+typedef void SIGCONTEXT;
+#define WINE_DATA_SELECTOR 0x00
+#define WINE_CODE_SELECTOR 0x00
#endif /* WINELIB */
diff --git a/include/winpos.h b/include/winpos.h
index 02b2a92..fed1e37 100644
--- a/include/winpos.h
+++ b/include/winpos.h
@@ -25,13 +25,6 @@
WINDOWPOS16 winPos[1];
} DWP;
-typedef struct
-{
- HTASK hWindowTask;
- HTASK hTaskSendTo;
- BOOL wFlag;
-} ACTIVATESTRUCT, *LPACTIVATESTRUCT;
-
extern void WINPOS_FindIconPos( HWND hwnd );
extern BOOL WINPOS_SetActiveWindow( HWND hWnd, BOOL fMouse, BOOL fChangeFocus);
extern BOOL WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg );
diff --git a/include/winproc.h b/include/winproc.h
index 7f799e1..fd9b22a 100644
--- a/include/winproc.h
+++ b/include/winproc.h
@@ -17,11 +17,13 @@
WIN_PROC_32W
} WINDOWPROCTYPE;
-extern HANDLE32 WINPROC_AllocWinProc( UINT32 func, WINDOWPROCTYPE type );
-extern HANDLE32 WINPROC_CopyWinProc( HANDLE32 handle );
-extern void WINPROC_FreeWinProc( HANDLE32 handle );
-extern WINDOWPROCTYPE WINPROC_GetWinProcType( HANDLE32 handle );
-extern WNDPROC16 WINPROC_GetFunc16( HANDLE32 handle );
-extern WNDPROC32 WINPROC_GetFunc32( HANDLE32 handle );
+typedef void *HWINDOWPROC; /* Really a pointer to a WINDOWPROC */
+
+extern BOOL32 WINPROC_Init(void);
+extern WNDPROC16 WINPROC_GetProc( HWINDOWPROC proc, WINDOWPROCTYPE type );
+extern BOOL32 WINPROC_SetProc( HWINDOWPROC *pFirst, WNDPROC16 func,
+ WINDOWPROCTYPE type );
+extern void WINPROC_FreeProc( HWINDOWPROC proc );
+extern WINDOWPROCTYPE WINPROC_GetProcType( HWINDOWPROC proc );
#endif /* __WINE_WINPROC_H */
diff --git a/include/wintypes.h b/include/wintypes.h
index 33bcebd..4f6c53e 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -154,11 +154,13 @@
#ifdef WINELIB
typedef LRESULT (*DLGPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
typedef LRESULT (*FARPROC16)();
+typedef LRESULT (*WNDENUMPROC16)(HWND16,LPARAM);
typedef LRESULT (*WNDPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
#else
/* Function pointers are SEGPTR in Win16 */
typedef SEGPTR DLGPROC16;
typedef SEGPTR FARPROC16;
+typedef SEGPTR WNDENUMPROC16;
typedef SEGPTR WNDPROC16;
#endif
@@ -166,6 +168,7 @@
typedef LRESULT (*DLGPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
typedef LRESULT (*FARPROC32)();
+typedef LRESULT (*WNDENUMPROC32)(HWND32,LPARAM);
typedef LRESULT (*WNDPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
/* TCHAR data types definitions for Winelib. */
@@ -226,7 +229,9 @@
DECL_WINELIB_TYPE(HWAVEOUT);
DECL_WINELIB_TYPE(HWND);
+DECL_WINELIB_TYPE(DLGPROC);
DECL_WINELIB_TYPE(FARPROC);
+DECL_WINELIB_TYPE(WNDENUMPROC);
DECL_WINELIB_TYPE(WNDPROC);
/* Misc. constants. */
diff --git a/library/miscstubs.c b/library/miscstubs.c
index fa59b22..c6b61bf 100644
--- a/library/miscstubs.c
+++ b/library/miscstubs.c
@@ -43,7 +43,6 @@
WORD CallTo16_word_ ( FARPROC func, WORD arg ) { return func(arg); }
-extern LRESULT ACTIVATEAPP_callback(HWND,UINT,WPARAM,LPARAM);
extern LRESULT AboutDlgProc(HWND,UINT,WPARAM,LPARAM);
extern LRESULT CARET_Callback(HWND,UINT,WPARAM,LPARAM);
extern LRESULT ColorDlgProc(HWND,UINT,WPARAM,LPARAM);
@@ -78,7 +77,6 @@
WNDPROC MODULE_GetWndProcEntry16( char *name )
{
#define MAP_STR_TO_PROC(str,proc) if(!strcmp(name,str))return proc
- MAP_STR_TO_PROC("ActivateAppProc",ACTIVATEAPP_callback);
MAP_STR_TO_PROC("AboutDlgProc",AboutDlgProc);
MAP_STR_TO_PROC("CARET_Callback",CARET_Callback);
MAP_STR_TO_PROC("ColorDlgProc",ColorDlgProc);
diff --git a/loader/builtin.c b/loader/builtin.c
index 7cfb347..0d90272 100644
--- a/loader/builtin.c
+++ b/loader/builtin.c
@@ -105,6 +105,7 @@
extern const DLL_DESCRIPTOR SHELL32_Descriptor;
extern const DLL_DESCRIPTOR USER32_Descriptor;
extern const DLL_DESCRIPTOR VERSION_Descriptor;
+extern const DLL_DESCRIPTOR WINMM_Descriptor;
extern const DLL_DESCRIPTOR WINSPOOL_Descriptor;
extern const DLL_DESCRIPTOR WSOCK32_Descriptor;
@@ -154,6 +155,7 @@
{ &SHELL32_Descriptor, 0 },
{ &USER32_Descriptor, 0 },
{ &VERSION_Descriptor, 0 },
+ { &WINMM_Descriptor, 0 },
{ &WINSPOOL_Descriptor, 0 },
{ &WSOCK32_Descriptor, 0 },
/* Last entry */
@@ -166,7 +168,7 @@
*
* Load all built-in modules marked as 'always used'.
*/
-BOOL BUILTIN_Init(void)
+BOOL16 BUILTIN_Init(void)
{
BUILTIN_DLL *dll;
NE_MODULE *pModule;
@@ -196,7 +198,7 @@
* Load a built-in module. If the 'force' parameter is FALSE, we only
* load the module if it has not been disabled via the -dll option.
*/
-HMODULE BUILTIN_LoadModule( LPCSTR name, BOOL force )
+HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL16 force )
{
HMODULE hModule;
NE_MODULE *pModule;
@@ -377,7 +379,7 @@
*
* Set runtime DLL usage flags
*/
-BOOL BUILTIN_ParseDLLOptions( const char *str )
+BOOL16 BUILTIN_ParseDLLOptions( const char *str )
{
BUILTIN_DLL *dll;
const char *p;
diff --git a/loader/main.c b/loader/main.c
index bc3ac02..02917c4 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -36,6 +36,7 @@
#include "dce.h"
#include "pe_image.h"
#include "shell.h"
+#include "winproc.h"
#include "stddebug.h"
#include "debug.h"
@@ -117,7 +118,10 @@
/* Create the DCEs */
DCE_Init();
-
+
+ /* Initialize window procedures */
+ if (!WINPROC_Init()) return 0;
+
/* Initialize dialog manager */
if (!DIALOG_Init()) return 0;
diff --git a/loader/module.c b/loader/module.c
index d394aa3..c643c7d 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -30,8 +30,8 @@
extern HINSTANCE PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params );
-static HMODULE hFirstModule = 0;
-static HMODULE hCachedModule = 0; /* Module cached by MODULE_OpenFile */
+static HMODULE16 hFirstModule = 0;
+static HMODULE16 hCachedModule = 0; /* Module cached by MODULE_OpenFile */
#ifndef WINELIB
static HANDLE hInitialStack32 = 0;
@@ -41,7 +41,7 @@
/***********************************************************************
* MODULE_GetPtr
*/
-NE_MODULE *MODULE_GetPtr( HMODULE hModule )
+NE_MODULE *MODULE_GetPtr( HMODULE16 hModule )
{
NE_MODULE *pModule = (NE_MODULE *)GlobalLock16( hModule );
if (!pModule || (pModule->magic != NE_SIGNATURE) ||
@@ -53,7 +53,7 @@
/***********************************************************************
* MODULE_DumpModule
*/
-void MODULE_DumpModule( HMODULE hmodule )
+void MODULE_DumpModule( HMODULE16 hmodule )
{
int i, ordinal;
SEGTABLEENTRY *pSeg;
@@ -134,9 +134,8 @@
pword = (WORD *)((BYTE *)pModule + pModule->modref_table);
for (i = 0; i < pModule->modref_count; i++, pword++)
{
- char *name = (char *)pModule + pModule->import_table + *pword;
- printf( "%d: %04x -> '%*.*s'\n",
- i, *pword, *name, *name, name + 1 );
+ printf( "%d: %04x -> '%s'\n", i, *pword,
+ MODULE_GetModuleName(*pword));
}
}
else printf( "None\n" );
@@ -217,7 +216,7 @@
/***********************************************************************
* MODULE_OpenFile
*/
-int MODULE_OpenFile( HMODULE hModule )
+int MODULE_OpenFile( HMODULE16 hModule )
{
NE_MODULE *pModule;
char *name;
@@ -288,7 +287,7 @@
* MODULE_CreateSegments
*/
#ifndef WINELIB32
-static BOOL MODULE_CreateSegments( HMODULE hModule )
+static BOOL MODULE_CreateSegments( HMODULE16 hModule )
{
SEGTABLEENTRY *pSegment;
NE_MODULE *pModule;
@@ -321,7 +320,7 @@
* MODULE_GetInstance
*/
#ifndef WINELIB32
-HINSTANCE MODULE_GetInstance( HMODULE hModule )
+HINSTANCE16 MODULE_GetInstance( HMODULE16 hModule )
{
SEGTABLEENTRY *pSegment;
NE_MODULE *pModule;
@@ -339,7 +338,7 @@
/***********************************************************************
* MODULE_CreateInstance
*/
-HINSTANCE MODULE_CreateInstance( HMODULE hModule, LOADPARAMS *params )
+HINSTANCE16 MODULE_CreateInstance( HMODULE16 hModule, LOADPARAMS *params )
{
SEGTABLEENTRY *pSegment;
NE_MODULE *pModule;
@@ -373,12 +372,12 @@
/***********************************************************************
* MODULE_LoadExeHeader
*/
-static HMODULE MODULE_LoadExeHeader( HFILE hFile, OFSTRUCT *ofs )
+static HMODULE16 MODULE_LoadExeHeader( HFILE hFile, OFSTRUCT *ofs )
{
struct mz_header_s mz_header;
struct ne_header_s ne_header;
int size;
- HMODULE hModule;
+ HMODULE16 hModule;
NE_MODULE *pModule;
BYTE *pData;
char *buffer, *fastload = NULL;
@@ -394,14 +393,15 @@
_llseek( hFile, 0, SEEK_SET );
if ((FILE_Read(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
- (mz_header.mz_magic != MZ_SIGNATURE)) return (HMODULE)11; /* invalid exe */
+ (mz_header.mz_magic != MZ_SIGNATURE))
+ return (HMODULE16)11; /* invalid exe */
_llseek( hFile, mz_header.ne_offset, SEEK_SET );
if (FILE_Read( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
- return (HMODULE)11; /* invalid exe */
+ return (HMODULE16)11; /* invalid exe */
- if (ne_header.ne_magic == PE_SIGNATURE) return (HMODULE)21; /* win32 exe */
- if (ne_header.ne_magic != NE_SIGNATURE) return (HMODULE)11; /* invalid exe */
+ if (ne_header.ne_magic == PE_SIGNATURE) return (HMODULE16)21; /* win32 exe */
+ if (ne_header.ne_magic != NE_SIGNATURE) return (HMODULE16)11; /* invalid exe */
/* We now have a valid NE header */
@@ -422,7 +422,7 @@
ne_header.entry_tab_length;
hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
- if (!hModule) return (HMODULE)11; /* invalid exe */
+ if (!hModule) return (HMODULE16)11; /* invalid exe */
FarSetOwner( hModule, hModule );
pModule = (NE_MODULE *)GlobalLock16( hModule );
memcpy( pModule, &ne_header, sizeof(ne_header) );
@@ -474,7 +474,7 @@
if (!READ( ne_header.segment_tab_offset,
ne_header.n_segment_tab * sizeof(struct ne_segment_table_entry_s),
- buffer )) return (HMODULE)11; /* invalid exe */
+ buffer )) return (HMODULE16)11; /* invalid exe */
pSeg = (struct ne_segment_table_entry_s *)buffer;
for (i = ne_header.n_segment_tab; i > 0; i--, pSeg++)
{
@@ -486,7 +486,7 @@
else
{
GlobalFree16( hModule );
- return (HMODULE)11; /* invalid exe */
+ return (HMODULE16)11; /* invalid exe */
}
/* Get the resource table */
@@ -496,7 +496,7 @@
pModule->res_table = (int)pData - (int)pModule;
if (!READ(ne_header.resource_tab_offset,
ne_header.rname_tab_offset - ne_header.resource_tab_offset,
- pData )) return (HMODULE)11; /* invalid exe */
+ pData )) return (HMODULE16)11; /* invalid exe */
pData += ne_header.rname_tab_offset - ne_header.resource_tab_offset;
}
else pModule->res_table = 0; /* No resource table */
@@ -509,7 +509,7 @@
pData ))
{
GlobalFree16( hModule );
- return (HMODULE)11; /* invalid exe */
+ return (HMODULE16)11; /* invalid exe */
}
pData += ne_header.moduleref_tab_offset - ne_header.rname_tab_offset;
@@ -520,7 +520,7 @@
pModule->modref_table = (int)pData - (int)pModule;
if (!READ( ne_header.moduleref_tab_offset,
ne_header.n_mod_ref_tab * sizeof(WORD),
- pData )) return (HMODULE)11; /* invalid exe */
+ pData )) return (HMODULE16)11; /* invalid exe */
pData += ne_header.n_mod_ref_tab * sizeof(WORD);
}
else pModule->modref_table = 0; /* No module references */
@@ -533,7 +533,7 @@
pData ))
{
GlobalFree16( hModule );
- return (HMODULE)11; /* invalid exe */
+ return (HMODULE16)11; /* invalid exe */
}
pData += ne_header.entry_tab_offset - ne_header.iname_tab_offset;
@@ -545,7 +545,7 @@
pData ))
{
GlobalFree16( hModule );
- return (HMODULE)11; /* invalid exe */
+ return (HMODULE16)11; /* invalid exe */
}
pData += ne_header.entry_tab_length;
@@ -558,7 +558,7 @@
if (!pModule->nrname_handle)
{
GlobalFree16( hModule );
- return (HMODULE)11; /* invalid exe */
+ return (HMODULE16)11; /* invalid exe */
}
buffer = GlobalLock16( pModule->nrname_handle );
_llseek( hFile, ne_header.nrname_tab_offset, SEEK_SET );
@@ -567,7 +567,7 @@
{
GlobalFree16( pModule->nrname_handle );
GlobalFree16( hModule );
- return (HMODULE)11; /* invalid exe */
+ return (HMODULE16)11; /* invalid exe */
}
}
else pModule->nrname_handle = 0;
@@ -577,13 +577,13 @@
if (pModule->modref_count)
{
pModule->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT,
- (pModule->modref_count+1)*sizeof(HMODULE),
+ (pModule->modref_count+1)*sizeof(HMODULE16),
hModule, FALSE, FALSE, FALSE );
if (!pModule->dlls_to_init)
{
if (pModule->nrname_handle) GlobalFree16( pModule->nrname_handle );
GlobalFree16( hModule );
- return (HMODULE)11; /* invalid exe */
+ return (HMODULE16)11; /* invalid exe */
}
}
else pModule->dlls_to_init = 0;
@@ -599,7 +599,7 @@
*
* Lookup the ordinal for a given name.
*/
-WORD MODULE_GetOrdinal( HMODULE hModule, const char *name )
+WORD MODULE_GetOrdinal( HMODULE16 hModule, const char *name )
{
char buffer[256], *cpnt;
BYTE len;
@@ -663,7 +663,7 @@
*
* Return the entry point for a given ordinal.
*/
-SEGPTR MODULE_GetEntryPoint( HMODULE hModule, WORD ordinal )
+SEGPTR MODULE_GetEntryPoint( HMODULE16 hModule, WORD ordinal )
{
NE_MODULE *pModule;
WORD curOrdinal = 1;
@@ -714,7 +714,7 @@
* Change the value of an entry point. Use with caution!
* It can only change the offset value, not the selector.
*/
-BOOL MODULE_SetEntryPoint( HMODULE hModule, WORD ordinal, WORD offset )
+BOOL16 MODULE_SetEntryPoint( HMODULE16 hModule, WORD ordinal, WORD offset )
{
NE_MODULE *pModule;
WORD curOrdinal = 1;
@@ -763,7 +763,7 @@
{
WORD ordinal;
FARPROC16 ret;
- static HMODULE hModule = 0;
+ static HMODULE16 hModule = 0;
if (!hModule) hModule = GetModuleHandle( "WPROCS" );
ordinal = MODULE_GetOrdinal( hModule, name );
@@ -777,7 +777,7 @@
/***********************************************************************
* MODULE_GetModuleName
*/
-LPSTR MODULE_GetModuleName( HMODULE hModule )
+LPSTR MODULE_GetModuleName( HMODULE16 hModule )
{
NE_MODULE *pModule;
BYTE *p, len;
@@ -807,9 +807,9 @@
*
* Find a module from a path name.
*/
-HMODULE MODULE_FindModule( LPCSTR path )
+HMODULE16 MODULE_FindModule( LPCSTR path )
{
- HMODULE hModule = hFirstModule;
+ HMODULE16 hModule = hFirstModule;
LPCSTR filename, dotptr, modulepath, modulename;
BYTE len, *name_table;
@@ -839,23 +839,44 @@
/**********************************************************************
+ * MODULE_CallWEP
+ *
+ * Call a DLL's WEP, allowing it to shut down.
+ * FIXME: we always pass the WEP WEP_FREE_DLL, never WEP_SYSTEM_EXIT
+ */
+static BOOL16 MODULE_CallWEP( HMODULE16 hModule )
+{
+ FARPROC16 WEP = (FARPROC16)0;
+ WORD ordinal = MODULE_GetOrdinal( hModule, "WEP" );
+
+ if (ordinal) WEP = MODULE_GetEntryPoint( hModule, ordinal );
+ if (!WEP)
+ {
+ dprintf_module( stddeb, "module %04x doesn't have a WEP\n", hModule );
+ return FALSE;
+ }
+ return CallWindowsExitProc( WEP, WEP_FREE_DLL );
+}
+
+
+/**********************************************************************
* MODULE_FreeModule
*
* Remove a module from memory.
*/
-static void MODULE_FreeModule( HMODULE hModule )
+static void MODULE_FreeModule( HMODULE16 hModule )
{
- HMODULE *hPrevModule;
+ HMODULE16 *hPrevModule;
NE_MODULE *pModule;
SEGTABLEENTRY *pSegment;
- HMODULE *pModRef;
+ HMODULE16 *pModRef;
int i;
if (!(pModule = MODULE_GetPtr( hModule ))) return;
if (pModule->flags & NE_FFLAGS_BUILTIN)
return; /* Can't free built-in module */
- /* FIXME: should call the exit code for the library here */
+ if (pModule->flags & NE_FFLAGS_LIBMODULE) MODULE_CallWEP( hModule );
/* Free the objects owned by the module */
@@ -885,10 +906,10 @@
/* Free the referenced modules */
- pModRef = (HMODULE*)NE_MODULE_TABLE( pModule );
+ pModRef = (HMODULE16*)NE_MODULE_TABLE( pModule );
for (i = 0; i < pModule->modref_count; i++, pModRef++)
{
- FreeModule( *pModRef );
+ FreeModule16( *pModRef );
}
/* Free the module storage */
@@ -908,7 +929,7 @@
*/
HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock )
{
- HMODULE hModule;
+ HMODULE16 hModule;
HANDLE hInstance, hPrevInstance;
NE_MODULE *pModule;
LOADPARAMS *params = (LOADPARAMS *)paramBlock;
@@ -977,7 +998,7 @@
{
/* If the DLL is not loaded yet, load it and store */
/* its handle in the list of DLLs to initialize. */
- HMODULE hDLL;
+ HMODULE16 hDLL;
if ((hDLL = LoadModule( buffer, (LPVOID)-1 )) == 2) /* file not found */
{
@@ -1015,7 +1036,7 @@
SEGTABLEENTRY * pSegTable = (SEGTABLEENTRY *) NE_SEG_TABLE(pModule);
SELFLOADHEADER *selfloadheader;
STACK16FRAME *stack16Top;
- HMODULE hselfload = GetModuleHandle("WPROCS");
+ HMODULE16 hselfload = GetModuleHandle("WPROCS");
WORD oldss, oldsp, saved_dgroup = pSegTable[pModule->dgroup - 1].selector;
fprintf (stderr, "Warning: %*.*s is a self-loading module\n"
"Support for self-loading modules is very experimental\n",
@@ -1138,16 +1159,16 @@
/**********************************************************************
- * FreeModule (KERNEL.46)
+ * FreeModule16 (KERNEL.46)
*/
-BOOL FreeModule( HANDLE hModule )
+BOOL16 FreeModule16( HMODULE16 hModule )
{
NE_MODULE *pModule;
hModule = GetExePtr( hModule ); /* In case we were passed an hInstance */
if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE;
- dprintf_module( stddeb, "FreeModule: %s count %d\n",
+ dprintf_module( stddeb, "FreeModule16: %s count %d\n",
MODULE_GetModuleName(hModule), pModule->count );
if (--pModule->count == 0) MODULE_FreeModule( hModule );
return TRUE;
@@ -1157,13 +1178,13 @@
/**********************************************************************
* GetModuleHandle (KERNEL.47)
*/
-HMODULE WIN16_GetModuleHandle( SEGPTR name )
+HMODULE16 WIN16_GetModuleHandle( SEGPTR name )
{
if (HIWORD(name) == 0) return GetExePtr( (HANDLE)name );
return MODULE_FindModule( PTR_SEG_TO_LIN(name) );
}
-HMODULE GetModuleHandle( LPCSTR name )
+HMODULE16 GetModuleHandle( LPCSTR name )
{
return MODULE_FindModule( name );
}
@@ -1237,7 +1258,7 @@
void FreeLibrary( HANDLE handle )
{
dprintf_module( stddeb,"FreeLibrary: %04x\n", handle );
- FreeModule( handle );
+ FreeModule16( handle );
}
@@ -1416,7 +1437,7 @@
/**********************************************************************
* GetExpWinVer (KERNEL.167)
*/
-WORD GetExpWinVer( HMODULE hModule )
+WORD GetExpWinVer( HMODULE16 hModule )
{
NE_MODULE *pModule = MODULE_GetPtr( hModule );
return pModule ? pModule->expected_version : 0;
@@ -1426,7 +1447,7 @@
/**********************************************************************
* ModuleFirst (TOOLHELP.59)
*/
-BOOL ModuleFirst( MODULEENTRY *lpme )
+BOOL16 ModuleFirst( MODULEENTRY *lpme )
{
lpme->wNext = hFirstModule;
return ModuleNext( lpme );
@@ -1436,7 +1457,7 @@
/**********************************************************************
* ModuleNext (TOOLHELP.60)
*/
-BOOL ModuleNext( MODULEENTRY *lpme )
+BOOL16 ModuleNext( MODULEENTRY *lpme )
{
NE_MODULE *pModule;
@@ -1457,7 +1478,7 @@
/**********************************************************************
* ModuleFindName (TOOLHELP.61)
*/
-BOOL ModuleFindName( MODULEENTRY *lpme, LPCSTR name )
+BOOL16 ModuleFindName( MODULEENTRY *lpme, LPCSTR name )
{
lpme->wNext = GetModuleHandle( name );
return ModuleNext( lpme );
@@ -1467,7 +1488,7 @@
/**********************************************************************
* ModuleFindHandle (TOOLHELP.62)
*/
-BOOL ModuleFindHandle( MODULEENTRY *lpme, HMODULE hModule )
+BOOL16 ModuleFindHandle( MODULEENTRY *lpme, HMODULE16 hModule )
{
hModule = GetExePtr( hModule ); /* In case we were passed an hInstance */
lpme->wNext = hModule;
diff --git a/loader/pe_image.c b/loader/pe_image.c
index e97df39..296560a 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -533,7 +533,7 @@
}
HINSTANCE MODULE_CreateInstance(HMODULE hModule,LOADPARAMS *params);
-void InitTask(struct sigcontext_struct context);
+void InitTask(SIGCONTEXT context);
HINSTANCE PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params )
{
@@ -604,7 +604,7 @@
pSegment->selector=(void*)cts;
pModule->ip=0;
#else
- pSegment->selector=cts>>16;
+ pSegment->selector=cts>>16; /* FIXME!! */
pModule->ip=cts & 0xFFFF;
#endif
pSegment++;
@@ -644,7 +644,7 @@
int USER_InitApp(HINSTANCE hInstance);
void PE_InitTEB(int hTEB);
-void PE_Win32CallToStart(struct sigcontext_struct context)
+void PE_Win32CallToStart(SIGCONTEXT context)
{
int fs;
HMODULE hModule;
diff --git a/loader/signal.c b/loader/signal.c
index 0d200ca..0aea7fe 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -54,13 +54,13 @@
* SIGALRM handler.
*/
#ifdef linux
-static void wine_timer(int signal, struct sigcontext_struct context_struct)
+static void wine_timer(int signal, SIGCONTEXT context_struct)
{
#elif defined(__svr4__)
-static void wine_timer(int signal, void *siginfo, ucontext_t *context)
+static void wine_timer(int signal, void *siginfo, SIGCONTEXT *context)
{
#else
-static void wine_timer(int signal, int code, struct sigcontext *context)
+static void wine_timer(int signal, int code, SIGCONTEXT *context)
{
#endif
/* Should do real-time timers here */
@@ -75,14 +75,14 @@
* SIGTRAP handler.
*/
#ifdef linux
-static void SIGNAL_trap(int signal, struct sigcontext_struct context_struct)
+static void SIGNAL_trap(int signal, SIGCONTEXT context_struct)
{
- struct sigcontext_struct *context = &context_struct;
+ SIGCONTEXT *context = &context_struct;
#elif defined(__svr4__) || defined(_SCO_DS)
-static void SIGNAL_trap(int signal, void *siginfo, ucontext_t *context)
+static void SIGNAL_trap(int signal, void *siginfo, SIGCONTEXT *context)
{
#else
-static void SIGNAL_trap(int signal, int code, struct sigcontext *context)
+static void SIGNAL_trap(int signal, int code, SIGCONTEXT *context)
{
#endif
wine_debug( signal, context ); /* Enter our debugger */
@@ -95,14 +95,14 @@
* Segfault handler.
*/
#ifdef linux
-static void SIGNAL_fault(int signal, struct sigcontext_struct context_struct)
+static void SIGNAL_fault(int signal, SIGCONTEXT context_struct)
{
- struct sigcontext_struct *context = &context_struct;
+ SIGCONTEXT *context = &context_struct;
#elif defined(__svr4__) || defined(_SCO_DS)
-static void SIGNAL_fault(int signal, void *siginfo, ucontext_t *context)
+static void SIGNAL_fault(int signal, void *siginfo, SIGCONTEXT *context)
{
#else
-static void SIGNAL_fault(int signal, int code, struct sigcontext *context)
+static void SIGNAL_fault(int signal, int code, SIGCONTEXT *context)
{
#endif
if (CS_reg(context) == WINE_CODE_SELECTOR)
diff --git a/loader/task.c b/loader/task.c
index 48bf3ee..43c7d87 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -22,6 +22,8 @@
#include "module.h"
#include "neexe.h"
#include "options.h"
+#include "peexe.h"
+#include "pe_image.h"
#include "queue.h"
#include "toolhelp.h"
#include "stddebug.h"
@@ -116,7 +118,7 @@
winpathlen += len + 1;
}
if (!winpathlen) winpathlen = 1;
- sysdirlen = GetSystemDirectory( NULL, 0 ) + 1;
+ sysdirlen = GetSystemDirectory32A( NULL, 0 ) + 1;
initial_size = 5 + winpathlen + /* PATH=xxxx */
1 + /* BYTE 0 at end */
sizeof(WORD) + /* WORD 1 */
@@ -176,7 +178,7 @@
*p++ = '\0';
PUT_WORD( p, 1 );
p += sizeof(WORD);
- GetSystemDirectory( p, sysdirlen );
+ GetSystemDirectory32A( p, sysdirlen );
strcat( p, "\\" );
strcat( p, program_name );
@@ -554,9 +556,19 @@
if (Options.debug)
{
- DBG_ADDR addr = { pSegTable[pModule->cs-1].selector, pModule->ip };
- fprintf( stderr, "Task '%s': ", name );
- DEBUG_AddBreakpoint( &addr );
+ if (pModule->flags & NE_FFLAGS_WIN32)
+ {
+ DBG_ADDR addr = { 0, pModule->pe_module->load_addr +
+ pModule->pe_module->pe_header->opt_coff.AddressOfEntryPoint };
+ fprintf( stderr, "Win32 task '%s': ", name );
+ DEBUG_AddBreakpoint( &addr );
+ }
+ else
+ {
+ DBG_ADDR addr = { pSegTable[pModule->cs-1].selector, pModule->ip };
+ fprintf( stderr, "Win16 task '%s': ", name );
+ DEBUG_AddBreakpoint( &addr );
+ }
}
#endif
@@ -584,7 +596,7 @@
/* Free the task module */
- FreeModule( pTask->hModule );
+ FreeModule16( pTask->hModule );
/* Close all open files of this task */
@@ -619,6 +631,7 @@
extern void EXEC_ExitWindows( int retCode );
TDB* pTask = (TDB*) GlobalLock16( hCurrentTask );
+ if (!pTask) EXEC_ExitWindows(0); /* No current task yet */
/* Perform USER cleanup */
@@ -753,7 +766,7 @@
#ifdef WINELIB
void InitTask(void)
#else
-void InitTask( struct sigcontext_struct context )
+void InitTask( SIGCONTEXT context )
#endif
{
static int firstTask = 1;
@@ -959,12 +972,12 @@
/***********************************************************************
- * MakeProcInstance (KERNEL.51)
+ * MakeProcInstance16 (KERNEL.51)
*/
-FARPROC MakeProcInstance( FARPROC func, HANDLE hInstance )
+FARPROC16 MakeProcInstance16( FARPROC16 func, HANDLE16 hInstance )
{
-#ifdef WINELIB32
- return func; /* func can be called directly in Win32 */
+#ifdef WINELIB
+ return func; /* func can be called directly in Winelib */
#else
BYTE *thunk;
SEGPTR thunkaddr;
@@ -987,11 +1000,11 @@
/***********************************************************************
- * FreeProcInstance (KERNEL.52)
+ * FreeProcInstance16 (KERNEL.52)
*/
-void FreeProcInstance( FARPROC func )
+void FreeProcInstance16( FARPROC16 func )
{
-#ifndef WINELIB32
+#ifndef WINELIB
dprintf_task( stddeb, "FreeProcInstance(%08lx)\n", (DWORD)func );
TASK_FreeThunk( hCurrentTask, (SEGPTR)func );
#endif
@@ -1060,7 +1073,7 @@
* GetTaskQueueDS (KERNEL.118)
*/
#ifndef WINELIB
-void GetTaskQueueDS( struct sigcontext_struct context )
+void GetTaskQueueDS( SIGCONTEXT context )
{
DS_reg(&context) = GlobalHandleToSel( GetTaskQueue(0) );
}
@@ -1071,7 +1084,7 @@
* GetTaskQueueES (KERNEL.119)
*/
#ifndef WINELIB
-void GetTaskQueueES( struct sigcontext_struct context )
+void GetTaskQueueES( SIGCONTEXT context )
{
ES_reg(&context) = GlobalHandleToSel( GetTaskQueue(0) );
}
@@ -1081,7 +1094,7 @@
/***********************************************************************
* GetCurrentTask (KERNEL.36)
*/
-HTASK GetCurrentTask(void)
+HTASK16 GetCurrentTask(void)
{
return hCurrentTask;
}
@@ -1223,7 +1236,7 @@
/***********************************************************************
* TaskFirst (TOOLHELP.63)
*/
-BOOL TaskFirst( TASKENTRY *lpte )
+BOOL16 TaskFirst( TASKENTRY *lpte )
{
lpte->hNext = hFirstTask;
return TaskNext( lpte );
@@ -1233,7 +1246,7 @@
/***********************************************************************
* TaskNext (TOOLHELP.64)
*/
-BOOL TaskNext( TASKENTRY *lpte )
+BOOL16 TaskNext( TASKENTRY *lpte )
{
TDB *pTask;
INSTANCEDATA *pInstData;
@@ -1265,7 +1278,7 @@
/***********************************************************************
* TaskFindHandle (TOOLHELP.65)
*/
-BOOL TaskFindHandle( TASKENTRY *lpte, HTASK hTask )
+BOOL16 TaskFindHandle( TASKENTRY *lpte, HTASK16 hTask )
{
lpte->hNext = hTask;
return TaskNext( lpte );
diff --git a/memory/global.c b/memory/global.c
index 1f58f09..111885c 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -485,24 +485,24 @@
/***********************************************************************
- * LockSegment (KERNEL.23)
+ * LockSegment16 (KERNEL.23)
*/
-HGLOBAL LockSegment( HGLOBAL handle )
+HGLOBAL16 LockSegment16( HGLOBAL16 handle )
{
dprintf_global( stddeb, "LockSegment: %04x\n", handle );
- if (handle == (HGLOBAL)-1) handle = CURRENT_DS;
+ if (handle == (HGLOBAL16)-1) handle = CURRENT_DS;
GET_ARENA_PTR(handle)->lockCount++;
return handle;
}
/***********************************************************************
- * UnlockSegment (KERNEL.24)
+ * UnlockSegment16 (KERNEL.24)
*/
-void UnlockSegment( HGLOBAL handle )
+void UnlockSegment16( HGLOBAL16 handle )
{
dprintf_global( stddeb, "UnlockSegment: %04x\n", handle );
- if (handle == (HGLOBAL)-1) handle = CURRENT_DS;
+ if (handle == (HGLOBAL16)-1) handle = CURRENT_DS;
GET_ARENA_PTR(handle)->lockCount--;
/* FIXME: this ought to return the lock count in CX (go figure...) */
}
@@ -546,7 +546,7 @@
/***********************************************************************
* GlobalUnWire (KERNEL.112)
*/
-BOOL GlobalUnWire( HGLOBAL16 handle )
+BOOL16 GlobalUnWire( HGLOBAL16 handle )
{
return GlobalUnlock16( handle );
}
@@ -588,7 +588,7 @@
HGLOBAL16 GlobalLRUOldest( HGLOBAL16 handle )
{
dprintf_global( stddeb, "GlobalLRUOldest: %04x\n", handle );
- if (handle == (HGLOBAL)-1) handle = CURRENT_DS;
+ if (handle == (HGLOBAL16)-1) handle = CURRENT_DS;
return handle;
}
@@ -599,7 +599,7 @@
HGLOBAL16 GlobalLRUNewest( HGLOBAL16 handle )
{
dprintf_global( stddeb, "GlobalLRUNewest: %04x\n", handle );
- if (handle == (HGLOBAL)-1) handle = CURRENT_DS;
+ if (handle == (HGLOBAL16)-1) handle = CURRENT_DS;
return handle;
}
@@ -656,7 +656,7 @@
/***********************************************************************
* FarSetOwner (KERNEL.403)
*/
-void FarSetOwner( HANDLE handle, HANDLE hOwner )
+void FarSetOwner( HANDLE16 handle, HANDLE16 hOwner )
{
GET_ARENA_PTR(handle)->hOwner = hOwner;
}
@@ -665,7 +665,7 @@
/***********************************************************************
* FarGetOwner (KERNEL.404)
*/
-WORD FarGetOwner( HANDLE handle )
+HANDLE16 FarGetOwner( HANDLE16 handle )
{
return GET_ARENA_PTR(handle)->hOwner;
}
@@ -693,7 +693,7 @@
/***********************************************************************
* GlobalFirst (TOOLHELP.51)
*/
-BOOL GlobalFirst( GLOBALENTRY *pGlobal, WORD wFlags )
+BOOL16 GlobalFirst( GLOBALENTRY *pGlobal, WORD wFlags )
{
if (wFlags == GLOBAL_LRU) return FALSE;
pGlobal->dwNext = 0;
@@ -704,7 +704,7 @@
/***********************************************************************
* GlobalNext (TOOLHELP.52)
*/
-BOOL GlobalNext( GLOBALENTRY *pGlobal, WORD wFlags)
+BOOL16 GlobalNext( GLOBALENTRY *pGlobal, WORD wFlags)
{
GLOBALARENA *pArena;
@@ -737,7 +737,7 @@
/***********************************************************************
* GlobalInfo (TOOLHELP.53)
*/
-BOOL GlobalInfo( GLOBALINFO *pInfo )
+BOOL16 GlobalInfo( GLOBALINFO *pInfo )
{
int i;
GLOBALARENA *pArena;
@@ -754,7 +754,7 @@
/***********************************************************************
* GlobalEntryHandle (TOOLHELP.54)
*/
-BOOL GlobalEntryHandle( GLOBALENTRY *pGlobal, HGLOBAL16 hItem )
+BOOL16 GlobalEntryHandle( GLOBALENTRY *pGlobal, HGLOBAL16 hItem )
{
return FALSE;
}
@@ -763,7 +763,7 @@
/***********************************************************************
* GlobalEntryModule (TOOLHELP.55)
*/
-BOOL GlobalEntryModule( GLOBALENTRY *pGlobal, HMODULE16 hModule, WORD wSeg )
+BOOL16 GlobalEntryModule( GLOBALENTRY *pGlobal, HMODULE16 hModule, WORD wSeg )
{
return FALSE;
}
@@ -772,7 +772,7 @@
/***********************************************************************
* MemManInfo (TOOLHELP.72)
*/
-BOOL MemManInfo( MEMMANINFO *pInfo )
+BOOL16 MemManInfo( MEMMANINFO *pInfo )
{
#ifdef linux
/* FIXME: does not take into account the dwSize member
diff --git a/memory/heap.c b/memory/heap.c
index 2411161..a2a60b6 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -4,6 +4,7 @@
* Copyright 1996 Alexandre Julliard
*/
+#define NO_TRANSITION_TYPES /* This file is Win32-clean */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -236,7 +237,7 @@
*
* Make sure the heap storage is committed up to (not including) ptr.
*/
-static BOOL HEAP_Commit( SUBHEAP *subheap, void *ptr )
+static BOOL32 HEAP_Commit( SUBHEAP *subheap, void *ptr )
{
DWORD size = (DWORD)((char *)ptr - (char *)subheap);
size = (size + 0xfff) & 0xfffff000; /* Align size on a page boundary */
@@ -262,7 +263,7 @@
*
* If possible, decommit the heap storage from (including) 'ptr'.
*/
-static BOOL HEAP_Decommit( SUBHEAP *subheap, void *ptr )
+static BOOL32 HEAP_Decommit( SUBHEAP *subheap, void *ptr )
{
DWORD size = (DWORD)((char *)ptr - (char *)subheap);
size = (size + 0xfff) & 0xfffff000; /* Align size on a page boundary */
@@ -373,7 +374,18 @@
if (((char *)pFree == (char *)subheap + subheap->headerSize) &&
(subheap != &subheap->heap->subheap))
{
- /* FIXME: free the sub-heap here */
+ SUBHEAP *pPrev = &subheap->heap->subheap;
+ /* Remove the free block from the list */
+ pFree->next->prev = pFree->prev;
+ pFree->prev->next = pFree->next;
+ /* Remove the subheap from the list */
+ while (pPrev && (pPrev->next != subheap)) pPrev = pPrev->next;
+ if (pPrev) pPrev->next = subheap->next;
+ /* Free the memory */
+ subheap->magic = 0;
+ if (subheap->selector) FreeSelector( subheap->selector );
+ VirtualFree( subheap, subheap->size, MEM_DECOMMIT );
+ VirtualFree( subheap, 0, MEM_RELEASE );
return;
}
@@ -541,7 +553,7 @@
*
* Check that the pointer is inside the range possible for arenas.
*/
-static BOOL HEAP_IsValidArenaPtr( HEAP *heap, void *ptr )
+static BOOL32 HEAP_IsValidArenaPtr( HEAP *heap, void *ptr )
{
int i;
SUBHEAP *subheap = HEAP_FindSubHeap( heap, ptr );
@@ -557,7 +569,7 @@
/***********************************************************************
* HEAP_ValidateFreeArena
*/
-static BOOL HEAP_ValidateFreeArena( SUBHEAP *subheap, ARENA_FREE *pArena )
+static BOOL32 HEAP_ValidateFreeArena( SUBHEAP *subheap, ARENA_FREE *pArena )
{
char *heapEnd = (char *)subheap + subheap->size;
@@ -639,7 +651,7 @@
/***********************************************************************
* HEAP_ValidateInUseArena
*/
-static BOOL HEAP_ValidateInUseArena( SUBHEAP *subheap, ARENA_INUSE *pArena )
+static BOOL32 HEAP_ValidateInUseArena( SUBHEAP *subheap, ARENA_INUSE *pArena )
{
char *heapEnd = (char *)subheap + subheap->size;
@@ -829,7 +841,7 @@
/***********************************************************************
* HeapDestroy (KERNEL32.337)
*/
-BOOL HeapDestroy( HANDLE32 heap )
+BOOL32 HeapDestroy( HANDLE32 heap )
{
HEAP *heapPtr = HEAP_GetPtr( heap );
SUBHEAP *subheap;
@@ -842,6 +854,7 @@
while (subheap)
{
SUBHEAP *next = subheap->next;
+ if (subheap->selector) FreeSelector( subheap->selector );
VirtualFree( subheap, subheap->commitSize, MEM_DECOMMIT );
VirtualFree( subheap, 0, MEM_RELEASE );
subheap = next;
@@ -913,7 +926,7 @@
/***********************************************************************
* HeapFree (KERNEL32.338)
*/
-BOOL HeapFree( HANDLE32 heap, DWORD flags, LPVOID ptr )
+BOOL32 HeapFree( HANDLE32 heap, DWORD flags, LPVOID ptr )
{
ARENA_INUSE *pInUse;
SUBHEAP *subheap;
@@ -1030,7 +1043,7 @@
+ sizeof(ARENA_FREE) - sizeof(ARENA_INUSE);
pInUse->threadId = GetCurrentTask();
pInUse->magic = ARENA_INUSE_MAGIC;
- HEAP_ShrinkBlock( subheap, pInUse, size );
+ HEAP_ShrinkBlock( newsubheap, pInUse, size );
memcpy( pInUse + 1, pArena + 1, oldSize );
/* Free the previous block */
@@ -1077,7 +1090,7 @@
/***********************************************************************
* HeapLock (KERNEL32.339)
*/
-BOOL HeapLock( HANDLE32 heap )
+BOOL32 HeapLock( HANDLE32 heap )
{
HEAP *heapPtr = HEAP_GetPtr( heap );
@@ -1090,7 +1103,7 @@
/***********************************************************************
* HeapUnlock (KERNEL32.342)
*/
-BOOL HeapUnlock( HANDLE32 heap )
+BOOL32 HeapUnlock( HANDLE32 heap )
{
HEAP *heapPtr = HEAP_GetPtr( heap );
@@ -1133,7 +1146,7 @@
/***********************************************************************
* HeapValidate (KERNEL32.343)
*/
-BOOL HeapValidate( HANDLE32 heap, DWORD flags, LPVOID block )
+BOOL32 HeapValidate( HANDLE32 heap, DWORD flags, LPVOID block )
{
SUBHEAP *subheap;
HEAP *heapPtr = (HEAP *)heap;
@@ -1185,7 +1198,7 @@
/***********************************************************************
* HeapWalk (KERNEL32.344)
*/
-BOOL HeapWalk( HANDLE32 heap, void *entry )
+BOOL32 HeapWalk( HANDLE32 heap, void *entry )
{
fprintf( stderr, "HeapWalk(%08x): not implemented\n", heap );
return FALSE;
diff --git a/memory/local.c b/memory/local.c
index 7bc0546..5994e61 100644
--- a/memory/local.c
+++ b/memory/local.c
@@ -78,7 +78,7 @@
WORD hdelta; /* 18 Delta to expand the handle table */
WORD expand; /* 1a Pointer to expand function (unused) */
WORD pstat; /* 1c Pointer to status structure (unused) */
- FARPROC notify WINE_PACKED; /* 1e Pointer to LocalNotify() function */
+ FARPROC16 notify WINE_PACKED; /* 1e Pointer to LocalNotify() function */
WORD lock; /* 22 Lock count for the heap */
WORD extra; /* 24 Extra bytes to allocate when expanding */
WORD minsize; /* 26 Minimum size of the heap */
@@ -294,7 +294,7 @@
/***********************************************************************
* LocalInit (KERNEL.4)
*/
-BOOL LocalInit( HANDLE selector, WORD start, WORD end )
+BOOL16 LocalInit( HANDLE16 selector, WORD start, WORD end )
{
char *ptr;
WORD heapInfoArena, freeArena, lastArena;
@@ -410,7 +410,7 @@
*/
static void LOCAL_GrowHeap( HANDLE16 ds )
{
- HANDLE hseg = GlobalHandle16( ds );
+ HANDLE16 hseg = GlobalHandle16( ds );
LONG oldsize = GlobalSize16( hseg );
LONG end;
LOCALHEAPINFO *pHeapInfo;
@@ -814,7 +814,7 @@
/***********************************************************************
* LOCAL_NewHTable
*/
-static BOOL LOCAL_NewHTable( HANDLE16 ds )
+static BOOL16 LOCAL_NewHTable( HANDLE16 ds )
{
char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
LOCALHEAPINFO *pInfo;
@@ -1230,7 +1230,7 @@
/***********************************************************************
* LOCAL_Unlock
*/
-BOOL LOCAL_Unlock( HANDLE16 ds, HLOCAL16 handle )
+BOOL16 LOCAL_Unlock( HANDLE16 ds, HLOCAL16 handle )
{
char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
@@ -1460,10 +1460,10 @@
/***********************************************************************
* LocalNotify (KERNEL.14)
*/
-FARPROC LocalNotify( FARPROC func )
+FARPROC16 LocalNotify( FARPROC16 func )
{
LOCALHEAPINFO *pInfo;
- FARPROC oldNotify;
+ FARPROC16 oldNotify;
HANDLE16 ds = CURRENT_DS;
if (!(pInfo = LOCAL_GetHeap( ds )))
@@ -1492,7 +1492,7 @@
/***********************************************************************
* GetHeapSpaces (KERNEL.138)
*/
-DWORD GetHeapSpaces( HMODULE module )
+DWORD GetHeapSpaces( HMODULE16 module )
{
NE_MODULE *pModule;
WORD ds;
@@ -1545,7 +1545,7 @@
/***********************************************************************
* LocalInfo (TOOLHELP.56)
*/
-BOOL LocalInfo( LOCALINFO *pLocalInfo, HGLOBAL handle )
+BOOL16 LocalInfo( LOCALINFO *pLocalInfo, HGLOBAL16 handle )
{
LOCALHEAPINFO *pInfo = LOCAL_GetHeap(SELECTOROF(WIN16_GlobalLock16(handle)));
if (!pInfo) return FALSE;
@@ -1557,7 +1557,7 @@
/***********************************************************************
* LocalFirst (TOOLHELP.57)
*/
-BOOL LocalFirst( LOCALENTRY *pLocalEntry, HGLOBAL handle )
+BOOL16 LocalFirst( LOCALENTRY *pLocalEntry, HGLOBAL16 handle )
{
WORD ds = GlobalHandleToSel( handle );
char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
@@ -1580,7 +1580,7 @@
/***********************************************************************
* LocalNext (TOOLHELP.58)
*/
-BOOL LocalNext( LOCALENTRY *pLocalEntry )
+BOOL16 LocalNext( LOCALENTRY *pLocalEntry )
{
WORD ds = GlobalHandleToSel( pLocalEntry->hHeap );
char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
diff --git a/memory/selector.c b/memory/selector.c
index 4b9e45a..b0ddc79 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -101,8 +101,8 @@
* Set the LDT entries for an array of selectors.
*/
static void SELECTOR_SetEntries( WORD sel, const void *base, DWORD size,
- enum seg_type type, BOOL is32bit,
- BOOL readonly )
+ enum seg_type type, BOOL32 is32bit,
+ BOOL32 readonly )
{
ldt_entry entry;
WORD i, count;
@@ -136,7 +136,7 @@
* Allocate selectors for a block of linear memory.
*/
WORD SELECTOR_AllocBlock( const void *base, DWORD size, enum seg_type type,
- BOOL is32bit, BOOL readonly )
+ BOOL32 is32bit, BOOL32 readonly )
{
WORD sel, count;
@@ -154,7 +154,7 @@
* Change the size of a block of selectors.
*/
WORD SELECTOR_ReallocBlock( WORD sel, const void *base, DWORD size,
- enum seg_type type, BOOL is32bit, BOOL readonly )
+ enum seg_type type, BOOL32 is32bit, BOOL32 readonly)
{
WORD i, oldcount, newcount;
ldt_entry entry;
diff --git a/memory/string.c b/memory/string.c
index 3348ec8..88cd5f5 100644
--- a/memory/string.c
+++ b/memory/string.c
@@ -5,6 +5,7 @@
* Copyright 1996 Alexandre Julliard
*/
+#define NO_TRANSITION_TYPES /* This file is Win32-clean */
#include <ctype.h>
#include <string.h>
#include "windows.h"
@@ -333,3 +334,39 @@
}
return toupper(*str1) - toupper(*str2);
}
+
+
+/***********************************************************************
+ * RtlFillMemory (KERNEL32.441)
+ */
+VOID RtlFillMemory( LPVOID ptr, UINT32 len, UINT32 fill )
+{
+ memset( ptr, fill, len );
+}
+
+
+/***********************************************************************
+ * RtlMoveMemory (KERNEL32.442)
+ */
+VOID RtlMoveMemory( LPVOID dst, LPCVOID src, UINT32 len )
+{
+ /* memcpy does not support overlapped copies, */
+ /* and memmove is not portable. */
+ if (((BYTE *)dst + len <= (BYTE *)src) ||
+ ((BYTE *)src + len <= (BYTE *)dst))
+ {
+ memcpy( dst, src, len );
+ return;
+ }
+ /* do it the hard way (FIXME: could do better than this) */
+ while (len--) *((BYTE *)dst)++ = *((BYTE *)src)++;
+}
+
+
+/***********************************************************************
+ * RtlZeroMemory (KERNEL32.444)
+ */
+VOID RtlZeroMemory( LPVOID ptr, UINT32 len )
+{
+ memset( ptr, 0, len );
+}
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 4ca2ee7..dc5a829 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -2292,7 +2292,7 @@
lplf->lfWeight=fontstyles[i].weight;
hf=CreateFontIndirect(lplf);
hf=SelectObject(hdc,hf);
- GetTextMetrics(hdc,lptm);
+ GetTextMetrics16(hdc,lptm);
hf=SelectObject(hdc,hf);
DeleteObject(hf);
diff --git a/misc/driver.c b/misc/driver.c
index eb51ba9..6277f8a 100644
--- a/misc/driver.c
+++ b/misc/driver.c
@@ -2,14 +2,14 @@
* Wine Drivers functions
*
* Copyright 1994 Martin Ayotte
-static char Copyright[] = "Copyright Martin Ayotte, 1994";
*/
#include <stdio.h>
#include "windows.h"
#include "win.h"
-#include "user.h"
+#include "callback.h"
#include "driver.h"
+#include "module.h"
#include "stddebug.h"
#include "debug.h"
@@ -17,205 +17,294 @@
void LoadStartupDrivers(void)
{
- HDRVR hDrv;
- char str[256];
- LPSTR ptr = str;
- LPSTR file = "SYSTEM.INI";
- if (GetPrivateProfileString("drivers", NULL,
- "", str, sizeof(str), file) < 2) {
- fprintf(stderr,
- "LoadStartupDrivers // can't find drivers section in '%s'\n",
- file);
- return;
- }
- while(strlen(ptr) != 0) {
- dprintf_driver(stddeb,"LoadStartupDrivers // str='%s'\n", ptr);
- hDrv = OpenDriver(ptr, "drivers", 0L);
- dprintf_driver(stddeb,
- "LoadStartupDrivers // hDrv=%04x\n", hDrv);
- ptr += strlen(ptr) + 1;
- }
- dprintf_driver(stddeb,"LoadStartupDrivers // end of list !\n");
+ HDRVR16 hDrv;
+ char str[256];
+ LPSTR ptr;
+
+ if (GetPrivateProfileString( "drivers", NULL, "", str, sizeof(str),
+ "SYSTEM.INI" ) < 2)
+ {
+ fprintf( stderr,
+ "LoadStartupDrivers // can't find drivers section in system.ini\n" );
+ return;
+ }
+
+ ptr = str;
+ while (lstrlen32A( ptr ) != 0)
+ {
+ dprintf_driver( stddeb, "LoadStartupDrivers // str='%s'\n", ptr );
+ hDrv = OpenDriver( ptr, "drivers", 0L );
+ dprintf_driver( stddeb, "LoadStartupDrivers // hDrv=%04x\n", hDrv );
+ ptr += lstrlen32A(ptr) + 1;
+ }
+ dprintf_driver( stddeb, "LoadStartupDrivers // end of list !\n" );
+
+ return;
}
/**************************************************************************
* SendDriverMessage [USER.251]
*/
-LRESULT SendDriverMessage(HDRVR hDriver, WORD msg, LPARAM lParam1, LPARAM lParam2)
+LRESULT SendDriverMessage(HDRVR16 hDriver, UINT16 msg, LPARAM lParam1,
+ LPARAM lParam2)
{
- dprintf_driver(stdnimp,"SendDriverMessage(%04x, %04X, %08lX, %08lX);\n",
- hDriver, msg, lParam1, lParam2);
- return 0;
+ LPDRIVERITEM lpdrv;
+ LRESULT retval;
+
+ dprintf_driver( stddeb, "SendDriverMessage(%04x, %04X, %08lX, %08lX)\n",
+ hDriver, msg, lParam1, lParam2 );
+
+ lpdrv = (LPDRIVERITEM)GlobalLock16( hDriver );
+ if (lpdrv == NULL || lpdrv->dis.hDriver != hDriver)
+ {
+ GlobalUnlock16( hDriver );
+ return 0;
+ }
+
+ retval = CallDriverProc( lpdrv->lpDrvProc, 0L /* FIXME */, hDriver, msg,
+ lParam1, lParam2 );
+
+ dprintf_driver( stddeb, "SendDriverMessage // retval = %ld\n", retval );
+
+ GlobalUnlock16( hDriver );
+ return retval;
}
/**************************************************************************
* OpenDriver [USER.252]
*/
-HDRVR OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
+HDRVR16 OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
{
- HDRVR hDrvr;
- LPDRIVERITEM lpnewdrv;
- LPDRIVERITEM lpdrv = lpDrvItemList;
- char DrvName[128];
- dprintf_driver(stddeb,"OpenDriver('%s', '%s', %08lX);\n",
- lpDriverName, lpSectionName, lParam);
- if (lpSectionName == NULL) lpSectionName = "drivers";
- GetPrivateProfileString(lpSectionName, lpDriverName,
- "", DrvName, sizeof(DrvName), "SYSTEM.INI");
- dprintf_driver(stddeb,"OpenDriver // DrvName='%s'\n", DrvName);
- if (strlen(DrvName) < 1) return 0;
- while (lpdrv != NULL) {
- if (lpdrv->lpNextItem == NULL) break;
- lpdrv = lpdrv->lpNextItem;
- }
- hDrvr = GlobalAlloc16(GMEM_MOVEABLE, sizeof(DRIVERITEM));
- lpnewdrv = (LPDRIVERITEM) GlobalLock16(hDrvr);
- if (lpnewdrv == NULL) return 0;
- lpnewdrv->dis.length = sizeof(DRIVERINFOSTRUCT);
- lpnewdrv->dis.hModule = 0;
-/* lpnewdrv->dis.hModule = LoadImage(DrvName, DLL, 0);
- if (lpnewdrv->dis.hModule == 0) {
- GlobalUnlock(hDrvr);
- GlobalFree(hDrvr);
- return 0;
- } */
- lpnewdrv->dis.hDriver = hDrvr;
- strcpy(lpnewdrv->dis.szAliasName, lpDriverName);
- lpnewdrv->count = 0;
- lpnewdrv->lpNextItem = NULL;
- if (lpDrvItemList == NULL || lpdrv == NULL) {
- lpDrvItemList = lpnewdrv;
- lpnewdrv->lpPrevItem = NULL;
- }
- else {
- lpdrv->lpNextItem = lpnewdrv;
- lpnewdrv->lpPrevItem = lpdrv;
- }
- lpnewdrv->lpDrvProc = (DRIVERPROC)NULL;
- dprintf_driver(stddeb,"OpenDriver // hDrvr=%04x loaded !\n", hDrvr);
- return hDrvr;
+ HDRVR16 hDrvr;
+ LPDRIVERITEM lpdrv, lpnewdrv;
+ char DrvName[128];
+ WORD ordinal;
+
+ dprintf_driver( stddeb,"OpenDriver('%s', '%s', %08lX);\n",
+ lpDriverName, lpSectionName, lParam );
+
+ if (lpSectionName == NULL) lpSectionName = "drivers";
+ GetPrivateProfileString( lpSectionName, lpDriverName, "", DrvName,
+ sizeof(DrvName), "SYSTEM.INI" );
+ dprintf_driver( stddeb,"OpenDriver // DrvName='%s'\n", DrvName );
+ if (lstrlen32A(DrvName) < 1) return 0;
+
+ lpdrv = lpDrvItemList;
+ while (lpdrv) /* XXX find it... like this? */
+ {
+ if (!lstrcmpi32A( lpDriverName, lpdrv->dis.szAliasName ))
+ {
+ lpdrv->count++;
+ SendDriverMessage( lpdrv->dis.hDriver, DRV_OPEN, 0L, lParam );
+ return lpdrv->dis.hDriver;
+ }
+ lpdrv = lpdrv->lpNextItem;
+ }
+
+ lpdrv = lpDrvItemList; /* find end of list */
+ if (lpdrv != NULL)
+ while (lpdrv->lpNextItem != NULL)
+ lpdrv = lpdrv->lpNextItem;
+
+ hDrvr = GlobalAlloc16( GMEM_MOVEABLE, sizeof(DRIVERITEM) );
+ lpnewdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
+ if (lpnewdrv == NULL) return 0;
+ lpnewdrv->dis.length = sizeof( DRIVERINFOSTRUCT16 );
+ lpnewdrv->dis.hModule = LoadModule( DrvName, (LPVOID)-1 );
+ if (!lpnewdrv->dis.hModule)
+ {
+ GlobalUnlock16( hDrvr );
+ GlobalFree16( hDrvr );
+ return 0;
+ }
+ lpnewdrv->dis.hDriver = hDrvr;
+ lstrcpy32A( lpnewdrv->dis.szAliasName, lpDriverName );
+ lpnewdrv->count = 1;
+ ordinal = MODULE_GetOrdinal( lpnewdrv->dis.hModule, "DRIVERPROC" );
+ if (!ordinal ||
+ !(lpnewdrv->lpDrvProc = MODULE_GetEntryPoint( lpnewdrv->dis.hModule,
+ ordinal )))
+ {
+ FreeModule16( lpnewdrv->dis.hModule );
+ GlobalUnlock16( hDrvr );
+ GlobalFree16( hDrvr );
+ return 0;
+ }
+
+ lpnewdrv->lpNextItem = NULL;
+ if (lpDrvItemList == NULL)
+ {
+ lpDrvItemList = lpnewdrv;
+ lpnewdrv->lpPrevItem = NULL;
+ }
+ else
+ {
+ lpdrv->lpNextItem = lpnewdrv;
+ lpnewdrv->lpPrevItem = lpdrv;
+ }
+
+ SendDriverMessage( hDrvr, DRV_LOAD, 0L, lParam );
+ SendDriverMessage( hDrvr, DRV_ENABLE, 0L, lParam );
+ SendDriverMessage( hDrvr, DRV_OPEN, 0L, lParam );
+
+ dprintf_driver( stddeb, "OpenDriver // hDrvr=%04x loaded !\n", hDrvr );
+ return hDrvr;
}
/**************************************************************************
* CloseDriver [USER.253]
*/
-LRESULT CloseDriver(HDRVR hDrvr, LPARAM lParam1, LPARAM lParam2)
+LRESULT CloseDriver(HDRVR16 hDrvr, LPARAM lParam1, LPARAM lParam2)
{
- LPDRIVERITEM lpdrv;
- dprintf_driver(stddeb,
- "CloseDriver(%04x, %08lX, %08lX);\n", hDrvr, lParam1, lParam2);
- lpdrv = (LPDRIVERITEM) GlobalLock16(hDrvr);
- if (lpdrv != NULL && lpdrv->dis.hDriver == hDrvr) {
- if (lpdrv->lpPrevItem)
- ((LPDRIVERITEM)lpdrv->lpPrevItem)->lpNextItem = lpdrv->lpNextItem;
- if (lpdrv->lpNextItem)
- ((LPDRIVERITEM)lpdrv->lpNextItem)->lpPrevItem = lpdrv->lpPrevItem;
- GlobalUnlock16(hDrvr);
- GlobalFree16(hDrvr);
- dprintf_driver(stddeb,"CloseDriver // hDrvr=%04x closed !\n", hDrvr);
- return TRUE;
- }
- return FALSE;
+ LPDRIVERITEM lpdrv;
+
+ dprintf_driver( stddeb, "CloseDriver(%04x, %08lX, %08lX);\n",
+ hDrvr, lParam1, lParam2 );
+
+ lpdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
+ if (lpdrv != NULL && lpdrv->dis.hDriver == hDrvr)
+ {
+ SendDriverMessage( hDrvr, DRV_CLOSE, lParam1, lParam2 );
+ if (--lpdrv->count == 0)
+ {
+ SendDriverMessage( hDrvr, DRV_DISABLE, lParam1, lParam2 );
+ SendDriverMessage( hDrvr, DRV_FREE, lParam1, lParam2 );
+
+ if (lpdrv->lpPrevItem)
+ lpdrv->lpPrevItem->lpNextItem = lpdrv->lpNextItem;
+ else
+ lpDrvItemList = lpdrv->lpNextItem;
+ if (lpdrv->lpNextItem)
+ lpdrv->lpNextItem->lpPrevItem = lpdrv->lpPrevItem;
+
+ FreeModule16( lpdrv->dis.hModule );
+ GlobalUnlock16( hDrvr );
+ GlobalFree16( hDrvr );
+ }
+
+ dprintf_driver( stddeb, "CloseDriver // hDrvr=%04x closed !\n",
+ hDrvr );
+ return TRUE;
+ }
+ return FALSE;
}
/**************************************************************************
* GetDriverModuleHandle [USER.254]
*/
-HANDLE GetDriverModuleHandle(HDRVR hDrvr)
+HMODULE16 GetDriverModuleHandle(HDRVR16 hDrvr)
{
- LPDRIVERITEM lpdrv;
- HANDLE hModule = 0;
- dprintf_driver(stddeb,"GetDriverModuleHandle(%04x);\n", hDrvr);
- lpdrv = (LPDRIVERITEM) GlobalLock16(hDrvr);
- if (lpdrv != NULL) {
- hModule = lpdrv->dis.hModule;
- GlobalUnlock16(hDrvr);
- }
- return hModule;
+ LPDRIVERITEM lpdrv;
+ HMODULE hModule = 0;
+
+ dprintf_driver( stddeb, "GetDriverModuleHandle(%04x);\n", hDrvr);
+
+ lpdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
+ if (lpdrv != NULL && lpdrv->dis.hDriver == hDrvr)
+ {
+ hModule = lpdrv->dis.hModule;
+ GlobalUnlock16( hDrvr );
+ }
+ return hModule;
}
/**************************************************************************
* DefDriverProc [USER.255]
*/
-LRESULT DefDriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg,
- DWORD dwParam1, DWORD dwParam2)
+LRESULT DefDriverProc(DWORD dwDevID, HDRVR hDriv, UINT16 wMsg,
+ LPARAM lParam1, LPARAM lParam2)
{
- switch(wMsg) {
- case DRV_LOAD:
- return (LRESULT)0L;
- case DRV_FREE:
- return (LRESULT)0L;
- case DRV_OPEN:
- return (LRESULT)0L;
- case DRV_CLOSE:
- return (LRESULT)0L;
- case DRV_ENABLE:
- return (LRESULT)0L;
- case DRV_DISABLE:
- return (LRESULT)0L;
- case DRV_QUERYCONFIGURE:
- return (LRESULT)0L;
- case DRV_CONFIGURE:
- MessageBox((HWND)NULL, "Driver isn't configurable !",
- "Wine Driver", MB_OK);
- return (LRESULT)0L;
- case DRV_INSTALL:
- return (LRESULT)DRVCNF_RESTART;
- case DRV_REMOVE:
- return (LRESULT)DRVCNF_RESTART;
- default:
- return (LRESULT)0L;
- }
+ switch(wMsg)
+ {
+ case DRV_LOAD:
+ return (LRESULT)0L;
+ case DRV_FREE:
+ return (LRESULT)0L;
+ case DRV_OPEN:
+ return (LRESULT)0L;
+ case DRV_CLOSE:
+ return (LRESULT)0L;
+ case DRV_ENABLE:
+ return (LRESULT)0L;
+ case DRV_DISABLE:
+ return (LRESULT)0L;
+ case DRV_QUERYCONFIGURE:
+ return (LRESULT)0L;
+
+ case DRV_CONFIGURE:
+ MessageBox( (HWND)NULL, "Driver isn't configurable !",
+ "Wine Driver", MB_OK );
+ return (LRESULT)0L;
+
+ case DRV_INSTALL:
+ return (LRESULT)DRVCNF_RESTART;
+
+ case DRV_REMOVE:
+ return (LRESULT)DRVCNF_RESTART;
+
+ default:
+ return (LRESULT)0L;
+ }
}
/**************************************************************************
* GetDriverInfo [USER.256]
*/
-BOOL GetDriverInfo(HDRVR hDrvr, LPDRIVERINFOSTRUCT lpDrvInfo)
+BOOL16 GetDriverInfo(HDRVR16 hDrvr, LPDRIVERINFOSTRUCT16 lpDrvInfo)
{
- LPDRIVERITEM lpdrv;
- dprintf_driver(stddeb,"GetDriverInfo(%04x, %p);\n", hDrvr, lpDrvInfo);
- if (lpDrvInfo == NULL) return FALSE;
- lpdrv = (LPDRIVERITEM) GlobalLock16(hDrvr);
- if (lpdrv == NULL) return FALSE;
- memcpy(lpDrvInfo, &lpdrv->dis, sizeof(DRIVERINFOSTRUCT));
- GlobalUnlock16(hDrvr);
- return TRUE;
+ LPDRIVERITEM lpdrv;
+
+ dprintf_driver( stddeb, "GetDriverInfo(%04x, %p);\n", hDrvr, lpDrvInfo );
+
+ if (lpDrvInfo == NULL) return FALSE;
+
+ lpdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
+ if (lpdrv == NULL) return FALSE;
+ memcpy( lpDrvInfo, &lpdrv->dis, sizeof(DRIVERINFOSTRUCT16) );
+ GlobalUnlock16( hDrvr );
+
+ return TRUE;
}
/**************************************************************************
* GetNextDriver [USER.257]
*/
-HDRVR GetNextDriver(HDRVR hDrvr, DWORD dwFlags)
+HDRVR16 GetNextDriver(HDRVR16 hDrvr, DWORD dwFlags)
{
- LPDRIVERITEM lpdrv;
- HDRVR hRetDrv = 0;
- dprintf_driver(stddeb,"GetNextDriver(%04x, %08lX);\n", hDrvr, dwFlags);
- if (hDrvr == 0) {
- if (lpDrvItemList == NULL) {
- dprintf_driver(stddeb,
- "GetNextDriver // drivers list empty !\n");
- LoadStartupDrivers();
- if (lpDrvItemList == NULL) return 0;
- }
- dprintf_driver(stddeb,"GetNextDriver // return first %04x !\n",
- lpDrvItemList->dis.hDriver);
- return lpDrvItemList->dis.hDriver;
- }
- lpdrv = (LPDRIVERITEM) GlobalLock16(hDrvr);
- if (lpdrv != NULL) {
- if (dwFlags & GND_REVERSE) {
- if (lpdrv->lpPrevItem)
- hRetDrv = ((LPDRIVERITEM)lpdrv->lpPrevItem)->dis.hDriver;
- }
- else {
- if (lpdrv->lpNextItem)
- hRetDrv = ((LPDRIVERITEM)lpdrv->lpNextItem)->dis.hDriver;
- }
- GlobalUnlock16(hDrvr);
- }
- dprintf_driver(stddeb,"GetNextDriver // return %04x !\n", hRetDrv);
- return hRetDrv;
+ LPDRIVERITEM lpdrv;
+ HDRVR16 hRetDrv = 0;
+
+ dprintf_driver( stddeb, "GetNextDriver(%04x, %08lX);\n", hDrvr, dwFlags );
+
+ if (hDrvr == 0)
+ {
+ if (lpDrvItemList == NULL)
+ {
+ dprintf_driver(stddeb, "GetNextDriver // drivers list empty !\n");
+ LoadStartupDrivers();
+ if (lpDrvItemList == NULL) return 0;
+ }
+ dprintf_driver( stddeb,"GetNextDriver // return first %04x !\n",
+ lpDrvItemList->dis.hDriver );
+ return lpDrvItemList->dis.hDriver;
+ }
+
+ lpdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
+ if (lpdrv != NULL)
+ {
+ if (dwFlags & GND_REVERSE)
+ {
+ if (lpdrv->lpPrevItem)
+ hRetDrv = lpdrv->lpPrevItem->dis.hDriver;
+ }
+ else
+ {
+ if (lpdrv->lpNextItem)
+ hRetDrv = lpdrv->lpNextItem->dis.hDriver;
+ }
+ GlobalUnlock16( hDrvr );
+ }
+
+ dprintf_driver( stddeb, "GetNextDriver // return %04x !\n", hRetDrv );
+ return hRetDrv;
}
-
-
diff --git a/misc/exec.c b/misc/exec.c
index d863e16..fb67a0b 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -7,9 +7,10 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
+#include "windows.h"
+#include "heap.h"
#include "neexe.h"
#include "shell.h"
-#include "windows.h"
#include "callback.h"
#include "stddebug.h"
#include "debug.h"
@@ -54,50 +55,36 @@
*/
BOOL ExitWindows( DWORD dwReturnCode, WORD wReserved )
{
- HWND hwndDesktop;
- WND *wndPtr;
- HWND *list, *pWnd;
- int count, i;
- BOOL result;
+ int i;
+ BOOL16 result;
+ WND **list, **ppWnd;
api_assert("ExitWindows", wReserved == 0);
api_assert("ExitWindows", HIWORD(dwReturnCode) == 0);
/* We have to build a list of all windows first, as in EnumWindows */
- /* First count the windows */
+ if (!(list = WIN_BuildWinArray( WIN_GetDesktop() ))) return FALSE;
- hwndDesktop = GetDesktopWindow();
- count = 0;
- for (wndPtr = WIN_GetDesktop()->child; wndPtr; wndPtr = wndPtr->next)
- count++;
- if (!count) /* No windows, we can exit at once */
- EXEC_ExitWindows( LOWORD(dwReturnCode) );
+ /* Send a WM_QUERYENDSESSION message to every window */
- /* Now build the list of all windows */
-
- if (!(pWnd = list = (HWND *)malloc( sizeof(HWND) * count ))) return FALSE;
- for (wndPtr = WIN_GetDesktop()->child; wndPtr; wndPtr = wndPtr->next)
- *pWnd++ = wndPtr->hwndSelf;
-
- /* Now send a WM_QUERYENDSESSION message to every window */
-
- for (pWnd = list, i = 0; i < count; i++, pWnd++)
+ for (ppWnd = list, i = 0; *ppWnd; ppWnd++, i++)
{
- /* Make sure that window still exists */
- if (!IsWindow(*pWnd)) continue;
- if (!SendMessage16( *pWnd, WM_QUERYENDSESSION, 0, 0 )) break;
+ /* Make sure that the window still exists */
+ if (!IsWindow( (*ppWnd)->hwndSelf )) continue;
+ if (!SendMessage16( (*ppWnd)->hwndSelf, WM_QUERYENDSESSION, 0, 0 ))
+ break;
}
- result = (i == count);
+ result = !(*ppWnd);
/* Now notify all windows that got a WM_QUERYENDSESSION of the result */
- for (pWnd = list; i > 0; i--, pWnd++)
+ for (ppWnd = list; i > 0; i--, ppWnd++)
{
- if (!IsWindow(*pWnd)) continue;
- SendMessage16( *pWnd, WM_ENDSESSION, result, 0 );
+ if (!IsWindow( (*ppWnd)->hwndSelf )) continue;
+ SendMessage16( (*ppWnd)->hwndSelf, WM_ENDSESSION, result, 0 );
}
- free( list );
+ HeapFree( SystemHeap, 0, list );
if (result) EXEC_ExitWindows( LOWORD(dwReturnCode) );
return FALSE;
diff --git a/misc/lzexpand.c b/misc/lzexpand.c
index e907bfd..7726d96 100644
--- a/misc/lzexpand.c
+++ b/misc/lzexpand.c
@@ -396,7 +396,7 @@
LZSeek(HFILE fd,LONG off,INT32 type) {
int i;
struct lzstate *lzs;
- LONG lastwanted,newwanted;
+ LONG newwanted;
dprintf_file(stddeb,"LZSeek(%d,%ld,%d)\n",fd,off,type);
for (i=0;i<nroflzstates;i++)
@@ -406,7 +406,6 @@
if (i==nroflzstates)
return _llseek(fd,off,type);
lzs = lzstates+i;
- lastwanted = lzs->realwanted;
newwanted = lzs->realwanted;
switch (type) {
case 1: /* SEEK_CUR */
@@ -424,7 +423,7 @@
if (newwanted<0)
return LZERROR_BADVALUE;
lzs->realwanted = newwanted;
- return lastwanted;
+ return newwanted;
}
/*
diff --git a/misc/main.c b/misc/main.c
index adc8255..2e01aa0 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -227,7 +227,7 @@
* ParseDebugOptions
*
* Turns specific debug messages on or off, according to "options".
- * Returns TRUE if parsing was successfull
+ * Returns TRUE if parsing was successful
*/
#ifdef DEBUG_RUNTIME
@@ -655,6 +655,17 @@
/***********************************************************************
+ * Beep (KERNEL32.11)
+ */
+BOOL32 Beep( DWORD dwFreq, DWORD dwDur )
+{
+ /* dwFreq and dwDur are ignored by Win95 */
+ XBell(display, 100);
+ return TRUE;
+}
+
+
+/***********************************************************************
* GetVersion (KERNEL.3)
*/
LONG GetVersion(void)
@@ -761,7 +772,7 @@
/***********************************************************************
* SetEnvironment (GDI.132)
*/
-int SetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nCount)
+int SetEnvironment(LPCSTR lpPortName, LPCSTR lpEnviron, WORD nCount)
{
LPENVENTRY lpNewEnv;
LPENVENTRY lpEnv = lpEnvList;
@@ -826,10 +837,11 @@
return nCount;
}
+
/***********************************************************************
- * SetEnvironmentVariableA (KERNEL32.484)
+ * SetEnvironmentVariable32A (KERNEL32.484)
*/
-BOOL SetEnvironmentVariableA(LPSTR lpName, LPSTR lpValue)
+BOOL32 SetEnvironmentVariable32A( LPCSTR lpName, LPCSTR lpValue )
{
int rc;
@@ -837,6 +849,24 @@
return (rc > 0) ? 1 : 0;
}
+
+/***********************************************************************
+ * SetEnvironmentVariable32W (KERNEL32.485)
+ */
+BOOL32 SetEnvironmentVariable32W( LPCWSTR lpName, LPCWSTR lpValue )
+{
+ LPSTR lpAName, lpAValue;
+ BOOL ret;
+
+ lpAName = STRING32_DupUniToAnsi( lpName );
+ lpAValue = STRING32_DupUniToAnsi ( lpValue );
+ ret = SetEnvironment(lpAName, lpAValue, strlen(lpAValue) + 1);
+ free (lpAName);
+ free (lpAValue);
+ return (ret > 0) ? 1 : 0;
+}
+
+
/***********************************************************************
* GetEnvironment (GDI.134)
*/
diff --git a/misc/network.c b/misc/network.c
index 65ef9cb..7303d60 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -161,7 +161,7 @@
if (lpLocalName[1] == ':')
{
int drive = toupper(lpLocalName[0]) - 'A';
- switch(GetDriveType(drive))
+ switch(GetDriveType16(drive))
{
case DRIVE_CANNOTDETERMINE:
case DRIVE_DOESNOTEXIST:
diff --git a/misc/registry.c b/misc/registry.c
index de792a1..31c41a8 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -1714,9 +1714,12 @@
}
if (i==lpkey->nrofvalues) {
if (lpszValueName==NULL) {
- *(WCHAR*)lpbData = 0;
- *lpcbData = 2;
- *lpdwType = REG_SZ;
+ if (lpbData) {
+ *(WCHAR*)lpbData = 0;
+ *lpcbData = 2;
+ }
+ if (lpdwType)
+ *lpdwType = REG_SZ;
return SHELL_ERROR_SUCCESS;
}
return SHELL_ERROR_BADKEY;/*FIXME: correct return? */
@@ -1790,6 +1793,7 @@
LPBYTE buf;
DWORD ret,myxlen;
DWORD *mylen;
+ DWORD type;
dprintf_reg(stddeb,"RegQueryValueEx32A(%x,%s,%p,%p,%p,%ld)\n->",
hkey,lpszValueName,lpdwReserved,lpdwType,lpbData,
@@ -1813,18 +1817,21 @@
else
lpszValueNameW=NULL;
+ if (lpdwType)
+ type=*lpdwType;
ret=RegQueryValueEx32W(
hkey,
lpszValueNameW,
lpdwReserved,
- lpdwType,
+ &type,
buf,
mylen
);
-
+ if (lpdwType)
+ *lpdwType=type;
if (ret==ERROR_SUCCESS) {
if (buf) {
- if (UNICONVMASK & (1<<(*lpdwType))) {
+ if (UNICONVMASK & (1<<(type))) {
/* convert UNICODE to ASCII */
strcpyWA(lpbData,(LPWSTR)buf);
*lpcbData = myxlen/2;
@@ -1837,11 +1844,11 @@
*lpcbData = myxlen;
}
} else {
- if ((UNICONVMASK & (1<<(*lpdwType))) && lpcbData)
+ if ((UNICONVMASK & (1<<(type))) && lpcbData)
*lpcbData = myxlen/2;
}
} else {
- if ((UNICONVMASK & (1<<(*lpdwType))) && lpcbData)
+ if ((UNICONVMASK & (1<<(type))) && lpcbData)
*lpcbData = myxlen/2;
}
if (buf)
diff --git a/misc/spy.c b/misc/spy.c
index f5fbd4d..8425ad9 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -429,7 +429,7 @@
if (!MessageTypeNames[msg]) return "???";
return MessageTypeNames[msg];
}
- sprintf( buffer, "WM_USER+%04x\n", msg - WM_USER );
+ sprintf( buffer, "WM_USER+%04x", msg - WM_USER );
return buffer;
}
diff --git a/misc/system.c b/misc/system.c
index 2b17178..ee60a03 100644
--- a/misc/system.c
+++ b/misc/system.c
@@ -21,7 +21,7 @@
return 54925;
case 1: /* Get drive type */
- drivetype = GetDriveType( drive );
+ drivetype = GetDriveType16( drive );
return MAKELONG( drivetype, drivetype );
case 2: /* Enable one-drive logic */
diff --git a/misc/toolhelp.c b/misc/toolhelp.c
index cd34e20..551078c 100644
--- a/misc/toolhelp.c
+++ b/misc/toolhelp.c
@@ -29,8 +29,7 @@
static int nrofnotifys = 0;
-BOOL
-NotifyRegister(HTASK htask,FARPROC lpfnCallback,WORD wFlags)
+BOOL16 NotifyRegister( HTASK16 htask, FARPROC16 lpfnCallback, WORD wFlags )
{
int i;
diff --git a/misc/user.c b/misc/user.c
index b20b262..8976d77 100644
--- a/misc/user.c
+++ b/misc/user.c
@@ -76,7 +76,7 @@
/***********************************************************************
* TimerCount (TOOLHELP.80)
*/
-BOOL TimerCount( TIMERINFO *pTimerInfo )
+BOOL16 TimerCount( TIMERINFO *pTimerInfo )
{
/* FIXME
* In standard mode, dwmsSinceStart = dwmsThisVM
diff --git a/misc/ver.c b/misc/ver.c
index 7541a82..5a47d12 100644
--- a/misc/ver.c
+++ b/misc/ver.c
@@ -21,7 +21,9 @@
#include "winreg.h"
#include "string32.h"
-#define LZREAD(what) if (sizeof(*what)!=LZRead32(lzfd,what,sizeof(*what))) return 0;
+#define LZREAD(what) \
+ if (sizeof(*what)!=LZRead32(lzfd,what,sizeof(*what))) return 0;
+#define LZTELL(lzfd) LZSeek(lzfd, 0, SEEK_CUR);
#define strdupW2A(x) STRING32_DupUniToAnsi(x)
#define strdupA2W(x) STRING32_DupAnsiToUni(x)
@@ -57,7 +59,8 @@
WORD shiftcount;
DWORD nehdoffset;
- nehdoffset=LZSeek(lzfd,nehd->resource_tab_offset,SEEK_CUR);
+ nehdoffset = LZTELL(lzfd);
+ LZSeek(lzfd,nehd->resource_tab_offset,SEEK_CUR);
LZREAD(&shiftcount);
dprintf_resource(stderr,"shiftcount is %d\n",shiftcount);
dprintf_resource(stderr,"reading resource typeinfo dir.\n");
@@ -83,7 +86,8 @@
char *str;
DWORD whereleft;
- whereleft=LZSeek(
+ whereleft = LZTELL(lzfd);
+ LZSeek(
lzfd,
nehdoffset+nehd->resource_tab_offset+ti.type_id,
SEEK_SET
@@ -123,7 +127,8 @@
char *str;
DWORD whereleft;
- whereleft=LZSeek(
+ whereleft = LZTELL(lzfd);
+ LZSeek(
lzfd,
nehdoffset+nehd->resource_tab_offset+ni.id,
SEEK_SET
@@ -187,7 +192,7 @@
return reslen;
}
-/* GetFileResourceSize [VER.3] */
+/* GetFileResource [VER.3] */
DWORD
GetFileResource(LPCSTR filename,SEGPTR restype,SEGPTR resid,
DWORD off,DWORD datalen,LPVOID data
@@ -195,7 +200,7 @@
HFILE lzfd;
OFSTRUCT ofs;
BYTE *resdata;
- int reslen;
+ int reslen=datalen;
struct ne_header_s nehd;
fprintf(stderr,"GetFileResource(%s,%lx,%lx,%ld,%ld,%p)\n",
filename,(LONG)restype,(LONG)resid,off,datalen,data
diff --git a/misc/wsprintf.c b/misc/wsprintf.c
index f8f77aa..a57d23f 100644
--- a/misc/wsprintf.c
+++ b/misc/wsprintf.c
@@ -4,6 +4,7 @@
* Copyright 1996 Alexandre Julliard
*/
+#define NO_TRANSITION_TYPES /* This file is Win32-clean */
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
@@ -246,10 +247,12 @@
spec += WPRINTF_ParseFormatA( spec, &format );
switch(format.type)
{
+ case WPR_WCHAR: /* No Unicode in Win16 */
case WPR_CHAR:
cur_arg = (DWORD)*(CHAR *)args;
args = (WORD *)args + 1;
break;
+ case WPR_WSTRING: /* No Unicode in Win16 */
case WPR_STRING:
cur_arg = (DWORD)PTR_SEG_TO_LIN( *(SEGPTR *)args );
args = (SEGPTR *)args + 1;
@@ -268,10 +271,6 @@
args = (UINT16 *)args + 1;
}
break;
- case WPR_WCHAR:
- case WPR_WSTRING:
- fprintf( stderr, "Unicode not supported in wsprintf16\n" );
- continue;
}
len = WPRINTF_GetLen( &format, &cur_arg, number, maxlen - 1 );
if (!(format.flags & WPRINTF_LEFTALIGN))
diff --git a/miscemu/dosmem.c b/miscemu/dosmem.c
index 9bcf311..ed5bd16 100644
--- a/miscemu/dosmem.c
+++ b/miscemu/dosmem.c
@@ -86,7 +86,7 @@
*/
BOOL DOSMEM_Init(void)
{
- HMODULE hModule = GetModuleHandle( "KERNEL" );
+ HMODULE16 hModule = GetModuleHandle( "KERNEL" );
char *dosmem;
/* Allocate 7 64k segments for 0000, A000, B000, C000, D000, E000, F000. */
diff --git a/miscemu/dpmi.c b/miscemu/dpmi.c
index 291af75..4c7e67f 100644
--- a/miscemu/dpmi.c
+++ b/miscemu/dpmi.c
@@ -41,14 +41,14 @@
WORD ss;
} REALMODECALL;
-extern void do_mscdex(struct sigcontext_struct *context);
+extern void do_mscdex( SIGCONTEXT *context );
/**********************************************************************
* INT_Int31Handler
*
* Handler for int 31h (DPMI).
*/
-void INT_Int31Handler( struct sigcontext_struct context )
+void INT_Int31Handler( SIGCONTEXT context )
{
DWORD dw;
BYTE *ptr;
@@ -199,7 +199,7 @@
*/
if ((BL_reg(&context) == 0x2f) && ((p->eax & 0xFF00) == 0x1500))
{
- struct sigcontext_struct context2;
+ SIGCONTEXT context2;
EAX_reg(&context2) = p->eax;
EBX_reg(&context2) = p->ebx;
ECX_reg(&context2) = p->ecx;
diff --git a/miscemu/emulate.c b/miscemu/emulate.c
index d31ccb7..37dec4e 100644
--- a/miscemu/emulate.c
+++ b/miscemu/emulate.c
@@ -30,7 +30,7 @@
*/
/* FIXME: Only skeletal implementation for now */
-void WIN87_fpmath( struct sigcontext_struct context )
+void WIN87_fpmath( SIGCONTEXT context )
{
dprintf_int(stddeb, "_fpmath: (cs:eip=%x:%lx es=%x bx=%04x ax=%04x dx==%04x)\n",
CS_reg(&context), EIP_reg(&context),
diff --git a/miscemu/instr.c b/miscemu/instr.c
index 767f4e8..0b2e957 100644
--- a/miscemu/instr.c
+++ b/miscemu/instr.c
@@ -24,7 +24,7 @@
* Try to replace an invalid selector by a valid one.
* For now, only selector 0x40 is handled here.
*/
-static WORD INSTR_ReplaceSelector( struct sigcontext_struct *context, WORD sel)
+static WORD INSTR_ReplaceSelector( SIGCONTEXT *context, WORD sel)
{
if (sel == 0x40)
{
@@ -43,9 +43,8 @@
*
* Return the address of an instruction operand (from the mod/rm byte).
*/
-static BYTE *INSTR_GetOperandAddr( struct sigcontext_struct *context,
- BYTE *instr, int long_addr,
- int segprefix, int *len )
+static BYTE *INSTR_GetOperandAddr( SIGCONTEXT *context, BYTE *instr,
+ int long_addr, int segprefix, int *len )
{
int mod, rm, base, index = 0, ss = 0, seg = 0, off;
@@ -197,14 +196,16 @@
*
* Emulate the LDS (and LES,LFS,etc.) instruction.
*/
-static BOOL INSTR_EmulateLDS( struct sigcontext_struct *context,
- BYTE *instr, int long_op, int long_addr,
- int segprefix, int *len )
+static BOOL INSTR_EmulateLDS( SIGCONTEXT *context, BYTE *instr, int long_op,
+ int long_addr, int segprefix, int *len )
{
+ WORD seg;
BYTE *regmodrm = instr + 1 + (*instr == 0x0f);
BYTE *addr = INSTR_GetOperandAddr( context, regmodrm,
long_addr, segprefix, len );
- WORD seg = *(WORD *)(addr + (long_op ? 4 : 2));
+ if (!addr)
+ return FALSE; /* Unable to emulate it */
+ seg = *(WORD *)(addr + (long_op ? 4 : 2));
if (!(seg = INSTR_ReplaceSelector( context, seg )))
return FALSE; /* Unable to emulate it */
@@ -278,7 +279,7 @@
*
* Emulate a priviledged instruction. Returns TRUE if emulation successful.
*/
-BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context )
+BOOL INSTR_EmulateInstruction( SIGCONTEXT *context )
{
int prefix, segprefix, prefixlen, len, repX, long_op, long_addr;
BYTE *instr;
@@ -489,8 +490,12 @@
case 0x8e: /* mov XX,segment_reg */
{
- WORD seg = *(WORD *)INSTR_GetOperandAddr( context, instr + 1,
+ WORD seg;
+ BYTE *addr = INSTR_GetOperandAddr(context, instr + 1,
long_addr, segprefix, &len );
+ if (!addr)
+ break; /* Unable to emulate it */
+ seg = *(WORD *)addr;
if (!(seg = INSTR_ReplaceSelector( context, seg )))
break; /* Unable to emulate it */
diff --git a/miscemu/int10.c b/miscemu/int10.c
index 3d93812..c22ba05 100644
--- a/miscemu/int10.c
+++ b/miscemu/int10.c
@@ -13,7 +13,7 @@
*
* Handler for int 10h (video).
*/
-void INT_Int10Handler( struct sigcontext_struct context )
+void INT_Int10Handler( SIGCONTEXT context )
{
switch(AH_reg(&context))
{
diff --git a/miscemu/int13.c b/miscemu/int13.c
index f867a92..20f72c1 100644
--- a/miscemu/int13.c
+++ b/miscemu/int13.c
@@ -13,7 +13,7 @@
*
* Handler for int 13h (disk I/O).
*/
-void INT_Int13Handler( struct sigcontext_struct context )
+void INT_Int13Handler( SIGCONTEXT context )
{
switch(AH_reg(&context))
{
diff --git a/miscemu/int1a.c b/miscemu/int1a.c
index 738029c..9a0ddf0 100644
--- a/miscemu/int1a.c
+++ b/miscemu/int1a.c
@@ -42,7 +42,7 @@
*
* Handler for int 1ah (date and time).
*/
-void INT_Int1aHandler( struct sigcontext_struct context )
+void INT_Int1aHandler( SIGCONTEXT context )
{
time_t ltime;
DWORD ticks;
diff --git a/miscemu/int21.c b/miscemu/int21.c
index 030881b..d301ca6 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -134,7 +134,7 @@
}
}
-static int INT21_GetFreeDiskSpace(struct sigcontext_struct *context)
+static int INT21_GetFreeDiskSpace( SIGCONTEXT *context )
{
DWORD cluster_sectors, sector_bytes, free_clusters, total_clusters;
char root[] = "A:\\";
@@ -149,7 +149,7 @@
return 1;
}
-static int INT21_GetDriveAllocInfo(struct sigcontext_struct *context)
+static int INT21_GetDriveAllocInfo( SIGCONTEXT *context )
{
if (!INT21_GetFreeDiskSpace( context )) return 0;
heap->mediaID = 0xf0;
@@ -158,7 +158,7 @@
return 1;
}
-static void GetDrivePB(struct sigcontext_struct *context, int drive)
+static void GetDrivePB( SIGCONTEXT *context, int drive )
{
if(!DRIVE_IsValid(drive))
{
@@ -201,7 +201,7 @@
}
-static void ioctlGetDeviceInfo(struct sigcontext_struct *context)
+static void ioctlGetDeviceInfo( SIGCONTEXT *context )
{
dprintf_int (stddeb, "int21: ioctl (%d, GetDeviceInfo)\n", BX_reg(context));
@@ -214,7 +214,7 @@
RESET_CFLAG(context);
}
-static void ioctlGenericBlkDevReq(struct sigcontext_struct *context)
+static void ioctlGenericBlkDevReq( SIGCONTEXT *context )
{
BYTE *dataptr = PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
int drive = DOS_GET_DRIVE( BL_reg(context) );
@@ -258,7 +258,7 @@
}
}
-static void GetSystemDate(struct sigcontext_struct *context)
+static void GetSystemDate( SIGCONTEXT *context )
{
struct tm *now;
time_t ltime;
@@ -271,7 +271,7 @@
AX_reg(context) = now->tm_wday;
}
-static void INT21_GetSystemTime(struct sigcontext_struct *context)
+static void INT21_GetSystemTime( SIGCONTEXT *context )
{
struct tm *now;
struct timeval tv;
@@ -286,7 +286,7 @@
/* Note hundredths of seconds */
}
-static void CreateFile(struct sigcontext_struct *context)
+static void CreateFile( SIGCONTEXT *context )
{
AX_reg(context) = _lcreat( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ), CX_reg(context) );
@@ -298,7 +298,7 @@
}
-void OpenExistingFile(struct sigcontext_struct *context)
+void OpenExistingFile( SIGCONTEXT *context )
{
AX_reg(context) = _lopen( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)),
AL_reg(context) );
@@ -379,7 +379,7 @@
#endif
}
-static void CloseFile(struct sigcontext_struct *context)
+static void CloseFile( SIGCONTEXT *context )
{
if ((AX_reg(context) = _lclose( BX_reg(context) )) != 0)
{
@@ -388,7 +388,7 @@
}
}
-void ExtendedOpenCreateFile(struct sigcontext_struct *context)
+void ExtendedOpenCreateFile(SIGCONTEXT *context )
{
BYTE action=DL_reg(context);
dprintf_int(stddeb, "int21: extended open/create: file= %s \n",
@@ -478,7 +478,7 @@
}
-static int INT21_RenameFile(struct sigcontext_struct *context)
+static int INT21_RenameFile( SIGCONTEXT *context )
{
const char *newname, *oldname;
char *buffer;
@@ -511,7 +511,7 @@
}
-static void INT21_ChangeDir(struct sigcontext_struct *context)
+static void INT21_ChangeDir( SIGCONTEXT *context )
{
int drive;
char *dirname = PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context));
@@ -531,7 +531,7 @@
}
-static int INT21_FindFirst(struct sigcontext_struct *context)
+static int INT21_FindFirst( SIGCONTEXT *context )
{
const char *path, *unixPath, *mask;
char *p;
@@ -566,7 +566,7 @@
}
-static int INT21_FindNext(struct sigcontext_struct *context)
+static int INT21_FindNext( SIGCONTEXT *context )
{
FINDFILE_DTA *dta = (FINDFILE_DTA *)GetCurrentDTA();
DOS_DIRENT entry;
@@ -597,7 +597,7 @@
}
-static int INT21_CreateTempFile(struct sigcontext_struct *context)
+static int INT21_CreateTempFile( SIGCONTEXT *context )
{
static int counter = 0;
char *name = PTR_SEG_OFF_TO_LIN( DS_reg(context), DX_reg(context) );
@@ -618,7 +618,7 @@
}
-static int INT21_GetCurrentDirectory(struct sigcontext_struct *context)
+static int INT21_GetCurrentDirectory( SIGCONTEXT *context )
{
int drive = DOS_GET_DRIVE( DL_reg(context) );
char *ptr = (char *)PTR_SEG_OFF_TO_LIN( DS_reg(context), SI_reg(context) );
@@ -635,7 +635,7 @@
}
-static int INT21_GetDiskSerialNumber(struct sigcontext_struct *context)
+static int INT21_GetDiskSerialNumber( SIGCONTEXT *context )
{
BYTE *dataptr = PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
int drive = DOS_GET_DRIVE( BL_reg(context) );
@@ -654,7 +654,7 @@
}
-static int INT21_SetDiskSerialNumber(struct sigcontext_struct *context)
+static int INT21_SetDiskSerialNumber( SIGCONTEXT *context )
{
BYTE *dataptr = PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
int drive = DOS_GET_DRIVE( BL_reg(context) );
@@ -673,7 +673,7 @@
/* microsoft's programmers should be shot for using CP/M style int21
calls in Windows for Workgroup's winfile.exe */
-static int INT21_FindFirstFCB( struct sigcontext_struct *context )
+static int INT21_FindFirstFCB( SIGCONTEXT *context )
{
BYTE *fcb = (BYTE *)PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
FINDFILE_FCB *pFCB;
@@ -701,7 +701,7 @@
}
-static int INT21_FindNextFCB( struct sigcontext_struct *context )
+static int INT21_FindNextFCB( SIGCONTEXT *context )
{
BYTE *fcb = (BYTE *)PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
FINDFILE_FCB *pFCB;
@@ -743,7 +743,7 @@
}
-static void DeleteFileFCB(struct sigcontext_struct *context)
+static void DeleteFileFCB( SIGCONTEXT *context )
{
fprintf( stderr, "DeleteFileFCB: not implemented yet\n" );
#if 0
@@ -785,7 +785,7 @@
#endif
}
-static void RenameFileFCB(struct sigcontext_struct *context)
+static void RenameFileFCB( SIGCONTEXT *context )
{
fprintf( stderr, "RenameFileFCB: not implemented yet\n" );
#if 0
@@ -831,7 +831,7 @@
-static void fLock (struct sigcontext_struct * context)
+static void fLock( SIGCONTEXT * context )
{
#if 0
struct flock f;
@@ -882,7 +882,7 @@
}
-static int INT21_GetFileAttribute (struct sigcontext_struct * context)
+static int INT21_GetFileAttribute( SIGCONTEXT * context )
{
const char *unixName;
@@ -901,7 +901,7 @@
/***********************************************************************
* DOS3Call (KERNEL.102)
*/
-void DOS3Call( struct sigcontext_struct context )
+void DOS3Call( SIGCONTEXT context )
{
dprintf_int( stddeb, "int21: AX=%04x BX=%04x CX=%04x DX=%04x "
"SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n",
@@ -1136,8 +1136,8 @@
break;
case 0x3a: /* "RMDIR" - REMOVE SUBDIRECTORY */
- if (!FILE_RemoveDir( PTR_SEG_OFF_TO_LIN( DS_reg(&context),
- DX_reg(&context) )))
+ if (!RemoveDirectory32A( PTR_SEG_OFF_TO_LIN( DS_reg(&context),
+ DX_reg(&context) )))
{
AX_reg(&context) = DOS_ExtendedError;
SET_CFLAG(&context);
@@ -1201,8 +1201,8 @@
break;
case 0x41: /* "UNLINK" - DELETE FILE */
- if (!FILE_Unlink( PTR_SEG_OFF_TO_LIN( DS_reg(&context),
- DX_reg(&context) )))
+ if (!DeleteFile32A( PTR_SEG_OFF_TO_LIN( DS_reg(&context),
+ DX_reg(&context) )))
{
AX_reg(&context) = DOS_ExtendedError;
SET_CFLAG(&context);
@@ -1252,7 +1252,7 @@
break;
case 0x08: /* Check if drive is removable. */
- switch(GetDriveType( DOS_GET_DRIVE( BL_reg(&context) )))
+ switch(GetDriveType16( DOS_GET_DRIVE( BL_reg(&context) )))
{
case DRIVE_CANNOTDETERMINE:
DOS_ERROR( ER_InvalidDrive, EC_NotFound, SA_Abort, EL_Disk );
@@ -1269,7 +1269,7 @@
break;
case 0x09: /* CHECK IF BLOCK DEVICE REMOTE */
- switch(GetDriveType( DOS_GET_DRIVE( BL_reg(&context) )))
+ switch(GetDriveType16( DOS_GET_DRIVE( BL_reg(&context) )))
{
case DRIVE_CANNOTDETERMINE:
DOS_ERROR( ER_InvalidDrive, EC_NotFound, SA_Abort, EL_Disk );
diff --git a/miscemu/int25.c b/miscemu/int25.c
index 799816a..1f4832d 100644
--- a/miscemu/int25.c
+++ b/miscemu/int25.c
@@ -16,7 +16,7 @@
*
* Handler for int 25h (absolute disk read).
*/
-void INT_Int25Handler( struct sigcontext_struct context )
+void INT_Int25Handler( SIGCONTEXT context )
{
BYTE *dataptr = PTR_SEG_OFF_TO_LIN( DS_reg(&context), BX_reg(&context) );
DWORD begin, length;
diff --git a/miscemu/int26.c b/miscemu/int26.c
index 53f1abc..270de63 100644
--- a/miscemu/int26.c
+++ b/miscemu/int26.c
@@ -15,7 +15,7 @@
*
* Handler for int 26h (absolute disk read).
*/
-void INT_Int26Handler( struct sigcontext_struct context )
+void INT_Int26Handler( SIGCONTEXT context )
{
BYTE *dataptr = PTR_SEG_OFF_TO_LIN( DS_reg(&context), BX_reg(&context) );
DWORD begin, length;
diff --git a/miscemu/int2a.c b/miscemu/int2a.c
index 13de9ff..4dfa3e9 100644
--- a/miscemu/int2a.c
+++ b/miscemu/int2a.c
@@ -13,7 +13,7 @@
*
* Handler for int 2ah (network).
*/
-void INT_Int2aHandler( struct sigcontext_struct context )
+void INT_Int2aHandler( SIGCONTEXT context )
{
switch(AH_reg(&context))
{
diff --git a/miscemu/int2f.c b/miscemu/int2f.c
index fdfd3a5..ad8817d 100644
--- a/miscemu/int2f.c
+++ b/miscemu/int2f.c
@@ -17,15 +17,15 @@
/* base WPROCS.DLL ordinal number for VxDs */
#define VXD_BASE 400
-static void do_int2f_16(struct sigcontext_struct *context);
-void do_mscdex(struct sigcontext_struct *context);
+static void do_int2f_16( SIGCONTEXT *context );
+void do_mscdex( SIGCONTEXT *context );
/**********************************************************************
* INT_Int2fHandler
*
* Handler for int 2fh (multiplex).
*/
-void INT_Int2fHandler( struct sigcontext_struct context )
+void INT_Int2fHandler( SIGCONTEXT context )
{
switch(AH_reg(&context))
{
@@ -67,7 +67,7 @@
/**********************************************************************
* do_int2f_16
*/
-static void do_int2f_16(struct sigcontext_struct *context)
+static void do_int2f_16( SIGCONTEXT *context )
{
DWORD addr;
@@ -138,7 +138,7 @@
}
}
-void do_mscdex(struct sigcontext_struct *context)
+void do_mscdex( SIGCONTEXT *context )
{
int drive, count;
char *p;
diff --git a/miscemu/int4b.c b/miscemu/int4b.c
index 16cf0b6..e78e285 100644
--- a/miscemu/int4b.c
+++ b/miscemu/int4b.c
@@ -15,7 +15,7 @@
* INT_Int4bHandler
*
*/
-void INT_Int4bHandler( struct sigcontext_struct context )
+void INT_Int4bHandler( SIGCONTEXT context )
{
switch(AH_reg(&context))
diff --git a/miscemu/int5c.c b/miscemu/int5c.c
index 28540f2..190c0e1 100644
--- a/miscemu/int5c.c
+++ b/miscemu/int5c.c
@@ -18,7 +18,7 @@
*
* Also handler for interrupt 5c.
*/
-void NetBIOSCall( struct sigcontext_struct context )
+void NetBIOSCall( SIGCONTEXT context )
{
BYTE* ptr;
diff --git a/miscemu/interrupts.c b/miscemu/interrupts.c
index 308d69f..3b3d3fe 100644
--- a/miscemu/interrupts.c
+++ b/miscemu/interrupts.c
@@ -28,7 +28,7 @@
BOOL INT_Init(void)
{
WORD vector;
- HMODULE hModule = GetModuleHandle( "WPROCS" );
+ HMODULE16 hModule = GetModuleHandle( "WPROCS" );
for (vector = 0; vector < 256; vector++)
{
@@ -70,7 +70,7 @@
/**********************************************************************
* INT_DummyHandler
*/
-void INT_DummyHandler( struct sigcontext_struct context )
+void INT_DummyHandler( SIGCONTEXT context )
{
WORD ordinal;
char *name;
@@ -85,7 +85,7 @@
*
* Handler for int 11h (get equipment list).
*/
-void INT_Int11Handler( struct sigcontext_struct context )
+void INT_Int11Handler( SIGCONTEXT context )
{
int diskdrives = 0;
int parallelports = 0;
@@ -144,7 +144,7 @@
*
* Handler for int 12h (get memory size).
*/
-void INT_Int12Handler( struct sigcontext_struct context )
+void INT_Int12Handler( SIGCONTEXT context )
{
AX_reg(&context) = 640;
}
@@ -155,7 +155,7 @@
*
* Handler for int 15h.
*/
-void INT_Int15Handler( struct sigcontext_struct context )
+void INT_Int15Handler( SIGCONTEXT context )
{
INT_BARF( &context, 0x15 );
}
@@ -166,7 +166,7 @@
*
* Handler for int 16h (keyboard).
*/
-void INT_Int16Handler( struct sigcontext_struct context )
+void INT_Int16Handler( SIGCONTEXT context )
{
INT_BARF( &context, 0x16 );
}
diff --git a/miscemu/vxd.c b/miscemu/vxd.c
index 95712f4..b1bb3b0 100644
--- a/miscemu/vxd.c
+++ b/miscemu/vxd.c
@@ -17,7 +17,7 @@
/***********************************************************************
* VXD_PageFile
*/
-void VXD_PageFile( struct sigcontext_struct context )
+void VXD_PageFile( SIGCONTEXT context )
{
/* taken from Ralf Brown's Interrupt List */
@@ -62,7 +62,7 @@
/***********************************************************************
* VXD_Shell
*/
-void VXD_Shell( struct sigcontext_struct context )
+void VXD_Shell( SIGCONTEXT context )
{
dprintf_vxd(stddeb,"VxD Shell called ...\n");
@@ -120,7 +120,7 @@
/***********************************************************************
* VXD_Comm
*/
-void VXD_Comm( struct sigcontext_struct context )
+void VXD_Comm( SIGCONTEXT context )
{
dprintf_vxd(stddeb,"VxD Comm called ...\n");
diff --git a/multimedia/mcicda.c b/multimedia/mcicda.c
index e517fe6..80c2151 100644
--- a/multimedia/mcicda.c
+++ b/multimedia/mcicda.c
@@ -394,8 +394,9 @@
}
switch (CDADev[wDevID].sc.cdsc_audiostatus) {
case CDROM_AUDIO_INVALID:
- dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // device doesn't support status !\n");
- return FALSE;
+ dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // device doesn't support status, returning NOT_READY.\n");
+ CDADev[wDevID].mode = MCI_MODE_NOT_READY;
+ break;
case CDROM_AUDIO_NO_STATUS:
CDADev[wDevID].mode = MCI_MODE_STOP;
dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // MCI_MODE_STOP !\n");
@@ -737,7 +738,10 @@
dprintf_cdaudio(stddeb,"CDAUDIO_mciSeek(%u, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
- if (ioctl(CDADev[wDevID].unixdev, CDROMRESUME)) return MCIERR_HARDWARE;
+ if (ioctl(CDADev[wDevID].unixdev, CDROMRESUME)) {
+ perror("ioctl CDROMRESUME");
+ return MCIERR_HARDWARE;
+ }
CDADev[wDevID].mode = MCI_MODE_SEEK;
switch(dwFlags) {
case MCI_SEEK_TO_START:
diff --git a/multimedia/mcistring.c b/multimedia/mcistring.c
index c21081a..8e7c2d4 100644
--- a/multimedia/mcistring.c
+++ b/multimedia/mcistring.c
@@ -35,7 +35,7 @@
/* FIXME: I need to remember the aliasname of a spec. driver.
* and this is the easiest way. *sigh*
*/
-static MCI_OPEN_PARMS mciOpenDrv[MAXMCIDRIVERS];
+extern MCI_OPEN_PARMS mciOpenDrv[MAXMCIDRIVERS];
LONG DrvDefDriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg,
DWORD dwParam1, DWORD dwParam2);
@@ -2087,7 +2087,7 @@
DWORD dwFlags;
int res=0,i,nrofkeywords;
- dprintf_mci(stdnimp,"mciSendString('%s', %p, %d, %X)\n", lpstrCommand,
+ dprintf_mci(stddeb,"mciSendString('%s', %p, %d, %X)\n", lpstrCommand,
lpstrReturnString, uReturnLength, hwndCallback
);
/* format is <command> <device> <optargs> */
@@ -2146,7 +2146,7 @@
dname=(SEGPTR)mciOpenDrv[wDevID].lpstrAlias;
if (dname==NULL)
dname=(SEGPTR)mciOpenDrv[wDevID].lpstrDeviceType;
- if (!STRCMP(PTR_SEG_TO_LIN(dname),dev))
+ if ((dname!=NULL)&&(!STRCMP(PTR_SEG_TO_LIN(dname),dev)))
break;
if (++wDevID >= MAXMCIDRIVERS) {
dprintf_mci(stddeb, __FILE__":mciSendString:MAXMCIDRIVERS reached!\n");
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index f2d40f0..283c928 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -31,6 +31,10 @@
static LPSTR lpInstallNames = NULL;
MCI_OPEN_DRIVER_PARMS mciDrv[MAXMCIDRIVERS];
+/* struct below is to remember alias/devicenames for mcistring.c
+ * FIXME: should use some internal struct ...
+ */
+MCI_OPEN_PARMS mciOpenDrv[MAXMCIDRIVERS];
UINT midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
UINT waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
@@ -547,12 +551,21 @@
/**************************************************************************
* mciOpen [internal]
*/
+
+#define _MCI_STRDUP_TO_SEG(dest,source) {\
+ HANDLE x;\
+ x=USER_HEAP_ALLOC(strlen(source));\
+ dest=(LPSTR)MAKELONG(x,USER_HeapSel);\
+ strcpy(PTR_SEG_TO_LIN(dest),source);\
+}
+
DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
{
char str[128];
LPMCI_OPEN_PARMS lpParms;
UINT uDevTyp = 0;
UINT wDevID = 0;
+
lpParms = PTR_SEG_TO_LIN(lp16Parms);
dprintf_mmsys(stddeb, "mciOpen(%08lX, %p (%p))\n", dwParam, lp16Parms, lpParms);
if (lp16Parms == NULL) return MCIERR_INTERNAL;
@@ -560,46 +573,52 @@
if (++wDevID >= MAXMCIDRIVERS) {
dprintf_mmsys(stddeb, "MCI_OPEN // MAXMCIDRIVERS reached !\n");
return MCIERR_INTERNAL;
- }
}
+ }
dprintf_mmsys(stddeb, "mciOpen // wDevID=%d \n", wDevID);
+
+ memcpy(&mciOpenDrv[wDevID],lpParms,sizeof(*lpParms));
if (dwParam & MCI_OPEN_ALIAS) {
dprintf_mmsys(stddeb, "MCI_OPEN // Alias='%s' !\n",
(char*)PTR_SEG_TO_LIN(lpParms->lpstrAlias));
- uDevTyp = MCI_DEVTYPE_WAVEFORM_AUDIO;
- }
+ _MCI_STRDUP_TO_SEG(
+ mciOpenDrv[wDevID].lpstrAlias,
+ (char*)PTR_SEG_TO_LIN(lpParms->lpstrAlias)
+ );
+ /* mplayer does allocate alias to CDAUDIO */
+ }
if (dwParam & MCI_OPEN_TYPE) {
if (dwParam & MCI_OPEN_TYPE_ID) {
dprintf_mmsys(stddeb, "MCI_OPEN // Dev=%p !\n", lpParms->lpstrDeviceType);
uDevTyp = LOWORD((DWORD)lpParms->lpstrDeviceType);
- }
- else {
+ mciOpenDrv[wDevID].lpstrDeviceType=lpParms->lpstrDeviceType;
+ } else {
if (lpParms->lpstrDeviceType == NULL) return MCIERR_INTERNAL;
dprintf_mmsys(stddeb, "MCI_OPEN // Dev='%s' !\n",
(char*)PTR_SEG_TO_LIN(lpParms->lpstrDeviceType));
+ _MCI_STRDUP_TO_SEG(
+ mciOpenDrv[wDevID].lpstrDeviceType,
+ (char*)PTR_SEG_TO_LIN(lpParms->lpstrDeviceType)
+ );
strcpy(str, PTR_SEG_TO_LIN(lpParms->lpstrDeviceType));
AnsiUpper(str);
if (strcmp(str, "CDAUDIO") == 0) {
uDevTyp = MCI_DEVTYPE_CD_AUDIO;
- }
- else
+ } else
if (strcmp(str, "WAVEAUDIO") == 0) {
uDevTyp = MCI_DEVTYPE_WAVEFORM_AUDIO;
- }
- else
+ } else
if (strcmp(str, "SEQUENCER") == 0) {
uDevTyp = MCI_DEVTYPE_SEQUENCER;
- }
- else
+ } else
if (strcmp(str, "ANIMATION1") == 0) {
uDevTyp = MCI_DEVTYPE_ANIMATION;
- }
- else
+ } else
if (strcmp(str, "AVIVIDEO") == 0) {
uDevTyp = MCI_DEVTYPE_DIGITAL_VIDEO;
- }
}
}
+ }
mciDrv[wDevID].wType = uDevTyp;
mciDrv[wDevID].wDeviceID = wDevID;
lpParms->wDeviceID = wDevID;
diff --git a/objects/dib.c b/objects/dib.c
index becf185..8190af4 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -101,7 +101,7 @@
* Get the info from a bitmap header.
* Return 1 for INFOHEADER, 0 for COREHEADER, -1 for error.
*/
-static int DIB_GetBitmapInfo( BITMAPINFOHEADER *header, DWORD *width,
+static int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, DWORD *width,
DWORD *height, WORD *bpp )
{
if (header->biSize == sizeof(BITMAPINFOHEADER))
@@ -639,10 +639,10 @@
/***********************************************************************
- * SetDIBits (GDI.440)
+ * SetDIBits (GDI.440) (GDI32.312)
*/
-int SetDIBits( HDC hdc, HBITMAP hbitmap, WORD startscan, WORD lines,
- LPSTR bits, BITMAPINFO * info, WORD coloruse )
+INT16 SetDIBits( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan, UINT32 lines,
+ LPCVOID bits, const BITMAPINFO *info, UINT32 coloruse )
{
DC * dc;
BITMAPOBJ * bmp;
@@ -670,11 +670,12 @@
/***********************************************************************
- * SetDIBitsToDevice (GDI.443)
+ * SetDIBitsToDevice (GDI.443) (GDI32.313)
*/
-int SetDIBitsToDevice( HDC hdc, short xDest, short yDest, WORD cx, WORD cy,
- WORD xSrc, WORD ySrc, WORD startscan, WORD lines,
- LPSTR bits, BITMAPINFO * info, WORD coloruse )
+INT16 SetDIBitsToDevice( HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
+ DWORD cy, INT32 xSrc, INT32 ySrc, UINT32 startscan,
+ UINT32 lines, LPCVOID bits, const BITMAPINFO *info,
+ UINT32 coloruse )
{
DC * dc;
DWORD width, height, compression = 0;
diff --git a/objects/font.c b/objects/font.c
index a259011..39dac67 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -24,7 +24,7 @@
#define FONTCACHE 32 /* dynamic font cache size */
#define MAX_FONTS 256
-static LPLOGFONT16 lpLogFontList[MAX_FONTS];
+static LPLOGFONT16 lpLogFontList[MAX_FONTS+1];
static int ParseFontParms(LPSTR lpFont, WORD wParmsNo, LPSTR lpRetStr, WORD wMaxSiz);
@@ -266,7 +266,8 @@
if (!*font->lfFaceName)
ParseFontParms(*names, 2, font->lfFaceName , LF_FACESIZE-1);
/* we need a font name for function GetTextFace() even if there isn't one ;-) */
-
+ AnsiUpper(font->lfFaceName);
+
fontStruct = XLoadQueryFont( display, *names );
XFreeFontNames( names );
return fontStruct;
@@ -701,9 +702,9 @@
/***********************************************************************
- * GetTextMetrics (GDI.93)
+ * GetTextMetrics16 (GDI.93)
*/
-BOOL GetTextMetrics( HDC hdc, LPTEXTMETRIC16 metrics )
+BOOL16 GetTextMetrics16( HDC16 hdc, TEXTMETRIC16 *metrics )
{
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return FALSE;
@@ -770,6 +771,68 @@
/***********************************************************************
+ * GetTextMetrics32A (GDI32.236)
+ */
+BOOL32 GetTextMetrics32A( HDC32 hdc, TEXTMETRIC32A *metrics )
+{
+ TEXTMETRIC16 tm;
+ if (!GetTextMetrics16( (HDC16)hdc, &tm )) return FALSE;
+ metrics->tmHeight = tm.tmHeight;
+ metrics->tmAscent = tm.tmAscent;
+ metrics->tmDescent = tm.tmDescent;
+ metrics->tmInternalLeading = tm.tmInternalLeading;
+ metrics->tmExternalLeading = tm.tmExternalLeading;
+ metrics->tmAveCharWidth = tm.tmAveCharWidth;
+ metrics->tmMaxCharWidth = tm.tmMaxCharWidth;
+ metrics->tmWeight = tm.tmWeight;
+ metrics->tmOverhang = tm.tmOverhang;
+ metrics->tmDigitizedAspectX = tm.tmDigitizedAspectX;
+ metrics->tmDigitizedAspectY = tm.tmDigitizedAspectY;
+ metrics->tmFirstChar = tm.tmFirstChar;
+ metrics->tmLastChar = tm.tmLastChar;
+ metrics->tmDefaultChar = tm.tmDefaultChar;
+ metrics->tmBreakChar = tm.tmBreakChar;
+ metrics->tmItalic = tm.tmItalic;
+ metrics->tmUnderlined = tm.tmUnderlined;
+ metrics->tmStruckOut = tm.tmStruckOut;
+ metrics->tmPitchAndFamily = tm.tmPitchAndFamily;
+ metrics->tmCharSet = tm.tmCharSet;
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * GetTextMetrics32W (GDI32.237)
+ */
+BOOL32 GetTextMetrics32W( HDC32 hdc, TEXTMETRIC32W *metrics )
+{
+ TEXTMETRIC16 tm;
+ if (!GetTextMetrics16( (HDC16)hdc, &tm )) return FALSE;
+ metrics->tmHeight = tm.tmHeight;
+ metrics->tmAscent = tm.tmAscent;
+ metrics->tmDescent = tm.tmDescent;
+ metrics->tmInternalLeading = tm.tmInternalLeading;
+ metrics->tmExternalLeading = tm.tmExternalLeading;
+ metrics->tmAveCharWidth = tm.tmAveCharWidth;
+ metrics->tmMaxCharWidth = tm.tmMaxCharWidth;
+ metrics->tmWeight = tm.tmWeight;
+ metrics->tmOverhang = tm.tmOverhang;
+ metrics->tmDigitizedAspectX = tm.tmDigitizedAspectX;
+ metrics->tmDigitizedAspectY = tm.tmDigitizedAspectY;
+ metrics->tmFirstChar = tm.tmFirstChar;
+ metrics->tmLastChar = tm.tmLastChar;
+ metrics->tmDefaultChar = tm.tmDefaultChar;
+ metrics->tmBreakChar = tm.tmBreakChar;
+ metrics->tmItalic = tm.tmItalic;
+ metrics->tmUnderlined = tm.tmUnderlined;
+ metrics->tmStruckOut = tm.tmStruckOut;
+ metrics->tmPitchAndFamily = tm.tmPitchAndFamily;
+ metrics->tmCharSet = tm.tmCharSet;
+ return TRUE;
+}
+
+
+/***********************************************************************
* SetMapperFlags (GDI.349)
*/
DWORD SetMapperFlags(HDC hDC, DWORD dwFlag)
@@ -894,23 +957,31 @@
char slant, spacing;
int i, count;
LPLOGFONT16 lpNewFont;
+
+ dprintf_font(stddeb,"InitFontsList !\n");
+
weight = "medium";
slant = 'r';
spacing = '*';
charset = "*";
family = "*-*";
- dprintf_font(stddeb,"InitFontsList !\n");
+
sprintf( pattern, "-%s-%s-%c-normal-*-*-*-*-*-%c-*-%s",
family, weight, slant, spacing, charset);
names = XListFonts( display, pattern, MAX_FONTS, &count );
dprintf_font(stddeb,"InitFontsList // count=%d \n", count);
+
+ lpNewFont = malloc((sizeof(LOGFONT16)+LF_FACESIZE)*count);
+ if (lpNewFont == NULL) {
+ dprintf_font(stddeb,
+ "InitFontsList // Error alloc new font structure !\n");
+ XFreeFontNames(names);
+ return;
+ }
+
for (i = 0; i < count; i++) {
- lpNewFont = malloc(sizeof(LOGFONT16) + LF_FACESIZE);
- if (lpNewFont == NULL) {
- dprintf_font(stddeb, "InitFontsList // Error alloc new font structure !\n");
- break;
- }
dprintf_font(stddeb,"InitFontsList // names[%d]='%s' \n", i, names[i]);
+
ParseFontParms(names[i], 2, str, sizeof(str));
#if 0
/* not necessary because new function FONT_ChkX11Family() */
@@ -950,12 +1021,21 @@
lpNewFont->lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
break;
}
- dprintf_font(stddeb,"InitFontsList // lpNewFont->lfHeight=%d \n", lpNewFont->lfHeight);
- dprintf_font(stddeb,"InitFontsList // lpNewFont->lfWidth=%d \n", lpNewFont->lfWidth);
- dprintf_font(stddeb,"InitFontsList // lfFaceName='%s' \n", lpNewFont->lfFaceName);
+ dprintf_font( stddeb,
+ "InitFontsList // lpNewFont->lfHeight=%d\n",
+ lpNewFont->lfHeight );
+ dprintf_font( stddeb,
+ "InitFontsList // lpNewFont->lfWidth=%d\n",
+ lpNewFont->lfWidth );
+ dprintf_font( stddeb,
+ "InitFontsList // lfFaceName='%s'\n",
+ lpNewFont->lfFaceName );
lpLogFontList[i] = lpNewFont;
- lpLogFontList[i+1] = NULL;
+ lpNewFont = (LPLOGFONT16)
+ ((char *)lpNewFont + sizeof(LOGFONT16)+LF_FACESIZE);
}
+ lpLogFontList[i] = NULL;
+
qsort(lpLogFontList,count,sizeof(*lpLogFontList),logfcmp);
XFreeFontNames(names);
}
@@ -976,7 +1056,7 @@
char FaceName[LF_FACESIZE];
int nRet = 0;
int i;
-
+
dprintf_font(stddeb,"EnumFonts(%04x, %p='%s', %08lx, %08lx)\n",
hDC, lpFaceName, lpFaceName, (LONG)lpEnumFunc, lpData);
if (lpEnumFunc == 0) return 0;
@@ -1014,7 +1094,7 @@
memcpy(lpLogFont, lpLogFontList[i], sizeof(LOGFONT16) + LF_FACESIZE);
hFont = CreateFontIndirect(lpLogFont);
hOldFont = SelectObject(hDC, hFont);
- GetTextMetrics(hDC, lptm);
+ GetTextMetrics16(hDC, lptm);
SelectObject(hDC, hOldFont);
DeleteObject(hFont);
dprintf_font(stddeb,"EnumFonts // i=%d lpLogFont=%p lptm=%p\n", i, lpLogFont, lptm);
@@ -1083,7 +1163,7 @@
strcpy(lpEnumLogFont->elfStyle,"");
hFont = CreateFontIndirect((LPLOGFONT16)lpEnumLogFont);
hOldFont = SelectObject(hDC, hFont);
- GetTextMetrics(hDC, lptm);
+ GetTextMetrics16(hDC, lptm);
SelectObject(hDC, hOldFont);
DeleteObject(hFont);
dprintf_font(stddeb, "EnumFontFamilies // i=%d lpLogFont=%p lptm=%p\n", i, lpEnumLogFont, lptm);
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index ddf0a21..98289bc 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -161,7 +161,7 @@
*
* GDI initialization.
*/
-BOOL GDI_Init(void)
+BOOL32 GDI_Init(void)
{
HPALETTE16 hpalette;
@@ -203,7 +203,7 @@
/***********************************************************************
* GDI_AllocObject
*/
-HANDLE GDI_AllocObject( WORD size, WORD magic )
+HANDLE16 GDI_AllocObject( WORD size, WORD magic )
{
static DWORD count = 0;
GDIOBJHDR * obj;
@@ -220,7 +220,7 @@
/***********************************************************************
* GDI_FreeObject
*/
-BOOL GDI_FreeObject( HANDLE handle )
+BOOL32 GDI_FreeObject( HANDLE16 handle )
{
GDIOBJHDR * object;
@@ -244,7 +244,7 @@
* Return a pointer to the GDI object associated to the handle.
* Return NULL if the object has the wrong magic number.
*/
-GDIOBJHDR * GDI_GetObjPtr( HANDLE handle, WORD magic )
+GDIOBJHDR * GDI_GetObjPtr( HANDLE16 handle, WORD magic )
{
GDIOBJHDR * ptr = NULL;
diff --git a/objects/region.c b/objects/region.c
index 29bcbc1..0b43fb9 100644
--- a/objects/region.c
+++ b/objects/region.c
@@ -2,9 +2,9 @@
* GDI region objects
*
* Copyright 1993, 1994, 1995 Alexandre Julliard
- *
*/
+#define NO_TRANSITION_TYPES /* This file is Win32-clean */
#include <stdlib.h>
#include <stdio.h>
#include "region.h"
@@ -15,7 +15,7 @@
/***********************************************************************
* REGION_DeleteObject
*/
-BOOL REGION_DeleteObject( HRGN hrgn, RGNOBJ * obj )
+BOOL16 REGION_DeleteObject( HRGN32 hrgn, RGNOBJ * obj )
{
dprintf_region(stddeb, "DeleteRegion: %04x\n", hrgn );
if (obj->xrgn) XDestroyRegion( obj->xrgn );
@@ -76,9 +76,9 @@
/***********************************************************************
* CreateRectRgn (GDI.64) (GDI32.59)
*/
-HRGN CreateRectRgn( INT32 left, INT32 top, INT32 right, INT32 bottom )
+HRGN16 CreateRectRgn( INT32 left, INT32 top, INT32 right, INT32 bottom )
{
- HRGN hrgn;
+ HRGN16 hrgn;
RGNOBJ *obj;
if (!(hrgn = GDI_AllocObject( sizeof(RGNOBJ), REGION_MAGIC ))) return 0;
@@ -121,7 +121,7 @@
/***********************************************************************
* SetRectRgn (GDI.172) (GDI32.332)
*/
-void SetRectRgn( HRGN32 hrgn, INT32 left, INT32 top, INT32 right, INT32 bottom)
+VOID SetRectRgn( HRGN32 hrgn, INT32 left, INT32 top, INT32 right, INT32 bottom)
{
RGNOBJ * obj;
@@ -143,11 +143,11 @@
/***********************************************************************
* CreateRoundRectRgn (GDI.444) (GDI32.61)
*/
-HRGN CreateRoundRectRgn( INT32 left, INT32 top, INT32 right, INT32 bottom,
- INT32 ellipse_width, INT32 ellipse_height )
+HRGN16 CreateRoundRectRgn( INT32 left, INT32 top, INT32 right, INT32 bottom,
+ INT32 ellipse_width, INT32 ellipse_height )
{
RGNOBJ * obj;
- HRGN hrgn;
+ HRGN16 hrgn;
XRectangle rect;
int asq, bsq, d, xd, yd;
@@ -239,7 +239,7 @@
/***********************************************************************
* CreateEllipticRgn (GDI.54) (GDI32.39)
*/
-HRGN CreateEllipticRgn( INT32 left, INT32 top, INT32 right, INT32 bottom )
+HRGN16 CreateEllipticRgn( INT32 left, INT32 top, INT32 right, INT32 bottom )
{
return CreateRoundRectRgn( left, top, right, bottom,
right-left, bottom-top );
@@ -282,7 +282,7 @@
INT16 nbpolygons, INT16 mode )
{
RGNOBJ * obj;
- HRGN hrgn;
+ HRGN16 hrgn;
int i, j, maxPoints;
XPoint *xpoints, *pt;
Region xrgn;
@@ -345,7 +345,7 @@
/***********************************************************************
* PtInRegion (GDI.161) (GDI32.278)
*/
-BOOL PtInRegion( HRGN32 hrgn, INT32 x, INT32 y )
+BOOL16 PtInRegion( HRGN32 hrgn, INT32 x, INT32 y )
{
RGNOBJ * obj;
@@ -388,7 +388,7 @@
/***********************************************************************
* EqualRgn (GDI.72) (GDI32.90)
*/
-BOOL EqualRgn( HRGN32 rgn1, HRGN32 rgn2 )
+BOOL16 EqualRgn( HRGN32 rgn1, HRGN32 rgn2 )
{
RGNOBJ *obj1, *obj2;
if (!(obj1 = (RGNOBJ *) GDI_GetObjPtr( rgn1, REGION_MAGIC ))) return FALSE;
@@ -428,7 +428,7 @@
*
* Create a region that is a frame around another region
*/
-BOOL REGION_FrameRgn( HRGN hDest, HRGN hSrc, INT32 x, INT32 y )
+BOOL16 REGION_FrameRgn( HRGN32 hDest, HRGN32 hSrc, INT32 x, INT32 y )
{
RGNOBJ *destObj,*srcObj;
Region result;
diff --git a/objects/text.c b/objects/text.c
index d6ee0eb..f8f8258 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -205,7 +205,7 @@
if (count == -1) count = strlen(str);
strPtr = str;
- GetTextMetrics(hdc, &tm);
+ GetTextMetrics16(hdc, &tm);
if (flags & DT_EXTERNALLEADING)
lh = tm.tmHeight + tm.tmExternalLeading;
else
@@ -351,17 +351,34 @@
x = dc->w.CursPosX;
y = dc->w.CursPosY;
}
+
+ if (flags & (ETO_OPAQUE | ETO_CLIPPED)) /* there's a rectangle */
+ {
+ if (!lprect) /* not always */
+ {
+ SIZE16 sz;
+ if (flags & ETO_CLIPPED) /* Can't clip with no rectangle */
+ return FALSE;
+ if (!GetTextExtentPoint16( hdc, str, count, &sz ))
+ return FALSE;
+ rect.left = XLPTODP( dc, x );
+ rect.right = XLPTODP( dc, x+sz.cx );
+ rect.top = YLPTODP( dc, y );
+ rect.bottom = YLPTODP( dc, y+sz.cy );
+ }
+ else
+ {
+ rect.left = XLPTODP( dc, lprect->left );
+ rect.right = XLPTODP( dc, lprect->right );
+ rect.top = YLPTODP( dc, lprect->top );
+ rect.bottom = YLPTODP( dc, lprect->bottom );
+ }
+ if (rect.right < rect.left) SWAP_INT( rect.left, rect.right );
+ if (rect.bottom < rect.top) SWAP_INT( rect.top, rect.bottom );
+ }
+
x = XLPTODP( dc, x );
y = YLPTODP( dc, y );
- if (flags & (ETO_OPAQUE | ETO_CLIPPED)) /* There's a rectangle */
- {
- rect.left = XLPTODP( dc, lprect->left );
- rect.right = XLPTODP( dc, lprect->right );
- rect.top = YLPTODP( dc, lprect->top );
- rect.bottom = YLPTODP( dc, lprect->bottom );
- if (rect.right < rect.left) SWAP_INT( rect.left, rect.right );
- if (rect.bottom < rect.top) SWAP_INT( rect.top, rect.bottom );
- }
dprintf_text(stddeb,"\treal coord: x=%i, y=%i, rect=(%d,%d-%d,%d)\n",
x, y, rect.left, rect.top, rect.right, rect.bottom);
@@ -641,7 +658,7 @@
else
{
TEXTMETRIC16 tm;
- GetTextMetrics( hdc, &tm );
+ GetTextMetrics16( hdc, &tm );
defWidth = 8 * tm.tmAveCharWidth;
}
diff --git a/programs/progman/program.c b/programs/progman/program.c
index 84d4fff..7855dfe 100644
--- a/programs/progman/program.c
+++ b/programs/progman/program.c
@@ -257,7 +257,7 @@
LPSTR lpszCmdLine = LocalLock(program->hCmdLine);
LPSTR lpszWorkDir = LocalLock(program->hWorkDir);
- /* FIXME set working direktory */
+ /* FIXME set working directory */
lpszWorkDir = lpszWorkDir;
WinExec(lpszCmdLine, program->nCmdShow);
diff --git a/tools/build.c b/tools/build.c
index a60ed33..d72a5fc 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -81,7 +81,7 @@
char DLLName[80];
int Limit = 0;
int Base = 0;
-int HeapSize = 0;
+int DLLHeapSize = 0;
FILE *SpecFp;
char *ParseBuffer = NULL;
@@ -93,8 +93,7 @@
/* Offset of register relative to the end of the context struct */
#define CONTEXTOFFSET(reg) \
- ((int)®##_reg((struct sigcontext_struct *)0) \
- - sizeof(struct sigcontext_struct))
+ ((int)®##_reg((SIGCONTEXT *)0) - sizeof(SIGCONTEXT))
static void *xmalloc (size_t size)
{
@@ -521,7 +520,7 @@
fprintf(stderr, "%d: Expected number after heap\n", Line);
exit(1);
}
- HeapSize = atoi(token);
+ DLLHeapSize = atoi(token);
}
else if (IsNumberString(token))
{
@@ -631,7 +630,7 @@
pModule->next = 0;
pModule->flags = NE_FFLAGS_SINGLEDATA | NE_FFLAGS_BUILTIN | NE_FFLAGS_LIBMODULE;
pModule->dgroup = 2;
- pModule->heap_size = HeapSize;
+ pModule->heap_size = DLLHeapSize;
pModule->stack_size = 0;
pModule->ip = 0;
pModule->cs = 0;
@@ -815,7 +814,7 @@
pModule->flags = NE_FFLAGS_SINGLEDATA | NE_FFLAGS_BUILTIN |
NE_FFLAGS_LIBMODULE | NE_FFLAGS_WIN32;
pModule->dgroup = 0;
- pModule->heap_size = HeapSize;
+ pModule->heap_size = DLLHeapSize;
pModule->stack_size = 0;
pModule->ip = 0;
pModule->cs = 0;
@@ -1482,7 +1481,7 @@
printf( "\tpushw %%ds\n" );
printf( "\tpopw %%ss\n" );
printf( "\tleal -%d(%%ebp),%%esp\n",
- reg_func ? sizeof(struct sigcontext_struct) : 4 * strlen(args) );
+ reg_func ? sizeof(SIGCONTEXT) : 4 * strlen(args) );
/* Setup %ebp to point to the previous stack frame (built by CallTo16) */
diff --git a/win32/memory.c b/win32/memory.c
index c50a45c..4b78f3d 100644
--- a/win32/memory.c
+++ b/win32/memory.c
@@ -247,7 +247,7 @@
/***********************************************************************
* VirtualFree (KERNEL32.550)
*/
-BOOL VirtualFree(LPVOID lpvAddress, DWORD cbSize, DWORD fdwFreeType)
+BOOL32 VirtualFree(LPVOID lpvAddress, DWORD cbSize, DWORD fdwFreeType)
{
int i;
diff --git a/win32/time.c b/win32/time.c
index 5d649a0..4756a31 100644
--- a/win32/time.c
+++ b/win32/time.c
@@ -119,20 +119,13 @@
/***********************************************************************
* SetTimeZoneInformation (KERNEL32.515)
*/
-BOOL SetTimeZoneInformation(const TIME_ZONE_INFORMATION *tzinfo)
+BOOL32 SetTimeZoneInformation(const TIME_ZONE_INFORMATION *tzinfo)
{
struct timezone tz;
tz.tz_minuteswest = tzinfo->Bias;
tz.tz_dsttime = DST_NONE;
- if (settimeofday(NULL, &tz))
- {
- return FALSE;
- }
- else
- {
- return TRUE;
- }
+ return !settimeofday(NULL, &tz);
}
diff --git a/win32/user32.c b/win32/user32.c
index 39ef0d7..47035de 100644
--- a/win32/user32.c
+++ b/win32/user32.c
@@ -19,7 +19,6 @@
#include "resource32.h"
#include "string32.h"
#include "win.h"
-#include "winproc.h"
#include "debug.h"
#include "stddebug.h"
diff --git a/windows/class.c b/windows/class.c
index a2a37a2..ae75f00 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -47,7 +47,7 @@
"inst=%04x hdce=%04x icon=%04x cursor=%04x bkgnd=%04x\n"
"clsExtra=%d winExtra=%d #windows=%d\n",
ptr->next, ptr->atomName, className, ptr->style,
- ptr->winproc, ptr->hInstance, ptr->hdce,
+ (UINT32)ptr->winproc, ptr->hInstance, ptr->hdce,
ptr->hIcon, ptr->hCursor, ptr->hbrBackground,
ptr->cbClsExtra, ptr->cbWndExtra, ptr->cWindows );
if (ptr->cbClsExtra)
@@ -76,7 +76,7 @@
{
GlobalGetAtomName32A( ptr->atomName, className, sizeof(className) );
fprintf( stderr, "%08x %-20.20s %08x %08x\n", (UINT32)ptr, className,
- ptr->style, ptr->winproc );
+ ptr->style, (UINT32)ptr->winproc );
}
fprintf( stderr, "\n" );
}
@@ -156,21 +156,6 @@
/***********************************************************************
- * CLASS_SetWndProc
- *
- * Set the window procedure and return the old one.
- */
-static HANDLE32 CLASS_SetWndProc( CLASS *classPtr, HANDLE32 proc,
- WINDOWPROCTYPE type )
-{
- HANDLE32 oldProc = classPtr->winproc;
- classPtr->winproc = WINPROC_AllocWinProc( proc, type );
- if (oldProc) WINPROC_FreeWinProc( oldProc );
- return oldProc;
-}
-
-
-/***********************************************************************
* CLASS_FreeClass
*
* Free a class structure.
@@ -200,7 +185,7 @@
if (classPtr->hbrBackground) DeleteObject( classPtr->hbrBackground );
GlobalDeleteAtom( classPtr->atomName );
CLASS_SetMenuNameA( classPtr, NULL );
- CLASS_SetWndProc( classPtr, (HANDLE32)0, WIN_PROC_16 );
+ WINPROC_FreeProc( classPtr->winproc );
HeapFree( SystemHeap, 0, classPtr );
return TRUE;
}
@@ -209,7 +194,7 @@
/***********************************************************************
* CLASS_FreeModuleClasses
*/
-void CLASS_FreeModuleClasses( HMODULE hModule )
+void CLASS_FreeModuleClasses( HMODULE16 hModule )
{
CLASS *ptr, *next;
@@ -273,7 +258,7 @@
*/
static CLASS *CLASS_RegisterClass( ATOM atom, HINSTANCE32 hInstance,
DWORD style, INT32 classExtra,
- INT32 winExtra, HANDLE32 wndProc,
+ INT32 winExtra, WNDPROC16 wndProc,
WINDOWPROCTYPE wndProcType )
{
CLASS *classPtr;
@@ -308,7 +293,7 @@
classPtr->magic = CLASS_MAGIC;
classPtr->cWindows = 0;
classPtr->style = style;
- classPtr->winproc = 0;
+ classPtr->winproc = (HWINDOWPROC)0;
classPtr->cbWndExtra = winExtra;
classPtr->cbClsExtra = classExtra;
classPtr->hInstance = hInstance;
@@ -316,7 +301,8 @@
classPtr->menuNameA = 0;
classPtr->menuNameW = 0;
classPtr->hdce = (style&CS_CLASSDC) ? DCE_AllocDCE(0, DCE_CLASS_DC): 0;
- CLASS_SetWndProc( classPtr, wndProc, wndProcType );
+ WINPROC_SetProc( &classPtr->winproc, wndProc, wndProcType );
+
/* Other values must be set by caller */
if (classExtra) memset( classPtr->wExtra, 0, classExtra );
@@ -338,8 +324,7 @@
if (!(atom = GlobalAddAtom16( wc->lpszClassName ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
wc->cbClsExtra, wc->cbWndExtra,
- (HANDLE32)wc->lpfnWndProc,
- WIN_PROC_16 )))
+ wc->lpfnWndProc, WIN_PROC_16 )))
{
GlobalDeleteAtom( atom );
return 0;
@@ -375,7 +360,7 @@
if (!(atom = GlobalAddAtom32A( wc->lpszClassName ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
wc->cbClsExtra, wc->cbWndExtra,
- (HANDLE32)wc->lpfnWndProc,
+ (WNDPROC16)wc->lpfnWndProc,
WIN_PROC_32A )))
{
GlobalDeleteAtom( atom );
@@ -410,7 +395,7 @@
if (!(atom = GlobalAddAtom32W( wc->lpszClassName ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
wc->cbClsExtra, wc->cbWndExtra,
- (HANDLE32)wc->lpfnWndProc,
+ (WNDPROC16)wc->lpfnWndProc,
WIN_PROC_32W )))
{
GlobalDeleteAtom( atom );
@@ -444,8 +429,7 @@
if (!(atom = GlobalAddAtom16( wc->lpszClassName ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
wc->cbClsExtra, wc->cbWndExtra,
- (HANDLE32)wc->lpfnWndProc,
- WIN_PROC_16 )))
+ wc->lpfnWndProc, WIN_PROC_16 )))
{
GlobalDeleteAtom( atom );
return 0;
@@ -481,7 +465,7 @@
if (!(atom = GlobalAddAtom32A( wc->lpszClassName ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
wc->cbClsExtra, wc->cbWndExtra,
- (HANDLE32)wc->lpfnWndProc,
+ (WNDPROC16)wc->lpfnWndProc,
WIN_PROC_32A )))
{
GlobalDeleteAtom( atom );
@@ -516,7 +500,7 @@
if (!(atom = GlobalAddAtom32W( wc->lpszClassName ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
wc->cbClsExtra, wc->cbWndExtra,
- (HANDLE32)wc->lpfnWndProc,
+ (WNDPROC16)wc->lpfnWndProc,
WIN_PROC_32W )))
{
GlobalDeleteAtom( atom );
@@ -621,20 +605,20 @@
*/
LONG GetClassLong16( HWND16 hwnd, INT16 offset )
{
+ WND *wndPtr;
LONG ret;
switch( offset )
{
+ case GCL_WNDPROC:
+ if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
+ return (LONG)WINPROC_GetProc( wndPtr->class->winproc, WIN_PROC_16 );
case GCL_MENUNAME:
ret = GetClassLong32A( hwnd, offset );
return (LONG)SEGPTR_GET( (void *)ret );
- case GCL_WNDPROC:
- ret = GetClassLong32A( hwnd, offset );
- return (LONG)WINPROC_GetFunc16( (HANDLE32)ret );
default:
return GetClassLong32A( hwnd, offset );
}
- return (LONG)ret;
}
@@ -658,7 +642,7 @@
case GCL_CBCLSEXTRA: return (LONG)wndPtr->class->cbClsExtra;
case GCL_HMODULE: return (LONG)wndPtr->class->hInstance;
case GCL_WNDPROC:
- return (LONG)WINPROC_GetFunc32( wndPtr->class->winproc );
+ return (LONG)WINPROC_GetProc(wndPtr->class->winproc, WIN_PROC_32A);
case GCL_MENUNAME:
return (LONG)CLASS_GetMenuNameA( wndPtr->class );
case GCL_HBRBACKGROUND:
@@ -678,10 +662,18 @@
LONG GetClassLong32W( HWND32 hwnd, INT32 offset )
{
WND * wndPtr;
-
- if (offset != GCL_MENUNAME) return GetClassLong32A( hwnd, offset );
- if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
- return (LONG)CLASS_GetMenuNameW( wndPtr->class );
+
+ switch(offset)
+ {
+ case GCL_WNDPROC:
+ if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
+ return (LONG)WINPROC_GetProc( wndPtr->class->winproc, WIN_PROC_32W );
+ case GCL_MENUNAME:
+ if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
+ return (LONG)CLASS_GetMenuNameW( wndPtr->class );
+ default:
+ return GetClassLong32A( hwnd, offset );
+ }
}
@@ -697,8 +689,9 @@
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
if (offset >= 0)
{
- if (offset <= wndPtr->class->cbClsExtra - sizeof(WORD))
+ if (offset + sizeof(WORD) <= wndPtr->class->cbClsExtra)
ptr = ((char *)wndPtr->class->wExtra) + offset;
+ else
{
fprintf( stderr, "Warning: invalid offset %d for SetClassWord()\n",
offset );
@@ -734,13 +727,16 @@
LONG SetClassLong16( HWND16 hwnd, INT16 offset, LONG newval )
{
WND *wndPtr;
+ LONG retval;
switch(offset)
{
case GCL_WNDPROC:
if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
- return (LONG)CLASS_SetWndProc( wndPtr->class, (HANDLE32)newval,
- WIN_PROC_16 );
+ retval = (LONG)WINPROC_GetProc( wndPtr->class->winproc, WIN_PROC_16 );
+ WINPROC_SetProc( &wndPtr->class->winproc, (WNDPROC16)newval,
+ WIN_PROC_16 );
+ return retval;
case GCL_MENUNAME:
return SetClassLong32A( hwnd, offset, (LONG)PTR_SEG_TO_LIN(newval) );
default:
@@ -761,7 +757,7 @@
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
if (offset >= 0)
{
- if (offset <= wndPtr->class->cbClsExtra - sizeof(LONG))
+ if (offset + sizeof(LONG) <= wndPtr->class->cbClsExtra)
ptr = ((char *)wndPtr->class->wExtra) + offset;
else
{
@@ -776,8 +772,11 @@
CLASS_SetMenuNameA( wndPtr->class, (LPCSTR)newval );
return 0; /* Old value is now meaningless anyway */
case GCL_WNDPROC:
- return (LONG)CLASS_SetWndProc( wndPtr->class, (HANDLE32)newval,
- WIN_PROC_32A );
+ retval = (LONG)WINPROC_GetProc( wndPtr->class->winproc,
+ WIN_PROC_32A );
+ WINPROC_SetProc( &wndPtr->class->winproc, (WNDPROC16)newval,
+ WIN_PROC_32A );
+ return retval;
case GCL_HBRBACKGROUND:
case GCL_HCURSOR:
case GCL_HICON:
@@ -804,14 +803,18 @@
LONG SetClassLong32W( HWND32 hwnd, INT32 offset, LONG newval )
{
WND *wndPtr;
- if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
+ LONG retval;
switch(offset)
{
case GCL_WNDPROC:
- return (LONG)CLASS_SetWndProc( wndPtr->class, (HANDLE32)newval,
- WIN_PROC_32W );
+ if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
+ retval = (LONG)WINPROC_GetProc( wndPtr->class->winproc, WIN_PROC_32W );
+ WINPROC_SetProc( &wndPtr->class->winproc, (WNDPROC16)newval,
+ WIN_PROC_32W );
+ return retval;
case GCL_MENUNAME:
+ if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
CLASS_SetMenuNameW( wndPtr->class, (LPCWSTR)newval );
return 0; /* Old value is now meaningless anyway */
default:
@@ -866,7 +869,7 @@
!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
(hInstance != classPtr->hInstance)) return FALSE;
wc->style = (UINT16)classPtr->style;
- wc->lpfnWndProc = WINPROC_GetFunc16( classPtr->winproc );
+ wc->lpfnWndProc = WINPROC_GetProc( classPtr->winproc, WIN_PROC_16 );
wc->cbClsExtra = (INT16)classPtr->cbClsExtra;
wc->cbWndExtra = (INT16)classPtr->cbWndExtra;
wc->hInstance = (HINSTANCE16)classPtr->hInstance;
@@ -894,7 +897,8 @@
!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
(hInstance != classPtr->hInstance)) return FALSE;
wc->style = classPtr->style;
- wc->lpfnWndProc = WINPROC_GetFunc32( classPtr->winproc );
+ wc->lpfnWndProc = (WNDPROC32)WINPROC_GetProc( classPtr->winproc,
+ WIN_PROC_32A );
wc->cbClsExtra = classPtr->cbClsExtra;
wc->cbWndExtra = classPtr->cbWndExtra;
wc->hInstance = classPtr->hInstance;
@@ -920,7 +924,8 @@
!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
(hInstance != classPtr->hInstance)) return FALSE;
wc->style = classPtr->style;
- wc->lpfnWndProc = WINPROC_GetFunc32( classPtr->winproc );
+ wc->lpfnWndProc = (WNDPROC32)WINPROC_GetProc( classPtr->winproc,
+ WIN_PROC_32W );
wc->cbClsExtra = classPtr->cbClsExtra;
wc->cbWndExtra = classPtr->cbWndExtra;
wc->hInstance = classPtr->hInstance;
@@ -949,7 +954,7 @@
!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
(hInstance != classPtr->hInstance)) return FALSE;
wc->style = classPtr->style;
- wc->lpfnWndProc = WINPROC_GetFunc16( classPtr->winproc );
+ wc->lpfnWndProc = WINPROC_GetProc( classPtr->winproc, WIN_PROC_16 );
wc->cbClsExtra = (INT16)classPtr->cbClsExtra;
wc->cbWndExtra = (INT16)classPtr->cbWndExtra;
wc->hInstance = (HINSTANCE16)classPtr->hInstance;
@@ -979,7 +984,8 @@
!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
(hInstance != classPtr->hInstance)) return FALSE;
wc->style = classPtr->style;
- wc->lpfnWndProc = WINPROC_GetFunc32( classPtr->winproc );
+ wc->lpfnWndProc = (WNDPROC32)WINPROC_GetProc( classPtr->winproc,
+ WIN_PROC_32A );
wc->cbClsExtra = classPtr->cbClsExtra;
wc->cbWndExtra = classPtr->cbWndExtra;
wc->hInstance = classPtr->hInstance;
@@ -1007,7 +1013,8 @@
!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
(hInstance != classPtr->hInstance)) return FALSE;
wc->style = classPtr->style;
- wc->lpfnWndProc = WINPROC_GetFunc32( classPtr->winproc );
+ wc->lpfnWndProc = (WNDPROC32)WINPROC_GetProc( classPtr->winproc,
+ WIN_PROC_32W );
wc->cbClsExtra = classPtr->cbClsExtra;
wc->cbWndExtra = classPtr->cbWndExtra;
wc->hInstance = classPtr->hInstance;
@@ -1024,7 +1031,7 @@
/***********************************************************************
* ClassFirst (TOOLHELP.69)
*/
-BOOL ClassFirst( CLASSENTRY *pClassEntry )
+BOOL16 ClassFirst( CLASSENTRY *pClassEntry )
{
pClassEntry->wNext = 1;
return ClassNext( pClassEntry );
@@ -1034,7 +1041,7 @@
/***********************************************************************
* ClassNext (TOOLHELP.70)
*/
-BOOL ClassNext( CLASSENTRY *pClassEntry )
+BOOL16 ClassNext( CLASSENTRY *pClassEntry )
{
int i;
CLASS *class = firstClass;
diff --git a/windows/defdlg.c b/windows/defdlg.c
index 9379e07..0ddbea8 100644
--- a/windows/defdlg.c
+++ b/windows/defdlg.c
@@ -151,11 +151,8 @@
}
/* Delete window procedure */
- if (dlgInfo->dlgProc)
- {
- WINPROC_FreeWinProc( dlgInfo->dlgProc );
- dlgInfo->dlgProc = 0;
- }
+ WINPROC_FreeProc( dlgInfo->dlgProc );
+ dlgInfo->dlgProc = (HWINDOWPROC)0;
/* Window clean-up */
return DefWindowProc32A( hwnd, msg, wParam, lParam );
@@ -224,8 +221,8 @@
if (dlgInfo->dlgProc)
{
/* Call dialog procedure */
- result = (BOOL16)CallWindowProc16( (WNDPROC16)dlgInfo->dlgProc, hwnd,
- msg, wParam, lParam );
+ result = (BOOL16)CallWindowProc16( (WNDPROC16)dlgInfo->dlgProc,
+ hwnd, msg, wParam, lParam );
/* Check if window was destroyed by dialog procedure */
if (result || !IsWindow( hwnd )) return result;
@@ -268,8 +265,8 @@
if (dlgInfo->dlgProc)
{
/* Call dialog procedure */
- result = (BOOL16)CallWindowProc32A( (WNDPROC32)dlgInfo->dlgProc, hwnd,
- msg, wParam, lParam );
+ result = (BOOL16)CallWindowProc32A( (WNDPROC32)dlgInfo->dlgProc,
+ hwnd, msg, wParam, lParam );
/* Check if window was destroyed by dialog procedure */
if (result || !IsWindow( hwnd )) return result;
@@ -311,8 +308,8 @@
if (dlgInfo->dlgProc)
{
/* Call dialog procedure */
- result = (BOOL16)CallWindowProc32W( (WNDPROC32)dlgInfo->dlgProc, hwnd,
- msg, wParam, lParam );
+ result = (BOOL16)CallWindowProc32W( (WNDPROC32)dlgInfo->dlgProc,
+ hwnd, msg, wParam, lParam );
/* Check if window was destroyed by dialog procedure */
if (result || !IsWindow( hwnd )) return result;
diff --git a/windows/dialog.c b/windows/dialog.c
index b7aa611..ce5a675 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -71,7 +71,7 @@
/* Calculate the dialog base units */
if (!(hdc = CreateDC( "DISPLAY", NULL, NULL, NULL ))) return FALSE;
- GetTextMetrics( hdc, &tm );
+ GetTextMetrics16( hdc, &tm );
DeleteDC( hdc );
xBaseUnit = tm.tmAveCharWidth;
yBaseUnit = tm.tmHeight;
@@ -477,8 +477,8 @@
* DIALOG_CreateIndirect
*/
static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCSTR dlgTemplate,
- HWND owner, HANDLE32 dlgProc,
- LPARAM param, BOOL win32 )
+ HWND owner, DLGPROC16 dlgProc,
+ LPARAM param, WINDOWPROCTYPE procType )
{
HMENU hMenu = 0;
HFONT hFont = 0;
@@ -493,8 +493,10 @@
/* Parse dialog template */
if (!dlgTemplate) return 0;
- if (win32) dlgTemplate = DIALOG_ParseTemplate32( dlgTemplate, &template );
- else dlgTemplate = DIALOG_ParseTemplate16( dlgTemplate, &template );
+ if (procType != WIN_PROC_16)
+ dlgTemplate = DIALOG_ParseTemplate32( dlgTemplate, &template );
+ else
+ dlgTemplate = DIALOG_ParseTemplate16( dlgTemplate, &template );
/* Load menu */
@@ -523,7 +525,7 @@
hdc = GetDC(0);
oldFont = SelectObject( hdc, hFont );
- GetTextMetrics( hdc, &tm );
+ GetTextMetrics16( hdc, &tm );
SelectObject( hdc, oldFont );
ReleaseDC( 0, hdc );
xUnit = tm.tmAveCharWidth;
@@ -555,7 +557,7 @@
ClientToScreen16( owner, (POINT16 *)&rect );
}
- if (win32)
+ if (procType != WIN_PROC_16)
hwnd = CreateWindowEx32W(template.exStyle, (LPCWSTR)template.className,
(LPCWSTR)template.caption,
template.style & ~WS_VISIBLE,
@@ -573,6 +575,7 @@
return 0;
}
wndPtr = WIN_FindWndPtr( hwnd );
+ wndPtr->flags |= WIN_ISDIALOG;
/* Initialise dialog extra data */
@@ -587,7 +590,7 @@
/* Create controls */
if (!DIALOG_CreateControls( wndPtr, dlgTemplate, template.nbItems,
- hInst, win32 ))
+ hInst, (procType != WIN_PROC_16) ))
{
DestroyWindow( hwnd );
return 0;
@@ -595,7 +598,7 @@
/* Send initialisation messages and set focus */
- dlgInfo->dlgProc = dlgProc;
+ WINPROC_SetProc( &dlgInfo->dlgProc, dlgProc, procType );
dlgInfo->hwndFocus = DIALOG_GetFirstTabItem( hwnd );
if (dlgInfo->hUserFont)
SendMessage32A( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 );
@@ -687,9 +690,8 @@
HWND16 owner, DLGPROC16 dlgProc,
LPARAM param )
{
- HANDLE32 proc = WINPROC_AllocWinProc( (UINT32)dlgProc, WIN_PROC_16 );
- return DIALOG_CreateIndirect( hInst, dlgTemplate,
- owner, proc, param, FALSE );
+ return DIALOG_CreateIndirect( hInst, dlgTemplate, owner,
+ dlgProc, param, WIN_PROC_16 );
}
@@ -700,9 +702,8 @@
HWND32 owner, DLGPROC32 dlgProc,
LPARAM param )
{
- HANDLE32 proc = WINPROC_AllocWinProc( (UINT32)dlgProc, WIN_PROC_32A );
- return DIALOG_CreateIndirect( hInst, dlgTemplate,
- owner, proc, param, TRUE );
+ return DIALOG_CreateIndirect( hInst, dlgTemplate, owner,
+ (DLGPROC16)dlgProc, param, WIN_PROC_32A );
}
@@ -713,9 +714,8 @@
HWND32 owner, DLGPROC32 dlgProc,
LPARAM param )
{
- HANDLE32 proc = WINPROC_AllocWinProc( (UINT32)dlgProc, WIN_PROC_32W );
- return DIALOG_CreateIndirect( hInst, dlgTemplate,
- owner, proc, param, TRUE );
+ return DIALOG_CreateIndirect( hInst, dlgTemplate, owner,
+ (DLGPROC16)dlgProc, param, WIN_PROC_32W );
}
diff --git a/windows/event.c b/windows/event.c
index 4f421a4..4a87d91 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -462,9 +462,38 @@
else if (key_type == 0) /* character key */
{
if ( isalnum(key) )
- vkey = toupper(key); /* convert lower to uppercase */
+ vkey = toupper(key); /* convert lc to uc */
+ else if ( isspace(key) )
+ vkey = key; /* XXX approximately */
else
- vkey = 0xbe;
+ switch (key) /* the rest... */
+ {
+#define vkcase(k,val) case k: vkey = val; break;
+#define vkcase2(k1,k2,val) case k1: case k2: vkey = val; break;
+
+ /* I wish I had a bit-paired keyboard! */
+ vkcase('!','1'); vkcase('@','2'); vkcase('#','3');
+ vkcase('$','4'); vkcase('%','5'); vkcase('^','6');
+ vkcase('&','7'); vkcase('*','8'); vkcase('(','9');
+ vkcase(')','0');
+
+ vkcase2('`','~',0xc0);
+ vkcase2('-','_',0xbd);
+ vkcase2('=','+',0xbb);
+ vkcase2('[','{',0xdb);
+ vkcase2(']','}',0xdd);
+ vkcase2(';',':',0xba);
+ vkcase2('\'','\"',0xde);
+ vkcase2(',','<',0xbc);
+ vkcase2('.','>',0xbe);
+ vkcase2('/','?',0xbf);
+ vkcase2('\\','|',0xdc);
+#undef vkcase
+#undef vkcase2
+ default:
+ fprintf( stderr, "Unknown key! Please report!\n" );
+ vkey = 0; /* whatever */
+ }
}
if (event->type == KeyPress)
@@ -845,7 +874,7 @@
*/
FARPROC GetMouseEventProc(void)
{
- HMODULE hmodule = GetModuleHandle("USER");
+ HMODULE16 hmodule = GetModuleHandle("USER");
return MODULE_GetEntryPoint( hmodule,
MODULE_GetOrdinal( hmodule, "Mouse_Event" ) );
}
@@ -855,7 +884,7 @@
* Mouse_Event (USER.299)
*/
#ifndef WINELIB
-void Mouse_Event( struct sigcontext_struct context )
+void Mouse_Event( SIGCONTEXT context )
{
/* Register values:
* AX = mouse event
diff --git a/windows/hook.c b/windows/hook.c
index 74c2259..9ea7c9e 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -21,7 +21,7 @@
#include "debug.h"
/* This should probably reside in USER heap */
-static HANDLE HOOK_systemHooks[WH_NB_HOOKS] = { 0, };
+static HANDLE16 HOOK_systemHooks[WH_NB_HOOKS] = { 0, };
/***********************************************************************
@@ -124,7 +124,7 @@
static BOOL HOOK_RemoveHook( HANDLE hook )
{
HOOKDATA *data;
- HANDLE *prevHook;
+ HANDLE16 *prevHook;
dprintf_hook( stddeb, "Removing hook %04x\n", hook );
@@ -215,7 +215,7 @@
/***********************************************************************
* HOOK_FreeModuleHooks
*/
-void HOOK_FreeModuleHooks( HMODULE hModule )
+void HOOK_FreeModuleHooks( HMODULE16 hModule )
{
/* remove all system hooks registered by this module */
@@ -244,7 +244,7 @@
/***********************************************************************
* HOOK_FreeQueueHooks
*/
-void HOOK_FreeQueueHooks( HQUEUE hQueue )
+void HOOK_FreeQueueHooks( HQUEUE16 hQueue )
{
/* remove all hooks registered by this queue */
diff --git a/windows/message.c b/windows/message.c
index c777683..4713f6e 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -19,6 +19,7 @@
#include "atom.h"
#include "dde.h"
#include "queue.h"
+#include "winproc.h"
#include "stddebug.h"
/* #define DEBUG_MSG */
#include "debug.h"
@@ -290,7 +291,7 @@
*
* Implementation of an inter-task SendMessage.
*/
-LRESULT MSG_SendMessage( HQUEUE hDestQueue, HWND hwnd, UINT msg,
+static LRESULT MSG_SendMessage( HQUEUE hDestQueue, HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam )
{
MESSAGEQUEUE *queue, *destQ;
@@ -323,10 +324,10 @@
if (!(queue->wakeBits & QS_SMRESULT))
{
- DirectedYield( hDestQueue );
+ DirectedYield( destQ->hTask );
QUEUE_WaitBits( QS_SMRESULT );
}
- printf( "SendMessage %04x to %04x: got %08x\n",
+ printf( "SendMessage %04x to %04x: got %08lx\n",
msg, hDestQueue, queue->SendMessageReturn );
queue->wakeBits &= ~QS_SMRESULT;
return queue->SendMessageReturn;
@@ -351,7 +352,7 @@
else if (senderQ->wakeBits & QS_SMRESULT) Yield();
else break;
}
- printf( "ReplyMessage: res = %08x\n", result );
+ printf( "ReplyMessage: res = %08lx\n", result );
senderQ->SendMessageReturn = result;
queue->InSendMessageHandle = 0;
QUEUE_SetWakeBit( senderQ, QS_SMRESULT );
@@ -845,7 +846,8 @@
SPY_EnterMessage( SPY_DISPATCHMESSAGE16, msg->hwnd, msg->message,
msg->wParam, msg->lParam );
- retval = CallWindowProc16( wndPtr->winproc, msg->hwnd, msg->message,
+ retval = CallWindowProc16( (WNDPROC16)wndPtr->winproc,
+ msg->hwnd, msg->message,
msg->wParam, msg->lParam );
SPY_ExitMessage( SPY_RESULT_OK16, msg->hwnd, msg->message, retval );
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 67b052d..4d4751d 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -640,7 +640,7 @@
else SetTextColor( hdc, GetSysColor( COLOR_INACTIVECAPTIONTEXT ) );
SetBkMode( hdc, TRANSPARENT );
DrawText16( hdc, buffer, -1, &r,
- DT_SINGLELINE | DT_CENTER | DT_VCENTER );
+ DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_NOPREFIX );
}
}
diff --git a/windows/win.c b/windows/win.c
index c6e5188..7fc2b25 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -98,7 +98,7 @@
ptr->next, ptr->child, ptr->parent, ptr->owner,
ptr->class, className, ptr->hInstance, ptr->hmemTaskQ,
ptr->hrgnUpdate, ptr->hwndLastActive, ptr->hdce, ptr->wIDmenu,
- ptr->dwStyle, ptr->dwExStyle, ptr->winproc,
+ ptr->dwStyle, ptr->dwExStyle, (UINT32)ptr->winproc,
ptr->text ? ptr->text : "",
ptr->rectClient.left, ptr->rectClient.top, ptr->rectClient.right,
ptr->rectClient.bottom, ptr->rectWindow.left, ptr->rectWindow.top,
@@ -130,7 +130,7 @@
ptr = hwnd ? WIN_FindWndPtr( hwnd ) : pWndDesktop;
if (!ptr)
{
- fprintf( stderr, "*** Invalid window handle\n" );
+ fprintf( stderr, "*** Invalid window handle %04x\n", hwnd );
return;
}
@@ -146,7 +146,7 @@
fprintf( stderr, "%08lx %-6.4x %-17.17s %08x %08x\n",
(DWORD)ptr, ptr->hmemTaskQ, className,
- (unsigned) ptr->dwStyle, ptr->winproc );
+ (UINT32)ptr->dwStyle, (UINT32)ptr->winproc );
if (ptr->child) WIN_WalkWindows( ptr->child->hwndSelf, indent+1 );
ptr = ptr->next;
@@ -303,20 +303,6 @@
/***********************************************************************
- * WIN_SetWndProc
- *
- * Set the window procedure and return the old one.
- */
-static HANDLE32 WIN_SetWndProc( WND *pWnd, HANDLE32 proc, WINDOWPROCTYPE type)
-{
- HANDLE32 oldProc = pWnd->winproc;
- pWnd->winproc = WINPROC_AllocWinProc( proc, type );
- if (oldProc) WINPROC_FreeWinProc( oldProc );
- return oldProc;
-}
-
-
-/***********************************************************************
* WIN_DestroyWindow
*
* Destroy storage associated to a window
@@ -347,7 +333,7 @@
if (wndPtr->hSysMenu) DestroyMenu( wndPtr->hSysMenu );
if (wndPtr->window) XDestroyWindow( display, wndPtr->window );
if (wndPtr->class->style & CS_OWNDC) DCE_FreeDCE( wndPtr->hdce );
- WIN_SetWndProc( wndPtr, (HANDLE32)0, WIN_PROC_16 );
+ WINPROC_FreeProc( wndPtr->winproc );
wndPtr->class->cWindows--;
USER_HEAP_FREE( hwnd );
}
@@ -395,7 +381,7 @@
pWndDesktop->parent = NULL;
pWndDesktop->owner = NULL;
pWndDesktop->class = class;
- pWndDesktop->winproc = WINPROC_CopyWinProc( class->winproc );
+ pWndDesktop->winproc = NULL;
pWndDesktop->dwMagic = WND_MAGIC;
pWndDesktop->hwndSelf = hwndDesktop;
pWndDesktop->hInstance = 0;
@@ -426,6 +412,7 @@
pWndDesktop->hProp = 0;
pWndDesktop->userdata = 0;
+ WINPROC_SetProc( &pWndDesktop->winproc, (WNDPROC16)class->winproc, 0 );
EVENT_RegisterWindow( pWndDesktop );
SendMessage32A( hwndDesktop, WM_NCCREATE, 0, 0 );
if ((hdc = GetDC( hwndDesktop )) != 0)
@@ -522,7 +509,7 @@
WIN_FindWndPtr(WIN_GetTopParent(cs->hwndParent));
wndPtr->window = 0;
wndPtr->class = classPtr;
- wndPtr->winproc = WINPROC_CopyWinProc( classPtr->winproc );
+ wndPtr->winproc = NULL;
wndPtr->dwMagic = WND_MAGIC;
wndPtr->hwndSelf = hwnd;
wndPtr->hInstance = cs->hInstance;
@@ -547,6 +534,10 @@
if (classPtr->cbWndExtra) memset( wndPtr->wExtra, 0, classPtr->cbWndExtra);
classPtr->cWindows++;
+ /* Set the window procedure */
+
+ WINPROC_SetProc( &wndPtr->winproc, (WNDPROC16)classPtr->winproc, 0 );
+
/* Correct the window style */
if (!(cs->style & (WS_POPUP | WS_CHILD))) /* Overlapped window */
@@ -706,14 +697,14 @@
WINPOS_FindIconPos( hwnd );
SetWindowPos( hwnd, 0, wndPtr->ptIconPos.x, wndPtr->ptIconPos.y,
SYSMETRICS_CXICON, SYSMETRICS_CYICON, SWP_FRAMECHANGED |
- (cs->style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0 );
+ ((cs->style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0 ));
}
else if (wndPtr->dwStyle & WS_MAXIMIZE)
{
POINT16 maxSize, maxPos, minTrack, maxTrack;
NC_GetMinMaxInfo( hwnd, &maxSize, &maxPos, &minTrack, &maxTrack );
SetWindowPos( hwnd, 0, maxPos.x, maxPos.y, maxSize.x, maxSize.y,
- SWP_FRAMECHANGED | (cs->style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0 );
+ SWP_FRAMECHANGED | ((cs->style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0) );
}
else if (cs->style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
@@ -928,7 +919,7 @@
BOOL CloseWindow(HWND hWnd)
{
WND * wndPtr = WIN_FindWndPtr(hWnd);
- if (wndPtr->dwStyle & WS_CHILD) return TRUE;
+ if (!wndPtr || (wndPtr->dwStyle & WS_CHILD)) return TRUE;
ShowWindow(hWnd, SW_MINIMIZE);
return TRUE;
}
@@ -1057,9 +1048,9 @@
HWND hwnd;
atom = className ? GlobalFindAtom32W( className ) : 0;
- buffer = STRING32_DupUniToAnsi( title );
+ buffer = title ? STRING32_DupUniToAnsi( title ) : NULL;
hwnd = WIN_FindWindow( 0, 0, atom, buffer );
- free( buffer );
+ if (buffer) free( buffer );
return hwnd;
}
@@ -1153,7 +1144,7 @@
WND * wndPtr;
if (!(wndPtr = WIN_FindWndPtr(hwnd))) return FALSE;
- return (WINPROC_GetWinProcType( wndPtr->winproc ) == WIN_PROC_32W);
+ return (WINPROC_GetProcType( wndPtr->winproc ) == WIN_PROC_32W);
}
@@ -1164,7 +1155,15 @@
{
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
- if (offset >= 0) return *(WORD *)(((char *)wndPtr->wExtra) + offset);
+ if (offset >= 0)
+ {
+ if (offset + sizeof(WORD) > wndPtr->class->cbWndExtra)
+ {
+ fprintf( stderr, "SetWindowWord: invalid offset %d\n", offset );
+ return 0;
+ }
+ return *(WORD *)(((char *)wndPtr->wExtra) + offset);
+ }
switch(offset)
{
case GWW_ID: return wndPtr->wIDmenu;
@@ -1196,7 +1195,15 @@
WORD *ptr, retval;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
- if (offset >= 0) ptr = (WORD *)(((char *)wndPtr->wExtra) + offset);
+ if (offset >= 0)
+ {
+ if (offset + sizeof(WORD) > wndPtr->class->cbWndExtra)
+ {
+ fprintf( stderr, "SetWindowWord: invalid offset %d\n", offset );
+ return 0;
+ }
+ ptr = (WORD *)(((char *)wndPtr->wExtra) + offset);
+ }
else switch(offset)
{
case GWW_ID: ptr = (WORD *)&wndPtr->wIDmenu; break;
@@ -1212,85 +1219,82 @@
/**********************************************************************
- * GetWindowLong16 (USER.135)
+ * WIN_GetWindowLong
+ *
+ * Helper function for GetWindowLong().
*/
-LONG GetWindowLong16( HWND16 hwnd, INT16 offset )
+static LONG WIN_GetWindowLong( HWND32 hwnd, INT32 offset, WINDOWPROCTYPE type )
{
- LONG ret = GetWindowLong32A( (HWND32)hwnd, offset );
- if (offset == GWL_WNDPROC) return (LONG)WINPROC_GetFunc16( (HANDLE32)ret );
- return ret;
-}
-
-
-/**********************************************************************
- * GetWindowLong32A (USER32.304)
- */
-LONG GetWindowLong32A( HWND32 hwnd, INT32 offset )
-{
+ LONG retval;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
- if (offset >= 0) return *(LONG *)(((char *)wndPtr->wExtra) + offset);
+ if (offset >= 0)
+ {
+ if (offset + sizeof(LONG) > wndPtr->class->cbWndExtra)
+ {
+ fprintf( stderr, "GetWindowLong: invalid offset %d\n", offset );
+ return 0;
+ }
+ retval = *(LONG *)(((char *)wndPtr->wExtra) + offset);
+ /* Special case for dialog window procedure */
+ if ((offset == DWL_DLGPROC) && (wndPtr->flags & WIN_ISDIALOG))
+ return (LONG)WINPROC_GetProc( (HWINDOWPROC)retval, type );
+ return retval;
+ }
switch(offset)
{
case GWL_USERDATA: return wndPtr->userdata;
case GWL_STYLE: return wndPtr->dwStyle;
case GWL_EXSTYLE: return wndPtr->dwExStyle;
case GWL_ID: return wndPtr->wIDmenu;
- case GWL_WNDPROC: return (LONG)WINPROC_GetFunc32( wndPtr->winproc );
+ case GWL_WNDPROC: return (LONG)WINPROC_GetProc( wndPtr->winproc,
+ type );
case GWL_HWNDPARENT: return wndPtr->parent ?
(HWND32)wndPtr->parent->hwndSelf : 0;
case GWL_HINSTANCE: return (HINSTANCE32)wndPtr->hInstance;
default:
- fprintf( stderr, "GetWindowLong32A: unknown offset %d\n", offset );
+ fprintf( stderr, "GetWindowLong: unknown offset %d\n", offset );
}
return 0;
}
/**********************************************************************
- * GetWindowLong32W (USER32.305)
+ * WIN_SetWindowLong
+ *
+ * Helper function for SetWindowLong().
*/
-LONG GetWindowLong32W( HWND32 hwnd, INT32 offset )
-{
- return GetWindowLong32A( hwnd, offset );
-}
-
-
-/**********************************************************************
- * SetWindowLong16 (USER.136)
- */
-LONG SetWindowLong16( HWND16 hwnd, INT16 offset, LONG newval )
-{
- if (offset == GWL_WNDPROC)
- {
- HANDLE32 ret;
- WND *wndPtr = WIN_FindWndPtr( hwnd );
- if (!wndPtr) return 0;
- ret = WIN_SetWndProc( wndPtr, (HANDLE32)newval, WIN_PROC_16 );
- return (LONG)WINPROC_GetFunc16( ret );
- }
- return SetWindowLong32A( hwnd, offset, newval );
-}
-
-
-/**********************************************************************
- * SetWindowLong32A (USER32.516)
- */
-LONG SetWindowLong32A( HWND32 hwnd, INT32 offset, LONG newval )
+static LONG WIN_SetWindowLong( HWND32 hwnd, INT32 offset, LONG newval,
+ WINDOWPROCTYPE type )
{
LONG *ptr, retval;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
- if (offset >= 0) ptr = (LONG *)(((char *)wndPtr->wExtra) + offset);
+ if (offset >= 0)
+ {
+ if (offset + sizeof(LONG) > wndPtr->class->cbWndExtra)
+ {
+ fprintf( stderr, "SetWindowLong: invalid offset %d\n", offset );
+ return 0;
+ }
+ ptr = (LONG *)(((char *)wndPtr->wExtra) + offset);
+ /* Special case for dialog window procedure */
+ if ((offset == DWL_DLGPROC) && (wndPtr->flags & WIN_ISDIALOG))
+ {
+ retval = (LONG)WINPROC_GetProc( (HWINDOWPROC)*ptr, type );
+ WINPROC_SetProc( (HWINDOWPROC *)ptr, (WNDPROC16)newval, type );
+ return retval;
+ }
+ }
else switch(offset)
{
case GWL_ID:
case GWL_HINSTANCE:
return SetWindowWord( hwnd, offset, (WORD)newval );
case GWL_WNDPROC:
- return (LONG)WINPROC_GetFunc32( WIN_SetWndProc( wndPtr,
- (HANDLE32)newval,
- WIN_PROC_32A ));
+ retval = (LONG)WINPROC_GetProc( wndPtr->winproc, type );
+ WINPROC_SetProc( &wndPtr->winproc, (WNDPROC16)newval, type );
+ return retval;
case GWL_USERDATA: ptr = &wndPtr->userdata; break;
case GWL_STYLE: ptr = &wndPtr->dwStyle; break;
case GWL_EXSTYLE: ptr = &wndPtr->dwExStyle; break;
@@ -1305,19 +1309,56 @@
/**********************************************************************
+ * GetWindowLong16 (USER.135)
+ */
+LONG GetWindowLong16( HWND16 hwnd, INT16 offset )
+{
+ return WIN_GetWindowLong( (HWND32)hwnd, offset, WIN_PROC_16 );
+}
+
+
+/**********************************************************************
+ * GetWindowLong32A (USER32.304)
+ */
+LONG GetWindowLong32A( HWND32 hwnd, INT32 offset )
+{
+ return WIN_GetWindowLong( hwnd, offset, WIN_PROC_32A );
+}
+
+
+/**********************************************************************
+ * GetWindowLong32W (USER32.305)
+ */
+LONG GetWindowLong32W( HWND32 hwnd, INT32 offset )
+{
+ return WIN_GetWindowLong( hwnd, offset, WIN_PROC_32W );
+}
+
+
+/**********************************************************************
+ * SetWindowLong16 (USER.136)
+ */
+LONG SetWindowLong16( HWND16 hwnd, INT16 offset, LONG newval )
+{
+ return WIN_SetWindowLong( hwnd, offset, newval, WIN_PROC_16 );
+}
+
+
+/**********************************************************************
+ * SetWindowLong32A (USER32.516)
+ */
+LONG SetWindowLong32A( HWND32 hwnd, INT32 offset, LONG newval )
+{
+ return WIN_SetWindowLong( hwnd, offset, newval, WIN_PROC_32A );
+}
+
+
+/**********************************************************************
* SetWindowLong32W (USER32.517)
*/
LONG SetWindowLong32W( HWND32 hwnd, INT32 offset, LONG newval )
{
- if (offset == GCL_WNDPROC)
- {
- WND *wndPtr = WIN_FindWndPtr( hwnd );
- if (!wndPtr) return 0;
- return (LONG)WINPROC_GetFunc32( WIN_SetWndProc( wndPtr,
- (HANDLE32)newval,
- WIN_PROC_32W ));
- }
- return SetWindowLong32A( hwnd, offset, newval );
+ return WIN_SetWindowLong( hwnd, offset, newval, WIN_PROC_32W );
}
@@ -1568,126 +1609,224 @@
/*******************************************************************
- * EnumWindows (USER.54)
+ * WIN_BuildWinArray
+ *
+ * Build an array of pointers to all children of a given window.
+ * The array must be freed with HeapFree(SystemHeap).
*/
-BOOL EnumWindows( WNDENUMPROC lpEnumFunc, LPARAM lParam )
+WND **WIN_BuildWinArray( WND *wndPtr )
{
- WND *wndPtr;
- HWND *list, *pWnd;
- int count;
+ WND **list, **ppWnd;
+ WND *pWnd;
+ INT32 count;
+
+ /* First count the windows */
+
+ if (!wndPtr) wndPtr = pWndDesktop;
+ for (pWnd = wndPtr->child, count = 0; pWnd; pWnd = pWnd->next) count++;
+ count++; /* For the terminating NULL */
+
+ /* Now build the list of all windows */
+
+ if (!(list = (WND **)HeapAlloc( SystemHeap, 0, sizeof(WND *) * count )))
+ return NULL;
+ for (pWnd = wndPtr->child, ppWnd = list; pWnd; pWnd = pWnd->next)
+ *ppWnd++ = pWnd;
+ *ppWnd = NULL;
+ return list;
+}
+
+
+/*******************************************************************
+ * EnumWindows16 (USER.54)
+ */
+BOOL16 EnumWindows16( WNDENUMPROC16 lpEnumFunc, LPARAM lParam )
+{
+ WND **list, **ppWnd;
/* We have to build a list of all windows first, to avoid */
/* unpleasant side-effects, for instance if the callback */
/* function changes the Z-order of the windows. */
- /* First count the windows */
+ if (!(list = WIN_BuildWinArray( pWndDesktop ))) return FALSE;
- count = 0;
- for (wndPtr = pWndDesktop->child; wndPtr; wndPtr = wndPtr->next) count++;
- if (!count) return TRUE;
+ /* Now call the callback function for every window */
- /* Now build the list of all windows */
-
- if (!(pWnd = list = (HWND *)malloc( sizeof(HWND) * count ))) return FALSE;
- for (wndPtr = pWndDesktop->child; wndPtr; wndPtr = wndPtr->next)
- *pWnd++ = wndPtr->hwndSelf;
-
- /* Now call the callback function for every window */
-
- for (pWnd = list; count > 0; count--, pWnd++)
+ for (ppWnd = list; *ppWnd; ppWnd++)
{
- /* Make sure that window still exists */
- if (!IsWindow(*pWnd)) continue;
- if (!CallEnumWindowsProc( lpEnumFunc, *pWnd, lParam )) break;
+ /* Make sure that the window still exists */
+ if (!IsWindow((*ppWnd)->hwndSelf)) continue;
+ if (!CallEnumWindowsProc16( lpEnumFunc, (*ppWnd)->hwndSelf, lParam ))
+ break;
}
- free( list );
+ HeapFree( SystemHeap, 0, list );
+ return TRUE;
+}
+
+
+/*******************************************************************
+ * EnumWindows32 (USER32.192)
+ */
+BOOL32 EnumWindows32( WNDENUMPROC32 lpEnumFunc, LPARAM lParam )
+{
+ WND **list, **ppWnd;
+
+ /* We have to build a list of all windows first, to avoid */
+ /* unpleasant side-effects, for instance if the callback */
+ /* function changes the Z-order of the windows. */
+
+ if (!(list = WIN_BuildWinArray( pWndDesktop ))) return FALSE;
+
+ /* Now call the callback function for every window */
+
+ for (ppWnd = list; *ppWnd; ppWnd++)
+ {
+ /* Make sure that the window still exists */
+ if (!IsWindow((*ppWnd)->hwndSelf)) continue;
+ if (!CallEnumWindowsProc32( lpEnumFunc, (*ppWnd)->hwndSelf, lParam ))
+ break;
+ }
+ HeapFree( SystemHeap, 0, list );
return TRUE;
}
/**********************************************************************
- * EnumTaskWindows (USER.225)
+ * EnumTaskWindows16 (USER.225)
*/
-BOOL EnumTaskWindows( HTASK hTask, WNDENUMPROC lpEnumFunc, LPARAM lParam )
+BOOL16 EnumTaskWindows16( HTASK16 hTask, WNDENUMPROC16 func, LPARAM lParam )
{
- WND *wndPtr;
- HWND *list, *pWnd;
+ WND **list, **ppWnd;
HANDLE hQueue = GetTaskQueue( hTask );
- int count;
/* This function is the same as EnumWindows(), */
/* except for an added check on the window queue. */
- /* First count the windows */
+ if (!(list = WIN_BuildWinArray( pWndDesktop ))) return FALSE;
- count = 0;
- for (wndPtr = pWndDesktop->child; wndPtr; wndPtr = wndPtr->next)
- if (wndPtr->hmemTaskQ == hQueue) count++;
- if (!count) return TRUE;
+ /* Now call the callback function for every window */
- /* Now build the list of all windows */
-
- if (!(pWnd = list = (HWND *)malloc( sizeof(HWND) * count ))) return FALSE;
- for (wndPtr = pWndDesktop->child; wndPtr; wndPtr = wndPtr->next)
- if (wndPtr->hmemTaskQ == hQueue) *pWnd++ = wndPtr->hwndSelf;
-
- /* Now call the callback function for every window */
-
- for (pWnd = list; count > 0; count--, pWnd++)
+ for (ppWnd = list; *ppWnd; ppWnd++)
{
- /* Make sure that window still exists */
- if (!IsWindow(*pWnd)) continue;
- if (!CallEnumTaskWndProc( lpEnumFunc, *pWnd, lParam )) break;
+ /* Make sure that the window still exists */
+ if (!IsWindow((*ppWnd)->hwndSelf)) continue;
+ if ((*ppWnd)->hmemTaskQ != hQueue) continue; /* Check the queue */
+ if (!CallEnumWindowsProc16( func, (*ppWnd)->hwndSelf, lParam ))
+ break;
}
- free( list );
+ HeapFree( SystemHeap, 0, list );
return TRUE;
}
-/*******************************************************************
- * WIN_EnumChildWin
- *
- * o hwnd is the first child to use, loop until all next windows
- * are processed
- *
- * o call wdnenumprc
- *
- * o call ourselves with the next child window
- *
+/**********************************************************************
+ * EnumThreadWindows (USER32.189)
*/
-static BOOL WIN_EnumChildWin( WND *wndPtr, FARPROC wndenumprc, LPARAM lParam )
+BOOL32 EnumThreadWindows( DWORD id, WNDENUMPROC32 func, LPARAM lParam )
{
- WND *pWndNext, *pWndChild;
- while (wndPtr)
+ WND **list, **ppWnd;
+ HANDLE hQueue = GetTaskQueue( (DWORD)id );
+
+ if (!(list = WIN_BuildWinArray( pWndDesktop ))) return FALSE;
+
+ /* Now call the callback function for every window */
+
+ for (ppWnd = list; *ppWnd; ppWnd++)
{
- pWndNext = wndPtr->next; /* storing hwnd is a way to avoid.. */
- pWndChild = wndPtr->child; /* ..side effects after wndenumprc */
- if (!CallEnumWindowsProc( wndenumprc, wndPtr->hwndSelf, lParam ))
- return 0;
- if (pWndChild && IsWindow(pWndChild->hwndSelf))
- if (!WIN_EnumChildWin(pWndChild, wndenumprc, lParam)) return 0;
- wndPtr = pWndNext;
- }
- return 1;
+ /* Make sure that the window still exists */
+ if (!IsWindow((*ppWnd)->hwndSelf)) continue;
+ if ((*ppWnd)->hmemTaskQ != hQueue) continue; /* Check the queue */
+ if (!CallEnumWindowsProc32( func, (*ppWnd)->hwndSelf, lParam ))
+ break;
+ }
+ HeapFree( SystemHeap, 0, list );
+ return TRUE;
}
-/*******************************************************************
- * EnumChildWindows (USER.55)
+/**********************************************************************
+ * WIN_EnumChildWindows16
*
- * o gets the first child of hwnd
- *
- * o calls WIN_EnumChildWin to do a recursive decent of child windows
+ * Helper function for EnumChildWindows16().
*/
-BOOL EnumChildWindows(HWND hwnd, WNDENUMPROC wndenumprc, LPARAM lParam)
+static BOOL16 WIN_EnumChildWindows16( WND **ppWnd, WNDENUMPROC16 func,
+ LPARAM lParam )
{
- WND *wndPtr;
+ WND **childList;
+ BOOL16 ret = FALSE;
- dprintf_enum(stddeb,"EnumChildWindows\n");
+ while (*ppWnd)
+ {
+ /* Make sure that the window still exists */
+ if (!IsWindow((*ppWnd)->hwndSelf)) continue;
+ /* Build children list first */
+ if (!(childList = WIN_BuildWinArray( *ppWnd ))) return FALSE;
+ if (!CallEnumWindowsProc16( func, (*ppWnd)->hwndSelf, lParam ))
+ return FALSE;
+ ret = WIN_EnumChildWindows16( childList, func, lParam );
+ HeapFree( SystemHeap, 0, childList );
+ if (!ret) return FALSE;
+ ppWnd++;
+ }
+ return TRUE;
+}
- if (hwnd == 0) return 0;
- if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
- return WIN_EnumChildWin(wndPtr->child, wndenumprc, lParam);
+
+/**********************************************************************
+ * WIN_EnumChildWindows32
+ *
+ * Helper function for EnumChildWindows32().
+ */
+static BOOL32 WIN_EnumChildWindows32( WND **ppWnd, WNDENUMPROC32 func,
+ LPARAM lParam )
+{
+ WND **childList;
+ BOOL32 ret = FALSE;
+
+ while (*ppWnd)
+ {
+ /* Make sure that the window still exists */
+ if (!IsWindow((*ppWnd)->hwndSelf)) continue;
+ /* Build children list first */
+ if (!(childList = WIN_BuildWinArray( *ppWnd ))) return FALSE;
+ if (!CallEnumWindowsProc32( func, (*ppWnd)->hwndSelf, lParam ))
+ return FALSE;
+ ret = WIN_EnumChildWindows32( childList, func, lParam );
+ HeapFree( SystemHeap, 0, childList );
+ if (!ret) return FALSE;
+ ppWnd++;
+ }
+ return TRUE;
+}
+
+
+/**********************************************************************
+ * EnumChildWindows16 (USER.55)
+ */
+BOOL16 EnumChildWindows16( HWND16 parent, WNDENUMPROC16 func, LPARAM lParam )
+{
+ WND **list, *pParent;
+
+ if (!(pParent = WIN_FindWndPtr( parent ))) return FALSE;
+ if (!(list = WIN_BuildWinArray( pParent ))) return FALSE;
+ WIN_EnumChildWindows16( list, func, lParam );
+ HeapFree( SystemHeap, 0, list );
+ return TRUE;
+}
+
+
+/**********************************************************************
+ * EnumChildWindows32 (USER32.177)
+ */
+BOOL32 EnumChildWindows32( HWND32 parent, WNDENUMPROC32 func, LPARAM lParam )
+{
+ WND **list, *pParent;
+
+ if (!(pParent = WIN_FindWndPtr( parent ))) return FALSE;
+ if (!(list = WIN_BuildWinArray( pParent ))) return FALSE;
+ WIN_EnumChildWindows32( list, func, lParam );
+ HeapFree( SystemHeap, 0, list );
+ return TRUE;
}
diff --git a/windows/winpos.c b/windows/winpos.c
index e2c3ff7..1acf4b5 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -825,21 +825,6 @@
/*******************************************************************
- * ACTIVATEAPP_callback
- */
-BOOL ACTIVATEAPP_callback(HWND hWnd, LPARAM lParam)
-{
- ACTIVATESTRUCT *lpActStruct = (ACTIVATESTRUCT*)lParam;
-
- if (GetWindowTask(hWnd) != lpActStruct->hTaskSendTo) return 1;
-
- SendMessage16( hWnd, WM_ACTIVATEAPP, lpActStruct->wFlag,
- (LPARAM)((lpActStruct->hWindowTask)?lpActStruct->hWindowTask:0));
- return 1;
-}
-
-
-/*******************************************************************
* WINPOS_SetActiveWindow
*
* back-end to SetActiveWindow
@@ -849,8 +834,6 @@
WND *wndPtr = WIN_FindWndPtr(hWnd);
WND *wndTemp = WIN_FindWndPtr(hwndActive);
CBTACTIVATESTRUCT16 *cbtStruct;
- FARPROC enumCallback = MODULE_GetWndProcEntry16("ActivateAppProc");
- ACTIVATESTRUCT actStruct;
WORD wIconized=0;
/* FIXME: When proper support for cooperative multitasking is in place
@@ -940,24 +923,34 @@
/* send WM_ACTIVATEAPP if necessary */
if (hActiveQ != wndPtr->hmemTaskQ)
{
- HTASK hT = QUEUE_GetQueueTask( hActiveQ );
+ WND **list, **ppWnd;
- actStruct.wFlag = 0; /* deactivate */
- actStruct.hWindowTask = QUEUE_GetQueueTask(wndPtr->hmemTaskQ);
- actStruct.hTaskSendTo = hT;
+ if ((list = WIN_BuildWinArray( WIN_GetDesktop() )))
+ {
+ for (ppWnd = list; *ppWnd; ppWnd++)
+ {
+ /* Make sure that the window still exists */
+ if (!IsWindow( (*ppWnd)->hwndSelf )) continue;
+ if ((*ppWnd)->hmemTaskQ != hActiveQ) continue;
+ SendMessage16( (*ppWnd)->hwndSelf, WM_ACTIVATEAPP,
+ 0, QUEUE_GetQueueTask(wndPtr->hmemTaskQ) );
+ }
+ HeapFree( SystemHeap, 0, list );
+ }
- /* send WM_ACTIVATEAPP to top-level windows
- * that belong to the actStruct.hTaskSendTo task
- */
- EnumWindows( enumCallback , (LPARAM)&actStruct );
-
- actStruct.wFlag = 1; /* activate */
- actStruct.hWindowTask = hT;
- actStruct.hTaskSendTo = QUEUE_GetQueueTask( wndPtr->hmemTaskQ );
-
- EnumWindows( enumCallback , (LPARAM)&actStruct );
-
- if( !IsWindow(hWnd) ) return 0;
+ if ((list = WIN_BuildWinArray( WIN_GetDesktop() )))
+ {
+ for (ppWnd = list; *ppWnd; ppWnd++)
+ {
+ /* Make sure that the window still exists */
+ if (!IsWindow( (*ppWnd)->hwndSelf )) continue;
+ if ((*ppWnd)->hmemTaskQ != wndPtr->hmemTaskQ) continue;
+ SendMessage16( (*ppWnd)->hwndSelf, WM_ACTIVATEAPP,
+ 1, QUEUE_GetQueueTask( hActiveQ ) );
+ }
+ HeapFree( SystemHeap, 0, list );
+ }
+ if (!IsWindow(hWnd)) return 0;
}
/* walk up to the first unowned window */
diff --git a/windows/winproc.c b/windows/winproc.c
index f206657..ff10000 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -14,21 +14,134 @@
#include "string32.h"
#include "struct32.h"
#include "win.h"
+#include "wine.h"
#include "winproc.h"
-
+/* Window procedure 16-bit thunk; see BuildSpec16Files() in tools/build.c */
typedef struct
{
- UINT32 magic; /* Magic number */
- WINDOWPROCTYPE type; /* Function type */
- UINT32 count; /* Reference count */
- UINT32 func; /* 16- or 32-bit function */
+ BYTE popl_eax; /* popl %eax (return address) */
+ BYTE pushl_func; /* pushl $proc */
+ WNDPROC32 proc WINE_PACKED;
+ BYTE pushl_eax; /* pushl %eax */
+ WORD pushw_bp WINE_PACKED; /* pushw %bp */
+ BYTE pushl_thunk; /* pushl $thunkfrom16 */
+ void (*thunk32)() WINE_PACKED;
+ BYTE lcall; /* lcall cs:relay */
+ void (*relay)() WINE_PACKED;
+ WORD cs WINE_PACKED;
+} WINPROC_THUNK_FROM16;
+
+/* Window procedure 32-bit thunk; see BuildSpec32Files() in tools/build.c */
+typedef struct
+{
+ BYTE popl_eax; /* popl %eax (return address) */
+ BYTE pushl; /* pushl $proc */
+ WNDPROC16 proc WINE_PACKED;
+ BYTE pushl_eax; /* pushl %eax */
+ BYTE pushl_ebp; /* pushl %ebp */
+ BYTE pushl_name; /* pushl $name */
+ LPCSTR name WINE_PACKED;
+ BYTE pushl_thunk; /* pushl $thunkfrom32 */
+ void (*thunk32)() WINE_PACKED;
+ BYTE jmp; /* jmp relay */
+ void (*relay)() WINE_PACKED;
+} WINPROC_THUNK_FROM32;
+
+typedef union
+{
+ WINPROC_THUNK_FROM16 t_from16;
+ WINPROC_THUNK_FROM32 t_from32;
+} WINPROC_THUNK;
+
+typedef struct tagWINDOWPROC
+{
+ WINPROC_THUNK thunk; /* Thunk */
+ struct tagWINDOWPROC *next; /* Next window proc */
+ UINT32 magic; /* Magic number */
+ WINDOWPROCTYPE type; /* Function type */
} WINDOWPROC;
#define WINPROC_MAGIC ('W' | ('P' << 8) | ('R' << 16) | ('C' << 24))
+#define WINPROC_THUNKPROC(pproc) \
+ (((pproc)->type == WIN_PROC_16) ? \
+ (WNDPROC16)((pproc)->thunk.t_from32.proc) : \
+ (WNDPROC16)((pproc)->thunk.t_from16.proc))
-static HANDLE32 WinProcHeap = 0;
+LRESULT WINPROC_CallProc16To32A( HWND16 hwnd, UINT16 msg,
+ WPARAM16 wParam, LPARAM lParam,
+ WNDPROC32 func );
+LRESULT WINPROC_CallProc16To32W( HWND16 hwnd, UINT16 msg,
+ WPARAM16 wParam, LPARAM lParam,
+ WNDPROC32 func );
+static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, HWND32 hwnd,
+ UINT32 msg, WPARAM32 wParam,
+ LPARAM lParam );
+static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, HWND32 hwnd,
+ UINT32 msg, WPARAM32 wParam,
+ LPARAM lParam );
+
+#ifndef WINELIB
+extern void CallFrom16_long_wwwll(void);
+extern void CallFrom32_5(void);
+#else
+static void CallFrom16_long_wwwll(void) {}
+static void CallFrom32_5(void) {}
+#endif /* WINELIB */
+
+/* Reference 16->32A thunk */
+static const WINPROC_THUNK_FROM16 WINPROC_ThunkRef16To32A =
+{
+ 0x58, /* popl %eax */
+ 0x68, 0x00000000, /* pushl $proc32 */
+ 0x50, /* pushl %eax */
+ 0x5566, /* pushw %bp */
+ 0x68, (void (*)())WINPROC_CallProc16To32A, /* pushl $thunk32 */
+ 0x9a, CallFrom16_long_wwwll, /* lcall cs:relay */
+ WINE_CODE_SELECTOR
+};
+
+/* Reference 16->32W thunk */
+static const WINPROC_THUNK_FROM16 WINPROC_ThunkRef16To32W =
+{
+ 0x58, /* popl %eax */
+ 0x68, 0x00000000, /* pushl $proc32 */
+ 0x50, /* pushl %eax */
+ 0x5566, /* pushw %bp */
+ 0x68, (void (*)())WINPROC_CallProc16To32W, /* pushl $thunk32 */
+ 0x9a, CallFrom16_long_wwwll, /* lcall cs:relay */
+ WINE_CODE_SELECTOR
+};
+
+/* Reference 32A->16 thunk */
+static const WINPROC_THUNK_FROM32 WINPROC_ThunkRef32ATo16 =
+{
+ 0x58, /* popl %eax */
+ 0x68, 0x00000000, /* pushl $proc16 */
+ 0x50, /* pushl %eax */
+ 0x55, /* pushl %ebp */
+ 0x68, "WINPROC_CallProc32ATo16", /* pushl $name */
+ 0x68, (void (*)())WINPROC_CallProc32ATo16, /* pushl $thunk32 */
+ 0xe9, CallFrom32_5 /* jmp relay */
+};
+
+
+static HANDLE32 WinProcHeap;
+
+/**********************************************************************
+ * WINPROC_Init
+ */
+BOOL32 WINPROC_Init(void)
+{
+ WinProcHeap = HeapCreate( HEAP_WINE_SEGPTR | HEAP_WINE_CODESEG, 0, 0 );
+ if (!WinProcHeap)
+ {
+ fprintf( stderr, "Unable to create winproc heap\n" );
+ return FALSE;
+ }
+ return TRUE;
+}
/**********************************************************************
@@ -36,7 +149,7 @@
*
* Return a pointer to the win proc.
*/
-static WINDOWPROC *WINPROC_GetPtr( HANDLE32 handle )
+static WINDOWPROC *WINPROC_GetPtr( WNDPROC16 handle )
{
WINDOWPROC *proc;
@@ -65,111 +178,899 @@
*
* Allocate a new window procedure.
*/
-HANDLE32 WINPROC_AllocWinProc( UINT32 func, WINDOWPROCTYPE type )
+static WINDOWPROC *WINPROC_AllocWinProc( WNDPROC16 func, WINDOWPROCTYPE type )
{
- WINDOWPROC *proc;
+ WINDOWPROC *proc, *oldproc;
- /* Create the heap if necessary */
-
- if (!WinProcHeap)
- {
- if (!(WinProcHeap = HeapCreate( HEAP_WINE_SEGPTR, 0, 0 ))) return 0;
- }
-
- /* Check if function is already a win proc */
-
- if ((proc = WINPROC_GetPtr( (HANDLE32)func )))
- {
- proc->count++;
- return (HANDLE32)func;
- }
-
- /* Now allocate a new one */
+ /* Allocate a window procedure */
if (!(proc = HeapAlloc( WinProcHeap, 0, sizeof(WINDOWPROC) ))) return 0;
- proc->magic = WINPROC_MAGIC;
- proc->type = type;
- proc->count = 1;
- proc->func = func;
- return (HANDLE32)proc;
+
+ /* Check if the function is already a win proc */
+
+ if ((oldproc = WINPROC_GetPtr( func )))
+ {
+ *proc = *oldproc;
+ }
+ else
+ {
+ switch(type)
+ {
+ case WIN_PROC_16:
+ proc->thunk.t_from32 = WINPROC_ThunkRef32ATo16;
+ proc->thunk.t_from32.proc = func;
+ /* We need to fix the relative jump target */
+ proc->thunk.t_from32.relay = (void (*)())((DWORD)proc->thunk.t_from32.relay -
+ (DWORD)(&proc->thunk.t_from32.relay + 1));
+ break;
+ case WIN_PROC_32A:
+ proc->thunk.t_from16 = WINPROC_ThunkRef16To32A;
+ proc->thunk.t_from16.proc = (FARPROC32)func;
+ break;
+ case WIN_PROC_32W:
+ proc->thunk.t_from16 = WINPROC_ThunkRef16To32W;
+ proc->thunk.t_from16.proc = (FARPROC32)func;
+ break;
+ default:
+ /* Should not happen */
+ break;
+ }
+ proc->magic = WINPROC_MAGIC;
+ proc->type = type;
+ }
+ proc->next = NULL;
+ return proc;
}
/**********************************************************************
- * WINPROC_CopyWinProc
+ * WINPROC_GetProc
*
- * Copy a window procedure.
+ * Get a window procedure pointer that can be passed to the Windows program.
*/
-HANDLE32 WINPROC_CopyWinProc( HANDLE32 handle )
+WNDPROC16 WINPROC_GetProc( HWINDOWPROC proc, WINDOWPROCTYPE type )
{
- WINDOWPROC *proc;
- if ((proc = WINPROC_GetPtr( (HANDLE32)handle )))
+ if (type == WIN_PROC_16) /* We want a 16:16 address */
{
- proc->count++;
- return handle;
+ if (((WINDOWPROC *)proc)->type == WIN_PROC_16)
+ return ((WINDOWPROC *)proc)->thunk.t_from32.proc;
+ else
+ return (WNDPROC16)HEAP_GetSegptr( WinProcHeap, 0, proc );
}
- return (HANDLE32)0;
+ else /* We want a 32-bit address */
+ {
+ if (((WINDOWPROC *)proc)->type == WIN_PROC_16)
+ return (WNDPROC16)proc;
+ else
+ return (WNDPROC16)((WINDOWPROC *)proc)->thunk.t_from16.proc;
+ }
}
/**********************************************************************
- * WINPROC_FreeWinProc
+ * WINPROC_SetProc
*
- * Free a window procedure.
+ * Set the window procedure for a window or class.
*/
-void WINPROC_FreeWinProc( HANDLE32 handle )
+BOOL32 WINPROC_SetProc( HWINDOWPROC *pFirst, WNDPROC16 func,
+ WINDOWPROCTYPE type )
{
- WINDOWPROC *proc;
+ WINDOWPROC *proc, **ppPrev;
- if (!(proc = WINPROC_GetPtr( handle )))
+ /* Check if function is already in the list */
+
+ ppPrev = (WINDOWPROC **)pFirst;
+ proc = WINPROC_GetPtr( func );
+ while (*ppPrev)
{
- fprintf( stderr, "WINPROC_FreeWinProc: invalid proc %08x\n", handle );
- return;
+ if (proc)
+ {
+ if (*ppPrev == proc) break;
+ }
+ else
+ {
+ if (((*ppPrev)->type == type) &&
+ (func == WINPROC_THUNKPROC(*ppPrev))) break;
+ }
+ ppPrev = &(*ppPrev)->next;
}
- if (--proc->count == 0)
+
+ if (*ppPrev) /* Remove it from the list */
{
- proc->magic = 0; /* Just in case */
+ proc = *ppPrev;
+ *ppPrev = proc->next;
+ }
+ else /* Allocate a new one */
+ {
+ if (proc) /* Was already a win proc */
+ {
+ type = proc->type;
+ func = WINPROC_THUNKPROC(proc);
+ }
+ proc = WINPROC_AllocWinProc( func, type );
+ if (!proc) return FALSE;
+ }
+
+ /* Add the win proc at the head of the list */
+
+ proc->next = *(WINDOWPROC **)pFirst;
+ *(WINDOWPROC **)pFirst = proc;
+ return TRUE;
+}
+
+
+/**********************************************************************
+ * WINPROC_FreeProc
+ *
+ * Free a list of win procs.
+ */
+void WINPROC_FreeProc( HWINDOWPROC proc )
+{
+ while (proc)
+ {
+ WINDOWPROC *next = ((WINDOWPROC *)proc)->next;
HeapFree( WinProcHeap, 0, proc );
+ proc = next;
}
}
/**********************************************************************
- * WINPROC_GetWinProcType
+ * WINPROC_GetProcType
*
* Return the window procedure type.
*/
-WINDOWPROCTYPE WINPROC_GetWinProcType( HANDLE32 handle )
+WINDOWPROCTYPE WINPROC_GetProcType( HWINDOWPROC proc )
{
- WINDOWPROC *proc = WINPROC_GetPtr( handle );
- if (!proc) return WIN_PROC_INVALID;
- return proc->type;
+ if (!proc ||
+ (((WINDOWPROC *)proc)->magic != WINPROC_MAGIC))
+ return WIN_PROC_INVALID;
+ return ((WINDOWPROC *)proc)->type;
}
/**********************************************************************
- * WINPROC_GetFunc16
+ * WINPROC_MapMsg32ATo32W
*
- * Return the 16-bit function pointer, or NULL if none.
+ * Map a message from Ansi to Unicode.
+ * Return value is -1 on error, 0 if OK, 1 if an UnmapMsg call is needed.
*/
-WNDPROC16 WINPROC_GetFunc16( HANDLE32 handle )
+INT32 WINPROC_MapMsg32ATo32W( UINT32 msg, WPARAM32 wParam, LPARAM *plparam )
{
- WINDOWPROC *proc = WINPROC_GetPtr( handle );
- if (!proc) return (WNDPROC16)0;
- return (WNDPROC16)HEAP_GetSegptr( WinProcHeap, 0, proc );
+ switch(msg)
+ {
+ case WM_GETTEXT:
+ {
+ LPARAM *ptr = (LPARAM *)HeapAlloc( SystemHeap, 0,
+ wParam * sizeof(WCHAR) + sizeof(LPARAM) );
+ if (!ptr) return -1;
+ *ptr++ = *plparam; /* Store previous lParam */
+ *plparam = (LPARAM)ptr;
+ }
+ return 1;
+ case WM_SETTEXT:
+ *plparam = (LPARAM)STRING32_DupAnsiToUni( (LPCSTR)*plparam );
+ return (*plparam ? 1 : -1);
+ case WM_NCCREATE:
+ case WM_CREATE:
+ {
+ CREATESTRUCT32W *cs = (CREATESTRUCT32W *)HeapAlloc( SystemHeap, 0,
+ sizeof(*cs) );
+ if (!cs) return -1;
+ *cs = *(CREATESTRUCT32W *)*plparam;
+ if (HIWORD(cs->lpszName))
+ cs->lpszName = STRING32_DupAnsiToUni( (LPCSTR)cs->lpszName );
+ if (HIWORD(cs->lpszClass))
+ cs->lpszClass = STRING32_DupAnsiToUni( (LPCSTR)cs->lpszClass );
+ *plparam = (LPARAM)cs;
+ }
+ return 1;
+ default: /* No translation needed */
+ return 0;
+ }
}
/**********************************************************************
- * WINPROC_GetFunc32
+ * WINPROC_UnmapMsg32ATo32W
*
- * Return the 32-bit function pointer, or NULL if none.
+ * Unmap a message that was mapped from Ansi to Unicode.
*/
-WNDPROC32 WINPROC_GetFunc32( HANDLE32 handle )
+void WINPROC_UnmapMsg32ATo32W( UINT32 msg, WPARAM32 wParam, LPARAM lParam )
{
- WINDOWPROC *proc = WINPROC_GetPtr( handle );
- if (!proc) return (WNDPROC32)0;
- return (WNDPROC32)proc;
+ switch(msg)
+ {
+ case WM_GETTEXT:
+ {
+ LPARAM *ptr = (LPARAM *)lParam - 1;
+ STRING32_UniToAnsi( (LPSTR)*ptr, (LPWSTR)(ptr + 1) );
+ HeapFree( SystemHeap, 0, ptr );
+ }
+ break;
+ case WM_SETTEXT:
+ free( (void *)lParam );
+ break;
+ case WM_NCCREATE:
+ case WM_CREATE:
+ {
+ CREATESTRUCT32W *cs = (CREATESTRUCT32W *)lParam;
+ if (HIWORD(cs->lpszName)) free( (LPVOID)cs->lpszName );
+ if (HIWORD(cs->lpszClass)) free( (LPVOID)cs->lpszClass );
+ HeapFree( SystemHeap, 0, cs );
+ }
+ break;
+ }
+}
+
+
+/**********************************************************************
+ * WINPROC_MapMsg32WTo32A
+ *
+ * Map a message from Unicode to Ansi.
+ * Return value is -1 on error, 0 if OK, 1 if an UnmapMsg call is needed.
+ */
+INT32 WINPROC_MapMsg32WTo32A( UINT32 msg, WPARAM32 wParam, LPARAM *plparam )
+{
+ switch(msg)
+ {
+ case WM_GETTEXT:
+ {
+ LPARAM *ptr = (LPARAM *)HeapAlloc( SystemHeap, 0,
+ wParam + sizeof(LPARAM) );
+ if (!ptr) return -1;
+ *ptr++ = *plparam; /* Store previous lParam */
+ *plparam = (LPARAM)ptr;
+ }
+ return 1;
+ case WM_SETTEXT:
+ *plparam = (LPARAM)STRING32_DupUniToAnsi( (LPCWSTR)*plparam );
+ return (*plparam ? 1 : -1);
+ case WM_NCCREATE:
+ case WM_CREATE:
+ {
+ CREATESTRUCT32A *cs = (CREATESTRUCT32A *)HeapAlloc( SystemHeap, 0,
+ sizeof(*cs) );
+ if (!cs) return -1;
+ *cs = *(CREATESTRUCT32A *)*plparam;
+ if (HIWORD(cs->lpszName))
+ cs->lpszName = STRING32_DupUniToAnsi( (LPCWSTR)cs->lpszName );
+ if (HIWORD(cs->lpszClass))
+ cs->lpszClass = STRING32_DupUniToAnsi( (LPCWSTR)cs->lpszClass);
+ *plparam = (LPARAM)cs;
+ }
+ return 1;
+ default: /* No translation needed */
+ return 0;
+ }
+}
+
+
+/**********************************************************************
+ * WINPROC_UnmapMsg32WTo32A
+ *
+ * Unmap a message that was mapped from Unicode to Ansi.
+ */
+void WINPROC_UnmapMsg32WTo32A( UINT32 msg, WPARAM32 wParam, LPARAM lParam )
+{
+ switch(msg)
+ {
+ case WM_GETTEXT:
+ {
+ LPARAM *ptr = (LPARAM *)lParam - 1;
+ STRING32_AnsiToUni( (LPWSTR)*ptr, (LPSTR)(ptr + 1) );
+ HeapFree( SystemHeap, 0, ptr );
+ }
+ break;
+ case WM_SETTEXT:
+ free( (void *)lParam );
+ break;
+ case WM_NCCREATE:
+ case WM_CREATE:
+ {
+ CREATESTRUCT32A *cs = (CREATESTRUCT32A *)lParam;
+ if (HIWORD(cs->lpszName)) free( (LPVOID)cs->lpszName );
+ if (HIWORD(cs->lpszClass)) free( (LPVOID)cs->lpszClass );
+ HeapFree( SystemHeap, 0, cs );
+ }
+ break;
+ }
+}
+
+
+/**********************************************************************
+ * WINPROC_MapMsg16To32A
+ *
+ * Map a message from 16- to 32-bit Ansi.
+ * Return value is -1 on error, 0 if OK, 1 if an UnmapMsg call is needed.
+ */
+INT32 WINPROC_MapMsg16To32A( UINT16 msg16, WPARAM16 wParam16, UINT32 *pmsg32,
+ WPARAM32 *pwparam32, LPARAM *plparam )
+{
+ *pmsg32 = (UINT32)msg16;
+ *pwparam32 = (WPARAM32)wParam16;
+ switch(msg16)
+ {
+ case WM_ACTIVATE:
+ case WM_CHARTOITEM:
+ case WM_COMMAND:
+ case WM_HSCROLL:
+ case WM_VKEYTOITEM:
+ case WM_VSCROLL:
+ *pwparam32 = MAKEWPARAM( wParam16, HIWORD(*plparam) );
+ *plparam = (LPARAM)(HWND32)LOWORD(*plparam);
+ return 0;
+ case WM_CTLCOLOR:
+ *pmsg32 = WM_CTLCOLORMSGBOX + HIWORD(*plparam);
+ *pwparam32 = (WPARAM32)(HDC32)wParam16;
+ *plparam = (LPARAM)(HWND32)LOWORD(*plparam);
+ return 0;
+ case WM_DRAWITEM:
+ {
+ DRAWITEMSTRUCT16* dis16 = (DRAWITEMSTRUCT16 *)PTR_SEG_TO_LIN(*plparam);
+ DRAWITEMSTRUCT32 *dis = (DRAWITEMSTRUCT32*)HeapAlloc(SystemHeap, 0,
+ sizeof(*dis));
+ if (!dis) return -1;
+ dis->CtlType = dis16->CtlType;
+ dis->CtlID = dis16->CtlID;
+ dis->itemID = dis16->itemID;
+ dis->itemAction = dis16->itemAction;
+ dis->itemState = dis16->itemState;
+ dis->hwndItem = dis16->hwndItem;
+ dis->hDC = dis16->hDC;
+ dis->itemData = dis16->itemData;
+ CONV_RECT16TO32( &dis16->rcItem, &dis->rcItem );
+ *plparam = (LPARAM)dis;
+ }
+ return 1;
+ case WM_GETMINMAXINFO:
+ {
+ MINMAXINFO32 *mmi = (MINMAXINFO32 *)HeapAlloc( SystemHeap, 0,
+ sizeof(*mmi) + sizeof(LPARAM));
+ if (!mmi) return -1;
+ STRUCT32_MINMAXINFO16to32( (MINMAXINFO16*)PTR_SEG_TO_LIN(*plparam),
+ mmi );
+ *(LPARAM *)(mmi + 1) = *plparam; /* Store the previous lParam */
+ *plparam = (LPARAM)mmi;
+ }
+ return 1;
+ case WM_GETTEXT:
+ *plparam = (LPARAM)PTR_SEG_TO_LIN(*plparam);
+ return 0;
+ case WM_MDISETMENU:
+ *pwparam32 = (WPARAM32)(HMENU32)LOWORD(*plparam);
+ *plparam = (LPARAM)(HMENU32)HIWORD(*plparam);
+ return 0;
+ case WM_MENUCHAR:
+ case WM_MENUSELECT:
+ *pwparam32 = MAKEWPARAM( wParam16, LOWORD(*plparam) );
+ *plparam = (LPARAM)(HMENU32)HIWORD(*plparam);
+ return 0;
+ case WM_NCCALCSIZE:
+ {
+ NCCALCSIZE_PARAMS16 *nc16;
+ NCCALCSIZE_PARAMS32 *nc;
+
+ nc = (NCCALCSIZE_PARAMS32 *)HeapAlloc( SystemHeap, 0,
+ sizeof(*nc) + sizeof(LPARAM) );
+ if (!nc) return -1;
+ nc16 = (NCCALCSIZE_PARAMS16 *)PTR_SEG_TO_LIN(*plparam);
+ CONV_RECT16TO32( &nc16->rgrc[0], &nc->rgrc[0] );
+ if (wParam16)
+ {
+ nc->lppos = (WINDOWPOS32 *)HeapAlloc( SystemHeap, 0,
+ sizeof(*nc->lppos) );
+ CONV_RECT16TO32( &nc16->rgrc[1], &nc->rgrc[1] );
+ CONV_RECT16TO32( &nc16->rgrc[2], &nc->rgrc[2] );
+ if (nc->lppos) STRUCT32_WINDOWPOS16to32( (WINDOWPOS16 *)PTR_SEG_TO_LIN(nc16->lppos), nc->lppos );
+ }
+ *(LPARAM *)(nc + 1) = *plparam; /* Store the previous lParam */
+ *plparam = (LPARAM)nc;
+ }
+ return 1;
+ case WM_NCCREATE:
+ case WM_CREATE:
+ {
+ CREATESTRUCT16 *cs16 = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(*plparam);
+ CREATESTRUCT32A *cs = (CREATESTRUCT32A *)HeapAlloc( SystemHeap, 0,
+ sizeof(*cs) + sizeof(LPARAM) );
+ if (!cs) return -1;
+ STRUCT32_CREATESTRUCT16to32A( cs16, cs );
+ cs->lpszName = (LPCSTR)PTR_SEG_TO_LIN(cs16->lpszName);
+ cs->lpszClass = (LPCSTR)PTR_SEG_TO_LIN(cs16->lpszClass);
+ *(LPARAM *)(cs + 1) = *plparam; /* Store the previous lParam */
+ *plparam = (LPARAM)cs;
+ }
+ return 1;
+ case WM_PARENTNOTIFY:
+ if ((wParam16 == WM_CREATE) || (wParam16 == WM_DESTROY))
+ {
+ *pwparam32 = MAKEWPARAM( wParam16, HIWORD(*plparam) );
+ *plparam = (LPARAM)(HWND32)LOWORD(*plparam);
+ }
+ else
+ {
+ *pwparam32 = MAKEWPARAM( wParam16, 0 /* FIXME? */ );
+ }
+ return 0;
+ case WM_SETTEXT:
+ *plparam = (LPARAM)PTR_SEG_TO_LIN(*plparam);
+ return 0;
+ case WM_WINDOWPOSCHANGING:
+ case WM_WINDOWPOSCHANGED:
+ {
+ WINDOWPOS32 *wp = (WINDOWPOS32 *)HeapAlloc( SystemHeap, 0,
+ sizeof(*wp) + sizeof(LPARAM) );
+ if (!wp) return -1;
+ STRUCT32_WINDOWPOS16to32( (WINDOWPOS16 *)PTR_SEG_TO_LIN(*plparam),
+ wp );
+ *(LPARAM *)(wp + 1) = *plparam; /* Store the previous lParam */
+ *plparam = (LPARAM)wp;
+ }
+ return 1;
+ case WM_ASKCBFORMATNAME:
+ case WM_COMPAREITEM:
+ case WM_DELETEITEM:
+ case WM_DEVMODECHANGE:
+ case WM_MDIACTIVATE:
+ case WM_MDICREATE:
+ case WM_MEASUREITEM:
+ case WM_PAINTCLIPBOARD:
+ case WM_SIZECLIPBOARD:
+ case WM_WININICHANGE:
+ fprintf( stderr, "MapMsg16To32A: message %04x needs translation\n",
+ msg16 );
+ return -1;
+
+ default: /* No translation needed */
+ return 0;
+ }
+}
+
+
+/**********************************************************************
+ * WINPROC_UnmapMsg16To32A
+ *
+ * Unmap a message that was mapped from 16- to 32-bit Ansi.
+ */
+void WINPROC_UnmapMsg16To32A( UINT32 msg, WPARAM32 wParam, LPARAM lParam )
+{
+ switch(msg)
+ {
+ case WM_DRAWITEM:
+ HeapFree( SystemHeap, 0, (LPVOID)lParam );
+ break;
+ case WM_GETMINMAXINFO:
+ {
+ MINMAXINFO32 *mmi = (MINMAXINFO32 *)lParam;
+ lParam = *(LPARAM *)(mmi + 1);
+ STRUCT32_MINMAXINFO32to16( mmi,
+ (MINMAXINFO16 *)PTR_SEG_TO_LIN(lParam));
+ HeapFree( SystemHeap, 0, mmi );
+ }
+ break;
+ case WM_NCCALCSIZE:
+ {
+ NCCALCSIZE_PARAMS16 *nc16;
+ NCCALCSIZE_PARAMS32 *nc = (NCCALCSIZE_PARAMS32 *)lParam;
+ lParam = *(LPARAM *)(nc + 1);
+ nc16 = (NCCALCSIZE_PARAMS16 *)PTR_SEG_TO_LIN(lParam);
+ CONV_RECT32TO16( &nc->rgrc[0], &nc16->rgrc[0] );
+ if (wParam)
+ {
+ CONV_RECT32TO16( &nc->rgrc[1], &nc16->rgrc[1] );
+ CONV_RECT32TO16( &nc->rgrc[2], &nc16->rgrc[2] );
+ if (nc->lppos)
+ {
+ STRUCT32_WINDOWPOS32to16( nc->lppos,
+ (WINDOWPOS16 *)PTR_SEG_TO_LIN(nc16->lppos));
+ HeapFree( SystemHeap, 0, nc->lppos );
+ }
+ }
+ HeapFree( SystemHeap, 0, nc );
+ }
+ break;
+ case WM_NCCREATE:
+ case WM_CREATE:
+ {
+ CREATESTRUCT32A *cs = (CREATESTRUCT32A *)lParam;
+ lParam = *(LPARAM *)(cs + 1);
+ STRUCT32_CREATESTRUCT32Ato16( cs,
+ (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam) );
+ HeapFree( SystemHeap, 0, cs );
+ }
+ break;
+ case WM_WINDOWPOSCHANGING:
+ case WM_WINDOWPOSCHANGED:
+ {
+ WINDOWPOS32 *wp = (WINDOWPOS32 *)lParam;
+ lParam = *(LPARAM *)(wp + 1);
+ STRUCT32_WINDOWPOS32to16(wp,(WINDOWPOS16 *)PTR_SEG_TO_LIN(lParam));
+ HeapFree( SystemHeap, 0, wp );
+ }
+ break;
+ }
+}
+
+
+/**********************************************************************
+ * WINPROC_MapMsg16To32W
+ *
+ * Map a message from 16- to 32-bit Unicode.
+ * Return value is -1 on error, 0 if OK, 1 if an UnmapMsg call is needed.
+ */
+INT32 WINPROC_MapMsg16To32W( UINT16 msg16, WPARAM16 wParam16, UINT32 *pmsg32,
+ WPARAM32 *pwparam32, LPARAM *plparam )
+{
+ switch(msg16)
+ {
+ case WM_GETTEXT:
+ case WM_SETTEXT:
+ *plparam = (LPARAM)PTR_SEG_TO_LIN(*plparam);
+ return WINPROC_MapMsg32ATo32W( *pmsg32, *pwparam32, plparam );
+ case WM_NCCREATE:
+ case WM_CREATE:
+ {
+ CREATESTRUCT16 *cs16 = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(*plparam);
+ CREATESTRUCT32W *cs = (CREATESTRUCT32W *)HeapAlloc( SystemHeap, 0,
+ sizeof(*cs) + sizeof(LPARAM) );
+ if (!cs) return -1;
+ STRUCT32_CREATESTRUCT16to32A( cs16, (CREATESTRUCT32A *)cs );
+ cs->lpszName = (LPCWSTR)PTR_SEG_TO_LIN(cs16->lpszName);
+ cs->lpszClass = (LPCWSTR)PTR_SEG_TO_LIN(cs16->lpszClass);
+ if (HIWORD(cs->lpszName))
+ cs->lpszName = STRING32_DupAnsiToUni( (LPCSTR)cs->lpszName );
+ if (HIWORD(cs->lpszClass))
+ cs->lpszClass = STRING32_DupAnsiToUni( (LPCSTR)cs->lpszClass );
+ *(LPARAM *)(cs + 1) = *plparam; /* Store the previous lParam */
+ *plparam = (LPARAM)cs;
+ }
+ return 1;
+ default: /* No Unicode translation needed */
+ return WINPROC_MapMsg16To32A( msg16, wParam16, pmsg32,
+ pwparam32, plparam );
+ }
+}
+
+
+/**********************************************************************
+ * WINPROC_UnmapMsg16To32W
+ *
+ * Unmap a message that was mapped from 16- to 32-bit Unicode.
+ */
+void WINPROC_UnmapMsg16To32W( UINT32 msg, WPARAM32 wParam, LPARAM lParam )
+{
+ switch(msg)
+ {
+ case WM_GETTEXT:
+ case WM_SETTEXT:
+ WINPROC_UnmapMsg32ATo32W( msg, wParam, lParam );
+ break;
+ case WM_NCCREATE:
+ case WM_CREATE:
+ {
+ CREATESTRUCT32W *cs = (CREATESTRUCT32W *)lParam;
+ lParam = *(LPARAM *)(cs + 1);
+ STRUCT32_CREATESTRUCT32Ato16( (CREATESTRUCT32A *)cs,
+ (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam) );
+ if (HIWORD(cs->lpszName)) free( (LPVOID)cs->lpszName );
+ if (HIWORD(cs->lpszClass)) free( (LPVOID)cs->lpszClass );
+ HeapFree( SystemHeap, 0, cs );
+ }
+ break;
+ default:
+ WINPROC_UnmapMsg16To32A( msg, wParam, lParam );
+ break;
+ }
+}
+
+
+/**********************************************************************
+ * WINPROC_MapMsg32ATo16
+ *
+ * Map a message from 32-bit Ansi to 16-bit.
+ * Return value is -1 on error, 0 if OK, 1 if an UnmapMsg call is needed.
+ */
+INT32 WINPROC_MapMsg32ATo16( UINT32 msg32, WPARAM32 wParam32, UINT16 *pmsg16,
+ WPARAM16 *pwparam16, LPARAM *plparam )
+{
+ *pmsg16 = (UINT16)msg32;
+ *pwparam16 = (WPARAM16)LOWORD(wParam32);
+ switch(msg32)
+ {
+ case WM_ACTIVATE:
+ case WM_CHARTOITEM:
+ case WM_COMMAND:
+ case WM_HSCROLL:
+ case WM_VKEYTOITEM:
+ case WM_VSCROLL:
+ *plparam = MAKELPARAM( (HWND16)*plparam, HIWORD(wParam32) );
+ return 0;
+ case WM_CTLCOLORMSGBOX:
+ case WM_CTLCOLOREDIT:
+ case WM_CTLCOLORLISTBOX:
+ case WM_CTLCOLORBTN:
+ case WM_CTLCOLORDLG:
+ case WM_CTLCOLORSCROLLBAR:
+ case WM_CTLCOLORSTATIC:
+ *pmsg16 = WM_CTLCOLOR;
+ *plparam = MAKELPARAM( (HWND16)*plparam,
+ (WORD)msg32 - WM_CTLCOLORMSGBOX );
+ return 0;
+ case WM_DRAWITEM:
+ {
+ DRAWITEMSTRUCT32 *dis32 = (DRAWITEMSTRUCT32 *)*plparam;
+ DRAWITEMSTRUCT16 *dis = SEGPTR_NEW(DRAWITEMSTRUCT16);
+ if (!dis) return -1;
+ dis->CtlType = (UINT16)dis32->CtlType;
+ dis->CtlID = (UINT16)dis32->CtlID;
+ dis->itemID = (UINT16)dis32->itemID;
+ dis->itemAction = (UINT16)dis32->itemAction;
+ dis->itemState = (UINT16)dis32->itemState;
+ dis->hwndItem = (HWND16)dis32->hwndItem;
+ dis->hDC = (HDC16)dis32->hDC;
+ dis->itemData = dis32->itemData;
+ CONV_RECT32TO16( &dis32->rcItem, &dis->rcItem );
+ *plparam = (LPARAM)SEGPTR_GET(dis);
+ }
+ return 1;
+ case WM_GETMINMAXINFO:
+ {
+ MINMAXINFO16 *mmi = (MINMAXINFO16 *)SEGPTR_ALLOC( sizeof(*mmi) +
+ sizeof(LPARAM) );
+ if (!mmi) return -1;
+ STRUCT32_MINMAXINFO32to16( (MINMAXINFO32 *)*plparam, mmi );
+ *(LPARAM *)(mmi + 1) = *plparam; /* Store the previous lParam */
+ *plparam = (LPARAM)SEGPTR_GET(mmi);
+ }
+ return 1;
+ case WM_GETTEXT:
+ {
+ LPSTR str;
+ *pwparam16 = (WPARAM16)MIN( wParam32, 0xff80 ); /* Must be < 64K */
+ if (!(str = SEGPTR_ALLOC(*pwparam16 + sizeof(LPARAM)))) return -1;
+ *((LPARAM *)str)++ = *plparam; /* Store the previous lParam */
+ *plparam = (LPARAM)SEGPTR_GET(str);
+ }
+ return 1;
+ case WM_MDISETMENU:
+ *pwparam16 = TRUE; /* FIXME? */
+ *plparam = MAKELPARAM( (HMENU16)LOWORD(wParam32),
+ (HMENU16)LOWORD(*plparam) );
+ return 0;
+ case WM_MENUCHAR:
+ case WM_MENUSELECT:
+ *plparam = MAKELPARAM( HIWORD(wParam32), (HMENU16)*plparam );
+ return 0;
+ case WM_NCCALCSIZE:
+ {
+ NCCALCSIZE_PARAMS32 *nc32 = (NCCALCSIZE_PARAMS32 *)*plparam;
+ NCCALCSIZE_PARAMS16 *nc = (NCCALCSIZE_PARAMS16 *)SEGPTR_ALLOC( sizeof(*nc) + sizeof(LPARAM) );
+ if (!nc) return -1;
+
+ CONV_RECT32TO16( &nc32->rgrc[0], &nc->rgrc[0] );
+ if (wParam32)
+ {
+ WINDOWPOS16 *wp;
+ CONV_RECT32TO16( &nc32->rgrc[1], &nc->rgrc[1] );
+ CONV_RECT32TO16( &nc32->rgrc[2], &nc->rgrc[2] );
+ if (!(wp = SEGPTR_NEW(WINDOWPOS16)))
+ {
+ SEGPTR_FREE(nc);
+ return -1;
+ }
+ STRUCT32_WINDOWPOS32to16( nc32->lppos, wp );
+ nc->lppos = SEGPTR_GET(wp);
+ }
+ *(LPARAM *)(nc + 1) = *plparam; /* Store the previous lParam */
+ *plparam = (LPARAM)SEGPTR_GET(nc);
+ }
+ return 1;
+ case WM_NCCREATE:
+ case WM_CREATE:
+ {
+ CREATESTRUCT16 *cs;
+ CREATESTRUCT32A *cs32 = (CREATESTRUCT32A *)*plparam;
+ LPSTR name, cls;
+
+ if (!(cs = SEGPTR_NEW(CREATESTRUCT16))) return -1;
+ STRUCT32_CREATESTRUCT32Ato16( cs32, cs );
+ name = SEGPTR_STRDUP( cs32->lpszName );
+ cls = SEGPTR_STRDUP( cs32->lpszClass );
+ cs->lpszName = SEGPTR_GET(name);
+ cs->lpszClass = SEGPTR_GET(cls);
+ *plparam = (LPARAM)SEGPTR_GET(cs);
+ }
+ return 1;
+ case WM_PARENTNOTIFY:
+ if ((LOWORD(wParam32)==WM_CREATE) || (LOWORD(wParam32)==WM_DESTROY))
+ *plparam = MAKELPARAM( (HWND16)*plparam, HIWORD(wParam32));
+ /* else nothing to do */
+ return 0;
+ case WM_SETTEXT:
+ {
+ LPSTR str = SEGPTR_STRDUP( (LPSTR)*plparam );
+ if (!str) return -1;
+ *plparam = (LPARAM)SEGPTR_GET(str);
+ }
+ return 1;
+ case WM_WINDOWPOSCHANGING:
+ case WM_WINDOWPOSCHANGED:
+ {
+ WINDOWPOS16 *wp = (WINDOWPOS16 *)SEGPTR_ALLOC( sizeof(*wp) +
+ sizeof(LPARAM) );
+ if (!wp) return -1;
+ STRUCT32_WINDOWPOS32to16( (WINDOWPOS32 *)*plparam, wp );
+ *(LPARAM *)(wp + 1) = *plparam; /* Store the previous lParam */
+ *plparam = (LPARAM)SEGPTR_GET(wp);
+ }
+ return 1;
+ case WM_ASKCBFORMATNAME:
+ case WM_COMPAREITEM:
+ case WM_DELETEITEM:
+ case WM_DEVMODECHANGE:
+ case WM_MDIACTIVATE:
+ case WM_MDICREATE:
+ case WM_MEASUREITEM:
+ case WM_PAINTCLIPBOARD:
+ case WM_SIZECLIPBOARD:
+ case WM_WININICHANGE:
+ fprintf( stderr, "MapMsg32ATo16: message %04x needs translation\n",
+ msg32 );
+ return -1;
+
+ default: /* No translation needed */
+ return 0;
+ }
+}
+
+
+/**********************************************************************
+ * WINPROC_UnmapMsg32ATo16
+ *
+ * Unmap a message that was mapped from 32-bit Ansi to 16-bit.
+ */
+void WINPROC_UnmapMsg32ATo16( UINT16 msg, WPARAM16 wParam, LPARAM lParam )
+{
+ switch(msg)
+ {
+ case WM_DRAWITEM:
+ SEGPTR_FREE( PTR_SEG_TO_LIN(lParam) );
+ break;
+ case WM_GETMINMAXINFO:
+ {
+ MINMAXINFO16 *mmi = (MINMAXINFO16 *)PTR_SEG_TO_LIN(lParam);
+ lParam = *(LPARAM *)(mmi + 1);
+ STRUCT32_MINMAXINFO16to32( mmi, (MINMAXINFO32 *)lParam );
+ SEGPTR_FREE(mmi);
+ }
+ break;
+ case WM_GETTEXT:
+ {
+ LPSTR str = (LPSTR)PTR_SEG_TO_LIN(lParam);
+ lParam = *((LPARAM *)str - 1);
+ strcpy( (LPSTR)lParam, str );
+ SEGPTR_FREE( (LPARAM *)str - 1 );
+ }
+ break;
+ case WM_NCCALCSIZE:
+ {
+ NCCALCSIZE_PARAMS32 *nc32;
+ NCCALCSIZE_PARAMS16 *nc = (NCCALCSIZE_PARAMS16 *)PTR_SEG_TO_LIN(lParam);
+ lParam = *(LPARAM *)(nc + 1);
+ nc32 = (NCCALCSIZE_PARAMS32 *)lParam;
+ CONV_RECT16TO32( &nc->rgrc[0], &nc32->rgrc[0] );
+ if (wParam)
+ {
+ CONV_RECT16TO32( &nc->rgrc[1], &nc32->rgrc[1] );
+ CONV_RECT16TO32( &nc->rgrc[2], &nc32->rgrc[2] );
+ STRUCT32_WINDOWPOS16to32( (WINDOWPOS16 *)PTR_SEG_TO_LIN(nc->lppos),
+ nc32->lppos );
+ SEGPTR_FREE( PTR_SEG_TO_LIN(nc->lppos) );
+ }
+ SEGPTR_FREE(nc);
+ }
+ break;
+ case WM_NCCREATE:
+ case WM_CREATE:
+ {
+ CREATESTRUCT16 *cs = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
+ SEGPTR_FREE( PTR_SEG_TO_LIN(cs->lpszName) );
+ SEGPTR_FREE( PTR_SEG_TO_LIN(cs->lpszClass) );
+ SEGPTR_FREE( cs );
+ }
+ break;
+ case WM_SETTEXT:
+ SEGPTR_FREE( PTR_SEG_TO_LIN(lParam) );
+ break;
+ case WM_WINDOWPOSCHANGING:
+ case WM_WINDOWPOSCHANGED:
+ {
+ WINDOWPOS16 *wp = (WINDOWPOS16 *)PTR_SEG_TO_LIN(lParam);
+ lParam = *(LPARAM *)(wp + 1);
+ STRUCT32_WINDOWPOS16to32( wp, (WINDOWPOS32 *)lParam );
+ SEGPTR_FREE(wp);
+ }
+ break;
+ }
+}
+
+
+/**********************************************************************
+ * WINPROC_MapMsg32WTo16
+ *
+ * Map a message from 32-bit Unicode to 16-bit.
+ * Return value is -1 on error, 0 if OK, 1 if an UnmapMsg call is needed.
+ */
+INT32 WINPROC_MapMsg32WTo16( UINT32 msg32, WPARAM32 wParam32, UINT16 *pmsg16,
+ WPARAM16 *pwparam16, LPARAM *plparam )
+{
+ switch(msg32)
+ {
+ case WM_NCCREATE:
+ case WM_CREATE:
+ {
+ CREATESTRUCT16 *cs;
+ CREATESTRUCT32W *cs32 = (CREATESTRUCT32W *)*plparam;
+
+ if (!(cs = SEGPTR_NEW(CREATESTRUCT16))) return -1;
+ STRUCT32_CREATESTRUCT32Ato16( (CREATESTRUCT32A *)cs32, cs );
+ if (HIWORD(cs32->lpszName))
+ {
+ LPSTR name = SEGPTR_ALLOC( lstrlen32W(cs32->lpszName) + 1 );
+ STRING32_UniToAnsi( name, cs32->lpszName );
+ cs->lpszName = SEGPTR_GET(name);
+ }
+ else cs->lpszName = (SEGPTR)cs32->lpszName;
+ if (HIWORD(cs32->lpszClass))
+ {
+ LPSTR name = SEGPTR_ALLOC( lstrlen32W(cs32->lpszClass) + 1 );
+ STRING32_UniToAnsi( name, cs32->lpszClass );
+ cs->lpszClass = SEGPTR_GET(name);
+ }
+ else cs->lpszClass = (SEGPTR)cs32->lpszClass;
+ *pmsg16 = (UINT16)msg32;
+ *pwparam16 = (WPARAM16)LOWORD(wParam32);
+ *plparam = (LPARAM)SEGPTR_GET(cs);
+ }
+ return 1;
+ case WM_SETTEXT:
+ {
+ LPSTR str = SEGPTR_ALLOC( lstrlen32W((LPWSTR)*plparam) + 1 );
+ if (!str) return -1;
+ STRING32_UniToAnsi( str, (LPWSTR)*plparam );
+ *pmsg16 = (UINT16)msg32;
+ *pwparam16 = (WPARAM16)LOWORD(wParam32);
+ *plparam = (LPARAM)SEGPTR_GET(str);
+ }
+ return 1;
+ default: /* No Unicode translation needed */
+ return WINPROC_MapMsg32ATo16( msg32, wParam32, pmsg16,
+ pwparam16, plparam );
+ }
+}
+
+
+/**********************************************************************
+ * WINPROC_UnmapMsg32WTo16
+ *
+ * Unmap a message that was mapped from 32-bit Unicode to 16-bit.
+ */
+void WINPROC_UnmapMsg32WTo16( UINT16 msg, WPARAM16 wParam, LPARAM lParam )
+{
+ switch(msg)
+ {
+ case WM_GETTEXT:
+ {
+ LPSTR str = (LPSTR)PTR_SEG_TO_LIN(lParam);
+ lParam = *((LPARAM *)str - 1);
+ STRING32_AnsiToUni( (LPWSTR)lParam, str );
+ SEGPTR_FREE( (LPARAM *)str - 1 );
+ }
+ break;
+ default:
+ WINPROC_UnmapMsg32ATo16( msg, wParam, lParam );
+ break;
+ }
}
@@ -184,42 +1085,10 @@
{
LRESULT result;
- switch(msg)
- {
- case WM_GETTEXT:
- {
- LPWSTR str = (LPWSTR)HeapAlloc(SystemHeap,0,wParam*sizeof(WCHAR));
- if (!str) return 0;
- result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)str );
- STRING32_UniToAnsi( (LPSTR)lParam, str );
- HeapFree( SystemHeap, 0, str );
- }
- return result; /* FIXME? */
-
- case WM_SETTEXT:
- {
- LPWSTR str = STRING32_DupAnsiToUni( (LPCSTR)lParam );
- if (!str) return 0;
- result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)str );
- free( str );
- }
- return result;
-
- case WM_NCCREATE:
- case WM_CREATE:
- {
- CREATESTRUCT32W cs = *(CREATESTRUCT32W *)lParam;
- cs.lpszName = STRING32_DupAnsiToUni( (LPCSTR)cs.lpszName );
- cs.lpszClass = STRING32_DupAnsiToUni( (LPCSTR)cs.lpszName );
- result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)&cs );
- free( (LPVOID)cs.lpszName );
- free( (LPVOID)cs.lpszClass );
- }
- return result;
-
- default: /* No translation needed */
- return CallWndProc32( func, hwnd, msg, wParam, lParam );
- }
+ if (WINPROC_MapMsg32ATo32W( msg, wParam, &lParam ) == -1) return 0;
+ result = CallWndProc32( func, hwnd, msg, wParam, lParam );
+ WINPROC_UnmapMsg32ATo32W( msg, wParam, lParam );
+ return result;
}
@@ -234,44 +1103,10 @@
{
LRESULT result;
- switch(msg)
- {
- case WM_GETTEXT:
- {
- LPSTR str = (LPSTR)HeapAlloc( SystemHeap, 0, wParam );
- if (!str) return 0;
- result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)str );
- STRING32_AnsiToUni( (LPWSTR)lParam, str );
- HeapFree( SystemHeap, 0, str );
- }
- return result; /* FIXME? */
-
- case WM_SETTEXT:
- {
- LPSTR str = STRING32_DupUniToAnsi( (LPCWSTR)lParam );
- if (!str) return 0;
- result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)str );
- free( str );
- }
- return result;
-
- case WM_NCCREATE:
- case WM_CREATE:
- {
- CREATESTRUCT32A cs = *(CREATESTRUCT32A *)lParam;
- if (HIWORD(cs.lpszName))
- cs.lpszName = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
- if (HIWORD(cs.lpszClass))
- cs.lpszClass = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
- result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)&cs );
- if (HIWORD(cs.lpszName)) free( (LPVOID)cs.lpszName );
- if (HIWORD(cs.lpszClass)) free( (LPVOID)cs.lpszClass );
- }
- return result;
-
- default: /* No translation needed */
- return CallWndProc32( func, hwnd, msg, wParam, lParam );
- }
+ if (WINPROC_MapMsg32WTo32A( msg, wParam, &lParam ) == -1) return 0;
+ result = CallWndProc32( func, hwnd, msg, wParam, lParam );
+ WINPROC_UnmapMsg32WTo32A( msg, wParam, lParam );
+ return result;
}
@@ -280,161 +1115,19 @@
*
* Call a 32-bit window procedure, translating the 16-bit args.
*/
-static LRESULT WINPROC_CallProc16To32A(WNDPROC32 func, HWND16 hwnd, UINT16 msg,
- WPARAM16 wParam, LPARAM lParam )
+LRESULT WINPROC_CallProc16To32A( HWND16 hwnd, UINT16 msg,
+ WPARAM16 wParam, LPARAM lParam,
+ WNDPROC32 func )
{
LRESULT result;
+ UINT32 msg32;
+ WPARAM32 wParam32;
- switch(msg)
- {
- case WM_ACTIVATE:
- case WM_CHARTOITEM:
- case WM_COMMAND:
- case WM_HSCROLL:
- case WM_VKEYTOITEM:
- case WM_VSCROLL:
- return CallWndProc32( func, hwnd, msg,
- MAKEWPARAM( wParam, HIWORD(lParam) ),
- (LPARAM)(HWND32)LOWORD(lParam) );
- case WM_CTLCOLOR:
- return CallWndProc32( func, hwnd, WM_CTLCOLORMSGBOX + HIWORD(lParam),
- (WPARAM32)(HDC32)wParam,
- (LPARAM)(HWND32)LOWORD(lParam) );
- case WM_DRAWITEM:
- {
- DRAWITEMSTRUCT16*dis16 = (DRAWITEMSTRUCT16*)PTR_SEG_TO_LIN(lParam);
- DRAWITEMSTRUCT32 dis;
- dis.CtlType = dis16->CtlType;
- dis.CtlID = dis16->CtlID;
- dis.itemID = dis16->itemID;
- dis.itemAction = dis16->itemAction;
- dis.itemState = dis16->itemState;
- dis.hwndItem = dis16->hwndItem;
- dis.hDC = dis16->hDC;
- dis.itemData = dis16->itemData;
- CONV_RECT16TO32( &dis16->rcItem, &dis.rcItem );
- result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)&dis );
- /* We don't bother to translate it back */
- }
- return result;
-
- case WM_GETMINMAXINFO:
- {
- MINMAXINFO32 mmi;
- STRUCT32_MINMAXINFO16to32( (MINMAXINFO16 *)PTR_SEG_TO_LIN(lParam),
- &mmi );
- result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)&mmi);
- STRUCT32_MINMAXINFO32to16( &mmi,
- (MINMAXINFO16 *)PTR_SEG_TO_LIN(lParam));
- }
- return result;
-
- case WM_GETTEXT:
- return CallWndProc32( func, hwnd, msg, wParam,
- (LPARAM)PTR_SEG_TO_LIN(lParam) );
- case WM_MDISETMENU:
- return CallWndProc32( func, hwnd, msg,
- (WPARAM32)(HMENU32)LOWORD(lParam),
- (LPARAM)(HMENU32)HIWORD(lParam) );
- case WM_MENUCHAR:
- case WM_MENUSELECT:
- return CallWndProc32( func, hwnd, msg,
- MAKEWPARAM( wParam, LOWORD(lParam) ),
- (LPARAM)(HMENU32)HIWORD(lParam) );
- case WM_NCCALCSIZE:
- {
- NCCALCSIZE_PARAMS16 *pnc16;
- NCCALCSIZE_PARAMS32 nc;
- WINDOWPOS32 wp;
-
- pnc16 = (NCCALCSIZE_PARAMS16 *)PTR_SEG_TO_LIN(lParam);
- CONV_RECT16TO32( &pnc16->rgrc[0], &nc.rgrc[0] );
- if (wParam)
- {
- CONV_RECT16TO32( &pnc16->rgrc[1], &nc.rgrc[1] );
- CONV_RECT16TO32( &pnc16->rgrc[2], &nc.rgrc[2] );
- STRUCT32_WINDOWPOS16to32( (WINDOWPOS16 *)PTR_SEG_TO_LIN(pnc16->lppos),
- &wp );
- nc.lppos = ℘
- }
-
- result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)&nc );
-
- pnc16 = (NCCALCSIZE_PARAMS16 *)PTR_SEG_TO_LIN(lParam);
- CONV_RECT32TO16( &nc.rgrc[0], &pnc16->rgrc[0] );
- if (wParam)
- {
- CONV_RECT32TO16( &nc.rgrc[1], &pnc16->rgrc[1] );
- CONV_RECT32TO16( &nc.rgrc[2], &pnc16->rgrc[2] );
- STRUCT32_WINDOWPOS32to16( nc.lppos,
- (WINDOWPOS16 *)PTR_SEG_TO_LIN(pnc16->lppos));
- }
- }
- return result;
-
- case WM_NCCREATE:
- case WM_CREATE:
- {
- CREATESTRUCT16 *pcs16 = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
- CREATESTRUCT32A cs;
-
- STRUCT32_CREATESTRUCT16to32A( pcs16, &cs );
- /* FIXME: Unicode */
- cs.lpszName = (LPCSTR)PTR_SEG_TO_LIN(pcs16->lpszName);
- cs.lpszClass = (LPCSTR)PTR_SEG_TO_LIN(pcs16->lpszClass);
- result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)&cs );
- pcs16 = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
- STRUCT32_CREATESTRUCT32Ato16( &cs, pcs16 );
-
- if (cs.lpszName != (LPCSTR)PTR_SEG_TO_LIN(pcs16->lpszName))
- fprintf( stderr, "CallWindowProc16: WM_NCCREATE(%04x) changed lpszName (%p->%p), please report.\n",
- msg, (LPCSTR)PTR_SEG_TO_LIN(pcs16->lpszName), cs.lpszName);
- if (cs.lpszClass != (LPCSTR)PTR_SEG_TO_LIN(pcs16->lpszClass))
- fprintf( stderr, "CallWindowProc16: WM_NCCREATE(%04x) changed lpszClass (%p->%p), please report.\n",
- msg, (LPCSTR)PTR_SEG_TO_LIN(pcs16->lpszClass), cs.lpszClass);
- }
- return result;
-
- case WM_PARENTNOTIFY:
- if ((wParam == WM_CREATE) || (wParam == WM_DESTROY))
- return CallWndProc32( func, hwnd, msg,
- MAKEWPARAM( wParam, HIWORD(lParam) ),
- (LPARAM)(HWND32)LOWORD(lParam) );
- else return CallWndProc32( func, hwnd, msg,
- MAKEWPARAM( wParam, 0 /* FIXME? */ ),
- lParam );
- case WM_SETTEXT:
- /* FIXME: Unicode */
- return CallWndProc32( func, hwnd, msg, wParam,
- (LPARAM)PTR_SEG_TO_LIN(lParam) );
-
- case WM_WINDOWPOSCHANGING:
- case WM_WINDOWPOSCHANGED:
- {
- WINDOWPOS32 wp;
- STRUCT32_WINDOWPOS16to32( (WINDOWPOS16 *)PTR_SEG_TO_LIN(lParam),
- &wp );
- result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)&wp );
- STRUCT32_WINDOWPOS32to16( &wp,
- (WINDOWPOS16 *)PTR_SEG_TO_LIN(lParam) );
- }
- return result;
-
- case WM_ASKCBFORMATNAME:
- case WM_COMPAREITEM:
- case WM_DELETEITEM:
- case WM_DEVMODECHANGE:
- case WM_MDIACTIVATE:
- case WM_MDICREATE:
- case WM_MEASUREITEM:
- case WM_PAINTCLIPBOARD:
- case WM_SIZECLIPBOARD:
- case WM_WININICHANGE:
- fprintf( stderr, "CallWindowProc16To32: message %04x needs translation\n", msg );
-
- default: /* No translation needed */
- return CallWndProc32( func, hwnd, msg, (WPARAM32)wParam, lParam );
- }
+ if (WINPROC_MapMsg16To32A( msg, wParam, &msg32, &wParam32, &lParam ) == -1)
+ return 0;
+ result = CallWndProc32( func, hwnd, msg32, wParam32, lParam );
+ WINPROC_UnmapMsg16To32A( msg32, wParam32, lParam );
+ return result;
}
@@ -443,37 +1136,19 @@
*
* Call a 32-bit window procedure, translating the 16-bit args.
*/
-static LRESULT WINPROC_CallProc16To32W(WNDPROC32 func, HWND16 hwnd, UINT16 msg,
- WPARAM16 wParam, LPARAM lParam )
+LRESULT WINPROC_CallProc16To32W( HWND16 hwnd, UINT16 msg,
+ WPARAM16 wParam, LPARAM lParam,
+ WNDPROC32 func )
{
- LRESULT result = 0;
+ LRESULT result;
+ UINT32 msg32;
+ WPARAM32 wParam32;
- switch(msg)
- {
- case WM_GETTEXT:
- case WM_SETTEXT:
- return WINPROC_CallProc32ATo32W( func, hwnd, msg, wParam,
- (LPARAM)PTR_SEG_TO_LIN(lParam) );
-
- case WM_NCCREATE:
- case WM_CREATE:
- {
- CREATESTRUCT16 *pcs16 = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
- CREATESTRUCT32A cs;
-
- STRUCT32_CREATESTRUCT16to32A( pcs16, &cs );
- cs.lpszName = (LPCSTR)PTR_SEG_TO_LIN(pcs16->lpszName);
- cs.lpszClass = (LPCSTR)PTR_SEG_TO_LIN(pcs16->lpszClass);
- result = WINPROC_CallProc32ATo32W( func, hwnd, msg, wParam,
- (LPARAM)&cs );
- pcs16 = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
- STRUCT32_CREATESTRUCT32Ato16( &cs, pcs16 );
- }
- return result;
-
- default: /* No Unicode translation needed */
- return WINPROC_CallProc16To32A( func, hwnd, msg, wParam, lParam );
- }
+ if (WINPROC_MapMsg16To32W( msg, wParam, &msg32, &wParam32, &lParam ) == -1)
+ return 0;
+ result = CallWndProc32( func, hwnd, msg32, wParam32, lParam );
+ WINPROC_UnmapMsg16To32W( msg32, wParam32, lParam );
+ return result;
}
@@ -482,201 +1157,37 @@
*
* Call a 16-bit window procedure, translating the 32-bit args.
*/
-static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, WORD ds, HWND32 hwnd,
+static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, HWND32 hwnd,
UINT32 msg, WPARAM32 wParam,
LPARAM lParam )
{
LRESULT result;
+ UINT16 msg16;
+ WPARAM16 wParam16;
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
+ WORD ds = wndPtr ? wndPtr->hInstance : CURRENT_DS;
- switch(msg)
+ if (WINPROC_MapMsg32ATo16( msg, wParam, &msg16, &wParam16, &lParam ) == -1)
+ return 0;
+#ifndef WINELIB
+ if ((msg16 == WM_CREATE) || (msg16 == WM_NCCREATE))
{
- case WM_ACTIVATE:
- case WM_CHARTOITEM:
- case WM_COMMAND:
- case WM_HSCROLL:
- case WM_VKEYTOITEM:
- case WM_VSCROLL:
- return CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
- MAKELPARAM( (HWND16)lParam, HIWORD(wParam) ) );
-
- case WM_CTLCOLORMSGBOX:
- case WM_CTLCOLOREDIT:
- case WM_CTLCOLORLISTBOX:
- case WM_CTLCOLORBTN:
- case WM_CTLCOLORDLG:
- case WM_CTLCOLORSCROLLBAR:
- case WM_CTLCOLORSTATIC:
- return CallWndProc16( func, ds, hwnd, WM_CTLCOLOR, (WPARAM16)wParam,
- MAKELPARAM( (HWND16)lParam,
- (WORD)msg - WM_CTLCOLORMSGBOX ) );
- case WM_DRAWITEM:
- {
- DRAWITEMSTRUCT32 *dis32 = (DRAWITEMSTRUCT32 *)lParam;
- DRAWITEMSTRUCT16 *dis = SEGPTR_NEW(DRAWITEMSTRUCT16);
- if (!dis) return 0;
- dis->CtlType = (UINT16)dis32->CtlType;
- dis->CtlID = (UINT16)dis32->CtlID;
- dis->itemID = (UINT16)dis32->itemID;
- dis->itemAction = (UINT16)dis32->itemAction;
- dis->itemState = (UINT16)dis32->itemState;
- dis->hwndItem = (HWND16)dis32->hwndItem;
- dis->hDC = (HDC16)dis32->hDC;
- dis->itemData = dis32->itemData;
- CONV_RECT32TO16( &dis32->rcItem, &dis->rcItem );
- result = CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
- (LPARAM)SEGPTR_GET(dis) );
- /* We don't bother to translate it back */
- SEGPTR_FREE(dis);
- }
- return result;
-
- case WM_GETMINMAXINFO:
- {
- MINMAXINFO16 *mmi = SEGPTR_NEW(MINMAXINFO16);
- if (!mmi) return 0;
- STRUCT32_MINMAXINFO32to16( (MINMAXINFO32 *)lParam, mmi );
- result = CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
- (LPARAM)SEGPTR_GET(mmi) );
- STRUCT32_MINMAXINFO16to32( mmi, (MINMAXINFO32 *)lParam );
- SEGPTR_FREE(mmi);
- }
- return result;
-
- case WM_GETTEXT:
- {
- LPSTR str;
- wParam = MIN( wParam, 0xff80 ); /* Size must be < 64K */
- if (!(str = SEGPTR_ALLOC( wParam ))) return 0;
- result = CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
- (LPARAM)SEGPTR_GET(str) );
- if (result > 0) memcpy( (LPSTR)lParam, str, result );
- SEGPTR_FREE(str);
- }
- return result;
-
- case WM_MDISETMENU:
- return CallWndProc16( func, ds, hwnd, msg, TRUE /* FIXME? */,
- MAKELPARAM( (HMENU16)LOWORD(lParam),
- (HMENU16)HIWORD(lParam) ) );
- case WM_MENUCHAR:
- case WM_MENUSELECT:
- return CallWndProc16( func, ds, hwnd, msg, (WPARAM16)LOWORD(wParam),
- MAKELPARAM( HIWORD(wParam), (HMENU16)lParam ) );
- case WM_NCCALCSIZE:
- {
- NCCALCSIZE_PARAMS32 *nc32 = (NCCALCSIZE_PARAMS32 *)lParam;
- NCCALCSIZE_PARAMS16 *nc;
- WINDOWPOS16 *wp = NULL;
-
- if (!(nc = SEGPTR_NEW(NCCALCSIZE_PARAMS16))) return 0;
- CONV_RECT32TO16( &nc32->rgrc[0], &nc->rgrc[0] );
- if (wParam)
- {
- CONV_RECT32TO16( &nc32->rgrc[1], &nc->rgrc[1] );
- CONV_RECT32TO16( &nc32->rgrc[2], &nc->rgrc[2] );
- if (!(wp = SEGPTR_NEW(WINDOWPOS16)))
- {
- SEGPTR_FREE(nc);
- return 0;
- }
- STRUCT32_WINDOWPOS32to16( nc32->lppos, wp );
- nc->lppos = SEGPTR_GET(wp);
- }
- result = CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
- (LPARAM)SEGPTR_GET(nc) );
- CONV_RECT16TO32( &nc->rgrc[0], &nc32->rgrc[0] );
- if (wParam)
- {
- CONV_RECT16TO32( &nc->rgrc[1], &nc32->rgrc[1] );
- CONV_RECT16TO32( &nc->rgrc[2], &nc32->rgrc[2] );
- STRUCT32_WINDOWPOS16to32( (WINDOWPOS16 *)PTR_SEG_TO_LIN(nc->lppos),
- nc32->lppos );
- SEGPTR_FREE(wp);
- }
- SEGPTR_FREE(nc);
- }
- return result;
-
- case WM_NCCREATE:
- case WM_CREATE:
- {
- CREATESTRUCT16 *cs;
- CREATESTRUCT32A *cs32 = (CREATESTRUCT32A *)lParam;
- LPSTR name, cls;
-
- if (!(cs = SEGPTR_NEW(CREATESTRUCT16))) return 0;
- STRUCT32_CREATESTRUCT32Ato16( cs32, cs );
- name = SEGPTR_STRDUP( cs32->lpszName );
- cls = SEGPTR_STRDUP( cs32->lpszClass );
- cs->lpszName = SEGPTR_GET(name);
- cs->lpszClass = SEGPTR_GET(cls);
-#ifdef WINELIB
- result = CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
- (LPARAM)SEGPTR_GET(cs) );
-#else
- /* Build the CREATESTRUCT on the 16-bit stack. */
- /* This is really ugly, but some programs (notably the */
- /* "Undocumented Windows" examples) want it that way. */
- result = CallWndProcNCCREATE16( func, ds, cs->dwExStyle,
+ CREATESTRUCT16 *cs = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
+ /* Build the CREATESTRUCT on the 16-bit stack. */
+ /* This is really ugly, but some programs (notably the */
+ /* "Undocumented Windows" examples) want it that way. */
+ result = CallWndProcNCCREATE16( func, ds, cs->dwExStyle,
cs->lpszClass, cs->lpszName, cs->style, cs->x, cs->y,
cs->cx, cs->cy, cs->hwndParent, cs->hMenu, cs->hInstance,
- (LONG)cs->lpCreateParams, hwnd, msg, (WPARAM16)wParam,
+ (LONG)cs->lpCreateParams, hwnd, msg16, wParam16,
MAKELONG( IF1632_Saved16_sp-sizeof(CREATESTRUCT16),
IF1632_Saved16_ss ) );
-#endif /* WINELIB */
- /* We don't bother to translate the structure back */
- SEGPTR_FREE(name);
- SEGPTR_FREE(cls);
- SEGPTR_FREE(cs);
- }
- return result;
-
- case WM_PARENTNOTIFY:
- if ((wParam == WM_CREATE) || (wParam == WM_DESTROY))
- return CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
- MAKELPARAM( (HWND16)lParam, LOWORD(wParam)));
- else
- return CallWndProc16( func, ds, hwnd, msg,
- (WPARAM16)wParam, lParam );
-
- case WM_SETTEXT:
- {
- LPSTR str = SEGPTR_STRDUP( (LPSTR)lParam );
- if (!str) return 0;
- result = CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
- (LPARAM)SEGPTR_GET(str) );
- SEGPTR_FREE(str);
- }
- return result;
-
- case WM_WINDOWPOSCHANGING:
- case WM_WINDOWPOSCHANGED:
- {
- WINDOWPOS16 *wp;
- if (!(wp = SEGPTR_NEW(WINDOWPOS16))) return 0;
- STRUCT32_WINDOWPOS32to16( (WINDOWPOS32 *)lParam, wp );
- result = CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
- (LPARAM)SEGPTR_GET(wp) );
- STRUCT32_WINDOWPOS16to32( wp, (WINDOWPOS32 *)lParam );
- SEGPTR_FREE(wp);
- }
- return result;
-
- case WM_ASKCBFORMATNAME:
- case WM_COMPAREITEM:
- case WM_DELETEITEM:
- case WM_DEVMODECHANGE:
- case WM_MDIACTIVATE:
- case WM_MDICREATE:
- case WM_MEASUREITEM:
- case WM_PAINTCLIPBOARD:
- case WM_SIZECLIPBOARD:
- case WM_WININICHANGE:
- fprintf( stderr, "CallWindowProc32To16: message %04x needs translation\n", msg );
-
- default: /* No translation needed */
- return CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam, lParam );
}
+ else
+#endif /* WINELIB */
+ result = CallWndProc16( func, ds, hwnd, msg16, wParam16, lParam );
+ WINPROC_UnmapMsg32ATo16( msg16, wParam16, lParam );
+ return result;
}
@@ -685,55 +1196,21 @@
*
* Call a 16-bit window procedure, translating the 32-bit args.
*/
-static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, WORD ds, HWND32 hwnd,
+static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, HWND32 hwnd,
UINT32 msg, WPARAM32 wParam,
LPARAM lParam )
{
LRESULT result;
+ UINT16 msg16;
+ WPARAM16 wParam16;
+ WND *wndPtr = WIN_FindWndPtr( hwnd );
- switch(msg)
- {
- case WM_GETTEXT:
- {
- LPSTR str;
- wParam = MIN( wParam, 0xff80 ); /* Size must be < 64K */
- if (!(str = SEGPTR_ALLOC( wParam ))) return 0;
- result = CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
- (LPARAM)SEGPTR_GET(str) );
- if (result > 0) STRING32_AnsiToUni( (LPWSTR)lParam, str );
- SEGPTR_FREE(str);
- }
- return result;
-
- case WM_NCCREATE:
- case WM_CREATE:
- {
- CREATESTRUCT32A cs = *(CREATESTRUCT32A *)lParam;
- if (HIWORD(cs.lpszName))
- cs.lpszName = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
- if (HIWORD(cs.lpszClass))
- cs.lpszClass = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
- result = WINPROC_CallProc32ATo16( func, ds, hwnd, msg, wParam,
- (LPARAM)&cs );
- if (HIWORD(cs.lpszName)) free( (LPVOID)cs.lpszName );
- if (HIWORD(cs.lpszClass)) free( (LPVOID)cs.lpszClass );
- }
- return result;
-
- case WM_SETTEXT:
- {
- LPSTR str = SEGPTR_ALLOC( lstrlen32W( (LPWSTR)lParam ) );
- if (!str) return 0;
- STRING32_UniToAnsi( str, (LPWSTR)lParam );
- result = CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
- (LPARAM)SEGPTR_GET(str) );
- SEGPTR_FREE(str);
- }
- return result;
-
- default: /* No Unicode translation needed */
- return WINPROC_CallProc32ATo16( func, ds, hwnd, msg, wParam, lParam );
- }
+ if (WINPROC_MapMsg32WTo16( msg, wParam, &msg16, &wParam16, &lParam ) == -1)
+ return 0;
+ result = CallWndProc16( func, wndPtr ? wndPtr->hInstance : CURRENT_DS,
+ hwnd, msg16, wParam16, lParam );
+ WINPROC_UnmapMsg32WTo16( msg16, wParam16, lParam );
+ return result;
}
@@ -744,29 +1221,38 @@
WPARAM16 wParam, LPARAM lParam )
{
WND *wndPtr;
- WINDOWPROC *proc = WINPROC_GetPtr( (HANDLE32)func );
+ WINDOWPROC *proc = WINPROC_GetPtr( func );
if (!proc)
{
wndPtr = WIN_FindWndPtr( hwnd );
- return CallWndProc16( (FARPROC)func,
+ return CallWndProc16( (FARPROC16)func,
wndPtr ? wndPtr->hInstance : CURRENT_DS,
hwnd, msg, wParam, lParam );
}
-
+#if testing
+ wndPtr = WIN_FindWndPtr( hwnd );
+ return CallWndProc16( WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_16),
+ wndPtr ? wndPtr->hInstance : CURRENT_DS,
+ hwnd, msg, wParam, lParam );
+#endif
+
switch(proc->type)
{
case WIN_PROC_16:
+ if (!proc->thunk.t_from32.proc) return 0;
wndPtr = WIN_FindWndPtr( hwnd );
- return CallWndProc16( (FARPROC)proc->func,
+ return CallWndProc16( proc->thunk.t_from32.proc,
wndPtr ? wndPtr->hInstance : CURRENT_DS,
hwnd, msg, wParam, lParam );
case WIN_PROC_32A:
- return WINPROC_CallProc16To32A( (WNDPROC32)proc->func,
- hwnd, msg, wParam, lParam );
+ if (!proc->thunk.t_from16.proc) return 0;
+ return WINPROC_CallProc16To32A( hwnd, msg, wParam, lParam,
+ proc->thunk.t_from16.proc );
case WIN_PROC_32W:
- return WINPROC_CallProc16To32W( (WNDPROC32)proc->func,
- hwnd, msg, wParam, lParam );
+ if (!proc->thunk.t_from16.proc) return 0;
+ return WINPROC_CallProc16To32W( hwnd, msg, wParam, lParam,
+ proc->thunk.t_from16.proc );
default:
fprintf( stderr, "CallWindowProc16: invalid proc %p\n", proc );
return 0;
@@ -780,23 +1266,28 @@
LRESULT CallWindowProc32A( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
WPARAM32 wParam, LPARAM lParam )
{
- WND *wndPtr;
- WINDOWPROC *proc = WINPROC_GetPtr( (HANDLE32)func );
+ WINDOWPROC *proc = WINPROC_GetPtr( (WNDPROC16)func );
if (!proc) return CallWndProc32( func, hwnd, msg, wParam, lParam );
+#if testing
+ func = WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_32A );
+ return CallWndProc32( func, hwnd, msg, wParam, lParam );
+#endif
+
switch(proc->type)
{
case WIN_PROC_16:
- wndPtr = WIN_FindWndPtr( hwnd );
- return WINPROC_CallProc32ATo16( (FARPROC)proc->func,
- wndPtr ? wndPtr->hInstance : CURRENT_DS,
- hwnd, msg, wParam, lParam );
+ if (!proc->thunk.t_from32.proc) return 0;
+ return WINPROC_CallProc32ATo16( proc->thunk.t_from32.proc,
+ hwnd, msg, wParam, lParam );
case WIN_PROC_32A:
- return CallWndProc32( (WNDPROC32)proc->func,
+ if (!proc->thunk.t_from16.proc) return 0;
+ return CallWndProc32( proc->thunk.t_from16.proc,
hwnd, msg, wParam, lParam );
case WIN_PROC_32W:
- return WINPROC_CallProc32ATo32W( (WNDPROC32)proc->func,
+ if (!proc->thunk.t_from16.proc) return 0;
+ return WINPROC_CallProc32ATo32W( proc->thunk.t_from16.proc,
hwnd, msg, wParam, lParam );
default:
fprintf( stderr, "CallWindowProc32A: invalid proc %p\n", proc );
@@ -811,23 +1302,28 @@
LRESULT CallWindowProc32W( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
WPARAM32 wParam, LPARAM lParam )
{
- WND *wndPtr;
- WINDOWPROC *proc = WINPROC_GetPtr( (HANDLE32)func );
+ WINDOWPROC *proc = WINPROC_GetPtr( (WNDPROC16)func );
if (!proc) return CallWndProc32( func, hwnd, msg, wParam, lParam );
+#if testing
+ func = WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_32W );
+ return CallWndProc32( func, hwnd, msg, wParam, lParam );
+#endif
+
switch(proc->type)
{
case WIN_PROC_16:
- wndPtr = WIN_FindWndPtr( hwnd );
- return WINPROC_CallProc32WTo16( (FARPROC)proc->func,
- wndPtr ? wndPtr->hInstance : CURRENT_DS,
- hwnd, msg, wParam, lParam );
+ if (!proc->thunk.t_from32.proc) return 0;
+ return WINPROC_CallProc32WTo16( proc->thunk.t_from32.proc,
+ hwnd, msg, wParam, lParam );
case WIN_PROC_32A:
- return WINPROC_CallProc32WTo32A( (WNDPROC32)proc->func,
+ if (!proc->thunk.t_from16.proc) return 0;
+ return WINPROC_CallProc32WTo32A( proc->thunk.t_from16.proc,
hwnd, msg, wParam, lParam );
case WIN_PROC_32W:
- return CallWndProc32( (WNDPROC32)proc->func,
+ if (!proc->thunk.t_from16.proc) return 0;
+ return CallWndProc32( proc->thunk.t_from16.proc,
hwnd, msg, wParam, lParam );
default:
fprintf( stderr, "CallWindowProc32W: invalid proc %p\n", proc );