Release 951124
Tue Nov 21 18:49:10 1995 Alexandre Julliard <julliard@sunsite.unc.edu>
* [configure.in] [Makefile] [misc/dos_fs.c]
Got rid of autoconf.h file.
* [debugger/dbg.y]
More logical behavior upon syntax errors.
* [include/hook.h] [windows/hook.c]
Changed hook structure and rewrote most of the hook functions for
better compatibility, based on investigations by Alex Korobka.
* [include/message.h] [windows/message.c]
Added hooks to message queue structure and made the structure
layout Windows-compatible.
Added support for WH_MOUSE, WH_KEYBOARD, WH_HARDWARE and
WH_JOURNALRECORD hooks.
* [misc/main.c]
Added command-line option for changing the language at run-time
(not implemented yet), based on a suggestion from Michael Patra.
* [objects/cursoricon.c]
Fixed silly SEGPTR bug in DumpIcon().
Mon Nov 20 22:22:22 1995 Alex Korobka <alex@phm30.pharm.sunysb.edu>
* [controls/listbox.c] [controls/combo.c] [include/listbox.h]
Partial implementaion of LBS_EXTENDEDSEL style,
yet more updates for drag & drop support. Now works.
* [windows/defwnd.c]
More message handlers.
* [windows/win.c]
DragObject, DragDetect, AnyPopup functions.
* [controls/listbox.c]
More kludgy fixes (WM_...TOITEM, etc.).
* [objects/cursoricon.c] [objects/oembitmap.c]
IconToCursor skeleton, patch for OBM_LoadCursorIcon to handle new
cursor.
* [include/bitmaps/ocr*]
New OEM cursors.
Mon Nov 20 11:05:20 EST 1995 Jim Peterson <jspeter@birch.ee.vt.edu>
* [toolkit/heap.c]
Swapped flags and size arguments to LocalRealloc as per changes in
memory/local.c by William Magro in previous release.
* [include/wintypes.h]
Reinstated the #define's for 'min' and 'max', since they're part of
the Windows API. I really don't think it's a wise idea, so I put
a '#ifndef DONT_DEFINE_min_AND_max' around them. I think the actual
WINE code should never use these (it should use 'MIN' and 'MAX'
instead).
* [loader/*]
Put '#ifndef WINELIB' around many things that WINElib should not need.
* [controls/edit.c]
Took out many '#if defined(WINELIB)' sections with the associated
comment 'temporary fix, until Local memory is correctly implemented in
WINELIB', since the effective translations are now in
toolkit/miscstubs.c.
Took out the #ifndef's I put in EDIT_ClearText. Whoever modified this
file fixed (or at least postponed) the bug I had encountered.
* [loader/task.c]
Put an #ifdef in TASK_CreateTask() that hardwires the current drive to
C: This will probably cause a lot of trouble if this change is
forgotten in the future, but it will let things like the OpenFileName
dialog work for now.
* [toolkit/libres.c] [toolkit/Makefile.in] [toolkit/Makefile]
[include/libres.h]
Made new libres.c file, which will contain functions for supporting
accessing resources by name in WINElib. 'winerc' will need to be
changed.
* [toolkit/heap.c]
Refined memory routines to allow for differences between LocalAlloc
and GlobalAlloc and between LocalSize and GlobalSize.
* [windows/message.c] [include/windows.h]
Defined the GetCurrentTime routine in windows/message.c, and removed
the #define in windows.h.
Mon Nov 20 00:36:42 MET 1995 Sven Verdoolaege <skimo@dns.ufsia.ac.be>
* [*/*]
Added new debugging type DEBUG_WIN32 and DEBUG_ENV.
* [loader/module.c]
Added undocumented GetExpWinVer.
* [tools/build.c]
Previous code didn't pop possibly changed %esi, %edi and %edx
from the stack.
* [win32/advapi.c]
Added GetUserNameA.
* [win32/code_page.c]
Added stub for MultiByteToWideChar.
* [win32/console.c]
Added SetConsoleCtrlHandler stub.
* [win32/file.c]
Added ReadFile CreateFileA GetFileInformationByHandle stubs.
Added CloseHandle.
* [win32/memory.c]
Changed VirtualAlloc and VirtualFree.
* [win32/process.c]
Added ExitProcess.
Sun Nov 19 17:54:42 1995 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
* [include/windows.h]
Fixed a few broken structure definitions.
* [loader/resource.c]
FindResource(): Need to check for '#xxx' strings here.
* [miscemu/int21.c]
FindNext(): Return MS-DOS filenames uppercase.
* [objects/cursoricon.c]
CreateIcon(), CreateCursor(): Added missing element to CURSORICONINFO
initializers.
* [misc/file.c]
_lopen(): Files opened in OF_WRITE mode are truncated.
OpenFile(): Ignore OF_READ/OF_WRITE/OF_READWRITE when files are
created; use read/write mode.
* [misc/profile.c]
load(): Rewritten.
* [misc/commdlg.c]
Fixed bad call to strncpy() that smashed the stack.
* [controls/combo.c] [windows/winpos.c] [memory/selector.c]
Operator precedence fixes. People who use gcc 2.7.1 don't need a
debugger :-)
* [if1632/gdi.spec] [objects/palette.c]
Add ResizePalette() and AnimatePalette() stubs. They don't do anything,
but sometimes that's good enough.
Fri Nov 17 09:10:35 GMT 1995 John Harvey <john@division.co.uk>
* [include/wine.h] [include/registers.h] [include/winsock.h]
Added definitions for Unixware.
* [loader/signal.c] [misc/comm.c] [misc/winsocket.c]
Misc. fixes for Unixware.
* [loader/task.c]
Made assignemts to context in InitTask for registers use the macros
from registers.h to make them more portable. (Needed for Unixware)
* [tools/build.c]
Fixed register acces routines to work on Unixware. Bit grubby but
it seems to work.
* [controls/edit.c]
EDIT_WM_NCCreate allocates local heap if hasn't been previously
allocated.
* [miscemu/int21.c]
mkdir now creates directory with permission to access it.
* [misc/dos_fs.c]
mkdir now creates directory with permission to access it.
DOS_opendir now uses linked list of dirents to avoid problems with
realloc changing address of malloced memory.
Thu Nov 16 12:47:13 1995 Michael Patra <patra@itp1.Physik.TU-Berlin.DE>
* [controls/menu.c]
MENU_CalcItemSize(): Fixed handling of empty menu items.
Sat Nov 11 21:46:54 1995 Hans de Graaff <graaff@twi72.twi.tudelft.nl>
* [misc/file.c]
In OpenFile, unlink should be done on the unix filename.
Sat Nov 11 16:43:29 1995 Cameron Heide (heide@ee.ualberta.ca)
* [include/handle32.h]
New header file containing internal Win32 kernel handle
information.
* [win32/file.c]
Added ReadFile, CreateFile, and CloseFileHandle, and did
some reorganizing to match the new handle allocation scheme.
* [win32/init.c]
Added CloseHandle and the creation of standard I/O handles.
* [win32/object_mgt.c]
New module for allocating and freeing Win32 kernel handles.
diff --git a/ANNOUNCE b/ANNOUNCE
index e19ef72..a486e16 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,14 +1,14 @@
-This is release 951105 of Wine the MS Windows emulator. This is still a
+This is release 951124 of Wine the MS Windows emulator. This is still a
developer's only release. There are many bugs and many unimplemented API
features. Most applications still do not work.
Patches should be submitted to "wine-new@amscons.com". Please don't forget
to include a ChangeLog entry. I'll make a new release every other week.
-WHAT'S NEW with Wine-951105: (see ChangeLog for details)
- - A lot of fixes for Winelib.
- - Built-in debugger improvements.
- - Get/SetMetafileBits implemented.
+WHAT'S NEW with Wine-951124: (see ChangeLog for details)
+ - Drag and drop implemented.
+ - Unixware is now fully supported.
+ - Many Win32 improvements.
- Lots of bug fixes.
See the README file in the distribution for installation instructions.
@@ -17,11 +17,11 @@
the release is available at the ftp sites. The sources will be available
from the following locations:
- sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-951105.tar.gz
- tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-951105.tar.gz
- ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-951105.tar.gz
- ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-951105.tar.gz
- aris.com:/pub/linux/ALPHA/Wine/development/Wine-951105.tar.gz
+ sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-951124.tar.gz
+ tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-951124.tar.gz
+ ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-951124.tar.gz
+ ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-951124.tar.gz
+ aris.com:/pub/linux/ALPHA/Wine/development/Wine-951124.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite.
diff --git a/BUGS b/BUGS
index d0f6e47..19f3c08 100644
--- a/BUGS
+++ b/BUGS
@@ -1,9 +1,27 @@
+1. 32-bit/16-bit call translation:
+
- EBP and ESP are sometimes corrupted while running 16-bit code.
-- Message flow is not correct for multiple tasks, some messages are not supported.
+
+2. Messaging:
+
+- Message flow is not correct for multiple tasks
- Dialog Boxes created by WM_CREATE handler aren't visible
- MDI does not send WM_GETMINMAX message.
+- resizing of MDI child windows sometimes leaves them unrepainted
+
+3. Controls:
+
+- Some features are missing (like VK_SHIFT aided multiple selection in listboxes)
+
+4. Miscellaneous:
+
- InitializeLoadedDLLs() can't init LZEXPAND.DLL. (cs:ip => 0:0)
- LoadCursor does not correctly handle bitmap cursors
- AllocCSToDSAlias() shouldn't alloc alias for the same segment multiple times.
- Dialogs don't support resources which are referred to as integers.
+
+5. Where to look in source files:
+
- grep for FIXME in the source files.
+
+
diff --git a/ChangeLog b/ChangeLog
index 988d9a6..9fcdf03 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,215 @@
----------------------------------------------------------------------
+Tue Nov 21 18:49:10 1995 Alexandre Julliard <julliard@sunsite.unc.edu>
+
+ * [configure.in] [Makefile] [misc/dos_fs.c]
+ Got rid of autoconf.h file.
+
+ * [debugger/dbg.y]
+ More logical behavior upon syntax errors.
+
+ * [include/hook.h] [windows/hook.c]
+ Changed hook structure and rewrote most of the hook functions for
+ better compatibility, based on investigations by Alex Korobka.
+
+ * [include/message.h] [windows/message.c]
+ Added hooks to message queue structure and made the structure
+ layout Windows-compatible.
+ Added support for WH_MOUSE, WH_KEYBOARD, WH_HARDWARE and
+ WH_JOURNALRECORD hooks.
+
+ * [misc/main.c]
+ Added command-line option for changing the language at run-time
+ (not implemented yet), based on a suggestion from Michael Patra.
+
+ * [objects/cursoricon.c]
+ Fixed silly SEGPTR bug in DumpIcon().
+
+Mon Nov 20 22:22:22 1995 Alex Korobka <alex@phm30.pharm.sunysb.edu>
+
+ * [controls/listbox.c] [controls/combo.c] [include/listbox.h]
+ Partial implementaion of LBS_EXTENDEDSEL style,
+ yet more updates for drag & drop support. Now works.
+
+ * [windows/defwnd.c]
+ More message handlers.
+
+ * [windows/win.c]
+ DragObject, DragDetect, AnyPopup functions.
+
+ * [controls/listbox.c]
+ More kludgy fixes (WM_...TOITEM, etc.).
+
+ * [objects/cursoricon.c] [objects/oembitmap.c]
+ IconToCursor skeleton, patch for OBM_LoadCursorIcon to handle new
+ cursor.
+
+ * [include/bitmaps/ocr*]
+ New OEM cursors.
+
+Mon Nov 20 11:05:20 EST 1995 Jim Peterson <jspeter@birch.ee.vt.edu>
+
+ * [toolkit/heap.c]
+ Swapped flags and size arguments to LocalRealloc as per changes in
+ memory/local.c by William Magro in previous release.
+
+ * [include/wintypes.h]
+ Reinstated the #define's for 'min' and 'max', since they're part of
+ the Windows API. I really don't think it's a wise idea, so I put
+ a '#ifndef DONT_DEFINE_min_AND_max' around them. I think the actual
+ WINE code should never use these (it should use 'MIN' and 'MAX'
+ instead).
+
+ * [loader/*]
+ Put '#ifndef WINELIB' around many things that WINElib should not need.
+
+ * [controls/edit.c]
+ Took out many '#if defined(WINELIB)' sections with the associated
+ comment 'temporary fix, until Local memory is correctly implemented in
+ WINELIB', since the effective translations are now in
+ toolkit/miscstubs.c.
+ Took out the #ifndef's I put in EDIT_ClearText. Whoever modified this
+ file fixed (or at least postponed) the bug I had encountered.
+
+ * [loader/task.c]
+ Put an #ifdef in TASK_CreateTask() that hardwires the current drive to
+ C: This will probably cause a lot of trouble if this change is
+ forgotten in the future, but it will let things like the OpenFileName
+ dialog work for now.
+
+ * [toolkit/libres.c] [toolkit/Makefile.in] [toolkit/Makefile]
+ [include/libres.h]
+ Made new libres.c file, which will contain functions for supporting
+ accessing resources by name in WINElib. 'winerc' will need to be
+ changed.
+
+ * [toolkit/heap.c]
+ Refined memory routines to allow for differences between LocalAlloc
+ and GlobalAlloc and between LocalSize and GlobalSize.
+
+ * [windows/message.c] [include/windows.h]
+ Defined the GetCurrentTime routine in windows/message.c, and removed
+ the #define in windows.h.
+
+Mon Nov 20 00:36:42 MET 1995 Sven Verdoolaege <skimo@dns.ufsia.ac.be>
+
+ * [*/*]
+ Added new debugging type DEBUG_WIN32 and DEBUG_ENV.
+
+ * [loader/module.c]
+ Added undocumented GetExpWinVer.
+
+ * [tools/build.c]
+ Previous code didn't pop possibly changed %esi, %edi and %edx
+ from the stack.
+
+ * [win32/advapi.c]
+ Added GetUserNameA.
+
+ * [win32/code_page.c]
+ Added stub for MultiByteToWideChar.
+
+ * [win32/console.c]
+ Added SetConsoleCtrlHandler stub.
+
+ * [win32/file.c]
+ Added ReadFile CreateFileA GetFileInformationByHandle stubs.
+ Added CloseHandle.
+
+ * [win32/memory.c]
+ Changed VirtualAlloc and VirtualFree.
+
+ * [win32/process.c]
+ Added ExitProcess.
+
+Sun Nov 19 17:54:42 1995 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
+
+ * [include/windows.h]
+ Fixed a few broken structure definitions.
+
+ * [loader/resource.c]
+ FindResource(): Need to check for '#xxx' strings here.
+
+ * [miscemu/int21.c]
+ FindNext(): Return MS-DOS filenames uppercase.
+
+ * [objects/cursoricon.c]
+ CreateIcon(), CreateCursor(): Added missing element to CURSORICONINFO
+ initializers.
+
+ * [misc/file.c]
+ _lopen(): Files opened in OF_WRITE mode are truncated.
+ OpenFile(): Ignore OF_READ/OF_WRITE/OF_READWRITE when files are
+ created; use read/write mode.
+
+ * [misc/profile.c]
+ load(): Rewritten.
+
+ * [misc/commdlg.c]
+ Fixed bad call to strncpy() that smashed the stack.
+
+ * [controls/combo.c] [windows/winpos.c] [memory/selector.c]
+ Operator precedence fixes. People who use gcc 2.7.1 don't need a
+ debugger :-)
+
+ * [if1632/gdi.spec] [objects/palette.c]
+ Add ResizePalette() and AnimatePalette() stubs. They don't do anything,
+ but sometimes that's good enough.
+
+Fri Nov 17 09:10:35 GMT 1995 John Harvey <john@division.co.uk>
+
+ * [include/wine.h] [include/registers.h] [include/winsock.h]
+ Added definitions for Unixware.
+
+ * [loader/signal.c] [misc/comm.c] [misc/winsocket.c]
+ Misc. fixes for Unixware.
+
+ * [loader/task.c]
+ Made assignemts to context in InitTask for registers use the macros
+ from registers.h to make them more portable. (Needed for Unixware)
+
+ * [tools/build.c]
+ Fixed register acces routines to work on Unixware. Bit grubby but
+ it seems to work.
+
+ * [controls/edit.c]
+ EDIT_WM_NCCreate allocates local heap if hasn't been previously
+ allocated.
+
+ * [miscemu/int21.c]
+ mkdir now creates directory with permission to access it.
+
+ * [misc/dos_fs.c]
+ mkdir now creates directory with permission to access it.
+ DOS_opendir now uses linked list of dirents to avoid problems with
+ realloc changing address of malloced memory.
+
+Thu Nov 16 12:47:13 1995 Michael Patra <patra@itp1.Physik.TU-Berlin.DE>
+
+ * [controls/menu.c]
+ MENU_CalcItemSize(): Fixed handling of empty menu items.
+
+Sat Nov 11 21:46:54 1995 Hans de Graaff <graaff@twi72.twi.tudelft.nl>
+
+ * [misc/file.c]
+ In OpenFile, unlink should be done on the unix filename.
+
+Sat Nov 11 16:43:29 1995 Cameron Heide (heide@ee.ualberta.ca)
+
+ * [include/handle32.h]
+ New header file containing internal Win32 kernel handle
+ information.
+
+ * [win32/file.c]
+ Added ReadFile, CreateFile, and CloseFileHandle, and did
+ some reorganizing to match the new handle allocation scheme.
+
+ * [win32/init.c]
+ Added CloseHandle and the creation of standard I/O handles.
+
+ * [win32/object_mgt.c]
+ New module for allocating and freeing Win32 kernel handles.
+
+----------------------------------------------------------------------
Fri Nov 3 20:08:17 1995 Alexandre Julliard <julliard@sunsite.unc.edu>
* [configure.in]
diff --git a/Makefile.in b/Makefile.in
index 19f8a12..e7a7bb9 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -84,8 +84,6 @@
distclean:
for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) distclean); done
- echo "/* autoconf.h generated automatically. Run Configure */" >autoconf.h
- echo "#error You must run Configure before you can build the makefiles." >>autoconf.h
$(RM) *.o \#*\# *~ *.bak wine wine.sym winelib.a TAGS
$(RM) config.* include/config.h Make.rules Makefile
diff --git a/autoconf.h b/autoconf.h
deleted file mode 100644
index 9cb370e..0000000
--- a/autoconf.h
+++ /dev/null
@@ -1,2 +0,0 @@
-/* autoconf.h generated automatically. Run Configure */
-#error You must run Configure before you can build the makefiles.
diff --git a/autoconf.h.in b/autoconf.h.in
deleted file mode 100644
index 9c92cf4..0000000
--- a/autoconf.h.in
+++ /dev/null
@@ -1,3 +0,0 @@
-/* @configure_input@ */
-#define WINE_INI_GLOBAL @WINE_INI_GLOBAL@
-#define AutoDefines @LANG@
diff --git a/configure b/configure
index c0df84d..3223ea7 100755
--- a/configure
+++ b/configure
@@ -1596,18 +1596,6 @@
TOP_SRCDIR="${top_srcdir}"
fi
-echo $ac_n "checking for wine.ini in autoconf.h""... $ac_c" 1>&6
-if test -f ${TOP_SRCDIR}/autoconf.h; then
-if test `grep -c WINE_INI_GLOBAL ${TOP_SRCDIR}/autoconf.h` -ne 0; then
-WINE_INI_GLOBAL=`grep WINE_INI_GLOBAL ${TOP_SRCDIR}/autoconf.h | tr ' ' '\n' | tail -1`
-echo "$ac_t""${WINE_INI_GLOBAL}" 1>&6
-fi
-fi
-if test -z "${WINE_INI_GLOBAL}"; then
-echo "$ac_t""no" 1>&6
-fi
-
-if test -z "${WINE_INI_GLOBAL}"; then
echo $ac_n "checking for /usr/local/etc/wine.conf""... $ac_c" 1>&6
if test -f /usr/local/etc/wine.conf; then
echo "$ac_t""yes" 1>&6
@@ -1616,7 +1604,6 @@
echo "$ac_t""no" 1>&6
WINE_INI_GLOBAL="\"${TOP_SRCDIR}/wine.ini\""
fi
-fi
cat >> confdefs.h <<EOF
#define WINE_INI_GLOBAL $WINE_INI_GLOBAL
diff --git a/configure.in b/configure.in
index 4bbf3fe..7eee842 100644
--- a/configure.in
+++ b/configure.in
@@ -55,18 +55,6 @@
TOP_SRCDIR="${top_srcdir}"
fi
-AC_MSG_CHECKING(for wine.ini in autoconf.h)
-if test -f ${TOP_SRCDIR}/autoconf.h; then
-if test `grep -c WINE_INI_GLOBAL ${TOP_SRCDIR}/autoconf.h` -ne 0; then
-WINE_INI_GLOBAL=`grep WINE_INI_GLOBAL ${TOP_SRCDIR}/autoconf.h | tr ' ' '\n' | tail -1`
-AC_MSG_RESULT(${WINE_INI_GLOBAL})
-fi
-fi
-if test -z "${WINE_INI_GLOBAL}"; then
-AC_MSG_RESULT(no)
-fi
-
-if test -z "${WINE_INI_GLOBAL}"; then
AC_MSG_CHECKING(for /usr/local/etc/wine.conf)
if test -f /usr/local/etc/wine.conf; then
AC_MSG_RESULT(yes)
@@ -75,7 +63,6 @@
AC_MSG_RESULT(no)
WINE_INI_GLOBAL="\"${TOP_SRCDIR}/wine.ini\""
fi
-fi
AC_SUBST(WINE_INI_GLOBAL)
AC_DEFINE_UNQUOTED(WINE_INI_GLOBAL,$WINE_INI_GLOBAL)
diff --git a/controls/combo.c b/controls/combo.c
index 8284d51..bed192e 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -148,7 +148,7 @@
0, 0, lphc->RectButton.left, lphl->StdItemHeight,
hwnd, (HMENU)1, WIN_GetWindowInstance(hwnd), 0L);
break;
- case CBS_DROPDOWNLIST: /* static control, downdown listbox */
+ case CBS_DROPDOWNLIST: /* static control, dropdown listbox */
dprintf_combo(stddeb,"CBS_DROPDOWNLIST\n");
lphc->RectButton = rect;
lphc->RectButton.left = lphc->RectButton.right - 6 - CBitWidth;
@@ -299,7 +299,7 @@
newFocused = lphl->ItemsCount - 1;
ListBoxSetCurSel(lphl, newFocused);
- ListBoxSendNotification(lphl, hwnd, CBN_SELCHANGE);
+ ListBoxSendNotification(lphl, CBN_SELCHANGE);
lphl->ItemFocused = newFocused;
ListBoxScrollToFocus(lphl);
@@ -324,7 +324,7 @@
newFocused = lphl->ItemsCount - 1;
ListBoxSetCurSel(lphl, newFocused);
- ListBoxSendNotification(lphl, hwnd, CBN_SELCHANGE);
+ ListBoxSendNotification(lphl, CBN_SELCHANGE);
lphl->ItemFocused = newFocused;
ListBoxScrollToFocus(lphl);
@@ -577,7 +577,7 @@
LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
RECT rect;
- if (lphc->dwStyle & 3 == CBS_SIMPLE) return LB_ERR;
+ if ((lphc->dwStyle & 3) == CBS_SIMPLE) return LB_ERR;
wParam = !!wParam;
if (wParam != lphc->DropDownVisible) {
@@ -708,7 +708,7 @@
newFocused = lphl->ItemsCount - 1;
ListBoxSetCurSel(lphl, newFocused);
- ListBoxSendNotification(lphl, hwnd, CBN_SELCHANGE);
+ ListBoxSendNotification(lphl, CBN_SELCHANGE);
lphl->ItemFocused = newFocused;
ListBoxScrollToFocus(lphl);
@@ -862,7 +862,7 @@
else if (lphl->PrevFocused != lphl->ItemFocused)
{
SendMessage(CLBoxGetCombo(hwnd),CB_SETCURSEL,lphl->ItemFocused,0);
- ListBoxSendNotification(lphl, CLBoxGetCombo(hwnd), CBN_SELCHANGE);
+ ListBoxSendNotification(lphl, CBN_SELCHANGE);
}
SendMessage(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);
diff --git a/controls/edit.c b/controls/edit.c
index 31534d6..04383fb 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -11,6 +11,7 @@
#include <stdlib.h>
#include <string.h>
#include <windows.h>
+#include "instance.h"
#include "local.h"
#include "win.h"
#include "class.h"
@@ -106,13 +107,8 @@
static HLOCAL EDIT_HeapAlloc(HWND hwnd, int bytes, WORD flags)
{
HLOCAL ret;
-
-#if defined(WINELIB)
- /* temporary fix, until Local memory is correctly implemented in WINELIB */
- ret = LocalAlloc( flags, bytes );
-#else
+
ret = LOCAL_Alloc( WIN_GetWindowInstance(hwnd), flags, bytes );
-#endif
if (!ret)
printf("EDIT_HeapAlloc: Out of heap-memory\n");
return ret;
@@ -126,11 +122,11 @@
static void *EDIT_HeapLock(HWND hwnd, HANDLE handle)
{
HINSTANCE hinstance = WIN_GetWindowInstance( hwnd );
+#if defined(WINELIB)
+ return LOCAL_Lock( hinstance, handle );
+#else
HANDLE offs;
-#if defined(WINELIB)
- return handle;
-#else
if (handle == 0) return 0;
offs = LOCAL_Lock( hinstance, handle );
return PTR_SEG_OFF_TO_LIN( hinstance, offs );
@@ -142,12 +138,8 @@
*/
static void EDIT_HeapUnlock(HWND hwnd, HANDLE handle)
{
-#if defined(WINELIB)
- return 0;
-#else
if (handle == 0) return;
LOCAL_Unlock( WIN_GetWindowInstance( hwnd ), handle );
-#endif
}
/*********************************************************************
@@ -157,12 +149,8 @@
*/
static HLOCAL EDIT_HeapReAlloc(HWND hwnd, HANDLE handle, int bytes)
{
-#if defined(WINELIB)
- return LocalReAlloc( handle, bytes, LMEM_FIXED );
-#else
return LOCAL_ReAlloc( WIN_GetWindowInstance(hwnd), handle, bytes,
LMEM_FIXED );
-#endif
}
@@ -173,11 +161,7 @@
*/
static void EDIT_HeapFree(HWND hwnd, HANDLE handle)
{
-#if defined(WINELIB)
- LocalFree( handle );
-#else
LOCAL_Free( WIN_GetWindowInstance(hwnd), handle );
-#endif
}
@@ -188,11 +172,7 @@
*/
static unsigned int EDIT_HeapSize(HWND hwnd, HANDLE handle)
{
-#if defined(WINELIB)
- return LocalSize( handle );
-#else
return LOCAL_Size( WIN_GetWindowInstance(hwnd), handle );
-#endif
}
/********************************************************************
@@ -264,7 +244,7 @@
{
EDITSTATE *es = EDIT_GetEditState(hwnd);
- dprintf_edit( stddeb, "EDIT_ClerTextPointers\n" );
+ dprintf_edit( stddeb, "EDIT_ClearTextPointers\n" );
es->textptrs = xrealloc(es->textptrs, sizeof(int));
es->textptrs[0] = 0;
}
@@ -1315,11 +1295,11 @@
char *text;
dprintf_edit(stddeb,"EDIT_ClearText %d\n",blen);
-#ifndef WINELIB
+/*#ifndef WINELIB*/
es->hText = EDIT_HeapReAlloc(hwnd, es->hText, blen);
text = EDIT_HeapLock(hwnd, es->hText);
memset(text, 0, blen);
-#endif
+/*#endif*/
es->textlen = 0;
es->wlines = 0;
es->CurrLine = es->CurrCol = 0;
@@ -1327,9 +1307,9 @@
es->wleft = es->wtop = 0;
es->textwidth = 0;
es->TextChanged = FALSE;
-#ifndef WINELIB
+/*#ifndef WINELIB*/
EDIT_ClearTextPointers(hwnd);
-#endif
+/*#endif*/
}
/*********************************************************************
@@ -2230,6 +2210,13 @@
EndPaint(hwnd, &ps);
}
+static BOOL LOCAL_HeapExists(WORD ds)
+{
+ INSTANCEDATA *ptr = (INSTANCEDATA *)PTR_SEG_OFF_TO_LIN( ds, 0 );
+ if (!ptr->heap) return 0;
+ return 1;
+}
+
/*********************************************************************
* WM_NCCREATE
*/
@@ -2238,11 +2225,11 @@
CREATESTRUCT *createStruct = (CREATESTRUCT *)PTR_SEG_TO_LIN(lParam);
WND *wndPtr = WIN_FindWndPtr(hwnd);
EDITSTATE *es;
- char *text;
+ char *text = NULL;
+ HANDLE ds;
/* store pointer to local or global heap in window structure so that */
/* EDITSTATE structure itself can be stored on local heap */
-
/* allocate space for state variable structure */
es = xmalloc( sizeof(EDITSTATE) );
SetWindowLong( hwnd, 0, (LONG)es );
@@ -2251,6 +2238,33 @@
es->ClientWidth = es->ClientHeight = 1;
/* --- text buffer */
es->MaxTextLen = MAXTEXTLEN + 1;
+ /*
+ * Hack - If there is no local heap then hwnd should be a globalHeap block
+ * and the local heap needs to be initilised to the same size(minus something)
+ * as the global block
+ */
+ ds = WIN_GetWindowInstance(hwnd);
+
+ if (!LOCAL_HeapExists(ds))
+ {
+ DWORD globalSize;
+ globalSize = GlobalSize(ds);
+ printf("No local heap allocated global size is %d 0x%x\n",globalSize, globalSize);
+ /*
+ * I assume the local heap should start at 0
+ */
+ LocalInit(ds, 0, globalSize);
+ /*
+ * Apparantly we should do an UnlockSegment here but i think this
+ * is because LocalInit is supposed to do a LockSegment. Since
+ * Local Init doesn't do this then it doesn't seem like a good idea to do the
+ * UnlockSegment here yet!
+ * UnlockSegment(hwnd);
+ */
+
+ }
+
+
if (!(createStruct->lpszName))
{
dprintf_edit( stddeb, "EDIT_WM_NCCREATE: lpszName == 0\n" );
@@ -2268,16 +2282,23 @@
{
char *windowName = (char *)PTR_SEG_TO_LIN( createStruct->lpszName );
dprintf_edit( stddeb, "EDIT_WM_NCCREATE: lpszName != 0\n" );
+
if (strlen(windowName) < EditBufStartLen(hwnd))
{
es->textlen = EditBufStartLen(hwnd) + 3;
es->hText = EDIT_HeapAlloc(hwnd, es->textlen + 2, LMEM_MOVEABLE);
- text = EDIT_HeapLock(hwnd, es->hText);
- strcpy(text, windowName);
- if(IsMultiLine(hwnd)) {
- strcat(text, "\r\n");
- }
- *(text + es->textlen) = '\0';
+ if (es->hText)
+ {
+ text = EDIT_HeapLock(hwnd, es->hText);
+ if (text)
+ {
+ strcpy(text, windowName);
+ if(IsMultiLine(hwnd)) {
+ strcat(text, "\r\n");
+ }
+ *(text + es->textlen) = '\0';
+ }
+ }
}
else
{
@@ -2288,8 +2309,11 @@
if(IsMultiLine(hwnd)) strcat(text, "\r\n");
*(text + es->textlen) = '\0';
}
- *(text + es->textlen + 1) = '\0';
- EDIT_BuildTextPointers(hwnd);
+ if (text)
+ {
+ *(text + es->textlen + 1) = '\0';
+ EDIT_BuildTextPointers(hwnd);
+ }
}
/* ES_AUTOVSCROLL and ES_AUTOHSCROLL are automatically applied if */
diff --git a/controls/listbox.c b/controls/listbox.c
index d06760d..a215ec3 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -2,14 +2,16 @@
* Listbox controls
*
* Copyright Martin Ayotte, 1993
- * Copyright Constantine Sapuntzakis, 1995
+ * Constantine Sapuntzakis, 1995
+ * Alex Korobka, 1995
*
*/
/*
- * TODO:
+ * FIXME:
* - check if multi-column listboxes work
- * - implement more messages and styles
+ * - implement more messages and styles (LB_EXTENDEDSEL for instance)
+ * - exterminate evil InvalidateRect(whole listbox) where possible!!!!
*/
#include <stdio.h>
@@ -33,10 +35,26 @@
((void *)((handle) ? ((handle) | ((int)lphl->Heap & 0xffff0000)) : 0))
#else
/* FIXME: shouldn't each listbox have its own heap? */
+#if 0
#define LIST_HEAP_ALLOC(lphl,f,size) USER_HEAP_ALLOC(size)
#define LIST_HEAP_FREE(lphl,handle) USER_HEAP_FREE(handle)
#define LIST_HEAP_ADDR(lphl,handle) USER_HEAP_LIN_ADDR(handle)
#define LIST_HEAP_SEG_ADDR(lphl,handle) USER_HEAP_SEG_ADDR(handle)
+#else
+/* Something like this maybe ? */
+#define LIST_HEAP_ALLOC(lphl,f,size) \
+ LOCAL_Alloc( lphl->HeapSel, LMEM_FIXED, (size) )
+#if 0
+#define LIST_HEAP_REALLOC(handle,size) \
+ LOCAL_ReAlloc( USER_HeapSel, (handle), (size), LMEM_FIXED )
+#endif
+#define LIST_HEAP_FREE(lphl,handle) \
+ LOCAL_Free( lphl->HeapSel, (handle) )
+#define LIST_HEAP_ADDR(lphl,handle) \
+ ((handle) ? PTR_SEG_OFF_TO_LIN(lphl->HeapSel, (handle)) : NULL)
+#define LIST_HEAP_SEG_ADDR(lphl,handle) \
+ ((handle) ? MAKELONG((handle), lphl->HeapSel) : 0)
+#endif
#endif
#define LIST_HEAP_SIZE 0x10000
@@ -66,9 +84,9 @@
lphl->iNumStops = 0;
lphl->TabStops = NULL;
lphl->hFont = GetStockObject(SYSTEM_FONT);
+ lphl->hSelf = hwnd;
lphl->hParent = parent;
lphl->StdItemHeight = 15; /* FIXME: should get the font height */
- lphl->dwStyle = styles;
lphl->OwnerDrawn = styles & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE);
lphl->HasStrings = (styles & LBS_HASSTRINGS) || !lphl->OwnerDrawn;
@@ -93,6 +111,8 @@
HeapBase = GlobalLock(HeapHandle);
HEAP_Init(&lphl->Heap, HeapBase, LIST_HEAP_SIZE);
#endif
+ lphl->HeapSel = GlobalAlloc(GMEM_FIXED,LIST_HEAP_SIZE);
+ LocalInit( lphl->HeapSel, 0, LIST_HEAP_SIZE-1);
}
void DestroyListBoxStruct(LPHEADLIST lphl)
@@ -101,6 +121,7 @@
USER_HEAP_FREE(lphl->hDrawItemStruct);
/* XXX need to free lphl->Heap */
+ GlobalFree(lphl->HeapSel);
free(lphl);
}
@@ -111,15 +132,17 @@
/* Send notification "code" as part of a WM_COMMAND-message if hwnd
has the LBS_NOTIFY style */
-void ListBoxSendNotification(LPHEADLIST lphl, HWND hwnd, WORD code)
+void ListBoxSendNotification(LPHEADLIST lphl, WORD code)
{
- if (lphl->dwStyle & LBS_NOTIFY)
+ DWORD dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
+
+ if (dwStyle & LBS_NOTIFY)
#ifdef WINELIB32
SendMessage(lphl->hParent, WM_COMMAND,
- MAKEWPARAM(lphl->CtlID,code), (LPARAM)hwnd);
+ MAKEWPARAM(lphl->CtlID,code), (LPARAM)lphl->hSelf);
#else
SendMessage(lphl->hParent, WM_COMMAND,
- lphl->CtlID, MAKELONG(hwnd, code));
+ lphl->CtlID, MAKELONG(lphl->hSelf, code));
#endif
}
@@ -191,6 +214,8 @@
void ListBoxDrawItem (HWND hwnd, LPHEADLIST lphl, HDC hdc, LPLISTSTRUCT lpls,
RECT *rect, WORD itemAction, WORD itemState)
{
+ LONG dwStyle = GetWindowLong(hwnd,GWL_STYLE);
+
if (lphl->OwnerDrawn) {
DRAWITEMSTRUCT *dis = USER_HEAP_LIN_ADDR(lphl->hDrawItemStruct);
@@ -217,7 +242,7 @@
FillRect(hdc, rect, GetStockObject(BLACK_BRUSH));
}
- if (lphl->dwStyle & LBS_USETABSTOPS) {
+ if (dwStyle & LBS_USETABSTOPS) {
TabbedTextOut(hdc, rect->left + 5, rect->top + 2,
(char *)lpls->itemText, strlen((char *)lpls->itemText),
lphl->iNumStops, lphl->TabStops, 0);
@@ -269,7 +294,7 @@
MEASUREITEMSTRUCT *lpmeasure = (MEASUREITEMSTRUCT *) USER_HEAP_LIN_ADDR(hTemp);
if (lpmeasure == NULL) {
- fprintf(stderr,"ListBoxAskMeasure() out of memory !\n");
+ fprintf(stdnimp,"ListBoxAskMeasure() out of memory !\n");
return;
}
@@ -277,7 +302,7 @@
lpmeasure->itemHeight = lphl->StdItemHeight;
SendMessage(lphl->hParent, WM_MEASUREITEM, 0, (LPARAM)USER_HEAP_SEG_ADDR(hTemp));
- if (lphl->dwStyle & LBS_OWNERDRAWFIXED) {
+ if (GetWindowLong(lphl->hSelf,GWL_STYLE) & LBS_OWNERDRAWFIXED) {
lphl->StdItemHeight = lpmeasure->itemHeight;
lphl->needMeasure = FALSE;
}
@@ -285,6 +310,7 @@
USER_HEAP_FREE(hTemp);
}
+/* -------------------- strings and item data ---------------------- */
LPLISTSTRUCT ListBoxCreateItem(LPHEADLIST lphl, int id)
{
@@ -314,6 +340,8 @@
dprintf_listbox(stddeb,"ListBoxInsertString(%d, %p);\n", uIndex, newstr);
+ if (!newstr) return -1;
+
if (uIndex == (UINT)-1)
uIndex = lphl->ItemsCount;
@@ -326,7 +354,7 @@
lplsnew = ListBoxCreateItem(lphl, Count);
if (lplsnew == NULL) {
- printf("ListBoxInsertString() out of memory !\n");
+ fprintf(stdnimp,"ListBoxInsertString() out of memory !\n");
return LB_ERRSPACE;
}
@@ -368,9 +396,10 @@
int ListBoxAddString(LPHEADLIST lphl, LPSTR newstr)
{
+ LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
UINT pos = (UINT) -1;
- if (lphl->HasStrings && (lphl->dwStyle & LBS_SORT)) {
+ if (lphl->HasStrings && (dwStyle & LBS_SORT)) {
LPLISTSTRUCT lpls = lphl->lpFirst;
for (pos = 0; lpls != NULL; lpls = lpls->lpNext, pos++)
if (strcmp(lpls->itemText, newstr) >= 0)
@@ -465,6 +494,7 @@
UINT Count;
UINT First = nFirst + 1;
LPSTR lpMatchStr = (LPSTR)MatchStr;
+ LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
if (First > lphl->ItemsCount) return LB_ERR;
@@ -475,7 +505,7 @@
while(lpls != NULL) {
if (lphl->HasStrings) {
if (strstr(lpls->itemText, lpMatchStr) == lpls->itemText) return Count;
- } else if (lphl->dwStyle & LBS_SORT) {
+ } else if (dwStyle & LBS_SORT) {
/* XXX Do a compare item */
}
else
@@ -492,7 +522,7 @@
while (Count < First) {
if (lphl->HasStrings) {
if (strstr(lpls->itemText, lpMatchStr) == lpls->itemText) return Count;
- } else if (lphl->dwStyle & LBS_SORT) {
+ } else if (dwStyle & LBS_SORT) {
/* XXX Do a compare item */
} else {
if (lpls->mis.itemData == (DWORD)lpMatchStr) return Count;
@@ -528,13 +558,21 @@
return TRUE;
}
+/* --------------------- selection ------------------------- */
int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex)
{
LPLISTSTRUCT lpls;
+ DWORD dwStyle = GetWindowWord(lphl->hSelf,GWL_STYLE);
- if (lphl->dwStyle & LBS_MULTIPLESEL) return 0;
+ /* use ListBoxSetSel instead */
+ if (dwStyle & LBS_MULTIPLESEL ) return 0;
+ /* unselect all previously selected */
+ if (dwStyle & LBS_EXTENDEDSEL )
+ ListBoxSetSel(lphl,-1,0);
+ else
+ /* unselect previous item */
if (lphl->ItemFocused != -1) {
lpls = ListBoxGetItem(lphl, lphl->ItemFocused);
if (lpls == 0) return LB_ERR;
@@ -558,7 +596,9 @@
{
LPLISTSTRUCT lpls;
- if (!(lphl->dwStyle & LBS_MULTIPLESEL)) return 0;
+ if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) &
+ (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
+ return 0;
if (wIndex == (UINT)-1) {
for (lpls = lphl->lpFirst; lpls != NULL; lpls = lpls->lpNext) {
@@ -584,6 +624,7 @@
return lpls->itemState;
}
+/* ------------------------- dir listing ------------------------ */
int ListBoxDirectory(LPHEADLIST lphl, UINT attrib, LPSTR filespec)
{
@@ -648,6 +689,7 @@
return 1;
}
+/* ------------------------- dimensions ------------------------- */
int ListBoxGetItemRect(LPHEADLIST lphl, WORD wIndex, LPRECT lprect)
{
@@ -663,7 +705,7 @@
{
LPLISTSTRUCT lpls;
- if (!(lphl->dwStyle & LBS_OWNERDRAWVARIABLE)) {
+ if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & LBS_OWNERDRAWVARIABLE)) {
lphl->StdItemHeight = (short)height;
return 0;
}
@@ -675,6 +717,7 @@
return 0;
}
+/* -------------------------- string search ------------------------ */
int ListBoxFindNextMatch(LPHEADLIST lphl, WORD wChar)
{
@@ -706,11 +749,13 @@
static LONG LBCreate(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl;
+ LONG dwStyle = GetWindowLong(hwnd,GWL_STYLE);
RECT rect;
- CreateListBoxStruct(hwnd, ODT_LISTBOX, GetWindowLong(hwnd,GWL_STYLE), GetParent(hwnd));
+ CreateListBoxStruct(hwnd, ODT_LISTBOX, dwStyle, GetParent(hwnd));
lphl = ListBoxGetStorageHeader(hwnd);
- dprintf_listbox(stddeb,"ListBox WM_CREATE %p !\n", lphl);
+ dprintf_listbox(stddeb,"ListBox created: lphl = %p dwStyle = "NPFMT":"NPFMT"\n",
+ lphl, HIWORD(dwStyle), LOWORD(dwStyle));
GetClientRect(hwnd,&rect);
lphl->ColumnsWidth = rect.right - rect.left;
@@ -731,7 +776,7 @@
ListBoxResetContent(lphl);
DestroyListBoxStruct(lphl);
- dprintf_listbox(stddeb,"ListBox WM_DESTROY %p !\n", lphl);
+ dprintf_listbox(stddeb,"ListBox destroyed: lphl = %p\n",lphl);
return 0;
}
@@ -850,6 +895,7 @@
WORD wRet;
int y;
RECT rectsel;
+ LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
SetFocus(hwnd);
SetCapture(hwnd);
@@ -860,19 +906,32 @@
if (y == -1)
return 0;
- if (lphl->dwStyle & LBS_MULTIPLESEL) {
+ if (dwStyle & LBS_MULTIPLESEL) {
lphl->ItemFocused = y;
wRet = ListBoxGetSel(lphl, y);
ListBoxSetSel(lphl, y, !wRet);
+
+ InvalidateRect(hwnd, NULL, TRUE);
} else {
ListBoxSetCurSel(lphl, y);
- }
- if (lphl->dwStyle & LBS_MULTIPLESEL)
- ListBoxSendNotification(lphl, hwnd, LBN_SELCHANGE);
ListBoxGetItemRect(lphl, y, &rectsel);
+ InvalidateRect(hwnd, &rectsel, TRUE);
+ if(lphl->PrevFocused) {
+ ListBoxGetItemRect(lphl, lphl->PrevFocused, &rectsel);
+ InvalidateRect(hwnd, &rectsel, TRUE);
+ }
+ }
- InvalidateRect(hwnd, NULL, TRUE);
+ if (dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL))
+ ListBoxSendNotification(lphl, LBN_SELCHANGE);
+
+ if (dwStyle & LBS_NOTIFY)
+ SendMessage(lphl->hParent, WM_LBTRACKPOINT, y, lParam);
+
+ if (GetWindowLong(lphl->hSelf,GWL_EXSTYLE) & WS_EX_DRAGDETECT)
+ if( DragDetect(lphl->hSelf,MAKEPOINT(lParam)) )
+ SendMessage(lphl->hParent, WM_BEGINDRAG,0,0L);
return 0;
}
@@ -887,7 +946,7 @@
if (GetCapture() == hwnd) ReleaseCapture();
if (lphl->PrevFocused != lphl->ItemFocused)
- ListBoxSendNotification(lphl, hwnd, LBN_SELCHANGE);
+ ListBoxSendNotification(lphl, LBN_SELCHANGE);
return 0;
}
@@ -919,6 +978,7 @@
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
int y;
WORD wRet;
+ LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
RECT rect, rectsel; /* XXX Broken */
dprintf_listbox(stddeb,"LBMouseMove %d %d\n",SLOWORD(lParam),SHIWORD(lParam));
@@ -947,14 +1007,16 @@
if (wRet == lphl->ItemFocused) {
return 0;
}
- if (lphl->dwStyle & LBS_MULTIPLESEL) {
+ if (dwStyle & LBS_MULTIPLESEL) {
lphl->ItemFocused = wRet;
- ListBoxSendNotification(lphl, hwnd, LBN_SELCHANGE);
+ ListBoxSendNotification(lphl, LBN_SELCHANGE);
} else {
ListBoxSetCurSel(lphl, wRet);
+ if(dwStyle & LBS_EXTENDEDSEL)
+ ListBoxSendNotification(lphl, LBN_SELCHANGE);
}
ListBoxGetItemRect(lphl, wRet, &rectsel);
- InvalidateRect(hwnd, NULL, TRUE);
+ InvalidateRect(hwnd, &rectsel, TRUE);
}
}
}
@@ -964,20 +1026,42 @@
/***********************************************************************
* LBKeyDown
+ *
+ * Doesn't yet handle properly VK_SHIFT with LB_EXTENDEDSEL
*/
static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
- WORD newFocused = lphl->ItemFocused;
+ LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
+ WORD newFocused = 0xFFFF;
+ RECT rect;
- if (wParam == VK_SPACE) {
- if (lphl->dwStyle & LBS_MULTIPLESEL) {
- WORD wRet = ListBoxGetSel(lphl, lphl->ItemFocused);
- ListBoxSetSel(lphl, lphl->ItemFocused, !wRet);
- }
- return 0;
+ ListBoxGetItemRect(lphl,lphl->ItemFocused,&rect);
+ switch(wParam)
+ {
+ /* ugly kludge that belongs in TranslateMessage */
+
+ case VK_HOME:
+ case VK_END:
+ case VK_LEFT:
+ case VK_RIGHT:
+ case VK_UP:
+ case VK_DOWN:
+ case VK_PRIOR:
+ case VK_NEXT:
+ if ( dwStyle & LBS_WANTKEYBOARDINPUT )
+ {
+ newFocused = (WORD)(INT)SendMessage(lphl->hParent,WM_VKEYTOITEM,
+ wParam,MAKELPARAM(lphl->ItemFocused,hwnd));
+ if ( newFocused == 0xFFFE ) return 0L;
}
- switch(wParam) {
+ if ( newFocused == 0xFFFF )
+ {
+ newFocused = lphl->ItemFocused;
+
+ /* nested switch */
+ switch(wParam)
+ {
case VK_HOME:
newFocused = 0;
break;
@@ -985,7 +1069,7 @@
newFocused = lphl->ItemsCount - 1;
break;
case VK_LEFT:
- if (lphl->dwStyle & LBS_MULTICOLUMN) {
+ if (dwStyle & LBS_MULTICOLUMN) {
if (newFocused >= lphl->ItemsPerColumn) {
newFocused -= lphl->ItemsPerColumn;
} else {
@@ -997,19 +1081,16 @@
if (newFocused > 0) newFocused--;
break;
case VK_RIGHT:
- if (lphl->dwStyle & LBS_MULTICOLUMN) {
+ if (dwStyle & LBS_MULTICOLUMN)
newFocused += lphl->ItemsPerColumn;
- }
break;
case VK_DOWN:
newFocused++;
break;
case VK_PRIOR:
- if (newFocused > lphl->ItemsVisible) {
+ if (newFocused > lphl->ItemsVisible)
newFocused -= lphl->ItemsVisible;
- } else {
- newFocused = 0;
- }
+ else newFocused = 0;
break;
case VK_NEXT:
newFocused += lphl->ItemsVisible;
@@ -1017,19 +1098,49 @@
default:
return 0;
}
+ /* end of nested switch */
+ }
+ break;
+ case VK_SPACE:
+ if (dwStyle & LBS_MULTIPLESEL)
+ {
+ WORD wRet = ListBoxGetSel(lphl, lphl->ItemFocused);
+ ListBoxSetSel(lphl, lphl->ItemFocused, !wRet);
+ }
+ return 0;
+
+ /* chars are handled in LBChar */
+ default:
+ return 0;
+ }
+
+ /* at this point newFocused is set up */
if (newFocused >= lphl->ItemsCount)
newFocused = lphl->ItemsCount - 1;
- if (!(lphl->dwStyle & LBS_MULTIPLESEL)) {
+ if (!(dwStyle & LBS_MULTIPLESEL))
+ {
ListBoxSetCurSel(lphl, newFocused);
- ListBoxSendNotification(lphl, hwnd, LBN_SELCHANGE);
+ ListBoxSendNotification(lphl, LBN_SELCHANGE);
}
lphl->ItemFocused = newFocused;
- ListBoxScrollToFocus(lphl);
- SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
+
+ if( ListBoxScrollToFocus(lphl) || (dwStyle &
+ (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) )
InvalidateRect(hwnd, NULL, TRUE);
+ else
+ {
+ InvalidateRect(hwnd, &rect, TRUE);
+ if( newFocused < 0x8000 )
+ {
+ ListBoxGetItemRect(lphl, newFocused, &rect);
+ InvalidateRect(hwnd, &rect, TRUE);
+ }
+ }
+
+ SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
return 0;
}
@@ -1040,21 +1151,34 @@
static LONG LBChar(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
- WORD newFocused;
+ LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
+ WORD newFocused = 0xFFFF;
+ if ( (dwStyle & LBS_WANTKEYBOARDINPUT) && !(lphl->HasStrings))
+ {
+ newFocused = (WORD)(INT)SendMessage(lphl->hParent,WM_CHARTOITEM,
+ wParam,MAKELPARAM(lphl->ItemFocused,hwnd));
+ if ( newFocused == 0xFFFE ) return 0L;
+ }
+
+ if (newFocused == 0xFFFF )
newFocused = ListBoxFindNextMatch(lphl, wParam);
+
if (newFocused == (WORD)LB_ERR) return 0;
if (newFocused >= lphl->ItemsCount)
newFocused = lphl->ItemsCount - 1;
- if (!(lphl->dwStyle & LBS_MULTIPLESEL)) {
+
+ if (!(dwStyle & LBS_MULTIPLESEL))
+ {
ListBoxSetCurSel(lphl, newFocused);
- ListBoxSendNotification(lphl, hwnd, LBN_SELCHANGE);
+ ListBoxSendNotification(lphl, LBN_SELCHANGE);
}
lphl->ItemFocused = newFocused;
ListBoxScrollToFocus(lphl);
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
+
InvalidateRect(hwnd, NULL, TRUE);
return 0;
@@ -1095,6 +1219,7 @@
static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
+ LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
LPLISTSTRUCT lpls;
PAINTSTRUCT ps;
HBRUSH hBrush;
@@ -1127,7 +1252,7 @@
FillRect(hdc, &rect, hBrush);
maxwidth = rect.right;
- if (lphl->dwStyle & LBS_MULTICOLUMN) {
+ if (dwStyle & LBS_MULTICOLUMN) {
rect.right = lphl->ColumnsWidth;
}
lpls = lphl->lpFirst;
@@ -1142,7 +1267,7 @@
height = lpls->mis.itemHeight;
if (top > rect.bottom) {
- if (lphl->dwStyle & LBS_MULTICOLUMN) {
+ if (dwStyle & LBS_MULTICOLUMN) {
lphl->ItemsPerColumn = MAX(lphl->ItemsPerColumn, ipc);
ipc = 0;
top = 0;
@@ -1159,7 +1284,7 @@
lpls->itemRect.left = rect.left;
lpls->itemRect.right = rect.right;
- dprintf_listbox(stddeb,"drawing item: %d %d %d %d %d\n",rect.left,top,rect.right,top+height,lpls->itemState);
+ dprintf_listbox(stddeb,"drawing item: %ld %d %ld %d %d\n",(LONG)rect.left,top,(LONG)rect.right,top+height,lpls->itemState);
if (lphl->OwnerDrawn) {
ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE, 0);
if (lpls->itemState)
@@ -1370,7 +1495,7 @@
static LONG LBGetSel(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
- return ListBoxGetSel(lphl, wParam);
+ return (ListBoxGetSel(lphl, wParam) )? 1 : 0;
}
/***********************************************************************
@@ -1381,15 +1506,19 @@
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LPLISTSTRUCT lpls;
int cnt = 0;
+ int items = 0;
- if (!(lphl->dwStyle & LBS_MULTIPLESEL)) return LB_ERR;
+ if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) &
+ (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
+ return LB_ERR;
- lpls = lphl->lpFirst;
-
- while (lpls != NULL) {
- if (lpls->itemState > 0) cnt++;
-
- lpls = lpls->lpNext;
+ for( lpls = lphl->lpFirst;
+ lpls;
+ lpls = lpls->lpNext )
+ {
+ items++;
+ if (lpls->itemState )
+ cnt++;
}
return cnt;
@@ -1405,7 +1534,9 @@
int cnt, idx;
int *lpItems = PTR_SEG_TO_LIN(lParam);
- if (!(lphl->dwStyle & LBS_MULTIPLESEL)) return LB_ERR;
+ if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) &
+ (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
+ return LB_ERR;
if (wParam == 0) return 0;
@@ -1481,7 +1612,9 @@
WORD last = HIWORD(lParam);
BOOL select = wParam;
- if (!(lphl->dwStyle & LBS_MULTIPLESEL)) return LB_ERR;
+ if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) &
+ (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
+ return LB_ERR;
if (first >= lphl->ItemsCount ||
last >= lphl->ItemsCount) return LB_ERR;
@@ -1509,7 +1642,7 @@
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
- if (!(lphl->dwStyle & LBS_MULTIPLESEL)) return 0;
+ if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & LBS_MULTIPLESEL)) return 0;
if (wParam >= lphl->ItemsCount) return LB_ERR;
lphl->ItemFocused = wParam;
@@ -1650,6 +1783,20 @@
}
/***********************************************************************
+ * LBPassToParent
+ */
+static LRESULT LBPassToParent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ WND* ptrWnd = WIN_FindWndPtr(hwnd);
+
+ if( ptrWnd )
+ if( /* !(ptrWnd->dwExStyle & WS_EX_NOPARENTNOTIFY) && */
+ ptrWnd->hwndParent )
+ return SendMessage(ptrWnd->hwndParent,message,wParam,lParam);
+ return 0;
+}
+
+/***********************************************************************
* ListBoxWndProc
*/
LRESULT ListBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
@@ -1702,6 +1849,24 @@
case LB_SETSEL: return LBSetSel(hwnd, wParam, lParam);
case LB_SETTOPINDEX: return LBSetTopIndex(hwnd, wParam, lParam);
case LB_SETITEMHEIGHT: return LBSetItemHeight(hwnd, wParam, lParam);
+
+ case WM_DROPFILES: return LBPassToParent(hwnd, message, wParam, lParam);
+
+ case WM_DROPOBJECT:
+ case WM_QUERYDROPOBJECT:
+ case WM_DRAGSELECT:
+ case WM_DRAGMOVE:
+ {
+ LPDRAGINFO lpDragInfo = (LPDRAGINFO) PTR_SEG_TO_LIN((SEGPTR)lParam);
+ LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
+
+ /* more undocumented Microsoft crap - drag&drop depends on it - AK */
+
+ lpDragInfo->l = ListBoxFindMouse(lphl,lpDragInfo->pt.x,
+ lpDragInfo->pt.y);
+
+ return LBPassToParent(hwnd, message, wParam, lParam);
+ }
}
return DefWindowProc(hwnd, message, wParam, lParam);
diff --git a/controls/menu.c b/controls/menu.c
index b14d1ab..41f5a8b 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -302,7 +302,7 @@
lpitem->rect.bottom += MAX( HIWORD(dwSize), SYSMETRICS_CYMENU );
if (menuBar) lpitem->rect.right += MENU_BAR_ITEMS_SPACE;
- else if ((p = strchr( lpitem->item_text, '\t' )) != NULL)
+ else if ( ( lpitem->item_text != NULL ) && (p = strchr( lpitem->item_text, '\t' )) != NULL)
{
/* Item contains a tab (only meaningful in popup menus) */
lpitem->xTab = check_bitmap_width + MENU_TAB_SPACE +
@@ -312,7 +312,7 @@
}
else
{
- if (strchr( lpitem->item_text, '\b' ))
+ if( ( lpitem->item_text != NULL ) && strchr( lpitem->item_text, '\b' ))
lpitem->rect.right += MENU_TAB_SPACE;
lpitem->xTab = lpitem->rect.right - check_bitmap_width
- arrow_bitmap_width;
diff --git a/debugger/dbg.y b/debugger/dbg.y
index cd3b9cf..fbca65e 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -35,7 +35,7 @@
%token CONT STEP LIST NEXT QUIT HELP BACKTRACE INFO STACK SEGMENTS REGS
%token ENABLE DISABLE BREAK DELETE SET MODE PRINT EXAM DEFINE ABORT
-%token NO_SYMBOL
+%token NO_SYMBOL EOL
%token SYMBOLFILE
%token <string> IDENTIFIER
@@ -68,55 +68,55 @@
input: line { issue_prompt(); }
| input line { issue_prompt(); }
- line: command '\n'
- | '\n'
- | error '\n' { yyerrok; }
+ line: command
+ | EOL
+ | error EOL { yyerrok; }
- command: QUIT { exit(0); }
- | HELP { DEBUG_Help(); }
- | CONT { dbg_exec_mode = EXEC_CONT; return 0; }
- | STEP { dbg_exec_mode = EXEC_STEP_INSTR; return 0; }
- | NEXT { dbg_exec_mode = EXEC_STEP_OVER; return 0; }
- | LIST { DEBUG_List( NULL, 15 ); }
- | LIST addr { DEBUG_List( &$2, 15 ); }
- | ABORT { kill(getpid(), SIGABRT); }
- | SYMBOLFILE IDENTIFIER { DEBUG_ReadSymbolTable( $2 ); }
- | DEFINE IDENTIFIER addr { DEBUG_AddSymbol( $2, &$3 ); }
- | MODE NUM { mode_command($2); }
- | ENABLE NUM { DEBUG_EnableBreakpoint( $2, TRUE ); }
- | DISABLE NUM { DEBUG_EnableBreakpoint( $2, FALSE ); }
- | BREAK '*' addr { DEBUG_AddBreakpoint( &$3 ); }
- | BREAK symbol { DEBUG_AddBreakpoint( &$2 ); }
- | BREAK { DBG_ADDR addr = { CS_reg(DEBUG_context),
+ command: QUIT EOL { exit(0); }
+ | HELP EOL { DEBUG_Help(); }
+ | CONT EOL { dbg_exec_mode = EXEC_CONT; return 0; }
+ | STEP EOL { dbg_exec_mode = EXEC_STEP_INSTR; return 0; }
+ | NEXT EOL { dbg_exec_mode = EXEC_STEP_OVER; return 0; }
+ | LIST EOL { DEBUG_List( NULL, 15 ); }
+ | LIST addr EOL { DEBUG_List( &$2, 15 ); }
+ | ABORT EOL { kill(getpid(), SIGABRT); }
+ | SYMBOLFILE IDENTIFIER EOL { DEBUG_ReadSymbolTable( $2 ); }
+ | DEFINE IDENTIFIER addr EOL { DEBUG_AddSymbol( $2, &$3 ); }
+ | MODE NUM EOL { mode_command($2); }
+ | ENABLE NUM EOL { DEBUG_EnableBreakpoint( $2, TRUE ); }
+ | DISABLE NUM EOL { DEBUG_EnableBreakpoint( $2, FALSE ); }
+ | BREAK '*' addr EOL { DEBUG_AddBreakpoint( &$3 ); }
+ | BREAK symbol EOL { DEBUG_AddBreakpoint( &$2 ); }
+ | BREAK EOL { DBG_ADDR addr = { CS_reg(DEBUG_context),
EIP_reg(DEBUG_context) };
DEBUG_AddBreakpoint( &addr );
}
- | DELETE BREAK NUM { DEBUG_DelBreakpoint( $3 ); }
- | BACKTRACE { DEBUG_BackTrace(); }
+ | DELETE BREAK NUM EOL { DEBUG_DelBreakpoint( $3 ); }
+ | BACKTRACE EOL { DEBUG_BackTrace(); }
| infocmd
| x_command
| print_command
| deposit_command
deposit_command:
- SET REG '=' expr { DEBUG_SetRegister( $2, $4 ); }
- | SET '*' addr '=' expr { DEBUG_WriteMemory( &$3, $5 ); }
- | SET IDENTIFIER '=' addr { if (!DEBUG_SetSymbolValue( $2, &$4 ))
- {
- fprintf( stderr,
+ SET REG '=' expr EOL { DEBUG_SetRegister( $2, $4 ); }
+ | SET '*' addr '=' expr EOL { DEBUG_WriteMemory( &$3, $5 ); }
+ | SET IDENTIFIER '=' addr EOL { if (!DEBUG_SetSymbolValue( $2, &$4 ))
+ {
+ fprintf( stderr,
"Symbol %s not found\n", $2 );
- YYERROR;
+ YYERROR;
+ }
}
- }
x_command:
- EXAM addr { DEBUG_ExamineMemory( &$2, 1, 'x'); }
- | EXAM FORMAT addr { DEBUG_ExamineMemory( &$3, $2>>8, $2&0xff ); }
+ EXAM addr EOL { DEBUG_ExamineMemory( &$2, 1, 'x'); }
+ | EXAM FORMAT addr EOL { DEBUG_ExamineMemory( &$3, $2>>8, $2&0xff ); }
print_command:
- PRINT addr { DEBUG_Print( &$2, 1, 'x' ); }
- | PRINT FORMAT addr { DEBUG_Print( &$3, $2 >> 8, $2 & 0xff ); }
+ PRINT addr EOL { DEBUG_Print( &$2, 1, 'x' ); }
+ | PRINT FORMAT addr EOL { DEBUG_Print( &$3, $2 >> 8, $2 & 0xff ); }
symbol: IDENTIFIER { if (!DEBUG_GetSymbolValue( $1, &$$ ))
{
@@ -175,11 +175,11 @@
$$ = DEBUG_ReadMemory( &addr ); }
| '*' segaddr %prec OP_DEREF { $$ = DEBUG_ReadMemory( &$2 ); }
- infocmd: INFO REGS { DEBUG_InfoRegisters(); }
- | INFO STACK { DEBUG_InfoStack(); }
- | INFO BREAK { DEBUG_InfoBreakpoints(); }
- | INFO SEGMENTS { LDT_Print( 0, -1 ); }
- | INFO SEGMENTS expr { LDT_Print( SELECTOR_TO_ENTRY($3), 1 ); }
+ infocmd: INFO REGS EOL { DEBUG_InfoRegisters(); }
+ | INFO STACK EOL { DEBUG_InfoStack(); }
+ | INFO BREAK EOL { DEBUG_InfoBreakpoints(); }
+ | INFO SEGMENTS EOL { LDT_Print( 0, -1 ); }
+ | INFO SEGMENTS expr EOL { LDT_Print( SELECTOR_TO_ENTRY($3), 1 ); }
%%
diff --git a/debugger/debug.l b/debugger/debug.l
index c46eb10..e6de8fc 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -34,7 +34,7 @@
%%
-\n { syntax_error = 0; return '\n'; } /*Indicates end of command*/
+\n { syntax_error = 0; return EOL; } /*Indicates end of command*/
"||" { return OP_LOR; }
"&&" { return OP_LAND; }
@@ -82,7 +82,7 @@
info|inf|in { return INFO; }
show|sho|sh { return INFO; }
-list|l { return LIST; }
+list|lis|li|l { return LIST; }
segments|segment|segm|seg|se { return SEGMENTS; }
break|brea|bre|br|b { return BREAK; }
enable|enabl|enab|ena { return ENABLE;}
diff --git a/if1632/advapi32.spec b/if1632/advapi32.spec
index 8e33899..2676a5c 100644
--- a/if1632/advapi32.spec
+++ b/if1632/advapi32.spec
@@ -68,7 +68,7 @@
0064 stub GetSidSubAuthority
0065 stub GetSidSubAuthorityCount
0066 stub GetTokenInformation
-0067 stub GetUserNameA
+0067 stdcall GetUserNameA(ptr ptr) GetUserNameA
0068 stub GetUserNameW
0069 stub ImpersonateLoggedOnUser
0070 stub ImpersonateNamedPipeClient
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 5dd5593..4249cbd 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -246,8 +246,8 @@
364 pascal16 SetPaletteEntries(word word word ptr) SetPaletteEntries
365 pascal16 RealizeDefaultPalette(word) RealizeDefaultPalette
366 stub UpdateColors
-367 stub AnimatePalette
-368 stub ResizePalette
+367 pascal16 AnimatePalette(word word word ptr) AnimatePalette
+368 pascal16 ResizePalette(word word) ResizePalette
370 pascal16 GetNearestPaletteIndex(word long) GetNearestPaletteIndex
372 pascal16 ExtFloodFill(word s_word s_word long word) ExtFloodFill
373 pascal16 SetSystemPaletteUse(word word) SetSystemPaletteUse
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 9a5b15f..7f9b7c6 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -114,8 +114,8 @@
115 pascal OutputDebugString(ptr) OutputDebugString
116 stub InitLib
117 pascal16 OldYield() OldYield
-118 stub GetTaskQueueDS
-119 stub GetTaskQueueES
+118 register GetTaskQueueDS() GetTaskQueueDS
+119 register GetTaskQueueES() GetTaskQueueES
120 stub UndefDynLink
121 pascal16 LocalShrink(word word) LocalShrink
122 pascal16 IsTaskLocked() IsTaskLocked
@@ -164,7 +164,7 @@
164 pascal16 GlobalLRUNewest(word) GlobalLRUNewest
165 stub A20Proc
166 pascal16 WinExec(ptr word) WinExec
-167 stub GetExpWinVer
+167 pascal16 GetExpWinVer(word) GetExpWinVer
168 pascal16 DirectResAlloc(word word word) DirectResAlloc
169 pascal GetFreeSpace(word) GetFreeSpace
170 pascal16 AllocCStoDSAlias(word) AllocCStoDSAlias
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 1987061..e9e9abf 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -24,7 +24,7 @@
0020 stub ClearCommBreak
0021 stub ClearCommError
0022 stub CloseConsoleHandle
-0023 stub CloseHandle
+0023 stdcall CloseHandle(long) CloseHandle
0024 stub CloseProfileUserMapping
0025 stub CmdBatNotification
0026 stub CommConfigDialogA
@@ -46,7 +46,7 @@
0042 stub CreateDirectoryW
0043 stub CreateEventA
0044 stub CreateEventW
-0045 stub CreateFileA
+0045 stdcall CreateFileA(ptr long long ptr long long long) CreateFileA
0046 stub CreateFileMappingA
0047 stub CreateFileMappingW
0048 stub CreateFileW
@@ -101,7 +101,7 @@
0097 stub EnumTimeFormatsW
0098 stub EraseTape
0099 stub EscapeCommFunction
-0100 stub ExitProcess
+0100 stdcall ExitProcess(long) ExitProcess
0101 stub ExitThread
0102 stub ExitVDM
0103 stub ExpandEnvironmentStringsA
@@ -200,7 +200,7 @@
0196 stub GetCurrentDirectoryA
0197 stub GetCurrentDirectoryW
0198 stub GetCurrentProcess
-0199 stub GetCurrentProcessId
+0199 stdcall GetCurrentProcessId() GetCurrentThreadId
0200 stub GetCurrentThread
0201 stdcall GetCurrentThreadId() GetCurrentThreadId
0202 stub GetDateFormatA
@@ -220,7 +220,7 @@
0216 stub GetExitCodeThread
0217 stub GetFileAttributesA
0218 stub GetFileAttributesW
-0219 stub GetFileInformationByHandle
+0219 stdcall GetFileInformationByHandle(long ptr) GetFileInformationByHandle
0220 stub GetFileSize
0221 stub GetFileTime
0222 stdcall GetFileType(long) GetFileType
@@ -238,7 +238,7 @@
0234 stub GetMailslotInfo
0235 stdcall GetModuleFileNameA(long ptr long) GetModuleFileNameA
0236 stub GetModuleFileNameW
-0237 stdcall GetModuleHandleA(ptr) GetModuleHandle
+0237 stdcall GetModuleHandleA(ptr) WIN32_GetModuleHandle
0238 stub GetModuleHandleW
0239 stub GetNamedPipeHandleStateA
0240 stub GetNamedPipeHandleStateW
@@ -265,7 +265,7 @@
0261 stub GetProcessShutdownParameters
0262 stub GetProcessTimes
0263 stub GetProcessWorkingSetSize
-0264 stub GetProfileIntA
+0264 stdcall GetProfileIntA(ptr ptr long) GetProfileInt
0265 stub GetProfileIntW
0266 stub GetProfileSectionA
0267 stub GetProfileSectionW
@@ -394,7 +394,7 @@
0389 stub MoveFileExW
0390 stub MoveFileW
0391 stub MulDiv
-0392 stub MultiByteToWideChar
+0392 stdcall MultiByteToWideChar(long long ptr long ptr long) MultiByteToWideChar
0393 stub OpenConsoleW
0394 stub OpenEventA
0395 stub OpenEventW
@@ -430,7 +430,7 @@
0425 stub ReadConsoleOutputCharacterW
0426 stub ReadConsoleOutputW
0427 stub ReadConsoleW
-0428 stub ReadFile
+0428 stdcall ReadFile(long ptr long ptr ptr) ReadFile
0429 stub ReadFileEx
0430 stub ReadProcessMemory
0431 stub RegisterConsoleVDM
@@ -461,7 +461,7 @@
0456 stub SetConsoleActiveScreenBuffer
0457 stub SetConsoleCP
0458 stub SetConsoleCommandHistoryMode
-0459 stub SetConsoleCtrlHandler
+0459 stdcall SetConsoleCtrlHandler(ptr long) SetConsoleCtrlHandler
0460 stub SetConsoleCursor
0461 stub SetConsoleCursorInfo
0462 stub SetConsoleCursorPosition
@@ -610,11 +610,11 @@
0605 stub lstrcmpiA
0606 stub lstrcmpiW
0607 stub lstrcpy
-0608 stub lstrcpyA
+0608 stdcall lstrcpyA(ptr ptr) strcpy
0609 stub lstrcpyW
0610 stub lstrcpyn
0611 stub lstrcpynA
0612 stub lstrcpynW
0613 stub lstrlen
-0614 stub lstrlenA
+0614 stdcall lstrlenA(ptr) strlen
0615 stub lstrlenW
diff --git a/if1632/user.spec b/if1632/user.spec
index 469bbc5..fae1cc0 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -405,13 +405,13 @@
456 pascal16 LoadIconHandler(word word) LoadIconHandler
457 pascal16 DestroyIcon(word) DestroyIcon
458 pascal16 DestroyCursor(word) DestroyCursor
-459 pascal DumpIcon(ptr ptr ptr ptr) DumpIcon
+459 pascal DumpIcon(segptr ptr ptr ptr) DumpIcon
460 pascal16 GetInternalWindowPos(word ptr ptr) GetInternalWindowPos
461 pascal16 SetInternalWindowPos(word word ptr ptr) SetInternalWindowPos
462 pascal16 CalcChildScroll(word word) CalcChildScroll
463 stub ScrollChildren
-464 pascal16 DragObject(word word word word word word) DragObject
-465 stub DragDetect
+464 pascal DragObject(word word word word word word) DragObject
+465 pascal16 DragDetect(word long) DragDetect
466 pascal16 DrawFocusRect(word ptr) DrawFocusRect
470 stub StringFunc
471 pascal16 lstrcmpi(ptr ptr) lstrcmpi
diff --git a/if1632/user32.spec b/if1632/user32.spec
index 3c7927b..c525e30 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -199,7 +199,7 @@
0194 stub ExcludeUpdateRgn
0195 stub ExitWindowsEx
0196 stub FillRect
-0197 stub FindWindowA
+0197 return FindWindowA 8 0
0198 stub FindWindowExA
0199 stub FindWindowExW
0200 stub FindWindowW
@@ -290,7 +290,7 @@
0285 stub GetScrollRange
0286 stub GetShellWindow
0287 stub GetSubMenu
-0288 stub GetSysColor
+0288 stdcall GetSysColor(long) GetSysColor
0289 stub GetSysColorBrush
0290 stub GetSystemMenu
0291 stub GetSystemMetrics
@@ -356,15 +356,15 @@
0351 stub IsZoomed
0352 stub KillSystemTimer
0353 stub KillTimer
-0354 stub LoadAcceleratorsA
+0354 stdcall LoadAcceleratorsA(long ptr) LoadAccelerators
0355 stub LoadAcceleratorsW
-0356 stub LoadBitmapA
+0356 stdcall LoadBitmapA(long ptr) LoadBitmap
0357 stub LoadBitmapW
-0358 stub LoadCursorA
+0358 stdcall LoadCursorA(long ptr) LoadCursor
0359 stub LoadCursorFromFileA
0360 stub LoadCursorFromFileW
0361 stub LoadCursorW
-0362 stub LoadIconA
+0362 stdcall LoadIconA(long ptr) LoadIcon
0363 stub LoadIconW
0364 stub LoadImageA
0365 stub LoadImageW
@@ -376,7 +376,7 @@
0371 stub LoadMenuIndirectW
0372 stub LoadMenuW
0373 stub LoadRemoteFonts
-0374 stub LoadStringA
+0374 stdcall LoadStringA(long long ptr long) LoadString
0375 stub LoadStringW
0376 stub LockWindowStation
0377 stub LockWindowUpdate
@@ -473,7 +473,7 @@
0468 stub SetClassWord
0469 stub SetClipboardData
0470 stub SetClipboardViewer
-0471 stub SetCursor
+0471 stdcall SetCursor(long) SetCursor
0472 stub SetCursorContents
0473 stub SetCursorPos
0474 stub SetDebugErrorLevel
@@ -495,7 +495,7 @@
0490 stub SetMenuItemInfoA
0491 stub SetMenuItemInfoW
0492 stub SetMessageExtraInfo
-0493 stub SetMessageQueue
+0493 stdcall SetMessageQueue(long) SetMessageQueue
0494 stub SetParent
0495 stub SetProcessWindowStation
0496 stub SetPropA
@@ -541,7 +541,7 @@
0536 stub SwapMouseButton
0537 stub SwitchDesktop
0538 stub SwitchToThisWindow
-0539 stub SystemParametersInfoA
+0539 stdcall SystemParametersInfoA(long long ptr long) SystemParametersInfo
0540 stub SystemParametersInfoW
0541 stub TabbedTextOutA
0542 stub TabbedTextOutW
@@ -586,7 +586,7 @@
0581 stub WindowFromPoint
0582 stub keybd_event
0583 stub mouse_event
-0584 stub wsprintfA
+0584 cdecl wsprintfA(ptr ptr ...) wsprintf
0585 stub wsprintfW
0586 stub wvsprintfA
0587 stub wvsprintfW
diff --git a/include/bitmaps/ocr_bummer b/include/bitmaps/ocr_bummer
new file mode 100644
index 0000000..fa31df1
--- /dev/null
+++ b/include/bitmaps/ocr_bummer
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_bummer[] = {
+"32 32 3 1 5 9",
+" s black c black",
+"X s white c white",
+". s None c None",
+"............ .............",
+"........... XXXXXXX ............",
+"......... XXXXXXXXX ...........",
+"........ XXXXXXXXXXXXX .........",
+"....... XX XXXXXXX XX ........",
+"....... X .. XXXXX .. X ........",
+"....... X ... XXX ... X ........",
+"....... X ... XXX ... X ........",
+"...... XX ... XXX ... XX .......",
+"...... XXX XXXXX XXX .......",
+"...... XXXXXXXX XXXXXXXX .......",
+"...... XXXXXXX . XXXXXXX .......",
+". .... XXXXXX . XXXXXX ... ...",
+" XX .... XXXX . XXXX ... XX ..",
+". XX .... XX XX .... X ...",
+" XXXXX .. XXXXXXX .. XXXX ..",
+" XX XXX XXXXXXX XXX XX ..",
+". ... XXX X XXX .. ...",
+"......... XXX ..........",
+".......... XXXX ..........",
+"...... XXXX XXX .......",
+". XXX ...... XXX ...",
+" XXXXX ............. XXXX ..",
+" XX ................... XX ..",
+". X ...................... X ...",
+". X ...................... X ...",
+".. ........................ ....",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................"};
diff --git a/include/bitmaps/ocr_dragobject b/include/bitmaps/ocr_dragobject
new file mode 100644
index 0000000..def5290
--- /dev/null
+++ b/include/bitmaps/ocr_dragobject
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_dragobject[] = {
+"32 32 3 1 5 9",
+" s black c black",
+". s None c None",
+"X s white c white",
+" .......................",
+" XXXXXXX .....................",
+" XXXXXXX X ....................",
+" XXXXXXX ....................",
+" XXXXXXXXXX ....................",
+" XXXXXXXXXX ....................",
+" XXXXXXXXXX ....................",
+" XXXXXXXXXX ....................",
+" XXXXXXXXXX ....................",
+" XXXX XXXXX ....................",
+" XXXX XXXX ....................",
+" XXXX X XXX ....................",
+" XXXX XX XX ....................",
+" XXXX XXX X ....................",
+" XXXX .....................",
+"..... XXXXX ....................",
+"..... XXXXXX ...................",
+"..... XXXXXXX ..................",
+"..... XXXXXXXX .................",
+"..... XXXXX ................",
+"..... XX X ....................",
+"..... X . XX ...................",
+"..... ... X ...................",
+"..... .... XX ..................",
+"........... X ..................",
+"........... XX .................",
+"............ X .................",
+"............. ..................",
+"................................",
+"................................",
+"................................",
+"................................"};
diff --git a/include/debug.h b/include/debug.h
index a67f722..928922e 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -37,6 +37,7 @@
#undef DEBUG_DRIVER
#undef DEBUG_EDIT
#undef DEBUG_ENUM
+#undef DEBUG_ENV
#undef DEBUG_EVENT
#undef DEBUG_EXEC
#undef DEBUG_FILE
@@ -45,6 +46,7 @@
#undef DEBUG_GDI
#undef DEBUG_GLOBAL
#undef DEBUG_GRAPHICS
+#undef DEBUG_HOOK
#undef DEBUG_ICON
#undef DEBUG_INT
#undef DEBUG_KEY
@@ -89,6 +91,7 @@
#undef DEBUG_UTILITY
#undef DEBUG_VXD
#undef DEBUG_WIN
+#undef DEBUG_WIN32
#undef DEBUG_WINSOCK
#endif
@@ -114,6 +117,7 @@
#define DEBUG_DRIVER
#define DEBUG_EDIT
#define DEBUG_ENUM
+#define DEBUG_ENV
#define DEBUG_EVENT
#define DEBUG_EXEC
#define DEBUG_FILE
@@ -122,6 +126,7 @@
#define DEBUG_GDI
#define DEBUG_GLOBAL
#define DEBUG_GRAPHICS
+#define DEBUG_HOOK
#define DEBUG_ICON
#define DEBUG_INT
#define DEBUG_KEY
@@ -166,6 +171,7 @@
#define DEBUG_UTILITY
#define DEBUG_VXD
#define DEBUG_WIN
+#define DEBUG_WIN32
#define DEBUG_WINSOCK
#endif
@@ -277,6 +283,11 @@
#else
0,
#endif
+#ifdef DEBUG_ENV
+ 1,
+#else
+ 0,
+#endif
#ifdef DEBUG_EVENT
1,
#else
@@ -317,6 +328,11 @@
#else
0,
#endif
+#ifdef DEBUG_HOOK
+ 1,
+#else
+ 0,
+#endif
#ifdef DEBUG_ICON
1,
#else
@@ -537,6 +553,11 @@
#else
0,
#endif
+#ifdef DEBUG_WIN32
+ 1,
+#else
+ 0,
+#endif
#ifdef DEBUG_WINSOCK
1,
#else
@@ -823,8 +844,21 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_event if(!debug_msg_enabled[21]) ; else fprintf
-#define debugging_event debug_msg_enabled[21]
+#define dprintf_env if(!debug_msg_enabled[21]) ; else fprintf
+#define debugging_env debug_msg_enabled[21]
+#else
+#ifdef DEBUG_ENV
+#define dprintf_env fprintf
+#define debugging_env 1
+#else
+#define dprintf_env while(0) fprintf
+#define debugging_env 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_event if(!debug_msg_enabled[22]) ; else fprintf
+#define debugging_event debug_msg_enabled[22]
#else
#ifdef DEBUG_EVENT
#define dprintf_event fprintf
@@ -836,8 +870,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_exec if(!debug_msg_enabled[22]) ; else fprintf
-#define debugging_exec debug_msg_enabled[22]
+#define dprintf_exec if(!debug_msg_enabled[23]) ; else fprintf
+#define debugging_exec debug_msg_enabled[23]
#else
#ifdef DEBUG_EXEC
#define dprintf_exec fprintf
@@ -849,8 +883,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_file if(!debug_msg_enabled[23]) ; else fprintf
-#define debugging_file debug_msg_enabled[23]
+#define dprintf_file if(!debug_msg_enabled[24]) ; else fprintf
+#define debugging_file debug_msg_enabled[24]
#else
#ifdef DEBUG_FILE
#define dprintf_file fprintf
@@ -862,8 +896,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_fixup if(!debug_msg_enabled[24]) ; else fprintf
-#define debugging_fixup debug_msg_enabled[24]
+#define dprintf_fixup if(!debug_msg_enabled[25]) ; else fprintf
+#define debugging_fixup debug_msg_enabled[25]
#else
#ifdef DEBUG_FIXUP
#define dprintf_fixup fprintf
@@ -875,8 +909,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_font if(!debug_msg_enabled[25]) ; else fprintf
-#define debugging_font debug_msg_enabled[25]
+#define dprintf_font if(!debug_msg_enabled[26]) ; else fprintf
+#define debugging_font debug_msg_enabled[26]
#else
#ifdef DEBUG_FONT
#define dprintf_font fprintf
@@ -888,8 +922,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_gdi if(!debug_msg_enabled[26]) ; else fprintf
-#define debugging_gdi debug_msg_enabled[26]
+#define dprintf_gdi if(!debug_msg_enabled[27]) ; else fprintf
+#define debugging_gdi debug_msg_enabled[27]
#else
#ifdef DEBUG_GDI
#define dprintf_gdi fprintf
@@ -901,8 +935,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_global if(!debug_msg_enabled[27]) ; else fprintf
-#define debugging_global debug_msg_enabled[27]
+#define dprintf_global if(!debug_msg_enabled[28]) ; else fprintf
+#define debugging_global debug_msg_enabled[28]
#else
#ifdef DEBUG_GLOBAL
#define dprintf_global fprintf
@@ -914,8 +948,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_graphics if(!debug_msg_enabled[28]) ; else fprintf
-#define debugging_graphics debug_msg_enabled[28]
+#define dprintf_graphics if(!debug_msg_enabled[29]) ; else fprintf
+#define debugging_graphics debug_msg_enabled[29]
#else
#ifdef DEBUG_GRAPHICS
#define dprintf_graphics fprintf
@@ -927,8 +961,21 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_icon if(!debug_msg_enabled[29]) ; else fprintf
-#define debugging_icon debug_msg_enabled[29]
+#define dprintf_hook if(!debug_msg_enabled[30]) ; else fprintf
+#define debugging_hook debug_msg_enabled[30]
+#else
+#ifdef DEBUG_HOOK
+#define dprintf_hook fprintf
+#define debugging_hook 1
+#else
+#define dprintf_hook while(0) fprintf
+#define debugging_hook 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_icon if(!debug_msg_enabled[31]) ; else fprintf
+#define debugging_icon debug_msg_enabled[31]
#else
#ifdef DEBUG_ICON
#define dprintf_icon fprintf
@@ -940,8 +987,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_int if(!debug_msg_enabled[30]) ; else fprintf
-#define debugging_int debug_msg_enabled[30]
+#define dprintf_int if(!debug_msg_enabled[32]) ; else fprintf
+#define debugging_int debug_msg_enabled[32]
#else
#ifdef DEBUG_INT
#define dprintf_int fprintf
@@ -953,8 +1000,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_key if(!debug_msg_enabled[31]) ; else fprintf
-#define debugging_key debug_msg_enabled[31]
+#define dprintf_key if(!debug_msg_enabled[33]) ; else fprintf
+#define debugging_key debug_msg_enabled[33]
#else
#ifdef DEBUG_KEY
#define dprintf_key fprintf
@@ -966,8 +1013,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_keyboard if(!debug_msg_enabled[32]) ; else fprintf
-#define debugging_keyboard debug_msg_enabled[32]
+#define dprintf_keyboard if(!debug_msg_enabled[34]) ; else fprintf
+#define debugging_keyboard debug_msg_enabled[34]
#else
#ifdef DEBUG_KEYBOARD
#define dprintf_keyboard fprintf
@@ -979,8 +1026,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_ldt if(!debug_msg_enabled[33]) ; else fprintf
-#define debugging_ldt debug_msg_enabled[33]
+#define dprintf_ldt if(!debug_msg_enabled[35]) ; else fprintf
+#define debugging_ldt debug_msg_enabled[35]
#else
#ifdef DEBUG_LDT
#define dprintf_ldt fprintf
@@ -992,8 +1039,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_listbox if(!debug_msg_enabled[34]) ; else fprintf
-#define debugging_listbox debug_msg_enabled[34]
+#define dprintf_listbox if(!debug_msg_enabled[36]) ; else fprintf
+#define debugging_listbox debug_msg_enabled[36]
#else
#ifdef DEBUG_LISTBOX
#define dprintf_listbox fprintf
@@ -1005,8 +1052,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_local if(!debug_msg_enabled[35]) ; else fprintf
-#define debugging_local debug_msg_enabled[35]
+#define dprintf_local if(!debug_msg_enabled[37]) ; else fprintf
+#define debugging_local debug_msg_enabled[37]
#else
#ifdef DEBUG_LOCAL
#define dprintf_local fprintf
@@ -1018,8 +1065,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_malloc if(!debug_msg_enabled[36]) ; else fprintf
-#define debugging_malloc debug_msg_enabled[36]
+#define dprintf_malloc if(!debug_msg_enabled[38]) ; else fprintf
+#define debugging_malloc debug_msg_enabled[38]
#else
#ifdef DEBUG_MALLOC
#define dprintf_malloc fprintf
@@ -1031,8 +1078,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_mci if(!debug_msg_enabled[37]) ; else fprintf
-#define debugging_mci debug_msg_enabled[37]
+#define dprintf_mci if(!debug_msg_enabled[39]) ; else fprintf
+#define debugging_mci debug_msg_enabled[39]
#else
#ifdef DEBUG_MCI
#define dprintf_mci fprintf
@@ -1044,8 +1091,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_mcianim if(!debug_msg_enabled[38]) ; else fprintf
-#define debugging_mcianim debug_msg_enabled[38]
+#define dprintf_mcianim if(!debug_msg_enabled[40]) ; else fprintf
+#define debugging_mcianim debug_msg_enabled[40]
#else
#ifdef DEBUG_MCIANIM
#define dprintf_mcianim fprintf
@@ -1057,8 +1104,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_mciwave if(!debug_msg_enabled[39]) ; else fprintf
-#define debugging_mciwave debug_msg_enabled[39]
+#define dprintf_mciwave if(!debug_msg_enabled[41]) ; else fprintf
+#define debugging_mciwave debug_msg_enabled[41]
#else
#ifdef DEBUG_MCIWAVE
#define dprintf_mciwave fprintf
@@ -1070,8 +1117,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_mdi if(!debug_msg_enabled[40]) ; else fprintf
-#define debugging_mdi debug_msg_enabled[40]
+#define dprintf_mdi if(!debug_msg_enabled[42]) ; else fprintf
+#define debugging_mdi debug_msg_enabled[42]
#else
#ifdef DEBUG_MDI
#define dprintf_mdi fprintf
@@ -1083,8 +1130,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_menu if(!debug_msg_enabled[41]) ; else fprintf
-#define debugging_menu debug_msg_enabled[41]
+#define dprintf_menu if(!debug_msg_enabled[43]) ; else fprintf
+#define debugging_menu debug_msg_enabled[43]
#else
#ifdef DEBUG_MENU
#define dprintf_menu fprintf
@@ -1096,8 +1143,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_menucalc if(!debug_msg_enabled[42]) ; else fprintf
-#define debugging_menucalc debug_msg_enabled[42]
+#define dprintf_menucalc if(!debug_msg_enabled[44]) ; else fprintf
+#define debugging_menucalc debug_msg_enabled[44]
#else
#ifdef DEBUG_MENUCALC
#define dprintf_menucalc fprintf
@@ -1109,8 +1156,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_message if(!debug_msg_enabled[43]) ; else fprintf
-#define debugging_message debug_msg_enabled[43]
+#define dprintf_message if(!debug_msg_enabled[45]) ; else fprintf
+#define debugging_message debug_msg_enabled[45]
#else
#ifdef DEBUG_MESSAGE
#define dprintf_message fprintf
@@ -1122,8 +1169,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_metafile if(!debug_msg_enabled[44]) ; else fprintf
-#define debugging_metafile debug_msg_enabled[44]
+#define dprintf_metafile if(!debug_msg_enabled[46]) ; else fprintf
+#define debugging_metafile debug_msg_enabled[46]
#else
#ifdef DEBUG_METAFILE
#define dprintf_metafile fprintf
@@ -1135,8 +1182,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_midi if(!debug_msg_enabled[45]) ; else fprintf
-#define debugging_midi debug_msg_enabled[45]
+#define dprintf_midi if(!debug_msg_enabled[47]) ; else fprintf
+#define debugging_midi debug_msg_enabled[47]
#else
#ifdef DEBUG_MIDI
#define dprintf_midi fprintf
@@ -1148,8 +1195,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_mmio if(!debug_msg_enabled[46]) ; else fprintf
-#define debugging_mmio debug_msg_enabled[46]
+#define dprintf_mmio if(!debug_msg_enabled[48]) ; else fprintf
+#define debugging_mmio debug_msg_enabled[48]
#else
#ifdef DEBUG_MMIO
#define dprintf_mmio fprintf
@@ -1161,8 +1208,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_mmsys if(!debug_msg_enabled[47]) ; else fprintf
-#define debugging_mmsys debug_msg_enabled[47]
+#define dprintf_mmsys if(!debug_msg_enabled[49]) ; else fprintf
+#define debugging_mmsys debug_msg_enabled[49]
#else
#ifdef DEBUG_MMSYS
#define dprintf_mmsys fprintf
@@ -1174,8 +1221,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_mmtime if(!debug_msg_enabled[48]) ; else fprintf
-#define debugging_mmtime debug_msg_enabled[48]
+#define dprintf_mmtime if(!debug_msg_enabled[50]) ; else fprintf
+#define debugging_mmtime debug_msg_enabled[50]
#else
#ifdef DEBUG_MMTIME
#define dprintf_mmtime fprintf
@@ -1187,8 +1234,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_module if(!debug_msg_enabled[49]) ; else fprintf
-#define debugging_module debug_msg_enabled[49]
+#define dprintf_module if(!debug_msg_enabled[51]) ; else fprintf
+#define debugging_module debug_msg_enabled[51]
#else
#ifdef DEBUG_MODULE
#define dprintf_module fprintf
@@ -1200,8 +1247,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_msg if(!debug_msg_enabled[50]) ; else fprintf
-#define debugging_msg debug_msg_enabled[50]
+#define dprintf_msg if(!debug_msg_enabled[52]) ; else fprintf
+#define debugging_msg debug_msg_enabled[52]
#else
#ifdef DEBUG_MSG
#define dprintf_msg fprintf
@@ -1213,8 +1260,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_nonclient if(!debug_msg_enabled[51]) ; else fprintf
-#define debugging_nonclient debug_msg_enabled[51]
+#define dprintf_nonclient if(!debug_msg_enabled[53]) ; else fprintf
+#define debugging_nonclient debug_msg_enabled[53]
#else
#ifdef DEBUG_NONCLIENT
#define dprintf_nonclient fprintf
@@ -1226,8 +1273,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_ole if(!debug_msg_enabled[52]) ; else fprintf
-#define debugging_ole debug_msg_enabled[52]
+#define dprintf_ole if(!debug_msg_enabled[54]) ; else fprintf
+#define debugging_ole debug_msg_enabled[54]
#else
#ifdef DEBUG_OLE
#define dprintf_ole fprintf
@@ -1239,8 +1286,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_palette if(!debug_msg_enabled[53]) ; else fprintf
-#define debugging_palette debug_msg_enabled[53]
+#define dprintf_palette if(!debug_msg_enabled[55]) ; else fprintf
+#define debugging_palette debug_msg_enabled[55]
#else
#ifdef DEBUG_PALETTE
#define dprintf_palette fprintf
@@ -1252,8 +1299,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_profile if(!debug_msg_enabled[54]) ; else fprintf
-#define debugging_profile debug_msg_enabled[54]
+#define dprintf_profile if(!debug_msg_enabled[56]) ; else fprintf
+#define debugging_profile debug_msg_enabled[56]
#else
#ifdef DEBUG_PROFILE
#define dprintf_profile fprintf
@@ -1265,8 +1312,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_prop if(!debug_msg_enabled[55]) ; else fprintf
-#define debugging_prop debug_msg_enabled[55]
+#define dprintf_prop if(!debug_msg_enabled[57]) ; else fprintf
+#define debugging_prop debug_msg_enabled[57]
#else
#ifdef DEBUG_PROP
#define dprintf_prop fprintf
@@ -1278,8 +1325,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_reg if(!debug_msg_enabled[56]) ; else fprintf
-#define debugging_reg debug_msg_enabled[56]
+#define dprintf_reg if(!debug_msg_enabled[58]) ; else fprintf
+#define debugging_reg debug_msg_enabled[58]
#else
#ifdef DEBUG_REG
#define dprintf_reg fprintf
@@ -1291,8 +1338,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_region if(!debug_msg_enabled[57]) ; else fprintf
-#define debugging_region debug_msg_enabled[57]
+#define dprintf_region if(!debug_msg_enabled[59]) ; else fprintf
+#define debugging_region debug_msg_enabled[59]
#else
#ifdef DEBUG_REGION
#define dprintf_region fprintf
@@ -1304,8 +1351,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_relay if(!debug_msg_enabled[58]) ; else fprintf
-#define debugging_relay debug_msg_enabled[58]
+#define dprintf_relay if(!debug_msg_enabled[60]) ; else fprintf
+#define debugging_relay debug_msg_enabled[60]
#else
#ifdef DEBUG_RELAY
#define dprintf_relay fprintf
@@ -1317,8 +1364,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_resource if(!debug_msg_enabled[59]) ; else fprintf
-#define debugging_resource debug_msg_enabled[59]
+#define dprintf_resource if(!debug_msg_enabled[61]) ; else fprintf
+#define debugging_resource debug_msg_enabled[61]
#else
#ifdef DEBUG_RESOURCE
#define dprintf_resource fprintf
@@ -1330,8 +1377,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_scroll if(!debug_msg_enabled[60]) ; else fprintf
-#define debugging_scroll debug_msg_enabled[60]
+#define dprintf_scroll if(!debug_msg_enabled[62]) ; else fprintf
+#define debugging_scroll debug_msg_enabled[62]
#else
#ifdef DEBUG_SCROLL
#define dprintf_scroll fprintf
@@ -1343,8 +1390,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_selector if(!debug_msg_enabled[61]) ; else fprintf
-#define debugging_selector debug_msg_enabled[61]
+#define dprintf_selector if(!debug_msg_enabled[63]) ; else fprintf
+#define debugging_selector debug_msg_enabled[63]
#else
#ifdef DEBUG_SELECTOR
#define dprintf_selector fprintf
@@ -1356,8 +1403,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_sem if(!debug_msg_enabled[62]) ; else fprintf
-#define debugging_sem debug_msg_enabled[62]
+#define dprintf_sem if(!debug_msg_enabled[64]) ; else fprintf
+#define debugging_sem debug_msg_enabled[64]
#else
#ifdef DEBUG_SEM
#define dprintf_sem fprintf
@@ -1369,8 +1416,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_shm if(!debug_msg_enabled[63]) ; else fprintf
-#define debugging_shm debug_msg_enabled[63]
+#define dprintf_shm if(!debug_msg_enabled[65]) ; else fprintf
+#define debugging_shm debug_msg_enabled[65]
#else
#ifdef DEBUG_SHM
#define dprintf_shm fprintf
@@ -1382,8 +1429,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_stress if(!debug_msg_enabled[64]) ; else fprintf
-#define debugging_stress debug_msg_enabled[64]
+#define dprintf_stress if(!debug_msg_enabled[66]) ; else fprintf
+#define debugging_stress debug_msg_enabled[66]
#else
#ifdef DEBUG_STRESS
#define dprintf_stress fprintf
@@ -1395,8 +1442,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_syscolor if(!debug_msg_enabled[65]) ; else fprintf
-#define debugging_syscolor debug_msg_enabled[65]
+#define dprintf_syscolor if(!debug_msg_enabled[67]) ; else fprintf
+#define debugging_syscolor debug_msg_enabled[67]
#else
#ifdef DEBUG_SYSCOLOR
#define dprintf_syscolor fprintf
@@ -1408,8 +1455,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_task if(!debug_msg_enabled[66]) ; else fprintf
-#define debugging_task debug_msg_enabled[66]
+#define dprintf_task if(!debug_msg_enabled[68]) ; else fprintf
+#define debugging_task debug_msg_enabled[68]
#else
#ifdef DEBUG_TASK
#define dprintf_task fprintf
@@ -1421,8 +1468,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_text if(!debug_msg_enabled[67]) ; else fprintf
-#define debugging_text debug_msg_enabled[67]
+#define dprintf_text if(!debug_msg_enabled[69]) ; else fprintf
+#define debugging_text debug_msg_enabled[69]
#else
#ifdef DEBUG_TEXT
#define dprintf_text fprintf
@@ -1434,8 +1481,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_timer if(!debug_msg_enabled[68]) ; else fprintf
-#define debugging_timer debug_msg_enabled[68]
+#define dprintf_timer if(!debug_msg_enabled[70]) ; else fprintf
+#define debugging_timer debug_msg_enabled[70]
#else
#ifdef DEBUG_TIMER
#define dprintf_timer fprintf
@@ -1447,8 +1494,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_toolhelp if(!debug_msg_enabled[69]) ; else fprintf
-#define debugging_toolhelp debug_msg_enabled[69]
+#define dprintf_toolhelp if(!debug_msg_enabled[71]) ; else fprintf
+#define debugging_toolhelp debug_msg_enabled[71]
#else
#ifdef DEBUG_TOOLHELP
#define dprintf_toolhelp fprintf
@@ -1460,8 +1507,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_utility if(!debug_msg_enabled[70]) ; else fprintf
-#define debugging_utility debug_msg_enabled[70]
+#define dprintf_utility if(!debug_msg_enabled[72]) ; else fprintf
+#define debugging_utility debug_msg_enabled[72]
#else
#ifdef DEBUG_UTILITY
#define dprintf_utility fprintf
@@ -1473,8 +1520,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_vxd if(!debug_msg_enabled[71]) ; else fprintf
-#define debugging_vxd debug_msg_enabled[71]
+#define dprintf_vxd if(!debug_msg_enabled[73]) ; else fprintf
+#define debugging_vxd debug_msg_enabled[73]
#else
#ifdef DEBUG_VXD
#define dprintf_vxd fprintf
@@ -1486,8 +1533,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_win if(!debug_msg_enabled[72]) ; else fprintf
-#define debugging_win debug_msg_enabled[72]
+#define dprintf_win if(!debug_msg_enabled[74]) ; else fprintf
+#define debugging_win debug_msg_enabled[74]
#else
#ifdef DEBUG_WIN
#define dprintf_win fprintf
@@ -1499,8 +1546,21 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_winsock if(!debug_msg_enabled[73]) ; else fprintf
-#define debugging_winsock debug_msg_enabled[73]
+#define dprintf_win32 if(!debug_msg_enabled[75]) ; else fprintf
+#define debugging_win32 debug_msg_enabled[75]
+#else
+#ifdef DEBUG_WIN32
+#define dprintf_win32 fprintf
+#define debugging_win32 1
+#else
+#define dprintf_win32 while(0) fprintf
+#define debugging_win32 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_winsock if(!debug_msg_enabled[76]) ; else fprintf
+#define debugging_winsock debug_msg_enabled[76]
#else
#ifdef DEBUG_WINSOCK
#define dprintf_winsock fprintf
@@ -1536,6 +1596,7 @@
"driver",
"edit",
"enum",
+ "env",
"event",
"exec",
"file",
@@ -1544,6 +1605,7 @@
"gdi",
"global",
"graphics",
+ "hook",
"icon",
"int",
"key",
@@ -1588,6 +1650,7 @@
"utility",
"vxd",
"win",
+ "win32",
"winsock",
""
};
diff --git a/include/handle32.h b/include/handle32.h
new file mode 100644
index 0000000..f4e0d9e
--- /dev/null
+++ b/include/handle32.h
@@ -0,0 +1,87 @@
+#ifndef __WINE_HANDLE32_H
+#define __WINE_HANDLE32_H
+
+#include <malloc.h>
+
+/* The _*_OBJECT structures contain information needed about each
+ * particular type of handle. This information is a combination of
+ * equivalent UNIX-style handles/descriptors and general information
+ * that the Win32 API might request.
+ *
+ * The KERNEL_OBJECT structure must be the first member of any specific
+ * kernel object type's structure.
+ */
+
+typedef struct {
+ unsigned long magic;
+} KERNEL_OBJECT, *HANDLE32;
+
+typedef struct {
+ KERNEL_OBJECT common;
+ unsigned long thread_id;
+ unsigned long process_id;
+} THREAD_OBJECT;
+
+typedef struct {
+ KERNEL_OBJECT common;
+ unsigned long process_id;
+ unsigned long main_thread_id;
+} PROCESS_OBJECT;
+
+/* The FILE object includes things like disk files, pipes, and
+ * character devices (com ports, consoles, ...).
+ */
+typedef struct {
+ KERNEL_OBJECT common;
+ int fd; /* UNIX fd */
+ int type; /* FILE_TYPE_* */
+ unsigned long misc_flags; /* special flags */
+ unsigned long access_flags; /* UNIX access flags */
+ unsigned long create_flags; /* UNIX creation flags */
+} FILE_OBJECT;
+
+typedef struct {
+ KERNEL_OBJECT common;
+} SEMAPHORE_OBJECT;
+
+typedef struct {
+ KERNEL_OBJECT common;
+} EVENT_OBJECT;
+
+/* Should this even be here?
+ */
+typedef struct {
+ KERNEL_OBJECT common;
+} REGKEY_OBJECT;
+
+/* Object number definitions. These numbers are used to
+ * validate the kernel object by comparison against the
+ * object's 'magic' value.
+ */
+#define KERNEL_OBJECT_UNUSED 2404554046UL
+#define KERNEL_OBJECT_THREAD (KERNEL_OBJECT_UNUSED + 1)
+#define KERNEL_OBJECT_PROCESS (KERNEL_OBJECT_UNUSED + 2)
+#define KERNEL_OBJECT_FILE (KERNEL_OBJECT_UNUSED + 3)
+#define KERNEL_OBJECT_SEMAPHORE (KERNEL_OBJECT_UNUSED + 4)
+#define KERNEL_OBJECT_EVENT (KERNEL_OBJECT_UNUSED + 5)
+#define KERNEL_OBJECT_REGKEY (KERNEL_OBJECT_UNUSED + 6)
+
+/* Define the invalid handle value
+ */
+#define INVALID_HANDLE_VALUE ((HANDLE32)-1)
+
+/* Functions for checking kernel objects.
+ */
+int ValidateKernelObject(KERNEL_OBJECT *ptr);
+
+/* For now, CreateKernelObject and ReleaseKernelObject will
+ * simply map to malloc() and free().
+ */
+#define CreateKernelObject(size) (malloc(size))
+#define ReleaseKernelObject(ptr) (free(ptr))
+
+/* Prototypes for the Close*Handle functions
+ */
+int CloseFileHandle(FILE_OBJECT *hFile);
+
+#endif /* __WINE_HANDLE32_H */
diff --git a/include/hook.h b/include/hook.h
index bd91822..610b816 100644
--- a/include/hook.h
+++ b/include/hook.h
@@ -11,31 +11,28 @@
#include "ldt.h"
#include "callback.h"
+#ifndef WINELIB
+#pragma pack(1)
+#endif
+
/* Hook data (pointed to by a HHOOK) */
typedef struct
{
- HHOOK next; /* Next hook in chain */
- HOOKPROC proc; /* Hook procedure */
- short id; /* Hook id (WH_xxx) */
- HTASK htask; /* Task owning this hook */
+ 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 */
} HOOKDATA;
+#ifndef WINELIB
+#pragma pack(4)
+#endif
-#define FIRST_HOOK WH_MSGFILTER
-#define LAST_HOOK WH_SHELL
+#define HOOK_MAGIC ((int)'H' | (int)'K' << 8) /* 'HK' */
-#define SYSTEM_HOOK(id) (systemHooks[(id)-FIRST_HOOK])
-#define TASK_HOOK(id) (taskHooks[(id)-FIRST_HOOK])
-#define INTERNAL_CALL_HOOK(hhook,code,wparam,lparam) \
- ((hhook) ? CallHookProc(((HOOKDATA*)PTR_SEG_TO_LIN(hhook))->proc,\
- code, wparam, lparam) : 0)
-
-#define CALL_SYSTEM_HOOK(id,code,wparam,lparam) \
- INTERNAL_CALL_HOOK(SYSTEM_HOOK(id),code,wparam,lparam)
-#define CALL_TASK_HOOK(id,code,wparam,lparam) \
- INTERNAL_CALL_HOOK(TASK_HOOK(id),code,wparam,lparam)
-
-extern HHOOK systemHooks[];
-extern HHOOK taskHooks[];
+extern DWORD HOOK_CallHooks( short id, short code,
+ WPARAM wParam, LPARAM lParam );
#endif /* HOOK_H */
diff --git a/include/kernel32.h b/include/kernel32.h
index 5fb595f..dd38cdc 100644
--- a/include/kernel32.h
+++ b/include/kernel32.h
@@ -2,6 +2,9 @@
*
* Win32 functions, structures, and types related to kernel functions
*/
+#ifndef __WINE_KERNEL32_H
+#define __WINE_KERNEL32_H
+
#include <stddef.h>
int KERN32_Init(void);
@@ -78,3 +81,54 @@
#define TIME_ZONE_ID_STANDARD 1
#define TIME_ZONE_ID_DAYLIGHT 2
+
+/* File object type definitions
+ */
+#define FILE_TYPE_UNKNOWN 0
+#define FILE_TYPE_DISK 1
+#define FILE_TYPE_CHAR 2
+#define FILE_TYPE_PIPE 3
+#define FILE_TYPE_REMOTE 32768
+
+/* File creation flags
+ */
+#define GENERIC_READ 0x80000000L
+#define GENERIC_WRITE 0x40000000L
+#define CREATE_NEW 1
+#define CREATE_ALWAYS 2
+#define OPEN_EXISTING 3
+#define OPEN_ALWAYS 4
+#define TRUNCATE_EXISTING 5
+
+/* Standard handle identifiers
+ */
+#define STD_INPUT_HANDLE ((DWORD) -10)
+#define STD_OUTPUT_HANDLE ((DWORD) -11)
+#define STD_ERROR_HANDLE ((DWORD) -12)
+
+/* The security attributes structure (not filled in yet)
+ */
+typedef struct {
+ void *junk;
+} SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
+typedef struct
+{
+ int dwLowDateTime;
+ int dwHighDateTime;
+} FILETIME;
+
+typedef struct
+{
+ int dwFileAttributes;
+ FILETIME ftCreationTime;
+ FILETIME ftLastAccessTime;
+ FILETIME ftLastWriteTime;
+ int dwVolumeSerialNumber;
+ int nFileSizeHigh;
+ int nFileSizeLow;
+ int nNumberOfLinks;
+ int nFileIndexHigh;
+ int nFileIndexLow;
+} BY_HANDLE_FILE_INFORMATION ;
+
+#endif /* __WINE_KERNEL32_H */
diff --git a/include/libres.h b/include/libres.h
new file mode 100644
index 0000000..68ada6f
--- /dev/null
+++ b/include/libres.h
@@ -0,0 +1,19 @@
+/*
+ * WINElib-Resources
+ */
+#ifndef __WINE_LIBRES_H
+#define __WINE_LIBRES_H
+
+#include "windows.h"
+
+#ifdef WINELIB
+HRSRC LIBRES_FindResource( HMODULE hModule, SEGPTR name, SEGPTR type );
+HGLOBAL LIBRES_LoadResource( HMODULE hModule, HRSRC hRsrc );
+LPSTR LIBRES_LockResource( HMODULE hModule, HGLOBAL handle );
+BOOL LIBRES_FreeResource( HMODULE hModule, HGLOBAL handle );
+INT LIBRES_AccessResource( HINSTANCE hModule, HRSRC hRsrc );
+DWORD LIBRES_SizeofResource( HMODULE hModule, HRSRC hRsrc );
+HGLOBAL LIBRES_AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size );
+#endif
+
+#endif
diff --git a/include/listbox.h b/include/listbox.h
index 405a110..1ca0891 100644
--- a/include/listbox.h
+++ b/include/listbox.h
@@ -24,7 +24,7 @@
WORD DrawCtlType;
WORD CtlID;
LPLISTSTRUCT lpFirst;
- DWORD dwStyle;
+ HWND hSelf;
HWND hParent;
HFONT hFont;
BOOL bRedrawFlag;
@@ -34,6 +34,7 @@
LPINT TabStops;
HANDLE hDrawItemStruct;
BOOL needMeasure;
+ WORD HeapSel;
/* MDESC *Heap; */
} HEADLIST,*LPHEADLIST;
@@ -41,7 +42,7 @@
extern void CreateListBoxStruct(HWND hwnd, WORD CtlType, LONG styles, HWND parent);
extern void DestroyListBoxStruct(LPHEADLIST lphl);
-extern void ListBoxSendNotification(LPHEADLIST lphl,HWND hwnd, WORD code);
+extern void ListBoxSendNotification(LPHEADLIST lphl, WORD code);
extern LPLISTSTRUCT ListBoxGetItem(LPHEADLIST lphl, UINT uIndex);
extern int ListMaxFirstVisible(LPHEADLIST lphl);
diff --git a/include/message.h b/include/message.h
index 10832ef..e604a41 100644
--- a/include/message.h
+++ b/include/message.h
@@ -9,6 +9,10 @@
#include "windows.h"
+#ifndef WINELIB
+#pragma pack(1)
+#endif
+
/* Message as stored in the queue (contains the extraInfo field) */
typedef struct tagQMSG
{
@@ -19,30 +23,45 @@
typedef struct tagMESSAGEQUEUE
{
- WORD next;
- HTASK hTask; /* hTask owning the queue */
- WORD msgSize; /* Size of messages in the queue */
- WORD msgCount; /* Number of waiting messages */
- WORD nextMessage; /* Next message to be retrieved */
- WORD nextFreeMessage; /* Next available slot in the queue */
- WORD queueSize; /* Size of the queue */
- DWORD GetMessageTimeVal; /* Value returned by GetMessageTime */
- DWORD GetMessagePosVal; /* Value returned by GetMessagePos */
- DWORD GetMessageExtraInfoVal; /* Value returned by GetMessageExtraInfo */
- LPARAM lParam; /* Next four values set by SendMessage */
- WPARAM wParam;
- UINT msg;
- HWND hWnd;
- WORD wPostQMsg; /* PostQuitMessage flag */
- WORD wExitCode; /* PostQuitMessage exit code */
- WORD InSendMessageHandle; /* Handle of task that sent a message */
- WORD wPaintCount; /* Number of WM_PAINT needed */
- WORD wTimerCount; /* Number of timers for this application */
- WORD tempStatus; /* State reset by GetQueueStatus */
- WORD status; /* Queue state */
- QMSG messages[1]; /* Queue messages */
+ WORD next; /* 00 Next queue */
+ HTASK hTask; /* 02 hTask owning the queue */
+ WORD msgSize; /* 04 Size of messages in the queue */
+ WORD msgCount; /* 06 Number of waiting messages */
+ WORD nextMessage; /* 08 Next message to be retrieved */
+ WORD nextFreeMessage; /* 0a Next available slot in the queue */
+ WORD queueSize; /* 0c Size of the queue */
+ DWORD GetMessageTimeVal WINE_PACKED; /* 0e Value for GetMessageTime */
+ DWORD GetMessagePosVal WINE_PACKED; /* 12 Value for GetMessagePos */
+ WORD reserved1; /* 16 Unknown */
+ DWORD GetMessageExtraInfoVal; /* 18 Value for GetMessageExtraInfo */
+ WORD reserved2; /* 1c Unknown */
+ LPARAM lParam WINE_PACKED; /* 1e Next 4 values set by SendMessage */
+ WPARAM wParam; /* 22 */
+ UINT msg; /* 24 */
+ HWND hWnd; /* 26 */
+ DWORD SendMessageReturn; /* 28 Return value for SendMessage */
+ WORD wPostQMsg; /* 2c PostQuitMessage flag */
+ WORD wExitCode; /* 2e PostQuitMessage exit code */
+ WORD reserved3[3]; /* 30 Unknown */
+ WORD wWinVersion; /* 36 Expected Windows version */
+ HQUEUE InSendMessageHandle; /* 38 Queue of task that sent a message */
+ HTASK hSendingTask; /* 3a Handle of task that sent a message */
+ HTASK hPrevSendingTask; /* 3c Handle of previous sender */
+ WORD wPaintCount; /* 3e Number of WM_PAINT needed */
+ WORD wTimerCount; /* 40 Number of timers for this task */
+ WORD tempStatus; /* 42 State reset by GetQueueStatus */
+ WORD status; /* 44 Queue state */
+ WORD wakeMask; /* 46 Task 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 */
+ WORD reserved4[3]; /* 68 Unknown */
+ QMSG messages[1]; /* 6e Queue messages */
} MESSAGEQUEUE;
+#ifndef WINELIB
+#pragma pack(4)
+#endif
extern void MSG_IncPaintCount( HANDLE hQueue );
extern void MSG_DecPaintCount( HANDLE hQueue );
diff --git a/include/msdos.h b/include/msdos.h
index 6861971..5ee696a 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -5,11 +5,12 @@
#include <windows.h>
#include "comm.h"
+#define WINE_PATH_LENGTH 256
struct dosdirent {
int inuse;
DIR *ds;
- char unixpath[256];
- char filename[256];
+ char unixpath[WINE_PATH_LENGTH];
+ char filename[WINE_PATH_LENGTH];
char filemask[13];
char attribute;
char search_attribute;
@@ -17,6 +18,7 @@
long filetime;
int telldirnum;
short entnum; /* Directory entry number */
+ struct dosdirent *next;
};
struct fcb {
diff --git a/include/options.h b/include/options.h
index 8ac6d2d..834713c 100644
--- a/include/options.h
+++ b/include/options.h
@@ -7,6 +7,18 @@
#ifndef OPTIONS_H
#define OPTIONS_H
+ /* Supported languages */
+typedef enum
+{
+ LANG_En, /* English */
+ LANG_Es, /* Spanish */
+ LANG_De, /* German */
+ LANG_No, /* Norwegian */
+ LANG_Fr, /* French */
+ LANG_Fi, /* Finnish */
+ LANG_Da /* Danish */
+} WINE_LANGUAGE;
+
struct options
{
char * desktopGeometry; /* NULL when no desktop */
@@ -21,6 +33,7 @@
if write access is requested */
int enhanced; /* Start Wine in enhanced mode */
int ipc; /* Use IPC mechanisms */
+ WINE_LANGUAGE language; /* Current language */
};
extern struct options Options;
diff --git a/include/registers.h b/include/registers.h
index 777522d..2114b54 100644
--- a/include/registers.h
+++ b/include/registers.h
@@ -10,6 +10,8 @@
#include <windows.h>
#include "wine.h"
+#ifndef __svr4__
+
#define EAX_reg(context) ((context)->sc_eax)
#define EBX_reg(context) ((context)->sc_ebx)
#define ECX_reg(context) ((context)->sc_ecx)
@@ -63,4 +65,55 @@
#define SET_CFLAG(context) (EFL_reg(context) |= 0x0001)
#define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe)
+#else /* __svr4__ */
+
+#define EAX_reg(context) ((context)->uc_mcontext.gregs[EAX])
+#define EBX_reg(context) ((context)->uc_mcontext.gregs[EBX])
+#define ECX_reg(context) ((context)->uc_mcontext.gregs[ECX])
+#define EDX_reg(context) ((context)->uc_mcontext.gregs[EDX])
+#define ESI_reg(context) ((context)->uc_mcontext.gregs[ESI])
+#define EDI_reg(context) ((context)->uc_mcontext.gregs[EDI])
+#define EBP_reg(context) ((context)->uc_mcontext.gregs[EBP])
+
+#define AX_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[EAX]))
+#define BX_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[EBX]))
+#define CX_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[ECX]))
+#define DX_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[EDX]))
+#define SI_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[ESI]))
+#define DI_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[EDI]))
+#define BP_reg(context) (*(WORD*)&((context)->uc_mcontext.gregs[EBP]))
+
+#define AL_reg(context) (*(BYTE*)(&(context)->uc_mcontext.gregs[EAX]))
+#define AH_reg(context) (*(((BYTE*)(&(context)->uc_mcontext.gregs[EAX])+1)))
+#define BL_reg(context) (*(BYTE*)(&(context)->uc_mcontext.gregs[EBX]))
+#define BH_reg(context) (*(((BYTE*)(&(context)->uc_mcontext.gregs[EBX])+1)))
+#define CL_reg(context) (*(BYTE*)(&(context)->uc_mcontext.gregs[ECX]))
+#define CH_reg(context) (*(((BYTE*)(&(context)->uc_mcontext.gregs[ECX])+1)))
+#define DL_reg(context) (*(BYTE*)(&(context)->uc_mcontext.gregs[EDX]))
+#define DH_reg(context) (*(((BYTE*)(&(context)->uc_mcontext.gregs[EDX])+1)))
+
+#define CS_reg(context) ((context)->uc_mcontext.gregs[CS])
+#define DS_reg(context) ((context)->uc_mcontext.gregs[DS])
+#define ES_reg(context) ((context)->uc_mcontext.gregs[ES])
+#define SS_reg(context) ((context)->uc_mcontext.gregs[SS])
+
+#define FS_reg(context) ((context)->uc_mcontext.gregs[FS])
+#define GS_reg(context) ((context)->uc_mcontext.gregs[GS])
+
+
+#define EFL_reg(context) ((context)->uc_mcontext.gregs[EFL])
+#define FL_reg(context) (*(WORD*)(&(context)->uc_mcontext.gregs[EFL]))
+
+
+#define EIP_reg(context) ((context)->uc_mcontext.gregs[EIP])
+#define ESP_reg(context) ((context)->uc_mcontext.gregs[R_ESP])
+
+#define IP_reg(context) (*(WORD*)(&(context)->uc_mcontext.gregs[EIP]))
+#define SP_reg(context) (*(WORD*)(&(context)->uc_mcontext.gregs[R_ESP]))
+
+#define SET_CFLAG(context) (EFL_reg(context) |= 0x0001)
+#define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe)
+
+#endif /* __svr4__ */
+
#endif /* __WINE_REGISTERS_H */
diff --git a/include/stddebug.h b/include/stddebug.h
index 0b5a5c4..b5c8917 100644
--- a/include/stddebug.h
+++ b/include/stddebug.h
@@ -97,6 +97,7 @@
#undef DEBUG_DRIVER
#undef DEBUG_EDIT
#undef DEBUG_ENUM
+#undef DEBUG_ENV
#undef DEBUG_EVENT
#undef DEBUG_EXEC
#undef DEBUG_FILE
@@ -105,6 +106,7 @@
#undef DEBUG_GDI
#undef DEBUG_GLOBAL
#undef DEBUG_GRAPHICS
+#undef DEBUG_HOOK
#undef DEBUG_ICON
#undef DEBUG_INT
#undef DEBUG_KEY
@@ -149,6 +151,7 @@
#undef DEBUG_UTILITY
#undef DEBUG_VXD
#undef DEBUG_WIN
+#undef DEBUG_WIN32
#undef DEBUG_WINSOCK
#endif
@@ -174,6 +177,7 @@
#define DEBUG_DRIVER
#define DEBUG_EDIT
#define DEBUG_ENUM
+#define DEBUG_ENV
#define DEBUG_EVENT
#define DEBUG_EXEC
#define DEBUG_FILE
@@ -182,6 +186,7 @@
#define DEBUG_GDI
#define DEBUG_GLOBAL
#define DEBUG_GRAPHICS
+#define DEBUG_HOOK
#define DEBUG_ICON
#define DEBUG_INT
#define DEBUG_KEY
@@ -226,5 +231,6 @@
#define DEBUG_UTILITY
#define DEBUG_VXD
#define DEBUG_WIN
+#define DEBUG_WIN32
#define DEBUG_WINSOCK
#endif
diff --git a/include/winbase.h b/include/winbase.h
new file mode 100644
index 0000000..38f5e3c
--- /dev/null
+++ b/include/winbase.h
@@ -0,0 +1,124 @@
+#ifndef _WINBASE_H
+#define _WINBASE_H
+
+
+
+#ifdef UNICODE
+#define LoadAccelerators LoadAcceleratorsW
+#define TranslateAccelat
+#else
+#define LoadAccelerators LoadAcceleratorsA
+#endif
+
+
+#define INVALID_HANDLE_VALUE ((HANDLE) -1)
+
+#define WAIT_FAILED 0xffffffff
+#define WAIT_OBJECT_0 0
+#define WAIT_ABANDONED STATUS_ABANDONED_WAIT_0
+#define WAIT_ABANDONED_0 STATUS_ABANDONED_WAIT_0
+#define WAIT_TIMEOUT STATUS_TIMEOUT
+
+#define MEM_COMMIT 0x1000
+#define MEM_RESERVE 0x2000
+#define MEM_TOPDOWN 0x100000
+
+#define MEM_RELEASE 0x8000
+
+#define PAGE_NOACCESS 0x01
+#define PAGE_READONLY 0x02
+#define PAGE_READWRITE 0x04
+#define PAGE_WRITECOPY 0x08
+#define PAGE_EXECUTE 0x10
+#define PAGE_EXECUTE_READ 0x20
+#define PAGE_EXECUTE_READWRITE 0x40
+#define PAGE_EXECUTE_WRITECOPY 0x80
+#define PAGE_GUARD 0x100
+#define PAGE_NOCACHE 0x200
+
+HANDLE WINAPI OpenProcess(DWORD access, BOOL inherit, DWORD id);
+int WINAPI GetCurrentProcessId(void);
+int WINAPI TerminateProcess(HANDLE h, int ret);
+
+WINAPI void * VirtualAlloc (void *addr,DWORD size,DWORD type,DWORD protect);
+
+struct _EXCEPTION_POINTERS;
+
+typedef LONG (TOP_LEVEL_EXCEPTION_FILTER)(struct _EXCEPTION_POINTERS *);
+
+WINAPI TOP_LEVEL_EXCEPTION_FILTER *SetUnhandledExceptionFilter(TOP_LEVEL_EXCEPTION_FILTER *func);
+
+/*WINAPI int SetErrorMode(int);*/
+
+#define STATUS_WAIT_0 0x00000000
+#define STATUS_ABANDONED_WAIT_0 0x00000080
+#define STATUS_USER_APC 0x000000C0
+#define STATUS_TIMEOUT 0x00000102
+#define STATUS_PENDING 0x00000103
+#define STATUS_GUARD_PAGE_VIOLATION 0x80000001
+#define STATUS_DATATYPE_MISALIGNMENT 0x80000002
+#define STATUS_BREAKPOINT 0x80000003
+#define STATUS_SINGLE_STEP 0x80000004
+#define STATUS_ACCESS_VIOLATION 0xC0000005
+#define STATUS_IN_PAGE_ERROR 0xC0000006
+#define STATUS_NO_MEMORY 0xC0000017
+#define STATUS_ILLEGAL_INSTRUCTION 0xC000001D
+#define STATUS_NONCONTINUABLE_EXCEPTION 0xC0000025
+#define STATUS_INVALID_DISPOSITION 0xC0000026
+#define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C
+#define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D
+#define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E
+#define STATUS_FLOAT_INEXACT_RESULT 0xC000008F
+#define STATUS_FLOAT_INVALID_OPERATION 0xC0000090
+#define STATUS_FLOAT_OVERFLOW 0xC0000091
+#define STATUS_FLOAT_STACK_CHECK 0xC0000092
+#define STATUS_FLOAT_UNDERFLOW 0xC0000093
+#define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094
+#define STATUS_INTEGER_OVERFLOW 0xC0000095
+#define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096
+#define STATUS_STACK_OVERFLOW 0xC00000FD
+#define STATUS_CONTROL_C_EXIT 0xC000013A
+
+#define DUPLICATE_CLOSE_SOURCE 0x00000001
+#define DUPLICATE_SAME_ACCESS 0x00000002
+
+typedef struct
+{
+ int type;
+} exception;
+
+typedef struct
+{
+ int pad[39];
+ int edi;
+ int esi;
+ int ebx;
+ int edx;
+ int ecx;
+ int eax;
+
+ int ebp;
+ int eip;
+ int cs;
+ int eflags;
+ int esp;
+ int ss;
+} exception_info;
+
+#endif
+
+
+/*DWORD WINAPI GetVersion( void );*/
+
+int
+WINAPI WinMain(HINSTANCE, HINSTANCE prev, char *cmd, int show);
+
+#define GMEM_FIXED 0x0000
+#define GMEM_MOVEABLE 0x0002
+
+DECLARE_HANDLE(HACCEL);
+
+HACCEL WINAPI LoadAcceleratorsA( HINSTANCE, const char *);
+#define FreeModule(hLibModule) FreeLibrary((hLibModule))
+#define MakeProcInstance(lpProc,hInstance) (lpProc)
+#define FreeProcInstance(lpProc) (lpProc)
diff --git a/include/wincon.h b/include/wincon.h
new file mode 100644
index 0000000..c10560c
--- /dev/null
+++ b/include/wincon.h
@@ -0,0 +1,335 @@
+#ifndef _WINCON_H_
+#define _WINCON_H_
+
+
+#ifdef UNICODE
+#define FillConsoleOutputCharacter FillConsoleOutputCharacterW
+#define GetConsoleTitle GetConsoleTitleW
+#define PeekConsoleInput PeekConsoleInputW
+#define ReadConsole ReadConsoleW
+#define ReadConsoleInput ReadConsoleInputW
+#define ReadConsoleOutput ReadConsoleOutputW
+#define ReadConsoleOutputCharacter ReadConsoleOutputCharacterW
+#define ScrollConsoleScreenBuffer ScrollConsoleScreenBufferW
+#define SetConsoleTitle SetConsoleTitleW
+#define WriteConsole WriteConsoleW
+#define WriteConsoleInput WriteConsoleInputW
+#define WriteConsoleOutput WriteConsoleOutputW
+#define WriteConsoleOutputCharacter WriteConsoleOutputCharacterW
+#else
+#define FillConsoleOutputCharacter FillConsoleOutputCharacterA
+#define GetConsoleTitle GetConsoleTitleA
+#define PeekConsoleInput PeekConsoleInputA
+#define ReadConsole ReadConsoleA
+#define ReadConsoleInput ReadConsoleInputA
+#define ReadConsoleOutput ReadConsoleOutputA
+#define ReadConsoleOutputCharacter ReadConsoleOutputCharacterA
+#define ScrollConsoleScreenBuffer ScrollConsoleScreenBufferA
+#define SetConsoleTitle SetConsoleTitleA
+#define WriteConsole WriteConsoleA
+#define WriteConsoleInput WriteConsoleInputA
+#define WriteConsoleOutput WriteConsoleOutputA
+#define WriteConsoleOutputCharacter WriteConsoleOutputCharacterA
+#endif
+
+
+
+#if 0
+
+typedef struct
+ {
+ int bKeyDown;
+ WORD wRepeatCount;
+ WORD wVirtualKeyCode;
+ WORD wVirtualScanCode;
+
+ char AsciiChar;
+char pad;
+#if 0
+ union
+ {
+ WCHAR UnicodeChar;
+ CHAR AsciiChar;
+ }
+ uChar;
+#endif
+ DWORD dwControlKeyState;
+ } __attribute__ ((packed)) KEY_EVENT_RECORD;
+
+
+
+#define RIGHT_ALT_PRESSED 0x1
+#define LEFT_ALT_PRESSED 0x2
+#define RIGHT_CTRL_PRESSED 0x4
+#define LEFT_CTRL_PRESSED 0x8
+#define SHIFT_PRESSED 0x10
+#define NUMLOCK_ON 0x20
+#define SCROLLLOCK_ON 0x40
+#define CAPSLOCK_ON 0x80
+#define ENHANCED_KEY 0x100
+
+typedef struct
+ {
+ COORD dwMousePosition;
+ DWORD dwButtonState;
+ DWORD dwControlKeyState;
+ DWORD dwEventFlags;
+ }
+MOUSE_EVENT_RECORD;
+
+#define CONSOLE_TEXTMODE_BUFFER 1
+
+
+#define FROM_LEFT_1ST_BUTTON_PRESSED 0x0001
+#define RIGHTMOST_BUTTON_PRESSED 0x0002
+#define FROM_LEFT_2ND_BUTTON_PRESSED 0x0004
+#define FROM_LEFT_3RD_BUTTON_PRESSED 0x0008
+#define FROM_LEFT_4TH_BUTTON_PRESSED 0x0010
+
+
+
+
+#define MOUSE_MOVED 0x0001
+#define DOUBLE_CLICK 0x0002
+
+typedef struct
+ {
+ COORD size;
+ }
+WINDOW_BUFFER_SIZE_RECORD;
+
+typedef struct
+ {
+ UINT dwCommandId;
+ }
+MENU_EVENT_RECORD;
+
+typedef struct
+ {
+ BOOL bSetFocus;
+ }
+FOCUS_EVENT_RECORD;
+
+typedef struct
+ {
+ WORD EventType;
+ union
+ {
+ KEY_EVENT_RECORD KeyEvent;
+ MOUSE_EVENT_RECORD MouseEvent;
+ WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
+ MENU_EVENT_RECORD MenuEvent;
+ FOCUS_EVENT_RECORD FocusEvent;
+ }
+ Event;
+ }
+INPUT_RECORD;
+
+#define KEY_EVENT 0x1
+#define MOUSE_EVENT 0x2
+#define WINDOW_BUFFER_SIZE_EVENT 0x4
+#define MENU_EVENT 0x8
+#define FOCUS_EVENT 0x10
+
+typedef struct
+ {
+ union
+ {
+ WCHAR UnicodeChar;
+ CHAR AsciiChar;
+ }
+ Char;
+ WORD Attributes;
+ }
+CHAR_INFO;
+
+
+
+
+#define FOREGROUND_BLUE 0x01
+#define FOREGROUND_GREEN 0x02
+#define FOREGROUND_RED 0x04
+#define FOREGROUND_INTENSITY 0x08
+#define BACKGROUND_BLUE 0x10
+#define BACKGROUND_GREEN 0x20
+#define BACKGROUND_RED 0x40
+#define BACKGROUND_INTENSITY 0x80
+
+
+typedef struct
+ {
+ COORD dwSize;
+ COORD dwCursorPosition;
+ WORD wAttrs;
+ SMALL_RECT srWindow;
+ COORD dwMaximumWindowSize;
+ }
+CONSOLE_SCREEN_BUFFER_INFO;
+
+typedef struct
+ {
+ DWORD size;
+ BOOL bVisible;
+ }
+CONSOLE_CURSOR_INFO;
+
+#endif
+
+
+#define CTRL_C_EVENT 0
+#define CTRL_BREAK_EVENT 1
+#define CTRL_CLOSE_EVENT 2
+#define CTRL_LOGOFF_EVENT 5
+#define CTRL_SHUTDOWN_EVENT 6
+
+typedef BOOL HANDLER_ROUTINE (WORD ctrltype);
+
+#if 0
+
+#define ENABLE_PROCESSED_INPUT 0x01
+#define ENABLE_LINE_INPUT 0x02
+#define ENABLE_ECHO_INPUT 0x04
+#define ENABLE_WINDOW_INPUT 0x08
+#define ENABLE_MOUSE_INPUT 0x10
+
+#define ENABLE_PROCESSED_OUTPUT 0x01
+#define ENABLE_WRAP_AT_EOL_OUTPUT 0x02
+
+
+BOOL WINAPI AllocConsole (VOID);
+
+
+HANDLE WINAPI CreateConsoleScreenBuffer (DWORD access,
+ DWORD mode,
+ CONST SECURITY_ATTRIBUTES * lattr,
+ DWORD flags,
+ VOID * ptr);
+
+BOOL WINAPI FillConsoleOutputAttribute (HANDLE h,
+ WORD attr,
+ DWORD len,
+ COORD co,
+ DWORD * done);
+
+BOOL WINAPI FillConsoleOutputCharacterA (HANDLE h,
+ CHAR c,
+ DWORD len,
+ COORD co,
+ DWORD * done);
+
+
+BOOL WINAPI FlushBuffer (HANDLE h);
+
+BOOL WINAPI FreeConsole (VOID);
+BOOL WINAPI GenerateConsoleCtrlEvent (DWORD ev, DWORD group);
+UINT WINAPI GetConsoleCP (VOID);
+BOOL WINAPI GetConsoleCursorInfo (HANDLE h, CONSOLE_CURSOR_INFO *info);
+BOOL WINAPI GetConsoleMode (HANDLE h, DWORD * mode);
+UINT WINAPI GetConsoleOutputCP (VOID);
+BOOL WINAPI GetConsoleScreenBufferInfo (HANDLE h, CONSOLE_SCREEN_BUFFER_INFO *
+ ptr);
+
+DWORD WINAPI GetConsoleTitleA (LPSTR str, DWORD len);
+
+
+COORD WINAPI GetLargestConsoleWindowSize (HANDLE h);
+
+BOOL WINAPI GetNumberOfConsoleInputEvents (HANDLE h,
+ DWORD * n);
+
+BOOL WINAPI GetNumberOfConsoleMouseButtons (DWORD * n);
+
+BOOL WINAPI PeekConsoleInputA (HANDLE h,
+ INPUT_RECORD * ptr,
+ DWORD len,
+ DWORD * done);
+
+
+
+BOOL WINAPI ReadConsoleA (HANDLE h,
+ VOID * ptr,
+ DWORD len,
+ DWORD * done,
+ VOID * res);
+
+BOOL WINAPI ReadConsoleInputA (HANDLE h,
+ INPUT_RECORD * ptr,
+ DWORD len,
+ DWORD * done);
+
+BOOL WINAPI ReadConsoleOutputA (HANDLE h,
+ CHAR_INFO * ptr,
+ COORD size,
+ COORD fred,
+ SMALL_RECT * reg);
+
+BOOL WINAPI ReadConsoleOutputAttribute (HANDLE h,
+ WORD * attr,
+ DWORD len,
+ COORD rc,
+ DWORD * done);
+
+BOOL WINAPI ReadConsoleOutputCharacterA (HANDLE h,
+ LPSTR c,
+ DWORD len,
+ COORD rc,
+ DWORD * done);
+
+BOOL WINAPI ScrollConsoleScreenBufferA (HANDLE h,
+ CONST SMALL_RECT * sr,
+ CONST SMALL_RECT * cr,
+ COORD cpos,
+ CONST CHAR_INFO * i);
+
+
+BOOL WINAPI SetConsoleActiveScreenBuffer (HANDLE h);
+BOOL WINAPI SetConsoleCP (UINT i);
+BOOL WINAPI SetConsoleCtrlHandler (HANDLER_ROUTINE * func, BOOL a);
+
+BOOL WINAPI SetConsoleCursorInfo (HANDLE h, CONST CONSOLE_CURSOR_INFO * info);
+
+BOOL WINAPI SetConsoleCursorPosition (HANDLE h, COORD pos);
+
+BOOL WINAPI SetConsoleMode (HANDLE h, DWORD mode);
+
+BOOL WINAPI SetConsoleOutputCP (UINT i);
+BOOL WINAPI SetConsoleScreenBufferSize (HANDLE h, COORD size);
+BOOL WINAPI SetConsoleTextAttribute (HANDLE h,
+ WORD attrs);
+BOOL WINAPI SetConsoleTitleA (const char * str);
+
+BOOL WINAPI SetConsoleWindowInfo (HANDLE h,
+ BOOL abs,
+ CONST SMALL_RECT * wnd);
+
+BOOL WINAPI WriteConsoleA (HANDLE h,
+ CONST VOID * ptr,
+ DWORD slen,
+ DWORD * done,
+ VOID * res);
+
+BOOL WINAPI WriteConsoleInputA (HANDLE h,
+ CONST INPUT_RECORD * ptr,
+ DWORD len,
+ DWORD * done);
+
+BOOL WINAPI WriteConsoleOutputA (HANDLE h,
+ CONST CHAR_INFO * ptr,
+ COORD size,
+ COORD fred,
+ SMALL_RECT* where);
+
+BOOL WINAPI WriteConsoleOutputAttribute (HANDLE h,
+ CONST WORD *attr,
+ DWORD len,
+ COORD co,
+ DWORD * done);
+
+BOOL WINAPI WriteConsoleOutputCharacterA (HANDLE h,
+ const char * c,
+ DWORD len,
+ COORD co,
+ DWORD * done);
+#endif
+#endif
+
diff --git a/include/windows.h b/include/windows.h
index 064434d..02542d0 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -173,10 +173,10 @@
{
HWND hwnd;
HWND hwndInsertAfter;
- int x;
- int y;
- int cx;
- int cy;
+ INT x;
+ INT y;
+ INT cx;
+ INT cy;
UINT flags;
} WINDOWPOS;
@@ -270,6 +270,7 @@
/***** Window hooks *****/
/* Hook values */
+#define WH_MSGFILTER (-1)
#define WH_JOURNALRECORD 0
#define WH_JOURNALPLAYBACK 1
#define WH_KEYBOARD 2
@@ -280,8 +281,11 @@
#define WH_MOUSE 7
#define WH_HARDWARE 8
#define WH_DEBUG 9
-#define WH_SHELL 10
-#define WH_MSGFILTER (-1)
+#define WH_SHELL 10
+
+#define WH_FIRST_HOOK WH_MSGFILTER
+#define WH_LAST_HOOK WH_SHELL
+#define WH_NB_HOOKS (WH_LAST_HOOK-WH_FIRST_HOOK+1)
/* Hook action codes */
#define HC_ACTION 0
@@ -302,14 +306,6 @@
#define MSGF_MAINLOOP 8
#define MSGF_USER 4096
- /* Journalling hook values */
-#define HC_GETNEXT 1
-#define HC_SKIP 2
-#define HC_NOREMOVE 3
-#define HC_NOREM HC_NOREMOVE
-#define HC_SYSMODALON 4
-#define HC_SYSMODALOFF 5
-
/* Journalling hook structure */
typedef struct tagEVENTMSG
{
@@ -532,7 +528,7 @@
INT bmWidthBytes;
BYTE bmPlanes;
BYTE bmBitsPixel;
- void * bmBits WINE_PACKED;
+ SEGPTR bmBits WINE_PACKED;
} BITMAP;
typedef BITMAP *PBITMAP;
@@ -999,7 +995,7 @@
typedef struct
{
- unsigned long bcSize;
+ DWORD bcSize;
UINT bcWidth;
UINT bcHeight;
UINT bcPlanes;
@@ -1307,6 +1303,7 @@
#define IDI_EXCLAMATION MAKEINTRESOURCE(32515)
#define IDI_ASTERISK MAKEINTRESOURCE(32516)
+#define IDC_BUMMER MAKEINTRESOURCE(100)
#define IDC_ARROW MAKEINTRESOURCE(32512)
#define IDC_IBEAM MAKEINTRESOURCE(32513)
#define IDC_WAIT MAKEINTRESOURCE(32514)
@@ -1362,6 +1359,9 @@
#define OBM_OLD_ZOOM 32756
#define OBM_OLD_RESTORE 32755
+#define OCR_BUMMER 100
+#define OCR_DRAGOBJECT 101
+
#define OCR_NORMAL 32512
#define OCR_IBEAM 32513
#define OCR_WAIT 32514
@@ -1405,6 +1405,28 @@
#define DEFAULT_PALETTE 15
#define SYSTEM_FIXED_FONT 16
+/* DragObject stuff */
+
+typedef struct tagDRAGINFO {
+ HWND hWnd;
+ HANDLE hScope;
+ WORD wFlags;
+ HANDLE hList;
+ HANDLE hOfStruct;
+ POINT pt WINE_PACKED;
+ LONG l WINE_PACKED;
+} DRAGINFO, FAR* LPDRAGINFO;
+
+#define DRAGOBJ_PROGRAM 0x0001
+#define DRAGOBJ_DATA 0x0002
+#define DRAGOBJ_DIRECTORY 0x0004
+#define DRAGOBJ_MULTIPLE 0x0008
+#define DRAGOBJ_EXTERNAL 0x8000
+
+#define DRAG_PRINT 0x544E5250
+#define DRAG_FILE 0x454C4946
+
+/* Messages */
enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE,
WM_SETFOCUS, WM_KILLFOCUS, WM_SETVISIBLE, WM_ENABLE, WM_SETREDRAW,
@@ -1523,6 +1545,7 @@
#define WM_MDIGETACTIVE 0x0229
#define WM_DROPOBJECT 0x022A
#define WM_QUERYDROPOBJECT 0x022B
+#define WM_BEGINDRAG 0x022C
#define WM_DRAGLOOP 0x022D
#define WM_DRAGSELECT 0x022E
#define WM_DRAGMOVE 0x022F
@@ -1757,6 +1780,7 @@
/* Window extended styles */
#define WS_EX_DLGMODALFRAME 0x00000001L
+#define WS_EX_DRAGDETECT 0x00000002L
#define WS_EX_NOPARENTNOTIFY 0x00000004L
#define WS_EX_TOPMOST 0x00000008L
#define WS_EX_ACCEPTFILES 0x00000010L
@@ -2073,7 +2097,7 @@
#define WM_DRAWITEM 0x002B
-typedef struct tagDRAWITEMSTRUCT
+typedef struct
{
UINT CtlType;
UINT CtlID;
@@ -2090,7 +2114,7 @@
#define WM_MEASUREITEM 0x002C
-typedef struct tagMEASUREITEMSTRUCT
+typedef struct
{
UINT CtlType;
UINT CtlID;
@@ -2104,7 +2128,7 @@
#define WM_DELETEITEM 0x002D
-typedef struct tagDELETEITEMSTRUCT
+typedef struct
{
UINT CtlType;
UINT CtlID;
@@ -2117,7 +2141,7 @@
#define WM_COMPAREITEM 0x0039
-typedef struct tagCOMPAREITEMSTRUCT
+typedef struct
{
UINT CtlType;
UINT CtlID;
@@ -2282,7 +2306,7 @@
#define WM_CHANGECBCHAIN 0x030D
/* Metafile header structure */
-typedef struct tagMETAHEADER
+typedef struct
{
WORD mtType;
WORD mtHeaderSize;
@@ -2294,7 +2318,7 @@
} METAHEADER;
/* Metafile typical record structure */
-typedef struct tagMETARECORD
+typedef struct
{
DWORD rdSize;
WORD rdFunction;
@@ -2304,7 +2328,7 @@
typedef METARECORD *LPMETARECORD;
/* Handle table structure */
-typedef struct tagHANDLETABLE
+typedef struct
{
HANDLE objectHandle[1];
} HANDLETABLE;
@@ -2312,7 +2336,7 @@
typedef HANDLETABLE *LPHANDLETABLE;
/* Clipboard metafile picture structure */
-typedef struct tagMETAFILEPICT
+typedef struct
{
INT mm;
INT xExt;
@@ -2402,16 +2426,15 @@
#define META_CREATEREGION 0x06FF
/* Debugging support (DEBUG SYSTEM ONLY) */
-typedef struct tagWINDEBUGINFO
+typedef struct
{
UINT flags;
- DWORD dwOptions;
- DWORD dwFilter;
- char achAllocModule[8];
- DWORD dwAllocBreak;
- DWORD dwAllocCount;
-} WINDEBUGINFO;
-typedef WINDEBUGINFO FAR* LPWINDEBUGINFO;
+ DWORD dwOptions WINE_PACKED;
+ DWORD dwFilter WINE_PACKED;
+ char achAllocModule[8] WINE_PACKED;
+ DWORD dwAllocBreak WINE_PACKED;
+ DWORD dwAllocCount WINE_PACKED;
+} WINDEBUGINFO, *LPWINDEBUGINFO;
/* WINDEBUGINFO flags values */
#define WDI_OPTIONS 0x0001
@@ -2455,683 +2478,691 @@
#pragma pack(4)
#endif
-ATOM AddAtom(SEGPTR);
-ATOM DeleteAtom(ATOM);
-ATOM FindAtom(SEGPTR);
-ATOM GlobalAddAtom(SEGPTR);
-ATOM GlobalDeleteAtom(ATOM);
-ATOM GlobalFindAtom(SEGPTR);
-ATOM RegisterClass(LPWNDCLASS);
-BOOL AnyPopup(void);
-BOOL AppendMenu(HMENU,UINT,UINT,LPSTR);
-BOOL Arc(HDC,int,int,int,int,int,int,int,int);
-BOOL BitBlt(HDC,short,short,short,short,HDC,short,short,DWORD);
-BOOL BringWindowToTop(HWND);
-BOOL CallMsgFilter(SEGPTR,short);
-BOOL ChangeClipboardChain(HWND,HWND);
-BOOL ChangeMenu(HMENU,UINT,LPSTR,UINT,UINT);
-BOOL CheckMenuItem(HMENU,UINT,UINT);
-BOOL Chord(HDC,int,int,int,int,int,int,int,int);
-BOOL CloseClipboard(void);
-BOOL DPtoLP(HDC,LPPOINT,int);
-BOOL DeleteDC(HDC);
-BOOL DeleteMenu(HMENU,UINT,UINT);
-BOOL DeleteMetaFile(HMETAFILE);
-BOOL DeleteObject(HANDLE);
-BOOL DestroyCursor(HCURSOR);
-BOOL DestroyIcon(HICON);
-BOOL DestroyMenu(HMENU);
-BOOL DestroyWindow(HWND);
-BOOL DlgDirSelect(HWND,LPSTR,int);
-BOOL DlgDirSelectComboBox(HWND,LPSTR,int);
-BOOL DrawIcon(HDC,short,short,HICON);
-BOOL Ellipse(HDC,int,int,int,int);
-BOOL EmptyClipboard(void);
-BOOL EnableHardwareInput(BOOL);
-BOOL EnableMenuItem(HMENU,UINT,UINT);
-BOOL EnableScrollBar(HWND,INT,UINT);
-BOOL EnableWindow(HWND,BOOL);
-BOOL EndDeferWindowPos(HDWP);
-BOOL EnumChildWindows(HWND,FARPROC,LONG);
-BOOL EnumMetaFile(HDC,LOCALHANDLE,FARPROC,BYTE*);
-BOOL EnumTaskWindows(HANDLE,FARPROC,LONG);
-BOOL EnumWindows(FARPROC,LONG);
-BOOL EqualRect(LPRECT,LPRECT);
-BOOL EqualRgn(HRGN,HRGN);
-BOOL ExitWindows(DWORD,WORD);
-BOOL ExtFloodFill(HDC,INT,INT,COLORREF,WORD);
-BOOL ExtTextOut(HDC,short,short,WORD,LPRECT,LPSTR,WORD,LPINT);
-BOOL FillRgn(HDC,HRGN,HBRUSH);
-BOOL FlashWindow(HWND,BOOL);
-BOOL FloodFill(HDC,INT,INT,COLORREF);
-BOOL FrameRgn(HDC,HRGN,HBRUSH,int,int);
-BOOL FreeModule(HANDLE);
-BOOL FreeResource(HANDLE);
-BOOL GetBitmapDimensionEx(HBITMAP,LPSIZE);
-BOOL GetBrushOrgEx(HDC,LPPOINT);
-BOOL GetCharWidth(HDC,WORD,WORD,LPINT);
-BOOL GetClassInfo(HANDLE,SEGPTR,LPWNDCLASS);
-BOOL GetCurrentPositionEx(HDC,LPPOINT);
-BOOL GetInputState(void);
-BOOL GetMessage(SEGPTR,HWND,UINT,UINT);
-BOOL GetTextExtentPoint(HDC,LPSTR,short,LPSIZE);
-BOOL GetTextMetrics(HDC,LPTEXTMETRIC);
-BOOL GetUpdateRect(HWND,LPRECT,BOOL);
-BOOL GetViewportExtEx(HDC,LPPOINT);
-BOOL GetViewportOrgEx(HDC,LPPOINT);
-BOOL GetWinDebugInfo(LPWINDEBUGINFO,UINT);
-BOOL GetWindowExtEx(HDC,LPPOINT);
-BOOL GetWindowOrgEx(HDC,LPPOINT);
-BOOL GetWindowPlacement(HWND,LPWINDOWPLACEMENT);
-BOOL GlobalUnWire(HGLOBAL);
-BOOL GlobalUnlock(HGLOBAL);
-BOOL GrayString(HDC,HBRUSH,FARPROC,LPARAM,INT,INT,INT,INT,INT);
-BOOL HiliteMenuItem(HWND,HMENU,UINT,UINT);
-BOOL InSendMessage(void);
-BOOL InsertMenu(HMENU,UINT,UINT,UINT,LPSTR);
-BOOL IntersectRect(LPRECT,LPRECT,LPRECT);
-BOOL InvertRgn(HDC,HRGN);
-BOOL IsBadCodePtr(SEGPTR);
-BOOL IsBadHugeReadPtr(SEGPTR,DWORD);
-BOOL IsBadHugeWritePtr(SEGPTR,DWORD);
-BOOL IsBadReadPtr(SEGPTR,WORD);
-BOOL IsBadStringPtr(SEGPTR,WORD);
-BOOL IsBadWritePtr(SEGPTR,WORD);
-BOOL IsCharAlpha(char);
-BOOL IsCharAlphaNumeric(char);
-BOOL IsCharLower(char);
-BOOL IsCharUpper(char);
-BOOL IsChild(HWND,HWND);
-BOOL IsClipboardFormatAvailable(WORD);
-BOOL IsDialogMessage(HWND,LPMSG);
-BOOL IsIconic(HWND);
-BOOL IsRectEmpty(LPRECT);
-BOOL IsTwoByteCharPrefix(char);
-BOOL IsWindow(HWND);
-BOOL IsWindowEnabled(HWND);
-BOOL IsWindowVisible(HWND);
-BOOL IsZoomed(HWND);
-BOOL KillSystemTimer(HWND,WORD);
-BOOL KillTimer(HWND,WORD);
-BOOL LPtoDP(HDC,LPPOINT,int);
-BOOL LineTo(HDC,short,short);
-BOOL LocalInit(HANDLE,WORD,WORD);
-BOOL LocalUnlock(HANDLE);
-BOOL ModifyMenu(HMENU,UINT,UINT,UINT,LPSTR);
-BOOL MoveToEx(HDC,short,short,LPPOINT);
-BOOL MoveWindow(HWND,short,short,short,short,BOOL);
-BOOL OemToAnsi(LPSTR,LPSTR);
-BOOL OffsetViewportOrgEx(HDC,short,short,LPPOINT);
-BOOL OffsetWindowOrgEx(HDC,short,short,LPPOINT);
-BOOL OpenClipboard(HWND);
-BOOL OpenIcon(HWND);
-BOOL PaintRgn(HDC,HRGN);
-BOOL PatBlt(HDC,short,short,short,short,DWORD);
-BOOL PeekMessage(LPMSG,HWND,WORD,WORD,WORD);
-BOOL Pie(HDC,int,int,int,int,int,int,int,int);
-BOOL PlayMetaFile(HDC,HANDLE);
-BOOL PolyPolygon(HDC,LPPOINT,LPINT,WORD);
-BOOL Polygon(HDC,LPPOINT,int);
-BOOL Polyline(HDC,LPPOINT,int);
-BOOL PostAppMessage(HANDLE,WORD,WORD,LONG);
-BOOL PostMessage(HWND,WORD,WORD,LONG);
-BOOL PtInRect(LPRECT,POINT);
-BOOL PtInRegion(HRGN,short,short);
-BOOL PtVisible(HDC,short,short);
-BOOL RectInRegion(HRGN,LPRECT);
-BOOL RectVisible(HDC,LPRECT);
-BOOL Rectangle(HDC,int,int,int,int);
-BOOL RedrawWindow(HWND,LPRECT,HRGN,UINT);
-BOOL RemoveFontResource(LPSTR);
-BOOL RemoveMenu(HMENU,UINT,UINT);
-BOOL ResizePalette(HPALETTE,UINT);
-BOOL RestoreDC(HDC,short);
-BOOL RoundRect(HDC,short,short,short,short,short,short);
-BOOL ScaleViewportExtEx(HDC,short,short,short,short,LPSIZE);
-BOOL ScaleWindowExtEx(HDC,short,short,short,short,LPSIZE);
-BOOL ScrollDC(HDC,short,short,LPRECT,LPRECT,HRGN,LPRECT);
-BOOL SetBitmapDimensionEx(HBITMAP,short,short,LPSIZE);
-BOOL SetConvertParams(int,int);
-BOOL SetDeskPattern(void);
-BOOL SetDeskWallPaper(LPSTR);
-BOOL SetErrorMode(WORD);
-BOOL SetMenu(HWND,HMENU);
-BOOL SetMenuItemBitmaps(HMENU,UINT,UINT,HBITMAP,HBITMAP);
-BOOL SetMessageQueue(int);
-BOOL SetProp(HWND,SEGPTR,HANDLE);
-BOOL SetViewportExtEx(HDC,short,short,LPSIZE);
-BOOL SetViewportOrgEx(HDC,short,short,LPPOINT);
-BOOL SetWinDebugInfo(LPWINDEBUGINFO);
-BOOL SetWindowExtEx(HDC,short,short,LPSIZE);
-BOOL SetWindowOrgEx(HDC,short,short,LPPOINT);
-BOOL SetWindowPlacement(HWND,LPWINDOWPLACEMENT);
-BOOL SetWindowPos(HWND,HWND,short,short,short,short,WORD);
-BOOL ShowWindow(HWND,int);
-BOOL StretchBlt(HDC,short,short,short,short,HDC,short,short,short,short,DWORD);
-BOOL SubtractRect(LPRECT,LPRECT,LPRECT);
-BOOL SwapMouseButton(BOOL);
-BOOL TextOut(HDC,short,short,LPSTR,short);
-BOOL TrackPopupMenu(HMENU,UINT,short,short,short,HWND,LPRECT);
-BOOL TranslateMDISysAccel(HWND,LPMSG);
-BOOL TranslateMessage(LPMSG);
-BOOL UnhookWindowsHook(short,FARPROC);
-BOOL UnhookWindowsHookEx(HHOOK);
-BOOL UnionRect(LPRECT,LPRECT,LPRECT);
-BOOL UnrealizeObject(HBRUSH);
-BOOL UnregisterClass(SEGPTR,HANDLE);
-BOOL WinHelp(HWND,LPSTR,WORD,DWORD);
-BOOL WritePrivateProfileString(LPSTR,LPSTR,LPSTR,LPSTR);
-BOOL WriteProfileString(LPSTR,LPSTR,LPSTR);
-BYTE GetTempDrive(BYTE);
-COLORREF GetBkColor(HDC);
-COLORREF GetSysColor(short);
-COLORREF GetTextColor(HDC);
-COLORREF SetPixel(HDC,short,short,COLORREF);
-DWORD CallNextHookEx(HHOOK,short,WPARAM,LPARAM);
-DWORD DefHookProc(short,WORD,DWORD,HHOOK*);
-DWORD GetAspectRatioFilter(HDC);
-DWORD GetBitmapDimension(HBITMAP);
-DWORD GetBrushOrg(HDC);
-DWORD GetCurrentPosition(HDC);
-/*DWORD GetCurrentTime(void);*/
-#define GetCurrentTime GetTickCount
-DWORD GetDCOrg(HDC);
-DWORD GetDialogBaseUnits(void);
-DWORD GetFreeSpace(WORD);
-DWORD GetHeapSpaces(HMODULE);
-DWORD GetMenuCheckMarkDimensions(void);
-DWORD GetMessagePos(void);
-DWORD GetNearestColor(HDC,DWORD);
-DWORD GetPixel(HDC,short,short);
-DWORD GetSelectorBase(WORD);
-DWORD GetSelectorLimit(WORD);
-DWORD GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT);
-DWORD GetTextExtent(HDC,LPSTR,short);
-DWORD GetTickCount(void);
-DWORD GetViewportExt(HDC);
-DWORD GetViewportOrg(HDC);
-DWORD GetWindowExt(HDC);
-DWORD GetWindowOrg(HDC);
-DWORD GlobalCompact(DWORD);
-DWORD GlobalDOSAlloc(DWORD);
-#ifdef WINELIB32
-HGLOBAL GlobalHandle(LPCVOID);
-#else
-DWORD GlobalHandle(UINT);
+INT AccessResource(HINSTANCE,HRSRC);
+ATOM AddAtom(SEGPTR);
+INT AddFontResource(LPCSTR);
+void AdjustWindowRect(LPRECT,DWORD,BOOL);
+void AdjustWindowRectEx(LPRECT,DWORD,BOOL,DWORD);
+WORD AllocCStoDSAlias(WORD);
+WORD AllocDStoCSAlias(WORD);
+HGLOBAL AllocResource(HINSTANCE,HRSRC,DWORD);
+WORD AllocSelector(WORD);
+WORD AllocSelectorArray(WORD);
+void AnimatePalette(HPALETTE,UINT,UINT,LPPALETTEENTRY);
+LPSTR AnsiLower(LPSTR);
+UINT AnsiLowerBuff(LPSTR,UINT);
+SEGPTR AnsiNext(SEGPTR);
+SEGPTR AnsiPrev(SEGPTR,SEGPTR);
+INT AnsiToOem(LPSTR,LPSTR);
+void AnsiToOemBuff(LPSTR,LPSTR,INT);
+LPSTR AnsiUpper(LPSTR);
+UINT AnsiUpperBuff(LPSTR,UINT);
+BOOL AnyPopup(void);
+BOOL AppendMenu(HMENU,UINT,UINT,LPSTR);
+BOOL Arc(HDC,int,int,int,int,int,int,int,int);
+WORD ArrangeIconicWindows(HWND);
+HDWP BeginDeferWindowPos(INT);
+HDC BeginPaint(HWND,LPPAINTSTRUCT);
+BOOL BitBlt(HDC,short,short,short,short,HDC,short,short,DWORD);
+BOOL BringWindowToTop(HWND);
+int BuildCommDCB(LPSTR,DCB*);
+BOOL CallMsgFilter(SEGPTR,short);
+DWORD CallNextHookEx(HHOOK,short,WPARAM,LPARAM);
+LONG CallWindowProc(WNDPROC,HWND,UINT,WPARAM,LPARAM);
+int Catch(LPCATCHBUF);
+BOOL ChangeClipboardChain(HWND,HWND);
+BOOL ChangeMenu(HMENU,UINT,LPSTR,UINT,UINT);
+WORD ChangeSelector(WORD,WORD);
+void CheckDlgButton(HWND,WORD,WORD);
+BOOL CheckMenuItem(HMENU,UINT,UINT);
+void CheckRadioButton(HWND,WORD,WORD,WORD);
+HWND ChildWindowFromPoint(HWND,POINT);
+BOOL Chord(HDC,int,int,int,int,int,int,int,int);
+int ClearCommBreak(int);
+void ClientToScreen(HWND,LPPOINT);
+void ClipCursor(LPRECT);
+BOOL CloseClipboard(void);
+int CloseComm(int);
+HMETAFILE CloseMetaFile(HANDLE);
+void CloseSound(void);
+void CloseWindow(HWND);
+int CombineRgn(HRGN,HRGN,HRGN,short);
+int ConvertRequest(HWND,LPKANJISTRUCT);
+HANDLE CopyMetaFile(HANDLE,LPSTR);
+void CopyRect(LPRECT,LPRECT);
+int CountClipboardFormats(void);
+int CountVoiceNotes(int);
+HBITMAP CreateBitmap(short,short,BYTE,BYTE,LPSTR);
+HBITMAP CreateBitmapIndirect(BITMAP*);
+HBRUSH CreateBrushIndirect(LOGBRUSH*);
+void CreateCaret(HWND,HBITMAP,short,short);
+HBITMAP CreateCompatibleBitmap(HDC,short,short);
+HDC CreateCompatibleDC(HDC);
+HCURSOR CreateCursor(HANDLE,INT,INT,INT,INT,LPSTR,LPSTR);
+HANDLE CreateCursorIconIndirect(HANDLE,CURSORICONINFO*,LPSTR,LPSTR);
+HDC CreateDC(LPSTR,LPSTR,LPSTR,LPSTR);
+HBRUSH CreateDIBPatternBrush(HANDLE,WORD);
+HBITMAP CreateDIBitmap(HDC,LPBITMAPINFOHEADER,DWORD,LPSTR,LPBITMAPINFO,WORD);
+HWND CreateDialog(HANDLE,SEGPTR,HWND,WNDPROC);
+HWND CreateDialogIndirect(HANDLE,SEGPTR,HWND,WNDPROC);
+HWND CreateDialogIndirectParam(HANDLE,SEGPTR,HWND,WNDPROC,LPARAM);
+HWND CreateDialogParam(HANDLE,SEGPTR,HWND,WNDPROC,LPARAM);
+HBITMAP CreateDiscardableBitmap(HDC,short,short);
+HRGN CreateEllipticRgn(short,short,short,short);
+HRGN CreateEllipticRgnIndirect(LPRECT);
+HFONT CreateFont(int,int,int,int,int,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPSTR);
+HFONT CreateFontIndirect(LOGFONT*);
+HBRUSH CreateHatchBrush(short,COLORREF);
+HDC CreateIC(LPSTR,LPSTR,LPSTR,LPSTR);
+HICON CreateIcon(HANDLE,INT,INT,BYTE,BYTE,LPSTR,LPSTR);
+HMENU CreateMenu(void);
+HANDLE CreateMetaFile(LPSTR);
+HPALETTE CreatePalette(LPLOGPALETTE);
+HBRUSH CreatePatternBrush(HBITMAP);
+HPEN CreatePen(short,short,COLORREF);
+HPEN CreatePenIndirect(LOGPEN*);
+HRGN CreatePolyPolygonRgn(LPPOINT,LPINT,INT,INT);
+HRGN CreatePolygonRgn(LPPOINT,INT,INT);
+HMENU CreatePopupMenu(void);
+HRGN CreateRectRgn(short,short,short,short);
+HRGN CreateRectRgnIndirect(LPRECT);
+HRGN CreateRoundRectRgn(short,short,short,short,short,short);
+HBRUSH CreateSolidBrush(DWORD);
+HWND CreateWindow(SEGPTR,SEGPTR,DWORD,INT,INT,INT,INT,HWND,HMENU,HINSTANCE,SEGPTR);
+HWND CreateWindowEx(DWORD,SEGPTR,SEGPTR,DWORD,INT,INT,INT,INT,HWND,HMENU,HINSTANCE,SEGPTR);
+BOOL DPtoLP(HDC,LPPOINT,int);
+void DebugBreak(void);
+LONG DefDlgProc(HWND,UINT,WPARAM,LPARAM);
+LONG DefFrameProc(HWND,HWND,UINT,WPARAM,LPARAM);
+DWORD DefHookProc(short,WORD,DWORD,HHOOK*);
+LONG DefMDIChildProc(HWND,UINT,WPARAM,LPARAM);
+LRESULT DefWindowProc(HWND,UINT,WPARAM,LPARAM);
+HDWP DeferWindowPos(HDWP,HWND,HWND,INT,INT,INT,INT,WORD);
+ATOM DeleteAtom(ATOM);
+BOOL DeleteDC(HDC);
+BOOL DeleteMenu(HMENU,UINT,UINT);
+BOOL DeleteMetaFile(HMETAFILE);
+BOOL DeleteObject(HANDLE);
+void DestroyCaret(void);
+BOOL DestroyCursor(HCURSOR);
+BOOL DestroyIcon(HICON);
+BOOL DestroyMenu(HMENU);
+BOOL DestroyWindow(HWND);
+int DialogBox(HINSTANCE,SEGPTR,HWND,WNDPROC);
+int DialogBoxIndirect(HANDLE,HANDLE,HWND,WNDPROC);
+int DialogBoxIndirectParam(HANDLE,HANDLE,HWND,WNDPROC,LONG);
+int DialogBoxParam(HANDLE,SEGPTR,HWND,WNDPROC,LONG);
+HANDLE DirectResAlloc(HANDLE,WORD,WORD);
+void DirectedYield(HTASK);
+LONG DispatchMessage(LPMSG);
+int DlgDirList(HWND,LPSTR,int,int,WORD);
+int DlgDirListComboBox(HWND,SEGPTR,int,int,WORD);
+BOOL DlgDirSelect(HWND,LPSTR,int);
+BOOL DlgDirSelectComboBox(HWND,LPSTR,int);
+BOOL DragDetect(HWND,POINT);
+DWORD DragObject(HWND, HWND, WORD, WORD, WORD, HCURSOR);
+void DrawFocusRect(HDC,LPRECT);
+BOOL DrawIcon(HDC,short,short,HICON);
+void DrawMenuBar(HWND);
+int DrawText(HDC,LPSTR,int,LPRECT,WORD);
+DWORD DumpIcon(SEGPTR,WORD*,SEGPTR*,SEGPTR*);
+BOOL Ellipse(HDC,int,int,int,int);
+BOOL EmptyClipboard(void);
+BOOL EnableHardwareInput(BOOL);
+BOOL EnableMenuItem(HMENU,UINT,UINT);
+BOOL EnableScrollBar(HWND,INT,UINT);
+BOOL EnableWindow(HWND,BOOL);
+BOOL EndDeferWindowPos(HDWP);
+void EndDialog(HWND,short);
+void EndPaint(HWND,LPPAINTSTRUCT);
+BOOL EnumChildWindows(HWND,FARPROC,LONG);
+WORD EnumClipboardFormats(WORD);
+int EnumFonts(HDC,LPSTR,FARPROC,LPSTR);
+BOOL EnumMetaFile(HDC,LOCALHANDLE,FARPROC,BYTE*);
+int EnumObjects(HDC,int,FARPROC,LPSTR);
+int EnumProps(HWND,FARPROC);
+BOOL EnumTaskWindows(HANDLE,FARPROC,LONG);
+BOOL EnumWindows(FARPROC,LONG);
+BOOL EqualRect(LPRECT,LPRECT);
+BOOL EqualRgn(HRGN,HRGN);
+int Escape(HDC,int,int,LPSTR,LPSTR);
+LONG EscapeCommFunction(int,int);
+int ExcludeClipRect(HDC,short,short,short,short);
+int ExcludeUpdateRgn(HDC,HWND);
+int ExcludeVisRect(HDC,short,short,short,short);
+BOOL ExitWindows(DWORD,WORD);
+BOOL ExtFloodFill(HDC,INT,INT,COLORREF,WORD);
+BOOL ExtTextOut(HDC,short,short,WORD,LPRECT,LPSTR,WORD,LPINT);
+WORD FarGetOwner(HANDLE);
+void FarSetOwner(HANDLE,WORD);
+void FatalExit(int);
+int FillRect(HDC,LPRECT,HBRUSH);
+BOOL FillRgn(HDC,HRGN,HBRUSH);
+void FillWindow(HWND,HWND,HDC,HBRUSH);
+ATOM FindAtom(SEGPTR);
+HANDLE FindResource(HANDLE,SEGPTR,SEGPTR);
+HWND FindWindow(SEGPTR,LPSTR);
+BOOL FlashWindow(HWND,BOOL);
+BOOL FloodFill(HDC,INT,INT,COLORREF);
+int FlushComm(int,int);
+int FrameRect(HDC,LPRECT,HBRUSH);
+BOOL FrameRgn(HDC,HRGN,HBRUSH,int,int);
+void FreeLibrary(HANDLE);
+BOOL FreeModule(HANDLE);
+void FreeProcInstance(FARPROC);
+BOOL FreeResource(HANDLE);
+WORD FreeSelector(WORD);
+UINT GDIRealizePalette(HDC);
+HPALETTE GDISelectPalette(HDC,HPALETTE);
+HWND GetActiveWindow(void);
+DWORD GetAspectRatioFilter(HDC);
+int GetAsyncKeyState(int);
+HANDLE GetAtomHandle(ATOM);
+WORD GetAtomName(ATOM,LPSTR,short);
+LONG GetBitmapBits(HBITMAP,LONG,LPSTR);
+DWORD GetBitmapDimension(HBITMAP);
+BOOL GetBitmapDimensionEx(HBITMAP,LPSIZE);
+COLORREF GetBkColor(HDC);
+WORD GetBkMode(HDC);
+DWORD GetBrushOrg(HDC);
+BOOL GetBrushOrgEx(HDC,LPPOINT);
+HWND GetCapture(void);
+WORD GetCaretBlinkTime(void);
+void GetCaretPos(LPPOINT);
+BOOL GetCharWidth(HDC,WORD,WORD,LPINT);
+BOOL GetClassInfo(HANDLE,SEGPTR,LPWNDCLASS);
+LONG GetClassLong(HWND,short);
+int GetClassName(HWND,LPSTR,short);
+WORD GetClassWord(HWND,short);
+void GetClientRect(HWND,LPRECT);
+int GetClipBox(HDC,LPRECT);
+HRGN GetClipRgn(HDC);
+HANDLE GetClipboardData(WORD);
+int GetClipboardFormatName(WORD,LPSTR,short);
+HWND GetClipboardOwner(void);
+HWND GetClipboardViewer(void);
+HANDLE GetCodeHandle(FARPROC);
+void GetCodeInfo(FARPROC,LPVOID);
+int GetCommError(int,COMSTAT*);
+UINT GetCommEventMask(int,int);
+int GetCommState(int,DCB*);
+HBRUSH GetControlBrush(HWND,HDC,WORD);
+HANDLE GetCurrentPDB(void);
+DWORD GetCurrentPosition(HDC);
+BOOL GetCurrentPositionEx(HDC,LPPOINT);
+HANDLE GetCurrentTask(void);
+DWORD GetCurrentTime(void);
+HCURSOR GetCursor(void);
+void GetCursorPos(LPPOINT);
+HDC GetDC(HWND);
+HDC GetDCEx(HWND,HRGN,DWORD);
+DWORD GetDCOrg(HDC);
+HDC GetDCState(HDC);
+int GetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
+SEGPTR GetDOSEnvironment(void);
+HWND GetDesktopHwnd(void);
+HWND GetDesktopWindow(void);
+int GetDeviceCaps(HDC,WORD);
+DWORD GetDialogBaseUnits(void);
+int GetDlgCtrlID(HWND);
+HWND GetDlgItem(HWND,WORD);
+WORD GetDlgItemInt(HWND,WORD,BOOL*,BOOL);
+int GetDlgItemText(HWND,WORD,SEGPTR,WORD);
+WORD GetDoubleClickTime(void);
+WORD GetDriveType(INT);
+int GetEnvironment(LPSTR,LPSTR,WORD);
+HMODULE GetExePtr(HANDLE);
+HWND GetFocus(void);
+DWORD GetFreeSpace(WORD);
+DWORD GetHeapSpaces(HMODULE);
+BOOL GetInputState(void);
+int GetInstanceData(HANDLE,WORD,int);
+WORD GetInternalWindowPos(HWND,LPRECT,LPPOINT);
+int GetKBCodePage(void);
+int GetKeyNameText(LONG,LPSTR,int);
+int GetKeyState(int);
+void GetKeyboardState(BYTE*);
+int GetKeyboardType(int);
+HWND GetLastActivePopup(HWND);
+WORD GetMapMode(HDC);
+HMENU GetMenu(HWND);
+DWORD GetMenuCheckMarkDimensions(void);
+WORD GetMenuItemCount(HMENU);
+UINT GetMenuItemID(HMENU,int);
+UINT GetMenuState(HMENU,UINT,UINT);
+int GetMenuString(HMENU,UINT,LPSTR,short,UINT);
+BOOL GetMessage(SEGPTR,HWND,UINT,UINT);
+LONG GetMessageExtraInfo(void);
+DWORD GetMessagePos(void);
+LONG GetMessageTime(void);
+HANDLE GetMetaFile(LPSTR);
+HANDLE GetMetaFileBits(HANDLE);
+int GetModuleFileName(HANDLE,LPSTR,short);
+HANDLE GetModuleHandle(LPCSTR);
+int GetModuleUsage(HANDLE);
+FARPROC GetMouseEventProc(void);
+DWORD GetNearestColor(HDC,DWORD);
+WORD GetNearestPaletteIndex(HPALETTE,DWORD);
+HWND GetNextDlgGroupItem(HWND,HWND,BOOL);
+HWND GetNextDlgTabItem(HWND,HWND,BOOL);
+HWND GetNextWindow(HWND,WORD);
+WORD GetNumTasks(void);
+int GetObject(HANDLE,int,LPSTR);
+HWND GetOpenClipboardWindow(void);
+WORD GetPaletteEntries(HPALETTE,WORD,WORD,LPPALETTEENTRY);
+HWND GetParent(HWND);
+DWORD GetPixel(HDC,short,short);
+WORD GetPolyFillMode(HDC);
+int GetPriorityClipboardFormat(WORD*,short);
+WORD GetPrivateProfileInt(LPSTR,LPSTR,short,LPSTR);
+short GetPrivateProfileString(LPSTR,LPSTR,LPSTR,LPSTR,short,LPSTR);
+FARPROC GetProcAddress(HANDLE,SEGPTR);
+WORD GetProfileInt(LPSTR,LPSTR,int);
+int GetProfileString(LPSTR,LPSTR,LPSTR,LPSTR,int);
+HANDLE GetProp(HWND,SEGPTR);
+WORD GetROP2(HDC);
+WORD GetRelAbs(HDC);
+int GetRgnBox(HRGN,LPRECT);
+int GetScrollPos(HWND,int);
+void GetScrollRange(HWND,int,LPINT,LPINT);
+DWORD GetSelectorBase(WORD);
+DWORD GetSelectorLimit(WORD);
+HANDLE GetStockObject(int);
+WORD GetStretchBltMode(HDC);
+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);
+WORD GetSystemPaletteUse(HDC);
+DWORD GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT);
+HINSTANCE GetTaskDS(void);
+HGLOBAL GetTaskQueue(HTASK);
+BYTE GetTempDrive(BYTE);
+INT GetTempFileName(BYTE,LPCSTR,UINT,LPSTR);
+WORD GetTextAlign(HDC);
+short GetTextCharacterExtra(HDC);
+COLORREF GetTextColor(HDC);
+DWORD GetTextExtent(HDC,LPSTR,short);
+BOOL GetTextExtentPoint(HDC,LPSTR,short,LPSIZE);
+INT GetTextFace(HDC,INT,LPSTR);
+BOOL GetTextMetrics(HDC,LPTEXTMETRIC);
+LPINT GetThresholdEvent(void);
+int GetThresholdStatus(void);
+DWORD GetTickCount(void);
+HWND GetTopWindow(HWND);
+BOOL GetUpdateRect(HWND,LPRECT,BOOL);
+int GetUpdateRgn(HWND,HRGN,BOOL);
+LONG GetVersion(void);
+DWORD GetViewportExt(HDC);
+BOOL GetViewportExtEx(HDC,LPPOINT);
+DWORD GetViewportOrg(HDC);
+BOOL GetViewportOrgEx(HDC,LPPOINT);
+BOOL GetWinDebugInfo(LPWINDEBUGINFO,UINT);
+LONG GetWinFlags(void);
+HWND GetWindow(HWND,WORD);
+HDC GetWindowDC(HWND);
+DWORD GetWindowExt(HDC);
+BOOL GetWindowExtEx(HDC,LPPOINT);
+LONG GetWindowLong(HWND,short);
+DWORD GetWindowOrg(HDC);
+BOOL GetWindowOrgEx(HDC,LPPOINT);
+BOOL GetWindowPlacement(HWND,LPWINDOWPLACEMENT);
+void GetWindowRect(HWND,LPRECT);
+HANDLE GetWindowTask(HWND);
+int GetWindowText(HWND,LPSTR,int);
+int GetWindowTextLength(HWND);
+WORD GetWindowWord(HWND,short);
+UINT GetWindowsDirectory(LPSTR,UINT);
+ATOM GlobalAddAtom(SEGPTR);
+HGLOBAL GlobalAlloc(WORD,DWORD);
+#ifndef WINELIB32 /* Obsolete in Win32 */
+DWORD GlobalCompact(DWORD);
#endif
-DWORD GlobalSize(HGLOBAL);
-DWORD MoveTo(HDC,short,short);
-DWORD OemKeyScan(WORD);
-DWORD OffsetViewportOrg(HDC,short,short);
-DWORD OffsetWindowOrg(HDC,short,short);
-DWORD ScaleViewportExt(HDC,short,short,short,short);
-DWORD ScaleWindowExt(HDC,short,short,short,short);
-DWORD SetBitmapDimension(HBITMAP,short,short);
-DWORD SetBkColor(HDC,COLORREF);
-DWORD SetBrushOrg(HDC,short,short);
-DWORD SetMapperFlags(HDC,DWORD);
-DWORD SetTextColor(HDC,DWORD);
-DWORD SetViewportExt(HDC,short,short);
-DWORD SetViewportOrg(HDC,short,short);
-DWORD SetWindowExt(HDC,short,short);
-DWORD SetWindowOrg(HDC,short,short);
-DWORD SizeofResource(HANDLE,HRSRC);
-FARPROC GetMouseEventProc(void);
-FARPROC GetProcAddress(HANDLE,SEGPTR);
-FARPROC LocalNotify(FARPROC);
-FARPROC MakeProcInstance(FARPROC,HANDLE);
-FARPROC SetResourceHandler(HANDLE,LPSTR,FARPROC);
-FARPROC SetWindowsHook(short,FARPROC);
-HANDLE CopyMetaFile(HANDLE,LPSTR);
-HANDLE CreateCursorIconIndirect(HANDLE,CURSORICONINFO*,LPSTR,LPSTR);
-HANDLE CreateMetaFile(LPSTR);
-HANDLE DirectResAlloc(HANDLE,WORD,WORD);
-HANDLE FindResource(HANDLE,SEGPTR,SEGPTR);
-HANDLE GetAtomHandle(ATOM);
-HANDLE GetClipboardData(WORD);
-HANDLE GetCodeHandle(FARPROC);
-HANDLE GetCurrentPDB(void);
-HANDLE GetCurrentTask(void);
-HANDLE GetMetaFile(LPSTR);
-HANDLE GetMetaFileBits(HANDLE);
-HANDLE GetModuleHandle(LPCSTR);
-HANDLE GetProp(HWND,SEGPTR);
-HANDLE GetStockObject(int);
-HANDLE GetWindowTask(HWND);
-HANDLE LoadAccelerators(HANDLE,SEGPTR);
-HANDLE LoadLibrary(LPCSTR);
-HANDLE LoadModule(LPCSTR,LPVOID);
-HANDLE LoadResource(HANDLE,HANDLE);
-HANDLE LocalAlloc(WORD,WORD);
-HANDLE LocalFree(HANDLE);
-HANDLE LocalHandle(WORD);
-HANDLE LocalReAlloc(HANDLE,WORD,WORD);
-HANDLE RemoveProp(HWND,SEGPTR);
-HANDLE SelectObject(HDC,HANDLE);
-HANDLE SetClipboardData(WORD,HANDLE);
-HANDLE SetMetaFileBits(HANDLE);
-HANDLE WinExec(LPSTR,WORD);
-HBITMAP CreateBitmap(short,short,BYTE,BYTE,LPSTR);
-HBITMAP CreateBitmapIndirect(BITMAP*);
-HBITMAP CreateCompatibleBitmap(HDC,short,short);
-HBITMAP CreateDIBitmap(HDC,LPBITMAPINFOHEADER,DWORD,LPSTR,LPBITMAPINFO,WORD);
-HBITMAP CreateDiscardableBitmap(HDC,short,short);
-HBITMAP LoadBitmap(HANDLE,SEGPTR);
-HBRUSH CreateBrushIndirect(LOGBRUSH*);
-HBRUSH CreateDIBPatternBrush(HANDLE,WORD);
-HBRUSH CreateHatchBrush(short,COLORREF);
-HBRUSH CreatePatternBrush(HBITMAP);
-HBRUSH CreateSolidBrush(DWORD);
-HBRUSH GetControlBrush(HWND,HDC,WORD);
-HCURSOR CreateCursor(HANDLE,INT,INT,INT,INT,LPSTR,LPSTR);
-HCURSOR GetCursor(void);
-HCURSOR LoadCursor(HANDLE,SEGPTR);
-HCURSOR SetCursor(HCURSOR);
-HDC BeginPaint(HWND,LPPAINTSTRUCT);
-HDC CreateCompatibleDC(HDC);
-HDC CreateDC(LPSTR,LPSTR,LPSTR,LPSTR);
-HDC CreateIC(LPSTR,LPSTR,LPSTR,LPSTR);
-HDC GetDC(HWND);
-HDC GetDCEx(HWND,HRGN,DWORD);
-HDC GetDCState(HDC);
-HDC GetWindowDC(HWND);
-HDWP BeginDeferWindowPos(INT);
-HDWP DeferWindowPos(HDWP,HWND,HWND,INT,INT,INT,INT,WORD);
-HFONT CreateFont(int,int,int,int,int,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPSTR);
-HFONT CreateFontIndirect(LOGFONT*);
-HGLOBAL AllocResource(HINSTANCE,HRSRC,DWORD);
-HGLOBAL GetTaskQueue(HTASK);
-HGLOBAL GlobalAlloc(WORD,DWORD);
-HGLOBAL GlobalFree(HGLOBAL);
-HGLOBAL GlobalLRUNewest(HGLOBAL);
-HGLOBAL GlobalLRUOldest(HGLOBAL);
-HGLOBAL GlobalReAlloc(HGLOBAL,DWORD,WORD);
-HGLOBAL LockSegment(HGLOBAL);
-HGLOBAL SetTaskQueue(HTASK,HGLOBAL);
-HHOOK SetWindowsHookEx(short,HOOKPROC,HINSTANCE,HTASK);
-HICON CreateIcon(HANDLE,INT,INT,BYTE,BYTE,LPSTR,LPSTR);
-HICON LoadIcon(HANDLE,SEGPTR);
-HINSTANCE GetTaskDS(void);
-HMENU CreateMenu(void);
-HMENU CreatePopupMenu(void);
-HMENU GetMenu(HWND);
-HMENU GetSubMenu(HMENU,short);
-HMENU GetSystemMenu(HWND,BOOL);
-HMENU LoadMenu(HANDLE,SEGPTR);
-HMENU LoadMenuIndirect(LPSTR);
-HMENU LookupMenuHandle(HMENU,INT);
-HMETAFILE CloseMetaFile(HANDLE);
-HMODULE GetExePtr(HANDLE);
-HPALETTE CreatePalette(LPLOGPALETTE);
-HPALETTE GDISelectPalette(HDC,HPALETTE);
-HPALETTE SelectPalette(HDC,HPALETTE,BOOL);
-HPEN CreatePen(short,short,COLORREF);
-HPEN CreatePenIndirect(LOGPEN*);
-HRGN CreateEllipticRgn(short,short,short,short);
-HRGN CreateEllipticRgnIndirect(LPRECT);
-HRGN CreatePolyPolygonRgn(LPPOINT,LPINT,INT,INT);
-HRGN CreatePolygonRgn(LPPOINT,INT,INT);
-HRGN CreateRectRgn(short,short,short,short);
-HRGN CreateRectRgnIndirect(LPRECT);
-HRGN CreateRoundRectRgn(short,short,short,short,short,short);
-HRGN GetClipRgn(HDC);
-HRGN InquireVisRgn(HDC);
-HRGN SaveVisRgn(HDC);
-HWND ChildWindowFromPoint(HWND,POINT);
-HWND CreateDialog(HANDLE,SEGPTR,HWND,WNDPROC);
-HWND CreateDialogIndirect(HANDLE,SEGPTR,HWND,WNDPROC);
-HWND CreateDialogIndirectParam(HANDLE,SEGPTR,HWND,WNDPROC,LPARAM);
-HWND CreateDialogParam(HANDLE,SEGPTR,HWND,WNDPROC,LPARAM);
-HWND CreateWindow(SEGPTR,SEGPTR,DWORD,INT,INT,INT,INT,HWND,HMENU,HINSTANCE,SEGPTR);
-HWND CreateWindowEx(DWORD,SEGPTR,SEGPTR,DWORD,INT,INT,INT,INT,HWND,HMENU,HINSTANCE,SEGPTR);
-HWND FindWindow(SEGPTR,LPSTR);
-HWND GetActiveWindow(void);
-HWND GetCapture(void);
-HWND GetClipboardOwner(void);
-HWND GetClipboardViewer(void);
-HWND GetDesktopHwnd(void);
-HWND GetDesktopWindow(void);
-HWND GetDlgItem(HWND,WORD);
-HWND GetFocus(void);
-HWND GetLastActivePopup(HWND);
-HWND GetNextDlgGroupItem(HWND,HWND,BOOL);
-HWND GetNextDlgTabItem(HWND,HWND,BOOL);
-HWND GetNextWindow(HWND,WORD);
-HWND GetOpenClipboardWindow(void);
-HWND GetParent(HWND);
-HWND GetSysModalWindow(void);
-HWND GetTopWindow(HWND);
-HWND GetWindow(HWND,WORD);
-HWND SetActiveWindow(HWND);
-HWND SetCapture(HWND);
-HWND SetClipboardViewer(HWND);
-HWND SetFocus(HWND);
-HWND SetParent(HWND,HWND);
-HWND SetSysModalWindow(HWND);
-HWND WindowFromPoint(POINT);
-INT AccessResource(HINSTANCE,HRSRC);
-INT AddFontResource(LPCSTR);
-INT AnsiToOem(LPSTR,LPSTR);
-INT GetTempFileName(BYTE,LPCSTR,UINT,LPSTR);
-INT GetTextFace(HDC,INT,LPSTR);
-INT OpenFile(LPCSTR,LPOFSTRUCT,UINT);
-INT _lclose(INT);
-INT _lcreat(LPSTR,INT);
-INT _lopen(LPSTR,INT);
-INT _lread(INT,LPSTR,WORD);
-INT _lwrite(INT,LPCSTR,WORD);
-INT lstrcmp(LPCSTR,LPCSTR);
-INT lstrcmpi(LPCSTR,LPCSTR);
-INT lstrlen(LPCSTR);
-LONG CallWindowProc(WNDPROC,HWND,UINT,WPARAM,LPARAM);
-LONG DefDlgProc(HWND,UINT,WPARAM,LPARAM);
-LONG DefFrameProc(HWND,HWND,UINT,WPARAM,LPARAM);
-LONG DefMDIChildProc(HWND,UINT,WPARAM,LPARAM);
-LONG DispatchMessage(LPMSG);
-LONG EscapeCommFunction(int,int);
-LONG GetBitmapBits(HBITMAP,LONG,LPSTR);
-LONG GetClassLong(HWND,short);
-LONG GetMessageExtraInfo(void);
-LONG GetMessageTime(void);
-LONG GetVersion(void);
-LONG GetWinFlags(void);
-LONG GetWindowLong(HWND,short);
-LONG SendDlgItemMessage(HWND,INT,UINT,WPARAM,LPARAM);
-LONG SetBitmapBits(HBITMAP,LONG,LPSTR);
-LONG SetClassLong(HWND,short,LONG);
-LONG SetSwapAreaSize(WORD);
-LONG SetWindowLong(HWND,short,LONG);
-LONG TabbedTextOut(HDC,short,short,LPSTR,short,short,LPINT,short);
-LONG _hread(INT,LPSTR,LONG);
-LONG _hwrite(INT,LPCSTR,LONG);
-LONG _llseek(INT,LONG,INT);
-LPINT GetThresholdEvent(void);
-LPSTR AnsiLower(LPSTR);
-LPSTR AnsiUpper(LPSTR);
-LPSTR LockResource(HANDLE);
-LPSTR ValidateFreeSpaces(void);
-LPVOID GlobalLock(HGLOBAL);
-LRESULT DefWindowProc(HWND,UINT,WPARAM,LPARAM);
-LRESULT SendMessage(HWND,UINT,WPARAM,LPARAM);
-NPVOID LocalLock(HLOCAL);
-SEGPTR AnsiNext(SEGPTR);
-SEGPTR AnsiPrev(SEGPTR,SEGPTR);
-SEGPTR GetDOSEnvironment(void);
-SEGPTR GlobalWire(HGLOBAL);
-SEGPTR WIN16_GlobalLock(HGLOBAL);
-SEGPTR WIN16_LockResource(HANDLE);
-SEGPTR lstrcat(SEGPTR,SEGPTR);
-SEGPTR lstrcpy(SEGPTR,SEGPTR);
-SEGPTR lstrcpyn(SEGPTR,SEGPTR,WORD);
-UINT AnsiLowerBuff(LPSTR,UINT);
-UINT AnsiUpperBuff(LPSTR,UINT);
-UINT GDIRealizePalette(HDC);
-UINT RealizePalette(HDC);
-WORD AllocCStoDSAlias(WORD);
-WORD AllocDStoCSAlias(WORD);
-WORD AllocSelector(WORD);
-WORD AllocSelectorArray(WORD);
-WORD ArrangeIconicWindows(HWND);
-WORD ChangeSelector(WORD,WORD);
-WORD EnumClipboardFormats(WORD);
-WORD FarGetOwner(HANDLE);
-WORD FreeSelector(WORD);
-WORD GetAtomName(ATOM,LPSTR,short);
-WORD GetBkMode(HDC);
-WORD GetCaretBlinkTime(void);
-WORD GetClassWord(HWND,short);
-UINT GetCommEventMask(int,int);
-WORD GetDlgItemInt(HWND,WORD,BOOL*,BOOL);
-WORD GetDoubleClickTime(void);
-WORD GetDriveType(INT);
-WORD GetInternalWindowPos(HWND,LPRECT,LPPOINT);
-WORD GetMapMode(HDC);
-WORD GetMenuItemCount(HMENU);
-UINT GetMenuItemID(HMENU,int);
-UINT GetMenuState(HMENU,UINT,UINT);
-WORD GetNearestPaletteIndex(HPALETTE,DWORD);
-WORD GetNumTasks(void);
-WORD GetPaletteEntries(HPALETTE,WORD,WORD,LPPALETTEENTRY);
-WORD GetPolyFillMode(HDC);
-WORD GetPrivateProfileInt(LPSTR,LPSTR,short,LPSTR);
-WORD GetProfileInt(LPSTR,LPSTR,int);
-WORD GetROP2(HDC);
-WORD GetRelAbs(HDC);
-WORD GetStretchBltMode(HDC);
-UINT GetSystemDirectory(LPSTR,UINT);
-WORD GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
-WORD GetSystemPaletteUse(HDC);
-WORD GetTextAlign(HDC);
-WORD GetWindowWord(HWND,short);
-UINT GetWindowsDirectory(LPSTR,UINT);
-WORD GlobalDOSFree(WORD);
-WORD GlobalFlags(HGLOBAL);
-WORD GlobalGetAtomName(ATOM,LPSTR,short);
-WORD GlobalPageLock(HGLOBAL);
-WORD GlobalPageUnlock(HGLOBAL);
-WORD InitAtomTable(WORD);
-WORD IsDlgButtonChecked(HWND,WORD);
-WORD LocalCompact(WORD);
-WORD LocalFlags(HLOCAL);
-WORD LocalShrink(HANDLE,WORD);
-WORD LocalSize(HLOCAL);
-WORD MapVirtualKey(WORD,WORD);
-WORD PrestoChangoSelector(WORD,WORD);
-WORD RealizeDefaultPalette(HDC);
-WORD RegisterClipboardFormat(LPCSTR);
-WORD RegisterWindowMessage(SEGPTR);
-WORD SelectorAccessRights(WORD,WORD,WORD);
-WORD SetBkMode(HDC,WORD);
-WORD SetClassWord(HWND,short,WORD);
-WORD SetHandleCount(WORD);
-WORD SetMapMode(HDC,WORD);
-WORD SetPaletteEntries(HPALETTE,WORD,WORD,LPPALETTEENTRY);
-WORD SetPolyFillMode(HDC,WORD);
-WORD SetROP2(HDC,WORD);
-WORD SetRelAbs(HDC,WORD);
-WORD SetSelectorBase(WORD,DWORD);
-WORD SetSelectorLimit(WORD,DWORD);
-WORD SetStretchBltMode(HDC,WORD);
-WORD SetSystemPaletteUse(HDC,WORD);
-WORD SetSystemTimer(HWND,WORD,WORD,FARPROC);
-WORD SetTextAlign(HDC,WORD);
-WORD SetTimer(HWND,WORD,WORD,FARPROC);
-WORD SetWindowWord(HWND,short,WORD);
-WORD VkKeyScan(WORD);
-UINT* SetCommEventMask(int,UINT);
-int BuildCommDCB(LPSTR,DCB*);
-int Catch(LPCATCHBUF);
-int ClearCommBreak(int);
-int CloseComm(int);
-int CombineRgn(HRGN,HRGN,HRGN,short);
-int ConvertRequest(HWND,LPKANJISTRUCT);
-int CountClipboardFormats(void);
-int CountVoiceNotes(int);
-int DialogBox(HINSTANCE,SEGPTR,HWND,WNDPROC);
-int DialogBoxIndirect(HANDLE,HANDLE,HWND,WNDPROC);
-int DialogBoxIndirectParam(HANDLE,HANDLE,HWND,WNDPROC,LONG);
-int DialogBoxParam(HANDLE,SEGPTR,HWND,WNDPROC,LONG);
-int DlgDirList(HWND,LPSTR,int,int,WORD);
-int DlgDirListComboBox(HWND,SEGPTR,int,int,WORD);
-int DrawText(HDC,LPSTR,int,LPRECT,WORD);
-int EnumFonts(HDC,LPSTR,FARPROC,LPSTR);
-int EnumObjects(HDC,int,FARPROC,LPSTR);
-int EnumProps(HWND,FARPROC);
-int Escape(HDC,int,int,LPSTR,LPSTR);
-int ExcludeClipRect(HDC,short,short,short,short);
-int ExcludeUpdateRgn(HDC,HWND);
-int ExcludeVisRect(HDC,short,short,short,short);
-int FillRect(HDC,LPRECT,HBRUSH);
-int FlushComm(int,int);
-int FrameRect(HDC,LPRECT,HBRUSH);
-int GetAsyncKeyState(int);
-int GetClassName(HWND,LPSTR,short);
-int GetClipBox(HDC,LPRECT);
-int GetClipboardFormatName(WORD,LPSTR,short);
-int GetCommError(int,COMSTAT*);
-int GetCommState(int,DCB*);
-int GetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
-int GetDeviceCaps(HDC,WORD);
-int GetDlgCtrlID(HWND);
-int GetDlgItemText(HWND,WORD,SEGPTR,WORD);
-int GetEnvironment(LPSTR,LPSTR,WORD);
-int GetInstanceData(HANDLE,WORD,int);
-int GetKBCodePage(void);
-int GetKeyNameText(LONG,LPSTR,int);
-int GetKeyState(int);
-int GetKeyboardType(int);
-int GetMenuString(HMENU,UINT,LPSTR,short,UINT);
-int GetModuleFileName(HANDLE,LPSTR,short);
-int GetModuleUsage(HANDLE);
-int GetObject(HANDLE,int,LPSTR);
-int GetPriorityClipboardFormat(WORD*,short);
-int GetProfileString(LPSTR,LPSTR,LPSTR,LPSTR,int);
-int GetRgnBox(HRGN,LPRECT);
-int GetScrollPos(HWND,int);
-int GetSystemMetrics(WORD);
-int GetThresholdStatus(void);
-int GetUpdateRgn(HWND,HRGN,BOOL);
-int GetWindowText(HWND,LPSTR,int);
-int GetWindowTextLength(HWND);
-int IntersectClipRect(HDC,short,short,short,short);
-int IntersectVisRect(HDC,short,short,short,short);
-int LoadString(HANDLE,WORD,LPSTR,int);
-int MessageBox(HWND,LPSTR,LPSTR,WORD);
-int MulDiv(int,int,int);
-int OffsetClipRgn(HDC,short,short);
-int OffsetRgn(HRGN,short,short);
-int OpenComm(LPSTR,UINT,UINT);
-int OpenSound(void);
-int ProfInsChk(void);
-int ReadComm(int,LPSTR,int);
-int ReleaseDC(HWND,HDC);
-int RestoreVisRgn(HDC);
-int SaveDC(HDC);
-int ScrollWindowEx(HWND,short,short,LPRECT,LPRECT,HRGN,LPRECT,WORD);
-int SelectClipRgn(HDC,HRGN);
-int SelectVisRgn(HDC,HRGN);
-int SetCommBreak(int);
-int SetCommState(DCB*);
-int SetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
-int SetDIBitsToDevice(HDC,short,short,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
-int SetEnvironment(LPSTR,LPSTR,WORD);
-int SetScrollPos(HWND,int,int,BOOL);
-int SetSoundNoise(int,int);
-int SetVoiceAccent(int,int,int,int,int);
-int SetVoiceEnvelope(int,int,int);
-int SetVoiceNote(int,int,int,int);
-int SetVoiceQueueSize(int,int);
-int SetVoiceSound(int,LONG,int);
-int SetVoiceThreshold(int,int);
-int ShowCursor(BOOL);
-int StartSound(void);
-int StopSound(void);
-int StretchDIBits(HDC,WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD,DWORD);
-int SyncAllVoices(void);
-int Throw(LPCATCHBUF,int);
-int ToAscii(WORD,WORD,LPSTR,LPVOID,WORD);
-int TranslateAccelerator(HWND,HANDLE,LPMSG);
-int TransmitCommChar(int,char);
-int UngetCommChar(int,char);
-int UpdateColors(HDC);
-int WaitSoundState(int);
-int WriteComm(int,LPSTR,int);
-int wvsprintf(LPSTR,LPSTR,LPSTR);
-short GetPrivateProfileString(LPSTR,LPSTR,LPSTR,LPSTR,short,LPSTR);
-short GetTextCharacterExtra(HDC);
-short SetTextCharacterExtra(HDC,short);
-short SetTextJustification(HDC,short,short);
-void AdjustWindowRect(LPRECT,DWORD,BOOL);
-void AdjustWindowRectEx(LPRECT,DWORD,BOOL,DWORD);
-void AnimatePalette(HPALETTE,UINT,UINT,LPPALETTEENTRY);
-void AnsiToOemBuff(LPSTR,LPSTR,INT);
-void CheckDlgButton(HWND,WORD,WORD);
-void CheckRadioButton(HWND,WORD,WORD,WORD);
-void ClientToScreen(HWND,LPPOINT);
-void ClipCursor(LPRECT);
-void CloseSound(void);
-void CloseWindow(HWND);
-void CopyRect(LPRECT,LPRECT);
-void CreateCaret(HWND,HBITMAP,short,short);
-void DebugBreak(void);
-void DestroyCaret(void);
-void DirectedYield(HTASK);
-void DrawFocusRect(HDC,LPRECT);
-void DrawMenuBar(HWND);
-void EndDialog(HWND,short);
-void EndPaint(HWND,LPPAINTSTRUCT);
-void FarSetOwner(HANDLE,WORD);
-void FatalExit(int);
-void FillWindow(HWND,HWND,HDC,HBRUSH);
-void FreeLibrary(HANDLE);
-void FreeProcInstance(FARPROC);
-void GetCaretPos(LPPOINT);
-void GetClientRect(HWND,LPRECT);
-void GetCodeInfo(FARPROC,LPVOID);
-void GetCursorPos(LPPOINT);
-void GetKeyboardState(BYTE*);
-void GetScrollRange(HWND,int,LPINT,LPINT);
-void GetWindowRect(HWND,LPRECT);
-void GlobalFix(HGLOBAL);
-void GlobalFreeAll(HANDLE);
-void GlobalNotify(FARPROC);
-void GlobalUnfix(HGLOBAL);
-void HideCaret(HWND);
-void InflateRect(LPRECT,short,short);
-void InvalidateRect(HWND,LPRECT,BOOL);
-void InvalidateRgn(HWND,HRGN,BOOL);
-void InvertRect(HDC,LPRECT);
-void LimitEmsPages(DWORD);
-void LineDDA(short,short,short,short,FARPROC,long);
-void MapDialogRect(HWND,LPRECT);
-void MapWindowPoints(HWND,HWND,LPPOINT,WORD);
-void MessageBeep(WORD);
-void OemToAnsiBuff(LPSTR,LPSTR,INT);
-void OffsetRect(LPRECT,short,short);
-void OutputDebugString(LPSTR);
-void PaintRect(HWND,HWND,HDC,HBRUSH,LPRECT);
-void PlayMetaFileRecord(HDC,LPHANDLETABLE,LPMETARECORD,WORD);
-void PostQuitMessage(int);
-void ProfClear(void);
-void ProfFinish(void);
-void ProfFlush(void);
-void ProfSampRate(int,int);
-void ProfSetup(int,int);
-void ProfStart(void);
-void ProfStop(void);
-void ReleaseCapture(void);
-void ReplyMessage(LONG);
-void ScreenToClient(HWND,LPPOINT);
-void ScrollWindow(HWND,short,short,LPRECT,LPRECT);
-void SetCaretBlinkTime(WORD);
-void SetCaretPos(short,short);
-void SetConvertHook(BOOL);
-void SetCursorPos(short,short);
-void SetDCState(HDC,HDC);
-void SetDlgItemInt(HWND,WORD,WORD,BOOL);
-void SetDlgItemText(HWND,WORD,SEGPTR);
-void SetDoubleClickTime(WORD);
-void SetInternalWindowPos(HWND,WORD,LPRECT,LPPOINT);
-void SetKeyboardState(BYTE*);
-void SetRect(LPRECT,short,short,short,short);
-void SetRectEmpty(LPRECT);
-void SetRectRgn(HRGN,short,short,short,short);
-void SetScrollRange(HWND,int,int,int,BOOL);
-void SetSysColors(int,LPINT,COLORREF*);
-void SetWindowText(HWND,LPSTR);
-void ShowCaret(HWND);
-void ShowOwnedPopups(HWND,BOOL);
-void ShowScrollBar(HWND,WORD,BOOL);
-void SwapRecording(WORD);
-void SwitchStackBack(void);
-void SwitchStackTo(WORD,WORD,WORD);
-void UnlockSegment(HGLOBAL);
-void UpdateWindow(HWND);
-void ValidateCodeSegments(void);
-void ValidateRect(HWND,LPRECT);
-void ValidateRgn(HWND,HRGN);
-void WaitMessage(void);
-void Yield(void);
+DWORD GlobalDOSAlloc(DWORD);
+WORD GlobalDOSFree(WORD);
+ATOM GlobalDeleteAtom(ATOM);
+ATOM GlobalFindAtom(SEGPTR);
+void GlobalFix(HGLOBAL);
+WORD GlobalFlags(HGLOBAL);
+HGLOBAL GlobalFree(HGLOBAL);
+void GlobalFreeAll(HANDLE);
+WORD GlobalGetAtomName(ATOM,LPSTR,short);
+#ifdef WINELIB32
+HGLOBAL GlobalHandle(LPCVOID);
+#else
+DWORD GlobalHandle(UINT);
+#endif
+HGLOBAL GlobalLRUNewest(HGLOBAL);
+HGLOBAL GlobalLRUOldest(HGLOBAL);
+LPVOID GlobalLock(HGLOBAL);
+void GlobalNotify(FARPROC);
+WORD GlobalPageLock(HGLOBAL);
+WORD GlobalPageUnlock(HGLOBAL);
+HGLOBAL GlobalReAlloc(HGLOBAL,DWORD,WORD);
+DWORD GlobalSize(HGLOBAL);
+BOOL GlobalUnWire(HGLOBAL);
+void GlobalUnfix(HGLOBAL);
+BOOL GlobalUnlock(HGLOBAL);
+SEGPTR GlobalWire(HGLOBAL);
+BOOL GrayString(HDC,HBRUSH,FARPROC,LPARAM,INT,INT,INT,INT,INT);
+void HideCaret(HWND);
+BOOL HiliteMenuItem(HWND,HMENU,UINT,UINT);
+BOOL InSendMessage(void);
+void InflateRect(LPRECT,short,short);
+WORD InitAtomTable(WORD);
+HRGN InquireVisRgn(HDC);
+BOOL InsertMenu(HMENU,UINT,UINT,UINT,LPSTR);
+int IntersectClipRect(HDC,short,short,short,short);
+BOOL IntersectRect(LPRECT,LPRECT,LPRECT);
+int IntersectVisRect(HDC,short,short,short,short);
+void InvalidateRect(HWND,LPRECT,BOOL);
+void InvalidateRgn(HWND,HRGN,BOOL);
+void InvertRect(HDC,LPRECT);
+BOOL InvertRgn(HDC,HRGN);
+BOOL IsBadCodePtr(SEGPTR);
+BOOL IsBadHugeReadPtr(SEGPTR,DWORD);
+BOOL IsBadHugeWritePtr(SEGPTR,DWORD);
+BOOL IsBadReadPtr(SEGPTR,WORD);
+BOOL IsBadStringPtr(SEGPTR,WORD);
+BOOL IsBadWritePtr(SEGPTR,WORD);
+BOOL IsCharAlpha(char);
+BOOL IsCharAlphaNumeric(char);
+BOOL IsCharLower(char);
+BOOL IsCharUpper(char);
+BOOL IsChild(HWND,HWND);
+BOOL IsClipboardFormatAvailable(WORD);
+BOOL IsDialogMessage(HWND,LPMSG);
+WORD IsDlgButtonChecked(HWND,WORD);
+BOOL IsIconic(HWND);
+BOOL IsRectEmpty(LPRECT);
+BOOL IsTwoByteCharPrefix(char);
+BOOL IsWindow(HWND);
+BOOL IsWindowEnabled(HWND);
+BOOL IsWindowVisible(HWND);
+BOOL IsZoomed(HWND);
+BOOL KillSystemTimer(HWND,WORD);
+BOOL KillTimer(HWND,WORD);
+BOOL LPtoDP(HDC,LPPOINT,int);
+void LimitEmsPages(DWORD);
+void LineDDA(short,short,short,short,FARPROC,long);
+BOOL LineTo(HDC,short,short);
+HANDLE LoadAccelerators(HANDLE,SEGPTR);
+HBITMAP LoadBitmap(HANDLE,SEGPTR);
+HCURSOR LoadCursor(HANDLE,SEGPTR);
+HICON LoadIcon(HANDLE,SEGPTR);
+HANDLE LoadLibrary(LPCSTR);
+HMENU LoadMenu(HANDLE,SEGPTR);
+HMENU LoadMenuIndirect(LPSTR);
+HANDLE LoadModule(LPCSTR,LPVOID);
+HANDLE LoadResource(HANDLE,HANDLE);
+int LoadString(HANDLE,WORD,LPSTR,int);
+HANDLE LocalAlloc(WORD,WORD);
+#ifndef WINELIB32 /* Obsolete in Win32 */
+UINT LocalCompact(WORD);
+#endif
+UINT LocalFlags(HLOCAL);
+HANDLE LocalFree(HANDLE);
+HANDLE LocalHandle(WORD);
+BOOL LocalInit(HANDLE,WORD,WORD);
+NPVOID LocalLock(HLOCAL);
+FARPROC LocalNotify(FARPROC);
+HANDLE LocalReAlloc(HANDLE,WORD,WORD);
+#ifndef WINELIB32 /* Obsolete in Win32 */
+UINT LocalShrink(HANDLE,WORD);
+#endif
+UINT LocalSize(HLOCAL);
+BOOL LocalUnlock(HANDLE);
+LPSTR LockResource(HANDLE);
+HGLOBAL LockSegment(HGLOBAL);
+HMENU LookupMenuHandle(HMENU,INT);
+FARPROC MakeProcInstance(FARPROC,HANDLE);
+void MapDialogRect(HWND,LPRECT);
+WORD MapVirtualKey(WORD,WORD);
+void MapWindowPoints(HWND,HWND,LPPOINT,WORD);
+void MessageBeep(WORD);
+int MessageBox(HWND,LPSTR,LPSTR,WORD);
+BOOL ModifyMenu(HMENU,UINT,UINT,UINT,LPSTR);
+DWORD MoveTo(HDC,short,short);
+BOOL MoveToEx(HDC,short,short,LPPOINT);
+BOOL MoveWindow(HWND,short,short,short,short,BOOL);
+int MulDiv(int,int,int);
+DWORD OemKeyScan(WORD);
+BOOL OemToAnsi(LPSTR,LPSTR);
+void OemToAnsiBuff(LPSTR,LPSTR,INT);
+int OffsetClipRgn(HDC,short,short);
+void OffsetRect(LPRECT,short,short);
+int OffsetRgn(HRGN,short,short);
+DWORD OffsetViewportOrg(HDC,short,short);
+BOOL OffsetViewportOrgEx(HDC,short,short,LPPOINT);
+DWORD OffsetWindowOrg(HDC,short,short);
+BOOL OffsetWindowOrgEx(HDC,short,short,LPPOINT);
+BOOL OpenClipboard(HWND);
+int OpenComm(LPSTR,UINT,UINT);
+INT OpenFile(LPCSTR,LPOFSTRUCT,UINT);
+BOOL OpenIcon(HWND);
+int OpenSound(void);
+void OutputDebugString(LPSTR);
+void PaintRect(HWND,HWND,HDC,HBRUSH,LPRECT);
+BOOL PaintRgn(HDC,HRGN);
+BOOL PatBlt(HDC,short,short,short,short,DWORD);
+BOOL PeekMessage(LPMSG,HWND,WORD,WORD,WORD);
+BOOL Pie(HDC,int,int,int,int,int,int,int,int);
+BOOL PlayMetaFile(HDC,HANDLE);
+void PlayMetaFileRecord(HDC,LPHANDLETABLE,LPMETARECORD,WORD);
+BOOL PolyPolygon(HDC,LPPOINT,LPINT,WORD);
+BOOL Polygon(HDC,LPPOINT,int);
+BOOL Polyline(HDC,LPPOINT,int);
+BOOL PostAppMessage(HANDLE,WORD,WORD,LONG);
+BOOL PostMessage(HWND,WORD,WORD,LONG);
+void PostQuitMessage(int);
+WORD PrestoChangoSelector(WORD,WORD);
+void ProfClear(void);
+void ProfFinish(void);
+void ProfFlush(void);
+int ProfInsChk(void);
+void ProfSampRate(int,int);
+void ProfSetup(int,int);
+void ProfStart(void);
+void ProfStop(void);
+BOOL PtInRect(LPRECT,POINT);
+BOOL PtInRegion(HRGN,short,short);
+BOOL PtVisible(HDC,short,short);
+int ReadComm(int,LPSTR,int);
+WORD RealizeDefaultPalette(HDC);
+UINT RealizePalette(HDC);
+BOOL RectInRegion(HRGN,LPRECT);
+BOOL RectVisible(HDC,LPRECT);
+BOOL Rectangle(HDC,int,int,int,int);
+BOOL RedrawWindow(HWND,LPRECT,HRGN,UINT);
+ATOM RegisterClass(LPWNDCLASS);
+WORD RegisterClipboardFormat(LPCSTR);
+WORD RegisterWindowMessage(SEGPTR);
+void ReleaseCapture(void);
+int ReleaseDC(HWND,HDC);
+BOOL RemoveFontResource(LPSTR);
+BOOL RemoveMenu(HMENU,UINT,UINT);
+HANDLE RemoveProp(HWND,SEGPTR);
+void ReplyMessage(LONG);
+BOOL ResizePalette(HPALETTE,UINT);
+BOOL RestoreDC(HDC,short);
+int RestoreVisRgn(HDC);
+BOOL RoundRect(HDC,short,short,short,short,short,short);
+int SaveDC(HDC);
+HRGN SaveVisRgn(HDC);
+DWORD ScaleViewportExt(HDC,short,short,short,short);
+BOOL ScaleViewportExtEx(HDC,short,short,short,short,LPSIZE);
+DWORD ScaleWindowExt(HDC,short,short,short,short);
+BOOL ScaleWindowExtEx(HDC,short,short,short,short,LPSIZE);
+void ScreenToClient(HWND,LPPOINT);
+BOOL ScrollDC(HDC,short,short,LPRECT,LPRECT,HRGN,LPRECT);
+void ScrollWindow(HWND,short,short,LPRECT,LPRECT);
+int ScrollWindowEx(HWND,short,short,LPRECT,LPRECT,HRGN,LPRECT,WORD);
+int SelectClipRgn(HDC,HRGN);
+HANDLE SelectObject(HDC,HANDLE);
+HPALETTE SelectPalette(HDC,HPALETTE,BOOL);
+int SelectVisRgn(HDC,HRGN);
+WORD SelectorAccessRights(WORD,WORD,WORD);
+LONG SendDlgItemMessage(HWND,INT,UINT,WPARAM,LPARAM);
+LRESULT SendMessage(HWND,UINT,WPARAM,LPARAM);
+HWND SetActiveWindow(HWND);
+LONG SetBitmapBits(HBITMAP,LONG,LPSTR);
+DWORD SetBitmapDimension(HBITMAP,short,short);
+BOOL SetBitmapDimensionEx(HBITMAP,short,short,LPSIZE);
+DWORD SetBkColor(HDC,COLORREF);
+WORD SetBkMode(HDC,WORD);
+DWORD SetBrushOrg(HDC,short,short);
+HWND SetCapture(HWND);
+void SetCaretBlinkTime(WORD);
+void SetCaretPos(short,short);
+LONG SetClassLong(HWND,short,LONG);
+WORD SetClassWord(HWND,short,WORD);
+HANDLE SetClipboardData(WORD,HANDLE);
+HWND SetClipboardViewer(HWND);
+int SetCommBreak(int);
+UINT* SetCommEventMask(int,UINT);
+int SetCommState(DCB*);
+void SetConvertHook(BOOL);
+BOOL SetConvertParams(int,int);
+HCURSOR SetCursor(HCURSOR);
+void SetCursorPos(short,short);
+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(LPSTR);
+void SetDlgItemInt(HWND,WORD,WORD,BOOL);
+void SetDlgItemText(HWND,WORD,SEGPTR);
+void SetDoubleClickTime(WORD);
+int SetEnvironment(LPSTR,LPSTR,WORD);
+BOOL SetErrorMode(WORD);
+HWND SetFocus(HWND);
+WORD SetHandleCount(WORD);
+void SetInternalWindowPos(HWND,WORD,LPRECT,LPPOINT);
+void SetKeyboardState(BYTE*);
+WORD SetMapMode(HDC,WORD);
+DWORD SetMapperFlags(HDC,DWORD);
+BOOL SetMenu(HWND,HMENU);
+BOOL SetMenuItemBitmaps(HMENU,UINT,UINT,HBITMAP,HBITMAP);
+BOOL SetMessageQueue(int);
+HANDLE SetMetaFileBits(HANDLE);
+WORD SetPaletteEntries(HPALETTE,WORD,WORD,LPPALETTEENTRY);
+HWND SetParent(HWND,HWND);
+COLORREF SetPixel(HDC,short,short,COLORREF);
+WORD SetPolyFillMode(HDC,WORD);
+BOOL SetProp(HWND,SEGPTR,HANDLE);
+WORD SetROP2(HDC,WORD);
+void SetRect(LPRECT,short,short,short,short);
+void SetRectEmpty(LPRECT);
+void SetRectRgn(HRGN,short,short,short,short);
+WORD SetRelAbs(HDC,WORD);
+FARPROC SetResourceHandler(HANDLE,LPSTR,FARPROC);
+int SetScrollPos(HWND,int,int,BOOL);
+void SetScrollRange(HWND,int,int,int,BOOL);
+WORD SetSelectorBase(WORD,DWORD);
+WORD SetSelectorLimit(WORD,DWORD);
+int SetSoundNoise(int,int);
+WORD SetStretchBltMode(HDC,WORD);
+LONG SetSwapAreaSize(WORD);
+void SetSysColors(int,LPINT,COLORREF*);
+HWND SetSysModalWindow(HWND);
+WORD SetSystemPaletteUse(HDC,WORD);
+WORD SetSystemTimer(HWND,WORD,WORD,FARPROC);
+HGLOBAL SetTaskQueue(HTASK,HGLOBAL);
+WORD SetTextAlign(HDC,WORD);
+short SetTextCharacterExtra(HDC,short);
+DWORD SetTextColor(HDC,DWORD);
+short SetTextJustification(HDC,short,short);
+WORD SetTimer(HWND,WORD,WORD,FARPROC);
+DWORD SetViewportExt(HDC,short,short);
+BOOL SetViewportExtEx(HDC,short,short,LPSIZE);
+DWORD SetViewportOrg(HDC,short,short);
+BOOL SetViewportOrgEx(HDC,short,short,LPPOINT);
+int SetVoiceAccent(int,int,int,int,int);
+int SetVoiceEnvelope(int,int,int);
+int SetVoiceNote(int,int,int,int);
+int SetVoiceQueueSize(int,int);
+int SetVoiceSound(int,LONG,int);
+int SetVoiceThreshold(int,int);
+BOOL SetWinDebugInfo(LPWINDEBUGINFO);
+DWORD SetWindowExt(HDC,short,short);
+BOOL SetWindowExtEx(HDC,short,short,LPSIZE);
+LONG SetWindowLong(HWND,short,LONG);
+DWORD SetWindowOrg(HDC,short,short);
+BOOL SetWindowOrgEx(HDC,short,short,LPPOINT);
+BOOL SetWindowPlacement(HWND,LPWINDOWPLACEMENT);
+BOOL SetWindowPos(HWND,HWND,INT,INT,INT,INT,WORD);
+void SetWindowText(HWND,LPSTR);
+WORD SetWindowWord(HWND,short,WORD);
+FARPROC SetWindowsHook(short,FARPROC);
+HHOOK SetWindowsHookEx(short,HOOKPROC,HINSTANCE,HTASK);
+void ShowCaret(HWND);
+int ShowCursor(BOOL);
+void ShowOwnedPopups(HWND,BOOL);
+void ShowScrollBar(HWND,WORD,BOOL);
+BOOL ShowWindow(HWND,int);
+DWORD SizeofResource(HANDLE,HRSRC);
+int StartSound(void);
+int StopSound(void);
+BOOL StretchBlt(HDC,short,short,short,short,HDC,short,short,short,short,DWORD);
+int StretchDIBits(HDC,WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD,DWORD);
+BOOL SubtractRect(LPRECT,LPRECT,LPRECT);
+BOOL SwapMouseButton(BOOL);
+void SwapRecording(WORD);
+void SwitchStackBack(void);
+void SwitchStackTo(WORD,WORD,WORD);
+int SyncAllVoices(void);
+LONG TabbedTextOut(HDC,short,short,LPSTR,short,short,LPINT,short);
+BOOL TextOut(HDC,short,short,LPSTR,short);
+int Throw(LPCATCHBUF,int);
+int ToAscii(WORD,WORD,LPSTR,LPVOID,WORD);
+BOOL TrackPopupMenu(HMENU,UINT,short,short,short,HWND,LPRECT);
+int TranslateAccelerator(HWND,HANDLE,LPMSG);
+BOOL TranslateMDISysAccel(HWND,LPMSG);
+BOOL TranslateMessage(LPMSG);
+int TransmitCommChar(int,char);
+int UngetCommChar(int,char);
+BOOL UnhookWindowsHook(short,FARPROC);
+BOOL UnhookWindowsHookEx(HHOOK);
+BOOL UnionRect(LPRECT,LPRECT,LPRECT);
+void UnlockSegment(HGLOBAL);
+BOOL UnrealizeObject(HBRUSH);
+BOOL UnregisterClass(SEGPTR,HANDLE);
+int UpdateColors(HDC);
+void UpdateWindow(HWND);
+void ValidateCodeSegments(void);
+LPSTR ValidateFreeSpaces(void);
+void ValidateRect(HWND,LPRECT);
+void ValidateRgn(HWND,HRGN);
+WORD VkKeyScan(WORD);
+SEGPTR WIN16_GlobalLock(HGLOBAL);
+SEGPTR WIN16_LockResource(HANDLE);
+void WaitMessage(void);
+int WaitSoundState(int);
+HANDLE WinExec(LPSTR,WORD);
+BOOL WinHelp(HWND,LPSTR,WORD,DWORD);
+HWND WindowFromPoint(POINT);
+int WriteComm(int,LPSTR,int);
+BOOL WritePrivateProfileString(LPSTR,LPSTR,LPSTR,LPSTR);
+BOOL WriteProfileString(LPSTR,LPSTR,LPSTR);
+void Yield(void);
+LONG _hread(INT,LPSTR,LONG);
+LONG _hwrite(INT,LPCSTR,LONG);
+INT _lclose(INT);
+INT _lcreat(LPSTR,INT);
+LONG _llseek(INT,LONG,INT);
+INT _lopen(LPSTR,INT);
+INT _lread(INT,LPSTR,WORD);
+INT _lwrite(INT,LPCSTR,WORD);
+SEGPTR lstrcat(SEGPTR,SEGPTR);
+INT lstrcmp(LPCSTR,LPCSTR);
+INT lstrcmpi(LPCSTR,LPCSTR);
+SEGPTR lstrcpy(SEGPTR,SEGPTR);
+SEGPTR lstrcpyn(SEGPTR,SEGPTR,WORD);
+INT lstrlen(LPCSTR);
+int wvsprintf(LPSTR,LPSTR,LPSTR);
#ifdef WINELIB
#define WINELIB_UNIMP(x) fprintf (stderr, "WineLib: Unimplemented %s\n", x)
diff --git a/include/wine.h b/include/wine.h
index f6748e0..29b6c44 100644
--- a/include/wine.h
+++ b/include/wine.h
@@ -14,13 +14,9 @@
#endif
-#if defined ( linux) || defined(__svr4__)
-/*
- * SVR4 NOTE:
- * This is not correct but gets it through the compiler
- * Must come back and look at this again
- */
-struct sigcontext_struct {
+#if defined ( linux)
+struct sigcontext_struct
+{
unsigned short sc_gs, __gsh;
unsigned short sc_fs, __fsh;
unsigned short sc_es, __esh;
@@ -44,20 +40,21 @@
unsigned long oldmask;
unsigned long cr2;
};
-#ifdef linux
#define WINE_DATA_SELECTOR 0x2b
#define WINE_CODE_SELECTOR 0x23
-#endif
-#ifdef __svr4__
-#define WINE_DATA_SELECTOR 0x1f
-#define WINE_CODE_SELECTOR 0x17
-#endif
#endif /* linux */
#ifdef __NetBSD__
#include <signal.h>
#define sigcontext_struct sigcontext
-#define HZ 100
+#define WINE_DATA_SELECTOR 0x1f
+#define WINE_CODE_SELECTOR 0x17
+#endif
+
+#ifdef __svr4__
+#include <signal.h>
+#include <sys/ucontext.h>
+#define sigcontext_struct ucontext
#define WINE_DATA_SELECTOR 0x1f
#define WINE_CODE_SELECTOR 0x17
#endif
@@ -65,7 +62,6 @@
#ifdef __FreeBSD__
#include <signal.h>
#define sigcontext_struct sigcontext
-#define HZ 100
#define WINE_DATA_SELECTOR 0x27
#define WINE_CODE_SELECTOR 0x1f
#endif
diff --git a/include/winerror.h b/include/winerror.h
index e1c1dbf..ec4ba25 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -1,2 +1,12 @@
extern int WIN32_LastError;
-#define ERROR_CALL_NOT_IMPLEMENTED 120
+
+/* ERROR_UNKNOWN is a placeholder for error conditions which haven't
+ * been tested yet so we're not exactly sure what will be returned.
+ * All instances of ERROR_UNKNOWN should be tested under Win95/NT
+ * and replaced.
+ */
+#define ERROR_UNKNOWN 99999
+
+#define ERROR_INVALID_HANDLE 6
+#define ERROR_INVALID_PARAMETER 87
+#define ERROR_CALL_NOT_IMPLEMENTED 120
diff --git a/include/winnls.h b/include/winnls.h
index 77d3890..003ad2f 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -1,3 +1,6 @@
+#ifndef __WINE_WINNLS_H
+#define __WINE_WINNLS_H
+
#define LOCALE_ILANGUAGE 0x00000001
#define LOCALE_SLANGUAGE 0x00000002
#define LOCALE_SENGLANGUAGE 0x00001001
@@ -102,3 +105,5 @@
#define NORM_IGNORENONSPACE 2
#define NORM_IGNORESYMBOLS 4
#define NORM_STRINGSORT 0x1000
+
+#endif /* __WINE_WINNLS_H */
diff --git a/include/winsock.h b/include/winsock.h
index 46471ac..6223573 100644
--- a/include/winsock.h
+++ b/include/winsock.h
@@ -65,6 +65,7 @@
#ifndef _SYS_SOCKET_H_
#ifndef _sys_socket_h
#ifndef _NET_TRANSPORT_SOCKET_H
+#ifndef _NET_SOCKET_H
/*
* Structure used by kernel to pass protocol
* information in raw sockets.
@@ -76,6 +77,7 @@
#endif
#endif
#endif
+#endif
/*
* Maximum queue length specifiable by listen.
diff --git a/include/wintypes.h b/include/wintypes.h
index ff785d1..eb917b5 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -79,6 +79,7 @@
DECLARE_HANDLE(HMODULE);
DECLARE_HANDLE(HPALETTE);
DECLARE_HANDLE(HPEN);
+DECLARE_HANDLE(HQUEUE);
DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HRSRC);
DECLARE_HANDLE(HTASK);
@@ -137,4 +138,13 @@
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#endif
+#ifndef DONT_DEFINE_min_AND_max
+#ifndef min
+#define min(a,b) MIN(a,b)
+#endif
+#ifndef max
+#define max(a,b) MAX(a,b)
+#endif
+#endif
+
#endif /* __WINE_WINTYPES_H */
diff --git a/loader/main.c b/loader/main.c
index 08ad7cd..de7df1e 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -58,10 +58,10 @@
/* Initialize Win32 relay code */
if (!RELAY32_Init()) return 0;
+#endif
/* Create built-in modules */
if (!MODULE_Init()) return 0;
-#endif
/* Initialize the DOS file system */
DOS_InitFS();
diff --git a/loader/module.c b/loader/module.c
index 7186c93..2a95c4a 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -29,15 +29,16 @@
static HMODULE hFirstModule = 0;
static HMODULE hCachedModule = 0; /* Module cached by MODULE_OpenFile */
-
+#ifndef WINELIB
static HANDLE hInitialStack32 = 0;
+#endif
/***********************************************************************
* MODULE_LoadBuiltin
*
* 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.
*/
-#ifndef WINELIB /* JBP: Not really allowed in libwine.a (FIXME:?) */
+#ifndef WINELIB
static HMODULE MODULE_LoadBuiltin( LPCSTR name, BOOL force )
{
HMODULE hModule;
@@ -705,7 +706,7 @@
}
if (sel == 0xfe) sel = 0xffff; /* constant entry */
- else sel = NE_SEG_TABLE(pModule)[sel-1].selector;
+ else sel = (WORD)NE_SEG_TABLE(pModule)[sel-1].selector;
return MAKELONG( offset, sel );
}
@@ -912,7 +913,7 @@
HANDLE hInstance, hPrevInstance;
NE_MODULE *pModule;
LOADPARAMS *params = (LOADPARAMS *)paramBlock;
-#ifndef WINELIB /* JBP: Disabled for now in winelib.a */
+#ifndef WINELIB
WORD *pModRef, *pDLLs;
int i, fd;
@@ -1195,9 +1196,15 @@
*/
HANDLE LoadLibrary( LPCSTR libname )
{
+#ifdef WINELIB
+ dprintf_module( stddeb, "LoadLibrary: (%08x) %s\n", (int)libname, libname);
+ WINELIB_UNIMP("LoadLibrary()");
+ return (HANDLE)0;
+#else
HANDLE handle;
dprintf_module( stddeb, "LoadLibrary: (%08x) %s\n", (int)libname, libname);
+
/* This does not increment the module reference count, and will
* therefore cause crashes on FreeLibrary calls.
if ((handle = MODULE_FindModule( libname )) != 0) return handle;
@@ -1212,6 +1219,7 @@
}
if (handle >= (HANDLE)32) NE_InitializeDLLs( GetExePtr(handle) );
return handle;
+#endif
}
@@ -1326,12 +1334,23 @@
}
-#ifndef WINELIB
+/**********************************************************************
+ * GetExpWinVer (KERNEL.167)
+ */
+WORD GetExpWinVer( HMODULE hModule )
+{
+ NE_MODULE *pModule = (NE_MODULE *)GlobalLock( hModule );
+
+ return pModule->expected_version;
+}
+
+
/***********************************************************************
* GetWndProcEntry16 (not a Windows API function)
*
* Return an entry point from the WINPROCS dll.
*/
+#ifndef WINELIB
WNDPROC GetWndProcEntry16( char *name )
{
WORD ordinal;
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 9774817..eff083e 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -1,3 +1,4 @@
+#ifndef WINELIB
/*
* NE modules
*
@@ -532,3 +533,4 @@
void PatchCodeHandle(HANDLE hSel)
{
}
+#endif /* WINELIB */
diff --git a/loader/ne_resource.c b/loader/ne_resource.c
index a83f639..18fd164 100644
--- a/loader/ne_resource.c
+++ b/loader/ne_resource.c
@@ -1,3 +1,4 @@
+#ifndef WINELIB
/*
*
* Copyright 1993 Robert J. Amstadt
@@ -206,10 +207,6 @@
pTypeInfo->count * sizeof(NE_NAMEINFO));
}
}
- fprintf( stderr, "FindResource('%*.*s',%08lx,%08lx): Not found.\n",
- *((BYTE *)pModule + pModule->name_table),
- *((BYTE *)pModule + pModule->name_table),
- (char *)pModule + pModule->name_table + 1, typeId, resId );
return 0;
}
@@ -362,3 +359,4 @@
fprintf( stderr, "FreeResource: "NPFMT" "NPFMT" not found!\n", hModule, handle );
return FALSE;
}
+#endif /* WINELIB */
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 47c9d87..cfd9e08 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -1,3 +1,4 @@
+#ifndef WINELIB
/*
* Copyright 1994 Eric Youndale & Erik Bos
*
@@ -107,7 +108,7 @@
int fixup_failed=0;
/* OK, now dump the import list */
- printf("\nDumping imports list\n");
+ dprintf_win32(stddeb, "\nDumping imports list\n");
pe_imp = pe_imports;
while (pe_imp->ModuleName)
{
@@ -117,7 +118,7 @@
char * c;
Module = ((char *) load_addr) + pe_imp->ModuleName;
- printf("%s\n", Module);
+ dprintf_win32(stddeb, "%s\n", Module);
c = strchr(Module, '.');
if (c) *c = 0;
@@ -135,7 +136,7 @@
fprintf(stderr,"Import by ordinal not supported\n");
exit(0);
}
- printf("--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint);
+ dprintf_win32(stddeb, "--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint);
#ifndef WINELIB /* FIXME: JBP: Should this happen in libwine.a? */
*thunk_list=(unsigned int)RELAY32_GetEntryPoint(Module,pe_name->Name,pe_name->Hint);
#else
@@ -159,11 +160,11 @@
{
int i;
- printf("Dump of segment table\n");
- printf(" Name VSz Vaddr SzRaw Fileadr *Reloc *Lineum #Reloc #Linum Char\n");
+ dprintf_win32(stddeb, "Dump of segment table\n");
+ dprintf_win32(stddeb, " Name VSz Vaddr SzRaw Fileadr *Reloc *Lineum #Reloc #Linum Char\n");
for(i=0; i< wpnt->pe->pe_header->coff.NumberOfSections; i++)
{
- printf("%8s: %4.4lx %8.8lx %8.8lx %8.8lx %8.8lx %8.8lx %4.4x %4.4x %8.8lx\n",
+ dprintf_win32(stddeb, "%8s: %4.4lx %8.8lx %8.8lx %8.8lx %8.8lx %8.8lx %4.4x %4.4x %8.8lx\n",
wpnt->pe->pe_seg[i].Name,
wpnt->pe->pe_seg[i].Virtual_Size,
wpnt->pe->pe_seg[i].Virtual_Address,
@@ -200,7 +201,7 @@
wpnt->pe->pe_header->coff.NumberOfSections);
load_addr = wpnt->pe->pe_header->opt_coff.BaseOfImage;
- printf("Load addr is %x\n",load_addr);
+ dprintf_win32(stddeb, "Load addr is %x\n",load_addr);
dump_table(wpnt);
for(i=0; i < wpnt->pe->pe_header->coff.NumberOfSections; i++)
@@ -366,7 +367,7 @@
int fs;
struct w_files *wpnt=wine_files;
fs=(int)GlobalAlloc(GHND,0x10000);
- fprintf(stddeb,"Going to start Win32 program\n");
+ dprintf_win32(stddeb,"Going to start Win32 program\n");
InitTask(context);
USER_InitApp(wpnt->hModule);
__asm__ __volatile__("movw %w0,%%fs"::"r" (fs));
@@ -387,3 +388,4 @@
printf("InitPEDLL() called!\n");
}
}
+#endif /* WINELIB */
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index 0bfc987..b9a356d 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -1,3 +1,4 @@
+#ifndef WINELIB
/*
* (c) 1994 Erik Bos <erik@xs4all.nl>
*
@@ -150,3 +151,5 @@
return find_type(r->wpnt->pe->pe_resource, resource_name, type_name);
}
#endif
+
+#endif /* WINELIB */
diff --git a/loader/resource.c b/loader/resource.c
index 437d8e2..42b45cc 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -23,6 +23,7 @@
#include "resource.h"
#include "stddebug.h"
#include "debug.h"
+#include "libres.h"
#define PrintId(name) \
if (HIWORD((DWORD)name)) \
@@ -41,10 +42,18 @@
hModule = GetExePtr( hModule ); /* In case we were passed an hInstance */
dprintf_resource(stddeb, "FindResource: module="NPFMT" type=", hModule );
PrintId( type );
+ if (HIWORD(name)) /* Check for '#xxx' name */
+ {
+ char *ptr = PTR_SEG_TO_LIN( name );
+ if (ptr[0] == '#') {
+ if (!(name = (SEGPTR)atoi( ptr + 1 ))) return 0;
+ }
+ }
dprintf_resource( stddeb, " name=" );
PrintId( name );
dprintf_resource( stddeb, "\n" );
if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
switch(*pModule)
{
case NE_SIGNATURE:
@@ -54,6 +63,9 @@
default:
return 0;
}
+#else
+ return LIBRES_FindResource( hModule, type, name );
+#endif
}
@@ -69,6 +81,7 @@
hModule, hRsrc );
if (!hRsrc) return 0;
if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
switch(*pModule)
{
case NE_SIGNATURE:
@@ -78,6 +91,9 @@
default:
return 0;
}
+#else
+ return LIBRES_LoadResource( hModule, hRsrc );
+#endif
}
@@ -94,6 +110,7 @@
if (!handle) return (SEGPTR)0;
hModule = GetExePtr( handle );
if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
switch(*pModule)
{
case NE_SIGNATURE:
@@ -103,6 +120,9 @@
default:
return 0;
}
+#else
+ return LIBRES_LockResource( hModule, handle );
+#endif
}
/* 32-bit version */
@@ -115,6 +135,7 @@
if (!handle) return NULL;
hModule = GetExePtr( handle );
if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
switch(*pModule)
{
case NE_SIGNATURE:
@@ -124,6 +145,9 @@
default:
return 0;
}
+#else
+ return LIBRES_LockResource( hModule, handle );
+#endif
}
@@ -139,6 +163,7 @@
if (!handle) return FALSE;
hModule = GetExePtr( handle );
if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
switch(*pModule)
{
case NE_SIGNATURE:
@@ -148,6 +173,9 @@
default:
return FALSE;
}
+#else
+ return LIBRES_FreeResource( hModule, handle );
+#endif
}
@@ -163,6 +191,7 @@
hModule, hRsrc );
if (!hRsrc) return 0;
if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
switch(*pModule)
{
case NE_SIGNATURE:
@@ -172,6 +201,9 @@
default:
return 0;
}
+#else
+ return LIBRES_AccessResource( hModule, hRsrc );
+#endif
}
@@ -186,6 +218,7 @@
dprintf_resource(stddeb, "SizeofResource: module="NPFMT" res="NPFMT"\n",
hModule, hRsrc );
if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
switch(*pModule)
{
case NE_SIGNATURE:
@@ -195,6 +228,9 @@
default:
return 0;
}
+#else
+ return LIBRES_SizeofResource( hModule, hRsrc );
+#endif
}
@@ -210,6 +246,7 @@
hModule, hRsrc, size );
if (!hRsrc) return 0;
if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
switch(*pModule)
{
case NE_SIGNATURE:
@@ -219,6 +256,9 @@
default:
return 0;
}
+#else
+ return LIBRES_AllocResource( hModule, hRsrc, size );
+#endif
}
/**********************************************************************
diff --git a/loader/signal.c b/loader/signal.c
index 8a31b8d..6150f72 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -18,7 +18,6 @@
#include "miscemu.h"
#include "registers.h"
#include "win.h"
-#include "xmalloc.h"
#if !defined(BSD4_4) || defined(linux) || defined(__FreeBSD__)
char * cstack[4096];
@@ -46,20 +45,25 @@
#endif
-#if defined(linux) || defined(__svr4__)
+#if defined(linux)
static void win_fault(int signal, struct sigcontext_struct context_struct)
{
struct sigcontext_struct *context = &context_struct;
+#elif defined(__svr4__)
+static void win_fault(int signal, void *siginfo, ucontext_t *context)
+{
#else
static void win_fault(int signal, int code, struct sigcontext *context)
{
#endif
+ int i;
+
if (signal != SIGTRAP)
{
if (CS_reg(context) == WINE_CODE_SELECTOR)
{
- fprintf(stderr, "Segmentation fault in Wine program (%04x:%08lx)."
- " Please debug.\n",
+ fprintf(stderr, "Segmentation fault in Wine program (%x:%lx)."
+ " Please debug\n",
CS_reg(context), EIP_reg(context) );
}
else if (INSTR_EmulateInstruction( context )) return;
@@ -100,11 +104,15 @@
sigset_t sig_mask;
struct sigaltstack ss;
-#if !defined (__FreeBSD__)
- ss.ss_base = xmalloc (MINSIGSTKSZ);
+#if !defined (__FreeBSD__)
+ if ((ss.ss_base = malloc(MINSIGSTKSZ)) == NULL) {
#else
- ss.ss_sp = xmalloc (MINSIGSTKSZ);
+ if ((ss.ss_sp = malloc(MINSIGSTKSZ)) == NULL) {
#endif
+ fprintf(stderr, "Unable to allocate signal stack (%d bytes)\n",
+ MINSIGSTKSZ);
+ exit(1);
+ }
ss.ss_size = MINSIGSTKSZ;
ss.ss_flags = 0;
if (sigaltstack(&ss, NULL) < 0) {
@@ -143,6 +151,56 @@
}
#endif /* CONFIG_IPC */
#endif /* __FreeBSD__ || __NetBSD__ */
+#if defined (__svr4__)
+ sigset_t sig_mask;
+ struct sigaltstack ss;
+
+ if ((ss.ss_sp = malloc(SIGSTKSZ) ) == NULL) {
+ fprintf(stderr, "Unable to allocate signal stack (%d bytes)\n",
+ SIGSTKSZ);
+ exit(1);
+ }
+ ss.ss_size = SIGSTKSZ;
+ ss.ss_flags = 0;
+ if (sigaltstack(&ss, NULL) < 0) {
+ perror("sigstack");
+ exit(1);
+ }
+ sigemptyset(&sig_mask);
+ segv_act.sa_handler = (void (*)) win_fault;
+ segv_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
+ segv_act.sa_mask = sig_mask;
+ if (sigaction(SIGBUS, &segv_act, NULL) < 0) {
+ perror("sigaction: SIGBUS");
+ exit(1);
+ }
+ segv_act.sa_handler = (void (*)) win_fault;
+ segv_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
+ segv_act.sa_mask = sig_mask;
+ if (sigaction(SIGSEGV, &segv_act, NULL) < 0) {
+ perror("sigaction: SIGSEGV");
+ exit(1);
+ }
+
+
+ segv_act.sa_handler = (void (*)) win_fault; /* For breakpoints */
+ segv_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
+ segv_act.sa_mask = sig_mask;
+ if (sigaction(SIGTRAP, &segv_act, NULL) < 0) {
+ perror("sigaction: SIGTRAP");
+ exit(1);
+ }
+#ifdef CONFIG_IPC
+ usr2_act.sa_handler = (void (*)) stop_wait; /* For breakpoints */
+ usr2_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
+ usr2_act.sa_mask = sig_mask;
+ if (sigaction(SIGUSR2, &usr2_act, NULL) < 0) {
+ perror("sigaction: SIGUSR2");
+ exit(1);
+ }
+#endif /* CONFIG_IPC */
+
+#endif /* __svr4__ */
}
#endif /* ifndef WINELIB */
diff --git a/loader/task.c b/loader/task.c
index ae8e2d5..bf383cd 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -419,7 +419,11 @@
pTask->hPrevInstance = hPrevInstance;
pTask->hModule = hModule;
pTask->hParent = hCurrentTask;
+#ifdef WINELIB
+ pTask->curdrive = 'C' - 'A' + 0x80;
+#else
pTask->curdrive = filename[0] - 'A' + 0x80;
+#endif
pTask->magic = TDB_MAGIC;
pTask->nCmdShow = cmdShow;
strcpy( pTask->curdir, filename+2 );
@@ -710,7 +714,7 @@
INSTANCEDATA *pinstance;
LONG stacklow, stackhi;
- context.sc_eax = 0;
+ EAX_reg(&context) = 0;
if (!(pTask = (TDB *)GlobalLock( hCurrentTask ))) return;
if (!(pModule = (NE_MODULE *)GlobalLock( pTask->hModule ))) return;
@@ -730,7 +734,9 @@
firstTask = 0;
}
+#ifndef WINELIB
NE_InitializeDLLs( pTask->hModule );
+#endif
/* Registers on return are:
* ax 1 if OK, 0 on error
@@ -740,13 +746,13 @@
* di instance handle of the new task
* es:bx pointer to command-line inside PSP
*/
- context.sc_eax = 1;
- context.sc_ebx = 0x81;
- context.sc_ecx = pModule->stack_size;
- context.sc_edx = pTask->nCmdShow;
- context.sc_esi = (DWORD)pTask->hPrevInstance;
- context.sc_edi = (DWORD)pTask->hInstance;
- context.sc_es = (WORD)pTask->hPDB;
+ EAX_reg(&context) = 1;
+ EBX_reg(&context) = 0x81;
+ ECX_reg(&context) = pModule->stack_size;
+ EDX_reg(&context) = pTask->nCmdShow;
+ ESI_reg(&context) = (DWORD)pTask->hPrevInstance;
+ EDI_reg(&context) = (DWORD)pTask->hInstance;
+ ES_reg (&context) = (WORD)pTask->hPDB;
/* Initialize the local heap */
if ( pModule->heap_size )
@@ -970,6 +976,28 @@
/***********************************************************************
+ * GetTaskQueueDS (KERNEL.118)
+ */
+#ifndef WINELIB
+void GetTaskQueueDS( struct sigcontext_struct context )
+{
+ DS_reg(&context) = GlobalHandleToSel( GetTaskQueue(0) );
+}
+#endif /* WINELIB */
+
+
+/***********************************************************************
+ * GetTaskQueueES (KERNEL.119)
+ */
+#ifndef WINELIB
+void GetTaskQueueES( struct sigcontext_struct context )
+{
+ ES_reg(&context) = GlobalHandleToSel( GetTaskQueue(0) );
+}
+#endif /* WINELIB */
+
+
+/***********************************************************************
* GetCurrentTask (KERNEL.36)
*/
HTASK GetCurrentTask(void)
diff --git a/memory/selector.c b/memory/selector.c
index 8ca361a..5b42003 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -316,7 +316,7 @@
}
else /* set */
{
- entry.read_only = (val & 2 == 0);
+ entry.read_only = ((val & 2) == 0);
entry.type = (val >> 2) & 3;
entry.seg_32bit = val & 0x4000;
entry.limit_in_pages = val & 0x8000;
diff --git a/misc/comm.c b/misc/comm.c
index bce491c..06501cc 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -626,9 +626,8 @@
port.c_cflag |= CRTSCTS;
if (lpdcb->fDtrDisable)
-#endif
port.c_cflag &= ~CRTSCTS;
-
+#endif
if (lpdcb->fInX)
port.c_iflag |= IXON;
if (lpdcb->fOutX)
@@ -727,16 +726,17 @@
lpdcb->fNull = 0;
lpdcb->fChEvt = 0;
lpdcb->fBinary = 1;
+ lpdcb->fDtrDisable = 0;
#ifndef __svr4__
- lpdcb->fDtrDisable = 0;
+
if (port.c_cflag & CRTSCTS) {
lpdcb->fDtrflow = 1;
lpdcb->fRtsflow = 1;
lpdcb->fOutxCtsFlow = 1;
lpdcb->fOutxDsrFlow = 1;
-#endif
} else
+#endif
lpdcb->fDtrDisable = 1;
if (port.c_iflag & IXON)
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 5b86ad3..73df1d1 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -509,11 +509,10 @@
tmpstr2[0] = 'A'+ drive;
tmpstr2[1] = ':';
tmpstr2[2] = '\\';
- strncpy(tmpstr2 + 3, DOS_GetCurrentDir(drive), 510); tmpstr2[510]=0;
+ strncpy(tmpstr2 + 3, DOS_GetCurrentDir(drive), 507); tmpstr2[510]=0;
if (strlen(tmpstr2) > 3)
- strcat(tmpstr2, "\\");
+ strcat(tmpstr2, "\\");
strncat(tmpstr2, tmpstr, 511-strlen(tmpstr2)); tmpstr2[511]=0;
- printf("strcpy'ing '%s'\n",tmpstr2); fflush(stdout);
strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr2);
}
lpofn->nFileOffset = 0;
diff --git a/misc/dos_fs.c b/misc/dos_fs.c
index 13f52bf..28cdf30 100644
--- a/misc/dos_fs.c
+++ b/misc/dos_fs.c
@@ -24,6 +24,7 @@
#if defined(__NetBSD__) || defined(__FreeBSD__)
#include <sys/param.h>
#include <sys/mount.h>
+#include <sys/errno.h>
#endif
#ifdef __svr4__
#include <sys/statfs.h>
@@ -38,11 +39,6 @@
#include "debug.h"
#include "xmalloc.h"
-#ifndef WINE_INI_GLOBAL
-/* Get the WINE_INI_GLOBAL definition from autoconf.h */
-#include "autoconf.h"
-#endif
-
#define WINE_INI_USER "~/.winerc"
#define MAX_DOS_DRIVES 26
@@ -50,7 +46,6 @@
char WindowsPath[256];
-static int max_open_dirs = 0;
static int CurrentDrive = 2;
struct DosDriveStruct { /* eg: */
@@ -206,7 +201,7 @@
{
int x;
char drive[2], temp[256];
-
+ struct dosdirent *dp;
GetPrivateProfileString("wine", "windows", "c:\\windows",
WindowsDirectory, sizeof(WindowsDirectory), WINE_INI);
@@ -295,9 +290,12 @@
DosDrives[x].disabled);
}
}
-
- for (x=0; x!=max_open_dirs ; x++)
- DosDirs[x].inuse = 0;
+ dp = DosDirs;
+ while (dp)
+ {
+ dp->inuse = 0;
+ dp = dp->next;
+ }
dprintf_dosfs(stddeb,"wine.ini = %s\n",WINE_INI);
dprintf_dosfs(stddeb,"win.ini = %s\n",WIN_INI);
@@ -582,8 +580,11 @@
strcat(temp, dirname);
ToUnix(temp);
DOS_SimplifyPath(temp);
- mkdir(temp,0);
-
+ if (mkdir(temp, S_IRWXU | S_IRWXG | S_IRWXO) == -1)
+ {
+ dprintf_dosfs(stddeb, "DOS_MakeDir: %c:\%s => %s failed errno %d",'A'+drive, dirname, temp, errno);
+ return 0;
+ }
dprintf_dosfs(stddeb, "DOS_MakeDir: %c:\%s => %s",'A'+drive, dirname, temp);
return 1;
}
@@ -845,10 +846,11 @@
struct dosdirent *DOS_opendir(char *dosdirname)
{
- int x, len;
+ int len;
char *unixdirname;
char dirname[256];
DIR *ds;
+ struct dosdirent *dp;
if ((unixdirname = DOS_GetUnixFileName(dosdirname)) == NULL) return NULL;
@@ -856,43 +858,51 @@
strncpy(dirname, unixdirname, len);
dirname[len] = 0;
unixdirname = strrchr(unixdirname, '/') + 1;
+ if ((ds = opendir(dirname)) == NULL)
+ return NULL;
- for (x=0; x <= max_open_dirs; x++) {
- if (x == max_open_dirs) {
- if (DosDirs) {
- DosDirs=(struct dosdirent*)xrealloc(DosDirs,(++max_open_dirs)*sizeof(DosDirs[0]));
- } else {
- DosDirs=(struct dosdirent*)xmalloc(sizeof(DosDirs[0]));
- max_open_dirs=1;
- }
- break; /* this one is definitely not in use */
- }
- if (!DosDirs[x].inuse) break;
- if (strcmp(DosDirs[x].unixpath, dirname) == 0) break;
+ dp = DosDirs;
+ while (dp)
+ {
+ if (dp->inuse)
+ break;
+ if (strcmp(dp->unixpath, dirname) == 0)
+ break;
+ dp = dp->next;
+ }
+ if (!dp)
+ {
+ dp = xmalloc(sizeof(struct dosdirent));
+ dp->next = DosDirs;
+ DosDirs = dp;
}
- strncpy(DosDirs[x].filemask, unixdirname, 12);
- DosDirs[x].filemask[12] = 0;
+ strncpy(dp->filemask, unixdirname, 12);
+ dp->filemask[12] = 0;
dprintf_dosfs(stddeb,"DOS_opendir: %s / %s\n", unixdirname, dirname);
- DosDirs[x].inuse = 1;
- strcpy(DosDirs[x].unixpath, dirname);
- DosDirs[x].entnum = 0;
+ dp->inuse = 1;
+ strcpy(dp->unixpath, dirname);
+ dp->entnum = 0;
- if ((ds = opendir(dirname)) == NULL) return NULL;
- if (-1==(DosDirs[x].telldirnum=telldir(ds))) {
+ if ((dp->telldirnum=telldir(ds)) == -1)
+ {
+ dp->inuse = 0;
closedir(ds);
return NULL;
}
- if (-1==closedir(ds)) return NULL;
-
- return &DosDirs[x];
+ if (closedir(ds) == -1)
+ {
+ dp->inuse = 0;
+ return NULL;
+ }
+ return dp;
}
struct dosdirent *DOS_readdir(struct dosdirent *de)
{
- char temp[256];
+ char temp[WINE_PATH_LENGTH];
struct dirent *d;
struct stat st;
DIR *ds;
diff --git a/misc/file.c b/misc/file.c
index 1d18e83..888701a 100644
--- a/misc/file.c
+++ b/misc/file.c
@@ -50,7 +50,7 @@
switch(iReadWrite & 3)
{
case OF_READ: mode = O_RDONLY; break;
- case OF_WRITE: mode = O_WRONLY; break;
+ case OF_WRITE: mode = O_WRONLY | O_TRUNC; break;
case OF_READWRITE: mode = O_RDWR; break;
}
handle = open( UnixFileName, mode );
@@ -148,7 +148,7 @@
int res, handle;
int verify_time = 0;
- dprintf_file(stddeb,"Openfile(%s,<struct>,%d)\n",lpFileName,wStyle);
+ dprintf_file(stddeb,"Openfile(%s,<struct>,%X)\n",lpFileName,wStyle);
action = wStyle & 0xff00;
@@ -171,7 +171,10 @@
ofs->nErrCode = ExtendedError;
return -1;
}
- handle = open (unixfilename, (wStyle & 0x0003) | O_CREAT, 0666);
+ /* Apparently, at least the OF_READ parameter is ignored when
+ * a file is created. Using O_RDWR makes the most sense.
+ */
+ handle = open (unixfilename, O_TRUNC | O_RDWR | O_CREAT, 0666);
if (handle == -1)
{
errno_to_doserr();
@@ -253,8 +256,8 @@
return 0;
if (action & OF_DELETE)
- return unlink(ofs->szPathName);
-
+ return unlink(DOS_GetUnixFileName(ofs->szPathName));
+ /* FIXME: I suppose we should check return codes here like stat below */
/* Now on to getting some information about that file */
diff --git a/misc/lstr.c b/misc/lstr.c
index a37b6de..b79c3b3 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -138,7 +138,10 @@
if (HIWORD(strOrChar))
{
char *s = PTR_SEG_TO_LIN(strOrChar);
- while (*s) *s++ = ToUpper( *s );
+ while (*s) {
+ *s = ToUpper( *s );
+ s++;
+ }
return strOrChar;
}
else return (SEGPTR)ToUpper( (int)strOrChar );
@@ -151,7 +154,10 @@
/* I am not sure if the locale stuff works with toupper, but then again
I am not sure if the Linux libc locale stuffs works at all */
- while (*s) *s++ = ToUpper( *s );
+ while (*s) {
+ *s = ToUpper( *s );
+ s++;
+ }
return strOrChar;
}
@@ -183,7 +189,10 @@
if (HIWORD(strOrChar))
{
char *s = PTR_SEG_TO_LIN( strOrChar );
- while (*s) *s++ = ToLower( *s );
+ while (*s) {
+ *s = ToLower( *s );
+ s++;
+ }
return strOrChar;
}
else return (SEGPTR)ToLower( (int)strOrChar );
@@ -196,7 +205,10 @@
/* I am not sure if the locale stuff works with toupper, but then again
I am not sure if the Linux libc locale stuffs works at all */
- while (*s) *s++ = ToLower( *s );
+ while (*s) {
+ *s = ToLower( *s );
+ s++;
+ }
return strOrChar;
}
@@ -231,23 +243,25 @@
/* AnsiToOem Keyboard.5 */
-INT AnsiToOem(LPSTR lpAnsiStr, LPSTR lpOemStr) /* why is this int ??? */
+INT AnsiToOem(LPSTR lpAnsiStr, LPSTR lpOemStr)
{
- while(*lpAnsiStr){
- *lpOemStr++=Ansi2Oem[(unsigned char)(*lpAnsiStr++)];
- }
- *lpOemStr = 0;
- return -1;
+ dprintf_keyboard(stddeb, "AnsiToOem: %s\n", lpAnsiStr);
+ while(*lpAnsiStr){
+ *lpOemStr++=Ansi2Oem[(unsigned char)(*lpAnsiStr++)];
+ }
+ *lpOemStr = 0;
+ return -1;
}
/* OemToAnsi Keyboard.6 */
-BOOL OemToAnsi(LPSTR lpOemStr, LPSTR lpAnsiStr) /* why is this BOOL ???? */
+BOOL OemToAnsi(LPSTR lpOemStr, LPSTR lpAnsiStr)
{
- while(*lpOemStr){
- *lpAnsiStr++=Oem2Ansi[(unsigned char)(*lpOemStr++)];
- }
- *lpAnsiStr = 0;
- return -1;
+ dprintf_keyboard(stddeb, "OemToAnsi: %s\n", lpOemStr);
+ while(*lpOemStr){
+ *lpAnsiStr++=Oem2Ansi[(unsigned char)(*lpOemStr++)];
+ }
+ *lpAnsiStr = 0;
+ return -1;
}
/* AnsiToOemBuff Keyboard.134 */
diff --git a/misc/main.c b/misc/main.c
index 9de2fe7..8f2a426 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -44,6 +44,18 @@
"Gregory Trubetskoy, Michael Veksler, Morten Welinder, Jan Willamowius, "
"Carl Williams, Karl Guenter Wuensch, Eric Youngdale, and James Youngman.";
+static const char *langNames[] =
+{
+ "En", /* LANG_En */
+ "Es", /* LANG_Es */
+ "De", /* LANG_De */
+ "No", /* LANG_No */
+ "Fr", /* LANG_Fr */
+ "Fi", /* LANG_Fi */
+ "Da", /* LANG_Da */
+ NULL
+};
+
#define WINE_CLASS "Wine" /* Class name for resources */
typedef struct tagENVENTRY {
@@ -75,7 +87,13 @@
FALSE,
FALSE, /* AllowReadOnly */
FALSE, /* Enhanced mode */
- FALSE /* IPC enabled */
+ FALSE, /* IPC enabled */
+#ifdef DEFAULT_LANG
+ DEFAULT_LANG /* Default language */
+#else
+ LANG_En
+#endif
+
};
@@ -87,6 +105,7 @@
{ "-display", ".display", XrmoptionSepArg, (caddr_t)NULL },
{ "-iconic", ".iconic", XrmoptionNoArg, (caddr_t)"on" },
{ "-ipc", ".ipc", XrmoptionNoArg, (caddr_t)"off"},
+ { "-language", ".language", XrmoptionSepArg, (caddr_t)"En" },
{ "-name", ".name", XrmoptionSepArg, (caddr_t)NULL },
{ "-privatemap", ".privatemap", XrmoptionNoArg, (caddr_t)"on" },
{ "-fixedmap", ".fixedmap", XrmoptionNoArg, (caddr_t)NULL },
@@ -110,6 +129,7 @@
" -iconic Start as an icon\n" \
" -ipc Enable IPC facilities\n" \
" -debug Enter debugger before starting application\n" \
+ " -language xx Set the language (one of En,Es,De,No,Fr,Fi,Da)\n" \
" -name name Set the application name\n" \
" -privatemap Use a private color map\n" \
" -fixedmap Use a \"standard\" color map\n" \
@@ -272,6 +292,28 @@
/***********************************************************************
+ * MAIN_ParseLanguageOption
+ *
+ * Parse -language option.
+ */
+static void MAIN_ParseLanguageOption( char *arg )
+{
+ const char **p = langNames;
+
+ Options.language = LANG_En; /* First language */
+ for (p = langNames; *p; p++)
+ {
+ if (!strcasecmp( *p, arg )) return;
+ Options.language++;
+ }
+ fprintf( stderr, "Invalid language specified '%s'. Supported languages are: ", arg );
+ for (p = langNames; *p; p++) fprintf( stderr, "%s ", *p );
+ fprintf( stderr, "\n" );
+ exit(1);
+}
+
+
+/***********************************************************************
* MAIN_ParseOptions
*
* Parse command line options and open display.
@@ -329,6 +371,8 @@
screenDepth = atoi( value.addr );
if (MAIN_GetResource( db, ".desktop", &value))
Options.desktopGeometry = value.addr;
+ if (MAIN_GetResource( db, ".language", &value))
+ MAIN_ParseLanguageOption( (char *)value.addr );
#ifdef DEBUG_RUNTIME
if (MAIN_GetResource( db, ".debugoptions", &value))
ParseDebugOptions((char*)value.addr);
@@ -610,7 +654,7 @@
{
LPENVENTRY lpNewEnv;
LPENVENTRY lpEnv = lpEnvList;
- printf("SetEnvironnement('%s', '%s', %d) !\n",
+ dprintf_env(stddeb, "SetEnvironnement('%s', '%s', %d) !\n",
lpPortName, lpEnviron, nCount);
if (lpPortName == NULL) return -1;
while (lpEnv != NULL) {
@@ -621,28 +665,28 @@
free(lpEnv->Value);
free(lpEnv->Name);
free(lpEnv);
- printf("SetEnvironnement() // entry deleted !\n");
+ dprintf_env(stddeb, "SetEnvironnement() // entry deleted !\n");
return -1;
}
free(lpEnv->Value);
lpEnv->Value = malloc(nCount);
if (lpEnv->Value == NULL) {
- printf("SetEnvironment() // Error allocating entry value !\n");
+ dprintf_env(stddeb, "SetEnvironment() // Error allocating entry value !\n");
return 0;
}
memcpy(lpEnv->Value, lpEnviron, nCount);
lpEnv->wSize = nCount;
- printf("SetEnvironnement() // entry modified !\n");
+ dprintf_env(stddeb, "SetEnvironnement() // entry modified !\n");
return nCount;
}
if (lpEnv->Next == NULL) break;
lpEnv = lpEnv->Next;
}
if (nCount == 0 || lpEnviron == NULL) return -1;
- printf("SetEnvironnement() // new entry !\n");
+ dprintf_env(stddeb, "SetEnvironnement() // new entry !\n");
lpNewEnv = malloc(sizeof(ENVENTRY));
if (lpNewEnv == NULL) {
- printf("SetEnvironment() // Error allocating new entry !\n");
+ dprintf_env(stddeb, "SetEnvironment() // Error allocating new entry !\n");
return 0;
}
if (lpEnvList == NULL) {
@@ -656,13 +700,13 @@
lpNewEnv->Next = NULL;
lpNewEnv->Name = malloc(strlen(lpPortName) + 1);
if (lpNewEnv->Name == NULL) {
- printf("SetEnvironment() // Error allocating entry name !\n");
+ dprintf_env(stddeb, "SetEnvironment() // Error allocating entry name !\n");
return 0;
}
strcpy(lpNewEnv->Name, lpPortName);
lpNewEnv->Value = malloc(nCount);
if (lpNewEnv->Value == NULL) {
- printf("SetEnvironment() // Error allocating entry value !\n");
+ dprintf_env(stddeb, "SetEnvironment() // Error allocating entry value !\n");
return 0;
}
memcpy(lpNewEnv->Value, lpEnviron, nCount);
@@ -688,18 +732,18 @@
{
WORD nCount;
LPENVENTRY lpEnv = lpEnvList;
- printf("GetEnvironnement('%s', '%s', %d) !\n",
+ dprintf_env(stddeb, "GetEnvironnement('%s', '%s', %d) !\n",
lpPortName, lpEnviron, nMaxSiz);
while (lpEnv != NULL) {
if (lpEnv->Name != NULL && strcmp(lpEnv->Name, lpPortName) == 0) {
nCount = MIN(nMaxSiz, lpEnv->wSize);
memcpy(lpEnviron, lpEnv->Value, nCount);
- printf("GetEnvironnement() // found '%s' !\n", lpEnviron);
+ dprintf_env(stddeb, "GetEnvironnement() // found '%s' !\n", lpEnviron);
return nCount;
}
lpEnv = lpEnv->Next;
}
- printf("GetEnvironnement() // not found !\n");
+ dprintf_env(stddeb, "GetEnvironnement() // not found !\n");
return 0;
}
diff --git a/misc/profile.c b/misc/profile.c
index 7dce512..080c3dc 100644
--- a/misc/profile.c
+++ b/misc/profile.c
@@ -20,6 +20,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <ctype.h>
#include "wine.h"
#include "windows.h"
@@ -34,8 +35,6 @@
#define STRSIZE 255
#define overflow (next == &CharBuffer [STRSIZE-1])
-enum { FirstBrace, OnSecHeader, IgnoreToEOL, KeyDef, KeyValue };
-
typedef struct TKeys {
char *KeyName;
char *Value;
@@ -93,14 +92,16 @@
static TSecHeader *load (char *filename, char **pfullname)
{
FILE *f;
- int state;
TSecHeader *SecHeader = 0;
char CharBuffer [STRSIZE];
- char *next = '\0';
+ char *bufptr;
+ char *lastnonspc;
+ int bufsize;
char *file;
- char c;
+ int c;
char path[MAX_PATH+1];
-
+ BOOL firstbrace;
+
*pfullname = NULL;
/* Try the Windows directory */
@@ -135,96 +136,99 @@
*pfullname = strdup(file);
dprintf_profile(stddeb,"Loading %s\n", file);
-
- state = FirstBrace;
- next = CharBuffer;
- while ((c = fgetc (f)) != EOF){
- if (c == '\r') /* Ignore Carriage Return */
+ firstbrace = TRUE;
+ for(;;) {
+ c = fgetc(f);
+ if (c == EOF) goto finished;
+
+ if (isspace(c))
continue;
- switch (state){
-
- case OnSecHeader:
- if (c == ']' || overflow){
- *next = '\0';
- next = CharBuffer;
- SecHeader->AppName = strdup (CharBuffer);
- state = IgnoreToEOL;
- dprintf_profile(stddeb,"%s: section %s\n", file, CharBuffer);
- } else
- *next++ = c;
- break;
-
- case IgnoreToEOL:
- if (c == '\n'){
- state = KeyDef;
- next = CharBuffer;
- }
- break;
-
- case FirstBrace:
- case KeyDef:
- if (c == '['){
- TSecHeader *temp;
-
- temp = SecHeader;
- SecHeader = (TSecHeader *) xmalloc (sizeof (TSecHeader));
- SecHeader->link = temp;
- SecHeader->Keys = 0;
- state = OnSecHeader;
- next = CharBuffer;
- break;
- }
- if (state == FirstBrace) /* On first pass, don't allow dangling keys */
- break;
-
- if (c == '\t')
- break;
+ if (c == '[') {
+ TSecHeader *temp = SecHeader;
- if (c == '\n' || c == ';' || overflow) /* Abort Definition */
- next = CharBuffer;
-
- if (c == ';')
- {
- state = IgnoreToEOL;
- break;
- }
-
- if (c == '\n')
- break;
+ SecHeader = (TSecHeader *) xmalloc (sizeof (TSecHeader));
+ SecHeader->link = temp;
+ SecHeader->Keys = NULL;
+ do {
+ c = fgetc(f);
+ if (c == EOF) goto bad_file;
+ } while (isspace(c));
+ bufptr = lastnonspc = CharBuffer;
+ bufsize = 0;
+ do {
+ if (c != ']') {
+ bufsize++;
+ *bufptr++ = c;
+ if (!isspace(c))
+ lastnonspc = bufptr;
+ } else
+ break;
+ c = fgetc(f);
+ if (c == EOF) goto bad_file;
+ } while(bufsize < STRSIZE-1);
+ *lastnonspc = 0;
+ if (!strlen(CharBuffer))
+ fprintf(stderr, "warning: empty section name in ini file\n");
+ SecHeader->AppName = strdup (CharBuffer);
+ dprintf_profile(stddeb,"%s: section %s\n", file, CharBuffer);
+ firstbrace = FALSE;
+ } else if (SecHeader) {
+ TKeys *temp = SecHeader->Keys;
+ BOOL skipspc;
- if (c == '=' || overflow){
- TKeys *temp;
+ if (firstbrace)
+ goto bad_file;
+ bufptr = lastnonspc = CharBuffer;
+ bufsize = 0;
+ do {
+ if (c != '=') {
+ bufsize++;
+ *bufptr++ = c;
+ if (!isspace(c))
+ lastnonspc = bufptr;
+ } else
+ break;
+ c = fgetc(f);
+ if (c == EOF) goto bad_file;
+ } while(bufsize < STRSIZE-1);
+ *lastnonspc = 0;
+ if (!strlen(CharBuffer))
+ fprintf(stderr, "warning: empty key name in ini file\n");
+ SecHeader->Keys = (TKeys *) xmalloc (sizeof (TKeys));
+ SecHeader->Keys->link = temp;
+ SecHeader->Keys->KeyName = strdup (CharBuffer);
- temp = SecHeader->Keys;
- while(next[-1]==' ')next--;
- *next = '\0';
- SecHeader->Keys = (TKeys *) xmalloc (sizeof (TKeys));
- SecHeader->Keys->link = temp;
- SecHeader->Keys->KeyName = strdup (CharBuffer);
- state = KeyValue;
- next = CharBuffer;
- dprintf_profile(stddeb,"%s: key %s\n", file, CharBuffer);
- } else {
- *next++ = c;
- }
- break;
-
- case KeyValue:
- if (overflow || c == '\n'){
- *next = '\0';
- SecHeader->Keys->Value = strdup (CharBuffer);
- state = c == '\n' ? KeyDef : IgnoreToEOL;
- next = CharBuffer;
- dprintf_profile (stddeb, "[%s] (%s)=%s\n", SecHeader->AppName,
- SecHeader->Keys->KeyName, SecHeader->Keys->Value);
- } else
- *next++ = c;
- break;
+ dprintf_profile(stddeb,"%s: key %s\n", file, CharBuffer);
- } /* switch */
-
- } /* while ((c = fgetc (f)) != EOF) */
+ bufptr = lastnonspc = CharBuffer;
+ bufsize = 0;
+ skipspc = TRUE;
+ do {
+ c = fgetc(f);
+ if (c == EOF) break;
+ if (c != '\n') {
+ if (!isspace(c) || !skipspc) {
+ skipspc = FALSE;
+ bufsize++;
+ *bufptr++ = c;
+ if (!isspace(c))
+ lastnonspc = bufptr;
+ }
+ } else
+ break;
+ } while(bufsize < STRSIZE-1);
+ *lastnonspc = 0;
+ SecHeader->Keys->Value = strdup (CharBuffer);
+ dprintf_profile (stddeb, "[%s] (%s)=%s\n", SecHeader->AppName,
+ SecHeader->Keys->KeyName, SecHeader->Keys->Value);
+
+ }
+
+ }
+bad_file:
+ fprintf(stderr, "warning: bad ini file\n");
+finished:
return SecHeader;
}
diff --git a/misc/spy.c b/misc/spy.c
index 2d4c430..6c9692a 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -170,7 +170,7 @@
/* 0x0130 */
NULL,
- "WM_LBTRACKPOINT",
+ "wm_lbtrackpoint",
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -251,12 +251,12 @@
"WM_MDIICONARRANGE", /* 0x0228 */
"WM_MDIGETACTIVE", /* 0x0229 */
- "WM_DROPOBJECT",
- "WM_QUERYDROPOBJECT",
- NULL,
- "WM_DRAGLOOP",
- "WM_DRAGSELECT",
- "WM_DRAGMOVE",
+ "wm_dropobject",
+ "wm_querydropobject",
+ "wm_begindrag",
+ "wm_dragloop",
+ "wn_dragselect",
+ "wm_dragmove",
/* 0x0230*/
"WM_MDISETMENU", /* 0x0230 */
diff --git a/misc/user32.c b/misc/user32.c
index b91b749..a9ce9af 100644
--- a/misc/user32.c
+++ b/misc/user32.c
@@ -155,6 +155,8 @@
strcpy( classbuf, class );
titlebuf = alloca( strlen(title)+1 );
strcpy( titlebuf, title );
- return CreateWindowEx( flags, MAKE_SEGPTR(classbuf), MAKE_SEGPTR(titlebuf),
- style,x,y,width,height,parent,menu,instance,param );
+ return (DWORD) CreateWindowEx(flags,MAKE_SEGPTR(classbuf),
+ MAKE_SEGPTR(titlebuf),style,x,y,width,height,
+ (HWND)parent,(HMENU)menu,(HINSTANCE)instance,
+ param);
}
diff --git a/misc/winsocket.c b/misc/winsocket.c
index 52baf78..318c38e 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -11,6 +11,10 @@
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/ioctl.h>
+#ifdef __svr4__
+#include <sys/filio.h>
+#include <sys/ioccom.h>
+#endif
#include <sys/msg.h>
#include <sys/socket.h>
#include <netinet/in.h>
@@ -19,6 +23,7 @@
#include <errno.h>
#include <netdb.h>
#include <unistd.h>
+#undef TRANSPARENT
#include "winsock.h"
#include "toolhelp.h"
#include "stddebug.h"
@@ -196,15 +201,15 @@
case EPROCLIM: return WSAEPROCLIM;
#endif
case EUSERS: return WSAEUSERS;
+#ifdef EDQUOT
case EDQUOT: return WSAEDQUOT;
+#endif
case ESTALE: return WSAESTALE;
case EREMOTE: return WSAEREMOTE;
/* just in case we ever get here and there are no problems */
case 0: return 0;
-#ifdef EDQUOT
default:
-#endif
fprintf(stderr, "winsock: unknown errorno %d!\n", errno);
return WSAEOPNOTSUPP;
}
@@ -241,9 +246,8 @@
/* just in case we ever get here and there are no problems */
case 0: return 0;
-#ifdef EDQUOT
+
default:
-#endif
fprintf(stderr, "winsock: unknown h_errorno %d!\n", h_errno);
return WSAEOPNOTSUPP;
}
diff --git a/miscemu/int21.c b/miscemu/int21.c
index 0228602..8c6fac4 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -555,6 +555,8 @@
{
#ifdef __svr4__
printf("Should call flock and needs porting to lockf\n");
+ result = 0;
+ retries = 0;
#else
result = flock(handle, lock | LOCK_NB);
#endif
@@ -634,7 +636,7 @@
return;
}
- if ((mkdir(dirname,0) == -1) && errno!=EEXIST) {
+ if ((mkdir(dirname, S_IRWXU | S_IRWXG | S_IRWXO) == -1) && errno!=EEXIST) {
Error( CanNotMakeDir, EC_AccessDenied, EL_Disk );
AX_reg(context) = CanNotMakeDir;
SET_CFLAG(context);
@@ -693,7 +695,7 @@
struct dosdirent *dp;
struct tm *t;
BYTE *dta = GetCurrentDTA();
-
+
memcpy(&dp, dta+0x11, sizeof(dp));
dprintf_int(stddeb, "int21: FindNext, dta %p, dp %p\n", dta, dp);
@@ -716,13 +718,14 @@
setword(&dta[0x18], ((t->tm_year - 80) << 9) + (t->tm_mon << 5) +
(t->tm_mday)); /* date */
setdword(&dta[0x1a], dp->filesize);
- strncpy(dta + 0x1e, dp->filename, 13);
+ strncpy(dta + 0x1e, dp->filename, 12);
+ *(dta + 0x1e + 13) = 0;
+ AnsiUpper(dta+0x1e);
AX_reg(context) = 0;
RESET_CFLAG(context);
dprintf_int(stddeb, "int21: FindNext -- (%s) index=%d size=%ld\n", dp->filename, dp->entnum, dp->filesize);
- return;
}
static void FindFirst(struct sigcontext_struct *context)
@@ -761,6 +764,7 @@
dp->search_attribute = ECX_reg(context) & (FA_LABEL | FA_DIREC);
memcpy(dta + 0x11, &dp, sizeof(dp));
FindNext(context);
+
}
static void GetFileDateTime(struct sigcontext_struct *context)
@@ -1459,6 +1463,9 @@
ioctlGetDeviceInfo(&context);
break;
+ case 0x01:
+
+ break;
case 0x08: /* Check if drive is removable. */
drive = BL_reg(&context) ? (BL_reg(&context) - 1)
: DOS_GetDefaultDrive();
diff --git a/miscemu/int2f.c b/miscemu/int2f.c
index 779f6b7..7501c76 100644
--- a/miscemu/int2f.c
+++ b/miscemu/int2f.c
@@ -40,6 +40,8 @@
case 0x4a:
switch(AL_reg(&context))
{
+ case 0x10: /* smartdrv */
+ break; /* not installed */
case 0x12: /* realtime compression interface */
break; /* not installed */
default:
diff --git a/objects/bitmap.c b/objects/bitmap.c
index dde4d94..72e18ad 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -150,15 +150,20 @@
LONG height;
XImage * image;
+ /* KLUDGE! */
+ if (count < 0) {
+ fprintf(stderr, "Negative number of bytes (%ld) passed to GetBitmapBits???\n", count );
+ count = -count;
+ }
bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
if (!bmp) return 0;
- dprintf_bitmap(stddeb, "GetBitmapBits: %dx%d %d colors %p\n",
- bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
- 1 << bmp->bitmap.bmBitsPixel, buffer );
/* Only get entire lines */
height = count / bmp->bitmap.bmWidthBytes;
if (height > bmp->bitmap.bmHeight) height = bmp->bitmap.bmHeight;
+ dprintf_bitmap(stddeb, "GetBitmapBits: %dx%d %d colors %p fetched height: %ld\n",
+ bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
+ 1 << bmp->bitmap.bmBitsPixel, buffer, height );
if (!height) return 0;
if (!(image = BITMAP_BmpToImage( &bmp->bitmap, buffer ))) return 0;
@@ -180,6 +185,11 @@
LONG height;
XImage * image;
+ /* KLUDGE! */
+ if (count < 0) {
+ fprintf(stderr, "Negative number of bytes (%ld) passed to SetBitmapBits???\n", count );
+ count = -count;
+ }
bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
if (!bmp) return 0;
diff --git a/objects/color.c b/objects/color.c
index 41e222c..03cefa9 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -15,15 +15,15 @@
#include "xmalloc.h"
Colormap COLOR_WinColormap = 0;
-int COLOR_FixedMap = 0;
+static int COLOR_FixedMap = 0;
-int COLOR_Redshift = 0;
-int COLOR_Redmax = 0;
-int COLOR_Greenshift = 0;
-int COLOR_Greenmax = 0;
-int COLOR_Blueshift = 0;
-int COLOR_Bluemax = 0;
-int COLOR_Graymax = 0;
+static int COLOR_Redshift = 0;
+static int COLOR_Redmax = 0;
+static int COLOR_Greenshift = 0;
+static int COLOR_Greenmax = 0;
+static int COLOR_Blueshift = 0;
+static int COLOR_Bluemax = 0;
+static int COLOR_Graymax = 0;
/* System palette static colors */
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index fcb553e..4dc22b2 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -33,6 +33,7 @@
#include "stddebug.h"
#include "debug.h"
#include "xmalloc.h"
+#include "task.h"
Cursor CURSORICON_XCursor = None; /* Current X cursor */
@@ -411,6 +412,40 @@
return hNew;
}
+/***********************************************************************
+ * CURSORICON_IconToCursor
+ *
+ * Should convert bitmap to mono and truncate if too large
+ * FIXME: if icon is passed returns a copy of OCR_DRAGOBJECT cursor
+ * but should actually convert icon to cursor.
+ */
+HCURSOR CURSORICON_IconToCursor(HICON hIcon)
+{
+ CURSORICONINFO *ptr = NULL;
+
+ if(hIcon)
+ if (!(ptr = (CURSORICONINFO*)GlobalLock( hIcon ))) return FALSE;
+ if (ptr->bPlanes * ptr->bBitsPerPixel == 1)
+ {
+ return hIcon; /* assuming it's a cursor */
+ }
+ else
+ {
+ /* kludge */
+
+ HTASK hTask = GetCurrentTask();
+ TDB* pTask = (TDB *)GlobalLock(hTask);
+
+ if(!pTask) return 0;
+
+ fprintf( stdnimp, "IconToCursor: Icons are not supported, returning default!\n");
+ return CURSORICON_Copy( pTask->hInstance ,
+ CURSORICON_Load(0,MAKEINTRESOURCE(OCR_DRAGOBJECT),
+ SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE) );
+ }
+
+ return 0;
+}
/***********************************************************************
* LoadCursor (USER.173)
@@ -453,7 +488,7 @@
HICON CreateCursor( HANDLE hInstance, INT xHotSpot, INT yHotSpot,
INT nWidth, INT nHeight, LPSTR lpANDbits, LPSTR lpXORbits)
{
- CURSORICONINFO info = { { xHotSpot, yHotSpot }, nWidth, nHeight, 1, 1 };
+ CURSORICONINFO info = { { xHotSpot, yHotSpot }, nWidth, nHeight, 0, 1, 1 };
dprintf_cursor( stddeb, "CreateCursor: %dx%d spot=%d,%d xor=%p and=%p\n",
nWidth, nHeight, xHotSpot, yHotSpot, lpXORbits, lpANDbits);
@@ -467,7 +502,7 @@
HICON CreateIcon( HANDLE hInstance, INT nWidth, INT nHeight, BYTE bPlanes,
BYTE bBitsPixel, LPSTR lpANDbits, LPSTR lpXORbits)
{
- CURSORICONINFO info = { { 0, 0 }, nWidth, nHeight, bPlanes, bBitsPixel };
+ CURSORICONINFO info = { { 0, 0 }, nWidth, nHeight, 0, bPlanes, bBitsPixel };
dprintf_icon( stddeb, "CreateIcon: %dx%dx%d, xor=%p, and=%p\n",
nWidth, nHeight, bPlanes * bBitsPixel, lpXORbits, lpANDbits);
@@ -584,16 +619,17 @@
/***********************************************************************
* DumpIcon (USER.459)
*/
-DWORD DumpIcon( CURSORICONINFO *info, WORD *lpLen,
- LPSTR *lpXorBits, LPSTR *lpAndBits )
+DWORD DumpIcon( SEGPTR pInfo, WORD *lpLen,
+ SEGPTR *lpXorBits, SEGPTR *lpAndBits )
{
+ CURSORICONINFO *info = PTR_SEG_TO_LIN( pInfo );
int sizeAnd, sizeXor;
if (!info) return 0;
sizeXor = info->nHeight * info->nWidthBytes;
sizeAnd = info->nHeight * ((info->nWidth + 15) / 16 * 2);
- if (lpAndBits) *lpAndBits = (LPSTR)(info + 1);
- if (lpXorBits) *lpXorBits = (LPSTR)(info + 1) + sizeAnd;
+ if (lpAndBits) *lpAndBits = pInfo + sizeof(CURSORICONINFO);
+ if (lpXorBits) *lpXorBits = pInfo + sizeof(CURSORICONINFO) + sizeAnd;
if (lpLen) *lpLen = sizeof(CURSORICONINFO) + sizeAnd + sizeXor;
return MAKELONG( sizeXor, sizeXor );
}
diff --git a/objects/metafile.c b/objects/metafile.c
index e1d176e..6cc68b6 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -7,6 +7,7 @@
*/
#include <string.h>
+#include <fcntl.h>
#include "gdi.h"
#include "bitmap.h"
#include "metafile.h"
@@ -407,7 +408,7 @@
break;
case META_RECTANGLE:
- Ellipse(hdc, *(mr->rdParam + 3), *(mr->rdParam + 2),
+ Rectangle(hdc, *(mr->rdParam + 3), *(mr->rdParam + 2),
*(mr->rdParam + 1), *(mr->rdParam));
break;
@@ -575,7 +576,7 @@
HANDLE hMem = mf->hMetaHdr;
METAHEADER *mh = (METAHEADER *)GlobalLock(hMem);
- dprintf_metafile(stddeb,"GetMetaFileBits: hmf in: %x\n", hmf);
+ dprintf_metafile(stddeb,"GetMetaFileBits: hmf in: "NPFMT"\n", hmf);
/* can't get bits of disk based metafile */
/* FIXME: should the disk file be loaded in this case? */
@@ -591,7 +592,7 @@
GlobalUnlock(hMem);
GlobalFree(hmf);
- dprintf_metafile(stddeb,"GetMetaFileBits: hMem out: %x\n", hMem);
+ dprintf_metafile(stddeb,"GetMetaFileBits: hMem out: "NPFMT"\n", hMem);
return hMem;
}
@@ -607,7 +608,7 @@
METAFILE *mf;
METAHEADER *mh = (METAHEADER *)GlobalLock(hMem);
- dprintf_metafile(stddeb,"SetMetaFileBits: hMem in: %x\n", hMem);
+ dprintf_metafile(stddeb,"SetMetaFileBits: hMem in: "NPFMT"\n", hMem);
if (!mh) return FALSE;
@@ -626,12 +627,12 @@
mf->hMetaHdr = hMem;
mf->wMagic = METAFILE_MAGIC;
mf->MetaOffset = mh->mtHeaderSize * 2;
- mf->hFile = mf->hBuffer = (HANDLE) NULL;
+ mf->hFile = (int) (mf->hBuffer = (HANDLE) NULL);
GlobalUnlock(hMem);
GlobalUnlock(hmf);
- dprintf_metafile(stddeb,"SetMetaFileBits: hmf out: %x\n", hmf);
+ dprintf_metafile(stddeb,"SetMetaFileBits: hmf out: "NPFMT"\n", hmf);
return hmf;
}
diff --git a/objects/oembitmap.c b/objects/oembitmap.c
index c850994..facd5b4 100644
--- a/objects/oembitmap.c
+++ b/objects/oembitmap.c
@@ -167,19 +167,31 @@
#include "bitmaps/ocr_sizenesw"
#include "bitmaps/ocr_sizewe"
#include "bitmaps/ocr_sizens"
+#include "bitmaps/ocr_bummer"
+#include "bitmaps/ocr_dragobject"
#if 0
#include "bitmaps/ocr_sizeall"
#include "bitmaps/ocr_icocur"
#endif
/* Cursor are not all contiguous (go figure...) */
+#define OCR_FIRST0 OCR_BUMMER
+#define OCR_LAST0 OCR_DRAGOBJECT
+#define OCR_BASE0 0
+
#define OCR_FIRST1 OCR_NORMAL
#define OCR_LAST1 OCR_UP
+#define OCR_BASE1 (OCR_BASE0 + OCR_LAST0 - OCR_FIRST0 + 1)
+
#define OCR_FIRST2 OCR_SIZE
-#define OCR_LAST2 OCR_SIZENS /* OCR_ICOCUR */
-#define NB_CURSORS (OCR_LAST2 - OCR_FIRST2 + 1 + OCR_LAST1 - OCR_FIRST1 + 1)
+#define OCR_LAST2 OCR_SIZENS
+#define OCR_BASE2 (OCR_BASE1 + OCR_LAST1 - OCR_FIRST1 + 1)
+
+#define NB_CURSORS (OCR_BASE2 + OCR_LAST2 - OCR_FIRST2 + 1)
static char **OBM_Cursors_Data[NB_CURSORS] =
{
+ ocr_bummer, /* OCR_BUMMER */
+ ocr_dragobject,/* OCR_DRAGOBJECT */
ocr_normal, /* OCR_NORMAL */
ocr_ibeam, /* OCR_IBEAM */
ocr_wait, /* OCR_WAIT */
@@ -389,9 +401,11 @@
if (fCursor)
{
if ((id >= OCR_FIRST1) && (id <= OCR_LAST1))
- id -= OCR_FIRST1;
+ id = OCR_BASE1 + id - OCR_FIRST1;
else if ((id >= OCR_FIRST2) && (id <= OCR_LAST2))
- id += (OCR_LAST1 - OCR_FIRST1 + 1) - OCR_FIRST2;
+ id = OCR_BASE2 + id - OCR_FIRST2;
+ else if ((id >= OCR_FIRST0) && (id <= OCR_LAST0))
+ id = OCR_BASE0 + id - OCR_FIRST0;
else return 0;
if (OBM_Cursors[id]) return OBM_Cursors[id];
}
diff --git a/objects/palette.c b/objects/palette.c
index ccd0b42..f49f066 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -135,8 +135,17 @@
*/
BOOL ResizePalette(HPALETTE hPal, UINT cEntries)
{
- fprintf(stdnimp,"ResizePalette: empty stub! \n");
- return FALSE;
+ fprintf(stdnimp,"ResizePalette: empty stub! \n");
+ return FALSE;
+}
+
+/***********************************************************************
+ * AnimatePalette (GDI.367)
+ */
+void AnimatePalette(HPALETTE hPal, UINT StartIndex, UINT NumEntries,
+ LPPALETTEENTRY PaletteColors)
+{
+ fprintf(stdnimp,"AnimatePalette: empty stub! \n");
}
/***********************************************************************
diff --git a/rc/Makefile.in b/rc/Makefile.in
index 0f558c6..f845784 100644
--- a/rc/Makefile.in
+++ b/rc/Makefile.in
@@ -36,5 +36,5 @@
y.tab.o: y.tab.c y.tab.h parser.h
lex.yy.o: lex.yy.c y.tab.h parser.h
winerc.o: $(TOPSRC)/include/windows.h $(TOPSRC)/include/neexe.h parser.h y.tab.h
-
+
### Dependencies:
diff --git a/rc/winerc.c b/rc/winerc.c
index 06f8396..4e1aa52 100644
--- a/rc/winerc.c
+++ b/rc/winerc.c
@@ -539,13 +539,16 @@
fprintf( header, "/* %s\n"
" * This file is automatically generated. Do not edit!\n"
" */\n\n"
+ "#ifndef __RESOURCE_DEFINED__\n"
+ "#define __RESOURCE_DEFINED__\n"
"struct resource\n"
"{\n"
" int id, type;\n"
" char *name;\n"
" unsigned char *bytes;\n"
" unsigned int size;\n"
- "};\n\n", hname );
+ "};\n"
+ "#endif\n", hname );
/* Declare the resources */
diff --git a/toolkit/Makefile.in b/toolkit/Makefile.in
index 55745dd..a1e6cb0 100644
--- a/toolkit/Makefile.in
+++ b/toolkit/Makefile.in
@@ -7,6 +7,7 @@
atom.c \
arch.c \
heap.c \
+ libres.c \
miscstubs.c \
sup.c \
winmain.c
diff --git a/toolkit/README.libres b/toolkit/README.libres
new file mode 100644
index 0000000..880272f
--- /dev/null
+++ b/toolkit/README.libres
@@ -0,0 +1,37 @@
+ WINElib resources: a proposal
+
+One of the current issues with WINElib is the inadequate support for accessing
+resources by name. I propose the following technique (which I have already
+begun to implement) to allow this:
+
+ An internal table of resource entries is provided along with a registering
+ function for adding a resource to this table. 'winerc' should construct
+ *.c files much the same way as it does now with the inclusion of a single
+ static 'constructor' function that registers the associated resources with
+ the internal mechanism like so:
+
+ static void DoIt() __attribute__ ((constructor));
+ static void DoIt()
+ {
+ LIBRES_RegisterResource(hello3_MENU_MAIN__bytes,
+ sizeof(hello3_MENU_MAIN__bytes),
+ "MAIN",
+ RT_MENU);
+ LIBRES_RegisterResource(hello3_DIALOG_DIADEMO__bytes,
+ sizeof(hello3_DIALOG_DIADEMO__bytes),
+ "DIADEMO",
+ RT_DIALOG);
+ ... etc. ...
+ }
+
+ The internal table can then be searched for the resource by name.
+
+The only potential drawback I've determined so far is this technique's
+reliance on gcc's 'constructor' attribute, which disallows compilation with
+some other compiler. However, I'm guessing that WINE is already heavily
+dependent on gcc, so this is probably not too much of a factor.
+
+Any comments/suggestions/criticisms will be greatly appreciated.
+
+Thank you,
+--Jim
diff --git a/toolkit/heap.c b/toolkit/heap.c
index 75faefc..40e52cb 100644
--- a/toolkit/heap.c
+++ b/toolkit/heap.c
@@ -211,47 +211,13 @@
#else /* WINELIB16 */
-#ifdef DEBUG_HEAP
-static void* LastTwenty[20]={ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 };
+typedef struct { DWORD Size; DWORD Padding[3]; } HeapData;
-void CheckMem(void* f)
+HANDLE HEAP_Alloc (WORD flags, DWORD bytes)
{
- int i;
+ HeapData* m;
- for(i=0; i<20; i++)
- {
- if(LastTwenty[i]==f)
- LastTwenty[i]=NULL;
- else if(LastTwenty[i])
- if( *((int*)LastTwenty[i]) != 0x12345678 ||
- *(((int*)LastTwenty[i])+1) != 0x0fedcba9 )
- fprintf(stderr,"memory corrupted at %p\n",LastTwenty[i]);
- }
- fflush(stderr);
-}
-
-void NewMem(void* n)
-{
- int i;
- for(i=0; i<20; i++)
- if(!LastTwenty[i])
- {
- LastTwenty[i]=n;
- return;
- }
- for(i=0; i<20; i++)
- LastTwenty[i]=LastTwenty[i+1];
- LastTwenty[4]=n;
-}
-#endif
-
-HANDLE LocalAlloc (WORD flags, WORD bytes)
-{
- HANDLE m;
-#ifdef DEBUG_HEAP
- bytes+=2*sizeof(int);
-#endif
-
+ bytes+=sizeof(HeapData);
if (flags & LMEM_WINE_ALIGN)
m = memalign (4, bytes);
else
@@ -260,125 +226,118 @@
if (flags & LMEM_ZEROINIT)
bzero (m, bytes);
}
-#ifdef DEBUG_HEAP
- CheckMem(NULL);
- *((int*) m)=0x12345678;
- *(((int*) m)+1)=0x0fedcba9;
- fprintf(stderr,"%p malloc'd\n",m); fflush(stderr);
- NewMem(m);
- return (HANDLE) (((int*)m)+2);
-#endif
- return m;
+ m->Size=bytes-sizeof(HeapData);
+ return m+1;
}
-WORD LocalCompact (WORD min_free)
+HANDLE HEAP_Free (HANDLE hMem)
{
- return min_free;
+ HeapData* m=(HeapData*)hMem;
+ free(m-1);
+ return 0;
}
-WORD LocalFlags (HANDLE hMem)
+DWORD HEAP_Size (HANDLE hMem)
{
- return 0;
+ HeapData* m=(HeapData*)hMem;
+ return (m-1)->Size;
+}
+
+HANDLE HEAP_ReAlloc(HANDLE hMem,DWORD bytes,UINT flags)
+{
+ HeapData* m=(HeapData*)hMem;
+ if(!bytes)
+ {
+ free(m-1);
+ return 0; /* Inaccurate behavior, but should suffice */
+ }
+ m=realloc (m-1, bytes+sizeof(HeapData));
+ if(flags & LMEM_ZEROINIT && bytes > m->Size)
+ bzero ((char*)m+sizeof(HeapData)+m->Size, bytes-m->Size);
+ m->Size=bytes;
+ return m+1;
+}
+
+HANDLE LocalAlloc (WORD flags, WORD bytes)
+{
+ return HEAP_Alloc(flags,bytes);
+}
+
+UINT LocalFlags (HANDLE hMem)
+{
+ return 0;
}
HANDLE LocalFree (HANDLE hMem)
{
-#ifdef DEBUG_HEAP
- hMem=(HANDLE) (((int*)hMem)-2);
- CheckMem(hMem);
- fprintf(stderr,"%p free-ing...",hMem);
- if( *((int*)hMem) != 0x12345678 ||
- *(((int*)hMem)+1) != 0x0fedcba9 )
- fprintf(stderr,"memory corrupted...");
- else
- {
- *((int*)hMem) = 0x9abcdef0;
- *(((int*)hMem)+1) = 0x87654321;
- }
- fflush(stderr);
-#endif
- free(hMem);
-#ifdef DEBUG_HEAP
- fprintf(stderr,"free'd\n"); fflush(stderr);
-#endif
- return 0;
+ return HEAP_Free(hMem);
}
BOOL LocalInit (HANDLE segment, WORD start, WORD end)
{
- return TRUE;
+ return TRUE;
}
LPVOID LocalLock (HANDLE hMem)
{
+ return hMem;
+}
+
+HANDLE LocalReAlloc (HANDLE hMem, WORD new_size, WORD flags)
+{
+ if (!(flags & LMEM_MODIFY))
+ return HEAP_ReAlloc (hMem, new_size, flags);
+ else
return hMem;
}
-HANDLE LocalReAlloc (HANDLE hMem, WORD flags, WORD bytes)
+UINT LocalSize (HANDLE hMem)
{
-#ifdef DEBUG_HEAP
- LocalFree(hMem);
- return LocalAlloc(flags,bytes);
-#endif
- return realloc(hMem, bytes);
-}
-
-WORD LocalSize (HANDLE hMem)
-{
- /* Not implemented yet */
- return 0;
+ return HEAP_Size(hMem);
}
BOOL LocalUnlock (HANDLE hMem)
{
- return 0;
+ return 0;
}
HANDLE GlobalAlloc (WORD flags, DWORD size)
{
- return LocalAlloc (flags, size);
+ return HEAP_Alloc (flags,size);
}
HANDLE GlobalFree (HANDLE hMem)
{
- return LocalFree (hMem);
+ return HEAP_Free (hMem);
}
LPVOID GlobalLock (HGLOBAL hMem)
{
- return LocalLock (hMem);
+ return hMem;
}
BOOL GlobalUnlock (HANDLE hMem)
{
- return LocalUnlock (hMem);
+ return 0;
}
WORD GlobalFlags (HANDLE hMem)
{
- return LocalFlags (hMem);
+ return LocalFlags (hMem);
}
DWORD GlobalSize (HANDLE hMem)
{
- return LocalSize (hMem);
-}
-
-DWORD GlobalCompact(DWORD desired)
-{
- if (desired)
- return desired;
- else
- return 0x01000000; /* Should check the available core. */
+ return HEAP_Size (hMem);
}
HANDLE GlobalReAlloc(HANDLE hMem, DWORD new_size, WORD flags)
{
- if (!(flags & GMEM_MODIFY))
- return LocalReAlloc (hMem, new_size, flags);
- else
- return hMem;
+ if (!(flags & GMEM_MODIFY))
+ return HEAP_ReAlloc (hMem, new_size, flags);
+ else
+ return hMem;
}
#endif
diff --git a/toolkit/hello3.c b/toolkit/hello3.c
index c688cec..90fadb1 100644
--- a/toolkit/hello3.c
+++ b/toolkit/hello3.c
@@ -1,5 +1,16 @@
#include <windows.h>
#include "hello3res.h"
+#include <commdlg.h>
+
+BOOL FileOpen(HWND hWnd)
+{
+ char filename[80] = "test.c";
+ OPENFILENAME ofn = { sizeof(OPENFILENAME),
+ hWnd, NULL, "C code\0*.c\0", NULL, 0, 0, filename, 80,
+ NULL, 0, NULL, NULL, OFN_CREATEPROMPT |
+ OFN_SHOWHELP, 0, 0, NULL, 0, NULL };
+ return GetOpenFileName(&ofn);
+}
BOOL CALLBACK DlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
@@ -37,6 +48,9 @@
ReleaseDC(wnd,hdc);
return 0;
}
+ case 102:
+ FileOpen(wnd);
+ return 0;
default:
return DefWindowProc (wnd, msg, w, l);
}
diff --git a/toolkit/hello3res.rc b/toolkit/hello3res.rc
index 23f29c5..5f5408c 100644
--- a/toolkit/hello3res.rc
+++ b/toolkit/hello3res.rc
@@ -3,6 +3,7 @@
POPUP "Menu demo" {
MENUITEM "Dialog Demo", 100
MENUITEM "Bitmap Demo", 101
+ MENUITEM "Open...", 102
}
}
@@ -14,13 +15,10 @@
CONTROL "Pushbutton", 100, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 14, 92, 52, 13
CONTROL "Checkbox", 101, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 19, 76, 47, 12
CONTROL "Static text", 102, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 17, 60, 39, 10
-#if 0
- /* Edit controls don't work, yet */
CONTROL "Edit control", 103, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 18, 41, 44, 13
-#endif
CONTROL "Radio button", 104, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 17, 23, 58, 12
CONTROL "Checkbox", 101, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 19, 76, 47, 12
-#if 0
+#if 1
CONTROL "", 106, "COMBOBOX", CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 86, 23, 86, 85
#else
CONTROL "", 106, "LISTBOX", LBS_STANDARD | LBS_DISABLENOSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 86, 23, 86, 85
diff --git a/toolkit/libres.c b/toolkit/libres.c
new file mode 100644
index 0000000..c983ff6
--- /dev/null
+++ b/toolkit/libres.c
@@ -0,0 +1,106 @@
+/*
+ * WINElib-Resources
+ *
+ * Copied and modified heavily from loader/resource.c
+ */
+
+#include <stdio.h>
+#include "windows.h"
+
+struct resource /* This needs to coincide with what winerc generates. */
+{ /* It should really only appear in one place. */
+ int id, type;
+ char *name;
+ unsigned char *bytes;
+ unsigned int size;
+};
+
+typedef struct RLE
+{
+ struct resource** Resources /* NULL-terminated array of pointers */
+ struct RLE* next;
+} ResListE;
+
+static ResListE* ResourceList=NULL;
+
+void LIBRES_RegisterResources(struct resource** Res)
+{
+ ResListE** Curr;
+ ResListE* n;
+ for(Curr=&ResourceList; *Curr; Curr=&((*Curr)->next)) { }
+ n=malloc(sizeof(ResListE));
+ if(n)
+ {
+ n.Resources=Res;
+ n.next=NULL;
+ *Curr=n;
+ }
+ else
+ fprintf(stderr,"LIBRES_RegisterResources(): Out of memory.\n");
+}
+
+/**********************************************************************
+ * LIBRES_FindResource
+ */
+HRSRC LIBRES_FindResource( HMODULE hModule, SEGPTR name, SEGPTR type )
+{
+ WINELIB_UNIMP("LIBRES_FindResource()");
+ return 0;
+}
+
+
+/**********************************************************************
+ * LIBRES_LoadResource
+ */
+HGLOBAL LIBRES_LoadResource( HMODULE hModule, HRSRC hRsrc )
+{
+ return (HGLOBAL)(((struct resource*)hRsrc)->bytes);
+}
+
+
+/**********************************************************************
+ * LIBRES_LockResource
+ */
+LPVOID LIBRES_LockResource( HMODULE hModule, HGLOBAL handle )
+{
+ return handle;
+}
+
+
+/**********************************************************************
+ * LIBRES_FreeResource
+ */
+BOOL LIBRES_FreeResource( HMODULE hModule, HGLOBAL handle )
+{
+ return 0;
+}
+
+
+/**********************************************************************
+ * LIBRES_AccessResource
+ */
+INT LIBRES_AccessResource( HINSTANCE hModule, HRSRC hRsrc )
+{
+ WINELIB_UNIMP("LIBRES_AccessResource()");
+ return -1;
+}
+
+
+/**********************************************************************
+ * LIBRES_SizeofResource
+ */
+DWORD LIBRES_SizeofResource( HMODULE hModule, HRSRC hRsrc )
+{
+ return (HGLOBAL)(((struct resource*)hRsrc)->size);
+}
+
+
+/**********************************************************************
+ * LIBRES_AllocResource
+ */
+HGLOBAL LIBRES_AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size )
+{
+ WINELIB_UNIMP("LIBRES_AllocResource()");
+ return 0;
+}
+
diff --git a/toolkit/miscstubs.c b/toolkit/miscstubs.c
index ddeeb49..edab69e 100644
--- a/toolkit/miscstubs.c
+++ b/toolkit/miscstubs.c
@@ -48,43 +48,20 @@
fprintf(stderr,"JBP: GlobalFreeAll() ignored.\n");
}
-SEGPTR WIN16_GlobalLock(HGLOBAL h)
-{
- return (SEGPTR)h;
-}
-
-
-HLOCAL LOCAL_Free( WORD ds, HLOCAL handle )
-{
- return LocalFree(handle);
-}
-
-HLOCAL LOCAL_Alloc( WORD ds, WORD flags, WORD size )
-{
- return LocalAlloc(flags,size);
-}
-
-HLOCAL LOCAL_ReAlloc( WORD ds, HLOCAL handle, WORD size, WORD flags )
-{
- return LocalReAlloc(handle,size,flags);
-}
-
+SEGPTR WIN16_GlobalLock(HGLOBAL h)
+ { return (SEGPTR)h; }
+HLOCAL LOCAL_Free(WORD ds, HLOCAL handle)
+ { return LocalFree(handle); }
+HLOCAL LOCAL_Alloc(WORD ds, WORD flags, WORD size)
+ { return LocalAlloc(flags,size); }
+HLOCAL LOCAL_ReAlloc(WORD ds, HLOCAL handle, WORD size, WORD flags)
+ { return LocalReAlloc(handle,size,flags); }
NPVOID LOCAL_Lock( WORD ds, HLOCAL handle )
-{
- return LocalLock(handle);
-}
-
+ { return LocalLock(handle); }
BOOL LOCAL_Unlock( WORD ds, HLOCAL handle )
-{
- fprintf(stderr,"JBP: LOCAL_Unlock() ignored.\n");
- return 1;
-}
-
+ { return LocalUnlock(handle); }
WORD LOCAL_Size( WORD ds, HLOCAL handle )
-{
- fprintf(stderr,"JBP: LOCAL_Size() ignored.\n");
- return 0;
-}
+ { return LocalSize(handle); }
void FarSetOwner(HANDLE a, WORD b)
{
diff --git a/tools/build.c b/tools/build.c
index 70ff43f..499f688 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -30,6 +30,7 @@
#define TYPE_RETURN 8
#define TYPE_STUB 9
#define TYPE_STDCALL 10
+#define TYPE_CDECL 11
#define MAX_ORDINALS 1299
@@ -83,6 +84,17 @@
#define CONTEXTOFFSET(reg) \
((int)&(((struct sigcontext_struct *)1)->reg) - 1 \
- sizeof(struct sigcontext_struct))
+#ifdef __svr4__
+#define sc_eax uc_mcontext.gregs[EAX]
+#define sc_ebx uc_mcontext.gregs[EBX]
+#define sc_ecx uc_mcontext.gregs[ECX]
+#define sc_edx uc_mcontext.gregs[EDX]
+#define sc_esi uc_mcontext.gregs[ESI]
+#define sc_edi uc_mcontext.gregs[EDI]
+#define sc_ds uc_mcontext.gregs[DS]
+#define sc_es uc_mcontext.gregs[ES]
+#define sc_eflags uc_mcontext.gregs[EFL]
+#endif
static void *xmalloc (size_t size)
{
@@ -313,6 +325,8 @@
fdp->arg_types[i] = 'l';
else if (!strcmp(token, "ptr"))
fdp->arg_types[i] = 'p';
+ else if (!strcmp(token, "..."))
+ fdp->arg_types[i] = '.';
else
{
fprintf(stderr, "%d: Unknown variable type '%s'\n", Line, token);
@@ -436,6 +450,8 @@
return ParseExportFunction(ordinal, TYPE_REGISTER);
else if (strcmp(token, "stdcall") == 0)
return ParseExportFunction(ordinal, TYPE_STDCALL);
+ else if (strcmp(token, "cdecl") == 0)
+ return ParseExportFunction(ordinal, TYPE_CDECL);
else if (strcmp(token, "equate") == 0)
return ParseEquate(ordinal);
else if (strcmp(token, "return") == 0)
@@ -732,6 +748,7 @@
ORDFUNCDEF *fdp;
ORDRETDEF *rdp;
int i;
+ int varargs;
SpecFp = fopen( specname, "r");
if (SpecFp == NULL)
@@ -744,6 +761,7 @@
printf( "/* File generated automatically, do not edit! */\n" );
printf( "#include <sys/types.h>\n");
+ printf( "#include <stdarg.h>\n");
printf( "#include \"windows.h\"\n");
printf( "#include \"dlls.h\"\n");
printf( "#include \"pe_image.h\"\n");
@@ -768,48 +786,56 @@
printf( "\t/*NOTREACHED*/\n\treturn 0;\n}\n\n");
break;
case TYPE_STDCALL:
+ case TYPE_CDECL:
+ varargs=0;
argc=strlen(fdp->arg_types);
- printf( "void %s_%d(", UpperDLLName, i);
+ printf( "void %s_%d(", UpperDLLName, i);
for(argno=0;argno<argc;argno++)
{
switch(fdp->arg_types[argno])
{
case 'p': printf( "void *");break;
case 'l': printf( "int ");break;
+ case '.': printf( "... ");varargs=argno;break;
default:
fprintf(stderr, "Not supported argument type %c\n",
fdp->arg_types[argno]);
exit(1);
}
- putchar( 'a'+argno );
+ if(fdp->arg_types[argno]!='.') putchar( 'a'+argno );
if (argno!=argc-1) putchar( ',' );
}
- printf( ")\n{\n" );
+ printf( ")" );
+ if(odp->type == TYPE_STDCALL) printf(" /*__attribute__ ((stdcall))*/");
+ printf( "\n{\n" );
+ if (varargs) printf( "\tva_list valist;\n\n\tva_start(valist, %c);",
+ 'a'+varargs-1 );
printf( "\tdprintf_relay(stddeb,\"Call %%s.%%s(");
for (argno=0;argno<argc;argno++)
- {
+ if(fdp->arg_types[argno]!='.')
+ {
putchar( '%' );
putchar( (fdp->arg_types[argno] == 'p') ? 'p' : 'x' );
if (argno < argc-1) putchar( ',' );
- }
+ }
printf( ")\\n\", \"%s\", \"%s\"", UpperDLLName, odp->export_name);
- for(argno=0;argno<argc;argno++) printf( ",%c", 'a'+argno);
+ for(argno=0;argno<argc;argno++)
+ if(fdp->arg_types[argno]!='.') printf( ",%c", 'a'+argno);
printf( ");\n\t%s(", fdp->internal_name );
for(argno=0;argno<argc;argno++)
{
- putchar('a'+argno);
+ if (fdp->arg_types[argno]=='.') printf("valist");
+ else putchar('a'+argno);
if (argno!=argc-1) putchar(',');
}
- printf( ");\n\t__asm__ __volatile__(\"movl %%ebp,%%esp;"
- "popl %%ebp;ret $%d\");\n}\n\n",
- 4*argc);
+ printf( ");\n}\n\n");
break;
case TYPE_RETURN:
printf( "void %s_%d()\n{\n\t", UpperDLLName, i);
printf( "RELAY32_DebugEnter(\"%s\",\"%s\");\n\t",
UpperDLLName, odp->export_name);
printf( "WIN32_LastError=ERROR_CALL_NOT_IMPLEMENTED;\n");
- printf( "\t__asm__ __volatile__ (\"movl %d,%%eax\");\n",
+ printf( "\t__asm__ __volatile__ (\"movl $%d,%%eax\");\n",
rdp->ret_value);
printf( "\t__asm__ __volatile__ (\"movl %%ebp,%%esp;popl %%ebp;"
"ret $%d\");\n}\n\n", rdp->arg_size);
@@ -836,6 +862,7 @@
break;
case TYPE_RETURN:
case TYPE_STDCALL:
+ case TYPE_CDECL:
case TYPE_STUB:
printf( "{\"%s\",%s_%d},\n", odp->export_name, UpperDLLName, i);
break;
diff --git a/win32/Makefile.in b/win32/Makefile.in
index bfabcb6..3980b9e 100644
--- a/win32/Makefile.in
+++ b/win32/Makefile.in
@@ -2,12 +2,16 @@
MODULE = win32
C_SRCS = \
+ advapi.c \
code_page.c \
+ console.c \
environment.c \
error.c \
file.c \
init.c \
memory.c \
+ object_mgt.c \
+ process.c \
thread.c \
time.c
diff --git a/win32/advapi.c b/win32/advapi.c
new file mode 100644
index 0000000..be633d8
--- /dev/null
+++ b/win32/advapi.c
@@ -0,0 +1,34 @@
+/*
+ * Win32 advapi functions
+ *
+ * Copyright 1995 Martin von Loewis
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include "windows.h"
+#include "winerror.h"
+/*#include "kernel32.h"*/
+#include "stddebug.h"
+#include "debug.h"
+
+/***********************************************************************
+ * GetUserNameA (ADVAPI32.67)
+ */
+
+int GetUserNameA(LPSTR lpszName, LPDWORD lpSize)
+{
+ size_t len;
+ char *name;
+
+ name=getlogin();
+ len = name ? strlen(name) : 0;
+ if (!len || !lpSize || len > *lpSize) {
+ if (lpszName) *lpszName = 0;
+ return 0;
+ }
+ *lpSize=len;
+ strcpy(lpszName, name);
+ return 1;
+}
+
diff --git a/win32/code_page.c b/win32/code_page.c
index 1338ea4..1ec9953 100644
--- a/win32/code_page.c
+++ b/win32/code_page.c
@@ -8,6 +8,9 @@
#include "windows.h"
#include "winerror.h"
#include "kernel32.h"
+#include "stddebug.h"
+#include "debug.h"
+
/***********************************************************************
* GetACP (KERNEL32.148)
@@ -36,3 +39,11 @@
return 437; /* MS-DOS United States */
}
+/***********************************************************************
+ * MultiByteToWideChar (KERNEL32.392)
+ */
+int MultiByteToWideChar(UINT page, DWORD flags, char *src, int srclen,
+ WCHAR *dst, int dstlen)
+{
+ return (srclen==-1) ? strlen(src) * 2: srclen*2;
+}
diff --git a/win32/console.c b/win32/console.c
new file mode 100644
index 0000000..48215cf
--- /dev/null
+++ b/win32/console.c
@@ -0,0 +1,22 @@
+/*
+ * Win32 kernel functions
+ *
+ * Copyright 1995 Martin von Loewis and Cameron Heide
+ */
+
+#include <stdio.h>
+#include "windows.h"
+#include "winerror.h"
+#include "kernel32.h"
+#include "wincon.h"
+#include "stddebug.h"
+#include "debug.h"
+
+/***********************************************************************
+ * SetConsoleCtrlHandler (KERNEL32.459)
+ */
+BOOL SetConsoleCtrlHandler(HANDLER_ROUTINE * func, BOOL a)
+{
+ return 0;
+}
+
diff --git a/win32/environment.c b/win32/environment.c
index a37c57f..17e2966 100644
--- a/win32/environment.c
+++ b/win32/environment.c
@@ -10,6 +10,8 @@
#include "winerror.h"
#include "kernel32.h"
#include "task.h"
+#include "stddebug.h"
+#include "debug.h"
/***********************************************************************
@@ -20,7 +22,7 @@
static char buffer[256];
PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() );
memcpy( buffer, &pdb->cmdLine[1], pdb->cmdLine[0] );
- printf("CommandLine = %s\n", buffer );
+ dprintf_win32(stddeb,"CommandLine = %s\n", buffer );
return buffer;
}
diff --git a/win32/error.c b/win32/error.c
index 5bbe1f8..7204884 100644
--- a/win32/error.c
+++ b/win32/error.c
@@ -8,6 +8,8 @@
#include "windows.h"
#include "winerror.h"
#include "kernel32.h"
+#include "stddebug.h"
+#include "debug.h"
static int WIN32_LastError;
diff --git a/win32/file.c b/win32/file.c
index 160fc40..a914e23 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -7,9 +7,48 @@
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
#include "windows.h"
#include "winerror.h"
#include "kernel32.h"
+#include "handle32.h"
+#include "dos_fs.h"
+#include "stddebug.h"
+#define DEBUG_WIN32
+#include "debug.h"
+
+
+extern FILE_OBJECT *hstdin;
+extern FILE_OBJECT *hstdout;
+extern FILE_OBJECT *hstderr;
+
+static int TranslateCreationFlags(DWORD create_flags);
+static int TranslateAccessFlags(DWORD access_flags);
+
+/***********************************************************************
+ * GetFileInformationByHandle (KERNEL32.219)
+ *
+ */
+HANDLE WINAPI CreateFileA(const char * filename, DWORD a, DWORD b, void * c,
+ DWORD d, DWORD e, DWORD f)
+{
+ dprintf_win32(stderr, "CreateFileA: %s\n", filename);
+ return -1;
+}
+
+/***********************************************************************
+ * GetFileInformationByHandle (KERNEL32.219)
+ *
+ */
+DWORD WINAPI GetFileInformationByHandle(HANDLE hFile,
+ BY_HANDLE_FILE_INFORMATION *lpfi)
+{
+ memset(lpfi, 0, sizeof(BY_HANDLE_FILE_INFORMATION));
+ return 1;
+}
/***********************************************************************
* GetFileType (KERNEL32.222)
@@ -17,34 +56,50 @@
* GetFileType currently only supports stdin, stdout, and stderr, which
* are considered to be of type FILE_TYPE_CHAR.
*/
-DWORD GetFileType(HANDLE hFile)
+DWORD GetFileType(FILE_OBJECT *hFile)
{
- DWORD file_type;
-
- if((DWORD)hFile < 3)
+ if(ValidateKernelObject((HANDLE32)hFile) != 0)
{
- file_type = 2; /* FILE_TYPE_CHAR */
+ SetLastError(ERROR_UNKNOWN);
+ return FILE_TYPE_UNKNOWN;
}
- else
+ if(hFile->common.magic != KERNEL_OBJECT_FILE)
{
- file_type = 0; /* FILE_TYPE_UNKNOWN */
+ SetLastError(ERROR_UNKNOWN);
+ return FILE_TYPE_UNKNOWN;
}
- return file_type;
+ return hFile->type;
}
/***********************************************************************
* GetStdHandle (KERNEL32.276)
*/
-HANDLE GetStdHandle(DWORD nStdHandle)
+HANDLE32 GetStdHandle(DWORD nStdHandle)
{
- switch(nStdHandle)
- {
- case -10/*STD_INPUT_HANDLE*/:return (HANDLE)0;
- case -11/*STD_OUTPUT_HANDLE*/:return (HANDLE)1;
- case -12/*STD_ERROR_HANDLE*/:return (HANDLE)2;
- }
- return (HANDLE)-1;
+ HANDLE32 rc;
+
+ switch(nStdHandle)
+ {
+ case STD_INPUT_HANDLE:
+ rc = (HANDLE32)hstdin;
+ break;
+
+ case STD_OUTPUT_HANDLE:
+ rc = (HANDLE32)hstdout;
+ break;
+
+ case STD_ERROR_HANDLE:
+ rc = (HANDLE32)hstderr;
+ break;
+
+ default:
+ rc = INVALID_HANDLE_VALUE;
+ SetLastError(ERROR_UNKNOWN);
+ break;
+ }
+
+ return rc;
}
/***********************************************************************
@@ -53,21 +108,32 @@
* Luckily enough, this function maps almost directly into an lseek
* call, the exception being the use of 64-bit offsets.
*/
-DWORD SetFilePointer(HANDLE hFile, LONG distance, LONG *highword,
+DWORD SetFilePointer(FILE_OBJECT *hFile, LONG distance, LONG *highword,
DWORD method)
{
int rc;
+ if(ValidateKernelObject((HANDLE32)hFile) != 0)
+ {
+ SetLastError(ERROR_UNKNOWN);
+ return ((DWORD)0xFFFFFFFF);
+ }
+ if(hFile->common.magic != KERNEL_OBJECT_FILE)
+ {
+ SetLastError(ERROR_UNKNOWN);
+ return ((DWORD)0xFFFFFFFF);
+ }
+
if(highword != NULL)
{
if(*highword != 0)
{
- printf("SetFilePointer: 64-bit offsets not yet supported.\n");
+ dprintf_win32(stddeb, "SetFilePointer: 64-bit offsets not yet supported.\n");
return -1;
}
}
- rc = lseek((DWORD)hFile, distance, method);
+ rc = lseek(hFile->fd, distance, method);
if(rc == -1)
SetLastError(ErrnoToLastError(errno));
return rc;
@@ -75,22 +141,203 @@
/***********************************************************************
* WriteFile (KERNEL32.578)
- *
- * WriteFile isn't very useful at this point since only standard
- * handles are permitted, but it lets us see runtime errors at least.
*/
-BOOL WriteFile(HANDLE hFile, LPVOID lpBuffer, DWORD numberOfBytesToWrite,
- LPDWORD numberOfBytesWritten, LPOVERLAPPED lpOverlapped)
+BOOL WriteFile(FILE_OBJECT *hFile, LPVOID lpBuffer, DWORD numberOfBytesToWrite,
+ LPDWORD numberOfBytesWritten, LPOVERLAPPED lpOverlapped)
{
int written;
- if((DWORD)hFile < 3)
+ if(ValidateKernelObject((HANDLE32)hFile) != 0)
{
- written = write((DWORD)hFile, lpBuffer, numberOfBytesToWrite);
- if(numberOfBytesWritten)
- *numberOfBytesWritten = written;
+ SetLastError(ERROR_UNKNOWN);
+ return 0;
}
+ if(hFile->common.magic != KERNEL_OBJECT_FILE)
+ {
+ SetLastError(ERROR_UNKNOWN);
+ return 0;
+ }
+
+ written = write(hFile->fd, lpBuffer, numberOfBytesToWrite);
+ if(numberOfBytesWritten)
+ *numberOfBytesWritten = written;
return 1;
}
+/***********************************************************************
+ * ReadFile (KERNEL32.428)
+ */
+BOOL ReadFile(FILE_OBJECT *hFile, LPVOID lpBuffer, DWORD numtoread,
+ LPDWORD numread, LPOVERLAPPED lpOverlapped)
+{
+ int actual_read;
+
+ if(ValidateKernelObject((HANDLE32)hFile) != 0)
+ {
+ SetLastError(ERROR_UNKNOWN);
+ return 0;
+ }
+ if(hFile->common.magic != KERNEL_OBJECT_FILE)
+ {
+ SetLastError(ERROR_UNKNOWN);
+ return 0;
+ }
+
+ actual_read = read(hFile->fd, lpBuffer, numtoread);
+ if(actual_read == -1)
+ {
+ SetLastError(ErrnoToLastError(errno));
+ return 0;
+ }
+ if(numread)
+ *numread = actual_read;
+
+ return 1;
+}
+
+/*************************************************************************
+ * CreateFile (KERNEL32.45)
+ *
+ * Doesn't support character devices or pipes yet.
+ */
+HANDLE32 CreateFile(LPSTR filename, DWORD access, DWORD sharing,
+ LPSECURITY_ATTRIBUTES security, DWORD creation,
+ DWORD attributes, HANDLE32 template)
+{
+ int access_flags, create_flags;
+ int fd;
+ FILE_OBJECT *file_obj;
+ int type;
+
+ /* Translate the various flags to Unix-style.
+ */
+ access_flags = TranslateAccessFlags(access);
+ create_flags = TranslateCreationFlags(creation);
+
+ if(template)
+ printf("CreateFile: template handles not supported.\n");
+
+ /* If the name starts with '\\?' or '\\.', ignore the first 3 chars.
+ */
+ if(!strncmp(filename, "\\\\?", 3) || !strncmp(filename, "\\\\.", 3))
+ filename += 3;
+
+ /* If the name still starts with '\\', it's a UNC name.
+ */
+ if(!strncmp(filename, "\\\\", 2))
+ {
+ printf("CreateFile: UNC names not supported.\n");
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ /* If the name is either CONIN$ or CONOUT$, give them stdin
+ * or stdout, respectively.
+ */
+ if(!strcmp(filename, "CONIN$"))
+ {
+ type = FILE_TYPE_CHAR;
+ fd = 0;
+ }
+ else if(!strcmp(filename, "CONOUT$"))
+ {
+ type = FILE_TYPE_CHAR;
+ fd = 1;
+ }
+ else
+ {
+ type = FILE_TYPE_DISK;
+
+ /* Try to open the file.
+ */
+ fd = open(DOS_GetUnixFileName(filename),
+ access_flags | create_flags, 0666);
+ if(fd == -1)
+ {
+ SetLastError(ErrnoToLastError(errno));
+ return INVALID_HANDLE_VALUE;
+ }
+ }
+
+ /* We seem to have succeeded, so allocate a kernel object
+ * and set it up.
+ */
+ file_obj = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
+ if(file_obj == NULL)
+ {
+ SetLastError(ERROR_UNKNOWN);
+ return INVALID_HANDLE_VALUE;
+ }
+ file_obj->common.magic = KERNEL_OBJECT_FILE;
+ file_obj->fd = fd;
+ file_obj->type = type;
+ file_obj->misc_flags = attributes;
+ file_obj->access_flags = access_flags;
+ file_obj->create_flags = create_flags;
+
+ return (HANDLE32)file_obj;
+}
+
+int CloseFileHandle(FILE_OBJECT *hFile)
+{
+ /* If it's one of the 3 standard handles, don't really
+ * close it.
+ */
+ if(hFile->fd > 2)
+ close(hFile->fd);
+
+ return 1;
+}
+
+static int TranslateAccessFlags(DWORD access_flags)
+{
+ int rc = 0;
+
+ switch(access_flags)
+ {
+ case GENERIC_READ:
+ rc = O_RDONLY;
+ break;
+
+ case GENERIC_WRITE:
+ rc = O_WRONLY;
+ break;
+
+ case (GENERIC_READ | GENERIC_WRITE):
+ rc = O_RDWR;
+ break;
+ }
+
+ return rc;
+}
+
+static int TranslateCreationFlags(DWORD create_flags)
+{
+ int rc = 0;
+
+ switch(create_flags)
+ {
+ case CREATE_NEW:
+ rc = O_CREAT | O_EXCL;
+ break;
+
+ case CREATE_ALWAYS:
+ rc = O_CREAT | O_TRUNC;
+ break;
+
+ case OPEN_EXISTING:
+ rc = 0;
+ break;
+
+ case OPEN_ALWAYS:
+ rc = O_CREAT;
+ break;
+
+ case TRUNCATE_EXISTING:
+ rc = O_TRUNC;
+ break;
+ }
+
+ return rc;
+}
diff --git a/win32/init.c b/win32/init.c
index 0554a2f..b4d3f0d 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -10,9 +10,53 @@
#include "windows.h"
#include "winerror.h"
#include "kernel32.h"
-
+#include "handle32.h"
+#include "stddebug.h"
+#include "debug.h"
+
+/* The global error value
+ */
int WIN32_LastError;
+/* Standard system handles for stdin, stdout, and stderr.
+ */
+FILE_OBJECT *hstdin, *hstdout, *hstderr;
+
+static int CreateStdHandles(void);
+
+/*********************************************************************
+ * CloseHandle (KERNEL32.23)
+ */
+BOOL CloseHandle(HANDLE32 handle)
+{
+ int rc;
+
+ if(ValidateKernelObject(handle) != 0)
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return 0;
+ }
+
+ switch(handle->magic)
+ {
+ case KERNEL_OBJECT_UNUSED:
+ SetLastError(ERROR_INVALID_HANDLE);
+ return 0;
+
+ case KERNEL_OBJECT_FILE:
+ rc = CloseFileHandle((FILE_OBJECT *)handle);
+ break;
+
+ default:
+ printf("CloseHandle: type %ld not implemented yet.\n",
+ handle->magic);
+ break;
+ }
+
+ ReleaseKernelObject(handle);
+ return 0;
+}
+
/***********************************************************************
* GetModuleFileNameA (KERNEL32.235)
*/
@@ -23,6 +67,17 @@
}
/***********************************************************************
+ * GetModuleHandle (KERNEL32.237)
+ */
+HMODULE WIN32_GetModuleHandle(char *module)
+{
+ if(module == NULL)
+ return (HMODULE)0;
+ else
+ return GetModuleHandle(module);
+}
+
+/***********************************************************************
* GetStartupInfoA (KERNEL32.273)
*/
VOID GetStartupInfoA(LPSTARTUPINFO lpStartupInfo)
@@ -38,7 +93,59 @@
lpStartupInfo->hStdError = (HANDLE)2;
}
+/* Initialize whatever internal data structures we need.
+ *
+ * Returns 1 on success, 0 on failure.
+ */
int KERN32_Init(void)
{
+ /* Create the standard system handles
+ */
+ if(CreateStdHandles() != 0)
+ return 0;
+
return 1;
}
+
+/* CreateStdHandles creates the standard input, output, and error handles.
+ * These handles aren't likely to be used since they're generally used for
+ * console output, but startup code still likes to mess with them. They're
+ * also useful for debugging since apps and runtime libraries might write
+ * errors to stderr.
+ *
+ * Returns 0 on success, nonzero on failure.
+ */
+static int CreateStdHandles(void)
+{
+ /* Create the standard input handle.
+ */
+ hstdin = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
+ if(hstdin == NULL)
+ return 1;
+ hstdin->common.magic = KERNEL_OBJECT_FILE;
+ hstdin->fd = 0;
+ hstdin->type = FILE_TYPE_CHAR;
+ hstdin->misc_flags = 0;
+
+ /* Create the standard output handle
+ */
+ hstdout = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
+ if(hstdout == NULL)
+ return 1;
+ hstdout->common.magic = KERNEL_OBJECT_FILE;
+ hstdout->fd = 1;
+ hstdout->type = FILE_TYPE_CHAR;
+ hstdout->misc_flags = 0;
+
+ /* Create the standard error handle
+ */
+ hstderr = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
+ if(hstderr == NULL)
+ return 1;
+ hstderr->common.magic = KERNEL_OBJECT_FILE;
+ hstderr->fd = 2;
+ hstderr->type = FILE_TYPE_CHAR;
+ hstderr->misc_flags = 0;
+
+ return 0;
+}
diff --git a/win32/memory.c b/win32/memory.c
index a654510..2ee8eb5 100644
--- a/win32/memory.c
+++ b/win32/memory.c
@@ -9,9 +9,22 @@
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
+#include <sys/mman.h>
#include "windows.h"
#include "winerror.h"
#include "kernel32.h"
+#include "winbase.h"
+#include "stddebug.h"
+#include "debug.h"
+
+typedef struct {
+ caddr_t ptr;
+ long size;
+} virtual_mem_t;
+
+virtual_mem_t *mem = 0;
+int mem_count = 0;
+int mem_used = 0;
/***********************************************************************
* VirtualAlloc (KERNEL32.548)
@@ -19,9 +32,79 @@
LPVOID VirtualAlloc(LPVOID lpvAddress, DWORD cbSize,
DWORD fdwAllocationType, DWORD fdwProtect)
{
- char *ptr;
+ caddr_t ptr;
+ int i;
+ virtual_mem_t *tmp_mem;
+ int prot;
- printf("VirtualAlloc: size = %ld, address=%p\n", cbSize, lpvAddress);
+ dprintf_win32(stddeb, "VirtualAlloc: size = %ld, address=%p\n", cbSize, lpvAddress);
+ if (fdwAllocationType & MEM_RESERVE || !lpvAddress) {
+ ptr = mmap((void *)((((unsigned long)lpvAddress-1) & 0xFFFF0000L)
+ + 0x00010000L),
+ cbSize, PROT_NONE, MAP_ANON|MAP_PRIVATE,0,0);
+ if (lpvAddress && ((unsigned long)ptr & 0xFFFF0000L)) {
+ munmap(ptr, cbSize);
+ cbSize += 65535;
+ ptr = mmap(lpvAddress, cbSize,
+ PROT_NONE, MAP_ANON|MAP_PRIVATE,0,0);
+ ptr = (void *)((((unsigned long)ptr-1) & 0xFFFF0000L)+0x00010000L);
+ }
+ /* remember the size for VirtualFree since it's going to be handed
+ a zero len */
+ if (ptr) {
+ if (mem_count == mem_used) {
+ tmp_mem = realloc(mem,(mem_count+10)*sizeof(virtual_mem_t));
+ if (!tmp_mem) return 0;
+ mem = tmp_mem;
+ memset(mem+mem_count, 0, 10*sizeof(virtual_mem_t));
+ mem_count += 10;
+ }
+ for (i=0; i<mem_count; i++) {
+ if (!(mem+i)->ptr) {
+ (mem+i)->ptr = ptr;
+ (mem+i)->size = cbSize;
+ mem_used++;
+ break;
+ }
+ }
+ }
+ } else {
+ ptr = lpvAddress;
+ }
+ if (fdwAllocationType & MEM_COMMIT) {
+ switch(fdwProtect & ~(PAGE_GUARD | PAGE_NOCACHE)) {
+ case PAGE_READONLY:
+ prot=PROT_READ;
+ break;
+ case PAGE_READWRITE:
+ prot=PROT_READ|PROT_WRITE;
+ break;
+ case PAGE_WRITECOPY:
+ prot=PROT_WRITE;
+ break;
+ case PAGE_EXECUTE:
+ prot=PROT_EXEC;
+ break;
+ case PAGE_EXECUTE_READ:
+ prot=PROT_EXEC|PROT_READ;
+ break;
+ case PAGE_EXECUTE_READWRITE:
+ prot=PROT_EXEC|PROT_READ|PROT_WRITE;
+ break;
+ case PAGE_EXECUTE_WRITECOPY:
+ prot=PROT_EXEC|PROT_WRITE;
+ break;
+ case PAGE_NOACCESS:
+ default:
+ prot=PROT_NONE;
+ break;
+ }
+ mprotect(ptr, cbSize, prot);
+ }
+ return ptr;
+#if 0
+/* kludge for gnu-win32 */
+ if (fdwAllocationType & MEM_RESERVE) return sbrk(0);
ptr = malloc(cbSize + 65536);
if(ptr)
{
@@ -30,7 +113,8 @@
ptr = (void *)(((unsigned long)ptr & 0xFFFF0000L) + 0x00010000L);
memset(ptr, 0, cbSize);
}
- printf("VirtualAlloc: got pointer %p\n", ptr);
+#endif
+ dprintf_win32(stddeb, "VirtualAlloc: got pointer %p\n", ptr);
return ptr;
}
@@ -39,8 +123,24 @@
*/
BOOL VirtualFree(LPVOID lpvAddress, DWORD cbSize, DWORD fdwFreeType)
{
+ int i;
+
+ if (fdwFreeType & MEM_RELEASE) {
+ for (i=0; i<mem_count; i++) {
+ if ((mem+i)->ptr == lpvAddress) {
+ munmap(lpvAddress, (mem+i)->size);
+ (mem+i)->ptr = 0;
+ mem_used--;
+ break;
+ }
+ }
+ } else {
+ mprotect(lpvAddress, cbSize, PROT_NONE);
+ }
+#if 0
if(lpvAddress)
free(lpvAddress);
+#endif
return 1;
}
diff --git a/win32/object_mgt.c b/win32/object_mgt.c
new file mode 100644
index 0000000..668a13a
--- /dev/null
+++ b/win32/object_mgt.c
@@ -0,0 +1,19 @@
+/*
+ * object_mgt.c - Kernel object management functions
+ *
+ * Revision History:
+ *
+ * Oct 28 1995 C. Heide
+ * First created.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "handle32.h"
+
+int ValidateKernelObject(KERNEL_OBJECT *ptr)
+{
+ return 0;
+}
+
diff --git a/win32/process.c b/win32/process.c
new file mode 100644
index 0000000..3773dbb
--- /dev/null
+++ b/win32/process.c
@@ -0,0 +1,23 @@
+/*
+ * Win32 kernel functions
+ *
+ * Copyright 1995 Martin von Loewis
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include "windows.h"
+#include "winerror.h"
+#include "kernel32.h"
+#include "stddebug.h"
+#include "debug.h"
+
+/***********************************************************************
+ * ExitProcess (KERNEL32.100)
+ */
+
+void ExitProcess(DWORD status)
+{
+ exit(status);
+}
+
diff --git a/win32/thread.c b/win32/thread.c
index e6b9e2c..ec77af5 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -9,6 +9,8 @@
#include "windows.h"
#include "winerror.h"
#include "kernel32.h"
+#include "stddebug.h"
+#include "debug.h"
/***********************************************************************
* GetCurrentThreadId (KERNEL32.200)
diff --git a/win32/time.c b/win32/time.c
index 58f9703..29b20ba 100644
--- a/win32/time.c
+++ b/win32/time.c
@@ -10,6 +10,8 @@
#include "windows.h"
#include "winerror.h"
#include "kernel32.h"
+#include "stddebug.h"
+#include "debug.h"
/***********************************************************************
* GetTimeZoneInformation (KERNEL32.302)
diff --git a/windows/defwnd.c b/windows/defwnd.c
index eda4fe2..786c0a7 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -2,6 +2,7 @@
* Default window procedure
*
* Copyright 1993 Alexandre Julliard
+ * 1995 Alex Korobka
*/
#include <stdlib.h>
@@ -20,6 +21,8 @@
/* Last COLOR id */
#define COLOR_MAX COLOR_BTNHIGHLIGHT
+static short iMenuKey = 0;
+static short iMenuSysKey = 0;
/***********************************************************************
* DEFWND_SetText
@@ -244,16 +247,95 @@
return NC_HandleSysCommand( hwnd, wParam, pt );
}
+ case WM_KEYDOWN:
+
+ if(wParam == VK_F10) iMenuKey = VK_F10;
+ break;
+
case WM_SYSKEYDOWN:
+ /* this breaks current pseudo accelerators but
+ creates a basis for implementing real ones */
+
+ if(wParam == VK_F10)
+ {
+ iMenuKey = VK_F10;
+ break;
+ }
+
if (wParam == VK_MENU)
- { /* Send to WS_OVERLAPPED parent. TODO: Handle MDI */
- SendMessage( WIN_GetTopParent(hwnd), WM_SYSCOMMAND,
- SC_KEYMENU, 0L );
+ {
+ iMenuSysKey = (iMenuSysKey)? 0: 1;
+ iMenuKey = 0;
}
break;
+ case WM_KEYUP:
case WM_SYSKEYUP:
+
+ if( (wParam == VK_MENU && iMenuSysKey) ||
+ (wParam == VK_F10 && iMenuKey) )
+
+ /* Send to WS_OVERLAPPED parent. TODO: Handle MDI */
+ SendMessage( WIN_GetTopParent(hwnd), WM_SYSCOMMAND,
+ SC_KEYMENU, 0L );
+
+ iMenuSysKey = 0;
+ iMenuKey = 0;
break;
+
+ case WM_SHOWWINDOW:
+ if( !lParam ) return 0; /* sent from ShowWindow */
+
+ if( !(wndPtr->dwStyle & WS_POPUP) || !wndPtr->hwndOwner )
+ return 0;
+
+ if( wndPtr->dwStyle & WS_VISIBLE )
+ { if( wParam ) return 0; }
+ else
+ if(!wParam ) return 0;
+
+ ShowWindow(hwnd,(wParam)? SW_SHOWNOACTIVATE: SW_HIDE);
+ break;
+
+ case WM_CANCELMODE:
+
+ /* EndMenu() should be called if in menu state but currently it's
+ impossible to detect - menu code should be updated*/
+
+ if( GetCapture() == hwnd )
+ ReleaseCapture();
+
+ break;
+
+ case WM_VKEYTOITEM:
+ case WM_CHARTOITEM:
+ return -1;
+
+ case WM_DROPOBJECT:
+ return DRAG_FILE;
+
+ case WM_QUERYDROPOBJECT:
+ if(wndPtr->dwExStyle & WS_EX_ACCEPTFILES)
+ return 1;
+ break;
+
+ case WM_QUERYDRAGICON:
+ {
+ HICON hI = 0;
+
+ len = 1;
+ while(len < 64)
+ if( (hI = LoadIcon(wndPtr->hInstance,MAKEINTRESOURCE(len))) )
+ return hI;
+ }
+ break;
+
+ case WM_QUERYOPEN:
+ case WM_QUERYENDSESSION:
+ return 1;
+
}
return 0;
}
+
+
diff --git a/windows/dialog.c b/windows/dialog.c
index 6a16805..8f7cdb0 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -411,7 +411,7 @@
header->y * yUnit / 8,
header->cx * xUnit / 4,
header->cy * yUnit / 8,
- hwnd, (HMENU)header->id,
+ hwnd, (HMENU)((DWORD)header->id),
dlgInfo->hDialogHeap, (SEGPTR)0 );
}
else
@@ -422,7 +422,7 @@
header->y * yUnit / 8,
header->cx * xUnit / 4,
header->cy * yUnit / 8,
- hwnd, (HMENU)header->id,
+ hwnd, (HMENU)((DWORD)header->id),
hInst, (SEGPTR)0 );
}
diff --git a/windows/hook.c b/windows/hook.c
index d56c93f..2460cad 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -1,24 +1,215 @@
/*
* Windows hook functions
*
- * Copyright 1994 Alexandre Julliard
+ * Copyright 1994, 1995 Alexandre Julliard
+ *
+ * Based on investigations by Alex Korobka
*/
-/* Warning!
- * HHOOK is not a real handle, but a 32-bit pointer to a HOOKDATA structure.
- * This is for compatibility with Windows 3.0 where HHOOK was a HOOKPROC.
+/*
+ * Warning!
+ * A HHOOK is a 32-bit handle for compatibility with Windows 3.0 where it was
+ * a pointer to the next function. Now it is in fact composed of a USER heap
+ * handle in the low 16 bits and of a HOOK_MAGIC value in the high 16 bits
+ * (except for WINELIB32 where it is a 32-bit handle). -- AJ
*/
#include "hook.h"
+#include "message.h"
#include "user.h"
#include "stddebug.h"
#include "debug.h"
-HHOOK systemHooks[LAST_HOOK-FIRST_HOOK+1] = { 0, };
+ /* This should probably reside in USER heap */
+static HANDLE HOOK_systemHooks[WH_NB_HOOKS] = { 0, };
- /* Task-specific hooks should probably be in the task structure */
-HHOOK taskHooks[LAST_HOOK-FIRST_HOOK+1] = { 0, };
+/***********************************************************************
+ * HOOK_GetNextHook
+ *
+ * Get the next hook of a given hook.
+ */
+static HANDLE HOOK_GetNextHook( HANDLE hook )
+{
+ HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR( hook );
+ if (!data) return 0;
+ if (data->next) return data->next;
+ if (!data->ownerQueue) return 0; /* Already system hook */
+ /* Now start enumerating the system hooks */
+ return HOOK_systemHooks[data->id - WH_FIRST_HOOK];
+}
+
+
+/***********************************************************************
+ * HOOK_GetHook
+ *
+ * Get the first hook for a given type.
+ */
+static HANDLE HOOK_GetHook( short id )
+{
+ MESSAGEQUEUE *queue;
+ HANDLE hook = 0;
+
+ if ((queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) )) != NULL)
+ hook = queue->hooks[id - WH_FIRST_HOOK];
+ if (!hook) hook = HOOK_systemHooks[id - WH_FIRST_HOOK];
+ return hook;
+}
+
+
+/***********************************************************************
+ * HOOK_SetHook
+ *
+ * Install a given hook.
+ */
+HANDLE HOOK_SetHook( short id, HOOKPROC proc, HINSTANCE hInst, HTASK hTask )
+{
+ HOOKDATA *data;
+ HANDLE handle;
+ HQUEUE hQueue = 0;
+
+ if ((id < WH_FIRST_HOOK) || (id > WH_LAST_HOOK)) return 0;
+ if (!(hInst = GetExePtr( hInst ))) return 0;
+
+ dprintf_hook( stddeb, "Setting hook %d: %08lx "NPFMT" "NPFMT"\n",
+ id, (DWORD)proc, hInst, hTask );
+
+ if (hTask) /* Task-specific hook */
+ {
+ if ((id == WH_JOURNALRECORD) || (id == WH_JOURNALPLAYBACK) ||
+ (id == WH_SYSMSGFILTER)) return 0; /* System-only hooks */
+ if (!(hQueue = GetTaskQueue( hTask ))) return 0;
+ }
+
+ if (id == WH_JOURNALPLAYBACK || id == WH_CBT ||
+ id == WH_DEBUG || id == WH_SHELL)
+ {
+ fprintf( stdnimp, "Unimplemented hook set: (%d,%08lx,"NPFMT","NPFMT")!\n",
+ id, (DWORD)proc, hInst, hTask );
+ }
+
+ /* Create the hook structure */
+
+ if (!(handle = (HANDLE)USER_HEAP_ALLOC( sizeof(HOOKDATA) ))) return 0;
+ data = (HOOKDATA *) USER_HEAP_LIN_ADDR( handle );
+ data->proc = proc;
+ data->id = id;
+ data->ownerQueue = hQueue;
+ data->ownerModule = hInst;
+ data->inHookProc = 0;
+ dprintf_hook( stddeb, "Setting hook %d: ret="NPFMT"\n", id, handle );
+
+ /* Insert it in the correct linked list */
+
+ if (hQueue)
+ {
+ MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock( hQueue );
+ data->next = queue->hooks[id - WH_FIRST_HOOK];
+ queue->hooks[id - WH_FIRST_HOOK] = handle;
+ }
+ else
+ {
+ data->next = HOOK_systemHooks[id - WH_FIRST_HOOK];
+ HOOK_systemHooks[id - WH_FIRST_HOOK] = handle;
+ }
+ return handle;
+}
+
+
+/***********************************************************************
+ * HOOK_RemoveHook
+ *
+ * Remove a hook from the list.
+ */
+static BOOL HOOK_RemoveHook( HANDLE hook )
+{
+ HOOKDATA *data;
+ HANDLE *prevHook;
+
+ dprintf_hook( stddeb, "Removing hook "NPFMT"\n", hook );
+
+ if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook))) return FALSE;
+ if (data->inHookProc)
+ {
+ /* Mark it for deletion later on */
+ dprintf_hook( stddeb, "Hook still running, deletion delayed\n" );
+ data->proc = (FARPROC)0;
+ return TRUE;
+ }
+
+ /* Remove it from the linked list */
+
+ if (data->ownerQueue)
+ {
+ MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock( data->ownerQueue );
+ if (!queue) return FALSE;
+ prevHook = &queue->hooks[data->id - WH_FIRST_HOOK];
+ }
+ else prevHook = &HOOK_systemHooks[data->id - WH_FIRST_HOOK];
+
+ while (*prevHook && *prevHook != hook)
+ prevHook = &((HOOKDATA *)USER_HEAP_LIN_ADDR(*prevHook))->next;
+
+ if (!*prevHook) return FALSE;
+ *prevHook = data->next;
+ USER_HEAP_FREE( hook );
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * HOOK_CallHook
+ *
+ * Call a hook procedure.
+ */
+static DWORD HOOK_CallHook( HANDLE hook, short code,
+ WPARAM wParam, LPARAM lParam )
+{
+ HOOKDATA *data;
+ MESSAGEQUEUE *queue;
+ HANDLE prevHook;
+ DWORD ret;
+
+ /* Find the first hook with a valid proc */
+
+ for (;;)
+ {
+ if (!hook) return 0;
+ if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook))) return 0;
+ if (data->proc) break;
+ hook = data->next;
+ }
+
+ /* Now call it */
+
+ if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
+ prevHook = queue->hCurHook;
+ queue->hCurHook = hook;
+ data->inHookProc = 1;
+
+ dprintf_hook( stddeb, "Calling hook "NPFMT": %d %04lx %08lx\n",
+ hook, code, (DWORD)wParam, lParam );
+ ret = CallHookProc( data->proc, code, wParam, lParam );
+ dprintf_hook( stddeb, "Ret hook "NPFMT" = %08lx\n", hook, ret );
+
+ data->inHookProc = 0;
+ queue->hCurHook = prevHook;
+ if (!data->proc) HOOK_RemoveHook( hook );
+ return ret;
+}
+
+
+/***********************************************************************
+ * HOOK_CallHooks
+ *
+ * Call a hook chain.
+ */
+DWORD HOOK_CallHooks( short id, short code, WPARAM wParam, LPARAM lParam )
+{
+ HANDLE hook = HOOK_GetHook( id );
+ if (!hook) return 0;
+ return HOOK_CallHook( hook, code, wParam, lParam );
+}
/***********************************************************************
@@ -26,55 +217,44 @@
*/
FARPROC SetWindowsHook( short id, HOOKPROC proc )
{
- HHOOK hhook = SetWindowsHookEx( id, proc, 0, 0 );
- HOOKDATA *data = PTR_SEG_TO_LIN(hhook);
- if (data != NULL) {
- data = PTR_SEG_TO_LIN(data->next);
- if (data != NULL) {
- return data->proc;
- }
- }
- return 0;
+#ifdef WINELIB
+ HINSTANCE hInst = 0;
+#else
+ HINSTANCE hInst = FarGetOwner( HIWORD(proc) );
+#endif
+ /* WH_MSGFILTER is the only task-specific hook for SetWindowsHook() */
+ HTASK hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0;
+
+ HANDLE handle = HOOK_SetHook( id, proc, hInst, hTask );
+ if (!handle) return -1;
+ if (!((HOOKDATA *)USER_HEAP_LIN_ADDR( handle ))->next) return 0;
+ /* Not sure if the return value is correct; should not matter much
+ * since it's never used (see DefHookProc). -- AJ */
+#ifdef WINELIB32
+ return (FARPROC)handle;
+#else
+ return (FARPROC)MAKELONG( handle, HOOK_MAGIC );
+#endif
}
/***********************************************************************
* UnhookWindowsHook (USER.234)
*/
-BOOL UnhookWindowsHook( short id, FARPROC hproc )
+BOOL UnhookWindowsHook( short id, HOOKPROC proc )
{
- HHOOK *prevHook,hhook;
-
- prevHook = &TASK_HOOK(id);
- while (*prevHook) {
- HOOKDATA *data = (HOOKDATA *)PTR_SEG_TO_LIN(*prevHook);
+ HANDLE hook = HOOK_GetHook( id );
- if (data->proc == hproc) {
- hhook = *prevHook;
- *prevHook = data->next;
-#ifdef WINELIB32
- USER_HEAP_FREE((HANDLE)hhook);
-#else
- USER_HEAP_FREE(LOWORD(hhook));
-#endif
- return TRUE;
+ dprintf_hook( stddeb, "UnhookWindowsHook: %d %08lx\n", id, (DWORD)proc );
+
+ while (hook)
+ {
+ HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook);
+ if (data->proc == proc) break;
+ hook = HOOK_GetNextHook( hook );
}
- }
- prevHook = &SYSTEM_HOOK(id);
- while (*prevHook) {
- HOOKDATA *data = (HOOKDATA *)PTR_SEG_TO_LIN(*prevHook);
- if (data->proc == hproc) {
- hhook = *prevHook;
- *prevHook = data->next;
-#ifdef WINELIB32
- USER_HEAP_FREE((HANDLE)hhook);
-#else
- USER_HEAP_FREE(LOWORD(hhook));
-#endif
- return TRUE;
- }
- }
- return FALSE;
+ if (!hook) return FALSE;
+ return HOOK_RemoveHook( hook );
}
@@ -83,7 +263,14 @@
*/
DWORD DefHookProc( short code, WORD wParam, DWORD lParam, HHOOK *hhook )
{
- return CallNextHookEx( *hhook, code, wParam, lParam );
+ /* Note: the *hhook parameter is never used, since we rely on the
+ * current hook value from the task queue to find the next hook. */
+ MESSAGEQUEUE *queue;
+ HANDLE next;
+
+ if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
+ if (!(next = HOOK_GetNextHook( queue->hCurHook ))) return 0;
+ return HOOK_CallHook( next, code, wParam, lParam );
}
@@ -92,47 +279,23 @@
*/
BOOL CallMsgFilter( SEGPTR msg, short code )
{
- if (CALL_TASK_HOOK( WH_MSGFILTER, code, 0, (LPARAM)msg ))
- return TRUE;
- return CALL_SYSTEM_HOOK( WH_SYSMSGFILTER, code, 0, (LPARAM)msg );
+ if (GetSysModalWindow()) return FALSE;
+ if (HOOK_CallHooks( WH_SYSMSGFILTER, code, 0, (LPARAM)msg )) return TRUE;
+ return HOOK_CallHooks( WH_MSGFILTER, code, 0, (LPARAM)msg );
}
/***********************************************************************
* SetWindowsHookEx (USER.291)
*/
-HHOOK SetWindowsHookEx( short id, HOOKPROC proc, HINSTANCE hinst, HTASK htask )
+HHOOK SetWindowsHookEx( short id, HOOKPROC proc, HINSTANCE hInst, HTASK hTask )
{
- HOOKDATA *data;
- HANDLE handle;
- HHOOK *prevHook;
-
- if ((id < FIRST_HOOK) || (id > LAST_HOOK)) return 0;
- if (id != WH_GETMESSAGE && id != WH_CALLWNDPROC) {
- fprintf( stdnimp, "Unimplemented hook set: (%d,%08lx,"NPFMT","NPFMT")!\n",
- id, (DWORD)proc, hinst, htask );
- }
- if (htask) /* Task-specific hook */
- {
- if ((id == WH_JOURNALRECORD) || (id == WH_JOURNALPLAYBACK) ||
- (id == WH_SYSMSGFILTER)) return 0;
- prevHook = &TASK_HOOK( id );
- }
- else /* System-wide hook */
- {
- prevHook = &SYSTEM_HOOK( id );
- }
-
- handle = (HANDLE) USER_HEAP_ALLOC( sizeof(*data) );
- if (!handle) return 0;
- data = (HOOKDATA *) USER_HEAP_LIN_ADDR( handle );
-
- data->next = *prevHook;
- data->proc = proc;
- data->id = id;
- data->htask = htask;
- *prevHook = (HHOOK)USER_HEAP_SEG_ADDR(handle);
- return *prevHook;
+ HANDLE handle = HOOK_SetHook( id, proc, hInst, hTask );
+#ifdef WINELIB32
+ return (HHOOK)handle;
+#else
+ return MAKELONG( handle, HOOK_MAGIC );
+#endif
}
@@ -141,22 +304,12 @@
*/
BOOL UnhookWindowsHookEx( HHOOK hhook )
{
- HOOKDATA *data = (HOOKDATA *)PTR_SEG_TO_LIN(hhook);
- HHOOK *prevHook;
-
- if (!data) return FALSE;
- prevHook = data->htask ? &TASK_HOOK(data->id) : &SYSTEM_HOOK(data->id);
- while (*prevHook && (*prevHook != hhook)) {
- prevHook = &((HOOKDATA *)*prevHook)->next;
- }
- if (!*prevHook) return FALSE;
- *prevHook = data->next;
#ifdef WINELIB32
- USER_HEAP_FREE( (HANDLE)hhook );
+ return HOOK_RemoveHook( (HANDLE)hhook );
#else
- USER_HEAP_FREE( hhook & 0xffff );
+ if (HIWORD(hhook) != HOOK_MAGIC) return FALSE; /* Not a new format hook */
+ return HOOK_RemoveHook( LOWORD(hhook) );
#endif
- return TRUE;
}
@@ -165,7 +318,8 @@
*/
DWORD CallNextHookEx( HHOOK hhook, short code, WPARAM wParam, LPARAM lParam )
{
- HOOKDATA *data = (HOOKDATA *)PTR_SEG_TO_LIN(hhook);
- if (data == NULL || !data->next) return 0;
- else return INTERNAL_CALL_HOOK( data->next, code, wParam, lParam );
+ HANDLE next;
+ if (HIWORD(hhook) != HOOK_MAGIC) return 0; /* Not a new format hook */
+ if (!(next = HOOK_GetNextHook( LOWORD(hhook) ))) return 0;
+ return HOOK_CallHook( next, code, wParam, lParam );
}
diff --git a/windows/message.c b/windows/message.c
index a309356..8360974 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -52,29 +52,12 @@
int queueSize;
queueSize = sizeof(MESSAGEQUEUE) + size * sizeof(QMSG);
- if (!(hQueue = GlobalAlloc( GMEM_FIXED, queueSize ))) return 0;
+ if (!(hQueue = GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT, queueSize )))
+ return 0;
msgQueue = (MESSAGEQUEUE *) GlobalLock( hQueue );
- msgQueue->next = 0;
- msgQueue->hTask = 0;
msgQueue->msgSize = sizeof(QMSG);
- msgQueue->msgCount = 0;
- msgQueue->nextMessage = 0;
- msgQueue->nextFreeMessage = 0;
msgQueue->queueSize = size;
- msgQueue->GetMessageTimeVal = 0;
- msgQueue->GetMessagePosVal = 0;
- msgQueue->GetMessageExtraInfoVal = 0;
- msgQueue->lParam = 0;
- msgQueue->wParam = 0;
- msgQueue->msg = 0;
- msgQueue->hWnd = 0;
- msgQueue->wPostQMsg = 0;
- msgQueue->wExitCode = 0;
- msgQueue->InSendMessageHandle = 0;
- msgQueue->wPaintCount = 0;
- msgQueue->wTimerCount = 0;
- msgQueue->tempStatus = 0;
- msgQueue->status = 0;
+ msgQueue->wWinVersion = 0; /* FIXME? */
GlobalUnlock( hQueue );
return hQueue;
}
@@ -292,6 +275,7 @@
static WORD lastClickMsg = 0;
static POINT lastClickPos = { 0, 0 };
POINT pt = msg->pt;
+ MOUSEHOOKSTRUCT hook = { msg->pt, 0, HTCLIENT, 0 };
BOOL mouseClick = ((msg->message == WM_LBUTTONDOWN) ||
(msg->message == WM_RBUTTONDOWN) ||
@@ -304,7 +288,10 @@
msg->hwnd = GetCapture();
ScreenToClient( msg->hwnd, &pt );
msg->lParam = MAKELONG( pt.x, pt.y );
- return TRUE; /* No need to further process the message */
+ /* No need to further process the message */
+ hook.hwnd = msg->hwnd;
+ return !HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
+ msg->message, (LPARAM)MAKE_SEGPTR(&hook));
}
if ((hittest = MSG_GetWindowForEvent( msg->pt, &msg->hwnd )) != HTERROR)
@@ -389,7 +376,10 @@
}
msg->lParam = MAKELONG( pt.x, pt.y );
- return TRUE;
+ hook.hwnd = msg->hwnd;
+ hook.wHitTestCode = hittest;
+ return !HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
+ msg->message, (LPARAM)MAKE_SEGPTR(&hook));
}
@@ -400,7 +390,7 @@
* Return value indicates whether the translated message must be passed
* to the user.
*/
-static BOOL MSG_TranslateKeyboardMsg( MSG *msg )
+static BOOL MSG_TranslateKeyboardMsg( MSG *msg, BOOL remove )
{
/* Should check Ctrl-Esc and PrintScreen here */
@@ -412,7 +402,8 @@
msg->hwnd = GetActiveWindow();
msg->message += WM_SYSKEYDOWN - WM_KEYDOWN;
}
- return TRUE;
+ return !HOOK_CallHooks( WH_KEYBOARD, remove ? HC_ACTION : HC_NOREMOVE,
+ msg->wParam, msg->lParam );
}
@@ -439,9 +430,15 @@
}
else if ((msg->message >= WM_KEYFIRST) && (msg->message <= WM_KEYLAST))
{
- if (!MSG_TranslateKeyboardMsg( msg )) continue;
+ if (!MSG_TranslateKeyboardMsg( msg, remove )) continue;
}
- else continue; /* Should never happen */
+ else /* Non-standard hardware event */
+ {
+ HARDWAREHOOKSTRUCT hook = { msg->hwnd, msg->message,
+ msg->wParam, msg->lParam };
+ if (HOOK_CallHooks( WH_HARDWARE, remove ? HC_ACTION : HC_NOREMOVE,
+ 0, (LPARAM)MAKE_SEGPTR(&hook) )) continue;
+ }
/* Check message against filters */
@@ -451,7 +448,13 @@
if ((msg->hwnd != GetDesktopWindow()) &&
(GetWindowTask(msg->hwnd) != GetCurrentTask()))
continue; /* Not for this task */
- if (remove) MSG_RemoveMsg( sysMsgQueue, pos );
+ if (remove)
+ {
+ MSG tmpMsg = *msg; /* FIXME */
+ HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION,
+ 0, (LPARAM)MAKE_SEGPTR(&tmpMsg) );
+ MSG_RemoveMsg( sysMsgQueue, pos );
+ }
return TRUE;
}
return FALSE;
@@ -955,8 +958,7 @@
{
MSG_PeekMessage( (MSG *)PTR_SEG_TO_LIN(msg),
hwnd, first, last, PM_REMOVE, FALSE );
- CALL_TASK_HOOK( WH_GETMESSAGE, 0, 0, (LPARAM)msg );
- CALL_SYSTEM_HOOK( WH_GETMESSAGE, 0, 0, (LPARAM)msg );
+ HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, 0, (LPARAM)msg );
return (((MSG *)PTR_SEG_TO_LIN(msg))->message != WM_QUIT);
}
@@ -1066,8 +1068,7 @@
EnterSpyMessage(SPY_SENDMESSAGE, hwnd, msg, wParam, lParam);
- CALL_TASK_HOOK( WH_CALLWNDPROC, HC_ACTION, 1, MAKE_SEGPTR(&msgstruct) );
- CALL_SYSTEM_HOOK( WH_CALLWNDPROC, HC_ACTION, 1, MAKE_SEGPTR(&msgstruct) );
+ HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 1, MAKE_SEGPTR(&msgstruct) );
if (!(wndPtr = WIN_FindWndPtr( hwnd )))
{
ExitSpyMessage(SPY_RESULT_INVALIDHWND,hwnd,msg,0);
@@ -1142,6 +1143,7 @@
{
HINSTANCE ds = msg->hwnd ? WIN_GetWindowInstance( msg->hwnd )
: (HINSTANCE)CURRENT_DS;
+/* HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */
return CallWndProc( (WNDPROC)msg->lParam, ds, msg->hwnd,
msg->message, msg->wParam, GetTickCount() );
}
@@ -1152,6 +1154,7 @@
if (!wndPtr->lpfnWndProc) return 0;
painting = (msg->message == WM_PAINT);
if (painting) wndPtr->flags |= WIN_NEEDS_BEGINPAINT;
+/* HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */
retval = CallWindowProc( wndPtr->lpfnWndProc, msg->hwnd, msg->message,
msg->wParam, msg->lParam );
if (painting && IsWindow(msg->hwnd) &&
@@ -1222,6 +1225,14 @@
}
/***********************************************************************
+ * GetCurrentTime (effectively identical to GetTickCount)
+ */
+DWORD GetCurrentTime(void)
+{
+ return GetTickCount();
+}
+
+/***********************************************************************
* InSendMessage (USER.192
*
* According to the book, this should return true iff the current message
diff --git a/windows/utility.c b/windows/utility.c
index 8838394..d0cb299 100644
--- a/windows/utility.c
+++ b/windows/utility.c
@@ -1,5 +1,5 @@
/* utility.c Utility functions for Wine
- * Author: acb
+ * Author: Andrew Bulhak
* Commenced: 10-9-1993
*
* This unit contains the implementations of
@@ -19,8 +19,6 @@
#include "debug.h"
-/* static char Copyright[] = "Copyright Andrew C. Bulhak, 1993"; */
-
/* MulDiv is a simple function that may as well have been
* implemented as a macro; however Microsoft, in their infinite
@@ -424,24 +422,3 @@
return result;
};
-/******************************************************************************
- * DragDetect ( USER.465 )
- *
- * Hardly ever called at all
- */
-
-
-/******************************************************************************
- * DragObject ( USER.464 )
- *
- * responsible for generation of WM_QUERYDROPOBJECT, WM_DRAGLOOP,
- * WM_DRAGMOVE, WM_DROPOBJECT
- */
-LONG DragObject(HWND hDesktop, HWND hWnd, UINT Unknown1, WORD Unknown2, WORD Unknown3, HCURSOR hCursor)
-{
-
- fprintf(stdnimp,"DragObject: EmptyStub!!!\n");
- return 0;
-}
-
-
diff --git a/windows/win.c b/windows/win.c
index 1e0d209..7153ee6 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -31,6 +31,11 @@
static HWND hwndDesktop = 0;
static HWND hWndSysModal = 0;
+static WORD wDragWidth = 8;
+static WORD wDragHeight= 6;
+
+extern HCURSOR CURSORICON_IconToCursor(HICON);
+
/***********************************************************************
* WIN_FindWndPtr
*
@@ -1205,7 +1210,16 @@
*/
BOOL AnyPopup()
{
- dprintf_win(stdnimp,"EMPTY STUB !! AnyPopup !\n");
+ WND *wndPtr = WIN_FindWndPtr(hwndDesktop);
+ HWND hwnd = wndPtr->hwndChild;
+
+ for( ; hwnd ; hwnd = wndPtr->hwndNext )
+ {
+ wndPtr = WIN_FindWndPtr(hwnd);
+ if(wndPtr->hwndOwner)
+ if(wndPtr->dwStyle & WS_VISIBLE)
+ return TRUE;
+ }
return FALSE;
}
@@ -1238,3 +1252,246 @@
{
return hWndSysModal;
}
+
+/*******************************************************************
+ * DRAG_QueryUpdate
+ *
+ * recursively find a child that contains spDragInfo->pt point
+ * and send WM_QUERYDROPOBJECT
+ */
+BOOL DRAG_QueryUpdate( HWND hQueryWnd, SEGPTR spDragInfo )
+{
+ HWND hWnd;
+ BOOL wParam,bResult = 0;
+ POINT pt;
+ LPDRAGINFO ptrDragInfo = (LPDRAGINFO) PTR_SEG_TO_LIN(spDragInfo);
+ WND *ptrQueryWnd = WIN_FindWndPtr(hQueryWnd),*ptrWnd;
+ RECT tempRect; /* this sucks */
+
+ if( !ptrQueryWnd || !ptrDragInfo ) return 0;
+
+ pt = ptrDragInfo->pt;
+
+ GetWindowRect(hQueryWnd,&tempRect);
+
+ if( !PtInRect(&tempRect,pt) ||
+ (ptrQueryWnd->dwStyle & WS_DISABLED) )
+ return 0;
+
+ if( !(ptrQueryWnd->dwStyle & WS_MINIMIZE) )
+ {
+ tempRect = ptrQueryWnd->rectClient;
+ if(ptrQueryWnd->dwStyle & WS_CHILD)
+ MapWindowPoints(ptrQueryWnd->hwndParent,0,(LPPOINT)&tempRect,2);
+
+ if( PtInRect(&tempRect,pt) )
+ {
+ wParam = 0;
+ ptrWnd = WIN_FindWndPtr(hWnd = ptrQueryWnd->hwndChild);
+
+ for( ;ptrWnd ;ptrWnd = WIN_FindWndPtr(hWnd = ptrWnd->hwndNext) )
+ if( ptrWnd->dwStyle & WS_VISIBLE )
+ {
+ GetWindowRect(hWnd,&tempRect);
+
+ if( PtInRect(&tempRect,pt) )
+ break;
+ }
+
+ if(ptrWnd)
+ dprintf_msg(stddeb,"DragQueryUpdate: hwnd = "NPFMT", %i %i - %i %i\n",hWnd,
+ ptrWnd->rectWindow.left,ptrWnd->rectWindow.top,
+ ptrWnd->rectWindow.right,ptrWnd->rectWindow.bottom);
+ else
+ dprintf_msg(stddeb,"DragQueryUpdate: hwnd = "NPFMT"\n",hWnd);
+
+ if(ptrWnd)
+ if( !(ptrWnd->dwStyle & WS_DISABLED) )
+ bResult = DRAG_QueryUpdate(hWnd, spDragInfo);
+
+ if(bResult) return bResult;
+ }
+ else wParam = 1;
+ }
+ else wParam = 1;
+
+ ScreenToClient(hQueryWnd,&ptrDragInfo->pt);
+
+ ptrDragInfo->hScope = hQueryWnd;
+
+ bResult = SendMessage( hQueryWnd ,WM_QUERYDROPOBJECT ,
+ (WPARAM)wParam ,(LPARAM) spDragInfo );
+ if( !bResult )
+ ptrDragInfo->pt = pt;
+
+ return bResult;
+}
+
+/*******************************************************************
+ * DragDetect ( USER.465 )
+ *
+ */
+BOOL DragDetect(HWND hWnd, POINT pt)
+{
+ MSG msg;
+ RECT rect;
+
+ rect.left = pt.x - wDragWidth;
+ rect.right = pt.x + wDragWidth;
+
+ rect.top = pt.y - wDragHeight;
+ rect.bottom = pt.y + wDragHeight;
+
+ SetCapture(hWnd);
+
+ while(1)
+ {
+ while(PeekMessage(&msg ,0 ,WM_MOUSEFIRST ,WM_MOUSELAST ,PM_REMOVE))
+ {
+ if( msg.message == WM_LBUTTONUP )
+ {
+ ReleaseCapture();
+ return 0;
+ }
+ if( msg.message == WM_MOUSEMOVE )
+ {
+ POINT pt = { LOWORD(msg.lParam), HIWORD(msg.lParam) };
+ if( !PtInRect( &rect, pt ) )
+ {
+ ReleaseCapture();
+ return 1;
+ }
+ }
+ }
+ WaitMessage();
+ }
+
+ return 0;
+}
+
+/******************************************************************************
+ * DragObject ( USER.464 )
+ *
+ */
+DWORD DragObject(HWND hwndScope, HWND hWnd, WORD wObj, HANDLE hOfStruct,
+ WORD szList , HCURSOR hCursor)
+{
+ MSG msg;
+ LPDRAGINFO lpDragInfo;
+ SEGPTR spDragInfo;
+ HCURSOR hDragCursor=0, hOldCursor=0, hBummer=0;
+ HANDLE hDragInfo = GlobalAlloc( GMEM_SHARE | GMEM_ZEROINIT, 2*sizeof(DRAGINFO));
+ WND *wndPtr = WIN_FindWndPtr(hWnd);
+ DWORD dwRet = 0;
+ short dragDone = 0;
+ HCURSOR hCurrentCursor = 0;
+ HWND hCurrentWnd = 0;
+ WORD btemp;
+
+ fprintf(stdnimp,"DragObject: experimental\n");
+
+ lpDragInfo = (LPDRAGINFO) GlobalLock(hDragInfo);
+ spDragInfo = (SEGPTR) WIN16_GlobalLock(hDragInfo);
+
+ if( !lpDragInfo || !spDragInfo ) return 0L;
+
+ hBummer = LoadCursor(0,IDC_BUMMER);
+
+ if( !hBummer || !wndPtr )
+ {
+ GlobalFree(hDragInfo);
+ return 0L;
+ }
+
+ if(hCursor)
+ {
+ if( !(hDragCursor = CURSORICON_IconToCursor(hCursor)) )
+ {
+ GlobalFree(hDragInfo);
+ return 0L;
+ }
+
+ if( hDragCursor == hCursor ) hDragCursor = 0;
+ else hCursor = hDragCursor;
+
+ hOldCursor = SetCursor(hDragCursor);
+ }
+
+ lpDragInfo->hWnd = hWnd;
+ lpDragInfo->hScope = 0;
+ lpDragInfo->wFlags = wObj;
+ lpDragInfo->hList = szList; /* near pointer! */
+ lpDragInfo->hOfStruct = hOfStruct;
+ lpDragInfo->l = 0L;
+
+ SetCapture(hWnd);
+ ShowCursor(1);
+
+ while( !dragDone )
+ {
+ WaitMessage();
+
+ if( !PeekMessage(&msg,0,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE) )
+ continue;
+
+ *(lpDragInfo+1) = *lpDragInfo;
+
+ lpDragInfo->pt = msg.pt;
+
+ /* update DRAGINFO struct */
+ dprintf_msg(stddeb,"drag: lpDI->hScope = "NPFMT"\n",lpDragInfo->hScope);
+
+ if( (btemp = (WORD)DRAG_QueryUpdate(hwndScope, spDragInfo)) > 0 )
+ hCurrentCursor = hCursor;
+ else
+ {
+ hCurrentCursor = hBummer;
+ lpDragInfo->hScope = 0;
+ }
+ if( hCurrentCursor )
+ SetCursor(hCurrentCursor);
+
+ dprintf_msg(stddeb,"drag: got "NPFMT"\n",btemp);
+
+ /* send WM_DRAGLOOP */
+ SendMessage( hWnd, WM_DRAGLOOP, (WPARAM)(hCurrentCursor != hBummer) ,
+ (LPARAM) spDragInfo );
+ /* send WM_DRAGSELECT or WM_DRAGMOVE */
+ if( hCurrentWnd != lpDragInfo->hScope )
+ {
+ if( hCurrentWnd )
+ SendMessage( hCurrentWnd, WM_DRAGSELECT, 0,
+ (LPARAM)MAKELONG(LOWORD(spDragInfo)+sizeof(DRAGINFO),
+ HIWORD(spDragInfo)) );
+ hCurrentWnd = lpDragInfo->hScope;
+ if( hCurrentWnd )
+ SendMessage( hCurrentWnd, WM_DRAGSELECT, 1, (LPARAM)spDragInfo);
+ }
+ else
+ if( hCurrentWnd )
+ SendMessage( hCurrentWnd, WM_DRAGMOVE, 0, (LPARAM)spDragInfo);
+
+
+ /* check if we're done */
+ if( msg.message == WM_LBUTTONUP || msg.message == WM_NCLBUTTONUP )
+ dragDone = TRUE;
+ }
+
+ ReleaseCapture();
+ ShowCursor(0);
+
+ if( hCursor )
+ {
+ SetCursor(hOldCursor);
+ if( hDragCursor )
+ DestroyCursor(hDragCursor);
+ }
+
+ if( hCurrentCursor != hBummer )
+ dwRet = SendMessage( lpDragInfo->hScope, WM_DROPOBJECT,
+ hWnd, (LPARAM)spDragInfo );
+ GlobalFree(hDragInfo);
+
+ return dwRet;
+}
+
diff --git a/windows/winpos.c b/windows/winpos.c
index 119b265..08a499c 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -616,7 +616,7 @@
WND *wndPtr = WIN_FindWndPtr( winpos->hwnd );
if (!wndPtr || (winpos->flags & SWP_NOSIZE)) return 0;
if ((wndPtr->dwStyle & WS_THICKFRAME) ||
- (wndPtr->dwStyle & (WS_POPUP | WS_CHILD) == 0))
+ ((wndPtr->dwStyle & (WS_POPUP | WS_CHILD)) == 0))
{
NC_GetMinMaxInfo( winpos->hwnd, &maxSize, NULL, NULL, NULL );
winpos->cx = MIN( winpos->cx, maxSize.x );