diff --git a/ANNOUNCE b/ANNOUNCE index e19ef7287ff..a486e164a66 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 @@ Because of lags created by using mirror, this message may reach you before the release is available at the ftp sites. The sources will be available from the following locations: - sunsite.unc.edu:/pub/Linux/ALPHA/wine/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 d0f6e47710c..19f3c084fed 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 988d9a6609c..9fcdf038429 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,214 @@ +---------------------------------------------------------------------- +Tue Nov 21 18:49:10 1995 Alexandre Julliard + + * [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 + + * [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 + + * [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 + + * [*/*] + 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 + + * [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 + + * [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 + + * [controls/menu.c] + MENU_CalcItemSize(): Fixed handling of empty menu items. + +Sat Nov 11 21:46:54 1995 Hans de Graaff + + * [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 diff --git a/Makefile.in b/Makefile.in index 19f8a124a13..e7a7bb9a39c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -84,8 +84,6 @@ clean: 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 9cb370efd1b..00000000000 --- 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 9c92cf47545..00000000000 --- 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 c0df84d2ee9..3223ea75dcd 100755 --- a/configure +++ b/configure @@ -1596,18 +1596,6 @@ else 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 @@ else echo "$ac_t""no" 1>&6 WINE_INI_GLOBAL="\"${TOP_SRCDIR}/wine.ini\"" fi -fi cat >> confdefs.h <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 @@ static LONG CBKeyDown(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG CBChar(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG CBShowDropDown(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG CBLKeyDown( HWND hwnd, WORD wParam, LONG lParam ) 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 @@ static LONG CBLLButtonUp( HWND hwnd, WORD wParam, LONG lParam ) 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 31534d65ffb..04383fb1bc7 100644 --- a/controls/edit.c +++ b/controls/edit.c @@ -11,6 +11,7 @@ #include #include #include +#include "instance.h" #include "local.h" #include "win.h" #include "class.h" @@ -106,13 +107,8 @@ static int ButtonCol; /* col in text buffer when button pressed */ 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 HLOCAL EDIT_HeapAlloc(HWND hwnd, int bytes, WORD flags) static void *EDIT_HeapLock(HWND hwnd, HANDLE handle) { HINSTANCE hinstance = WIN_GetWindowInstance( hwnd ); +#if defined(WINELIB) + return LOCAL_Lock( hinstance, handle ); +#else HANDLE offs; -#if 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_HeapLock(HWND hwnd, HANDLE handle) */ 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 void EDIT_HeapUnlock(HWND hwnd, HANDLE handle) */ 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 HLOCAL EDIT_HeapReAlloc(HWND hwnd, HANDLE handle, int bytes) */ 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 void EDIT_HeapFree(HWND hwnd, HANDLE handle) */ 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 @@ static void EDIT_ClearTextPointers(HWND hwnd) { 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 @@ static void EDIT_ClearText(HWND hwnd) 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 @@ static void EDIT_ClearText(HWND hwnd) es->wleft = es->wtop = 0; es->textwidth = 0; es->TextChanged = FALSE; -#ifndef WINELIB +/*#ifndef WINELIB*/ EDIT_ClearTextPointers(hwnd); -#endif +/*#endif*/ } /********************************************************************* @@ -2230,6 +2210,13 @@ static void EDIT_WM_Paint(HWND hwnd) 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 @@ static long EDIT_WM_NCCreate(HWND hwnd, LONG lParam) 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 @@ static long EDIT_WM_NCCreate(HWND hwnd, LONG lParam) 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 @@ static long EDIT_WM_NCCreate(HWND hwnd, LONG lParam) { 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 @@ static long EDIT_WM_NCCreate(HWND hwnd, LONG lParam) 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 d06760dd9e5..a215ec380e3 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 @@ -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 @@ void CreateListBoxStruct(HWND hwnd, WORD CtlType, LONG styles, HWND parent) 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 @@ void CreateListBoxStruct(HWND hwnd, WORD CtlType, LONG styles, HWND parent) 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 @@ void DestroyListBoxStruct(LPHEADLIST lphl) USER_HEAP_FREE(lphl->hDrawItemStruct); /* XXX need to free lphl->Heap */ + GlobalFree(lphl->HeapSel); free(lphl); } @@ -111,15 +132,17 @@ static LPHEADLIST ListBoxGetStorageHeader(HWND hwnd) /* 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 @@ LPLISTSTRUCT ListBoxGetItem(LPHEADLIST lphl, UINT uIndex) 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 @@ void ListBoxDrawItem (HWND hwnd, LPHEADLIST lphl, HDC hdc, LPLISTSTRUCT lpls, 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 @@ void ListBoxAskMeasure(LPHEADLIST lphl, LPLISTSTRUCT lpls) 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 @@ void ListBoxAskMeasure(LPHEADLIST lphl, LPLISTSTRUCT lpls) 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 @@ void ListBoxAskMeasure(LPHEADLIST lphl, LPLISTSTRUCT lpls) USER_HEAP_FREE(hTemp); } +/* -------------------- strings and item data ---------------------- */ LPLISTSTRUCT ListBoxCreateItem(LPHEADLIST lphl, int id) { @@ -314,6 +340,8 @@ int ListBoxInsertString(LPHEADLIST lphl, UINT uIndex, LPSTR newstr) dprintf_listbox(stddeb,"ListBoxInsertString(%d, %p);\n", uIndex, newstr); + if (!newstr) return -1; + if (uIndex == (UINT)-1) uIndex = lphl->ItemsCount; @@ -326,7 +354,7 @@ int ListBoxInsertString(LPHEADLIST lphl, UINT uIndex, LPSTR newstr) 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 ListBoxInsertString(LPHEADLIST lphl, UINT uIndex, LPSTR newstr) 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 @@ int ListBoxFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr) 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 @@ int ListBoxFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr) 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 @@ int ListBoxFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr) 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 @@ int ListBoxResetContent(LPHEADLIST lphl) 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 @@ int ListBoxSetSel(LPHEADLIST lphl, WORD wIndex, WORD state) { 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 @@ int ListBoxGetSel(LPHEADLIST lphl, WORD wIndex) return lpls->itemState; } +/* ------------------------- dir listing ------------------------ */ int ListBoxDirectory(LPHEADLIST lphl, UINT attrib, LPSTR filespec) { @@ -648,6 +689,7 @@ int ListBoxDirectory(LPHEADLIST lphl, UINT attrib, LPSTR filespec) return 1; } +/* ------------------------- dimensions ------------------------- */ int ListBoxGetItemRect(LPHEADLIST lphl, WORD wIndex, LPRECT lprect) { @@ -663,7 +705,7 @@ int ListBoxSetItemHeight(LPHEADLIST lphl, WORD wIndex, long height) { 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 @@ int ListBoxSetItemHeight(LPHEADLIST lphl, WORD wIndex, long height) return 0; } +/* -------------------------- string search ------------------------ */ int ListBoxFindNextMatch(LPHEADLIST lphl, WORD wChar) { @@ -706,11 +749,13 @@ int ListBoxFindNextMatch(LPHEADLIST lphl, WORD wChar) 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 @@ static LONG LBDestroy(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam) WORD wRet; int y; RECT rectsel; + LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE); SetFocus(hwnd); SetCapture(hwnd); @@ -860,19 +906,32 @@ static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG LBLButtonUp(HWND hwnd, WORD wParam, LONG lParam) if (GetCapture() == hwnd) ReleaseCapture(); if (lphl->PrevFocused != lphl->ItemFocused) - ListBoxSendNotification(lphl, hwnd, LBN_SELCHANGE); + ListBoxSendNotification(lphl, LBN_SELCHANGE); return 0; } @@ -919,6 +978,7 @@ static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam) /*********************************************************************** * 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 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam) 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 LBKeyDown(HWND hwnd, WORD wParam, LONG lParam) 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 LBSetFont(HWND hwnd, WPARAM wParam, LPARAM lParam) 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 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam) 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 LBGetItemRect(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG LBGetSelCount(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG LBGetSelItems(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG LBSelItemRange(HWND hwnd, WORD wParam, LONG lParam) 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 @@ static LONG LBSetCaretIndex(HWND hwnd, WORD wParam, LONG lParam) { 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; @@ -1649,6 +1782,20 @@ static LONG LBSetItemHeight(HWND hwnd, WORD wParam, LONG lParam) return wRet; } +/*********************************************************************** + * 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 */ @@ -1702,6 +1849,24 @@ LRESULT ListBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 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 b14d1ab2733..41f5a8bc9bf 100644 --- a/controls/menu.c +++ b/controls/menu.c @@ -302,7 +302,7 @@ static void MENU_CalcItemSize( HDC hdc, LPMENUITEM lpitem, HWND hwndOwner, 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 @@ static void MENU_CalcItemSize( HDC hdc, LPMENUITEM lpitem, HWND hwndOwner, } 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 cd3b9cf68df..fbca65e53b9 100644 --- a/debugger/dbg.y +++ b/debugger/dbg.y @@ -35,7 +35,7 @@ int yyerror(char *); %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 IDENTIFIER @@ -68,55 +68,55 @@ int yyerror(char *); 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 @@ x_command: $$ = 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 c46eb100c67..e6de8fcc1b3 100644 --- a/debugger/debug.l +++ b/debugger/debug.l @@ -34,7 +34,7 @@ IDENTIFIER [_a-zA-Z\.~][_a-zA-Z0-9\.~]* %% -\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 @@ $ss { yylval.reg = REG_SS; return REG; } 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 8e33899aed3..2676a5c9829 100644 --- a/if1632/advapi32.spec +++ b/if1632/advapi32.spec @@ -68,7 +68,7 @@ base 1 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 5dd559377f3..4249cbd605d 100644 --- a/if1632/gdi.spec +++ b/if1632/gdi.spec @@ -246,8 +246,8 @@ id 3 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 9a5b15fc012..7f9b7c6eeeb 100644 --- a/if1632/kernel.spec +++ b/if1632/kernel.spec @@ -114,8 +114,8 @@ id 1 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 @@ id 1 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 1987061652e..e9e9abf387b 100644 --- a/if1632/kernel32.spec +++ b/if1632/kernel32.spec @@ -24,7 +24,7 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 469bbc570da..fae1cc02b81 100644 --- a/if1632/user.spec +++ b/if1632/user.spec @@ -405,13 +405,13 @@ id 2 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 3c7927ba060..c525e30906d 100644 --- a/if1632/user32.spec +++ b/if1632/user32.spec @@ -199,7 +199,7 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 @@ base 1 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 00000000000..fa31df189ad --- /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 00000000000..def5290fada --- /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 a67f7220d24..928922e788b 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 @@ short debug_msg_enabled[]={ #else 0, #endif +#ifdef DEBUG_ENV + 1, +#else + 0, +#endif #ifdef DEBUG_EVENT 1, #else @@ -317,6 +328,11 @@ short debug_msg_enabled[]={ #else 0, #endif +#ifdef DEBUG_HOOK + 1, +#else + 0, +#endif #ifdef DEBUG_ICON 1, #else @@ -537,6 +553,11 @@ short debug_msg_enabled[]={ #else 0, #endif +#ifdef DEBUG_WIN32 + 1, +#else + 0, +#endif #ifdef DEBUG_WINSOCK 1, #else @@ -823,8 +844,21 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ extern short debug_msg_enabled[]; #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 @@ static char *debug_msg_name[] = { "driver", "edit", "enum", + "env", "event", "exec", "file", @@ -1544,6 +1605,7 @@ static char *debug_msg_name[] = { "gdi", "global", "graphics", + "hook", "icon", "int", "key", @@ -1588,6 +1650,7 @@ static char *debug_msg_name[] = { "utility", "vxd", "win", + "win32", "winsock", "" }; diff --git a/include/handle32.h b/include/handle32.h new file mode 100644 index 00000000000..f4e0d9e8590 --- /dev/null +++ b/include/handle32.h @@ -0,0 +1,87 @@ +#ifndef __WINE_HANDLE32_H +#define __WINE_HANDLE32_H + +#include + +/* 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 bd918220bf6..610b8161d2f 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 5fb595f8334..dd38cdc5bd1 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 int KERN32_Init(void); @@ -78,3 +81,54 @@ typedef struct { #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 00000000000..68ada6f19e4 --- /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 405a110a4e1..1ca08912d2f 100644 --- a/include/listbox.h +++ b/include/listbox.h @@ -24,7 +24,7 @@ typedef struct { WORD DrawCtlType; WORD CtlID; LPLISTSTRUCT lpFirst; - DWORD dwStyle; + HWND hSelf; HWND hParent; HFONT hFont; BOOL bRedrawFlag; @@ -34,6 +34,7 @@ typedef struct { LPINT TabStops; HANDLE hDrawItemStruct; BOOL needMeasure; + WORD HeapSel; /* MDESC *Heap; */ } HEADLIST,*LPHEADLIST; @@ -41,7 +42,7 @@ typedef struct { 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 10832ef6c17..e604a41ad02 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 tagQMSG 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 6861971ce97..5ee696acc7b 100644 --- a/include/msdos.h +++ b/include/msdos.h @@ -5,11 +5,12 @@ #include #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 @@ struct dosdirent { 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 8ac6d2dc1c8..834713cb70d 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 @@ struct options 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 777522d9ab0..2114b54859b 100644 --- a/include/registers.h +++ b/include/registers.h @@ -10,6 +10,8 @@ #include #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 0b5a5c4fc28..b5c89178fad 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 00000000000..38f5e3ced5d --- /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 00000000000..c10560cd781 --- /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 064434d05bc..02542d091df 100644 --- a/include/windows.h +++ b/include/windows.h @@ -173,10 +173,10 @@ typedef struct { 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 @@ typedef struct /***** Window hooks *****/ /* Hook values */ +#define WH_MSGFILTER (-1) #define WH_JOURNALRECORD 0 #define WH_JOURNALPLAYBACK 1 #define WH_KEYBOARD 2 @@ -280,8 +281,11 @@ typedef struct #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 @@ typedef struct #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 @@ typedef struct tagBITMAP INT bmWidthBytes; BYTE bmPlanes; BYTE bmBitsPixel; - void * bmBits WINE_PACKED; + SEGPTR bmBits WINE_PACKED; } BITMAP; typedef BITMAP *PBITMAP; @@ -999,7 +995,7 @@ typedef BITMAPINFO *PBITMAPINFO; typedef struct { - unsigned long bcSize; + DWORD bcSize; UINT bcWidth; UINT bcHeight; UINT bcPlanes; @@ -1307,6 +1303,7 @@ typedef struct tagCOMSTAT #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 @@ typedef struct tagCOMSTAT #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 @@ typedef struct tagCOMSTAT #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 @@ enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVAT #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 @@ enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVAT /* 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 @@ typedef int (CALLBACK *EDITWORDBREAKPROC)(LPSTR lpch, int ichCurrent, #define WM_DRAWITEM 0x002B -typedef struct tagDRAWITEMSTRUCT +typedef struct { UINT CtlType; UINT CtlID; @@ -2090,7 +2114,7 @@ typedef DRAWITEMSTRUCT FAR* LPDRAWITEMSTRUCT; #define WM_MEASUREITEM 0x002C -typedef struct tagMEASUREITEMSTRUCT +typedef struct { UINT CtlType; UINT CtlID; @@ -2104,7 +2128,7 @@ typedef MEASUREITEMSTRUCT FAR* LPMEASUREITEMSTRUCT; #define WM_DELETEITEM 0x002D -typedef struct tagDELETEITEMSTRUCT +typedef struct { UINT CtlType; UINT CtlID; @@ -2117,7 +2141,7 @@ typedef DELETEITEMSTRUCT FAR* LPDELETEITEMSTRUCT; #define WM_COMPAREITEM 0x0039 -typedef struct tagCOMPAREITEMSTRUCT +typedef struct { UINT CtlType; UINT CtlID; @@ -2282,7 +2306,7 @@ typedef COMPAREITEMSTRUCT FAR* LPCOMPAREITEMSTRUCT; #define WM_CHANGECBCHAIN 0x030D /* Metafile header structure */ -typedef struct tagMETAHEADER +typedef struct { WORD mtType; WORD mtHeaderSize; @@ -2294,7 +2318,7 @@ typedef struct tagMETAHEADER } METAHEADER; /* Metafile typical record structure */ -typedef struct tagMETARECORD +typedef struct { DWORD rdSize; WORD rdFunction; @@ -2304,7 +2328,7 @@ typedef METARECORD *PMETARECORD; typedef METARECORD *LPMETARECORD; /* Handle table structure */ -typedef struct tagHANDLETABLE +typedef struct { HANDLE objectHandle[1]; } HANDLETABLE; @@ -2312,7 +2336,7 @@ typedef HANDLETABLE *PHANDLETABLE; typedef HANDLETABLE *LPHANDLETABLE; /* Clipboard metafile picture structure */ -typedef struct tagMETAFILEPICT +typedef struct { INT mm; INT xExt; @@ -2402,16 +2426,15 @@ typedef METAFILEPICT *LPMETAFILEPICT; #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 @@ typedef WINDEBUGINFO FAR* LPWINDEBUGINFO; #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 f6748e0b6be..29b6c44101b 100644 --- a/include/wine.h +++ b/include/wine.h @@ -14,13 +14,9 @@ static inline int runtime_cpu(void) { return 3; } #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 @@ struct sigcontext_struct { 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 #define sigcontext_struct sigcontext -#define HZ 100 +#define WINE_DATA_SELECTOR 0x1f +#define WINE_CODE_SELECTOR 0x17 +#endif + +#ifdef __svr4__ +#include +#include +#define sigcontext_struct ucontext #define WINE_DATA_SELECTOR 0x1f #define WINE_CODE_SELECTOR 0x17 #endif @@ -65,7 +62,6 @@ struct sigcontext_struct { #ifdef __FreeBSD__ #include #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 e1c1dbfb14a..ec4ba25c08e 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 77d38900ff6..003ad2f73da 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 46471ac6205..6223573e55d 100644 --- a/include/winsock.h +++ b/include/winsock.h @@ -65,6 +65,7 @@ typedef WSADATA FAR *LPWSADATA; #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 @@ struct sockproto { #endif #endif #endif +#endif /* * Maximum queue length specifiable by listen. diff --git a/include/wintypes.h b/include/wintypes.h index ff785d1f67c..eb917b55d8b 100644 --- a/include/wintypes.h +++ b/include/wintypes.h @@ -79,6 +79,7 @@ DECLARE_HANDLE(HMETAFILE); 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 @@ typedef FARPROC HOOKPROC; #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 08ad7cd88ef..de7df1efb32 100644 --- a/loader/main.c +++ b/loader/main.c @@ -58,10 +58,10 @@ int MAIN_Init(void) /* 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 7186c931ca5..2a95c4a52bc 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 @@ DWORD MODULE_GetEntryPoint( HMODULE hModule, WORD ordinal ) } 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 @@ HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock ) 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 @@ int GetModuleFileName( HANDLE hModule, LPSTR lpFileName, short nSize ) */ 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 @@ HANDLE LoadLibrary( LPCSTR libname ) } if (handle >= (HANDLE)32) NE_InitializeDLLs( GetExePtr(handle) ); return handle; +#endif } @@ -1326,12 +1334,23 @@ FARPROC GetProcAddress( HANDLE hModule, SEGPTR name ) } -#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 97748171989..eff083efbff 100644 --- a/loader/ne_image.c +++ b/loader/ne_image.c @@ -1,3 +1,4 @@ +#ifndef WINELIB /* * NE modules * @@ -532,3 +533,4 @@ void NE_InitializeDLLs( HMODULE hModule ) void PatchCodeHandle(HANDLE hSel) { } +#endif /* WINELIB */ diff --git a/loader/ne_resource.c b/loader/ne_resource.c index a83f639be69..18fd1648354 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 @@ HRSRC NE_FindResource( HMODULE hModule, SEGPTR typeId, SEGPTR resId ) 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 @@ BOOL NE_FreeResource( HMODULE hModule, HGLOBAL handle ) 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 47c9d87fe34..cfd9e08bdda 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 @@ void fixup_imports(struct PE_Import_Directory *pe_imports) 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 @@ void fixup_imports(struct PE_Import_Directory *pe_imports) 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 @@ void fixup_imports(struct PE_Import_Directory *pe_imports) 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 @@ static void dump_table(struct w_files *wpnt) { 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 @@ HINSTANCE PE_LoadImage(struct w_files *wpnt) 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 @@ void PE_Win32CallToStart(struct sigcontext_struct context) 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 @@ void PE_InitDLL(struct w_files *wpnt) printf("InitPEDLL() called!\n"); } } +#endif /* WINELIB */ diff --git a/loader/pe_resource.c b/loader/pe_resource.c index 0bfc987571d..b9a356d1878 100644 --- a/loader/pe_resource.c +++ b/loader/pe_resource.c @@ -1,3 +1,4 @@ +#ifndef WINELIB /* * (c) 1994 Erik Bos * @@ -150,3 +151,5 @@ PE_FindResource(HANDLE instance, SEGPTR resource_name, SEGPTR type_name, 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 437d8e20752..42b45cc4347 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 @@ HRSRC FindResource( HMODULE hModule, SEGPTR name, SEGPTR type ) 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 @@ HRSRC FindResource( HMODULE hModule, SEGPTR name, SEGPTR type ) default: return 0; } +#else + return LIBRES_FindResource( hModule, type, name ); +#endif } @@ -69,6 +81,7 @@ HGLOBAL LoadResource( HMODULE hModule, HRSRC hRsrc ) hModule, hRsrc ); if (!hRsrc) return 0; if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0; +#ifndef WINELIB switch(*pModule) { case NE_SIGNATURE: @@ -78,6 +91,9 @@ HGLOBAL LoadResource( HMODULE hModule, HRSRC hRsrc ) default: return 0; } +#else + return LIBRES_LoadResource( hModule, hRsrc ); +#endif } @@ -94,6 +110,7 @@ SEGPTR WIN16_LockResource( HGLOBAL handle ) 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 @@ SEGPTR WIN16_LockResource( HGLOBAL handle ) default: return 0; } +#else + return LIBRES_LockResource( hModule, handle ); +#endif } /* 32-bit version */ @@ -115,6 +135,7 @@ LPSTR LockResource( HGLOBAL handle ) 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 @@ LPSTR LockResource( HGLOBAL handle ) default: return 0; } +#else + return LIBRES_LockResource( hModule, handle ); +#endif } @@ -139,6 +163,7 @@ BOOL FreeResource( HGLOBAL handle ) 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 @@ BOOL FreeResource( HGLOBAL handle ) default: return FALSE; } +#else + return LIBRES_FreeResource( hModule, handle ); +#endif } @@ -163,6 +191,7 @@ INT AccessResource( HINSTANCE hModule, HRSRC hRsrc ) hModule, hRsrc ); if (!hRsrc) return 0; if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0; +#ifndef WINELIB switch(*pModule) { case NE_SIGNATURE: @@ -172,6 +201,9 @@ INT AccessResource( HINSTANCE hModule, HRSRC hRsrc ) default: return 0; } +#else + return LIBRES_AccessResource( hModule, hRsrc ); +#endif } @@ -186,6 +218,7 @@ DWORD SizeofResource( HMODULE hModule, HRSRC hRsrc ) 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 @@ DWORD SizeofResource( HMODULE hModule, HRSRC hRsrc ) default: return 0; } +#else + return LIBRES_SizeofResource( hModule, hRsrc ); +#endif } @@ -210,6 +246,7 @@ HGLOBAL AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size ) 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 @@ HGLOBAL AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size ) default: return 0; } +#else + return LIBRES_AllocResource( hModule, hRsrc, size ); +#endif } /********************************************************************** diff --git a/loader/signal.c b/loader/signal.c index 8a31b8d1716..6150f72fb18 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 @@ wine_sigaction(int sig,struct sigaction * new, struct sigaction * old) #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 @@ void init_wine_signals(void) 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 @@ void init_wine_signals(void) } #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 ae8e2d54ad2..bf383cd6073 100644 --- a/loader/task.c +++ b/loader/task.c @@ -419,7 +419,11 @@ HTASK TASK_CreateTask( HMODULE hModule, HANDLE hInstance, HANDLE hPrevInstance, 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 @@ void InitTask( struct sigcontext_struct context ) 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 @@ void InitTask( struct sigcontext_struct context ) firstTask = 0; } +#ifndef WINELIB NE_InitializeDLLs( pTask->hModule ); +#endif /* Registers on return are: * ax 1 if OK, 0 on error @@ -740,13 +746,13 @@ void InitTask( struct sigcontext_struct context ) * 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 ) @@ -969,6 +975,28 @@ HGLOBAL GetTaskQueue( HANDLE hTask ) } +/*********************************************************************** + * 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) */ diff --git a/memory/selector.c b/memory/selector.c index 8ca361a359b..5b420035f68 100644 --- a/memory/selector.c +++ b/memory/selector.c @@ -316,7 +316,7 @@ WORD SelectorAccessRights( WORD sel, WORD op, WORD val ) } 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 bce491c8bff..06501cc4c50 100644 --- a/misc/comm.c +++ b/misc/comm.c @@ -626,9 +626,8 @@ int SetCommState(DCB FAR *lpdcb) 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 @@ int GetCommState(int fd, DCB FAR *lpdcb) 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 5b86ad3a3fa..73df1d10f18 100644 --- a/misc/commdlg.c +++ b/misc/commdlg.c @@ -509,11 +509,10 @@ static LRESULT FILEDLG_WMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) 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 13f52bf7b32..28cdf303b58 100644 --- a/misc/dos_fs.c +++ b/misc/dos_fs.c @@ -24,6 +24,7 @@ #if defined(__NetBSD__) || defined(__FreeBSD__) #include #include +#include #endif #ifdef __svr4__ #include @@ -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 @@ extern char WindowsDirectory[256], SystemDirectory[256],TempDirectory[256]; char WindowsPath[256]; -static int max_open_dirs = 0; static int CurrentDrive = 2; struct DosDriveStruct { /* eg: */ @@ -206,7 +201,7 @@ void DOS_InitFS(void) { int x; char drive[2], temp[256]; - + struct dosdirent *dp; GetPrivateProfileString("wine", "windows", "c:\\windows", WindowsDirectory, sizeof(WindowsDirectory), WINE_INI); @@ -295,9 +290,12 @@ void DOS_InitFS(void) 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 @@ int DOS_MakeDir(int drive, char *dirname) 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 @@ static int match(char *filename, char *filemask) 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 @@ struct dosdirent *DOS_opendir(char *dosdirname) 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 1d18e83b574..888701a46e5 100644 --- a/misc/file.c +++ b/misc/file.c @@ -50,7 +50,7 @@ INT _lopen (LPSTR lpPathName, INT iReadWrite) 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 OpenFile (LPCSTR lpFileName, LPOFSTRUCT ofs, UINT wStyle) int res, handle; int verify_time = 0; - dprintf_file(stddeb,"Openfile(%s,,%d)\n",lpFileName,wStyle); + dprintf_file(stddeb,"Openfile(%s,,%X)\n",lpFileName,wStyle); action = wStyle & 0xff00; @@ -171,7 +171,10 @@ INT OpenFile (LPCSTR lpFileName, LPOFSTRUCT ofs, UINT wStyle) 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 @@ INT OpenFile (LPCSTR lpFileName, LPOFSTRUCT ofs, UINT wStyle) 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 a37b6de0a96..b79c3b381de 100644 --- a/misc/lstr.c +++ b/misc/lstr.c @@ -138,7 +138,10 @@ SEGPTR WIN16_AnsiUpper( SEGPTR strOrChar ) 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 @@ LPSTR AnsiUpper(LPSTR strOrChar) /* 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 @@ SEGPTR WIN16_AnsiLower(SEGPTR strOrChar) 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 @@ LPSTR AnsiLower(LPSTR strOrChar) /* 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 @@ SEGPTR AnsiPrev( SEGPTR start, SEGPTR current) /* 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 9de2fe72ab6..8f2a4268033 100644 --- a/misc/main.c +++ b/misc/main.c @@ -44,6 +44,18 @@ const char people[] = "Wine is available thanks to the work of " "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 @@ struct options Options = 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 @@ static XrmOptionDescRec optionsTable[] = { "-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 @@ static XrmOptionDescRec optionsTable[] = " -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" \ @@ -271,6 +291,28 @@ static BOOL MAIN_ParseDLLOptions(char *options) +/*********************************************************************** + * 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 * @@ -329,6 +371,8 @@ static void MAIN_ParseOptions( int *argc, char *argv[] ) 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 @@ int SetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nCount) { 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 @@ int SetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nCount) 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 @@ int SetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nCount) 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 @@ int GetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nMaxSiz) { 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 7dce5121627..080c3dcd43a 100644 --- a/misc/profile.c +++ b/misc/profile.c @@ -20,6 +20,7 @@ static char Copyright [] = "Copyright (C) 1993 Miguel de Icaza"; #include #include #include +#include #include "wine.h" #include "windows.h" @@ -34,8 +35,6 @@ static char Copyright [] = "Copyright (C) 1993 Miguel de Icaza"; #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 char *GetIniFileName(char *name, char *dir) 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 @@ static TSecHeader *load (char *filename, char **pfullname) *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 2d4c4306112..6c9692a65ad 100644 --- a/misc/spy.c +++ b/misc/spy.c @@ -170,7 +170,7 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] = /* 0x0130 */ NULL, - "WM_LBTRACKPOINT", + "wm_lbtrackpoint", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -251,12 +251,12 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] = "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 b91b7498652..a9ce9af90f8 100644 --- a/misc/user32.c +++ b/misc/user32.c @@ -155,6 +155,8 @@ DWORD USER32_CreateWindowExA(long flags,char* class,char *title, 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 52baf78e6cf..318c38e1436 100644 --- a/misc/winsocket.c +++ b/misc/winsocket.c @@ -11,6 +11,10 @@ #include #include #include +#ifdef __svr4__ +#include +#include +#endif #include #include #include @@ -19,6 +23,7 @@ #include #include #include +#undef TRANSPARENT #include "winsock.h" #include "toolhelp.h" #include "stddebug.h" @@ -196,15 +201,15 @@ static WORD wsaerrno(void) 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 @@ static WORD wsaherrno(void) /* 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 0228602eb0e..8c6fac43266 100644 --- a/miscemu/int21.c +++ b/miscemu/int21.c @@ -555,6 +555,8 @@ void OpenExistingFile(struct sigcontext_struct *context) { #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 @@ static void MakeDir(struct sigcontext_struct *context) 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 @@ static void FindNext(struct sigcontext_struct *context) 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 @@ static void FindNext(struct sigcontext_struct *context) 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 @@ static void FindFirst(struct sigcontext_struct *context) 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 @@ void DOS3Call( struct sigcontext_struct context ) 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 779f6b787aa..7501c76720b 100644 --- a/miscemu/int2f.c +++ b/miscemu/int2f.c @@ -40,6 +40,8 @@ void INT_Int2fHandler( struct sigcontext_struct context ) 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 dde4d94a04e..72e18adf153 100644 --- a/objects/bitmap.c +++ b/objects/bitmap.c @@ -150,15 +150,20 @@ LONG GetBitmapBits( HBITMAP hbitmap, LONG count, LPSTR buffer ) 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 SetBitmapBits( HBITMAP hbitmap, LONG count, LPSTR buffer ) 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 41e222c4b23..03cefa9a85c 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 fcb553e3903..4dc22b28ed7 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 @@ static HANDLE CURSORICON_Copy( HANDLE hInstance, HANDLE handle ) 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 LoadIcon( HANDLE hInstance, SEGPTR name ) 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 CreateCursor( HANDLE hInstance, INT xHotSpot, INT yHotSpot, 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 @@ BOOL DrawIcon( HDC hdc, short x, short y, HICON hIcon ) /*********************************************************************** * 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 e1d176e6558..6cc68b62843 100644 --- a/objects/metafile.c +++ b/objects/metafile.c @@ -7,6 +7,7 @@ static char Copyright[] = "Copyright David W. Metcalfe, 1994"; */ #include +#include #include "gdi.h" #include "bitmap.h" #include "metafile.h" @@ -407,7 +408,7 @@ void PlayMetaFileRecord(HDC hdc, HANDLETABLE *ht, METARECORD *mr, 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 GetMetaFileBits(HMETAFILE hmf) 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 @@ HANDLE GetMetaFileBits(HMETAFILE hmf) 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 @@ HMETAFILE SetMetaFileBits(HANDLE hMem) 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 @@ HMETAFILE SetMetaFileBits(HANDLE hMem) 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 c850994c0ff..facd5b45e00 100644 --- a/objects/oembitmap.c +++ b/objects/oembitmap.c @@ -167,19 +167,31 @@ static char **OBM_Icons_Data[OIC_LAST-OIC_FIRST+1] = #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 @@ HANDLE OBM_LoadCursorIcon( WORD id, BOOL fCursor ) 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 ccd0b42e485..f49f066b674 100644 --- a/objects/palette.c +++ b/objects/palette.c @@ -135,8 +135,17 @@ WORD SetPaletteEntries( HPALETTE hpalette, WORD start, WORD count, */ 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 0f558c6fbcc..f84578430ec 100644 --- a/rc/Makefile.in +++ b/rc/Makefile.in @@ -36,5 +36,5 @@ langclean:: 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 06f83966c86..4e1aa525e76 100644 --- a/rc/winerc.c +++ b/rc/winerc.c @@ -539,13 +539,16 @@ void create_output(gen_res* top) 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 55745dd939a..a1e6cb008e8 100644 --- a/toolkit/Makefile.in +++ b/toolkit/Makefile.in @@ -7,6 +7,7 @@ C_SRCS = \ 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 00000000000..880272f3a01 --- /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 75faefccba9..40e52cbb61d 100644 --- a/toolkit/heap.c +++ b/toolkit/heap.c @@ -211,47 +211,13 @@ DWORD int GlobalHandle(WORD selector) #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; - - 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 + HeapData* m; + bytes+=sizeof(HeapData); if (flags & LMEM_WINE_ALIGN) m = memalign (4, bytes); else @@ -260,125 +226,118 @@ HANDLE LocalAlloc (WORD flags, WORD bytes) 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 c688cecf277..90fadb1c369 100644 --- a/toolkit/hello3.c +++ b/toolkit/hello3.c @@ -1,5 +1,16 @@ #include #include "hello3res.h" +#include + +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 @@ LRESULT WndProc (HWND wnd, UINT msg, WPARAM w, LPARAM l) 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 23f29c5e1a5..5f5408c2a1f 100644 --- a/toolkit/hello3res.rc +++ b/toolkit/hello3res.rc @@ -3,6 +3,7 @@ MAIN MENU POPUP "Menu demo" { MENUITEM "Dialog Demo", 100 MENUITEM "Bitmap Demo", 101 + MENUITEM "Open...", 102 } } @@ -14,13 +15,10 @@ BEGIN 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 00000000000..c983ff665cc --- /dev/null +++ b/toolkit/libres.c @@ -0,0 +1,106 @@ +/* + * WINElib-Resources + * + * Copied and modified heavily from loader/resource.c + */ + +#include +#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 ddeeb498ac9..edab69edf59 100644 --- a/toolkit/miscstubs.c +++ b/toolkit/miscstubs.c @@ -48,43 +48,20 @@ void GlobalFreeAll(HANDLE owner) 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 70ff43f22de..499f68818f5 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 @@ static int debugging = 1; #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 @@ static int ParseExportFunction(int ordinal, int type) 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 @@ static int ParseOrdinal(int ordinal) 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 @@ static void BuildSpec32Files( char *specname ) ORDFUNCDEF *fdp; ORDRETDEF *rdp; int i; + int varargs; SpecFp = fopen( specname, "r"); if (SpecFp == NULL) @@ -744,6 +761,7 @@ static void BuildSpec32Files( char *specname ) printf( "/* File generated automatically, do not edit! */\n" ); printf( "#include \n"); + printf( "#include \n"); printf( "#include \"windows.h\"\n"); printf( "#include \"dlls.h\"\n"); printf( "#include \"pe_image.h\"\n"); @@ -768,48 +786,56 @@ static void BuildSpec32Files( char *specname ) 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;argnoarg_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;argnoarg_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;argnoarg_types[argno]!='.') printf( ",%c", 'a'+argno); printf( ");\n\t%s(", fdp->internal_name ); for(argno=0;argnoarg_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 @@ static void BuildSpec32Files( char *specname ) 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 bfabcb66caa..3980b9efb5d 100644 --- a/win32/Makefile.in +++ b/win32/Makefile.in @@ -2,12 +2,16 @@ TOPSRC = @top_srcdir@ 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 00000000000..be633d8660c --- /dev/null +++ b/win32/advapi.c @@ -0,0 +1,34 @@ +/* + * Win32 advapi functions + * + * Copyright 1995 Martin von Loewis + */ + +#include +#include +#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 1338ea4a8df..1ec99531ad9 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 @@ UINT GetOEMCP(void) 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 00000000000..48215cf8589 --- /dev/null +++ b/win32/console.c @@ -0,0 +1,22 @@ +/* + * Win32 kernel functions + * + * Copyright 1995 Martin von Loewis and Cameron Heide + */ + +#include +#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 a37c57fd3aa..17e2966c25e 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 @@ LPSTR GetCommandLineA(void) 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 5bbe1f885a1..7204884566c 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 160fc409ca0..a914e230b5c 100644 --- a/win32/file.c +++ b/win32/file.c @@ -7,9 +7,48 @@ #include #include #include +#include +#include +#include +#include #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 @@ HANDLE GetStdHandle(DWORD nStdHandle) * 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 @@ DWORD SetFilePointer(HANDLE hFile, LONG distance, LONG *highword, /*********************************************************************** * 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 0554a2f4b16..b4d3f0dfb83 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) */ @@ -22,6 +66,17 @@ DWORD GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize) return 8; } +/*********************************************************************** + * GetModuleHandle (KERNEL32.237) + */ +HMODULE WIN32_GetModuleHandle(char *module) +{ + if(module == NULL) + return (HMODULE)0; + else + return GetModuleHandle(module); +} + /*********************************************************************** * GetStartupInfoA (KERNEL32.273) */ @@ -38,7 +93,59 @@ VOID GetStartupInfoA(LPSTARTUPINFO lpStartupInfo) 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 a6545108ecf..2ee8eb5060e 100644 --- a/win32/memory.c +++ b/win32/memory.c @@ -9,9 +9,22 @@ #include #include #include +#include #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; iptr) { + (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 @@ LPVOID VirtualAlloc(LPVOID lpvAddress, DWORD cbSize, 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 @@ LPVOID VirtualAlloc(LPVOID lpvAddress, DWORD cbSize, */ BOOL VirtualFree(LPVOID lpvAddress, DWORD cbSize, DWORD fdwFreeType) { + int i; + + if (fdwFreeType & MEM_RELEASE) { + for (i=0; iptr == 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 00000000000..668a13a0836 --- /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 +#include + +#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 00000000000..3773dbbfdda --- /dev/null +++ b/win32/process.c @@ -0,0 +1,23 @@ +/* + * Win32 kernel functions + * + * Copyright 1995 Martin von Loewis + */ + +#include +#include +#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 e6b9e2cb3e4..ec77af59dbc 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 58f97035ca3..29b20ba8356 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 eda4fe27514..786c0a712ef 100644 --- a/windows/defwnd.c +++ b/windows/defwnd.c @@ -2,6 +2,7 @@ * Default window procedure * * Copyright 1993 Alexandre Julliard + * 1995 Alex Korobka */ #include @@ -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 @@ LRESULT DefWindowProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) 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 6a168053e8e..8f7cdb0141d 100644 --- a/windows/dialog.c +++ b/windows/dialog.c @@ -411,7 +411,7 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, SEGPTR dlgTemplate, 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 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, SEGPTR dlgTemplate, 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 d56c93f1011..2460cad52fd 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 @@ HHOOK taskHooks[LAST_HOOK-FIRST_HOOK+1] = { 0, }; */ 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 @@ BOOL UnhookWindowsHook( short id, FARPROC hproc ) */ 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 @@ DWORD DefHookProc( short code, WORD wParam, DWORD lParam, HHOOK *hhook ) */ 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 @@ HHOOK SetWindowsHookEx( short id, HOOKPROC proc, HINSTANCE hinst, HTASK htask ) */ 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 @@ BOOL UnhookWindowsHookEx( HHOOK hhook ) */ 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 a30935614e6..836097450a7 100644 --- a/windows/message.c +++ b/windows/message.c @@ -52,29 +52,12 @@ static HANDLE MSG_CreateMsgQueue( int size ) 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 BOOL MSG_TranslateMouseMsg( MSG *msg, BOOL remove ) 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 @@ static BOOL MSG_TranslateMouseMsg( MSG *msg, BOOL remove ) 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 @@ static BOOL MSG_TranslateMouseMsg( MSG *msg, BOOL remove ) } 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 @@ static BOOL MSG_TranslateMouseMsg( MSG *msg, BOOL remove ) * 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 @@ static BOOL MSG_TranslateKeyboardMsg( MSG *msg ) 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 @@ static BOOL MSG_PeekHardwareMsg( MSG *msg, HWND hwnd, WORD first, WORD last, } else if ((msg->message >= WM_KEYFIRST) && (msg->message <= WM_KEYLAST)) { - if (!MSG_TranslateKeyboardMsg( msg )) continue; + if (!MSG_TranslateKeyboardMsg( msg, remove )) continue; + } + 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; } - else continue; /* Should never happen */ /* Check message against filters */ @@ -451,7 +448,13 @@ static BOOL MSG_PeekHardwareMsg( MSG *msg, HWND hwnd, WORD first, WORD last, 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 @@ BOOL GetMessage( SEGPTR msg, HWND hwnd, UINT first, UINT last ) { 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 @@ LRESULT SendMessage( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) 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 @@ LONG DispatchMessage( LPMSG msg ) { 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 @@ LONG DispatchMessage( LPMSG msg ) 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) && @@ -1221,6 +1224,14 @@ DWORD GetTickCount(void) return (t.tv_sec * 1000) + (t.tv_usec / 1000); } +/*********************************************************************** + * GetCurrentTime (effectively identical to GetTickCount) + */ +DWORD GetCurrentTime(void) +{ + return GetTickCount(); +} + /*********************************************************************** * InSendMessage (USER.192 * diff --git a/windows/utility.c b/windows/utility.c index 8838394ee67..d0cb29948a1 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 @@ int wvsprintf(LPSTR buf, LPSTR format, LPSTR args) 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 1e0d209ed46..7153ee625e2 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 EnumChildWindows(HWND hwnd, FARPROC wndenumprc, LPARAM lParam) */ 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 @@ HWND GetSysModalWindow(void) { 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 119b2651538..08a499c0afd 100644 --- a/windows/winpos.c +++ b/windows/winpos.c @@ -616,7 +616,7 @@ LONG WINPOS_HandleWindowPosChanging( WINDOWPOS *winpos ) 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 );