diff --git a/ANNOUNCE b/ANNOUNCE index 78ee48cb068..1e0549ffe47 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,14 +1,14 @@ -This is release 980413 of Wine, the MS Windows emulator. This is still a +This is release 980503 of Wine, the MS Windows emulator. This is still a developer's only release. There are many bugs and many unimplemented API features. Most applications still do not work correctly. Patches should be submitted to "julliard@lrc.epfl.ch". Please don't forget to include a ChangeLog entry. -WHAT'S NEW with Wine-980413: (see ChangeLog for details) - - Flat thunks support. - - Many more autoconf checks for better portability. - - DIALOGEX resource support. +WHAT'S NEW with Wine-980503: (see ChangeLog for details) + - Module loading restructuration. + - Some rotated text support. + - Documentation for many more functions. - Lots of bug fixes. See the README file in the distribution for installation instructions. @@ -17,10 +17,10 @@ Because of lags created by using mirror, this message may reach you before the release is available at the ftp sites. The sources will be available from the following locations: - ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-980413.tar.gz - ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-980413.tar.gz - ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-980413.tar.gz - ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-980413.tar.gz + ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-980503.tar.gz + ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-980503.tar.gz + ftp://ftp.infomagic.com/pub/mirrors/linux/sunsite/ALPHA/wine/development/Wine-980503.tar.gz + ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-980503.tar.gz It should also be available from any site that mirrors tsx-11 or sunsite. diff --git a/ChangeLog b/ChangeLog index 6119f63da2f..7f3f7225452 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,259 @@ +---------------------------------------------------------------------- +Thu Apr 30 16:28:12 1998 James Juran + + * [scheduler/process.c] + Implemented GetExitCodeProcess. The code is a direct translation + of GetExitCodeThread. + +Mon Apr 27 22:20:25 1998 Uwe Bonnes + + * [loader/pe_image.c] + Unload dummy module when PE_LoadLibraryEx32A fails with + PE_LoadImage (makes Encarta 98 installer proceed). + + * [files/drive.c] + Make GetDriveType16 return DRIVE_REMOVABLE for TYPE_CDROM. + Make GetCurrentDirectory32 behave like the code does and not + like the help describes. + + * [files/profile.c] + Revoke recent change in PROFILE_GetSection and try better + handling of special case. + + * [include/windows.h] + Change definition of ACCEL32. + + * [misc/commdlg.c] + Replace the GetXXXFilename32 macros by normal code. + Fix two reported bugs in my changes to commdlg. + + * [windows/win.c] + Add a hook to catch bogus WM_SIZE messages by emitting a warning + in the appropriate case. + + * [objects/bitmap.c] + Reject unreasonbable large size arguments in + CreateCompatibleBitmap32 and add an fixme for that situation. + +Sun Apr 26 18:30:07 1998 Alexandre Julliard + + * [include/ldt.h] [debugger/*.c] [miscemu/instr.c] + Added IS_SELECTOR_SYSTEM and IS_SELECTOR_32BIT macros. + Make instruction emulation support system selectors. + + * [loader/*.c] + Started moving NE specific functions to the new loader/ne + directory. + + * [memory/environ.c] + Enforce the 127 chars limit only when creating the environment of + a Win16 process. + +Sun Apr 26 12:22:23 1998 Andreas Mohr <100.30936@germany.net> + + * [files/file.c] + Fixed an incredible typo in CopyFile32A that made it unusable + since a rewrite in 970112 (!!). + + * [files/directory.c] + Fixed GetTempPath32A/W to include trailing backslash. + + * [misc/ver.c] + Make find_pe_resource "work" with corrupt files. + + * [misc/wsprintf.c] + Altered WPRINTF_ParseFormatA/W to treat invalid format chars + as normal output, too. + + * [msdos/dpmi.c] + Implemented "Allocate/Free real mode callback" (0x0303/0x0304). + Cross your fingers if you need to use it ;) (completely untested) + Implemented "Call real mode proc with far return" (0x0301, tested). + + * [msdos/int21.c] + Fixed ioctlGenericBlkDevReq/0x60. + + * [relay32/dplayx.spec] [relay32/builtin32.c] [relay32/Makefile.in] + Added built-in DPLAYX.DLL. + + * [windows/win.c] + Fixed GetWindowWord()/GWW_HWNDPARENT to return the window's owner + if it has no parent (SDK). + +Sat Apr 25 15:09:53 1998 M.T.Fortescue + + * [debugger/db_disasm.c] + Fixed disassemble bug for no-display option and 'lock', + 'repne' and 'repe' prefixes. + + * [debugger/registers.c] + Added textual flag description output on 'info regs'. + +Sat Apr 25 14:18:26 1998 Matthew Becker + + * [*/*.c] + Added stubs and/or documentation for the following functions: + LookupPrivilegeValue, OpenService, ControlService, RegGetKeySecurity, + StartService, SetComputerName, DeleteService, CloseServiceHandle, + OpenProcessToken, OpenSCManager, DeregisterEventSource, + WaitForDebugEvent, WaitForInputIdle, RegisterEventSource, + SetDebugErrorLevel, SetConsoleCursorPosition, ChoosePixelFormat, + SetPixelFormat, GetPixelFormat, DescribePixelFormat, SwapBuffers, + PolyBezier, AbortPath, DestroyAcceleratorTable, HeapWalk, + DdeInitialize, DdeUninitialize, DdeConnectList, DdeDisconnectList, + DdeCreateStringHandle, DdePostAdvise, DdeGetData, DdeNameService, + DdeGetLastError, WNetGetDirectoryType, EnumPrinters, RegFlushKey, + RegGetKeySecurity, DllGetClassObject, DllCanUnloadNow, CreateBitmap, + CreateCompatibleBitmap, CreateBitmapIndirect, GetBitmapBits, + SetBitmapBits, LoadImage, CopyImage, LoadBitmap, DrawIcon, + CreateDiscardableBitmap, SetDIBits, GetCharABCWidths, LoadTypeLib, + SetConsoleCtrlHandler, CreateConsoleScreenBuffer, ReadConsoleInput, + GetConsoleCursorInfo, SetConsoleCursorInfo, SetConsoleWindowInfo, + SetConsoleTextAttribute, SetConsoleScreenBufferSize, + FillConsoleOutputCharacter, FillConsoleOutputAttribute, + CreateMailslot, GetMailslotInfo, GetCompressedFileSize, + GetProcessWindowStation, GetThreadDesktop, SetDebugErrorLevel, + WaitForDebugEvent, SetComputerName, CreateMDIWindow. + +Thu Apr 23 23:54:04 1998 Douglas Ridgway + + * [include/windows.h] [objects/enhmetafile.c] [relay32/gdi32.spec] + Implement CopyEnhMetaFile, Get/SetEnhMetaFileBits, other fixes. + + * [include/windows.h] [objects/metafile.c] [relay32/gdi32.spec] + 32-bit metafile fixes, implement EnumMetaFile32, GetMetaFileBitsEx. + + * [objects/font.c] [graphics/x11drv/xfont.c] [graphics/x11drv/text.c] + Some rotated text support for X11R6 displays. + + * [win32/newfns.c] [ole/ole2nls.c] + Moved GetNumberFormat32A. + +Wed Apr 22 17:38:20 1998 David Lee Lambert + + * [ole/ole2nls.c] [misc/network.c] + Changed some function documentation to the new style. + + * [misc/network.c] [include/windows.h] [if1632/user.spec] + [relay32/mpr.spec] [misc/mpr.c] + Added stubs for some Win32 network functions; renamed some + 16-bit ones with 32-bit counterparts, as well as + WNetGetDirectoryType; moved the stubs in misc/mpr.c (three of + them!) to misc/network.c. + + * [ole/compobj.c] [ole/storage.c] [ole/ole2disp.c] + [ole/ole2nls.c] [ole/folders.c] [ole/moniker.c] [ole/ole2.c] + [graphics/fontengine.c] [graphics/ddraw.c] [graphics/env.c] + [graphics/driver.c] [graphics/escape.c] + Changed fprintf's to proper debug-macros. + + * [include/winnls.h] + Added some flags (for internal use). + + * [ole/ole2nls.c] + Added the Unicode core function, and worked out a way to hide + the commonality of the core. + + * [relay32/kernel32.spec] + Added support for GetDate/Time32A/W. + +Wed Apr 22 09:16:03 1998 Gordon Chaffee + + * [win32/code_page.c] + Fixed problem with MultiByteToWideChar that was introduced in + last release. Made MultiByteToWideChar more compatible with Win32. + + * [graphics/x11drv/graphics.c] + Fixed problem with drawing arcs. + +Tue Apr 21 11:24:58 1998 Constantine Sapuntzakis + + * [ole/ole2nls.c] + Move stuff from 0x409 case to Lang_En. + + * [relay32/user32.spec] [windows/winpos.c] + Added stubs for GetWindowRgn32 and SetWindowRgn32. Makes Office + Paperclip happy. + +Tue Apr 21 11:16:16 1998 Constantine Sapuntzakis + + * [loader/pe_image.c] + If image is relocated, TLS addresses need to be adjusted. + + * [debugger/*.c] + Generalized tests for 32-bit segments. + +Tue Apr 21 02:04:59 1998 James Juran + + * [misc/*.c] [miscemu/*.c] [msdos/*.c] [if1632/*.c] + [include/*.h] [loader/*.c] [memory/*.c] [multimedia/*.c] + [objects/*.c] + Almost all fprintf statements converted to appropriate + debug messages. + + * [README] + Updated "GETTING MORE INFORMATION" section to include WineHQ. + + * [documentation/debugger] + Fixed typo. + + * [windows/defwnd.c] + Added function documentation. + +Sun Apr 19 16:30:58 1998 Marcus Meissner + + * [Make.rules.in] + Added lint target (using lclint). + + * [relay32/oleaut32.spec][relay32/Makefile.in][ole/typelib.c] + [ole/ole2disp.c] + Added oleaut32 spec, added some SysString functions. + + * [if1632/signal.c] + Added printing of faultaddress in Linux (using CR2 debug register). + + * [configure.in] + Added for statfs checks. + + * [loader/*.c][debugger/break.c][debugger/hash.c] + Started to split win32/win16 module handling, preparing support + for other binary formats (like ELF). + +Sat Apr 18 10:07:41 1998 Rein Klazes + + * [misc/registry.c] + Fixed a bug that made RegQueryValuexxx returning + incorrect registry values. + +Fri Apr 17 22:59:22 1998 Alexander V. Lukyanov + + * [misc/lstr.c] + FormatMessage32*: remove linefeed when nolinefeed set; + check for target underflow. + +Fri Apr 17 00:38:14 1998 Alexander V. Lukyanov + + * [misc/crtdll.c] + Implement xlat_file_ptr for CRT stdin/stdout/stderr address + translation. + +Wed Apr 15 20:43:56 1998 Jim Peterson + + * [controls/menu.c] + Added 'odaction' parameter to MENU_DrawMenuItem() and redirected + WM_DRAWITEM messages to GetWindow(hwnd,GW_OWNER). + +Tue Apr 14 16:17:55 1998 Berend Reitsma + + * [graphics/metafiledrv/init.c] [graphics/painting.c] + [graphics/win16drv/init.c] [graphics/x11drv/graphics.c] + [graphics/x11drv/init.c] [include/gdi.h] [include/x11drv.h] + [relay32/gdi32.spec] + Added PolyPolyline routine. + + * [windows/winproc.c] + Changed WINPROC_GetProc() to return proc instead of &(jmp proc). + ---------------------------------------------------------------------- Sun Apr 12 12:22:23 1997 Andreas Mohr <100.30936@germany.net> diff --git a/Make.rules.in b/Make.rules.in index d8e6e9329e4..76a2f1cf616 100644 --- a/Make.rules.in +++ b/Make.rules.in @@ -37,6 +37,8 @@ AR = ar rc RM = rm -f MKDIR = mkdir C2MAN = @C2MAN@ +LINT = lclint +LINTFLAGS = +posixlib +gnuextensions +trytorecover BUILD = $(TOPOBJDIR)/tools/build@PROGEXT@ MAKEDEP = $(TOPOBJDIR)/tools/makedep@PROGEXT@ WINERC = $(TOPOBJDIR)/rc/winerc@PROGEXT@ @@ -114,6 +116,16 @@ $(MODULE).o: $(OBJS) man: $(C_SRCS) for i in $(C_SRCS); do $(C2MAN) -L -o$(TOPOBJDIR)/documentation/man3w -S3w $(DIVINCL) $$i; done +# Rule for linting + +lint: + for i in $(C_SRCS); do $(LINT) $(LINTFLAGS) -D__WINE__ $(OPTIONS) $(DIVINCL) $(X_CFLAGS) $$i; done + +# Rule for html pages + +html: $(C_SRCS) + for i in $(C_SRCS); do $(C2MAN) -L -o$(TOPOBJDIR)/documentation/html -Th -iwindows.h $(DIVINCL) $$i; done + # Misc. rules depend:: $(MAKEDEP) $(C_SRCS) $(RC_SRCS) $(EXTRA_SRCS) diff --git a/Makefile.in b/Makefile.in index 003637c2ff3..c9548fa9266 100644 --- a/Makefile.in +++ b/Makefile.in @@ -34,6 +34,7 @@ LIBSUBDIRS = \ ipc \ library \ loader \ + loader/ne \ memory \ misc \ msdos \ @@ -78,6 +79,7 @@ LIBOBJS = \ graphics/x11drv/x11drv.o \ ipc/ipc.o \ loader/loader.o \ + loader/ne/ne.o \ memory/memory.o \ misc/misc.o \ msdos/msdos.o \ @@ -149,6 +151,10 @@ manpages: -$(MKDIR) $(TOPOBJDIR)/documentation/man3w for i in $(LIBSUBDIRS); do (cd $$i && $(MAKE) man); done +htmlpages: + -$(MKDIR) $(TOPOBJDIR)/documentation/html + for i in $(LIBSUBDIRS); do (cd $$i && $(MAKE) html); done + clean:: for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done for i in include; do (cd $$i; $(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc); done diff --git a/README b/README index dd56ba1635c..25be8f4fc88 100644 --- a/README +++ b/README @@ -83,10 +83,21 @@ UPDATE: Windows 95 components are known to cause more crashes compared 5. GETTING MORE INFORMATION -The best place to get help or to report bugs is the Usenet newsgroup -comp.emulators.ms-windows.wine. The Wine FAQ is posted there every -month. Also, you may want to browse old messages on www.dejanews.com -to check whether your problem is already fixed. +Usenet: The best place to get help or to report bugs is the Usenet newsgroup + comp.emulators.ms-windows.wine. The Wine FAQ is posted there every + month. + +WWW: Please browse old messages on http://www.dejanews.com to check whether + your problem is already fixed before posting a bug report to the + newsgroup. + + A great deal of information about Wine is available from WineHQ at + http://www.winehq.com. Untested patches against the current + release are available at http://www.winehq.com/patches. + + +FAQ: The Wine FAQ is located at http://home.pacbell.net/dagar/wine.html. + If you add something, or fix a bug, please send a patch ('diff -u' format preferred) to julliard@lrc.epfl.ch for inclusion in the next diff --git a/configure b/configure index 1d32b1c6fda..8a11a0c367c 100755 --- a/configure +++ b/configure @@ -2820,6 +2820,7 @@ else #line 2821 "configure" #include "confdefs.h" + #include #ifdef HAVE_SYS_PARAM_H # include #endif @@ -2841,7 +2842,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:2845: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2846: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_statfs_bavail=yes else @@ -2865,7 +2866,7 @@ EOF fi echo $ac_n "checking "for statfs.f_bfree"""... $ac_c" 1>&6 -echo "configure:2869: checking "for statfs.f_bfree"" >&5 +echo "configure:2870: checking "for statfs.f_bfree"" >&5 if eval "test \"`echo '$''{'wine_cv_statfs_bfree'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2874,9 +2875,10 @@ else wine_cv_statfs_bfree=no else cat > conftest.$ac_ext < #ifdef HAVE_SYS_PARAM_H # include #endif @@ -2898,7 +2900,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:2902: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2904: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_statfs_bfree=yes else @@ -3043,6 +3045,7 @@ ipc/Makefile library/Makefile libtest/Makefile loader/Makefile +loader/ne/Makefile memory/Makefile misc/Makefile miscemu/Makefile @@ -3172,6 +3175,7 @@ ipc/Makefile library/Makefile libtest/Makefile loader/Makefile +loader/ne/Makefile memory/Makefile misc/Makefile miscemu/Makefile diff --git a/configure.in b/configure.in index 5dba6fa92db..d783a00dd4a 100644 --- a/configure.in +++ b/configure.in @@ -227,6 +227,7 @@ AC_CACHE_CHECK( "for statfs.f_bavail", wine_cv_statfs_bavail, wine_cv_statfs_bavail=no else AC_TRY_COMPILE([ + #include #ifdef HAVE_SYS_PARAM_H # include #endif @@ -257,6 +258,7 @@ AC_CACHE_CHECK( "for statfs.f_bfree", wine_cv_statfs_bfree, wine_cv_statfs_bfree=no else AC_TRY_COMPILE([ + #include #ifdef HAVE_SYS_PARAM_H # include #endif @@ -303,6 +305,7 @@ ipc/Makefile library/Makefile libtest/Makefile loader/Makefile +loader/ne/Makefile memory/Makefile misc/Makefile miscemu/Makefile diff --git a/controls/menu.c b/controls/menu.c index f9efbf83162..3cfe51f72bd 100644 --- a/controls/menu.c +++ b/controls/menu.c @@ -817,7 +817,7 @@ static void MENU_MenuBarCalcSize( HDC32 hdc, LPRECT32 lprect, * Draw a single menu item. */ static void MENU_DrawMenuItem( HWND32 hwnd, HDC32 hdc, MENUITEM *lpitem, - UINT32 height, BOOL32 menuBar ) + UINT32 height, BOOL32 menuBar, UINT32 odaction ) { RECT32 rect; @@ -843,7 +843,6 @@ static void MENU_DrawMenuItem( HWND32 hwnd, HDC32 hdc, MENUITEM *lpitem, { DRAWITEMSTRUCT32 dis; - TRACE(menu, "Ownerdraw!\n" ); dis.CtlType = ODT_MENU; dis.itemID = lpitem->wID; dis.itemData = (DWORD)lpitem->text; @@ -851,11 +850,16 @@ static void MENU_DrawMenuItem( HWND32 hwnd, HDC32 hdc, MENUITEM *lpitem, if (lpitem->fState & MF_CHECKED) dis.itemState |= ODS_CHECKED; if (lpitem->fState & MF_GRAYED) dis.itemState |= ODS_GRAYED; if (lpitem->fState & MF_HILITE) dis.itemState |= ODS_SELECTED; - dis.itemAction = ODA_DRAWENTIRE | ODA_SELECT | ODA_FOCUS; + dis.itemAction = odaction; /* ODA_DRAWENTIRE | ODA_SELECT | ODA_FOCUS; */ dis.hwndItem = hwnd; dis.hDC = hdc; dis.rcItem = lpitem->rect; - SendMessage32A( hwnd, WM_DRAWITEM, 0, (LPARAM)&dis ); + TRACE(menu, "Ownerdraw: itemID=%d, itemState=%d, itemAction=%d, " + "hwndItem=%04x, hdc=%04x, rcItem={%d,%d,%d,%d}, rcItem=%p\n",dis.itemID, + dis.itemState, dis.itemAction, dis.hwndItem, dis.hDC, + dis.rcItem.left, dis.rcItem.top, dis.rcItem.right, + dis.rcItem.bottom, dis.rcItem ); + SendMessage32A( GetWindow32(hwnd,GW_OWNER), WM_DRAWITEM, 0, (LPARAM)&dis ); return; } @@ -1114,7 +1118,8 @@ static void MENU_DrawPopupMenu( HWND32 hwnd, HDC32 hdc, HMENU32 hmenu ) UINT32 u; for (u = menu->nItems, item = menu->items; u > 0; u--, item++) - MENU_DrawMenuItem( hwnd, hdc, item, menu->Height, FALSE ); + MENU_DrawMenuItem( hwnd, hdc, item, menu->Height, FALSE, + ODA_DRAWENTIRE ); } } else SelectObject32( hdc, hPrevBrush ); @@ -1156,7 +1161,8 @@ UINT32 MENU_DrawMenuBar( HDC32 hDC, LPRECT32 lprect, HWND32 hwnd, if (lppop->nItems == 0) return SYSMETRICS_CYMENU; for (i = 0; i < lppop->nItems; i++) { - MENU_DrawMenuItem( hwnd, hDC, &lppop->items[i], lppop->Height, TRUE ); + MENU_DrawMenuItem( hwnd, hDC, &lppop->items[i], lppop->Height, TRUE, + ODA_DRAWENTIRE ); } return lppop->Height; } @@ -1339,7 +1345,8 @@ static void MENU_SelectItem( HWND32 hwndOwner, HMENU32 hmenu, UINT32 wIndex, { lppop->items[lppop->FocusedItem].fState &= ~(MF_HILITE|MF_MOUSESELECT); MENU_DrawMenuItem(lppop->hWnd,hdc,&lppop->items[lppop->FocusedItem], - lppop->Height, !(lppop->wFlags & MF_POPUP) ); + lppop->Height, !(lppop->wFlags & MF_POPUP), + ODA_SELECT ); } /* Highlight new item (if any) */ @@ -1348,7 +1355,8 @@ static void MENU_SelectItem( HWND32 hwndOwner, HMENU32 hmenu, UINT32 wIndex, { lppop->items[lppop->FocusedItem].fState |= MF_HILITE; MENU_DrawMenuItem( lppop->hWnd, hdc, &lppop->items[lppop->FocusedItem], - lppop->Height, !(lppop->wFlags & MF_POPUP) ); + lppop->Height, !(lppop->wFlags & MF_POPUP), + ODA_SELECT ); if (sendMenuSelect) { MENUITEM *ip = &lppop->items[lppop->FocusedItem]; @@ -1742,7 +1750,7 @@ static HMENU32 MENU_ShowSubPopup( HWND32 hwndOwner, HMENU32 hmenu, if (menu->wFlags & MF_POPUP) hdc = GetDC32( menu->hWnd ); else hdc = GetDCEx32( menu->hWnd, 0, DCX_CACHE | DCX_WINDOW); item->fState |= MF_HILITE; - MENU_DrawMenuItem( menu->hWnd, hdc, item, menu->Height, !(menu->wFlags & MF_POPUP) ); + MENU_DrawMenuItem( menu->hWnd, hdc, item, menu->Height, !(menu->wFlags & MF_POPUP), ODA_DRAWENTIRE ); ReleaseDC32( menu->hWnd, hdc ); } if (!item->rect.top && !item->rect.left && !item->rect.bottom && !item->rect.right) diff --git a/debugger/break.c b/debugger/break.c index f584ba9f06a..17e055e42be 100644 --- a/debugger/break.c +++ b/debugger/break.c @@ -339,37 +339,14 @@ void DEBUG_AddModuleBreakpoints(void) NE_MODULE *pModule; BOOL32 ok; DBG_ADDR addr = { NULL, 0, 0 }; + WINE_MODREF *wm; for (ok = ModuleFirst(&entry); ok; ok = ModuleNext(&entry)) { - if (!(pModule = MODULE_GetPtr( entry.hModule ))) continue; + if (!(pModule = MODULE_GetPtr16( entry.hModule ))) continue; if (pModule->flags & NE_FFLAGS_LIBMODULE) continue; /* Library */ - if (pModule->flags & NE_FFLAGS_WIN32) /* PE module */ - { - PE_MODREF *pem = PROCESS_Current()->modref_list; - if (!pem) - { - addr.seg = 0; - addr.off = (DWORD)RVA_PTR( pModule->module32, - OptionalHeader.AddressOfEntryPoint); - } - else - { - while (pem) - { - if (pem->module == pModule->module32) break; - pem = pem->next; - } - if (!pem) continue; - addr.seg = 0; - addr.off = (DWORD)RVA_PTR( pem->module, - OptionalHeader.AddressOfEntryPoint); - } - fprintf( stderr, "Win32 task '%s': ", entry.szModule ); - DEBUG_AddBreakpoint( &addr ); - } - else /* NE module */ + if (!(pModule->flags & NE_FFLAGS_WIN32)) /* NE module */ { addr.seg = NE_SEG_TABLE(pModule)[pModule->cs-1].selector; addr.off = pModule->ip; @@ -377,6 +354,12 @@ void DEBUG_AddModuleBreakpoints(void) DEBUG_AddBreakpoint( &addr ); } } + for (wm=PROCESS_Current()->modref_list;wm;wm=wm->next) { + addr.seg = 0; + addr.off =(DWORD)RVA_PTR(wm->module,OptionalHeader.AddressOfEntryPoint); + fprintf( stderr, "Win32 module '%s': ", wm->modname ); + DEBUG_AddBreakpoint( &addr ); + } DEBUG_SetBreakpoints( TRUE ); /* Setup breakpoints */ } @@ -394,15 +377,14 @@ BOOL32 DEBUG_ShouldContinue( enum exec_mode mode, int * count ) DBG_ADDR cond_addr; int bpnum; struct list_id list; - WORD cs; /* If not single-stepping, back up over the int3 instruction */ if (!(EFL_reg(&DEBUG_context) & STEP_FLAG)) EIP_reg(&DEBUG_context)--; - GET_CS(cs); - addr.seg = (CS_reg(&DEBUG_context) == cs) ? 0 : CS_reg(&DEBUG_context); + addr.seg = CS_reg(&DEBUG_context); addr.off = EIP_reg(&DEBUG_context); - + if (IS_SELECTOR_SYSTEM(addr.seg)) addr.seg = 0; + bpnum = DEBUG_FindBreakpoint( &addr ); breakpoints[0].enabled = 0; /* disable the step-over breakpoint */ @@ -519,11 +501,10 @@ enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count ) unsigned int * value; enum exec_mode ret_mode; BYTE *instr; - WORD cs; - GET_CS(cs); - addr.seg = (CS_reg(&DEBUG_context) == cs) ? 0 : CS_reg(&DEBUG_context); + addr.seg = CS_reg(&DEBUG_context); addr.off = EIP_reg(&DEBUG_context); + if (IS_SELECTOR_SYSTEM(addr.seg)) addr.seg = 0; /* * This is the mode we will be running in after we finish. We would like diff --git a/debugger/db_disasm.c b/debugger/db_disasm.c index bd8e11facbd..05686a78b10 100644 --- a/debugger/db_disasm.c +++ b/debugger/db_disasm.c @@ -1009,8 +1009,6 @@ static void db_task_printsym(unsigned int addr, int size) switch(size) { case BYTE: - fprintf(stderr, "0x%2.2x", addr & 0xff ); - break; case WORD: fprintf(stderr, "0x%4.4x", addr & 0xffff ); break; @@ -1162,9 +1160,7 @@ void DEBUG_Disasm( DBG_ADDR *addr, int display ) * Set this so we get can supress the printout if we need to. */ db_display = display; - - if (!addr->seg) db_disasm_16 = FALSE; - else db_disasm_16 = !(GET_SEL_FLAGS(addr->seg) & LDT_FLAGS_32BIT); + db_disasm_16 = !IS_SELECTOR_32BIT(addr->seg); get_value_inc( inst, addr, 1, FALSE ); @@ -1212,13 +1208,16 @@ void DEBUG_Disasm( DBG_ADDR *addr, int display ) seg = "%gs"; break; case 0xf0: - fprintf(stderr,"lock "); + if( db_display ) + fprintf(stderr,"lock "); break; case 0xf2: - fprintf(stderr,"repne "); + if( db_display ) + fprintf(stderr,"repne "); break; case 0xf3: - fprintf(stderr,"repe "); /* XXX repe VS rep */ + if( db_display ) + fprintf(stderr,"repe "); /* XXX repe VS rep */ break; default: prefix = FALSE; diff --git a/debugger/dbg.y b/debugger/dbg.y index 7a54e7d1d74..f7963ef8968 100644 --- a/debugger/dbg.y +++ b/debugger/dbg.y @@ -17,6 +17,7 @@ #include "win.h" #include "winnt.h" #include "debugger.h" +#include "neexe.h" #include "expr.h" @@ -253,7 +254,7 @@ info_command: | tINFO tCLASS expr_value tEOL { CLASS_DumpClass( (CLASS *)$3 ); DEBUG_FreeExprMem(); } | tINFO tSHARE tEOL { DEBUG_InfoShare(); } - | tINFO tMODULE expr_value tEOL { MODULE_DumpModule( $3 ); + | tINFO tMODULE expr_value tEOL { NE_DumpModule( $3 ); DEBUG_FreeExprMem(); } | tINFO tQUEUE expr_value tEOL { QUEUE_DumpQueue( $3 ); DEBUG_FreeExprMem(); } @@ -270,7 +271,7 @@ info_command: walk_command: tWALK tCLASS tEOL { CLASS_WalkClasses(); } - | tWALK tMODULE tEOL { MODULE_WalkModules(); } + | tWALK tMODULE tEOL { NE_WalkModules(); } | tWALK tQUEUE tEOL { QUEUE_WalkQueues(); } | tWALK tWND tEOL { WIN_WalkWindows( 0, 0 ); } | tWALK tWND tNUM tEOL { WIN_WalkWindows( $3, 0 ); } @@ -476,9 +477,7 @@ static void DEBUG_Main( int signal ) XUngrabServer( display ); XFlush( display ); - if (!addr.seg) newmode = 32; - else newmode = (GET_SEL_FLAGS(addr.seg) & LDT_FLAGS_32BIT) ? 32 : 16; - + newmode = IS_SELECTOR_32BIT(addr.seg) ? 32 : 16; if (newmode != dbg_mode) fprintf(stderr,"In %d bit mode.\n", dbg_mode = newmode); diff --git a/debugger/dbgmain.c b/debugger/dbgmain.c index 04cf7acc1f1..2f471321c97 100644 --- a/debugger/dbgmain.c +++ b/debugger/dbgmain.c @@ -103,12 +103,12 @@ void WIN_WalkWindows( HWND32 hwnd, int indent ) exit(0); } -NE_MODULE *MODULE_GetPtr( HMODULE16 hModule ) +NE_MODULE *MODULE_GetPtr16( HMODULE16 hModule ) { exit(0); } -FARPROC16 MODULE_GetEntryPoint( HMODULE16 hModule, WORD ordinal ) +FARPROC16 NE_GetEntryPoint( HMODULE16 hModule, WORD ordinal ) { exit(0); } diff --git a/debugger/hash.c b/debugger/hash.c index aba001bcc57..492769cab38 100644 --- a/debugger/hash.c +++ b/debugger/hash.c @@ -754,8 +754,7 @@ static void DEBUG_LoadEntryPoints16( HMODULE16 hModule, NE_MODULE *pModule, { cpnt += *cpnt + 1 + sizeof(WORD); sprintf( buffer, "%s.%.*s", name, *cpnt, cpnt + 1 ); - if ((address = MODULE_GetEntryPoint( hModule, - *(WORD *)(cpnt + *cpnt + 1) ))) + if ((address = NE_GetEntryPoint(hModule, *(WORD *)(cpnt + *cpnt + 1)))) { addr.seg = HIWORD(address); addr.off = LOWORD(address); @@ -772,8 +771,7 @@ static void DEBUG_LoadEntryPoints16( HMODULE16 hModule, NE_MODULE *pModule, { cpnt += *cpnt + 1 + sizeof(WORD); sprintf( buffer, "%s.%.*s", name, *cpnt, cpnt + 1 ); - if ((address = MODULE_GetEntryPoint( hModule, - *(WORD *)(cpnt + *cpnt + 1) ))) + if ((address = NE_GetEntryPoint(hModule, *(WORD *)(cpnt + *cpnt + 1)))) { addr.seg = HIWORD(address); addr.off = LOWORD(address); @@ -875,17 +873,20 @@ void DEBUG_LoadEntryPoints(void) MODULEENTRY entry; NE_MODULE *pModule; BOOL32 ok; + WINE_MODREF *wm; for (ok = ModuleFirst(&entry); ok; ok = ModuleNext(&entry)) { - if (!(pModule = MODULE_GetPtr( entry.hModule ))) continue; + if (!(pModule = MODULE_GetPtr16( entry.hModule ))) continue; fprintf( stderr, " %s", entry.szModule ); - if (pModule->flags & NE_FFLAGS_WIN32) /* PE module */ - DEBUG_LoadEntryPoints32( pModule->module32, entry.szModule ); - else /* NE module */ + if (!(pModule->flags & NE_FFLAGS_WIN32)) /* NE module */ DEBUG_LoadEntryPoints16( entry.hModule, pModule, entry.szModule ); } + for (wm=PROCESS_Current()->modref_list;wm;wm=wm->next) { + fprintf( stderr, " %s", wm->modname ); + DEBUG_LoadEntryPoints32( wm->module, wm->modname ); + } } diff --git a/debugger/registers.c b/debugger/registers.c index 6ab0bac6aa6..b6a8a235618 100644 --- a/debugger/registers.c +++ b/debugger/registers.c @@ -192,6 +192,59 @@ void DEBUG_GetSigContext( SIGCONTEXT *sigcontext ) #endif } +/*********************************************************************** + * DEBUG_Flags + * + * Return Flag String. + */ +char *DEBUG_Flags( DWORD flag, char *buf ) +{ + char *pt; + + strcpy( buf, " - 00 - - - " ); + pt = buf + strlen( buf ); + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00000001 ) *pt = 'C'; /* Carry Falg */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00000002 ) *pt = '1'; + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00000004 ) *pt = 'P'; /* Parity Flag */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00000008 ) *pt = '-'; + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00000010 ) *pt = 'A'; /* Auxiliary Carry Flag */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00000020 ) *pt = '-'; + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00000040 ) *pt = 'Z'; /* Zero Flag */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00000080 ) *pt = 'S'; /* Sign Flag */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00000100 ) *pt = 'T'; /* Trap/Trace Flag */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00000200 ) *pt = 'I'; /* Interupt Enable Flag */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00000400 ) *pt = 'D'; /* Direction Indicator */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00000800 ) *pt = 'O'; /* Overflow Flag */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00001000 ) *pt = '1'; /* I/O Privilage Level */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00002000 ) *pt = '1'; /* I/O Privilage Level */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00004000 ) *pt = 'N'; /* Nested Task Flag */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00008000 ) *pt = '-'; + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00010000 ) *pt = 'R'; /* Resume Flag */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00020000 ) *pt = 'V'; /* Vritual Mode Flag */ + if ( buf >= pt-- ) return( buf ); + if ( flag & 0x00040000 ) *pt = 'a'; /* Alignment Check Flag */ + if ( buf >= pt-- ) return( buf ); + return( buf ); +} + /*********************************************************************** * DEBUG_InfoRegisters @@ -200,6 +253,8 @@ void DEBUG_GetSigContext( SIGCONTEXT *sigcontext ) */ void DEBUG_InfoRegisters(void) { + char flag[33]; + fprintf(stderr,"Register dump:\n"); /* First get the segment registers out of the way */ @@ -209,9 +264,10 @@ void DEBUG_InfoRegisters(void) (WORD)FS_reg(&DEBUG_context), (WORD)GS_reg(&DEBUG_context) ); if (dbg_mode == 16) { - fprintf( stderr,"\n IP:%04x SP:%04x BP:%04x FLAGS:%04x\n", + fprintf( stderr,"\n IP:%04x SP:%04x BP:%04x FLAGS:%04x(%s)\n", IP_reg(&DEBUG_context), SP_reg(&DEBUG_context), - BP_reg(&DEBUG_context), FL_reg(&DEBUG_context) ); + BP_reg(&DEBUG_context), FL_reg(&DEBUG_context), + DEBUG_Flags(FL_reg(&DEBUG_context), flag)); fprintf( stderr," AX:%04x BX:%04x CX:%04x DX:%04x SI:%04x DI:%04x\n", AX_reg(&DEBUG_context), BX_reg(&DEBUG_context), CX_reg(&DEBUG_context), DX_reg(&DEBUG_context), @@ -219,9 +275,10 @@ void DEBUG_InfoRegisters(void) } else /* 32-bit mode */ { - fprintf( stderr, "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx\n", + fprintf( stderr, "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx(%s)\n", EIP_reg(&DEBUG_context), ESP_reg(&DEBUG_context), - EBP_reg(&DEBUG_context), EFL_reg(&DEBUG_context) ); + EBP_reg(&DEBUG_context), EFL_reg(&DEBUG_context), + DEBUG_Flags(EFL_reg(&DEBUG_context), flag)); fprintf( stderr, " EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n", EAX_reg(&DEBUG_context), EBX_reg(&DEBUG_context), ECX_reg(&DEBUG_context), EDX_reg(&DEBUG_context) ); diff --git a/debugger/source.c b/debugger/source.c index 1a37195b069..4d3715b7c55 100644 --- a/debugger/source.c +++ b/debugger/source.c @@ -492,10 +492,9 @@ DEBUG_Disassemble(const DBG_ADDR *xstart,const DBG_ADDR *xend,int offset) last = DEBUG_LastDisassemble; if (!last.seg && !last.off) { - WORD cs; - GET_CS(cs); - last.seg = (CS_reg(&DEBUG_context) == cs) ? 0 : CS_reg(&DEBUG_context); + last.seg = CS_reg(&DEBUG_context); last.off = EIP_reg(&DEBUG_context); + if (IS_SELECTOR_SYSTEM(last.seg)) last.seg = 0; } for (i=0;i&1|less -i" and in less search for messagebox. diff --git a/documentation/wine.man b/documentation/wine.man index 7eeb53c8284..0be4451d8ae 100644 --- a/documentation/wine.man +++ b/documentation/wine.man @@ -71,9 +71,8 @@ comm, commdlg, crtdll, cursor, dc, dde, dialog, dll, dosfs, driver, edit, env, event, exec, file, fixup, font, gdi, global, graphics, heap, hook, icon, int, key, keyboard, ldt, listbox, local, mci, mcianim, mciwave, mdi, menu, message, metafile, midi, mmio, mmsys, mmtime, module, msg, nonclient, -ole, palette, profile, prop, reg, region, relay, resource, scroll, selector, -sem, sendmsg, shm, stress, string, syscolor, task, text, timer, toolhelp, -ver, vxd, win, win32, winsock. +ole, palette, profile, prop, reg, region, relay, resource, scroll, segment, +selector,sem, sendmsg, shm, stress, string, syscolor, task, text, timer, toolhelp,ver, vxd, win, win32, winsock. .TP .I -depth n Change the depth to use for multiple-depth screens diff --git a/files/directory.c b/files/directory.c index a780e366fbc..0f211d7c891 100644 --- a/files/directory.c +++ b/files/directory.c @@ -129,7 +129,13 @@ UINT32 WINAPI GetTempPath32A( UINT32 count, LPSTR path ) UINT32 ret; if (!(ret = GetEnvironmentVariable32A( "TMP", path, count ))) if (!(ret = GetEnvironmentVariable32A( "TEMP", path, count ))) - ret = GetCurrentDirectory32A( count, path ); + if (!(ret = GetCurrentDirectory32A( count, path ))) + return 0; + if ((ret < count - 1) && (path[ret-1] != '\\')) + { + path[ret++] = '\\'; + path[ret] = '\0'; + } return ret; } @@ -144,7 +150,13 @@ UINT32 WINAPI GetTempPath32W( UINT32 count, LPWSTR path ) UINT32 ret; if (!(ret = GetEnvironmentVariable32W( tmp, path, count ))) if (!(ret = GetEnvironmentVariable32W( temp, path, count ))) - ret = GetCurrentDirectory32W( count, path ); + if (!(ret = GetCurrentDirectory32W( count, path ))) + return 0; + if ((ret < count - 1) && (path[ret-1] != '\\')) + { + path[ret++] = '\\'; + path[ret] = '\0'; + } return ret; } diff --git a/files/drive.c b/files/drive.c index 47b543d7b2c..c07d350034d 100644 --- a/files/drive.c +++ b/files/drive.c @@ -745,7 +745,7 @@ UINT16 WINAPI GetDriveType16( UINT16 drive ) { case TYPE_FLOPPY: return DRIVE_REMOVABLE; case TYPE_HD: return DRIVE_FIXED; - case TYPE_CDROM: return DRIVE_REMOTE; + case TYPE_CDROM: return DRIVE_REMOVABLE; case TYPE_NETWORK: return DRIVE_REMOTE; case TYPE_INVALID: default: return DRIVE_CANNOTDETERMINE; @@ -801,16 +801,22 @@ UINT16 WINAPI GetCurrentDirectory16( UINT16 buflen, LPSTR buf ) * GetCurrentDirectory32A (KERNEL32.196) * * Returns "X:\\path\\etc\\". + * + * Despite the API description, return required length including the + * terminating null when buffer too small. This is the real behaviour. */ UINT32 WINAPI GetCurrentDirectory32A( UINT32 buflen, LPSTR buf ) { - char *pref = "A:\\"; + UINT32 ret; const char *s = DRIVE_GetDosCwd( DRIVE_GetCurrentDrive() ); + assert(s); - lstrcpyn32A( buf, pref, MIN( 4, buflen ) ); + ret = strlen(s) + 3; /* length of WHOLE current directory */ + if (ret >= buflen) return ret + 1; + lstrcpyn32A( buf, "A:\\", MIN( 4, buflen ) ); if (buflen) buf[0] += DRIVE_GetCurrentDrive(); if (buflen > 3) lstrcpyn32A( buf + 3, s, buflen - 3 ); - return strlen(s) + 3; /* length of WHOLE current directory */ + return ret; } diff --git a/files/file.c b/files/file.c index 721f11ad57c..d94b7ff8dd7 100644 --- a/files/file.c +++ b/files/file.c @@ -632,10 +632,7 @@ UINT16 WINAPI GetTempFileName16( BYTE drive, LPCSTR prefix, UINT16 unique, if (drive & TF_FORCEDRIVE) sprintf(temppath,"%c:", drive & ~TF_FORCEDRIVE ); else - { GetTempPath32A( 132, temppath ); - strcat( temppath, "\\" ); - } return (UINT16)GetTempFileName32A( temppath, prefix, unique, buffer ); } @@ -1611,7 +1608,7 @@ BOOL32 WINAPI CopyFile32A( LPCSTR source, LPCSTR dest, BOOL32 fail_if_exists ) CloseHandle( h1 ); return FALSE; } - while ((count = _lread32( h2, buffer, sizeof(buffer) )) > 0) + while ((count = _lread32( h1, buffer, sizeof(buffer) )) > 0) { char *p = buffer; while (count > 0) diff --git a/files/profile.c b/files/profile.c index 123ab91928f..037cfb0c57c 100644 --- a/files/profile.c +++ b/files/profile.c @@ -477,15 +477,18 @@ static INT32 PROFILE_GetSection( PROFILESECTION *section, LPCSTR section_name, PROFILE_CopyEntry( buffer, key->name, len - 1, handle_env ); len -= strlen(buffer) + 1; buffer += strlen(buffer) + 1; - if (key->value) - { - buffer[-1] = '='; - PROFILE_CopyEntry(buffer, key->value, len - 1, handle_env); - len -= strlen(buffer) + 1; - buffer += strlen(buffer) + 1; - } } *buffer = '\0'; + if (len < 1) + /*If either lpszSection or lpszKey is NULL and the supplied + destination buffer is too small to hold all the strings, + the last string is truncated and followed by two null characters. + In this case, the return value is equal to cchReturnBuffer + minus two. */ + { + buffer[-1] = '\0'; + return oldlen - 2; + } return oldlen - len + 1; } section = section->next; diff --git a/graphics/ddraw.c b/graphics/ddraw.c index 33c7d1b8712..92c118fd436 100644 --- a/graphics/ddraw.c +++ b/graphics/ddraw.c @@ -94,7 +94,7 @@ DirectDrawEnumerate32A(LPDDENUMCALLBACK32A ddenumproc,LPVOID data) { HRESULT WINAPI DSoundHelp(DWORD x,DWORD y,DWORD z) { - fprintf(stderr,"DSoundHelp(0x%08lx,0x%08lx,0x%08lx),stub!\n",x,y,z); + FIXME(ddraw,"(0x%08lx,0x%08lx,0x%08lx),stub!\n",x,y,z); return 0; } @@ -122,8 +122,12 @@ static void _dump_DDBLTFX(DWORD flagmask) { FE(DDBLTFX_ZBUFFERBASEDEST) }; for (i=0;ixy.dwRGBAlphaBitMask= 0; return 0; } - fprintf(stderr,"_getpixelformat:oops?\n"); + FIXME(ddraw,"_getpixelformat:oops?\n"); return DDERR_GENERIC; } @@ -458,15 +466,15 @@ static HRESULT WINAPI IDirectDrawSurface_Blt( return 0; } if (dwFlags) { - fprintf(stderr,"IDirectDrawSurface(%p)->Blt(%p,%p,%p,%08lx,%p),stub!\n", + FIXME(ddraw,"(%p)->(%p,%p,%p,%08lx,%p),stub!\n", this,rdst,src,rsrc,dwFlags,lpbltfx ); - if (rdst) fprintf(stderr," destrect :%dx%d-%dx%d\n",rdst->left,rdst->top,rdst->right,rdst->bottom); - if (rsrc) fprintf(stderr," srcrect :%dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom); - fprintf(stderr,"\tflags: ");_dump_DDBLT(dwFlags);fprintf(stderr,"\n"); + if (rdst) TRACE(ddraw," destrect :%dx%d-%dx%d\n",rdst->left,rdst->top,rdst->right,rdst->bottom); + if (rsrc) TRACE(ddraw," srcrect :%dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom); + TRACE(ddraw,"\tflags: ");_dump_DDBLT(dwFlags);fprintf(stderr,"\n"); } if (dwFlags & DDBLT_DDFX) { - fprintf(stderr," blitfx: ");_dump_DDBLTFX(lpbltfx->dwDDFX);fprintf(stderr,"\n"); + TRACE(ddraw," blitfx: \n");_dump_DDBLTFX(lpbltfx->dwDDFX); } return 0; } @@ -476,11 +484,11 @@ static HRESULT WINAPI IDirectDrawSurface_BltFast( ) { int i,bpp; if (TRACE_ON(ddraw)) { - fprintf(stderr,"IDirectDrawSurface(%p)->BltFast(%ld,%ld,%p,%p,%08lx),stub!\n", + FIXME(ddraw,"(%p)->(%ld,%ld,%p,%p,%08lx),stub!\n", this,dstx,dsty,src,rsrc,trans ); - fprintf(stderr," trans:");_dump_DDBLTFAST(trans);fprintf(stderr,"\n"); - fprintf(stderr," srcrect: %dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom); + TRACE(ddraw," trans:");_dump_DDBLTFAST(trans);fprintf(stderr,"\n"); + TRACE(ddraw," srcrect: %dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom); } bpp = this->s.ddraw->d.depth/8; for (i=0;ibottom-rsrc->top;i++) { @@ -495,7 +503,7 @@ static HRESULT WINAPI IDirectDrawSurface_BltFast( static HRESULT WINAPI IDirectDrawSurface_BltBatch( LPDIRECTDRAWSURFACE this,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y ) { - fprintf(stderr,"IDirectDrawSurface(%p)->BltBatch(%p,%08lx,%08lx),stub!\n", + TRACE(ddraw,"(%p)->BltBatch(%p,%08lx,%08lx),stub!\n", this,ddbltbatch,x,y ); return 0; @@ -560,12 +568,11 @@ static HRESULT WINAPI IDirectDrawSurface_GetAttachedSurface( TRACE(ddraw, "(%p)->GetAttachedSurface(%p,%p)\n", this, lpddsd, lpdsf); if (TRACE_ON(ddraw)) { - fprintf(stderr," caps "); + TRACE(ddraw," caps "); _dump_DDSCAPS(lpddsd->dwCaps); - fprintf(stderr,"\n"); } if (!(lpddsd->dwCaps & DDSCAPS_BACKBUFFER)) { - fprintf(stderr,"IDirectDrawSurface::GetAttachedSurface():whoops, can only handle backbuffers for now\n"); + FIXME(ddraw,"whoops, can only handle backbuffers for now\n"); return E_FAIL; } /* FIXME: should handle more than one backbuffer */ @@ -586,7 +593,7 @@ static HRESULT WINAPI IDirectDrawSurface_GetPixelFormat( } static HRESULT WINAPI IDirectDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE this,DWORD dwFlags) { - fprintf(stderr,"IDirectDrawSurface(%p)->GetBltStatus(0x%08lx),stub!\n", + FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", this,dwFlags ); return 0; @@ -595,7 +602,7 @@ static HRESULT WINAPI IDirectDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE this,D static HRESULT WINAPI IDirectDrawSurface_GetOverlayPosition( LPDIRECTDRAWSURFACE this,LPLONG x1,LPLONG x2 ) { - fprintf(stderr,"IDirectDrawSurface(%p)->GetOverlayPosition(%p,%p),stub!\n", + FIXME(ddraw,"(%p)->(%p,%p),stub!\n", this,x1,x2 ); return 0; @@ -604,20 +611,20 @@ static HRESULT WINAPI IDirectDrawSurface_GetOverlayPosition( static HRESULT WINAPI IDirectDrawSurface_SetClipper( LPDIRECTDRAWSURFACE this,LPDIRECTDRAWCLIPPER clipper ) { - fprintf(stderr,"IDirectDrawSurface(%p)->SetClipper(%p),stub!\n",this,clipper); + FIXME(ddraw,"(%p)->(%p),stub!\n",this,clipper); return 0; } static HRESULT WINAPI IDirectDrawSurface_AddAttachedSurface( LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE surf ) { - fprintf(stderr,"IDirectDrawSurface(%p)->AddAttachedSurface(%p),stub!\n",this,surf); + FIXME(ddraw,"(%p)->(%p),stub!\n",this,surf); this->s.backbuffer = surf; return 0; } static HRESULT WINAPI IDirectDrawSurface_GetDC(LPDIRECTDRAWSURFACE this,HDC32* lphdc) { - fprintf(stderr,"IDirectDrawSurface(%p)->GetDC(%p),stub!\n",this,lphdc); + FIXME(ddraw,"(%p)->GetDC(%p),stub!\n",this,lphdc); return 0; } @@ -625,7 +632,7 @@ static HRESULT WINAPI IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE this char xrefiid[50]; WINE_StringFromCLSID((LPCLSID)refiid,xrefiid); - TRACE(ddraw,"(%p)->QueryInterface(%s,%p)\n",this,xrefiid,obj); + TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj); /* thats version 3 (DirectX 5) */ if ( !memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID_IDirectDrawSurface3))) { @@ -647,7 +654,7 @@ static HRESULT WINAPI IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE this *obj = this; return 0; } - fprintf(stderr,"IDirectDrawSurface(%p):interface for IID %s _NOT_ found!\n",this,xrefiid); + WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid); return OLE_E_ENUM_NOMORE; } @@ -738,7 +745,7 @@ static HRESULT WINAPI IDirectDrawSurface2_GetAttachedSurface( } static HRESULT WINAPI IDirectDrawSurface2_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE2 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) { - fprintf(stderr,"IDirectDrawSurface(%p)->EnumAttachedSurfaces(%p,%p),stub!\n",this,context,esfcb); + FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,context,esfcb); return 0; } @@ -876,7 +883,7 @@ static HRESULT WINAPI IDirectDrawSurface3_Unlock( } static HRESULT WINAPI IDirectDrawSurface3_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE3 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) { - fprintf(stderr,"IDirectDrawSurface3(%p)->EnumAttachedSurfaces(%p,%p),stub!\n",this,context,esfcb); + FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,context,esfcb); return 0; } @@ -942,7 +949,7 @@ static struct IDirectDrawSurface3_VTable dds3vt = { static HRESULT WINAPI IDirectDrawClipper_SetHwnd( LPDIRECTDRAWCLIPPER this,DWORD x,HWND32 hwnd ) { - fprintf(stderr,"IDirectDrawClipper(%p)->SetHwnd(0x%08lx,0x%08lx),stub!\n",this,x,(DWORD)hwnd); + FIXME(ddraw,"(%p)->SetHwnd(0x%08lx,0x%08lx),stub!\n",this,x,(DWORD)hwnd); return 0; } @@ -974,7 +981,7 @@ static HRESULT WINAPI IDirectDrawPalette_GetEntries( ) { int i; - fprintf(stderr,"IDirectDrawPalette(%p)->GetEntries(%08lx,%ld,%ld,%p),stub!\n", + FIXME(ddraw,"(%p)->GetEntries(%08lx,%ld,%ld,%p),stub!\n", this,x,start,end,palent ); for (i=start;icm) /* should not happen */ { - fprintf(stderr,"no colormap in SetEntries???\n"); + ERR(ddraw,"no colormap in SetEntries???\n"); return DDERR_GENERIC; } /* FIXME: free colorcells instead of freeing whole map */ @@ -1093,7 +1100,7 @@ static HRESULT WINAPI IDirect3D2_EnumDevices( ) { D3DDEVICEDESC d1,d2; - fprintf(stderr,"IDirect3D2(%p)->EnumDevices(%p,%p),stub!\n",this,cb,context); + FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,cb,context); d1.dwSize = sizeof(d1); d1.dwFlags = 0; @@ -1123,10 +1130,10 @@ static HRESULT WINAPI IDirectDraw_CreateSurface( ) { int i; - TRACE(ddraw, "(%p)->CreateSurface(%p,%p,%p)\n", + TRACE(ddraw, "(%p)->(%p,%p,%p)\n", this,lpddsd,lpdsf,lpunk); if (TRACE_ON(ddraw)) { - fprintf(stderr,"[w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight); + DUMP("[w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight); _dump_DDSD(lpddsd->dwFlags); fprintf(stderr,"caps "); _dump_DDSCAPS(lpddsd->ddsCaps.dwCaps); @@ -1170,7 +1177,7 @@ static HRESULT WINAPI IDirectDraw_CreateSurface( LPDIRECTDRAWSURFACE back; if (lpddsd->dwBackBufferCount>1) - fprintf(stderr,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount); + FIXME(ddraw,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount); (*lpdsf)->s.backbuffer = back = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface)); this->lpvtbl->fnAddRef(this); @@ -1198,7 +1205,7 @@ static HRESULT WINAPI IDirectDraw_CreateSurface( static HRESULT WINAPI IDirectDraw_DuplicateSurface( LPDIRECTDRAW this,LPDIRECTDRAWSURFACE src,LPDIRECTDRAWSURFACE *dst ) { - fprintf(stderr,"(%p)->DuplicateSurface(%p,%p)\n",this,src,dst); + FIXME(ddraw,"(%p)->(%p,%p) simply copies\n",this,src,dst); *dst = src; /* FIXME */ return 0; } @@ -1222,7 +1229,7 @@ static HRESULT WINAPI IDirectDraw_SetCooperativeLevel( FE(DDSCL_CREATEDEVICEWINDOW) }; - TRACE(ddraw,"(%p)->SetCooperativeLevel(%08lx,%08lx)\n", + TRACE(ddraw,"(%p)->(%08lx,%08lx)\n", this,(DWORD)hwnd,cooplevel ); if(TRACE_ON(ddraw)){ @@ -1243,7 +1250,7 @@ static HRESULT WINAPI IDirectDraw_SetDisplayMode( int i,*depths,depcount; char buf[200]; - TRACE(ddraw, "(%p)->SetDisplayMode(%ld,%ld,%ld)\n", + TRACE(ddraw, "(%p)->(%ld,%ld,%ld)\n", this, width, height, depth); depths = TSXListDepths(display,DefaultScreen(display),&depcount); @@ -1252,13 +1259,11 @@ static HRESULT WINAPI IDirectDraw_SetDisplayMode( break; TSXFree(depths); if (i==depcount) {/* not found */ - sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), unsupported depth!",width,height,depth); - MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP); + ERR(ddraw,"(w=%ld,h=%ld,d=%ld), unsupported depth!\n",width,height,depth); return DDERR_UNSUPPORTEDMODE; } if (this->d.fb_width < width) { - sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width,height,depth,width,this->d.fb_width); - MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP); + ERR(ddraw,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,this->d.fb_width); return DDERR_UNSUPPORTEDMODE; } this->d.width = width; @@ -1286,7 +1291,7 @@ static HRESULT WINAPI IDirectDraw_SetDisplayMode( static HRESULT WINAPI IDirectDraw_GetCaps( LPDIRECTDRAW this,LPDDCAPS caps1,LPDDCAPS caps2 ) { - TRACE(ddraw,"(%p)->GetCaps(%p,%p)\n",this,caps1,caps2); + TRACE(ddraw,"(%p)->(%p,%p)\n",this,caps1,caps2); caps1->dwVidMemTotal = this->d.fb_memsize; caps1->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED); /* we can do anything */ caps1->ddsCaps.dwCaps = 0xffffffff; /* we can do anything */ @@ -1301,7 +1306,7 @@ static HRESULT WINAPI IDirectDraw_GetCaps( static HRESULT WINAPI IDirectDraw_CreateClipper( LPDIRECTDRAW this,DWORD x,LPDIRECTDRAWCLIPPER *lpddclip,LPUNKNOWN lpunk ) { - fprintf(stderr,"(%p)->CreateClipper(%08lx,%p,%p),stub!\n", + FIXME(ddraw,"(%p)->(%08lx,%p,%p),stub!\n", this,x,lpddclip,lpunk ); *lpddclip = (LPDIRECTDRAWCLIPPER)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawClipper)); @@ -1313,7 +1318,7 @@ static HRESULT WINAPI IDirectDraw_CreateClipper( static HRESULT WINAPI IDirectDraw_CreatePalette( LPDIRECTDRAW this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk ) { - TRACE(ddraw,"(%p)->CreatePalette(%08lx,%p,%p,%p)\n", + TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n", this,x,palent,lpddpal,lpunk ); *lpddpal = (LPDIRECTDRAWPALETTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawPalette)); @@ -1329,7 +1334,7 @@ static HRESULT WINAPI IDirectDraw_CreatePalette( } static HRESULT WINAPI IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) { - TRACE(ddraw, "(%p)->RestoreDisplayMode()\n", + TRACE(ddraw, "(%p)->()\n", this); Sleep(1000); XF86DGADirectVideo(display,DefaultScreen(display),0); @@ -1343,7 +1348,7 @@ static HRESULT WINAPI IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) { static HRESULT WINAPI IDirectDraw_WaitForVerticalBlank( LPDIRECTDRAW this,DWORD x,HANDLE32 h ) { - TRACE(ddraw,"(%p)->WaitForVerticalBlank(0x%08lx,0x%08x)\n",this,x,h); + TRACE(ddraw,"(%p)->(0x%08lx,0x%08x)\n",this,x,h); return 0; } @@ -1369,7 +1374,7 @@ static HRESULT WINAPI IDirectDraw_QueryInterface( char xrefiid[50]; WINE_StringFromCLSID((LPCLSID)refiid,xrefiid); - TRACE(ddraw,"(%p)->QueryInterface(%s,%p)\n",this,xrefiid,obj); + TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj); if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) { *obj = this; this->lpvtbl->fnAddRef(this); @@ -1408,14 +1413,14 @@ static HRESULT WINAPI IDirectDraw_QueryInterface( *obj = d3d; return 0; } - fprintf(stderr,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid); + WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid); return OLE_E_ENUM_NOMORE; } static HRESULT WINAPI IDirectDraw_GetVerticalBlankStatus( LPDIRECTDRAW this,BOOL32 *status ) { - TRACE(ddraw,"(%p)->GetVerticalBlankSatus(%p)\n",this,status); + TRACE(ddraw,"(%p)->(%p)\n",this,status); *status = TRUE; return 0; } @@ -1425,7 +1430,7 @@ static HRESULT WINAPI IDirectDraw_EnumDisplayModes( ) { DDSURFACEDESC ddsfd; - TRACE(ddraw,"(%p)->EnumDisplayModes(0x%08lx,%p,%p,%p)\n",this,dwFlags,lpddsfd,context,modescb); + TRACE(ddraw,"(%p)->(0x%08lx,%p,%p,%p)\n",this,dwFlags,lpddsfd,context,modescb); _getpixelformat(this,&(ddsfd.ddpfPixelFormat)); @@ -1460,7 +1465,7 @@ static HRESULT WINAPI IDirectDraw_EnumDisplayModes( static HRESULT WINAPI IDirectDraw_GetDisplayMode( LPDIRECTDRAW this,LPDDSURFACEDESC lpddsfd ) { - TRACE(ddraw,"(%p)->GetDisplayMode(%p)\n",this,lpddsfd); + TRACE(ddraw,"(%p)->(%p)\n",this,lpddsfd); lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS; lpddsfd->dwHeight = screenHeight; lpddsfd->dwWidth = screenWidth; @@ -1473,14 +1478,14 @@ static HRESULT WINAPI IDirectDraw_GetDisplayMode( } static HRESULT WINAPI IDirectDraw_FlipToGDISurface(LPDIRECTDRAW this) { - fprintf(stderr,"(%p)->FlipToGDISurface()\n",this); + TRACE(ddraw,"(%p)->()\n",this); return DD_OK; } static HRESULT WINAPI IDirectDraw_GetMonitorFrequency( LPDIRECTDRAW this,LPDWORD freq ) { - fprintf(stderr,"(%p)->GetMonitorFrequency(%p)\n",this,freq); + FIXME(ddraw,"(%p)->(%p) returns 60 Hz always\n",this,freq); *freq = 60*100; /* 60 Hz */ return 0; } @@ -1563,7 +1568,7 @@ static HRESULT WINAPI IDirectDraw2_CreatePalette( static HRESULT WINAPI IDirectDraw2_SetDisplayMode( LPDIRECTDRAW2 this,DWORD width,DWORD height,DWORD depth,DWORD xx,DWORD yy ) { - TRACE(ddraw,"IDirectDraw2(%p)->SetDisplayMode(%ld,%ld,%ld,%08lx,%08lx)\n", + TRACE(ddraw,"(%p)->(%ld,%ld,%ld,%08lx,%08lx)\n", this, width, height, depth, xx, yy); return IDirectDraw_SetDisplayMode((LPDIRECTDRAW)this,width,height,depth); @@ -1576,7 +1581,7 @@ static HRESULT WINAPI IDirectDraw2_RestoreDisplayMode(LPDIRECTDRAW2 this) { static HRESULT WINAPI IDirectDraw2_EnumSurfaces( LPDIRECTDRAW2 this,DWORD x,LPDDSURFACEDESC ddsfd,LPVOID context,LPDDENUMSURFACESCALLBACK ddsfcb ) { - fprintf(stderr,"IDirectDraw2(%p)->EnumSurfaces(0x%08lx,%p,%p,%p),stub!\n",this,x,ddsfd,context,ddsfcb); + FIXME(ddraw,"(%p)->(0x%08lx,%p,%p,%p),stub!\n",this,x,ddsfd,context,ddsfcb); return 0; } @@ -1595,7 +1600,7 @@ static HRESULT WINAPI IDirectDraw2_GetDisplayMode( static HRESULT WINAPI IDirectDraw2_GetAvailableVidMem( LPDIRECTDRAW2 this,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free ) { - fprintf(stderr,"IDirectDraw2(%p)->GetAvailableVidMem(%p,%p,%p)\n", + TRACE(ddraw,"(%p)->(%p,%p,%p)\n", this,ddscaps,total,free ); if (total) *total = this->d.fb_memsize * 1024; @@ -1666,6 +1671,7 @@ HRESULT WINAPI DirectDrawCreate( LPGUID lpGUID, LPDIRECTDRAW *lplpDD, LPUNKNOWN TRACE(ddraw,"(%s,%p,%p)\n",xclsid,lplpDD,pUnkOuter); if (getuid()) { + MSG("Must be root to use XF86DGA!\n"); MessageBox32A(0,"Using the XF86DGA extension requires the program to be run using UID 0.","WINE DirectDraw",MB_OK|MB_ICONSTOP); return E_UNEXPECTED; } @@ -1673,14 +1679,14 @@ HRESULT WINAPI DirectDrawCreate( LPGUID lpGUID, LPDIRECTDRAW *lplpDD, LPUNKNOWN (*lplpDD)->lpvtbl = &ddvt; (*lplpDD)->ref = 1; if (!XF86DGAQueryExtension(display,&evbase,&evret)) { - fprintf(stderr,"No XF86DGA detected.\n"); + MSG("Wine DirectDraw: No XF86DGA detected.\n"); return 0; } XF86DGAQueryVersion(display,&major,&minor); TRACE(ddraw,"XF86DGA is version %d.%d\n",major,minor); XF86DGAQueryDirectVideo(display,DefaultScreen(display),&flags); if (!(flags & XF86DGADirectPresent)) - fprintf(stderr,"direct video is NOT ENABLED.\n"); + MSG("direct video is NOT ENABLED.\n"); XF86DGAGetVideo(display,DefaultScreen(display),&addr,&width,&banksize,&memsize); TRACE(ddraw,"video framebuffer: begin %p, width %d,banksize %d,memsize %d\n", addr,width,banksize,memsize diff --git a/graphics/driver.c b/graphics/driver.c index e26b2c30b17..7c09b2b9943 100644 --- a/graphics/driver.c +++ b/graphics/driver.c @@ -7,6 +7,7 @@ #include #include "gdi.h" #include "heap.h" +#include "debug.h" typedef struct tagGRAPHICS_DRIVER { @@ -36,7 +37,7 @@ BOOL32 DRIVER_RegisterDriver( LPCSTR name, const DC_FUNCTIONS *funcs ) /* No name -> it's the generic driver */ if (genericDriver) { - fprintf( stderr, "DRIVER_RegisterDriver: already a generic driver\n" ); + WARN(driver, " already a generic driver\n" ); HeapFree( SystemHeap, 0, driver ); return FALSE; } diff --git a/graphics/env.c b/graphics/env.c index 13aa37f79e8..a004ee81558 100644 --- a/graphics/env.c +++ b/graphics/env.c @@ -5,18 +5,18 @@ * * Copyright 1997 Marcus Meissner */ +#include #include -#include "windows.h" -#include "gdi.h" -#include "debug.h" +#include +#include +#include /*********************************************************************** * GetEnvironment (GDI.134) */ INT16 WINAPI GetEnvironment(LPCSTR lpPortName, LPDEVMODE16 lpdev, UINT16 nMaxSiz) { - fprintf(stddeb, "GetEnvironment('%s','%p',%d),\n", - lpPortName, lpdev, nMaxSiz); + FIXME(gdi, "('%s','%p',%d),stub\n", lpPortName, lpdev, nMaxSiz); return 0; } @@ -25,9 +25,9 @@ INT16 WINAPI GetEnvironment(LPCSTR lpPortName, LPDEVMODE16 lpdev, UINT16 nMaxSiz */ INT16 WINAPI SetEnvironment(LPCSTR lpPortName, LPDEVMODE16 lpdev, UINT16 nCount) { - fprintf(stddeb, "SetEnvironment('%s', '%p', %d) !\n", - lpPortName, lpdev, nCount); - fprintf(stderr, + + FIXME(gdi, "('%s', '%p', %d) stub!\n", lpPortName, lpdev, nCount); + if (TRACE_ON(gdi)) DUMP( "\tdevmode:\n" "\tname = %s\n" "\tdmSpecVersion = %d\n" diff --git a/graphics/escape.c b/graphics/escape.c index cd3873c0ca7..c7bac2cf6ae 100644 --- a/graphics/escape.c +++ b/graphics/escape.c @@ -10,6 +10,8 @@ #include "heap.h" #include "ldt.h" #include "dc.h" +#include + INT16 WINAPI Escape16( HDC16 hdc, INT16 nEscape, INT16 cbInput, SEGPTR lpszInData, SEGPTR lpvOutData ) @@ -77,7 +79,7 @@ INT32 WINAPI Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput, switch(nEscape) { case QUERYESCSUPPORT: if (ret) - fprintf(stderr,"target DC implements Escape %d\n",nEscape); + TRACE(driver,"target DC implements Escape %d\n",nEscape); SEGPTR_FREE(PTR_SEG_TO_LIN(segin)); break; case GETSCALINGFACTOR: @@ -115,7 +117,7 @@ INT32 WINAPI Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput, } INT32 WINAPI ExtEscape32(HDC32 hdc,INT32 nEscape,INT32 cbInput,LPCSTR x,INT32 cbOutput,LPSTR out) { - fprintf(stderr,"ExtEscape32(0x%04x,0x%x,%d,%s,%d,%p),stub!\n", + FIXME(driver,"(0x%04x,0x%x,%d,%s,%d,%p),stub!\n", hdc,nEscape,cbInput,x,cbOutput,out ); return 1; diff --git a/graphics/fontengine.c b/graphics/fontengine.c index f261b133af3..0a652971560 100644 --- a/graphics/fontengine.c +++ b/graphics/fontengine.c @@ -2,28 +2,38 @@ * True Type font engine support * * Copyright 1996 John Harvey + * Copyright 1998 David Lee Lambert + * */ +#include "windows.h" #include #include -#include "windows.h" +#include #include "font.h" -/* GDI 300 */ -WORD WINAPI EngineEnumerateFont(LPSTR fontname, FARPROC16 proc, DWORD data ) + + +/* **************************************************************** + * EngineEnumerateFont [GDI.300] + */ +WORD WINAPI +EngineEnumerateFont(LPSTR fontname, FARPROC16 proc, DWORD data ) { - fprintf(stderr,"EngineEnumerateFont(%s,%p,%lx),stub\n",fontname,proc,data); + FIXME(font,"(%s,%p,%lx),stub\n",fontname,proc,data); return 0; } -/* GDI 301 */ +/* **************************************************************** + * EngineDeleteFont [GDI.301] + */ WORD WINAPI EngineDeleteFont(LPFONTINFO16 lpFontInfo) { WORD handle; /* untested, don't know if it works. We seem to access some structure that is located after the - FONTINFO. The FONTINFO docu says that there may follow some char-width - table or font bitmap or vector info. + FONTINFO. The FONTINFO documentation says that there may + follow some char-width table or font bitmap or vector info. I think it is some kind of font bitmap that begins at offset 0x52, as FONTINFO goes up to 0x51. If this is correct, everything should be implemented correctly. @@ -39,46 +49,63 @@ WORD WINAPI EngineDeleteFont(LPFONTINFO16 lpFontInfo) return 1; } -/* GDI 302 */ +/* **************************************************************** + * EngineRealizeFont [GDI.302] + */ WORD WINAPI EngineRealizeFont(LPLOGFONT16 lplogFont, LPTEXTXFORM16 lptextxform, LPFONTINFO16 lpfontInfo) { - fprintf(stderr,"EngineRealizeFont(%p,%p,%p),stub\n",lplogFont,lptextxform,lpfontInfo); + FIXME(font,"(%p,%p,%p),stub\n",lplogFont,lptextxform,lpfontInfo); return 0; } -/* GDI 303 */ +/* **************************************************************** + * EngineGetCharWidth [GDI.303] + */ WORD WINAPI EngineGetCharWidth(LPFONTINFO16 lpFontInfo, BYTE firstChar, BYTE lastChar, LPINT16 buffer) { int i; for (i = firstChar; i <= lastChar; i++) + FIXME(font, " returns font's average width for range %d to %d\n", firstChar, lastChar); *buffer++ = lpFontInfo->dfAvgWidth; /* insert some charwidth functionality here; use average width for now */ return 1; } -/* GDI 304 */ +/* **************************************************************** + * EngineSetFontContext [GDI.304] + */ WORD WINAPI EngineSetFontContext(LPFONTINFO16 lpFontInfo, WORD data) { + FIXME(font, "stub?\n"); return 0; } -/* GDI 305 */ +/* **************************************************************** + * EngineGetGlyphBMP [GDI.305] + */ WORD WINAPI EngineGetGlyphBMP(WORD word, LPFONTINFO16 lpFontInfo, WORD w1, WORD w2, LPSTR string, DWORD dword, /*LPBITMAPMETRICS16*/ LPVOID metrics) { + FIXME(font, "stub?\n"); return 0; } -/* GDI 306 */ +/* **************************************************************** + * EngineMakeFontDir [GDI.306] + */ DWORD WINAPI EngineMakeFontDir(HDC16 hdc, LPFONTDIR16 fontdir, LPCSTR string) { + FIXME(font, " stub! (always fails)\n"); return -1; /* error */ } -/* GDI 314 */ +/* **************************************************************** + * EngineExtTextOut [GDI.314] + */ WORD WINAPI EngineExtTextOut() { + FIXME(font, "stub!\n"); return 0; } diff --git a/graphics/metafiledrv/init.c b/graphics/metafiledrv/init.c index c26b066614c..77ecba5e387 100644 --- a/graphics/metafiledrv/init.c +++ b/graphics/metafiledrv/init.c @@ -43,6 +43,7 @@ static const DC_FUNCTIONS MFDRV_Funcs = MFDRV_PatBlt, /* pPatBlt */ MFDRV_Pie, /* pPie */ MFDRV_PolyPolygon, /* pPolyPolygon */ + NULL, /* pPolyPolyline */ MFDRV_Polygon, /* pPolygon */ MFDRV_Polyline, /* pPolyline */ NULL, /* pRealizePalette */ diff --git a/graphics/painting.c b/graphics/painting.c index b343023234e..a142c91f6ec 100644 --- a/graphics/painting.c +++ b/graphics/painting.c @@ -368,7 +368,7 @@ COLORREF WINAPI SetPixel32( HDC32 hdc, INT32 x, INT32 y, COLORREF color ) } /*********************************************************************** - * SetPixel32 (GDI32.329) + * SetPixelV32 (GDI32.329) */ BOOL32 WINAPI SetPixelV32( HDC32 hdc, INT32 x, INT32 y, COLORREF color ) { @@ -407,6 +407,104 @@ COLORREF WINAPI GetPixel32( HDC32 hdc, INT32 x, INT32 y ) } +/****************************************************************************** + * ChoosePixelFormat [GDI32.13] + * Matches a pixel format to given format + * + * PARAMS + * hdc [I] Device context to search for best pixel match + * ppfd [I] Pixel format for which a match is sought + * + * RETURNS + * Success: Pixel format index closest to given format + * Failure: 0 + */ +INT32 WINAPI ChoosePixelFormat( HDC32 hdc, PIXELFORMATDESCRIPTOR *ppfd ) +{ + FIXME(gdi, "(%d,%p): stub\n",hdc,ppfd); + ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR); + ppfd->nVersion = 1; + return 1; +} + + +/****************************************************************************** + * SetPixelFormat [GDI32.328] + * Sets pixel format of device context + * + * PARAMS + * hdc [I] Device context to search for best pixel match + * iPixelFormat [I] Pixel format index + * ppfd [I] Pixel format for which a match is sought + * + * RETURNS STD + */ +BOOL32 WINAPI SetPixelFormat( HDC32 hdc, int iPixelFormat, + PIXELFORMATDESCRIPTOR * ppfd) +{ + FIXME(gdi, "(%d,%d,%p): stub\n",hdc,iPixelFormat,ppfd); + return TRUE; +} + + +/****************************************************************************** + * GetPixelFormat [GDI32.212] + * Gets index of pixel format of DC + * + * PARAMETERS + * hdc [I] Device context whose pixel format index is sought + * + * RETURNS + * Success: Currently selected pixel format + * Failure: 0 + */ +int WINAPI GetPixelFormat( HDC32 hdc ) +{ + FIXME(gdi, "(%d): stub\n",hdc); + return 1; +} + + +/****************************************************************************** + * DescribePixelFormat [GDI32.71] + * Gets info about pixel format from DC + * + * PARAMS + * hdc [I] Device context + * iPixelFormat [I] Pixel format selector + * nBytes [I] Size of buffer + * ppfd [O] Pointer to structure to receive pixel format data + * + * RETURNS + * Success: Maximum pixel format index of the device context + * Failure: 0 + */ +int WINAPI DescribePixelFormat( HDC32 hdc, int iPixelFormat, UINT32 nBytes, + LPPIXELFORMATDESCRIPTOR ppfd ) +{ + FIXME(gdi, "(%d,%d,%d,%p): stub\n",hdc,iPixelFormat,nBytes,ppfd); + ppfd->nSize = nBytes; + ppfd->nVersion = 1; + return 3; +} + + +/****************************************************************************** + * SwapBuffers [GDI32.354] + * Exchanges front and back buffers of window + * + * PARAMS + * hdc [I] Device context whose buffers get swapped + * + * RETURNS STD + */ +BOOL32 WINAPI SwapBuffers( HDC32 hdc ) +{ + FIXME(gdi, "(%d): stub\n",hdc); + return TRUE; +} + + /*********************************************************************** * PaintRgn16 (GDI.43) */ @@ -647,6 +745,18 @@ BOOL32 WINAPI PolyPolygon32( HDC32 hdc, LPPOINT32 pt, LPINT32 counts, dc->funcs->pPolyPolygon(dc,pt,counts,polygons); } +/********************************************************************** + * PolyPolyline32 (GDI32.272) + */ +BOOL32 WINAPI PolyPolyline32( HDC32 hdc, LPPOINT32 pt, LPINT32 counts, + UINT32 polylines ) +{ + DC * dc = DC_GetDCPtr( hdc ); + + return dc && dc->funcs->pPolyPolyline && + dc->funcs->pPolyPolyline(dc,pt,counts,polylines); +} + /********************************************************************** * ExtFloodFill16 (GDI.372) */ @@ -935,3 +1045,31 @@ BOOL16 WINAPI DrawState16(HDC16 hdc, HBRUSH16 hbr, { return PAINTING_DrawState32(hdc, hbr, (DRAWSTATEPROC32)func, ldata, wdata, x, y, cx, cy, flags, FALSE, FALSE); } + + +/****************************************************************************** + * PolyBezier16 [GDI.502] + */ +BOOL16 WINAPI PolyBezier16( HDC16 hDc, LPPOINT16 lppt, INT16 cPoints ) +{ + FIXME(gdi, "(%x,%p,%d): stub\n",hDc,lppt,cPoints); + return TRUE; +} + +/****************************************************************************** + * PolyBezier32 [GDI32.268] + * Draws one or more Bezier curves + * + * PARAMS + * hDc [I] Handle to device context + * lppt [I] Pointer to endpoints and control points + * cPoints [I] Count of endpoints and control points + * + * RETURNS STD + */ +BOOL32 WINAPI PolyBezier32( HDC32 hDc, LPPOINT32 lppt, DWORD cPoints ) +{ + FIXME(gdi, "(%x,%p,%ld): stub\n",hDc,lppt,cPoints); + return TRUE; +} + diff --git a/graphics/path.c b/graphics/path.c index 09dbc5ffcd7..a795af8dda2 100644 --- a/graphics/path.c +++ b/graphics/path.c @@ -157,11 +157,19 @@ BOOL16 WINAPI AbortPath16(HDC16 hdc) } -/*********************************************************************** - * AbortPath32 (GDI32.1) +/****************************************************************************** + * AbortPath32 [GDI32.1] + * Closes and discards paths from device context + * + * NOTES + * Check that SetLastError is being called correctly + * + * PARAMS + * hdc [I] Handle to device context + * + * RETURNS STD */ -BOOL32 WINAPI AbortPath32(HDC32 hdc) -/* FIXME: Check that SetLastError is being called correctly */ +BOOL32 WINAPI AbortPath32( HDC32 hdc ) { GdiPath *pPath; diff --git a/graphics/win16drv/font.c b/graphics/win16drv/font.c index f735eff7c5e..7ed9f7135ab 100644 --- a/graphics/win16drv/font.c +++ b/graphics/win16drv/font.c @@ -181,8 +181,7 @@ BOOL32 WIN16DRV_EnumDeviceFonts( DC* dc, LPLOGFONT16 plf, WEPFC wepfc = {proc, lp}; /* EnumDFontCallback is GDI.158 */ - FARPROC16 pfnCallback = MODULE_GetEntryPoint( GetModuleHandle16("GDI"), - 158 ); + FARPROC16 pfnCallback = NE_GetEntryPoint( GetModuleHandle16("GDI"), 158 ); wRet = PRTDRV_EnumDFonts(physDev->segptrPDEVICE, plf->lfFaceName[0] ? plf->lfFaceName : NULL , pfnCallback , &wepfc ); diff --git a/graphics/win16drv/init.c b/graphics/win16drv/init.c index 4440d81cd21..2b85707c2d6 100644 --- a/graphics/win16drv/init.c +++ b/graphics/win16drv/init.c @@ -76,6 +76,7 @@ static const DC_FUNCTIONS WIN16DRV_Funcs = WIN16DRV_PatBlt, /* pPatBlt */ NULL, /* pPie */ NULL, /* pPolyPolygon */ + NULL, /* pPolyPolyline */ WIN16DRV_Polygon, /* pPolygon */ WIN16DRV_Polyline, /* pPolyline */ NULL, /* pRealizePalette */ diff --git a/graphics/x11drv/graphics.c b/graphics/x11drv/graphics.c index ba8ec8aa18d..844232002c2 100644 --- a/graphics/x11drv/graphics.c +++ b/graphics/x11drv/graphics.c @@ -90,6 +90,7 @@ X11DRV_DrawArc( DC *dc, INT32 left, INT32 top, INT32 right, ystart = YLPTODP( dc, ystart ); xend = XLPTODP( dc, xend ); yend = YLPTODP( dc, yend ); + if ((left == right) || (top == bottom)) return FALSE; if (left > right) { tmp=left; left=right; right=tmp; } @@ -113,11 +114,7 @@ X11DRV_DrawArc( DC *dc, INT32 left, INT32 top, INT32 right, end_angle = - PI; istart_angle = (INT32)(start_angle * 180 * 64 / PI); idiff_angle = (INT32)((end_angle - start_angle) * 180 * 64 / PI ); - if (idiff_angle < 0) - { - istart_angle+= idiff_angle; - idiff_angle = abs(idiff_angle); - } + if (idiff_angle <= 0) idiff_angle += 360 * 64; /* Fill arc with brush if Chord() or Pie() */ @@ -582,6 +579,38 @@ X11DRV_PolyPolygon( DC *dc, LPPOINT32 pt, LPINT32 counts, UINT32 polygons) } +/********************************************************************** + * X11DRV_PolyPolyline + */ +BOOL32 +X11DRV_PolyPolyline( DC *dc, LPPOINT32 pt, LPINT32 counts, UINT32 polylines ) +{ + if (DC_SetupGCForPen ( dc )) + { + int i, j, max = 0; + XPoint *points; + + for (i = 0; i < polylines; i++) if (counts[i] > max) max = counts[i]; + points = (XPoint *) xmalloc( sizeof(XPoint) * (max+1) ); + + for (i = 0; i < polylines; i++) + { + for (j = 0; j < counts[i]; j++) + { + points[j].x = dc->w.DCOrgX + XLPTODP( dc, pt->x ); + points[j].y = dc->w.DCOrgY + YLPTODP( dc, pt->y ); + pt++; + } + points[j] = points[0]; + TSXDrawLines( display, dc->u.x.drawable, dc->u.x.gc, + points, j + 1, CoordModeOrigin ); + } + free( points ); + } + return TRUE; +} + + /********************************************************************** * X11DRV_InternalFloodFill * diff --git a/graphics/x11drv/init.c b/graphics/x11drv/init.c index 2193fb92370..d5f11aa7063 100644 --- a/graphics/x11drv/init.c +++ b/graphics/x11drv/init.c @@ -47,6 +47,7 @@ static const DC_FUNCTIONS X11DRV_Funcs = X11DRV_PatBlt, /* pPatBlt */ X11DRV_Pie, /* pPie */ X11DRV_PolyPolygon, /* pPolyPolygon */ + X11DRV_PolyPolyline, /* pPolyPolyline */ X11DRV_Polygon, /* pPolygon */ X11DRV_Polyline, /* pPolyline */ NULL, /* pRealizePalette */ diff --git a/graphics/x11drv/text.c b/graphics/x11drv/text.c index f4a243c1873..ea8c361cb70 100644 --- a/graphics/x11drv/text.c +++ b/graphics/x11drv/text.c @@ -8,6 +8,7 @@ #include "ts_xlib.h" #include #include "windows.h" +#include #include "dc.h" #include "gdi.h" /*#include "callback.h"*/ @@ -17,7 +18,7 @@ #include "debug.h" #define SWAP_INT(a,b) { int t = a; a = b; b = t; } - +#define IROUND(x) (int)((x)>0? (x)+0.5 : (x) - 0.5) /*********************************************************************** * X11DRV_ExtTextOut @@ -186,8 +187,35 @@ X11DRV_ExtTextOut( DC *dc, INT32 x, INT32 y, UINT32 flags, TSXSetForeground( display, dc->u.x.gc, dc->w.textPixel ); if (!dc->w.charExtra && !dc->w.breakExtra && !lpDx) { + if (!pfo->lf.lfOrientation) /* angled baseline? */ + { TSXDrawString( display, dc->u.x.drawable, dc->u.x.gc, dc->w.DCOrgX + x, dc->w.DCOrgY + y, str, count ); + } + else + { + /* have to render character by character. */ + double offset = 0.0; + int i; + /* tenths of degrees to radians */ + double theta = M_PI*pfo->lf.lfOrientation/1800.; + /* components of pointsize matrix */ + double xc = pfo->fi->lfd_decipoints*cos(theta)/10.; + double yc = pfo->fi->lfd_decipoints*sin(theta)/10.; + + for(i=0; imin_char_or_byte2; + int x_i = IROUND((double) (dc->w.DCOrgX + x) + offset*xc/1000. ); + int y_i = IROUND((double) (dc->w.DCOrgY + y) - offset*yc/1000. ); + + TSXDrawString( display, dc->u.x.drawable, dc->u.x.gc, + x_i, y_i, &str[i], 1); + offset += (double) (font->per_char ? + font->per_char[char_metric_offset].attributes: + font->min_bounds.attributes); + } + } } else /* Now the fun begins... */ { diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c index 58093b0e8b1..505f4446a51 100644 --- a/graphics/x11drv/xfont.c +++ b/graphics/x11drv/xfont.c @@ -18,6 +18,7 @@ #include #include "ts_xlib.h" #include +#include #include "heap.h" #include "options.h" #include "x11font.h" @@ -383,6 +384,7 @@ static int LFD_InitFontInfo( fontInfo* fi, LPSTR lpstr ) return TRUE; } + /************************************************************************* * LFD_ComposeLFD */ @@ -392,6 +394,7 @@ static BOOL32 LFD_ComposeLFD( fontObject* fo, int h, w, ch, enc_ch, point = 0; char* lpch; const char* lpEncoding = NULL; + char h_string[64], point_string[64]; lstrcpy32A( lpLFD, fo->fr->resource ); @@ -448,6 +451,23 @@ static BOOL32 LFD_ComposeLFD( fontObject* fo, if( fo->fi->fi_flags & FI_SCALABLE ) /* adjust h/w ratio */ point = h * 72 * 10 / fo->fi->lfd_resolution; + /* handle rotated fonts */ + if (fo->lf.lfEscapement) { + /* escapement is in tenths of degrees, theta is in radians */ + double theta = M_PI*fo->lf.lfEscapement/1800.; + double h_matrix[4] = {h*cos(theta), h*sin(theta), -h*sin(theta), h*cos(theta)}; + double point_matrix[4] = {point*cos(theta), point*sin(theta), -point*sin(theta), point*cos(theta)}; + char *s; + sprintf(h_string, "[%+f%+f%+f%+f]", h_matrix[0], h_matrix[1], h_matrix[2], h_matrix[3]); + sprintf(point_string, "[%+f%+f%+f%+f]", point_matrix[0], point_matrix[1], point_matrix[2], point_matrix[3]); + while (s = strchr(h_string, '-')) *s='~'; + while (s = strchr(point_string, '-')) *s='~'; + } else { + sprintf(h_string, "%d", h); + sprintf(point_string, "%d", point); + } + + /* spacing and width */ if( fo->fi->fi_flags & FI_FIXEDPITCH ) @@ -496,20 +516,21 @@ static BOOL32 LFD_ComposeLFD( fontObject* fo, case 0: if( point ) { - sprintf( lpch, "%i-%i-%i-%c-%c-*-%s%c", h, point, + sprintf( lpch, "%s-%s-%i-%c-%c-*-%s%c", h_string, + point_string, fo->fi->lfd_resolution, ch, w, lpEncoding, enc_ch ); break; } /* fall through */ case 1: - sprintf( lpch, "%i-*-%i-%c-%c-*-%s%c", h, + sprintf( lpch, "%s-*-%i-%c-%c-*-%s%c", h_string, fo->fi->lfd_resolution, ch, w, lpEncoding, enc_ch ); break; case 2: - sprintf( lpch, "%i-*-%i-%c-*-*-%s%c", - h, fo->fi->lfd_resolution, ch, lpEncoding, enc_ch ); + sprintf( lpch, "%s-*-%i-%c-*-*-%s%c", + h_string, fo->fi->lfd_resolution, ch, lpEncoding, enc_ch ); break; case 3: diff --git a/if1632/builtin.c b/if1632/builtin.c index a0f2d2f4095..c06d91c835b 100644 --- a/if1632/builtin.c +++ b/if1632/builtin.c @@ -170,7 +170,7 @@ static HMODULE16 BUILTIN_DoLoadModule16( const WIN16_DESCRIPTOR *descr ) if (pModule->heap_size) LocalInit( pSegTable->selector, pSegTable->minsize, minsize ); - MODULE_RegisterModule( pModule ); + NE_RegisterModule( pModule ); return hModule; } @@ -197,27 +197,42 @@ BOOL32 BUILTIN_Init(void) /* Set the USER and GDI heap selectors */ - pModule = MODULE_GetPtr( GetModuleHandle16( "USER" )); + pModule = MODULE_GetPtr16( GetModuleHandle16( "USER" )); USER_HeapSel = (NE_SEG_TABLE( pModule ) + pModule->dgroup - 1)->selector; - pModule = MODULE_GetPtr( GetModuleHandle16( "GDI" )); + pModule = MODULE_GetPtr16( GetModuleHandle16( "GDI" )); GDI_HeapSel = (NE_SEG_TABLE( pModule ) + pModule->dgroup - 1)->selector; /* Initialize KERNEL.178 (__WINFLAGS) with the correct flags value */ hModule = GetModuleHandle16( "KERNEL" ); - MODULE_SetEntryPoint( hModule, 178, GetWinFlags() ); + NE_SetEntryPoint( hModule, 178, GetWinFlags() ); /* Initialize the real-mode selector entry points */ - DOSMEM_InitExports( hModule ); +#define SET_ENTRY_POINT( num, addr ) \ + NE_SetEntryPoint( hModule, (num), GLOBAL_CreateBlock( GMEM_FIXED, \ + DOSMEM_MapDosToLinear(addr), 0x10000, hModule, \ + FALSE, FALSE, FALSE, NULL )) + + SET_ENTRY_POINT( 183, 0x00000 ); /* KERNEL.183: __0000H */ + SET_ENTRY_POINT( 174, 0xa0000 ); /* KERNEL.174: __A000H */ + SET_ENTRY_POINT( 181, 0xb0000 ); /* KERNEL.181: __B000H */ + SET_ENTRY_POINT( 182, 0xb8000 ); /* KERNEL.182: __B800H */ + SET_ENTRY_POINT( 195, 0xc0000 ); /* KERNEL.195: __C000H */ + SET_ENTRY_POINT( 179, 0xd0000 ); /* KERNEL.179: __D000H */ + SET_ENTRY_POINT( 190, 0xe0000 ); /* KERNEL.190: __E000H */ + SET_ENTRY_POINT( 173, 0xf0000 ); /* KERNEL.173: __ROMBIOS */ + SET_ENTRY_POINT( 194, 0xf0000 ); /* KERNEL.194: __F000H */ + NE_SetEntryPoint( hModule, 193, DOSMEM_BiosSeg ); /* KERNEL.193: __0040H */ +#undef SET_ENTRY_POINT /* Set interrupt vectors from entry points in WPROCS.DLL */ hModule = GetModuleHandle16( "WPROCS" ); for (vector = 0; vector < 256; vector++) { - FARPROC16 proc = MODULE_GetEntryPoint( hModule, - FIRST_INTERRUPT_ORDINAL+vector); + FARPROC16 proc = NE_GetEntryPoint( hModule, + FIRST_INTERRUPT_ORDINAL + vector ); assert(proc); INT_SetHandler( vector, proc ); } @@ -266,7 +281,7 @@ LPCSTR BUILTIN_GetEntryPoint16( WORD cs, WORD ip, WORD *pOrd ) register BYTE *p; NE_MODULE *pModule; - if (!(pModule = MODULE_GetPtr( FarGetOwner( GlobalHandle16(cs) )))) + if (!(pModule = MODULE_GetPtr16( FarGetOwner( GlobalHandle16(cs) )))) return NULL; /* Search for the ordinal */ @@ -299,7 +314,7 @@ LPCSTR BUILTIN_GetEntryPoint16( WORD cs, WORD ip, WORD *pOrd ) } break; case 0xff: /* moveable (should not happen in built-in modules) */ - fprintf( stderr, "Built-in module has moveable entry\n" ); + TRACE( relay, "Built-in module has moveable entry\n" ); ordinal += *p; p += 2 + *p * 6; break; @@ -396,14 +411,14 @@ void BUILTIN_PrintDLLs(void) int i; BUILTIN16_DLL *dll; - fprintf(stderr,"Example: -dll -ole2 Do not use emulated OLE2.DLL\n"); - fprintf(stderr,"Available Win16 DLLs:\n"); + MSG("Example: -dll -ole2 Do not use emulated OLE2.DLL\n"); + MSG("Available Win16 DLLs:\n"); for (i = 0, dll = BuiltinDLLs; dll->descr; dll++) { if (!(dll->flags & DLL_FLAG_ALWAYS_USED)) - fprintf( stderr, "%-9s%c", dll->descr->name, + MSG("%-9s%c", dll->descr->name, ((++i) % 8) ? ' ' : '\n' ); } - fprintf(stderr,"\n"); + MSG("\n"); BUILTIN32_PrintDLLs(); } diff --git a/if1632/commdlg.spec b/if1632/commdlg.spec index aec5ffdf098..01c97ae3cff 100644 --- a/if1632/commdlg.spec +++ b/if1632/commdlg.spec @@ -12,10 +12,10 @@ type win16 12 pascal16 ReplaceText(segptr) ReplaceText16 13 pascal FindTextDlgProc(word word word long) FindTextDlgProc16 14 pascal ReplaceTextDlgProc(word word word long) ReplaceTextDlgProc16 -15 pascal16 ChooseFont(ptr) ChooseFont -16 pascal16 FormatCharDlgProc(word word word long) FormatCharDlgProc -18 pascal16 FontStyleEnumProc(ptr ptr word long) FontStyleEnumProc -19 pascal16 FontFamilyEnumProc(ptr ptr word long) FontFamilyEnumProc +15 pascal16 ChooseFont(ptr) ChooseFont16 +16 pascal16 FormatCharDlgProc(word word word long) FormatCharDlgProc16 +18 pascal16 FontStyleEnumProc(ptr ptr word long) FontStyleEnumProc16 +19 pascal16 FontFamilyEnumProc(ptr ptr word long) FontFamilyEnumProc16 20 pascal16 PrintDlg(segptr) PrintDlg16 21 pascal PrintDlgProc(word word word long) PrintDlgProc 22 pascal PrintSetupDlgProc(word word word long) PrintSetupDlgProc diff --git a/if1632/ddeml.spec b/if1632/ddeml.spec index 991d20c5d5c..30498d17b15 100644 --- a/if1632/ddeml.spec +++ b/if1632/ddeml.spec @@ -3,9 +3,9 @@ type win16 2 pascal16 DdeInitialize(ptr segptr long long) DdeInitialize16 3 pascal16 DdeUninitialize(long) DdeUninitialize16 -4 pascal DdeConnectList(long word word word ptr) DdeConnectList +4 pascal DdeConnectList(long word word word ptr) DdeConnectList16 5 pascal DdeQueryNextServer(word word) DdeQueryNextServer -6 pascal DdeDisconnectList(word) DdeDisconnectList +6 pascal DdeDisconnectList(word) DdeDisconnectList16 7 pascal DdeConnect(long long long ptr) DdeConnect16 8 pascal16 DdeDisconnect(long) DdeDisconnect16 9 stub DdeQueryConvInfo #(word long ptr) DdeQueryConvInfo @@ -13,10 +13,10 @@ type win16 11 pascal DdeClientTransaction(ptr long long long s_word s_word long ptr) DdeClientTransaction16 12 pascal DdeAbandonTransaction(long word long) DdeAbandonTransaction -13 pascal DdePostAdvise(long word word) DdePostAdvise +13 pascal DdePostAdvise(long word word) DdePostAdvise16 14 pascal DdeCreateDataHandle(long ptr long long word word word) DdeCreateDataHandle 15 pascal DdeAddData(word ptr long long) DdeAddData -16 pascal DdeGetData(word ptr long long) DdeGetData +16 pascal DdeGetData(word ptr long long) DdeGetData16 17 pascal DdeAccessData(word ptr) DdeAccessData 18 pascal DdeUnaccessData(word) DdeUnaccessData 19 pascal16 DdeFreeDataHandle(long) DdeFreeDataHandle16 diff --git a/if1632/dummy.c b/if1632/dummy.c index 7babcac5bef..4c67b5d6d77 100644 --- a/if1632/dummy.c +++ b/if1632/dummy.c @@ -1,51 +1,57 @@ +/* + * Dummy function definitions + */ + #include #include "wintypes.h" -long WINAPI stub_GDI_379(void) { fprintf(stderr, "Warning: GDI_379:STARTPAGE unimplemented stub\n"); return 1; } -long WINAPI stub_GDI_380(void) { fprintf(stderr, "Warning: GDI_380:ENDPAGE unimplemented stub\n"); return 1; } -long WINAPI stub_GDI_381(HDC16 hdc, SEGPTR proc) { fprintf(stderr, "Warning: GDI_381:SETABORTPROC unimplemented stub\n"); return 1; } -long WINAPI stub_GDI_382(void) { fprintf(stderr, "Warning: GDI_382:ABORTPROC unimplemented stub\n"); return 1; } -long WINAPI stub_GDI_530(void) { fprintf(stderr, "Warning: GDI_530: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_531(void) { fprintf(stderr, "Warning: GDI_531: unimplemented stub\n"); return 0; } +#include "debug.h" + +long WINAPI stub_GDI_379(void) { FIXME(relay, "STARTPAGE: stub\n"); return 1; } +long WINAPI stub_GDI_380(void) { FIXME(relay, "ENDPAGE: stub\n"); return 1; } +long WINAPI stub_GDI_381(HDC16 hdc, SEGPTR proc) { FIXME(relay, "SETABORTPROC: stub\n"); return 1; } +long WINAPI stub_GDI_382(void) { FIXME(relay, "ABORTPROC: stub\n"); return 1; } +long WINAPI stub_GDI_530(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_531(void) { FIXME(relay, "stub\n"); return 0; } long WINAPI stub_GDI_532(LPINT16 buffer, INT16 xx) { - fprintf(stderr, "STUB GDI_532(%p, %hd)\n",buffer,xx); + FIXME(relay, "(%p, %hd): stub\n",buffer,xx); return 0; } -long WINAPI stub_GDI_536(void) { fprintf(stderr, "Warning: GDI_536: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_538(void) { fprintf(stderr, "Warning: GDI_538: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_540(void) { fprintf(stderr, "Warning: GDI_540: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_543(void) { fprintf(stderr, "Warning: GDI_543: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_555(void) { fprintf(stderr, "Warning: GDI_555: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_560(void) { fprintf(stderr, "Warning: GDI_560: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_561(void) { fprintf(stderr, "Warning: GDI_561: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_564(void) { fprintf(stderr, "Warning: GDI_564: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_565(void) { fprintf(stderr, "Warning: GDI_565: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_566(void) { fprintf(stderr, "Warning: GDI_566: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_571(void) { fprintf(stderr, "Warning: GDI_571: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_572(void) { fprintf(stderr, "Warning: GDI_572: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_573(void) { fprintf(stderr, "Warning: GDI_573: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_556(void) { fprintf(stderr, "Warning: GDI_556: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_558(void) { fprintf(stderr, "Warning: GDI_558: unimplemented stub\n"); return 0; } -long WINAPI stub_GDI_569(void) { fprintf(stderr, "Warning: GDI_569: unimplemented stub\n"); return 0; } -long WINAPI stub_KERNEL_450(void) { fprintf(stderr, "Warning: KERNEL_450: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_489(void) { fprintf(stderr, "Warning: USER_489: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_490(void) { fprintf(stderr, "Warning: USER_490: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_492(void) { fprintf(stderr, "Warning: USER_492: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_496(void) { fprintf(stderr, "Warning: USER_496: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_902(void) { fprintf(stderr, "Warning: USER_902: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_905(void) { fprintf(stderr, "Warning: USER_905: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_906(void) { fprintf(stderr, "Warning: USER_906: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_907(void) { fprintf(stderr, "Warning: USER_907: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_909(void) { fprintf(stderr, "Warning: USER_909: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_910(void) { fprintf(stderr, "Warning: USER_910: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_911(void) { fprintf(stderr, "Warning: USER_911: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_912(void) { fprintf(stderr, "Warning: USER_912: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_913(void) { fprintf(stderr, "Warning: USER_913: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_914(void) { fprintf(stderr, "Warning: USER_914: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_915(void) { fprintf(stderr, "Warning: USER_915: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_916(void) { fprintf(stderr, "Warning: USER_916: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_918(void) { fprintf(stderr, "Warning: USER_918: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_919(void) { fprintf(stderr, "Warning: USER_919: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_920(void) { fprintf(stderr, "Warning: USER_920: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_922(void) { fprintf(stderr, "Warning: USER_922: unimplemented stub\n"); return 0; } -long WINAPI stub_USER_923(void) { fprintf(stderr, "Warning: USER_923: unimplemented stub\n"); return 0; } -long WINAPI stub_KERNEL_700(void) { fprintf(stderr, "Warning: KERNEL_700: unimplemented stub\n"); return 1; } +long WINAPI stub_GDI_536(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_538(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_540(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_543(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_555(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_560(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_561(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_564(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_565(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_566(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_571(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_572(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_573(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_556(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_558(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_GDI_569(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_KERNEL_450(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_489(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_490(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_492(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_496(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_902(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_905(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_906(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_907(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_909(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_910(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_911(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_912(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_913(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_914(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_915(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_916(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_918(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_919(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_920(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_922(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_USER_923(void) { FIXME(relay, "stub\n"); return 0; } +long WINAPI stub_KERNEL_700(void) { FIXME(relay, "stub\n"); return 1; } diff --git a/if1632/gdi.spec b/if1632/gdi.spec index 02bbbeffbb6..34cef320fc1 100644 --- a/if1632/gdi.spec +++ b/if1632/gdi.spec @@ -326,7 +326,7 @@ file gdi.exe 498 stub GetEnhMetafileDescription 499 stub GetEnhMetafileHeader 501 stub GetEnhMetafilePaletteEntries -502 stub PolyBezier +502 pascal16 PolyBezier(word ptr word) PolyBezier16 503 stub PolyBezierTo 504 stub PlayEnhMetafileRecord 505 stub SetEnhMetafileBits diff --git a/if1632/kernel.spec b/if1632/kernel.spec index 3e4ab9d078f..8a82169fe86 100644 --- a/if1632/kernel.spec +++ b/if1632/kernel.spec @@ -63,7 +63,7 @@ file krnl386.exe 63 pascal16 FreeResource(word) FreeResource16 64 pascal16 AccessResource(word word) AccessResource16 65 pascal SizeofResource(word word) SizeofResource16 -66 pascal16 AllocResource(word word long) AllocResource16 +66 pascal16 AllocResource(word word long) AllocResource 67 pascal SetResourceHandler(word segstr segptr) THUNK_SetResourceHandler 68 pascal16 InitAtomTable(word) InitAtomTable16 69 pascal16 FindAtom(segstr) FindAtom16 diff --git a/if1632/ole2disp.spec b/if1632/ole2disp.spec index 3c36c9ed6ca..dce0c29d6d8 100644 --- a/if1632/ole2disp.spec +++ b/if1632/ole2disp.spec @@ -2,12 +2,12 @@ name ole2disp type win16 1 stub DLLGETCLASSOBJECT -2 pascal SysAllocString(str) SysAllocString -3 pascal SysReallocString(ptr str) SysReAllocString -4 pascal SysAllocStringLen(str word) SysAllocStringLen -5 pascal SysReAllocStringLen(ptr str word) SysReAllocStringLen -6 pascal SysFreeString(segstr) SysFreeString -7 pascal SysStringLen(segstr) SysStringLen +2 pascal SysAllocString(str) SysAllocString16 +3 pascal SysReallocString(ptr str) SysReAllocString16 +4 pascal SysAllocStringLen(str word) SysAllocStringLen16 +5 pascal SysReAllocStringLen(ptr str word) SysReAllocStringLen16 +6 pascal SysFreeString(segstr) SysFreeString16 +7 pascal SysStringLen(segstr) SysStringLen16 8 stub VARIANTINIT 9 stub VARIANTCLEAR 10 stub VARIANTCOPY diff --git a/if1632/relay.c b/if1632/relay.c index 6a40aef6a6b..1999d767834 100644 --- a/if1632/relay.c +++ b/if1632/relay.c @@ -16,11 +16,6 @@ #include "debugstr.h" #include "debug.h" -#if 0 -/* Make make_debug think these were really used */ -TRACE(relay, "test - dummy"); -#endif - /*********************************************************************** * RELAY_Init @@ -228,7 +223,7 @@ void RELAY_Unimplemented16(void) { WORD ordinal; STACK16FRAME *frame = CURRENT_STACK16; - fprintf(stderr,"No handler for Win16 routine %s (called from %04x:%04x)\n", + MSG("No handler for Win16 routine %s (called from %04x:%04x)\n", BUILTIN_GetEntryPoint16(frame->entry_cs,frame->entry_ip,&ordinal), frame->cs, frame->ip ); TASK_KillCurrentTask(1); @@ -366,22 +361,21 @@ void WINAPI Throw( CONTEXT *context ) IP_reg(context) = lpbuf[0]; CS_reg(context) = lpbuf[1]; - SP_reg(context) = lpbuf[2] + 4 * sizeof(WORD) + sizeof(WORD) /*extra arg*/; + SP_reg(context) = lpbuf[2] + 4 * sizeof(WORD) - sizeof(WORD) /*extra arg*/; BP_reg(context) = lpbuf[3]; SI_reg(context) = lpbuf[4]; DI_reg(context) = lpbuf[5]; DS_reg(context) = lpbuf[6]; if (lpbuf[8] != SS_reg(context)) - fprintf( stderr, "Switching stack segment with Throw() not supported; expect crash now\n" ); + ERR(relay, "Switching stack segment with Throw() not supported; expect crash now\n" ); if (TRACE_ON(relay)) /* Make sure we have a valid entry point address */ { static FARPROC16 entryPoint = NULL; if (!entryPoint) /* Get entry point for Throw() */ - entryPoint = MODULE_GetEntryPoint( GetModuleHandle16("KERNEL"), - 56 ); + entryPoint = NE_GetEntryPoint( GetModuleHandle16("KERNEL"), 56 ); pFrame->entry_cs = SELECTOROF(entryPoint); pFrame->entry_ip = OFFSETOF(entryPoint); } @@ -452,7 +446,7 @@ static DWORD RELAY_CallProc32W(int Ex) break; default: /* FIXME: should go up to 32 arguments */ - fprintf(stderr,"CallProc32W: unsupported number of arguments %ld, please report.\n",nrofargs); + ERR(relay,"Unsupported number of arguments %ld, please report.\n",nrofargs); ret = 0; break; } diff --git a/if1632/signal.c b/if1632/signal.c index 431565ac499..e07d41a8104 100644 --- a/if1632/signal.c +++ b/if1632/signal.c @@ -22,6 +22,7 @@ #include "sig_context.h" #include "miscemu.h" #include "thread.h" +#include "debug.h" extern void SIGNAL_SetHandler( int sig, void (*func)(), int flags ); @@ -61,20 +62,21 @@ static HANDLER_DEF(SIGNAL_trap) */ static HANDLER_DEF(SIGNAL_fault) { - WORD cs; - GET_CS(cs); HANDLER_INIT(); - if (CS_sig(HANDLER_CONTEXT) == cs) + if (INSTR_EmulateInstruction( HANDLER_CONTEXT )) return; + if (IS_SELECTOR_SYSTEM(CS_sig(HANDLER_CONTEXT))) { - fprintf( stderr, "Segmentation fault in 32-bit code (0x%08lx).\n", - EIP_sig(HANDLER_CONTEXT) ); + MSG("Segmentation fault in 32-bit code (0x%08lx).\n", + EIP_sig(HANDLER_CONTEXT) ); } else { - if (INSTR_EmulateInstruction( HANDLER_CONTEXT )) return; - fprintf( stderr, "Segmentation fault in 16-bit code (%04x:%04lx).\n", - (WORD)CS_sig(HANDLER_CONTEXT), EIP_sig(HANDLER_CONTEXT) ); + MSG("Segmentation fault in 16-bit code (%04x:%04lx).\n", + (WORD)CS_sig(HANDLER_CONTEXT), EIP_sig(HANDLER_CONTEXT) ); } +#ifdef CR2_sig + fprintf(stderr,"Fault address is 0x%08lx\n",CR2_sig(HANDLER_CONTEXT)); +#endif wine_debug( signal, HANDLER_CONTEXT ); } @@ -158,17 +160,17 @@ static void SIGNAL_GetSigContext( SIGCONTEXT *sigcontext, */ void SIGNAL_InfoRegisters( CONTEXT *context ) { - fprintf( stderr," CS:%04x SS:%04x DS:%04x ES:%04x FS:%04x GS:%04x", + MSG(" CS:%04x SS:%04x DS:%04x ES:%04x FS:%04x GS:%04x", (WORD)CS_reg(context), (WORD)SS_reg(context), (WORD)DS_reg(context), (WORD)ES_reg(context), (WORD)FS_reg(context), (WORD)GS_reg(context) ); - fprintf( stderr, "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx\n", + MSG( "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx\n", EIP_reg(context), ESP_reg(context), EBP_reg(context), EFL_reg(context) ); - fprintf( stderr, " EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n", + MSG( " EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n", EAX_reg(context), EBX_reg(context), ECX_reg(context), EDX_reg(context) ); - fprintf( stderr, " ESI:%08lx EDI:%08lx\n", + MSG( " ESI:%08lx EDI:%08lx\n", ESI_reg(context), EDI_reg(context) ); } diff --git a/if1632/thunk.c b/if1632/thunk.c index 68a511bb42c..c4740d4adb5 100644 --- a/if1632/thunk.c +++ b/if1632/thunk.c @@ -492,7 +492,7 @@ BOOL16 WINAPI THUNK_SetDCHook( HDC16 hdc, FARPROC16 proc, DWORD dwHookData ) THUNK *thunk, *oldThunk; if (!defDCHookProc) /* Get DCHook Win16 entry point */ - defDCHookProc = MODULE_GetEntryPoint( GetModuleHandle16("USER"), 362 ); + defDCHookProc = NE_GetEntryPoint( GetModuleHandle16("USER"), 362 ); if (proc != defDCHookProc) { @@ -521,8 +521,7 @@ DWORD WINAPI THUNK_GetDCHook( HDC16 hdc, FARPROC16 *phookProc ) if (thunk == (THUNK *)DCHook) { if (!defDCHookProc) /* Get DCHook Win16 entry point */ - defDCHookProc = MODULE_GetEntryPoint(GetModuleHandle16("USER"), - 362 ); + defDCHookProc = NE_GetEntryPoint(GetModuleHandle16("USER"),362); *phookProc = defDCHookProc; } else *phookProc = thunk->proc; @@ -541,7 +540,7 @@ FARPROC16 WINAPI THUNK_SetTaskSignalProc( HTASK16 hTask, FARPROC16 proc ) THUNK *thunk = NULL; if( !defSignalProc16 ) - defSignalProc16 = MODULE_GetEntryPoint(GetModuleHandle16("USER"), 314 ); + defSignalProc16 = NE_GetEntryPoint(GetModuleHandle16("USER"), 314 ); if( proc == defSignalProc16 ) thunk = (THUNK*)SetTaskSignalProc( hTask, (FARPROC16)&USER_SignalProc ); @@ -569,9 +568,6 @@ FARPROC16 WINAPI THUNK_SetTaskSignalProc( HTASK16 hTask, FARPROC16 proc ) */ FARPROC16 WINAPI THUNK_SetResourceHandler( HMODULE16 hModule, SEGPTR typeId, FARPROC16 proc ) { - /* loader/ne_resource.c */ - extern HGLOBAL16 WINAPI NE_DefResourceHandler(HGLOBAL16,HMODULE16,HRSRC16); - static FARPROC16 defDIBIconLoader16 = NULL; static FARPROC16 defDIBCursorLoader16 = NULL; static FARPROC16 defResourceLoader16 = NULL; @@ -581,8 +577,8 @@ FARPROC16 WINAPI THUNK_SetResourceHandler( HMODULE16 hModule, SEGPTR typeId, FAR if( !defResourceLoader16 ) { HMODULE16 hUser = GetModuleHandle16("USER"); - defDIBIconLoader16 = MODULE_GetEntryPoint( hUser, 357 ); - defDIBCursorLoader16 = MODULE_GetEntryPoint( hUser, 356 ); + defDIBIconLoader16 = NE_GetEntryPoint( hUser, 357 ); + defDIBCursorLoader16 = NE_GetEntryPoint( hUser, 356 ); defResourceLoader16 = MODULE_GetWndProcEntry16( "DefResourceHandler" ); } @@ -703,7 +699,7 @@ static BOOL32 WINAPI THUNK_WOWCallback16Ex( ); break; default: - fprintf(stderr,"CALLBACK_CallWOWCallback16Ex(), %ld arguments not supported.!n",cbArgs); + ERR(thunk,"%ld arguments not supported.\n",cbArgs); if (dwFlags == WCB16_CDECL) HeapFree(GetProcessHeap(),0,args); return FALSE; diff --git a/if1632/typelib.spec b/if1632/typelib.spec index 7d2bccf57f0..5b8b311c981 100644 --- a/if1632/typelib.spec +++ b/if1632/typelib.spec @@ -2,7 +2,7 @@ name typelib type win16 2 stub CREATETYPELIB -3 stub LOADTYPELIB +3 pascal LoadTypeLib(ptr ptr) LoadTypeLib 4 stub LHASHVALOFNAMESYS 5 stub _IID_ICREATETYPEINFO 6 stub _IID_ICREATETYPELIB @@ -11,5 +11,5 @@ type win16 9 stub _IID_ITYPELIB 10 stub REGISTERTYPELIB 11 stub LOADREGTYPELIB -14 pascal QueryPathOfRegTypeLib(ptr word word word ptr) QueryPathOfRegTypeLib +14 pascal QueryPathOfRegTypeLib(ptr word word word ptr) QueryPathOfRegTypeLib16 15 pascal OABuildVersion() OABuildVersion diff --git a/if1632/user.spec b/if1632/user.spec index 84b32e5018d..5eea87b2394 100644 --- a/if1632/user.spec +++ b/if1632/user.spec @@ -462,7 +462,7 @@ file user.exe 514 pascal16 WNetDeviceMode(word) WNetDeviceMode 515 pascal16 WNetBrowseDialog(word word ptr) WNetBrowseDialog 516 pascal16 WNetGetUser(ptr ptr ptr) WNetGetUser -517 pascal16 WNetAddConnection(ptr ptr ptr) WNetAddConnection +517 pascal16 WNetAddConnection(ptr ptr ptr) WNetAddConnection16 518 pascal16 WNetCancelConnection(ptr word) WNetCancelConnection 519 pascal16 WNetGetError(ptr) WNetGetError 520 pascal16 WNetGetErrorText(word ptr ptr) WNetGetErrorText @@ -475,7 +475,7 @@ file user.exe 527 pascal16 WNetConnectionDialog(word word) WNetConnectionDialog 528 pascal16 WNetViewQueueDialog(word ptr) WNetViewQueueDialog 529 pascal16 WNetPropertyDialog(word word ptr word) WNetPropertyDialog -530 pascal16 WNetGetDirectoryType(ptr ptr) WNetGetDirectoryType +530 pascal16 WNetGetDirectoryType(ptr ptr) WNetGetDirectoryType16 531 pascal16 WNetDirectoryNotify(word ptr word) WNetDirectoryNotify 532 pascal16 WNetGetPropertyText(word word word ptr word) WNetGetPropertyText 533 stub WNetInitialize diff --git a/if1632/wprocs.spec b/if1632/wprocs.spec index 40fa9b50eaa..db7aa66b462 100644 --- a/if1632/wprocs.spec +++ b/if1632/wprocs.spec @@ -9,10 +9,10 @@ type win16 19 pascal PrintSetupDlgProc(word word word long) PrintSetupDlgProc 20 pascal PrintDlgProc(word word word long) PrintDlgProc 24 pascal16 TASK_Reschedule() TASK_Reschedule -27 pascal EntryAddrProc(word word) EntryAddrProc -28 pascal MyAlloc(word word word) MODULE_AllocateSegment +27 pascal EntryAddrProc(word word) NE_GetEntryPoint +28 pascal MyAlloc(word word word) NE_AllocateSegment 29 pascal DefResourceHandler(word word word) NE_DefResourceHandler -30 pascal FormatCharDlgProc(word word word long) FormatCharDlgProc +30 pascal FormatCharDlgProc(word word word long) FormatCharDlgProc16 # Interrupt vectors 0-255 are ordinals 100-355 # The 'word' parameter are the flags pushed on the stack by the interrupt diff --git a/include/commdlg.h b/include/commdlg.h index 126b9403374..7edc7bade2b 100644 --- a/include/commdlg.h +++ b/include/commdlg.h @@ -228,7 +228,7 @@ typedef struct short nSizeMin WINE_PACKED; /* minimum pt size allowed & */ short nSizeMax WINE_PACKED; /* max pt size allowed if */ /* CF_LIMITSIZE is used */ -} CHOOSEFONT, *LPCHOOSEFONT; +} CHOOSEFONT16, *LPCHOOSEFONT16; typedef struct { @@ -248,7 +248,30 @@ typedef struct UINT16 ___MISSING_ALIGNMENT__; INT32 nSizeMin; INT32 nSizeMax; -} CHOOSEFONT32A, *PCHOOSEFONT32A; +} CHOOSEFONT32A, *LPCHOOSEFONT32A; + +typedef struct +{ + UINT32 lStructSize; + HWND32 hwndOwner; + HDC32 hDC; + LPLOGFONT32W lpLogFont; + INT32 iPointSize; + UINT32 Flags; + COLORREF rgbColors; + LPARAM lCustData; + WNDPROC32 lpfnHook; + LPCWSTR lpTemplateName; + HINSTANCE32 hInstance; + LPWSTR lpszStyle; + UINT16 nFontType; + UINT16 ___MISSING_ALIGNMENT__; + INT32 nSizeMin; + INT32 nSizeMax; +} CHOOSEFONT32W, *LPCHOOSEFONT32W; + +DECL_WINELIB_TYPE_AW(CHOOSEFONT); +DECL_WINELIB_TYPE_AW(LPCHOOSEFONT); #pragma pack(4) @@ -264,6 +287,7 @@ typedef struct #define CF_EFFECTS 0x00000100L #define CF_APPLY 0x00000200L #define CF_ANSIONLY 0x00000400L +#define CF_SCRIPTSONLY CF_ANSIONLY #define CF_NOVECTORFONTS 0x00000800L #define CF_NOOEMFONTS CF_NOVECTORFONTS #define CF_NOSIMULATIONS 0x00001000L @@ -276,6 +300,9 @@ typedef struct #define CF_NOFACESEL 0x00080000L #define CF_NOSTYLESEL 0x00100000L #define CF_NOSIZESEL 0x00200000L +#define CF_SELECTSCRIPT 0x00400000L +#define CF_NOSCRIPTSEL 0x00800000L +#define CF_NOVERTFONTS 0x01000000L #define SIMULATED_FONTTYPE 0x8000 #define PRINTER_FONTTYPE 0x4000 @@ -285,6 +312,8 @@ typedef struct #define REGULAR_FONTTYPE 0x0400 #define WM_CHOOSEFONT_GETLOGFONT (WM_USER + 1) +#define WM_CHOOSEFONT_SETLOGFONT (WM_USER + 101) +#define WM_CHOOSEFONT_SETFLAGS (WM_USER + 102) #define LBSELCHSTRING "commdlg_LBSelChangedNotify" #define SHAREVISTRING "commdlg_ShareViolation" @@ -446,7 +475,10 @@ HWND16 WINAPI ReplaceText16( SEGPTR find); HWND32 WINAPI ReplaceText32A( LPFINDREPLACE32A lpFind); HWND32 WINAPI ReplaceText32W( LPFINDREPLACE32W lpFind); #define ReplaceText WINELIB_NAME_AW(ReplaceText) -BOOL16 WINAPI ChooseFont(LPCHOOSEFONT lpChFont); +BOOL16 WINAPI ChooseFont16(LPCHOOSEFONT16); +BOOL32 WINAPI ChooseFont32A(LPCHOOSEFONT32A); +BOOL32 WINAPI ChooseFont32W(LPCHOOSEFONT32W); +#define ChooseFont WINELIB_NAME_AW(ChooseFont) LRESULT WINAPI FileOpenDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam); LRESULT WINAPI FileSaveDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam); LRESULT WINAPI ColorDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam); @@ -460,8 +492,10 @@ LRESULT WINAPI ReplaceTextDlgProc32W(HWND32 hWnd, UINT32 wMsg, WPARAM32 wParam, #define ReplaceTextProc WINELIB_NAME_AW(ReplaceTextDlgProc) LRESULT WINAPI PrintDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam); LRESULT WINAPI PrintSetupDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam); -LRESULT WINAPI FormatCharDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam); - +LRESULT WINAPI FormatCharDlgProc16(HWND16,UINT16,WPARAM16,LPARAM); +LRESULT WINAPI FormatCharDlgProc32A(HWND32,UINT32,WPARAM32,LPARAM); +LRESULT WINAPI FormatCharDlgProc32W(HWND32,UINT32,WPARAM32,LPARAM); +#define FormatCharDlgProc LIBWINE_NAME_AW(FormatCharDlgProc) #ifdef __cplusplus } #endif diff --git a/include/ddeml.h b/include/ddeml.h index 845a58b7d20..09c2e201daa 100644 --- a/include/ddeml.h +++ b/include/ddeml.h @@ -51,9 +51,13 @@ UINT32 WINAPI DdeInitialize32W(LPDWORD,PFNCALLBACK32,DWORD,DWORD); BOOL16 WINAPI DdeUninitialize16(DWORD); BOOL32 WINAPI DdeUninitialize32(DWORD); #define DdeUninitialize WINELIB_NAME(DdeUninitialize) -HCONVLIST WINAPI DdeConnectList(DWORD,HSZ,HSZ,HCONVLIST,LPCONVCONTEXT16); +HCONVLIST WINAPI DdeConnectList16(DWORD,HSZ,HSZ,HCONVLIST,LPCONVCONTEXT16); +HCONVLIST WINAPI DdeConnectList32(DWORD,HSZ,HSZ,HCONVLIST,LPCONVCONTEXT32); +#define DdeConnectList WINELIB_NAME(DdeConnectList) HCONV WINAPI DdeQueryNextServer(HCONVLIST, HCONV); -BOOL16 WINAPI DdeDisconnectList(HCONVLIST); +BOOL16 WINAPI DdeDisconnectList16(HCONVLIST); +BOOL32 WINAPI DdeDisconnectList32(HCONVLIST); +#define DdeDisConnectList WINELIB_NAME(DdeDisconnectList) HCONV WINAPI DdeConnect16(DWORD,HSZ,HSZ,LPCONVCONTEXT16); HCONV WINAPI DdeConnect32(DWORD,HSZ,HSZ,LPCONVCONTEXT32); #define DdeConnect WINELIB_NAME(DdeConnect) @@ -82,7 +86,9 @@ HDDEDATA WINAPI DdeClientTransaction32(LPBYTE,DWORD,HCONV,HSZ,UINT32, UINT32,DWORD,LPDWORD); #define DdeClientTransaction WINELIB_NAME(DdeClientTransaction) BOOL16 WINAPI DdeAbandonTransaction(DWORD,HCONV,DWORD); -BOOL16 WINAPI DdePostAdvise(DWORD,HSZ,HSZ); +BOOL16 WINAPI DdePostAdvise16(DWORD,HSZ,HSZ); +BOOL32 WINAPI DdePostAdvise32(DWORD,HSZ,HSZ); +#define DdePostAdvise WINELIB_NAME(DdePostAdvise) HDDEDATA WINAPI DdeAddData(HDDEDATA,LPBYTE,DWORD,DWORD); DWORD WINAPI DdeGetData(HDDEDATA,LPBYTE,DWORD,DWORD); LPBYTE WINAPI DdeAccessData(HDDEDATA,LPDWORD); diff --git a/include/debug.h b/include/debug.h index d601ff4362e..6c6289ca983 100644 --- a/include/debug.h +++ b/include/debug.h @@ -31,87 +31,90 @@ #define dbch_dialog 23 #define dbch_dll 24 #define dbch_dosfs 25 -#define dbch_driver 26 -#define dbch_dsound 27 -#define dbch_edit 28 -#define dbch_event 29 -#define dbch_exec 30 -#define dbch_file 31 -#define dbch_fixup 32 -#define dbch_font 33 -#define dbch_gdi 34 -#define dbch_global 35 -#define dbch_graphics 36 -#define dbch_heap 37 -#define dbch_hook 38 -#define dbch_icon 39 -#define dbch_imagelist 40 -#define dbch_int 41 -#define dbch_int21 42 -#define dbch_int31 43 -#define dbch_key 44 -#define dbch_keyboard 45 -#define dbch_ldt 46 -#define dbch_listbox 47 -#define dbch_local 48 -#define dbch_mci 49 -#define dbch_mcianim 50 -#define dbch_mciwave 51 -#define dbch_mdi 52 -#define dbch_menu 53 -#define dbch_message 54 -#define dbch_metafile 55 -#define dbch_midi 56 -#define dbch_mmaux 57 -#define dbch_mmio 58 -#define dbch_mmsys 59 -#define dbch_mmtime 60 -#define dbch_module 61 -#define dbch_mpr 62 -#define dbch_msg 63 -#define dbch_nonclient 64 -#define dbch_ntdll 65 -#define dbch_ole 66 -#define dbch_palette 67 -#define dbch_print 68 -#define dbch_profile 69 -#define dbch_progress 70 -#define dbch_prop 71 -#define dbch_reg 72 -#define dbch_region 73 -#define dbch_relay 74 -#define dbch_resource 75 -#define dbch_scroll 76 -#define dbch_security 77 -#define dbch_selector 78 -#define dbch_sem 79 -#define dbch_sendmsg 80 -#define dbch_shell 81 -#define dbch_shm 82 -#define dbch_sound 83 -#define dbch_static 84 -#define dbch_stress 85 -#define dbch_string 86 -#define dbch_task 87 -#define dbch_text 88 -#define dbch_thread 89 -#define dbch_thunk 90 -#define dbch_timer 91 -#define dbch_toolhelp 92 -#define dbch_tweak 93 -#define dbch_uitools 94 -#define dbch_updown 95 -#define dbch_ver 96 -#define dbch_virtual 97 -#define dbch_vxd 98 -#define dbch_win 99 -#define dbch_win16drv 100 -#define dbch_win32 101 -#define dbch_wing 102 -#define dbch_winsock 103 -#define dbch_wnet 104 -#define dbch_x11 105 -#define dbch_x11drv 106 +#define dbch_dosmem 26 +#define dbch_driver 27 +#define dbch_dsound 28 +#define dbch_edit 29 +#define dbch_event 30 +#define dbch_exec 31 +#define dbch_file 32 +#define dbch_fixup 33 +#define dbch_font 34 +#define dbch_gdi 35 +#define dbch_global 36 +#define dbch_graphics 37 +#define dbch_heap 38 +#define dbch_hook 39 +#define dbch_icon 40 +#define dbch_imagelist 41 +#define dbch_int 42 +#define dbch_int21 43 +#define dbch_int31 44 +#define dbch_key 45 +#define dbch_keyboard 46 +#define dbch_ldt 47 +#define dbch_listbox 48 +#define dbch_local 49 +#define dbch_mci 50 +#define dbch_mcianim 51 +#define dbch_mciwave 52 +#define dbch_mdi 53 +#define dbch_menu 54 +#define dbch_message 55 +#define dbch_metafile 56 +#define dbch_midi 57 +#define dbch_mmaux 58 +#define dbch_mmio 59 +#define dbch_mmsys 60 +#define dbch_mmtime 61 +#define dbch_module 62 +#define dbch_mpr 63 +#define dbch_msg 64 +#define dbch_nonclient 65 +#define dbch_ntdll 66 +#define dbch_ole 67 +#define dbch_palette 68 +#define dbch_print 69 +#define dbch_profile 70 +#define dbch_progress 71 +#define dbch_prop 72 +#define dbch_reg 73 +#define dbch_region 74 +#define dbch_relay 75 +#define dbch_resource 76 +#define dbch_scroll 77 +#define dbch_security 78 +#define dbch_segment 79 +#define dbch_selector 80 +#define dbch_sem 81 +#define dbch_sendmsg 82 +#define dbch_shell 83 +#define dbch_shm 84 +#define dbch_sound 85 +#define dbch_static 86 +#define dbch_stress 87 +#define dbch_string 88 +#define dbch_system 89 +#define dbch_task 90 +#define dbch_text 91 +#define dbch_thread 92 +#define dbch_thunk 93 +#define dbch_timer 94 +#define dbch_toolhelp 95 +#define dbch_tweak 96 +#define dbch_uitools 97 +#define dbch_updown 98 +#define dbch_ver 99 +#define dbch_virtual 100 +#define dbch_vxd 101 +#define dbch_win 102 +#define dbch_win16drv 103 +#define dbch_win32 104 +#define dbch_wing 105 +#define dbch_winsock 106 +#define dbch_wnet 107 +#define dbch_x11 108 +#define dbch_x11drv 109 /* Definitions for classes identifiers */ #define dbcl_fixme 0 #define dbcl_err 1 diff --git a/include/debugdefs.h b/include/debugdefs.h index 6189cf56683..2b8f5fcf30a 100644 --- a/include/debugdefs.h +++ b/include/debugdefs.h @@ -4,7 +4,7 @@ #include "debugtools.h" #endif -#define DEBUG_CHANNEL_COUNT 107 +#define DEBUG_CHANNEL_COUNT 110 #ifdef DEBUG_RUNTIME short debug_msg_enabled[][DEBUG_CLASS_COUNT] = { {1, 1, 0, 0}, @@ -114,6 +114,9 @@ short debug_msg_enabled[][DEBUG_CLASS_COUNT] = { {1, 1, 0, 0}, {1, 1, 0, 0}, {1, 1, 0, 0}, +{1, 1, 0, 0}, +{1, 1, 0, 0}, +{1, 1, 0, 0}, }; const char* debug_ch_name[] = { "accel", @@ -142,6 +145,7 @@ const char* debug_ch_name[] = { "dialog", "dll", "dosfs", +"dosmem", "driver", "dsound", "edit", @@ -194,6 +198,7 @@ const char* debug_ch_name[] = { "resource", "scroll", "security", +"segment", "selector", "sem", "sendmsg", @@ -203,6 +208,7 @@ const char* debug_ch_name[] = { "static", "stress", "string", +"system", "task", "text", "thread", diff --git a/include/debugger.h b/include/debugger.h index 94d71aa9b8d..866634df0fc 100644 --- a/include/debugger.h +++ b/include/debugger.h @@ -85,14 +85,13 @@ struct wine_locals { typedef struct wine_locals WineLocals; -#define DBG_FIX_ADDR_SEG(addr,default) \ - { WORD cs, ds; GET_CS(cs); GET_DS(ds); \ +#define DBG_FIX_ADDR_SEG(addr,default) { \ if ((addr)->seg == 0xffffffff) (addr)->seg = (default); \ - if (((addr)->seg == cs) || (addr)->seg == ds) (addr)->seg = 0; } + if (IS_SELECTOR_SYSTEM((addr)->seg)) (addr)->seg = 0; } #define DBG_ADDR_TO_LIN(addr) \ - ((addr)->seg ? (char *)PTR_SEG_OFF_TO_LIN((addr)->seg,(addr)->off) \ - : (char *)(addr)->off) + (IS_SELECTOR_SYSTEM((addr)->seg) ? (char *)(addr)->off \ + : (char *)PTR_SEG_OFF_TO_LIN((addr)->seg,(addr)->off)) #define DBG_CHECK_READ_PTR(addr,len) \ (!DEBUG_IsBadReadPtr((addr),(len)) || \ diff --git a/include/gdi.h b/include/gdi.h index cce42704f38..4ea7c7bc097 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -198,6 +198,7 @@ typedef struct tagDC_FUNCS BOOL32 (*pPatBlt)(DC*,INT32,INT32,INT32,INT32,DWORD); BOOL32 (*pPie)(DC*,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32); BOOL32 (*pPolyPolygon)(DC*,LPPOINT32,LPINT32,UINT32); + BOOL32 (*pPolyPolyline)(DC*,LPPOINT32,LPINT32,UINT32); BOOL32 (*pPolygon)(DC*,LPPOINT32,INT32); BOOL32 (*pPolyline)(DC*,LPPOINT32,INT32); UINT32 (*pRealizePalette)(DC*); diff --git a/include/ldt.h b/include/ldt.h index 4d6713f8136..0f46d9a0bce 100644 --- a/include/ldt.h +++ b/include/ldt.h @@ -59,13 +59,13 @@ extern ldt_copy_entry ldt_copy[LDT_SIZE]; /* Convert a segmented ptr (16:16) to a linear (32) pointer */ #define PTR_SEG_OFF_TO_LIN(seg,off) \ - ((void*)(GET_SEL_BASE(seg) + (unsigned int)(off))) + ((void*)(GET_SEL_BASE(seg) + (unsigned int)(off))) #define PTR_SEG_TO_LIN(ptr) \ - (__winelib ? (void*)(ptr) : PTR_SEG_OFF_TO_LIN(SELECTOROF(ptr),OFFSETOF(ptr))) + PTR_SEG_OFF_TO_LIN(SELECTOROF(ptr),OFFSETOF(ptr)) #define PTR_SEG_OFF_TO_SEGPTR(seg,off) \ - (__winelib ? (SEGPTR)PTR_SEG_OFF_TO_LIN(seg,off) : (SEGPTR)MAKELONG(off,seg)) + ((SEGPTR)MAKELONG(off,seg)) #define PTR_SEG_OFF_TO_HUGEPTR(seg,off) \ - (PTR_SEG_OFF_TO_SEGPTR( (seg) + (HIWORD(off) << __AHSHIFT), LOWORD(off) )) + PTR_SEG_OFF_TO_SEGPTR( (seg) + (HIWORD(off) << __AHSHIFT), LOWORD(off) ) extern unsigned char ldt_flags_copy[LDT_SIZE]; @@ -78,4 +78,12 @@ extern unsigned char ldt_flags_copy[LDT_SIZE]; #define GET_SEL_FLAGS(sel) (ldt_flags_copy[SELECTOR_TO_ENTRY(sel)]) +#define FIRST_LDT_ENTRY_TO_ALLOC 17 + +/* Determine if sel is a system selector (i.e. not managed by Wine) */ +#define IS_SELECTOR_SYSTEM(sel) \ + (!((sel) & 4) || (SELECTOR_TO_ENTRY(sel) < FIRST_LDT_ENTRY_TO_ALLOC)) +#define IS_SELECTOR_32BIT(sel) \ + (IS_SELECTOR_SYSTEM(sel) || (GET_SEL_FLAGS(sel) & LDT_FLAGS_32BIT)) + #endif /* __WINE_LDT_H */ diff --git a/include/miscemu.h b/include/miscemu.h index 4b5847b4b6a..3d58a6cbe9b 100644 --- a/include/miscemu.h +++ b/include/miscemu.h @@ -15,7 +15,6 @@ extern HANDLE16 DOSMEM_BiosSeg; extern DWORD DOSMEM_CollateTable; extern BOOL32 DOSMEM_Init(void); -extern void DOSMEM_InitExports(HMODULE16); extern void DOSMEM_Tick(void); extern WORD DOSMEM_AllocSelector(WORD); extern LPVOID DOSMEM_GetBlock(UINT32 size, UINT16* p); diff --git a/include/module.h b/include/module.h index 017b3c25ee5..566669524dd 100644 --- a/include/module.h +++ b/include/module.h @@ -101,6 +101,25 @@ typedef struct #pragma pack(4) +/* internal representation of 32bit modules. per process. */ +typedef enum { MODULE32_PE=1, MODULE32_ELF, /* ... */ } MODULE32_TYPE; +typedef struct _wine_modref +{ + struct _wine_modref *next; + MODULE32_TYPE type; + union { + PE_MODREF pe; + /* ELF_MODREF elf; */ + } binfmt; + + HMODULE32 module; + + char *modname; + char *fullname; + char *shortname; + char *unixname; +} WINE_MODREF; + /* Resource types */ typedef struct resource_typeinfo_s NE_TYPEINFO; typedef struct resource_nameinfo_s NE_NAMEINFO; @@ -114,32 +133,48 @@ typedef struct resource_nameinfo_s NE_NAMEINFO; #define NE_MODULE_NAME(pModule) \ (((OFSTRUCT *)((char*)(pModule) + (pModule)->fileinfo))->szPathName) -#define NE_WIN32_MODULE(pModule) \ - ((((pModule)->flags & NE_FFLAGS_WIN32) ? \ - ((NE_WIN32_EXTRAINFO *)((pModule) + 1))->module32 : 0)) - /* module.c */ -extern NE_MODULE *MODULE_GetPtr( HMODULE32 hModule ); +extern NE_MODULE *MODULE_GetPtr16( HMODULE16 hModule ); +extern NE_MODULE *MODULE_GetPtr32( HMODULE32 hModule ); extern HMODULE16 MODULE_HANDLEtoHMODULE16( HANDLE32 handle ); -extern HMODULE32 MODULE_HANDLEtoHMODULE32( HANDLE32 handle ); -extern void MODULE_DumpModule( HMODULE32 hmodule ); -extern void MODULE_WalkModules(void); extern int MODULE_OpenFile( HMODULE32 hModule ); extern LPSTR MODULE_GetModuleName( HMODULE32 hModule ); -extern void MODULE_RegisterModule( NE_MODULE *pModule ); -extern HMODULE32 MODULE_FindModule( LPCSTR path ); -extern HINSTANCE16 MODULE_CreateInstance( HMODULE16 hModule, BOOL32 lib_only ); -extern HINSTANCE16 MODULE_GetInstance( HMODULE32 hModule ); +extern FARPROC32 MODULE_GetProcAddress32( struct _PDB32*pdb,HMODULE32 hModule,LPCSTR function ); +extern WINE_MODREF *MODULE32_LookupHMODULE( struct _PDB32 *process, HMODULE32 hModule ); +extern HMODULE32 MODULE_FindModule16( LPCSTR path ); +extern HMODULE32 MODULE_FindModule32( struct _PDB32 *process, LPCSTR path ); +extern HINSTANCE16 MODULE_CreateInstance( HMODULE16 hModule, HINSTANCE16 *prev, + BOOL32 lib_only ); extern HMODULE32 MODULE_CreateDummyModule( const OFSTRUCT *ofs ); extern HINSTANCE16 MODULE_Load( LPCSTR name, UINT16 uFlags, LPCSTR cmd_line, LPCSTR env, UINT32 show_cmd ); -extern WORD MODULE_GetOrdinal( HMODULE32 hModule, const char *name ); -extern FARPROC16 MODULE_GetEntryPoint( HMODULE32 hModule, WORD ordinal ); -extern BOOL16 MODULE_SetEntryPoint( HMODULE32 hModule, WORD ordinal, - WORD offset ); extern FARPROC16 MODULE_GetWndProcEntry16( const char *name ); extern FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE32 hmodule, LPSTR name ); +typedef HGLOBAL16 (CALLBACK *RESOURCEHANDLER16)(HGLOBAL16,HMODULE16,HRSRC16); + +/* loader/ne/module.c */ +extern void NE_DumpModule( HMODULE16 hModule ); +extern void NE_WalkModules(void); +extern void NE_RegisterModule( NE_MODULE *pModule ); +extern WORD NE_GetOrdinal( HMODULE16 hModule, const char *name ); +extern FARPROC16 NE_GetEntryPoint( HMODULE16 hModule, WORD ordinal ); +extern BOOL16 NE_SetEntryPoint( HMODULE16 hModule, WORD ordinal, WORD offset ); +extern HINSTANCE16 NE_LoadModule( HFILE32 hFile, OFSTRUCT *ofs, UINT16 flags, + LPCSTR cmd_line, LPCSTR env, + UINT32 show_cmd ); + +/* loader/ne/resource.c */ +extern HGLOBAL16 WINAPI NE_DefResourceHandler(HGLOBAL16,HMODULE16,HRSRC16); +extern BOOL32 NE_InitResourceHandler( HMODULE16 hModule ); + +/* loader/ne/segment.c */ +extern BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum ); +extern BOOL32 NE_LoadAllSegments( NE_MODULE *pModule ); +extern void NE_FixupPrologs( NE_MODULE *pModule ); +extern void NE_InitializeDLLs( HMODULE16 hModule ); +extern BOOL32 NE_CreateSegments( HMODULE16 hModule ); + /* builtin.c */ extern BOOL32 BUILTIN_Init(void); extern HMODULE32 BUILTIN_LoadModule( LPCSTR name, BOOL32 force ); @@ -149,13 +184,6 @@ extern FARPROC32 BUILTIN_GetEntryPoint32( char *buffer, void *relay, extern BOOL32 BUILTIN_ParseDLLOptions( const char *str ); extern void BUILTIN_PrintDLLs(void); -/* ne_image.c */ -extern BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum ); -extern BOOL32 NE_LoadAllSegments( NE_MODULE *pModule ); -extern BOOL32 NE_LoadDLLs( NE_MODULE *pModule ); -extern void NE_FixupPrologs( NE_MODULE *pModule ); -extern void NE_InitializeDLLs( HMODULE16 hModule ); - /* relay32/builtin.c */ extern HMODULE32 BUILTIN32_LoadModule( LPCSTR name, BOOL32 force, struct _PDB32 *process ); diff --git a/include/neexe.h b/include/neexe.h index ff83390d31d..7a428fd5c1f 100644 --- a/include/neexe.h +++ b/include/neexe.h @@ -167,51 +167,6 @@ struct relocation_entry_s #define NE_RELTYPE_OSFIXUP 3 #define NE_RELFLAG_ADDITIVE 4 -/* - * DOS PSP - */ -struct dos_psp_s -{ - unsigned short pspInt20; - unsigned short pspNextParagraph; - unsigned char pspReserved1; - unsigned char pspDispatcher[5]; - unsigned short pspTerminateVector[2]; - unsigned short pspControlCVector[2]; - unsigned short pspCritErrorVector[2]; - unsigned short pspReserved2[11]; - unsigned short pspEnvironment; - unsigned short pspReserved3[23]; - unsigned char pspFCB_1[16]; - unsigned char pspFCB_2[16]; - unsigned char pspReserved4[4]; - unsigned char pspCommandTailCount; - unsigned char pspCommandTail[128]; -}; - -/* - * Entry table structures. - */ -struct entry_tab_header_s -{ - unsigned char n_entries; - unsigned char seg_number; -}; - -struct entry_tab_movable_s -{ - unsigned char flags; - unsigned char int3f[2]; - unsigned char seg_number; - unsigned short offset; -}; - -struct entry_tab_fixed_s -{ - unsigned char flags; - unsigned char offset[2]; -}; - /* * Resource table structures. */ @@ -229,7 +184,7 @@ struct resource_typeinfo_s { unsigned short type_id; /* Type identifier */ unsigned short count; /* Number of resources of this type */ - DWORD resloader; /* SetResourceHandler() */ + FARPROC16 resloader; /* SetResourceHandler() */ /* * Name info array. */ diff --git a/include/ole.h b/include/ole.h index fd671bed29c..42ba711d0ce 100644 --- a/include/ole.h +++ b/include/ole.h @@ -7,24 +7,29 @@ #include "windows.h" -typedef CHAR OLECHAR16; -typedef LPSTR LPOLESTR16; -typedef LPCSTR LPCOLESTR16; -typedef WCHAR OLECHAR32; -typedef LPWSTR LPOLESTR32; -typedef LPCWSTR LPCOLESTR32; +typedef CHAR OLECHAR16; +typedef OLECHAR16 *BSTR16; +typedef BSTR16 *LPBSTR16; +typedef LPSTR LPOLESTR16; +typedef LPCSTR LPCOLESTR16; +typedef WCHAR OLECHAR32; +typedef OLECHAR32 *BSTR32; +typedef BSTR32 *LPBSTR32; +typedef LPWSTR LPOLESTR32; +typedef LPCWSTR LPCOLESTR32; DECL_WINELIB_TYPE(OLECHAR); DECL_WINELIB_TYPE(LPOLESTR); DECL_WINELIB_TYPE(LPCOLESTR); +DECL_WINELIB_TYPE(BSTR); +DECL_WINELIB_TYPE(LPBSTR); #define OLESTR16(x) x -#define OLESTR32(x) L##x +#define OLESTR32(x) L##x /* probably wrong */ #define OLESTR WINELIB_NAME(OLESTR) typedef unsigned short VARTYPE; typedef LONG DISPID; - /* object types */ #define OT_LINK 1 #define OT_EMBEDDED 2 diff --git a/include/oleauto.h b/include/oleauto.h new file mode 100644 index 00000000000..8a0f2659d97 --- /dev/null +++ b/include/oleauto.h @@ -0,0 +1,14 @@ +#ifndef __WINE_OLEAUTO_H +#define __WINE_OLEAUTO_H + +BSTR16 SysAllocString16(LPOLESTR16); +BSTR32 SysAllocString32(LPOLESTR32); +#define SysAllocString WINELIB_NAME(SysAllocString) +INT16 SysReAllocString16(LPBSTR16,LPOLESTR16); +INT32 SysReAllocString32(LPBSTR32,LPOLESTR32); +#define SysReAllocString WINELIB_NAME(SysReAllocString) +VOID SysFreeString16(BSTR16); +VOID SysFreeString32(BSTR32); +#define SysFreeString WINELIB_NAME(SysFreeString) + +#endif diff --git a/include/pe_image.h b/include/pe_image.h index 61c59120bfe..bf276f68ff9 100644 --- a/include/pe_image.h +++ b/include/pe_image.h @@ -9,9 +9,7 @@ /* modreference used for attached processes * all section are calculated here, relocations etc. */ -struct pe_modref { - struct pe_modref *next; - HMODULE32 module; +typedef struct { LPIMAGE_IMPORT_DESCRIPTOR pe_import; LPIMAGE_EXPORT_DIRECTORY pe_export; LPIMAGE_RESOURCE_DIRECTORY pe_resource; @@ -21,16 +19,16 @@ struct pe_modref { #define PE_MODREF_NO_DLL_CALLS 0x00000002 #define PE_MODREF_RELOCS_DONE 0x00000004 #define PE_MODREF_TLS_ALLOCED 0x00000008 +#define PE_MODREF_INTERNAL 0x00000010 int tlsindex; -}; +} PE_MODREF; struct _PDB32; - -typedef struct pe_modref PE_MODREF; - +struct _wine_modref; extern int PE_unloadImage(HMODULE32 hModule); -extern FARPROC32 PE_FindExportedFunction( struct _PDB32 *process, - HMODULE32 hModule, LPCSTR funcName); +extern FARPROC32 PE_FindExportedFunction( + struct _PDB32 *process,struct _wine_modref *wm, LPCSTR funcName +); extern void my_wcstombs(char * result, u_short * source, int len); extern BOOL32 PE_EnumResourceTypes32A(HMODULE32,ENUMRESTYPEPROC32A,LONG); extern BOOL32 PE_EnumResourceTypes32W(HMODULE32,ENUMRESTYPEPROC32W,LONG); @@ -38,10 +36,10 @@ extern BOOL32 PE_EnumResourceNames32A(HMODULE32,LPCSTR,ENUMRESNAMEPROC32A,LONG); extern BOOL32 PE_EnumResourceNames32W(HMODULE32,LPCWSTR,ENUMRESNAMEPROC32W,LONG); extern BOOL32 PE_EnumResourceLanguages32A(HMODULE32,LPCSTR,LPCSTR,ENUMRESLANGPROC32A,LONG); extern BOOL32 PE_EnumResourceLanguages32W(HMODULE32,LPCWSTR,LPCWSTR,ENUMRESLANGPROC32W,LONG); -extern HRSRC32 PE_FindResourceEx32W(HINSTANCE32,LPCWSTR,LPCWSTR,WORD); -extern DWORD PE_SizeofResource32(HINSTANCE32,HRSRC32); +extern HRSRC32 PE_FindResourceEx32W(struct _wine_modref*,LPCWSTR,LPCWSTR,WORD); +extern DWORD PE_SizeofResource32(HMODULE32,HRSRC32); extern HMODULE32 PE_LoadLibraryEx32A(LPCSTR,struct _PDB32*,HFILE32,DWORD); -extern HGLOBAL32 PE_LoadResource32(HINSTANCE32,HRSRC32); +extern HGLOBAL32 PE_LoadResource32(struct _wine_modref *wm,HRSRC32); extern HINSTANCE16 PE_LoadModule( HFILE32 hFile, OFSTRUCT *ofs, LPCSTR cmd_line, LPCSTR env, UINT16 showCmd); diff --git a/include/process.h b/include/process.h index 54c699f1041..dbdfbf3ee58 100644 --- a/include/process.h +++ b/include/process.h @@ -10,8 +10,8 @@ #include "windows.h" #include "winbase.h" #include "winnt.h" +#include "module.h" #include "k32obj.h" -#include "pe_image.h" struct _NE_MODULE; @@ -77,7 +77,7 @@ typedef struct _PDB32 ENVDB *env_db; /* 40 Environment database */ HANDLE_TABLE *handle_table; /* 44 Handle table */ struct _PDB32 *parent; /* 48 Parent process */ - PE_MODREF *modref_list; /* 4c MODREF list */ + WINE_MODREF *modref_list; /* 4c MODREF list */ void *thread_list; /* 50 List of threads */ void *debuggee_CB; /* 54 Debuggee context block */ void *local_heap_free; /* 58 Head of local heap free list */ @@ -88,7 +88,7 @@ typedef struct _PDB32 DWORD tls_bits[2]; /* 88 TLS in-use bits */ DWORD process_dword; /* 90 Unknown */ struct _PDB32 *group; /* 94 Process group */ - PE_MODREF *exe_modref; /* 98 MODREF for the process EXE */ + WINE_MODREF *exe_modref; /* 98 MODREF for the process EXE */ LPTOP_LEVEL_EXCEPTION_FILTER top_filter; /* 9c Top exception filter */ DWORD priority; /* a0 Priority level */ HANDLE32 heap_list; /* a4 Head of process heap list */ @@ -103,6 +103,12 @@ typedef struct _PDB32 LCID locale; /* c4 Locale to be queried by GetThreadLocale (NT) */ } PDB32; +/* Process flags */ +#define PDB32_WIN16_PROC 0x0008 /* Win16 process */ +#define PDB32_DOS_PROC 0x0010 /* Dos process */ +#define PDB32_CONSOLE_PROC 0x0020 /* Console process */ +#define PDB32_FILE_APIS_OEM 0x0040 /* File APIs are OEM */ + /* PDB <-> Process id conversion macros */ #define PROCESS_OBFUSCATOR ((DWORD)0xdeadbeef) #define PROCESS_ID_TO_PDB(id) ((PDB32 *)((id) ^ PROCESS_OBFUSCATOR)) diff --git a/include/resource.h b/include/resource.h index 4f1cd26f636..0c89906d13a 100644 --- a/include/resource.h +++ b/include/resource.h @@ -45,22 +45,6 @@ extern void LIBRES_RegisterResources(const struct resource* const * Res); #undef HAVE_WINE_CONSTRUCTOR #endif -typedef HGLOBAL16 (CALLBACK *RESOURCEHANDLER16)(HGLOBAL16, HMODULE16, HRSRC16 ); - -/* FIXME: convert all NE_ functions to accept NE_MODULE pointer instead - * of redundant hModule (which is always verified prior to calling these). - */ - -extern int NE_AccessResource( HMODULE16 hModule, HRSRC16 hRsrc ); -extern BOOL32 NE_FreeResource( HMODULE16 hModule, HGLOBAL16 handle ); -extern HRSRC16 NE_FindResource(HMODULE16 hModule, SEGPTR typeId, SEGPTR resId); -extern DWORD NE_SizeofResource( HMODULE16 hModule, HRSRC16 hRsrc ); -extern SEGPTR NE_LockResource( HMODULE16 hModule, HGLOBAL16 handle ); -extern HGLOBAL16 NE_AllocResource( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size ); -extern HGLOBAL16 NE_LoadResource( HMODULE16 hModule, HRSRC16 hRsrc ); -extern BOOL32 NE_InitResourceHandler( HMODULE16 hModule ); -extern FARPROC32 NE_SetResourceHandler( HMODULE16 hModule, SEGPTR typeId, FARPROC32 handler); - extern HGLOBAL16 SYSRES_LoadResource( SYSTEM_RESOURCE id ); extern void SYSRES_FreeResource( HGLOBAL16 handle ); extern LPCVOID SYSRES_GetResPtr( SYSTEM_RESOURCE id ); diff --git a/include/sig_context.h b/include/sig_context.h index 3db18ea1ca6..b1edc30969a 100644 --- a/include/sig_context.h +++ b/include/sig_context.h @@ -120,9 +120,10 @@ typedef struct _CONTEXT /* Note 1 */ #define SS_sig(context) ((context)->sc_ss) #ifdef linux -/* fs and gs are not supported on *BSD. Hopefully we won't need them. */ +/* fs and gs are not supported on *BSD. */ #define FS_sig(context) ((context)->sc_fs) #define GS_sig(context) ((context)->sc_gs) +#define CR2_sig(context) ((context)->cr2) #endif #ifndef __FreeBSD__ diff --git a/include/version.h b/include/version.h index c098d61abc7..aed673399d4 100644 --- a/include/version.h +++ b/include/version.h @@ -1 +1 @@ -#define WINE_RELEASE_INFO "Wine release 980413" +#define WINE_RELEASE_INFO "Wine release 980503" diff --git a/include/winbase.h b/include/winbase.h index 09832763a7a..78835f2d485 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -160,7 +160,7 @@ typedef struct { WCHAR szCSDVersion[128]; } OSVERSIONINFO32W; -DECL_WINELIB_TYPE_AW(OSVERSIONINFO); +DECL_WINELIB_TYPE_AW(OSVERSIONINFO) #define VER_PLATFORM_WIN32s 0 #define VER_PLATFORM_WIN32_WINDOWS 1 diff --git a/include/wincon.h b/include/wincon.h index da8b20e4013..bc7c710be1b 100644 --- a/include/wincon.h +++ b/include/wincon.h @@ -31,11 +31,13 @@ typedef BOOL32 HANDLER_ROUTINE(WORD); #define BACKGROUND_RED 0x0040 /* background color contains red. */ #define BACKGROUND_INTENSITY 0x0080 /* background color is intensified. */ +/* typedef struct tagCOORD { INT16 x; INT16 y; } COORD,*LPCOORD; +*/ typedef struct tagSMALL_RECT { diff --git a/include/windows.h b/include/windows.h index e1861aef4f2..6a667522dca 100644 --- a/include/windows.h +++ b/include/windows.h @@ -24,8 +24,8 @@ typedef struct INT32 cy; } SIZE32, *LPSIZE32; -DECL_WINELIB_TYPE(SIZE); -DECL_WINELIB_TYPE(LPSIZE); +DECL_WINELIB_TYPE(SIZE) +DECL_WINELIB_TYPE(LPSIZE) #define CONV_SIZE16TO32(s16,s32) \ ((s32)->cx = (INT32)(s16)->cx, (s32)->cy = (INT32)(s16)->cy) @@ -46,8 +46,8 @@ typedef struct INT32 y; } POINT32, *LPPOINT32; -DECL_WINELIB_TYPE(POINT); -DECL_WINELIB_TYPE(LPPOINT); +DECL_WINELIB_TYPE(POINT) +DECL_WINELIB_TYPE(LPPOINT) #define CONV_POINT16TO32(p16,p32) \ ((p32)->x = (INT32)(p16)->x, (p32)->y = (INT32)(p16)->y) @@ -75,8 +75,8 @@ typedef struct INT32 bottom; } RECT32, *LPRECT32; -DECL_WINELIB_TYPE(RECT); -DECL_WINELIB_TYPE(LPRECT); +DECL_WINELIB_TYPE(RECT) +DECL_WINELIB_TYPE(LPRECT) #define CONV_RECT16TO32(r16,r32) \ ((r32)->left = (INT32)(r16)->left, (r32)->top = (INT32)(r16)->top, \ @@ -85,6 +85,13 @@ DECL_WINELIB_TYPE(LPRECT); ((r16)->left = (INT16)(r32)->left, (r16)->top = (INT16)(r32)->top, \ (r16)->right = (INT16)(r32)->right, (r16)->bottom = (INT16)(r32)->bottom) + +typedef struct tagCOORD { + INT16 x; + INT16 y; +} COORD, *LPCOORD; + + typedef struct { WORD wFirst; @@ -99,8 +106,8 @@ typedef struct INT32 iKernAmount; } KERNINGPAIR32, *LPKERNINGPAIR32; -DECL_WINELIB_TYPE(KERNINGPAIR); -DECL_WINELIB_TYPE(LPKERNINGPAIR); +DECL_WINELIB_TYPE(KERNINGPAIR) +DECL_WINELIB_TYPE(LPKERNINGPAIR) typedef struct { @@ -122,10 +129,39 @@ typedef struct BYTE rgbReserved[32]; } PAINTSTRUCT32, *LPPAINTSTRUCT32; -DECL_WINELIB_TYPE(PAINTSTRUCT); -DECL_WINELIB_TYPE(LPPAINTSTRUCT); +DECL_WINELIB_TYPE(PAINTSTRUCT) +DECL_WINELIB_TYPE(LPPAINTSTRUCT) +typedef struct tagPIXELFORMATDESCRIPTOR { + WORD nSize; + WORD nVersion; + DWORD dwFlags; + BYTE iPixelType; + BYTE cColorBits; + BYTE cRedBits; + BYTE cRedShift; + BYTE cGreenBits; + BYTE cGreenShift; + BYTE cBlueBits; + BYTE cBlueShift; + BYTE cAlphaBits; + BYTE cAlphaShift; + BYTE cAccumBits; + BYTE cAccumRedBits; + BYTE cAccumGreenBits; + BYTE cAccumBlueBits; + BYTE cAccumAlphaBits; + BYTE cDepthBits; + BYTE cStencilBits; + BYTE cAuxBuffers; + BYTE iLayerType; + BYTE bReserved; + DWORD dwLayerMask; + DWORD dwVisibleMask; + DWORD dwDamageMask; +} PIXELFORMATDESCRIPTOR, *LPPIXELFORMATDESCRIPTOR; + /* Windows */ typedef struct @@ -176,8 +212,8 @@ typedef struct DWORD dwExStyle; } CREATESTRUCT32W, *LPCREATESTRUCT32W; -DECL_WINELIB_TYPE_AW(CREATESTRUCT); -DECL_WINELIB_TYPE_AW(LPCREATESTRUCT); +DECL_WINELIB_TYPE_AW(CREATESTRUCT) +DECL_WINELIB_TYPE_AW(LPCREATESTRUCT) typedef struct { @@ -191,8 +227,8 @@ typedef struct UINT32 idFirstChild; } CLIENTCREATESTRUCT32, *LPCLIENTCREATESTRUCT32; -DECL_WINELIB_TYPE(CLIENTCREATESTRUCT); -DECL_WINELIB_TYPE(LPCLIENTCREATESTRUCT); +DECL_WINELIB_TYPE(CLIENTCREATESTRUCT) +DECL_WINELIB_TYPE(LPCLIENTCREATESTRUCT) typedef struct { @@ -233,8 +269,8 @@ typedef struct LPARAM lParam; } MDICREATESTRUCT32W, *LPMDICREATESTRUCT32W; -DECL_WINELIB_TYPE_AW(MDICREATESTRUCT); -DECL_WINELIB_TYPE_AW(LPMDICREATESTRUCT); +DECL_WINELIB_TYPE_AW(MDICREATESTRUCT) +DECL_WINELIB_TYPE_AW(LPMDICREATESTRUCT) #define MDITILE_VERTICAL 0x0000 #define MDITILE_HORIZONTAL 0x0001 @@ -289,7 +325,7 @@ typedef struct POINT32 ptMaxTrackSize; } MINMAXINFO32; -DECL_WINELIB_TYPE(MINMAXINFO); +DECL_WINELIB_TYPE(MINMAXINFO) /* RedrawWindow() flags */ #define RDW_INVALIDATE 0x0001 @@ -334,7 +370,7 @@ typedef struct UINT32 flags; } WINDOWPOS32; -DECL_WINELIB_TYPE(WINDOWPOS); +DECL_WINELIB_TYPE(WINDOWPOS) /* SetWindowPlacement() struct */ typedef struct @@ -357,8 +393,8 @@ typedef struct RECT32 rcNormalPosition WINE_PACKED; } WINDOWPLACEMENT32, *LPWINDOWPLACEMENT32; -DECL_WINELIB_TYPE(WINDOWPLACEMENT); -DECL_WINELIB_TYPE(LPWINDOWPLACEMENT); +DECL_WINELIB_TYPE(WINDOWPLACEMENT) +DECL_WINELIB_TYPE(LPWINDOWPLACEMENT) /* WINDOWPLACEMENT flags */ #define WPF_SETMINPOSITION 0x0001 @@ -388,8 +424,8 @@ typedef struct WINDOWPOS32 *lppos; } NCCALCSIZE_PARAMS32, *LPNCCALCSIZE_PARAMS32; -DECL_WINELIB_TYPE(NCCALCSIZE_PARAMS); -DECL_WINELIB_TYPE(LPNCCALCSIZE_PARAMS); +DECL_WINELIB_TYPE(NCCALCSIZE_PARAMS) +DECL_WINELIB_TYPE(LPNCCALCSIZE_PARAMS) /* WM_NCCALCSIZE return flags */ #define WVR_ALIGNTOP 0x0010 @@ -489,8 +525,8 @@ typedef struct LPCWSTR lpszClassName; } WNDCLASS32W, *LPWNDCLASS32W; -DECL_WINELIB_TYPE_AW(WNDCLASS); -DECL_WINELIB_TYPE_AW(LPWNDCLASS); +DECL_WINELIB_TYPE_AW(WNDCLASS) +DECL_WINELIB_TYPE_AW(LPWNDCLASS) typedef struct { @@ -540,8 +576,8 @@ typedef struct HICON32 hIconSm; } WNDCLASSEX32W, *LPWNDCLASSEX32W; -DECL_WINELIB_TYPE_AW(WNDCLASSEX); -DECL_WINELIB_TYPE_AW(LPWNDCLASSEX); +DECL_WINELIB_TYPE_AW(WNDCLASSEX) +DECL_WINELIB_TYPE_AW(LPWNDCLASSEX) #define CS_VREDRAW 0x0001 #define CS_HREDRAW 0x0002 @@ -645,8 +681,8 @@ typedef struct HWND32 hwnd; } EVENTMSG32, *LPEVENTMSG32; -DECL_WINELIB_TYPE(EVENTMSG); -DECL_WINELIB_TYPE(LPEVENTMSG); +DECL_WINELIB_TYPE(EVENTMSG) +DECL_WINELIB_TYPE(LPEVENTMSG) /* Mouse hook structure */ @@ -666,8 +702,8 @@ typedef struct DWORD dwExtraInfo; } MOUSEHOOKSTRUCT32, *LPMOUSEHOOKSTRUCT32; -DECL_WINELIB_TYPE(MOUSEHOOKSTRUCT); -DECL_WINELIB_TYPE(LPMOUSEHOOKSTRUCT); +DECL_WINELIB_TYPE(MOUSEHOOKSTRUCT) +DECL_WINELIB_TYPE(LPMOUSEHOOKSTRUCT) /* Hardware hook structure */ @@ -687,8 +723,8 @@ typedef struct LPARAM lParam; } HARDWAREHOOKSTRUCT32, *LPHARDWAREHOOKSTRUCT32; -DECL_WINELIB_TYPE(HARDWAREHOOKSTRUCT); -DECL_WINELIB_TYPE(LPHARDWAREHOOKSTRUCT); +DECL_WINELIB_TYPE(HARDWAREHOOKSTRUCT) +DECL_WINELIB_TYPE(LPHARDWAREHOOKSTRUCT) /* CBT hook values */ #define HCBT_MOVESIZE 0 @@ -722,8 +758,8 @@ typedef struct HWND32 hwndInsertAfter; } CBT_CREATEWND32W, *LPCBT_CREATEWND32W; -DECL_WINELIB_TYPE_AW(CBT_CREATEWND); -DECL_WINELIB_TYPE_AW(LPCBT_CREATEWND); +DECL_WINELIB_TYPE_AW(CBT_CREATEWND) +DECL_WINELIB_TYPE_AW(LPCBT_CREATEWND) typedef struct { @@ -737,8 +773,8 @@ typedef struct HWND32 hWndActive; } CBTACTIVATESTRUCT32, *LPCBTACTIVATESTRUCT32; -DECL_WINELIB_TYPE(CBTACTIVATESTRUCT); -DECL_WINELIB_TYPE(LPCBTACTIVATESTRUCT); +DECL_WINELIB_TYPE(CBTACTIVATESTRUCT) +DECL_WINELIB_TYPE(LPCBTACTIVATESTRUCT) /* Shell hook values */ #define HSHELL_WINDOWCREATED 1 @@ -765,8 +801,94 @@ typedef struct INT32 code; } DEBUGHOOKINFO32, *LPDEBUGHOOKINFO32; -DECL_WINELIB_TYPE(DEBUGHOOKINFO); -DECL_WINELIB_TYPE(LPDEBUGHOOKINFO); +DECL_WINELIB_TYPE(DEBUGHOOKINFO) +DECL_WINELIB_TYPE(LPDEBUGHOOKINFO) + +typedef DWORD (CALLBACK *LPTHREAD_START_ROUTINE)(LPVOID); + +/* This is also defined in winnt.h */ +/* typedef struct _EXCEPTION_RECORD { + DWORD ExceptionCode; + DWORD ExceptionFlags; + struct _EXCEPTION_RECORD *ExceptionRecord; + LPVOID ExceptionAddress; + DWORD NumberParameters; + DWORD ExceptionInformation[15]; +} EXCEPTION_RECORD; */ + +typedef struct _EXCEPTION_DEBUG_INFO { +/* EXCEPTION_RECORD ExceptionRecord; */ + DWORD dwFirstChange; +} EXCEPTION_DEBUG_INFO; + +typedef struct _CREATE_THREAD_DEBUG_INFO { + HANDLE32 hThread; + LPVOID lpThreadLocalBase; + LPTHREAD_START_ROUTINE lpStartAddress; +} CREATE_THREAD_DEBUG_INFO; + +typedef struct _CREATE_PROCESS_DEBUG_INFO { + HANDLE32 hFile; + HANDLE32 hProcess; + HANDLE32 hThread; + LPVOID lpBaseOfImage; + DWORD dwDebugInfoFileOffset; + DWORD nDebugInfoSize; + LPVOID lpThreadLocalBase; + LPTHREAD_START_ROUTINE lpStartAddress; + LPVOID lpImageName; + WORD fUnicode; +} CREATE_PROCESS_DEBUG_INFO; + +typedef struct _EXIT_THREAD_DEBUG_INFO { + DWORD dwExitCode; +} EXIT_THREAD_DEBUG_INFO; + +typedef struct _EXIT_PROCESS_DEBUG_INFO { + DWORD dwExitCode; +} EXIT_PROCESS_DEBUG_INFO; + +typedef struct _LOAD_DLL_DEBUG_INFO { + HANDLE32 hFile; + LPVOID lpBaseOfDll; + DWORD dwDebugInfoFileOffset; + DWORD nDebugInfoSize; + LPVOID lpImageName; + WORD fUnicode; +} LOAD_DLL_DEBUG_INFO; + +typedef struct _UNLOAD_DLL_DEBUG_INFO { + LPVOID lpBaseOfDll; +} UNLOAD_DLL_DEBUG_INFO; + +typedef struct _OUTPUT_DEBUG_STRING_INFO { + LPSTR lpDebugStringData; + WORD fUnicode; + WORD nDebugStringLength; +} OUTPUT_DEBUG_STRING_INFO; + +typedef struct _RIP_INFO { + DWORD dwError; + DWORD dwType; +} RIP_INFO; + +typedef struct _DEBUG_EVENT { + DWORD dwDebugEventCode; + DWORD dwProcessId; + DWORD dwThreadId; + union { + EXCEPTION_DEBUG_INFO Exception; + CREATE_THREAD_DEBUG_INFO CreateThread; + CREATE_PROCESS_DEBUG_INFO CreateProcessInfo; + EXIT_THREAD_DEBUG_INFO ExitThread; + EXIT_PROCESS_DEBUG_INFO ExitProcess; + LOAD_DLL_DEBUG_INFO LoadDll; + UNLOAD_DLL_DEBUG_INFO UnloadDll; + OUTPUT_DEBUG_STRING_INFO DebugString; + RIP_INFO RipInfo; + } u; +} DEBUG_EVENT, *LPDEBUG_EVENT; + /***** Dialogs *****/ @@ -841,8 +963,8 @@ typedef struct POINT32 pt; } MSG32, *LPMSG32; -DECL_WINELIB_TYPE(MSG); -DECL_WINELIB_TYPE(LPMSG); +DECL_WINELIB_TYPE(MSG) +DECL_WINELIB_TYPE(LPMSG) /* Raster operations */ @@ -966,8 +1088,8 @@ typedef struct LPVOID bmBits WINE_PACKED; } BITMAP32, *LPBITMAP32; -DECL_WINELIB_TYPE(BITMAP); -DECL_WINELIB_TYPE(LPBITMAP); +DECL_WINELIB_TYPE(BITMAP) +DECL_WINELIB_TYPE(LPBITMAP) /* Brushes */ @@ -985,8 +1107,8 @@ typedef struct INT32 lbHatch; } LOGBRUSH32, *LPLOGBRUSH32; -DECL_WINELIB_TYPE(LOGBRUSH); -DECL_WINELIB_TYPE(LPLOGBRUSH); +DECL_WINELIB_TYPE(LOGBRUSH) +DECL_WINELIB_TYPE(LPLOGBRUSH) /* Brush styles */ #define BS_SOLID 0 @@ -1072,8 +1194,8 @@ typedef struct WCHAR lfFaceName[LF_FACESIZE]; } LOGFONT32W, *LPLOGFONT32W; -DECL_WINELIB_TYPE_AW(LOGFONT); -DECL_WINELIB_TYPE_AW(LPLOGFONT); +DECL_WINELIB_TYPE_AW(LOGFONT) +DECL_WINELIB_TYPE_AW(LPLOGFONT) typedef struct { @@ -1120,9 +1242,9 @@ typedef struct WCHAR elfScript[LF_FACESIZE] WINE_PACKED; } ENUMLOGFONTEX32W,*LPENUMLOGFONTEX32W; -DECL_WINELIB_TYPE_AW(ENUMLOGFONT); -DECL_WINELIB_TYPE_AW(LPENUMLOGFONT); -DECL_WINELIB_TYPE_AW(LPENUMLOGFONTEX); +DECL_WINELIB_TYPE_AW(ENUMLOGFONT) +DECL_WINELIB_TYPE_AW(LPENUMLOGFONT) +DECL_WINELIB_TYPE_AW(LPENUMLOGFONTEX) typedef struct { @@ -1341,8 +1463,8 @@ typedef struct BYTE tmCharSet; } TEXTMETRIC32W, *LPTEXTMETRIC32W; -DECL_WINELIB_TYPE_AW(TEXTMETRIC); -DECL_WINELIB_TYPE_AW(LPTEXTMETRIC); +DECL_WINELIB_TYPE_AW(TEXTMETRIC) +DECL_WINELIB_TYPE_AW(LPTEXTMETRIC) /* ntmFlags field flags */ #define NTM_REGULAR 0x00000040L @@ -1433,8 +1555,8 @@ typedef struct UINT32 ntmAvgWidth; } NEWTEXTMETRIC32W, *LPNEWTEXTMETRIC32W; -DECL_WINELIB_TYPE_AW(NEWTEXTMETRIC); -DECL_WINELIB_TYPE_AW(LPNEWTEXTMETRIC); +DECL_WINELIB_TYPE_AW(NEWTEXTMETRIC) +DECL_WINELIB_TYPE_AW(LPNEWTEXTMETRIC) typedef struct { @@ -1454,8 +1576,8 @@ typedef struct FONTSIGNATURE ntmeFontSignature; } NEWTEXTMETRICEX32W,*LPNEWTEXTMETRICEX32W; -DECL_WINELIB_TYPE_AW(NEWTEXTMETRICEX); -DECL_WINELIB_TYPE_AW(LPNEWTEXTMETRICEX); +DECL_WINELIB_TYPE_AW(NEWTEXTMETRICEX) +DECL_WINELIB_TYPE_AW(LPNEWTEXTMETRICEX) typedef INT16 (CALLBACK *FONTENUMPROC16)(SEGPTR,SEGPTR,UINT16,LPARAM); @@ -1463,12 +1585,12 @@ typedef INT32 (CALLBACK *FONTENUMPROC32A)(LPENUMLOGFONT32A,LPNEWTEXTMETRIC32A, UINT32,LPARAM); typedef INT32 (CALLBACK *FONTENUMPROC32W)(LPENUMLOGFONT32W,LPNEWTEXTMETRIC32W, UINT32,LPARAM); -DECL_WINELIB_TYPE_AW(FONTENUMPROC); +DECL_WINELIB_TYPE_AW(FONTENUMPROC) typedef INT16 (CALLBACK *FONTENUMPROCEX16)(SEGPTR,SEGPTR,UINT16,LPARAM); typedef INT32 (CALLBACK *FONTENUMPROCEX32A)(LPENUMLOGFONTEX32A,LPNEWTEXTMETRICEX32A,UINT32,LPARAM); typedef INT32 (CALLBACK *FONTENUMPROCEX32W)(LPENUMLOGFONTEX32W,LPNEWTEXTMETRICEX32W,UINT32,LPARAM); -DECL_WINELIB_TYPE_AW(FONTENUMPROCEX); +DECL_WINELIB_TYPE_AW(FONTENUMPROCEX) /* tmPitchAndFamily bits */ #define TMPF_FIXED_PITCH 1 /* means variable pitch */ @@ -1509,8 +1631,8 @@ typedef struct INT16 gmCellIncY; } GLYPHMETRICS32, *LPGLYPHMETRICS32; -DECL_WINELIB_TYPE(GLYPHMETRICS); -DECL_WINELIB_TYPE(LPGLYPHMETRICS); +DECL_WINELIB_TYPE(GLYPHMETRICS) +DECL_WINELIB_TYPE(LPGLYPHMETRICS) #define GGO_METRICS 0 #define GGO_BITMAP 1 @@ -1545,8 +1667,8 @@ typedef struct INT32 abcC; } ABC32, *LPABC32; -DECL_WINELIB_TYPE(ABC); -DECL_WINELIB_TYPE(LPABC); +DECL_WINELIB_TYPE(ABC) +DECL_WINELIB_TYPE(LPABC) /* Rasterizer status */ typedef struct @@ -1596,8 +1718,8 @@ typedef struct COLORREF lopnColor WINE_PACKED; } LOGPEN32, *LPLOGPEN32; -DECL_WINELIB_TYPE(LOGPEN); -DECL_WINELIB_TYPE(LPLOGPEN); +DECL_WINELIB_TYPE(LOGPEN) +DECL_WINELIB_TYPE(LPLOGPEN) #define PS_SOLID 0x00000000 #define PS_DASH 0x00000001 @@ -2000,11 +2122,10 @@ typedef struct BYTE pad0; WORD key; WORD cmd; - WORD pad1; } ACCEL32, *LPACCEL32; -DECL_WINELIB_TYPE(ACCEL); -DECL_WINELIB_TYPE(LPACCEL); +DECL_WINELIB_TYPE(ACCEL) +DECL_WINELIB_TYPE(LPACCEL) /* modifiers for RegisterHotKey */ #define MOD_ALT 0x0001 @@ -2100,6 +2221,9 @@ typedef struct BOOL32 bInheritHandle; } SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; +typedef DWORD SECURITY_INFORMATION; + + /* 64 bit number of 100 nanoseconds intervals since January 1, 1601 */ typedef struct { @@ -2136,8 +2260,8 @@ typedef struct WCHAR cAlternateFileName[14]; } WIN32_FIND_DATA32W, *LPWIN32_FIND_DATA32W; -DECL_WINELIB_TYPE_AW(WIN32_FIND_DATA); -DECL_WINELIB_TYPE_AW(LPWIN32_FIND_DATA); +DECL_WINELIB_TYPE_AW(WIN32_FIND_DATA) +DECL_WINELIB_TYPE_AW(LPWIN32_FIND_DATA) #define INVALID_HANDLE_VALUE16 ((HANDLE16) -1) #define INVALID_HANDLE_VALUE32 ((HANDLE32) -1) @@ -2302,8 +2426,8 @@ typedef struct tagDCB32 char EvtChar; } DCB32, *LPDCB32; -DECL_WINELIB_TYPE(DCB); -DECL_WINELIB_TYPE(LPDCB); +DECL_WINELIB_TYPE(DCB) +DECL_WINELIB_TYPE(LPDCB) #define RTS_CONTROL_DISABLE 0 #define RTS_CONTROL_ENABLE 1 @@ -3164,8 +3288,8 @@ typedef struct { UINT32 cch; } MENUITEMINFO32W, *LPMENUITEMINFO32W; -DECL_WINELIB_TYPE_AW(MENUITEMINFO); -DECL_WINELIB_TYPE_AW(LPMENUITEMINFO); +DECL_WINELIB_TYPE_AW(MENUITEMINFO) +DECL_WINELIB_TYPE_AW(LPMENUITEMINFO) /* Field specifiers for MENUITEMINFO[AW] type. */ #define MIIM_STATE 0x00000001 @@ -3323,7 +3447,7 @@ DECL_WINELIB_TYPE_AW(LPMENUITEMINFO); /* DrawState defines ... */ typedef BOOL16 (CALLBACK *DRAWSTATEPROC16)(HDC16,LPARAM,WPARAM16,INT16,INT16); typedef BOOL32 (CALLBACK *DRAWSTATEPROC32)(HDC32,LPARAM,WPARAM32,INT32,INT32); -DECL_WINELIB_TYPE(DRAWSTATEPROC); +DECL_WINELIB_TYPE(DRAWSTATEPROC) /* Image type */ #define DST_COMPLEX 0x0000 @@ -4069,9 +4193,9 @@ typedef struct DWORD itemData WINE_PACKED; } DRAWITEMSTRUCT32, *PDRAWITEMSTRUCT32, *LPDRAWITEMSTRUCT32; -DECL_WINELIB_TYPE(DRAWITEMSTRUCT); -DECL_WINELIB_TYPE(PDRAWITEMSTRUCT); -DECL_WINELIB_TYPE(LPDRAWITEMSTRUCT); +DECL_WINELIB_TYPE(DRAWITEMSTRUCT) +DECL_WINELIB_TYPE(PDRAWITEMSTRUCT) +DECL_WINELIB_TYPE(LPDRAWITEMSTRUCT) typedef struct { @@ -4093,9 +4217,9 @@ typedef struct DWORD itemData; } MEASUREITEMSTRUCT32, *PMEASUREITEMSTRUCT32, *LPMEASUREITEMSTRUCT32; -DECL_WINELIB_TYPE(MEASUREITEMSTRUCT); -DECL_WINELIB_TYPE(PMEASUREITEMSTRUCT); -DECL_WINELIB_TYPE(LPMEASUREITEMSTRUCT); +DECL_WINELIB_TYPE(MEASUREITEMSTRUCT) +DECL_WINELIB_TYPE(PMEASUREITEMSTRUCT) +DECL_WINELIB_TYPE(LPMEASUREITEMSTRUCT) typedef struct { @@ -4115,8 +4239,8 @@ typedef struct DWORD itemData; } DELETEITEMSTRUCT32, *LPDELETEITEMSTRUCT32; -DECL_WINELIB_TYPE(DELETEITEMSTRUCT); -DECL_WINELIB_TYPE(LPDELETEITEMSTRUCT); +DECL_WINELIB_TYPE(DELETEITEMSTRUCT) +DECL_WINELIB_TYPE(LPDELETEITEMSTRUCT) typedef struct { @@ -4141,8 +4265,8 @@ typedef struct DWORD dwLocaleId; } COMPAREITEMSTRUCT32, *LPCOMPAREITEMSTRUCT32; -DECL_WINELIB_TYPE(COMPAREITEMSTRUCT); -DECL_WINELIB_TYPE(LPCOMPAREITEMSTRUCT); +DECL_WINELIB_TYPE(COMPAREITEMSTRUCT) +DECL_WINELIB_TYPE(LPCOMPAREITEMSTRUCT) /* WM_KEYUP/DOWN/CHAR HIWORD(lParam) flags */ #define KF_EXTENDED 0x0100 @@ -4431,8 +4555,8 @@ typedef struct HGDIOBJ32 objectHandle[1]; } HANDLETABLE32, *LPHANDLETABLE32; -DECL_WINELIB_TYPE(HANDLETABLE); -DECL_WINELIB_TYPE(LPHANDLETABLE); +DECL_WINELIB_TYPE(HANDLETABLE) +DECL_WINELIB_TYPE(LPHANDLETABLE) /* Clipboard metafile picture structure */ typedef struct @@ -4451,8 +4575,8 @@ typedef struct HMETAFILE32 hMF; } METAFILEPICT32, *LPMETAFILEPICT32; -DECL_WINELIB_TYPE(METAFILEPICT); -DECL_WINELIB_TYPE(LPMETAFILEPICT); +DECL_WINELIB_TYPE(METAFILEPICT) +DECL_WINELIB_TYPE(LPMETAFILEPICT) /* Metafile functions */ #define META_SETBKCOLOR 0x0201 @@ -4539,7 +4663,7 @@ typedef INT16 (CALLBACK *MFENUMPROC16)(HDC16,HANDLETABLE16*,METARECORD*, INT16,LPARAM); typedef INT32 (CALLBACK *MFENUMPROC32)(HDC32,HANDLETABLE32*,METARECORD*, INT32,LPARAM); -DECL_WINELIB_TYPE(MFENUMPROC); +DECL_WINELIB_TYPE(MFENUMPROC) /* enhanced metafile structures and functions */ @@ -4916,8 +5040,8 @@ typedef struct { HANDLE32 hStdError; } STARTUPINFO32W, *LPSTARTUPINFO32W; -DECL_WINELIB_TYPE_AW(STARTUPINFO); -DECL_WINELIB_TYPE_AW(LPSTARTUPINFO); +DECL_WINELIB_TYPE_AW(STARTUPINFO) +DECL_WINELIB_TYPE_AW(LPSTARTUPINFO) typedef struct { HANDLE32 hProcess; @@ -5172,8 +5296,8 @@ typedef struct DWORD dmReserved2; } DEVMODE32W, *LPDEVMODE32W; -DECL_WINELIB_TYPE_AW(DEVMODE); -DECL_WINELIB_TYPE_AW(LPDEVMODE); +DECL_WINELIB_TYPE_AW(DEVMODE) +DECL_WINELIB_TYPE_AW(LPDEVMODE) typedef struct _PRINTER_DEFAULTS32A { LPSTR pDatatype; @@ -5187,8 +5311,8 @@ typedef struct _PRINTER_DEFAULTS32W { ACCESS_MASK DesiredAccess; } PRINTER_DEFAULTS32W, *LPPRINTER_DEFAULTS32W; -DECL_WINELIB_TYPE_AW(PRINTER_DEFAULTS); -DECL_WINELIB_TYPE_AW(LPPRINTER_DEFAULTS); +DECL_WINELIB_TYPE_AW(PRINTER_DEFAULTS) +DECL_WINELIB_TYPE_AW(LPPRINTER_DEFAULTS) typedef struct _SYSTEM_POWER_STATUS { @@ -5267,14 +5391,13 @@ typedef struct _MEMORY_BASIC_INFORMATION DWORD Type; } MEMORY_BASIC_INFORMATION,*LPMEMORY_BASIC_INFORMATION; -typedef DWORD (CALLBACK *LPTHREAD_START_ROUTINE)(LPVOID); typedef BOOL32 (CALLBACK *CODEPAGE_ENUMPROC32A)(LPSTR); typedef BOOL32 (CALLBACK *CODEPAGE_ENUMPROC32W)(LPWSTR); -DECL_WINELIB_TYPE_AW(CODEPAGE_ENUMPROC); +DECL_WINELIB_TYPE_AW(CODEPAGE_ENUMPROC) typedef BOOL32 (CALLBACK *LOCALE_ENUMPROC32A)(LPSTR); typedef BOOL32 (CALLBACK *LOCALE_ENUMPROC32W)(LPWSTR); -DECL_WINELIB_TYPE_AW(LOCALE_ENUMPROC); +DECL_WINELIB_TYPE_AW(LOCALE_ENUMPROC) typedef struct tagSYSTEM_INFO { @@ -5313,7 +5436,7 @@ typedef struct tagSYSTEM_INFO /* service main function prototype */ typedef VOID (CALLBACK *LPSERVICE_MAIN_FUNCTION32A)(DWORD,LPSTR); typedef VOID (CALLBACK *LPSERVICE_MAIN_FUNCTION32W)(DWORD,LPWSTR); -DECL_WINELIB_TYPE_AW(LPSERVICE_MAIN_FUNCTION); +DECL_WINELIB_TYPE_AW(LPSERVICE_MAIN_FUNCTION) /* service start table */ typedef struct @@ -5328,8 +5451,20 @@ typedef struct LPSERVICE_MAIN_FUNCTION32W lpServiceProc; } *LPSERVICE_TABLE_ENTRY32W, SERVICE_TABLE_ENTRY32W; -DECL_WINELIB_TYPE_AW(SERVICE_TABLE_ENTRY); -DECL_WINELIB_TYPE_AW(LPSERVICE_TABLE_ENTRY); +DECL_WINELIB_TYPE_AW(SERVICE_TABLE_ENTRY) +DECL_WINELIB_TYPE_AW(LPSERVICE_TABLE_ENTRY) + +/* Used by: ControlService */ +typedef struct _SERVICE_STATUS { + DWORD dwServiceType; + DWORD dwCurrentState; + DWORD dwControlsAccepted; + DWORD dwWin32ExitCode; + DWORD dwServiceSpecificExitCode; + DWORD dwCheckPoint; + DWORD dwWaitHint; +} SERVICE_STATUS, *LPSERVICE_STATUS; + /* {G,S}etPriorityClass */ #define NORMAL_PRIORITY_CLASS 0x00000020 @@ -5440,9 +5575,9 @@ typedef BOOL32 (CALLBACK *ENUMRESNAMEPROC32W)(HMODULE32,LPCWSTR,LPWSTR,LONG); typedef BOOL32 (CALLBACK *ENUMRESLANGPROC32A)(HMODULE32,LPCSTR,LPCSTR,WORD,LONG); typedef BOOL32 (CALLBACK *ENUMRESLANGPROC32W)(HMODULE32,LPCWSTR,LPCWSTR,WORD,LONG); -DECL_WINELIB_TYPE_AW(ENUMRESTYPEPROC); -DECL_WINELIB_TYPE_AW(ENUMRESNAMEPROC); -DECL_WINELIB_TYPE_AW(ENUMRESLANGPROC); +DECL_WINELIB_TYPE_AW(ENUMRESTYPEPROC) +DECL_WINELIB_TYPE_AW(ENUMRESNAMEPROC) +DECL_WINELIB_TYPE_AW(ENUMRESLANGPROC) /* Character Type Flags */ #define CT_CTYPE1 0x00000001 /* usual ctype */ @@ -5519,8 +5654,8 @@ typedef struct DWORD fwType; } DOCINFO32W, *LPDOCINFO32W; -DECL_WINELIB_TYPE_AW(DOCINFO); -DECL_WINELIB_TYPE_AW(LPDOCINFO); +DECL_WINELIB_TYPE_AW(DOCINFO) +DECL_WINELIB_TYPE_AW(LPDOCINFO) typedef struct { DWORD dwScope; @@ -5544,8 +5679,8 @@ typedef struct { LPWSTR lpProvider; } NETRESOURCE32W,*LPNETRESOURCE32W; -DECL_WINELIB_TYPE_AW(NETRESOURCE); -DECL_WINELIB_TYPE_AW(LPNETRESOURCE); +DECL_WINELIB_TYPE_AW(NETRESOURCE) +DECL_WINELIB_TYPE_AW(LPNETRESOURCE) typedef struct { DWORD cbStructure; @@ -5609,8 +5744,8 @@ typedef struct { LOGFONT32W lfMessageFont; } NONCLIENTMETRICS32W,*LPNONCLIENTMETRICS32W; -DECL_WINELIB_TYPE_AW(NONCLIENTMETRICS); -DECL_WINELIB_TYPE_AW(LPNONCLIENTMETRICS); +DECL_WINELIB_TYPE_AW(NONCLIENTMETRICS) +DECL_WINELIB_TYPE_AW(LPNONCLIENTMETRICS) typedef struct tagANIMATIONINFO { @@ -5731,8 +5866,8 @@ typedef struct DWORD dwLanguageId; } MSGBOXPARAMS32W,*LPMSGBOXPARAMS32W; -DECL_WINELIB_TYPE_AW(MSGBOXPARAMS); -DECL_WINELIB_TYPE_AW(LPMSGBOXPARAMS); +DECL_WINELIB_TYPE_AW(MSGBOXPARAMS) +DECL_WINELIB_TYPE_AW(LPMSGBOXPARAMS) /* for WOWHandle{16,32} */ typedef enum _WOW_HANDLE_TYPE { /* WOW */ @@ -5759,13 +5894,35 @@ typedef enum _WOW_HANDLE_TYPE { /* WOW */ #define WCB16_PASCAL 0x0 #define WCB16_CDECL 0x1 +typedef struct _numberfmt32a { + UINT32 NumDigits; + UINT32 LeadingZero; + UINT32 Grouping; + LPCSTR lpDecimalSep; + LPCSTR lpThousandSep; + UINT32 NegativeOrder; +} NUMBERFMT32A; + +typedef struct _numberfmt32w { + UINT32 NumDigits; + UINT32 LeadingZero; + UINT32 Grouping; + LPCWSTR lpDecimalSep; + LPCWSTR lpThousandSep; + UINT32 NegativeOrder; +} NUMBERFMT32W; + + + + #pragma pack(4) /* Declarations for functions that exist only in Win16 */ -#ifndef WINELIB +#ifdef __WINE__ WORD WINAPI AllocCStoDSAlias(WORD); WORD WINAPI AllocDStoCSAlias(WORD); +HGLOBAL16 WINAPI AllocResource(HINSTANCE16,HRSRC16,DWORD); WORD WINAPI AllocSelector(WORD); WORD WINAPI AllocSelectorArray(WORD); VOID WINAPI CalcChildScroll(HWND16,WORD); @@ -5916,7 +6073,7 @@ BOOL16 WINAPI WaitEvent(HTASK16); INT16 WINAPI WriteComm(INT16,LPSTR,INT16); VOID WINAPI WriteOutProfiles(VOID); VOID WINAPI hmemcpy(LPVOID,LPCVOID,LONG); -#endif /* WINELIB */ +#endif /* __WINE__ */ /* Declarations for functions that exist only in Win32 */ @@ -5925,15 +6082,18 @@ BOOL32 WINAPI AreFileApisANSI(void); BOOL32 WINAPI Beep(DWORD,DWORD); BOOL32 WINAPI ClearCommError(INT32,LPDWORD,LPCOMSTAT); BOOL32 WINAPI CloseHandle(HANDLE32); +BOOL32 WINAPI CloseServiceHandle(HANDLE32); INT32 WINAPI CopyAcceleratorTable32A(HACCEL32,LPACCEL32,INT32); INT32 WINAPI CopyAcceleratorTable32W(HACCEL32,LPACCEL32,INT32); #define CopyAcceleratorTable WINELIB_NAME_AW(CopyAcceleratorTable) HENHMETAFILE32 WINAPI CopyEnhMetaFile32A(HENHMETAFILE32,LPCSTR); +HENHMETAFILE32 WINAPI CopyEnhMetaFile32W(HENHMETAFILE32,LPCWSTR); #define CopyEnhMetaFile WINELIB_NAME_AW(CopyEnhMetaFile) BOOL32 WINAPI CopyFile32A(LPCSTR,LPCSTR,BOOL32); BOOL32 WINAPI CopyFile32W(LPCWSTR,LPCWSTR,BOOL32); #define CopyFile WINELIB_NAME_AW(CopyFile) INT32 WINAPI CompareFileTime(LPFILETIME,LPFILETIME); +BOOL32 WINAPI ControlService(HANDLE32,DWORD,LPSERVICE_STATUS); HANDLE32 WINAPI CreateEvent32A(LPSECURITY_ATTRIBUTES,BOOL32,BOOL32,LPCSTR); HANDLE32 WINAPI CreateEvent32W(LPSECURITY_ATTRIBUTES,BOOL32,BOOL32,LPCWSTR); #define CreateEvent WINELIB_NAME_AW(CreateEvent) @@ -5957,6 +6117,8 @@ HANDLE32 WINAPI CreateSemaphore32W(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCWSTR); #define CreateSemaphore WINELIB_NAME_AW(CreateSemaphore) HANDLE32 WINAPI CreateThread(LPSECURITY_ATTRIBUTES,DWORD,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD); BOOL32 WINAPI DeleteEnhMetaFile(HENHMETAFILE32); +BOOL32 WINAPI DeleteService(HANDLE32); +BOOL32 WINAPI DeregisterEventSource(HANDLE32); BOOL32 WINAPI DestroyAcceleratorTable(HACCEL32); BOOL32 WINAPI DisableThreadLibraryCalls(HMODULE32); BOOL32 WINAPI DosDateTimeToFileTime(WORD,WORD,LPFILETIME); @@ -5994,8 +6156,8 @@ HRGN32 WINAPI ExtCreateRegion(LPXFORM,DWORD,LPRGNDATA); BOOL32 WINAPI FileTimeToDosDateTime(const FILETIME*,LPWORD,LPWORD); BOOL32 WINAPI FileTimeToLocalFileTime(const FILETIME*,LPFILETIME); BOOL32 WINAPI FileTimeToSystemTime(const FILETIME*,LPSYSTEMTIME); -HRSRC32 WINAPI FindResourceEx32A(HINSTANCE32,LPCSTR,LPCSTR,WORD); -HRSRC32 WINAPI FindResourceEx32W(HINSTANCE32,LPCWSTR,LPCWSTR,WORD); +HRSRC32 WINAPI FindResourceEx32A(HMODULE32,LPCSTR,LPCSTR,WORD); +HRSRC32 WINAPI FindResourceEx32W(HMODULE32,LPCWSTR,LPCWSTR,WORD); #define FindResourceEx WINELIB_NAME_AW(FindResourceEx) BOOL32 WINAPI FlushConsoleInputBuffer(HANDLE32); BOOL32 WINAPI FlushFileBuffers(HFILE32); @@ -6033,6 +6195,7 @@ BOOL32 WINAPI GetDCOrgEx(HDC32,LPPOINT32); HENHMETAFILE32 WINAPI GetEnhMetaFile32A(LPCSTR); HENHMETAFILE32 WINAPI GetEnhMetaFile32W(LPCWSTR); #define GetEnhMetaFile WINELIB_NAME_AW(GetEnhMetaFile) +UINT32 WINAPI GetEnhMetaFileBits(HENHMETAFILE32,UINT32,LPBYTE); UINT32 WINAPI GetEnhMetaFileHeader(HENHMETAFILE32,UINT32,LPENHMETAHEADER); LPSTR WINAPI GetEnvironmentStrings32A(void); LPWSTR WINAPI GetEnvironmentStrings32W(void); @@ -6055,6 +6218,7 @@ DWORD WINAPI GetLogicalDrives(void); BOOL32 WINAPI GetMenuItemInfo32A(HMENU32,UINT32,BOOL32,MENUITEMINFO32A*); BOOL32 WINAPI GetMenuItemInfo32W(HMENU32,UINT32,BOOL32,MENUITEMINFO32W*); #define GetMenuItemInfo WINELIB_NAME_AW(GetMenuItemInfo) +UINT32 WINAPI GetMetaFileBitsEx(HMETAFILE32,UINT32,LPVOID); BOOL32 WINAPI GetNumberOfConsoleInputEvents(HANDLE32,LPDWORD); BOOL32 WINAPI GetNumberOfConsoleMouseButtons(LPDWORD); DWORD WINAPI GetObjectType(HANDLE32); @@ -6112,6 +6276,9 @@ BOOL32 WINAPI IsWindowUnicode(HWND32); BOOL32 WINAPI IsValidLocale(DWORD,DWORD); BOOL32 WINAPI LocalFileTimeToFileTime(const FILETIME*,LPFILETIME); BOOL32 WINAPI LockFile(HFILE32,DWORD,DWORD,DWORD,DWORD); +BOOL32 WINAPI LookupPrivilegeValue32A(LPCSTR,LPCSTR,LPVOID); +BOOL32 WINAPI LookupPrivilegeValue32W(LPCWSTR,LPCWSTR,LPVOID); +#define LookupPrivilegeValue WINELIB_NAME_AW(LookupPrivilegeValue) SEGPTR WINAPI MapLS(LPVOID); LPVOID WINAPI MapSL(SEGPTR); LPVOID WINAPI MapViewOfFile(HANDLE32,DWORD,DWORD,DWORD,DWORD); @@ -6138,9 +6305,16 @@ HANDLE32 WINAPI OpenMutex32A(DWORD,BOOL32,LPCSTR); HANDLE32 WINAPI OpenMutex32W(DWORD,BOOL32,LPCWSTR); #define OpenMutex WINELIB_NAME_AW(OpenMutex) HANDLE32 WINAPI OpenProcess(DWORD,BOOL32,DWORD); +BOOL32 WINAPI OpenProcessToken(HANDLE32,DWORD,HANDLE32*); +HANDLE32 WINAPI OpenSCManager32A(LPCSTR,LPCSTR,DWORD); +HANDLE32 WINAPI OpenSCManager32W(LPCWSTR,LPCWSTR,DWORD); +#define OpenSCManager WINELIB_NAME_AW(OpenSCManager) HANDLE32 WINAPI OpenSemaphore32A(DWORD,BOOL32,LPCSTR); HANDLE32 WINAPI OpenSemaphore32W(DWORD,BOOL32,LPCWSTR); #define OpenSemaphore WINELIB_NAME_AW(OpenSemaphore) +HANDLE32 WINAPI OpenService32A(HANDLE32,LPCSTR,DWORD); +HANDLE32 WINAPI OpenService32W(HANDLE32,LPCWSTR,DWORD); +#define OpenService WINELIB_NAME_AW(OpenService) BOOL32 WINAPI PlayEnhMetaFile(HDC32,HENHMETAFILE32,const RECT32*); BOOL32 WINAPI PlayEnhMetaFileRecord(HDC32,LPHANDLETABLE32,const ENHMETARECORD*,UINT32); BOOL32 WINAPI PulseEvent(HANDLE32); @@ -6162,6 +6336,10 @@ DWORD WINAPI RegEnumKeyEx32A(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPSTR, DWORD WINAPI RegEnumKeyEx32W(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPWSTR, LPDWORD,LPFILETIME); #define RegEnumKeyEx WINELIB_NAME_AW(RegEnumKeyEx) +LONG WINAPI RegGetKeySecurity(HKEY,SECURITY_INFORMATION,LPVOID,LPDWORD); +HANDLE32 WINAPI RegisterEventSource32A(LPCSTR,LPCSTR); +HANDLE32 WINAPI RegisterEventSource32W(LPCWSTR,LPCWSTR); +#define RegisterEventSource WINELIB_NAME_AW(RegisterEventSource) DWORD WINAPI RegOpenKeyEx32W(HKEY,LPCWSTR,DWORD,REGSAM,LPHKEY); DWORD WINAPI RegOpenKeyEx32A(HKEY,LPCSTR,DWORD,REGSAM,LPHKEY); #define RegOpenKeyEx WINELIB_NAME_AW(RegOpenKeyEx) @@ -6183,11 +6361,17 @@ DWORD WINAPI SearchPath32W(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPWSTR,LPWSTR*); BOOL32 WINAPI SetBrushOrgEx(HDC32,INT32,INT32,LPPOINT32); BOOL32 WINAPI SetCommMask(INT32,DWORD); BOOL32 WINAPI SetCommTimeouts(INT32,LPCOMMTIMEOUTS); +BOOL32 WINAPI SetComputerName32A(LPCSTR); +BOOL32 WINAPI SetComputerName32W(LPCWSTR); +#define SetComputerName WINELIB_NAME_AW(SetComputerName) +BOOL32 WINAPI SetConsoleCursorPosition(HANDLE32,COORD); BOOL32 WINAPI SetConsoleMode(HANDLE32,DWORD); BOOL32 WINAPI SetConsoleTitle32A(LPCSTR); BOOL32 WINAPI SetConsoleTitle32W(LPCWSTR); #define SetConsoleTitle WINELIB_NAME_AW(SetConsoleTitle) +VOID WINAPI SetDebugErrorLevel(DWORD); BOOL32 WINAPI SetEndOfFile(HFILE32); +HENHMETAFILE32 WINAPI SetEnhMetaFileBits(UINT32,const BYTE *); BOOL32 WINAPI SetEnvironmentVariable32A(LPCSTR,LPCSTR); BOOL32 WINAPI SetEnvironmentVariable32W(LPCWSTR,LPCWSTR); #define SetEnvironmentVariable WINELIB_NAME_AW(SetEnvironmentVariable) @@ -6213,6 +6397,9 @@ BOOL32 WINAPI SetTimeZoneInformation(const LPTIME_ZONE_INFORMATION); BOOL32 WINAPI SetWindowContextHelpId(HWND32,DWORD); BOOL32 WINAPI SetWorldTransform(HDC32,const XFORM*); VOID WINAPI Sleep(DWORD); +BOOL32 WINAPI StartService32A(HANDLE32,DWORD,LPCSTR*); +BOOL32 WINAPI StartService32W(HANDLE32,DWORD,LPCWSTR*); +#define StartService WINELIB_NAME_AW(StartService) BOOL32 WINAPI SystemTimeToFileTime(const SYSTEMTIME*,LPFILETIME); BOOL32 WINAPI TrackPopupMenuEx(HMENU32,UINT32,INT32,INT32,HWND32, LPTPMPARAMS); @@ -6231,10 +6418,18 @@ BOOL32 WINAPI VirtualProtectEx(HANDLE32,LPVOID,DWORD,DWORD,LPDWORD); DWORD WINAPI VirtualQuery(LPCVOID,LPMEMORY_BASIC_INFORMATION,DWORD); DWORD WINAPI VirtualQueryEx(HANDLE32,LPCVOID,LPMEMORY_BASIC_INFORMATION,DWORD); BOOL32 WINAPI VirtualUnlock(LPVOID,DWORD); +BOOL32 WINAPI WaitForDebugEvent(LPDEBUG_EVENT,DWORD); +DWORD WINAPI WaitForInputIdle(HANDLE32,DWORD); DWORD WINAPI WaitForMultipleObjects(DWORD,const HANDLE32*,BOOL32,DWORD); DWORD WINAPI WaitForMultipleObjectsEx(DWORD,const HANDLE32*,BOOL32,DWORD,BOOL32); DWORD WINAPI WaitForSingleObject(HANDLE32,DWORD); DWORD WINAPI WaitForSingleObjectEx(HANDLE32,DWORD,BOOL32); +UINT32 WINAPI WNetAddConnection2_32A(LPNETRESOURCE32A,LPCSTR,LPCSTR,DWORD); +UINT32 WINAPI WNetAddConnection2_32W(LPNETRESOURCE32W,LPCWSTR,LPCWSTR,DWORD); +#define WNetAddConnection2 WINELIB_NAME_AW(WNetAddConnection2_) +UINT32 WINAPI WNetAddConnection3_32A(HWND32,LPNETRESOURCE32A,LPCSTR,LPCSTR,DWORD); +UINT32 WINAPI WNetAddConnection3_32W(HWND32,LPNETRESOURCE32W,LPCWSTR,LPCWSTR,DWORD); +#define WNetAddConnection3 WINELIB_NAME_AW(WNetAddConnection3_) SEGPTR WINAPI WOWGlobalAllocLock16(DWORD,DWORD,HGLOBAL16*); DWORD WINAPI WOWCallback16(FARPROC16,DWORD); BOOL32 WINAPI WOWCallback16Ex(FARPROC16,DWORD,DWORD,LPVOID,LPDWORD); @@ -6283,7 +6478,7 @@ LRESULT WINAPI AboutDlgProc16(HWND16,UINT16,WPARAM16,LPARAM); LRESULT WINAPI AboutDlgProc32(HWND32,UINT32,WPARAM32,LPARAM); #define AboutDlgProc WINELIB_NAME(AboutDlgProc) INT16 WINAPI AccessResource16(HINSTANCE16,HRSRC16); -INT32 WINAPI AccessResource32(HINSTANCE32,HRSRC32); +INT32 WINAPI AccessResource32(HMODULE32,HRSRC32); #define AccessResource WINELIB_NAME(AccessResource) ATOM WINAPI AddAtom16(SEGPTR); ATOM WINAPI AddAtom32A(LPCSTR); @@ -6299,9 +6494,6 @@ BOOL32 WINAPI AdjustWindowRect32(LPRECT32,DWORD,BOOL32); BOOL16 WINAPI AdjustWindowRectEx16(LPRECT16,DWORD,BOOL16,DWORD); BOOL32 WINAPI AdjustWindowRectEx32(LPRECT32,DWORD,BOOL32,DWORD); #define AdjustWindowRectEx WINELIB_NAME(AdjustWindowRectEx) -HGLOBAL16 WINAPI AllocResource16(HINSTANCE16,HRSRC16,DWORD); -HGLOBAL32 WINAPI AllocResource32(HINSTANCE32,HRSRC32,DWORD); -#define AllocResource WINELIB_NAME(AllocResource) void WINAPI AnimatePalette16(HPALETTE16,UINT16,UINT16,LPPALETTEENTRY); BOOL32 WINAPI AnimatePalette32(HPALETTE32,UINT32,UINT32,LPPALETTEENTRY); #define AnimatePalette WINELIB_NAME(AnimatePalette) @@ -6435,6 +6627,7 @@ BOOL32 WINAPI CheckRadioButton32(HWND32,UINT32,UINT32,UINT32); HWND16 WINAPI ChildWindowFromPoint16(HWND16,POINT16); HWND32 WINAPI ChildWindowFromPoint32(HWND32,POINT32); #define ChildWindowFromPoint WINELIB_NAME(ChildWindowFromPoint) +INT32 ChoosePixelFormat(HDC32,PIXELFORMATDESCRIPTOR*); BOOL16 WINAPI Chord16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16); BOOL32 WINAPI Chord32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32); #define Chord WINELIB_NAME(Chord) @@ -6696,6 +6889,8 @@ BOOL32 WINAPI DeleteMetaFile32(HMETAFILE32); BOOL16 WINAPI DeleteObject16(HGDIOBJ16); BOOL32 WINAPI DeleteObject32(HGDIOBJ32); #define DeleteObject WINELIB_NAME(DeleteObject) +INT32 WINAPI DescribePixelFormat(HDC32,int,UINT32, + LPPIXELFORMATDESCRIPTOR); VOID WINAPI DestroyCaret16(void); BOOL32 WINAPI DestroyCaret32(void); #define DestroyCaret WINELIB_NAME(DestroyCaret) @@ -6924,8 +7119,8 @@ BOOL32 WINAPI FindNextFile32A(HANDLE32,LPWIN32_FIND_DATA32A); BOOL32 WINAPI FindNextFile32W(HANDLE32,LPWIN32_FIND_DATA32W); #define FindNextFile WINELIB_NAME_AW(FindNextFile) HRSRC16 WINAPI FindResource16(HINSTANCE16,SEGPTR,SEGPTR); -HRSRC32 WINAPI FindResource32A(HINSTANCE32,LPCSTR,LPCSTR); -HRSRC32 WINAPI FindResource32W(HINSTANCE32,LPCWSTR,LPCWSTR); +HRSRC32 WINAPI FindResource32A(HMODULE32,LPCSTR,LPCSTR); +HRSRC32 WINAPI FindResource32W(HMODULE32,LPCWSTR,LPCWSTR); #define FindResource WINELIB_NAME_AW(FindResource) HWND16 WINAPI FindWindow16(SEGPTR,LPCSTR); HWND32 WINAPI FindWindow32A(LPCSTR,LPCSTR); @@ -7246,6 +7441,7 @@ INT32 WINAPI GetPath32(HDC32,LPPOINT32,LPBYTE,INT32); COLORREF WINAPI GetPixel16(HDC16,INT16,INT16); COLORREF WINAPI GetPixel32(HDC32,INT32,INT32); #define GetPixel WINELIB_NAME(GetPixel) +INT32 WINAPI GetPixelFormat(HDC32); INT16 WINAPI GetPolyFillMode16(HDC16); INT32 WINAPI GetPolyFillMode32(HDC32); #define GetPolyFillMode WINELIB_NAME(GetPolyFillMode) @@ -7682,7 +7878,7 @@ HINSTANCE16 WINAPI LoadModule16(LPCSTR,LPVOID); DWORD WINAPI LoadModule32(LPCSTR,LPVOID); #define LoadModule WINELIB_NAME(LoadModule) HGLOBAL16 WINAPI LoadResource16(HINSTANCE16,HRSRC16); -HGLOBAL32 WINAPI LoadResource32(HINSTANCE32,HRSRC32); +HGLOBAL32 WINAPI LoadResource32(HMODULE32,HRSRC32); #define LoadResource WINELIB_NAME(LoadResource) INT16 WINAPI LoadString16(HINSTANCE16,UINT16,LPSTR,INT16); INT32 WINAPI LoadString32A(HINSTANCE32,UINT32,LPSTR,INT32); @@ -7852,6 +8048,9 @@ BOOL32 WINAPI PlayMetaFile32(HDC32,HMETAFILE32); VOID WINAPI PlayMetaFileRecord16(HDC16,LPHANDLETABLE16,LPMETARECORD,UINT16); BOOL32 WINAPI PlayMetaFileRecord32(HDC32,LPHANDLETABLE32,LPMETARECORD,UINT32); #define PlayMetaFileRecord WINELIB_NAME(PlayMetaFileRecord) +BOOL16 WINAPI PolyBezier16(HDC16,LPPOINT16,INT16); +BOOL32 WINAPI PolyBezier32(HDC32,LPPOINT32,DWORD); +#define PolyBezier WINELIB_NAME(PolyBezier) BOOL16 WINAPI PolyPolygon16(HDC16,LPPOINT16,LPINT16,UINT16); BOOL32 WINAPI PolyPolygon32(HDC32,LPPOINT32,LPINT32,UINT32); #define PolyPolygon WINELIB_NAME(PolyPolygon) @@ -8166,6 +8365,7 @@ HWND32 WINAPI SetParent32(HWND32,HWND32); COLORREF WINAPI SetPixel16(HDC16,INT16,INT16,COLORREF); COLORREF WINAPI SetPixel32(HDC32,INT32,INT32,COLORREF); #define SetPixel WINELIB_NAME(SetPixel) +BOOL32 WINAPI SetPixelFormat(HDC32,int,PIXELFORMATDESCRIPTOR*); INT16 WINAPI SetPolyFillMode16(HDC16,INT16); INT32 WINAPI SetPolyFillMode32(HDC32,INT32); #define SetPolyFillMode WINELIB_NAME(SetPolyFillMode) @@ -8340,6 +8540,7 @@ INT32 WINAPI StretchDIBits32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32, BOOL16 WINAPI SubtractRect16(LPRECT16,const RECT16*,const RECT16*); BOOL32 WINAPI SubtractRect32(LPRECT32,const RECT32*,const RECT32*); #define SubtractRect WINELIB_NAME(SubtractRect) +BOOL32 WINAPI SwapBuffers(HDC32); BOOL16 WINAPI SwapMouseButton16(BOOL16); BOOL32 WINAPI SwapMouseButton32(BOOL32); #define SwapMouseButton WINELIB_NAME(SwapMouseButton) @@ -8485,6 +8686,10 @@ BOOL16 WINAPI WinHelp16(HWND16,LPCSTR,UINT16,DWORD); BOOL32 WINAPI WinHelp32A(HWND32,LPCSTR,UINT32,DWORD); BOOL32 WINAPI WinHelp32W(HWND32,LPCWSTR,UINT32,DWORD); #define WinHelp WINELIB_NAME_AW(WinHelp) +UINT16 WNetAddConnection16(LPSTR,LPSTR,LPSTR); +UINT32 WNetAddConnection32A(LPSTR,LPSTR,LPSTR); +UINT32 WNetAddConnection32W(LPWSTR,LPWSTR,LPWSTR); +#define WNetAddConnection WINELIB_NAME_AW(WNetAddConnection) INT16 WINAPIV wsnprintf16(LPSTR,UINT16,LPCSTR,...); INT32 WINAPIV wsnprintf32A(LPSTR,UINT32,LPCSTR,...); INT32 WINAPIV wsnprintf32W(LPWSTR,UINT32,LPCWSTR,...); @@ -8530,8 +8735,8 @@ UINT32 WINAPI _lwrite32(HFILE32,LPCSTR,UINT32); HPEN16 WINAPI GetSysColorPen16(INT16); HPEN32 WINAPI GetSysColorPen32(INT32); -INT32 WINAPI LoadMessage32A(HINSTANCE32,UINT32,WORD,LPSTR,INT32); -INT32 WINAPI LoadMessage32W(HINSTANCE32,UINT32,WORD,LPWSTR,INT32); +INT32 WINAPI LoadMessage32A(HMODULE32,UINT32,WORD,LPSTR,INT32); +INT32 WINAPI LoadMessage32W(HMODULE32,UINT32,WORD,LPWSTR,INT32); SEGPTR WINAPI WIN16_GlobalLock16(HGLOBAL16); SEGPTR WINAPI WIN16_LockResource(HGLOBAL16); LONG WINAPI WIN16_hread(HFILE16,SEGPTR,LONG); diff --git a/include/winnls.h b/include/winnls.h index d09bc96dfe7..af6d7de3bd3 100644 --- a/include/winnls.h +++ b/include/winnls.h @@ -5,6 +5,8 @@ #define LOCALE_NOUSEROVERRIDE 0x80000000 #define LOCALE_USE_CP_ACP 0x40000000 +#define LOCALE_LOCALEINFOFLAGSMASK 0xC0000000 + /* When adding new defines, don't forget to add an entry to the * locale2id map in misc/ole2nls.c */ @@ -205,6 +207,14 @@ #define DATE_LONGDATE 0x00000002 /* use long date picture */ #define DATE_USE_ALT_CALENDAR 0x00000004 /* use alternate calendar */ /* alt. calendar support is broken anyway */ +#define TIME_NOSECONDS 0x00000002 /* show no seconds */ +#define TIME_NOMINUTESORSECONDS 0x0000001 /* show no minutes either */ + +/* internal flags for GetDateFormat system */ +#define DATE_DATEVARSONLY 0x00000100 /* only date stuff: yMdg */ +#define TIME_TIMEVARSONLY 0x00000200 /* only time stuff: hHmst */ +/* use this in a WineLib program if you really want all types */ +#define LOCALE_TIMEDATEBOTH 0x00000300 /* full set */ #endif /* __WINE_WINNLS_H */ diff --git a/include/wintypes.h b/include/wintypes.h index 3586b4af756..655f7b23be5 100644 --- a/include/wintypes.h +++ b/include/wintypes.h @@ -9,38 +9,31 @@ #ifdef __WINE__ # include "config.h" -# undef WINELIB # undef UNICODE -#else /* __WINE__ */ -# ifndef WINELIB -# define WINELIB -# endif #endif /* __WINE__ */ /* Macros to map Winelib names to the correct implementation name */ -/* depending on WINELIB and UNICODE macros. */ -/* Note that WINELIB is purely Win32. */ +/* depending on __WINE__ and UNICODE macros. */ +/* Note that Winelib is purely Win32. */ #ifdef __WINE__ # define WINELIB_NAME(func) this is a syntax error # define WINELIB_NAME_AW(func) this is a syntax error #else /* __WINE__ */ -# ifdef WINELIB -# define WINELIB_NAME(func) func##32 -# ifdef UNICODE -# define WINELIB_NAME_AW(func) func##32W -# else -# define WINELIB_NAME_AW(func) func##32A -# endif /* UNICODE */ -# endif /* WINELIB */ +# define WINELIB_NAME(func) func##32 +# ifdef UNICODE +# define WINELIB_NAME_AW(func) func##32W +# else +# define WINELIB_NAME_AW(func) func##32A +# endif /* UNICODE */ #endif /* __WINE__ */ #ifdef __WINE__ # define DECL_WINELIB_TYPE(type) /* nothing */ # define DECL_WINELIB_TYPE_AW(type) /* nothing */ #else /* __WINE__ */ -# define DECL_WINELIB_TYPE(type) typedef WINELIB_NAME(type) type -# define DECL_WINELIB_TYPE_AW(type) typedef WINELIB_NAME_AW(type) type +# define DECL_WINELIB_TYPE(type) typedef WINELIB_NAME(type) type; +# define DECL_WINELIB_TYPE_AW(type) typedef WINELIB_NAME_AW(type) type; #endif /* __WINE__ */ @@ -180,105 +173,105 @@ DECLARE_HANDLE(HKL); typedef LRESULT (CALLBACK *DLGPROC16)(HWND16,UINT16,WPARAM16,LPARAM); typedef LRESULT (CALLBACK *DLGPROC32)(HWND32,UINT32,WPARAM32,LPARAM); -DECL_WINELIB_TYPE(DLGPROC); +DECL_WINELIB_TYPE(DLGPROC) typedef LRESULT (CALLBACK *DRIVERPROC16)(DWORD,HDRVR16,UINT16,LPARAM,LPARAM); typedef LRESULT (CALLBACK *DRIVERPROC32)(DWORD,HDRVR32,UINT32,LPARAM,LPARAM); -DECL_WINELIB_TYPE(DRIVERPROC); +DECL_WINELIB_TYPE(DRIVERPROC) typedef INT16 (CALLBACK *EDITWORDBREAKPROC16)(LPSTR,INT16,INT16,INT16); typedef INT32 (CALLBACK *EDITWORDBREAKPROC32A)(LPSTR,INT32,INT32,INT32); typedef INT32 (CALLBACK *EDITWORDBREAKPROC32W)(LPWSTR,INT32,INT32,INT32); -DECL_WINELIB_TYPE_AW(EDITWORDBREAKPROC); +DECL_WINELIB_TYPE_AW(EDITWORDBREAKPROC) typedef LRESULT (CALLBACK *FARPROC16)(); typedef LRESULT (CALLBACK *FARPROC32)(); -DECL_WINELIB_TYPE(FARPROC); +DECL_WINELIB_TYPE(FARPROC) typedef INT16 (CALLBACK *GOBJENUMPROC16)(SEGPTR,LPARAM); typedef INT32 (CALLBACK *GOBJENUMPROC32)(LPVOID,LPARAM); -DECL_WINELIB_TYPE(GOBJENUMPROC); +DECL_WINELIB_TYPE(GOBJENUMPROC) typedef BOOL16 (CALLBACK *GRAYSTRINGPROC16)(HDC16,LPARAM,INT16); typedef BOOL32 (CALLBACK *GRAYSTRINGPROC32)(HDC32,LPARAM,INT32); -DECL_WINELIB_TYPE(GRAYSTRINGPROC); +DECL_WINELIB_TYPE(GRAYSTRINGPROC) typedef LRESULT (CALLBACK *HOOKPROC16)(INT16,WPARAM16,LPARAM); typedef LRESULT (CALLBACK *HOOKPROC32)(INT32,WPARAM32,LPARAM); -DECL_WINELIB_TYPE(HOOKPROC); +DECL_WINELIB_TYPE(HOOKPROC) typedef VOID (CALLBACK *LINEDDAPROC16)(INT16,INT16,LPARAM); typedef VOID (CALLBACK *LINEDDAPROC32)(INT32,INT32,LPARAM); -DECL_WINELIB_TYPE(LINEDDAPROC); +DECL_WINELIB_TYPE(LINEDDAPROC) typedef BOOL16 (CALLBACK *PROPENUMPROC16)(HWND16,SEGPTR,HANDLE16); typedef BOOL32 (CALLBACK *PROPENUMPROC32A)(HWND32,LPCSTR,HANDLE32); typedef BOOL32 (CALLBACK *PROPENUMPROC32W)(HWND32,LPCWSTR,HANDLE32); -DECL_WINELIB_TYPE_AW(PROPENUMPROC); +DECL_WINELIB_TYPE_AW(PROPENUMPROC) typedef BOOL32 (CALLBACK *PROPENUMPROCEX32A)(HWND32,LPCSTR,HANDLE32,LPARAM); typedef BOOL32 (CALLBACK *PROPENUMPROCEX32W)(HWND32,LPCWSTR,HANDLE32,LPARAM); -DECL_WINELIB_TYPE_AW(PROPENUMPROCEX); +DECL_WINELIB_TYPE_AW(PROPENUMPROCEX) typedef VOID (CALLBACK *TIMERPROC16)(HWND16,UINT16,UINT16,DWORD); typedef VOID (CALLBACK *TIMERPROC32)(HWND32,UINT32,UINT32,DWORD); -DECL_WINELIB_TYPE(TIMERPROC); +DECL_WINELIB_TYPE(TIMERPROC) typedef LRESULT (CALLBACK *WNDENUMPROC16)(HWND16,LPARAM); typedef LRESULT (CALLBACK *WNDENUMPROC32)(HWND32,LPARAM); -DECL_WINELIB_TYPE(WNDENUMPROC); +DECL_WINELIB_TYPE(WNDENUMPROC) typedef LRESULT (CALLBACK *WNDPROC16)(HWND16,UINT16,WPARAM16,LPARAM); typedef LRESULT (CALLBACK *WNDPROC32)(HWND32,UINT32,WPARAM32,LPARAM); -DECL_WINELIB_TYPE(WNDPROC); +DECL_WINELIB_TYPE(WNDPROC) /* TCHAR data types definitions for Winelib. */ /* These types are _not_ defined for the emulator, because they */ /* depend on the UNICODE macro that only exists in user's code. */ #ifndef __WINE__ -# if defined(WINELIB32) && defined(UNICODE) +# ifdef UNICODE typedef WCHAR TCHAR; typedef LPWSTR LPTSTR; typedef LPCWSTR LPCTSTR; -# else /* WINELIB32 && UNICODE */ +# else /* UNICODE */ typedef CHAR TCHAR; typedef LPSTR LPTSTR; typedef LPCSTR LPCTSTR; -# endif /* WINELIB32 && UNICODE */ +# endif /* UNICODE */ #endif /* __WINE__ */ /* Data types specific to the library. These do _not_ exist in the emulator. */ -DECL_WINELIB_TYPE(INT); -DECL_WINELIB_TYPE(LPINT); -DECL_WINELIB_TYPE(LPUINT); -DECL_WINELIB_TYPE(UINT); -DECL_WINELIB_TYPE(BOOL); -DECL_WINELIB_TYPE(WPARAM); +DECL_WINELIB_TYPE(INT) +DECL_WINELIB_TYPE(LPINT) +DECL_WINELIB_TYPE(LPUINT) +DECL_WINELIB_TYPE(UINT) +DECL_WINELIB_TYPE(BOOL) +DECL_WINELIB_TYPE(WPARAM) -DECL_WINELIB_TYPE(HACCEL); -DECL_WINELIB_TYPE(HANDLE); -DECL_WINELIB_TYPE(HBITMAP); -DECL_WINELIB_TYPE(HBRUSH); -DECL_WINELIB_TYPE(HCURSOR); -DECL_WINELIB_TYPE(HDC); -DECL_WINELIB_TYPE(HDROP); -DECL_WINELIB_TYPE(HDRVR); -DECL_WINELIB_TYPE(HDWP); -DECL_WINELIB_TYPE(HENHMETAFILE); -DECL_WINELIB_TYPE(HFILE); -DECL_WINELIB_TYPE(HFONT); -DECL_WINELIB_TYPE(HGDIOBJ); -DECL_WINELIB_TYPE(HGLOBAL); -DECL_WINELIB_TYPE(HICON); -DECL_WINELIB_TYPE(HINSTANCE); -DECL_WINELIB_TYPE(HLOCAL); -DECL_WINELIB_TYPE(HMENU); -DECL_WINELIB_TYPE(HMETAFILE); -DECL_WINELIB_TYPE(HMIDI); -DECL_WINELIB_TYPE(HMIDIIN); -DECL_WINELIB_TYPE(HMIDIOUT); -DECL_WINELIB_TYPE(HMMIO); -DECL_WINELIB_TYPE(HMODULE); -DECL_WINELIB_TYPE(HPALETTE); -DECL_WINELIB_TYPE(HPEN); -DECL_WINELIB_TYPE(HQUEUE); -DECL_WINELIB_TYPE(HRGN); -DECL_WINELIB_TYPE(HRSRC); -DECL_WINELIB_TYPE(HTASK); -DECL_WINELIB_TYPE(HWAVE); -DECL_WINELIB_TYPE(HWAVEIN); -DECL_WINELIB_TYPE(HWAVEOUT); -DECL_WINELIB_TYPE(HWND); +DECL_WINELIB_TYPE(HACCEL) +DECL_WINELIB_TYPE(HANDLE) +DECL_WINELIB_TYPE(HBITMAP) +DECL_WINELIB_TYPE(HBRUSH) +DECL_WINELIB_TYPE(HCURSOR) +DECL_WINELIB_TYPE(HDC) +DECL_WINELIB_TYPE(HDROP) +DECL_WINELIB_TYPE(HDRVR) +DECL_WINELIB_TYPE(HDWP) +DECL_WINELIB_TYPE(HENHMETAFILE) +DECL_WINELIB_TYPE(HFILE) +DECL_WINELIB_TYPE(HFONT) +DECL_WINELIB_TYPE(HGDIOBJ) +DECL_WINELIB_TYPE(HGLOBAL) +DECL_WINELIB_TYPE(HICON) +DECL_WINELIB_TYPE(HINSTANCE) +DECL_WINELIB_TYPE(HLOCAL) +DECL_WINELIB_TYPE(HMENU) +DECL_WINELIB_TYPE(HMETAFILE) +DECL_WINELIB_TYPE(HMIDI) +DECL_WINELIB_TYPE(HMIDIIN) +DECL_WINELIB_TYPE(HMIDIOUT) +DECL_WINELIB_TYPE(HMMIO) +DECL_WINELIB_TYPE(HMODULE) +DECL_WINELIB_TYPE(HPALETTE) +DECL_WINELIB_TYPE(HPEN) +DECL_WINELIB_TYPE(HQUEUE) +DECL_WINELIB_TYPE(HRGN) +DECL_WINELIB_TYPE(HRSRC) +DECL_WINELIB_TYPE(HTASK) +DECL_WINELIB_TYPE(HWAVE) +DECL_WINELIB_TYPE(HWAVEIN) +DECL_WINELIB_TYPE(HWAVEOUT) +DECL_WINELIB_TYPE(HWND) /* Misc. constants. */ diff --git a/include/x11drv.h b/include/x11drv.h index cddfaabd432..78d911dd913 100644 --- a/include/x11drv.h +++ b/include/x11drv.h @@ -94,6 +94,8 @@ extern BOOL32 X11DRV_Polyline( struct tagDC *dc,const LPPOINT32 pt,INT32 count); extern BOOL32 X11DRV_Polygon( struct tagDC *dc, LPPOINT32 pt, INT32 count ); extern BOOL32 X11DRV_PolyPolygon( struct tagDC *dc, LPPOINT32 pt, LPINT32 counts, UINT32 polygons); +extern BOOL32 X11DRV_PolyPolyline( struct tagDC *dc, LPPOINT32 pt, + LPINT32 counts, UINT32 polylines); extern HGDIOBJ32 X11DRV_SelectObject( struct tagDC *dc, HGDIOBJ32 handle ); diff --git a/loader/Makefile.in b/loader/Makefile.in index 549c3c1f8e8..7f0ae305c82 100644 --- a/loader/Makefile.in +++ b/loader/Makefile.in @@ -9,8 +9,6 @@ C_SRCS = \ libres.c \ main.c \ module.c \ - ne_image.c \ - ne_resource.c \ pe_image.c \ pe_resource.c \ resource.c \ diff --git a/loader/libres.c b/loader/libres.c index cc5bd3ad219..5dafc8f8620 100644 --- a/loader/libres.c +++ b/loader/libres.c @@ -6,6 +6,7 @@ #include #include +#include "debug.h" #include "libres.h" #include "heap.h" #include "windows.h" @@ -31,57 +32,9 @@ void LIBRES_RegisterResources(const struct resource* const * Res) } /********************************************************************** - * LIBRES_FindResource16 + * LIBRES_FindResource */ -HRSRC32 LIBRES_FindResource16( HINSTANCE32 hModule, LPCSTR name, LPCSTR type ) -{ - int nameid=0,typeid; - ResListE* ResBlock; - const struct resource* const * Res; - - if(HIWORD(name)) - { - if(*name=='#') - { - nameid=atoi(name+1); - name=NULL; - } - } - else - { - nameid=LOWORD(name); - name=NULL; - } - if(HIWORD(type)) - { - if(*type=='#') - typeid=atoi(type+1); - else - { - fprintf(stderr,"LIBRES_FindResource16(*,*,type=string)"); - return 0; - } - } - else - typeid=LOWORD(type); - - for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next) - for(Res=ResBlock->Resources; *Res; Res++) - if(name) - { - if((*Res)->type==typeid && !lstrcmpi32A((*Res)->name,name)) - return (HRSRC32)*Res; - } - else - if((*Res)->type==typeid && (*Res)->id==nameid) - return (HRSRC32)*Res; - return 0; -} - -/********************************************************************** - * LIBRES_FindResource32 - */ -HRSRC32 LIBRES_FindResource32( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type ) +HRSRC32 LIBRES_FindResource( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type ) { int nameid=0,typeid; ResListE* ResBlock; @@ -112,7 +65,7 @@ HRSRC32 LIBRES_FindResource32( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type ) } else { - fprintf(stderr,"LIBRES_FindResource32(*,*,type=string)"); + TRACE(resource, "(*,*,type=string): Returning 0\n"); return 0; } } @@ -142,34 +95,6 @@ HGLOBAL32 LIBRES_LoadResource( HINSTANCE32 hModule, HRSRC32 hRsrc ) } -/********************************************************************** - * LIBRES_LockResource - */ -LPVOID LIBRES_LockResource( HGLOBAL32 handle ) -{ - return (LPVOID)handle; -} - - -/********************************************************************** - * LIBRES_FreeResource - */ -BOOL32 LIBRES_FreeResource( HGLOBAL32 handle ) -{ - return 0; /* Obsolete in Win32 */ -} - - -/********************************************************************** - * LIBRES_AccessResource - */ -INT32 LIBRES_AccessResource( HINSTANCE32 hModule, HRSRC32 hRsrc ) -{ - fprintf(stderr,"LIBRES_AccessResource()"); - return -1; /* Obsolete in Win32 */ -} - - /********************************************************************** * LIBRES_SizeofResource */ @@ -177,14 +102,3 @@ DWORD LIBRES_SizeofResource( HINSTANCE32 hModule, HRSRC32 hRsrc ) { return (DWORD)(((struct resource*)hRsrc)->size); } - - -/********************************************************************** - * LIBRES_AllocResource - */ -HGLOBAL32 LIBRES_AllocResource( HINSTANCE32 hModule, HRSRC32 hRsrc, DWORD size) -{ - fprintf(stderr,"LIBRES_AllocResource()"); - return 0; /* Obsolete in Win32 */ -} - diff --git a/loader/module.c b/loader/module.c index 1e1db942fdb..63568eebd40 100644 --- a/loader/module.c +++ b/loader/module.c @@ -31,23 +31,48 @@ extern BOOL32 THREAD_InitDone; -static HMODULE16 hFirstModule = 0; +extern HMODULE16 hFirstModule; /* FIXME */ static HMODULE16 hCachedModule = 0; /* Module cached by MODULE_OpenFile */ static HMODULE32 MODULE_LoadModule(LPCSTR name,BOOL32 force) { return 0; } HMODULE32 (*fnBUILTIN_LoadModule)(LPCSTR name,BOOL32 force) = MODULE_LoadModule; -/*********************************************************************** - * MODULE_GetPtr +/************************************************************************* + * MODULE32_LookupHMODULE + * looks for the referenced HMODULE in the current process */ -NE_MODULE *MODULE_GetPtr( HMODULE32 hModule ) -{ - HMODULE16 hnd =MODULE_HANDLEtoHMODULE16(hModule); +WINE_MODREF* +MODULE32_LookupHMODULE(PDB32 *process,HMODULE32 hmod) { + WINE_MODREF *wm; - if (!hnd) - return NULL; - return (NE_MODULE*)GlobalLock16(hnd); + if (!hmod) + return process->exe_modref; + if (!HIWORD(hmod)) { + ERR(module,"tried to lookup 0x%04x in win32 module handler!\n",hmod); + return NULL; + } + for (wm = process->modref_list;wm;wm=wm->next) + if (wm->module == hmod) + return wm; + return NULL; +} + +/*********************************************************************** + * MODULE_GetPtr16 + */ +NE_MODULE *MODULE_GetPtr16( HMODULE16 hModule ) +{ + return (NE_MODULE*)GlobalLock16( GetExePtr(hModule) ); +} + + +/*********************************************************************** + * MODULE_GetPtr32 + */ +NE_MODULE *MODULE_GetPtr32( HMODULE32 hModule ) +{ + return (NE_MODULE*)GlobalLock16( MODULE_HANDLEtoHMODULE16(hModule) ); } /*********************************************************************** @@ -59,6 +84,7 @@ MODULE_HANDLEtoHMODULE16(HANDLE32 handle) { if (HIWORD(handle)) { + WARN(module,"looking up 0x%08x in win16 function!\n",handle); /* this is a HMODULE32 */ /* walk the list looking for the correct startaddress */ @@ -73,192 +99,6 @@ MODULE_HANDLEtoHMODULE16(HANDLE32 handle) { return GetExePtr(handle); } -/*********************************************************************** - * MODULE_HANDLEtoHMODULE32 - * return HMODULE32, if possible, HMODULE16 otherwise - */ -HMODULE32 -MODULE_HANDLEtoHMODULE32(HANDLE32 handle) { - NE_MODULE *pModule; - - if (HIWORD(handle)) - return (HMODULE32)handle; - else { - handle = GetExePtr(handle); - if (!handle) - return 0; - pModule = (NE_MODULE *)GlobalLock16( handle ); - if (!pModule) - return 0; - - if (pModule->module32) return pModule->module32; - return handle; - } -} - -/*********************************************************************** - * MODULE_DumpModule - */ -void MODULE_DumpModule( HMODULE32 hModule ) -{ - int i, ordinal; - SEGTABLEENTRY *pSeg; - BYTE *pstr; - WORD *pword; - NE_MODULE *pModule; - - if (!(pModule = MODULE_GetPtr( hModule ))) - { - fprintf( stderr, "**** %04x is not a module handle\n", hModule ); - return; - } - - /* Dump the module info */ - DUMP( "---\n" ); - DUMP( "Module %04x:\n", hModule ); - DUMP( "count=%d flags=%04x heap=%d stack=%d\n", - pModule->count, pModule->flags, - pModule->heap_size, pModule->stack_size ); - DUMP( "cs:ip=%04x:%04x ss:sp=%04x:%04x ds=%04x nb seg=%d modrefs=%d\n", - pModule->cs, pModule->ip, pModule->ss, pModule->sp, pModule->dgroup, - pModule->seg_count, pModule->modref_count ); - DUMP( "os_flags=%d swap_area=%d version=%04x\n", - pModule->os_flags, pModule->min_swap_area, - pModule->expected_version ); - if (pModule->flags & NE_FFLAGS_WIN32) - DUMP( "PE module=%08x\n", pModule->module32 ); - - /* Dump the file info */ - DUMP( "---\n" ); - DUMP( "Filename: '%s'\n", NE_MODULE_NAME(pModule) ); - - /* Dump the segment table */ - DUMP( "---\n" ); - DUMP( "Segment table:\n" ); - pSeg = NE_SEG_TABLE( pModule ); - for (i = 0; i < pModule->seg_count; i++, pSeg++) - DUMP( "%02x: pos=%d size=%d flags=%04x minsize=%d sel=%04x\n", - i + 1, pSeg->filepos, pSeg->size, pSeg->flags, - pSeg->minsize, pSeg->selector ); - - /* Dump the resource table */ - DUMP( "---\n" ); - DUMP( "Resource table:\n" ); - if (pModule->res_table) - { - pword = (WORD *)((BYTE *)pModule + pModule->res_table); - DUMP( "Alignment: %d\n", *pword++ ); - while (*pword) - { - struct resource_typeinfo_s *ptr = (struct resource_typeinfo_s *)pword; - struct resource_nameinfo_s *pname = (struct resource_nameinfo_s *)(ptr + 1); - DUMP( "id=%04x count=%d\n", ptr->type_id, ptr->count ); - for (i = 0; i < ptr->count; i++, pname++) - DUMP( "offset=%d len=%d id=%04x\n", - pname->offset, pname->length, pname->id ); - pword = (WORD *)pname; - } - } - else DUMP( "None\n" ); - - /* Dump the resident name table */ - DUMP( "---\n" ); - DUMP( "Resident-name table:\n" ); - pstr = (char *)pModule + pModule->name_table; - while (*pstr) - { - DUMP( "%*.*s: %d\n", *pstr, *pstr, pstr + 1, - *(WORD *)(pstr + *pstr + 1) ); - pstr += *pstr + 1 + sizeof(WORD); - } - - /* Dump the module reference table */ - DUMP( "---\n" ); - DUMP( "Module ref table:\n" ); - if (pModule->modref_table) - { - pword = (WORD *)((BYTE *)pModule + pModule->modref_table); - for (i = 0; i < pModule->modref_count; i++, pword++) - { - DUMP( "%d: %04x -> '%s'\n", i, *pword, - MODULE_GetModuleName(*pword)); - } - } - else DUMP( "None\n" ); - - /* Dump the entry table */ - DUMP( "---\n" ); - DUMP( "Entry table:\n" ); - pstr = (char *)pModule + pModule->entry_table; - ordinal = 1; - while (*pstr) - { - DUMP( "Bundle %d-%d: %02x\n", ordinal, ordinal + *pstr - 1, pstr[1]); - if (!pstr[1]) - { - ordinal += *pstr; - pstr += 2; - } - else if ((BYTE)pstr[1] == 0xff) /* moveable */ - { - struct entry_tab_movable_s *pe = (struct entry_tab_movable_s*)(pstr+2); - for (i = 0; i < *pstr; i++, pe++) - DUMP( "%d: %02x:%04x (moveable)\n", - ordinal++, pe->seg_number, pe->offset ); - pstr = (char *)pe; - } - else /* fixed */ - { - struct entry_tab_fixed_s *pe = (struct entry_tab_fixed_s*)(pstr+2); - for (i = 0; i < *pstr; i++, pe++) - DUMP( "%d: %04x (fixed)\n", - ordinal++, pe->offset[0] + (pe->offset[1] << 8) ); - pstr = (char *)pe; - } - } - - /* Dump the non-resident names table */ - DUMP( "---\n" ); - DUMP( "Non-resident names table:\n" ); - if (pModule->nrname_handle) - { - pstr = (char *)GlobalLock16( pModule->nrname_handle ); - while (*pstr) - { - DUMP( "%*.*s: %d\n", *pstr, *pstr, pstr + 1, - *(WORD *)(pstr + *pstr + 1) ); - pstr += *pstr + 1 + sizeof(WORD); - } - } - DUMP( "\n" ); -} - - -/*********************************************************************** - * MODULE_WalkModules - * - * Walk the module list and print the modules. - */ -void MODULE_WalkModules(void) -{ - HMODULE16 hModule = hFirstModule; - fprintf( stderr, "Module Flags Name\n" ); - while (hModule) - { - NE_MODULE *pModule = MODULE_GetPtr( hModule ); - if (!pModule) - { - fprintf( stderr, "**** Bad module %04x in list\n", hModule ); - return; - } - fprintf( stderr, " %04x %04x %.*s\n", hModule, pModule->flags, - *((char *)pModule + pModule->name_table), - (char *)pModule + pModule->name_table + 1 ); - hModule = pModule->next; - } -} - - /*********************************************************************** * MODULE_OpenFile */ @@ -273,14 +113,14 @@ int MODULE_OpenFile( HMODULE32 hModule ) hModule = MODULE_HANDLEtoHMODULE16(hModule); TRACE(module, "(%04x) cache: mod=%04x fd=%d\n", hModule, hCachedModule, cachedfd ); - if (!(pModule = MODULE_GetPtr( hModule ))) return -1; + if (!(pModule = MODULE_GetPtr32( hModule ))) return -1; if (hCachedModule == hModule) return cachedfd; close( cachedfd ); hCachedModule = hModule; name = NE_MODULE_NAME( pModule ); if (!DOSFS_GetFullName( name, TRUE, &full_name ) || (cachedfd = open( full_name.long_name, O_RDONLY )) == -1) - fprintf( stderr, "MODULE_OpenFile: can't open file '%s' for module %04x\n", + WARN( module, "Can't open file '%s' for module %04x\n", name, hModule ); TRACE(module, "opened '%s' -> %d\n", name, cachedfd ); @@ -288,113 +128,34 @@ int MODULE_OpenFile( HMODULE32 hModule ) } -/*********************************************************************** - * MODULE_Ne2MemFlags - * - * This function translates NE segment flags to GlobalAlloc flags - */ -static WORD MODULE_Ne2MemFlags(WORD flags) -{ - WORD memflags = 0; -#if 0 - if (flags & NE_SEGFLAGS_DISCARDABLE) - memflags |= GMEM_DISCARDABLE; - if (flags & NE_SEGFLAGS_MOVEABLE || - ( ! (flags & NE_SEGFLAGS_DATA) && - ! (flags & NE_SEGFLAGS_LOADED) && - ! (flags & NE_SEGFLAGS_ALLOCATED) - ) - ) - memflags |= GMEM_MOVEABLE; - memflags |= GMEM_ZEROINIT; -#else - memflags = GMEM_ZEROINIT | GMEM_FIXED; - return memflags; -#endif -} - -/*********************************************************************** - * MODULE_AllocateSegment (WPROCS.26) - */ - -DWORD WINAPI MODULE_AllocateSegment(WORD wFlags, WORD wSize, WORD wElem) -{ - WORD size = wSize << wElem; - HANDLE16 hMem = GlobalAlloc16( MODULE_Ne2MemFlags(wFlags), size); - return MAKELONG( hMem, GlobalHandleToSel(hMem) ); -} - -/*********************************************************************** - * MODULE_CreateSegments - */ -static BOOL32 MODULE_CreateSegments( HMODULE32 hModule ) -{ - SEGTABLEENTRY *pSegment; - NE_MODULE *pModule; - int i, minsize; - - if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE; - pSegment = NE_SEG_TABLE( pModule ); - for (i = 1; i <= pModule->seg_count; i++, pSegment++) - { - minsize = pSegment->minsize ? pSegment->minsize : 0x10000; - if (i == pModule->ss) minsize += pModule->stack_size; - /* The DGROUP is allocated by MODULE_CreateInstance */ - if (i == pModule->dgroup) continue; - pSegment->selector = GLOBAL_Alloc( MODULE_Ne2MemFlags(pSegment->flags), - minsize, hModule, - !(pSegment->flags & NE_SEGFLAGS_DATA), - FALSE, - FALSE /*pSegment->flags & NE_SEGFLAGS_READONLY*/ ); - if (!pSegment->selector) return FALSE; - } - - pModule->dgroup_entry = pModule->dgroup ? pModule->seg_table + - (pModule->dgroup - 1) * sizeof(SEGTABLEENTRY) : 0; - return TRUE; -} - - -/*********************************************************************** - * MODULE_GetInstance - */ -HINSTANCE16 MODULE_GetInstance( HMODULE32 hModule ) -{ - SEGTABLEENTRY *pSegment; - NE_MODULE *pModule; - - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; - if (pModule->dgroup == 0) return hModule; - - pSegment = NE_SEG_TABLE( pModule ) + pModule->dgroup - 1; - - return pSegment->selector; -} - - /*********************************************************************** * MODULE_CreateInstance * * If lib_only is TRUE, handle the module like a library even if it is a .EXE */ -HINSTANCE16 MODULE_CreateInstance( HMODULE16 hModule, BOOL32 lib_only ) +HINSTANCE16 MODULE_CreateInstance( HMODULE16 hModule, HINSTANCE16 *prev, + BOOL32 lib_only ) { SEGTABLEENTRY *pSegment; NE_MODULE *pModule; int minsize; - HINSTANCE16 hNewInstance, hPrevInstance; + HINSTANCE16 hNewInstance; - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; - if (pModule->dgroup == 0) return hModule; + if (!(pModule = MODULE_GetPtr16( hModule ))) return 0; + if (pModule->dgroup == 0) + { + if (prev) *prev = hModule; + return hModule; + } pSegment = NE_SEG_TABLE( pModule ) + pModule->dgroup - 1; - hPrevInstance = pSegment->selector; + if (prev) *prev = pSegment->selector; /* if it's a library, create a new instance only the first time */ - if (hPrevInstance) + if (pSegment->selector) { - if (pModule->flags & NE_FFLAGS_LIBMODULE) return hPrevInstance; - if (lib_only) return hPrevInstance; + if (pModule->flags & NE_FFLAGS_LIBMODULE) return pSegment->selector; + if (lib_only) return pSegment->selector; } minsize = pSegment->minsize ? pSegment->minsize : 0x10000; @@ -491,431 +252,11 @@ HMODULE32 MODULE_CreateDummyModule( const OFSTRUCT *ofs ) pModule->res_table = pModule->import_table = pModule->entry_table = (int)pStr - (int)pModule; - MODULE_RegisterModule( pModule ); + NE_RegisterModule( pModule ); return hModule; } -/*********************************************************************** - * MODULE_LoadExeHeader - */ -static HMODULE32 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs ) -{ - IMAGE_DOS_HEADER mz_header; - IMAGE_OS2_HEADER ne_header; - int size; - HMODULE32 hModule; - NE_MODULE *pModule; - BYTE *pData; - char *buffer, *fastload = NULL; - int fastload_offset = 0, fastload_length = 0; - - /* Read a block from either the file or the fast-load area. */ -#define READ(offset,size,buffer) \ - ((fastload && ((offset) >= fastload_offset) && \ - ((offset)+(size) <= fastload_offset+fastload_length)) ? \ - (memcpy( buffer, fastload+(offset)-fastload_offset, (size) ), TRUE) : \ - (_llseek32( hFile, (offset), SEEK_SET), \ - _lread32( hFile, (buffer), (size) ) == (size))) - - _llseek32( hFile, 0, SEEK_SET ); - if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) || - (mz_header.e_magic != IMAGE_DOS_SIGNATURE)) - return (HMODULE32)11; /* invalid exe */ - - _llseek32( hFile, mz_header.e_lfanew, SEEK_SET ); - if (_lread32( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header)) - return (HMODULE32)11; /* invalid exe */ - - if (ne_header.ne_magic == IMAGE_NT_SIGNATURE) return (HMODULE32)21; /* win32 exe */ - if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE) return (HMODULE32)11; /* invalid exe */ - - if (ne_header.ne_magic == IMAGE_OS2_SIGNATURE_LX) { - fprintf(stderr, "Sorry, this is an OS/2 linear executable (LX) file !\n"); - return (HMODULE32)12; - } - - /* We now have a valid NE header */ - - size = sizeof(NE_MODULE) + - /* loaded file info */ - sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1+ - /* segment table */ - ne_header.n_segment_tab * sizeof(SEGTABLEENTRY) + - /* resource table */ - ne_header.rname_tab_offset - ne_header.resource_tab_offset + - /* resident names table */ - ne_header.moduleref_tab_offset - ne_header.rname_tab_offset + - /* module ref table */ - ne_header.n_mod_ref_tab * sizeof(WORD) + - /* imported names table */ - ne_header.entry_tab_offset - ne_header.iname_tab_offset + - /* entry table length */ - ne_header.entry_tab_length; - - hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size ); - if (!hModule) return (HMODULE32)11; /* invalid exe */ - FarSetOwner( hModule, hModule ); - pModule = (NE_MODULE *)GlobalLock16( hModule ); - memcpy( pModule, &ne_header, sizeof(ne_header) ); - pModule->count = 0; - pModule->module32 = 0; - pModule->self = hModule; - pModule->self_loading_sel = 0; - pData = (BYTE *)(pModule + 1); - - /* Clear internal Wine flags in case they are set in the EXE file */ - - pModule->flags &= ~(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32|NE_FFLAGS_IMPLICIT); - - /* Read the fast-load area */ - - if (ne_header.additional_flags & NE_AFLAGS_FASTLOAD) - { - fastload_offset=ne_header.fastload_offset<fileinfo = (int)pData - (int)pModule; - size = sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1; - memcpy( pData, ofs, size ); - ((OFSTRUCT *)pData)->cBytes = size - 1; - pData += size; - - /* Get the segment table */ - - pModule->seg_table = (int)pData - (int)pModule; - buffer = HeapAlloc( SystemHeap, 0, ne_header.n_segment_tab * - sizeof(struct ne_segment_table_entry_s)); - if (buffer) - { - int i; - struct ne_segment_table_entry_s *pSeg; - - if (!READ( mz_header.e_lfanew + ne_header.segment_tab_offset, - ne_header.n_segment_tab * sizeof(struct ne_segment_table_entry_s), - buffer )) - { - HeapFree( SystemHeap, 0, buffer ); - if (fastload) HeapFree( SystemHeap, 0, fastload ); - GlobalFree16( hModule ); - return (HMODULE32)11; /* invalid exe */ - } - pSeg = (struct ne_segment_table_entry_s *)buffer; - for (i = ne_header.n_segment_tab; i > 0; i--, pSeg++) - { - memcpy( pData, pSeg, sizeof(*pSeg) ); - pData += sizeof(SEGTABLEENTRY); - } - HeapFree( SystemHeap, 0, buffer ); - } - else - { - if (fastload) HeapFree( SystemHeap, 0, fastload ); - GlobalFree16( hModule ); - return (HMODULE32)11; /* invalid exe */ - } - - /* Get the resource table */ - - if (ne_header.resource_tab_offset < ne_header.rname_tab_offset) - { - pModule->res_table = (int)pData - (int)pModule; - if (!READ(mz_header.e_lfanew + ne_header.resource_tab_offset, - ne_header.rname_tab_offset - ne_header.resource_tab_offset, - pData )) return (HMODULE32)11; /* invalid exe */ - pData += ne_header.rname_tab_offset - ne_header.resource_tab_offset; - NE_InitResourceHandler( hModule ); - } - else pModule->res_table = 0; /* No resource table */ - - /* Get the resident names table */ - - pModule->name_table = (int)pData - (int)pModule; - if (!READ( mz_header.e_lfanew + ne_header.rname_tab_offset, - ne_header.moduleref_tab_offset - ne_header.rname_tab_offset, - pData )) - { - if (fastload) HeapFree( SystemHeap, 0, fastload ); - GlobalFree16( hModule ); - return (HMODULE32)11; /* invalid exe */ - } - pData += ne_header.moduleref_tab_offset - ne_header.rname_tab_offset; - - /* Get the module references table */ - - if (ne_header.n_mod_ref_tab > 0) - { - pModule->modref_table = (int)pData - (int)pModule; - if (!READ( mz_header.e_lfanew + ne_header.moduleref_tab_offset, - ne_header.n_mod_ref_tab * sizeof(WORD), - pData )) - { - if (fastload) HeapFree( SystemHeap, 0, fastload ); - GlobalFree16( hModule ); - return (HMODULE32)11; /* invalid exe */ - } - pData += ne_header.n_mod_ref_tab * sizeof(WORD); - } - else pModule->modref_table = 0; /* No module references */ - - /* Get the imported names table */ - - pModule->import_table = (int)pData - (int)pModule; - if (!READ( mz_header.e_lfanew + ne_header.iname_tab_offset, - ne_header.entry_tab_offset - ne_header.iname_tab_offset, - pData )) - { - if (fastload) HeapFree( SystemHeap, 0, fastload ); - GlobalFree16( hModule ); - return (HMODULE32)11; /* invalid exe */ - } - pData += ne_header.entry_tab_offset - ne_header.iname_tab_offset; - - /* Get the entry table */ - - pModule->entry_table = (int)pData - (int)pModule; - if (!READ( mz_header.e_lfanew + ne_header.entry_tab_offset, - ne_header.entry_tab_length, - pData )) - { - if (fastload) HeapFree( SystemHeap, 0, fastload ); - GlobalFree16( hModule ); - return (HMODULE32)11; /* invalid exe */ - } - pData += ne_header.entry_tab_length; - - /* Free the fast-load area */ - -#undef READ - if (fastload) HeapFree( SystemHeap, 0, fastload ); - - /* Get the non-resident names table */ - - if (ne_header.nrname_tab_length) - { - pModule->nrname_handle = GLOBAL_Alloc( 0, ne_header.nrname_tab_length, - hModule, FALSE, FALSE, FALSE ); - if (!pModule->nrname_handle) - { - GlobalFree16( hModule ); - return (HMODULE32)11; /* invalid exe */ - } - buffer = GlobalLock16( pModule->nrname_handle ); - _llseek32( hFile, ne_header.nrname_tab_offset, SEEK_SET ); - if (_lread32( hFile, buffer, ne_header.nrname_tab_length ) - != ne_header.nrname_tab_length) - { - GlobalFree16( pModule->nrname_handle ); - GlobalFree16( hModule ); - return (HMODULE32)11; /* invalid exe */ - } - } - else pModule->nrname_handle = 0; - - /* Allocate a segment for the implicitly-loaded DLLs */ - - if (pModule->modref_count) - { - pModule->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT, - (pModule->modref_count+1)*sizeof(HMODULE32), - hModule, FALSE, FALSE, FALSE ); - if (!pModule->dlls_to_init) - { - if (pModule->nrname_handle) GlobalFree16( pModule->nrname_handle ); - GlobalFree16( hModule ); - return (HMODULE32)11; /* invalid exe */ - } - } - else pModule->dlls_to_init = 0; - - MODULE_RegisterModule( pModule ); - return hModule; -} - - -/*********************************************************************** - * MODULE_GetOrdinal - * - * Lookup the ordinal for a given name. - */ -WORD MODULE_GetOrdinal( HMODULE32 hModule, const char *name ) -{ - unsigned char buffer[256], *cpnt; - BYTE len; - NE_MODULE *pModule; - - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; - - TRACE(module, "(%04x,'%s')\n", - hModule, name ); - - /* First handle names of the form '#xxxx' */ - - if (name[0] == '#') return atoi( name + 1 ); - - /* Now copy and uppercase the string */ - - strcpy( buffer, name ); - CharUpper32A( buffer ); - len = strlen( buffer ); - - /* First search the resident names */ - - cpnt = (char *)pModule + pModule->name_table; - - /* Skip the first entry (module name) */ - cpnt += *cpnt + 1 + sizeof(WORD); - while (*cpnt) - { - if (((BYTE)*cpnt == len) && !memcmp( cpnt+1, buffer, len )) - { - TRACE(module, " Found: ordinal=%d\n", - *(WORD *)(cpnt + *cpnt + 1) ); - return *(WORD *)(cpnt + *cpnt + 1); - } - cpnt += *cpnt + 1 + sizeof(WORD); - } - - /* Now search the non-resident names table */ - - if (!pModule->nrname_handle) return 0; /* No non-resident table */ - cpnt = (char *)GlobalLock16( pModule->nrname_handle ); - - /* Skip the first entry (module description string) */ - cpnt += *cpnt + 1 + sizeof(WORD); - while (*cpnt) - { - if (((BYTE)*cpnt == len) && !memcmp( cpnt+1, buffer, len )) - { - TRACE(module, " Found: ordinal=%d\n", - *(WORD *)(cpnt + *cpnt + 1) ); - return *(WORD *)(cpnt + *cpnt + 1); - } - cpnt += *cpnt + 1 + sizeof(WORD); - } - return 0; -} - - -/*********************************************************************** - * MODULE_GetEntryPoint - * - * Return the entry point for a given ordinal. - */ -FARPROC16 MODULE_GetEntryPoint( HMODULE32 hModule, WORD ordinal ) -{ - NE_MODULE *pModule; - WORD curOrdinal = 1; - BYTE *p; - WORD sel, offset; - - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; - - p = (BYTE *)pModule + pModule->entry_table; - while (*p && (curOrdinal + *p <= ordinal)) - { - /* Skipping this bundle */ - curOrdinal += *p; - switch(p[1]) - { - case 0: p += 2; break; /* unused */ - case 0xff: p += 2 + *p * 6; break; /* moveable */ - default: p += 2 + *p * 3; break; /* fixed */ - } - } - if (!*p) return 0; - - switch(p[1]) - { - case 0: /* unused */ - return 0; - case 0xff: /* moveable */ - p += 2 + 6 * (ordinal - curOrdinal); - sel = p[3]; - offset = *(WORD *)(p + 4); - break; - default: /* fixed */ - sel = p[1]; - p += 2 + 3 * (ordinal - curOrdinal); - offset = *(WORD *)(p + 1); - break; - } - - if (sel == 0xfe) sel = 0xffff; /* constant entry */ - else sel = (WORD)(DWORD)NE_SEG_TABLE(pModule)[sel-1].selector; - return (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset ); -} - - -/*********************************************************************** - * EntryAddrProc (WPROCS.27) - */ -FARPROC16 WINAPI EntryAddrProc( HMODULE16 hModule, WORD ordinal ) -{ - return MODULE_GetEntryPoint( hModule, ordinal ); -} - - -/*********************************************************************** - * MODULE_SetEntryPoint - * - * Change the value of an entry point. Use with caution! - * It can only change the offset value, not the selector. - */ -BOOL16 MODULE_SetEntryPoint( HMODULE32 hModule, WORD ordinal, WORD offset ) -{ - NE_MODULE *pModule; - WORD curOrdinal = 1; - BYTE *p; - - if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE; - - p = (BYTE *)pModule + pModule->entry_table; - while (*p && (curOrdinal + *p <= ordinal)) - { - /* Skipping this bundle */ - curOrdinal += *p; - switch(p[1]) - { - case 0: p += 2; break; /* unused */ - case 0xff: p += 2 + *p * 6; break; /* moveable */ - default: p += 2 + *p * 3; break; /* fixed */ - } - } - if (!*p) return FALSE; - - switch(p[1]) - { - case 0: /* unused */ - return FALSE; - case 0xff: /* moveable */ - p += 2 + 6 * (ordinal - curOrdinal); - *(WORD *)(p + 4) = offset; - break; - default: /* fixed */ - p += 2 + 3 * (ordinal - curOrdinal); - *(WORD *)(p + 1) = offset; - break; - } - return TRUE; -} - - /*********************************************************************** * MODULE_GetWndProcEntry16 (not a Windows API function) * @@ -950,7 +291,7 @@ FARPROC16 MODULE_GetWndProcEntry16( LPCSTR name ) return (FARPROC16)PrintSetupDlgProc; if (!strcmp(name,"ReplaceTextDlgProc")) return (FARPROC16)ReplaceTextDlgProc16; - fprintf(stderr,"warning: No mapping for %s(), add one in library/miscstubs.c\n",name); + WARN(module,"No mapping for %s(), add one in library/miscstubs.c\n",name); assert( FALSE ); return NULL; } @@ -960,10 +301,10 @@ FARPROC16 MODULE_GetWndProcEntry16( LPCSTR name ) static HMODULE32 hModule = 0; if (!hModule) hModule = GetModuleHandle16( "WPROCS" ); - ordinal = MODULE_GetOrdinal( hModule, name ); - if (!(ret = MODULE_GetEntryPoint( hModule, ordinal ))) + ordinal = NE_GetOrdinal( hModule, name ); + if (!(ret = NE_GetEntryPoint( hModule, ordinal ))) { - fprintf( stderr, "GetWndProc16: %s not found\n", name ); + WARN( module, "%s not found\n", name ); assert( FALSE ); } } @@ -980,7 +321,7 @@ LPSTR MODULE_GetModuleName( HMODULE32 hModule ) BYTE *p, len; static char buffer[10]; - if (!(pModule = MODULE_GetPtr( hModule ))) return NULL; + if (!(pModule = MODULE_GetPtr32( hModule ))) return NULL; p = (BYTE *)pModule + pModule->name_table; len = MIN( *p, 8 ); memcpy( buffer, p + 1, len ); @@ -989,26 +330,20 @@ LPSTR MODULE_GetModuleName( HMODULE32 hModule ) } -/********************************************************************** - * MODULE_RegisterModule - */ -void MODULE_RegisterModule( NE_MODULE *pModule ) -{ - pModule->next = hFirstModule; - hFirstModule = pModule->self; -} - - /********************************************************************** * MODULE_FindModule * * Find a module from a path name. + * RETURNS + * the win16 module handle if found + * 0 if not */ -HMODULE32 MODULE_FindModule( LPCSTR path ) -{ +HMODULE32 MODULE_FindModule16( + LPCSTR path /* [in] path of the module to be found */ +) { HMODULE32 hModule = hFirstModule; - LPCSTR filename, dotptr, modulepath, modulename; - BYTE len, *name_table; + LPCSTR filename, dotptr, modulepath, modulename; + BYTE len, *name_table; if (!(filename = strrchr( path, '\\' ))) filename = path; else filename++; @@ -1018,7 +353,7 @@ HMODULE32 MODULE_FindModule( LPCSTR path ) while(hModule) { - NE_MODULE *pModule = MODULE_GetPtr( hModule ); + NE_MODULE *pModule = MODULE_GetPtr16( hModule ); if (!pModule) break; modulepath = NE_MODULE_NAME(pModule); if (!(modulename = strrchr( modulepath, '\\' ))) @@ -1034,6 +369,62 @@ HMODULE32 MODULE_FindModule( LPCSTR path ) return 0; } +/********************************************************************** + * MODULE_FindModule32 + * + * Find a (loaded) win32 module depending on path + * The handling of '.' is a bit weird, but we need it that way, + * for sometimes the programs use '.exe' and '.dll' and + * this is the only way to differentiate. (mainly hypertrm.exe) + * + * RETURNS + * the module handle if found + * 0 if not + */ +HMODULE32 MODULE_FindModule32( + PDB32* process, /* [in] process in which to find the library */ + LPCSTR path /* [in] pathname of module/library to be found */ +) { + LPSTR filename; + LPSTR dotptr; + WINE_MODREF *wm; + + if (!(filename = strrchr( path, '\\' ))) + filename = HEAP_strdupA(process->heap,0,path); + else + filename = HEAP_strdupA(process->heap,0,filename+1); + dotptr=strrchr(filename,'.'); + + if (!process) { + HeapFree(process->heap,0,filename); + return 0; + } + for (wm=process->modref_list;wm;wm=wm->next) { + LPSTR xmodname,xdotptr; + + assert (wm->modname); + xmodname = HEAP_strdupA(process->heap,0,wm->modname); + xdotptr=strrchr(xmodname,'.'); + if ( (xdotptr && !dotptr) || + (!xdotptr && dotptr) + ) { + if (dotptr) *dotptr = '\0'; + if (xdotptr) *xdotptr = '\0'; + } + if (!lstrcmpi32A( filename, xmodname)) { + HeapFree(process->heap,0,filename); + HeapFree(process->heap,0,xmodname); + return wm->module; + } + if (dotptr) *dotptr='.'; + /* FIXME: add paths, shortname */ + HeapFree(process->heap,0,xmodname); + } + HeapFree(process->heap,0,filename); + return 0; +} + + /********************************************************************** * MODULE_CallWEP @@ -1044,9 +435,9 @@ HMODULE32 MODULE_FindModule( LPCSTR path ) static BOOL16 MODULE_CallWEP( HMODULE16 hModule ) { FARPROC16 WEP = (FARPROC16)0; - WORD ordinal = MODULE_GetOrdinal( hModule, "WEP" ); + WORD ordinal = NE_GetOrdinal( hModule, "WEP" ); - if (ordinal) WEP = MODULE_GetEntryPoint( hModule, ordinal ); + if (ordinal) WEP = NE_GetEntryPoint( hModule, ordinal ); if (!WEP) { WARN(module, "module %04x doesn't have a WEP\n", hModule ); @@ -1069,7 +460,7 @@ BOOL16 MODULE_FreeModule( HMODULE32 hModule, TDB* pTaskContext ) HMODULE16 *pModRef; int i; - if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE; + if (!(pModule = MODULE_GetPtr32( hModule ))) return FALSE; hModule = pModule->self; if (((INT16)(--pModule->count)) > 0 ) return TRUE; @@ -1100,7 +491,7 @@ BOOL16 MODULE_FreeModule( HMODULE32 hModule, TDB* pTaskContext ) hPrevModule = &hFirstModule; while (*hPrevModule && (*hPrevModule != hModule)) { - hPrevModule = &(MODULE_GetPtr( *hPrevModule ))->next; + hPrevModule = &(MODULE_GetPtr16( *hPrevModule ))->next; } if (*hPrevModule) *hPrevModule = pModule->next; @@ -1157,12 +548,12 @@ HINSTANCE16 MODULE_Load( LPCSTR name, UINT16 uFlags, lstrcpyn32A( ofs.szPathName, name, sizeof(ofs.szPathName) ); if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) return hModule; pModule = (NE_MODULE *)GlobalLock16( hModule ); - hPrevInstance = 0; - hInstance = MODULE_CreateInstance( hModule, (cmd_line == NULL) ); + hInstance = MODULE_CreateInstance( hModule, &hPrevInstance, + (cmd_line == NULL) ); } else { - hModule = MODULE_FindModule( name ); + hModule = MODULE_FindModule16( name ); if (!hModule) /* We have to load the module */ { @@ -1175,7 +566,7 @@ HINSTANCE16 MODULE_Load( LPCSTR name, UINT16 uFlags, /* Now try the built-in even if disabled */ if ((hModule = fnBUILTIN_LoadModule( name, TRUE ))) { - fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name ); + WARN(module, "Could not load Windows DLL '%s', using built-in module.\n", name ); return MODULE_HANDLEtoHMODULE16( hModule ); } return 2; /* File not found */ @@ -1183,59 +574,26 @@ HINSTANCE16 MODULE_Load( LPCSTR name, UINT16 uFlags, /* Create the module structure */ - hModule = MODULE_LoadExeHeader( hFile, &ofs ); + hModule = NE_LoadModule( hFile, &ofs, uFlags, cmd_line, + env, show_cmd ); if (hModule < 32) { if ((hModule == 21) && cmd_line) hModule = PE_LoadModule( hFile, &ofs, cmd_line, env, show_cmd ); - _lclose32( hFile ); - - if (hModule < 32) - fprintf( stderr, "LoadModule: can't load '%s', error=%d\n", - name, hModule ); - return hModule; } + + if (hModule < 32) + fprintf( stderr, "LoadModule: can't load '%s', error=%d\n", + name, hModule ); _lclose32( hFile ); - pModule = MODULE_GetPtr( hModule ); - pModule->flags |= uFlags; /* stamp implicitly loaded modules */ - - /* Allocate the segments for this module */ - - MODULE_CreateSegments( hModule ); - hPrevInstance = 0; - hInstance = MODULE_CreateInstance( hModule, (cmd_line == NULL) ); - - /* Load the referenced DLLs */ - - if (!NE_LoadDLLs( pModule )) return 2; /* File not found */ - - /* Load the segments */ - - NE_LoadAllSegments( pModule ); - - /* Fixup the functions prologs */ - - NE_FixupPrologs( pModule ); - - /* Make sure the usage count is 1 on the first loading of */ - /* the module, even if it contains circular DLL references */ - - pModule->count = 1; - - /* Call initialization rountines for all loaded DLLs. Note that - * when we load implicitly linked DLLs this will be done by InitTask(). - */ - - if ((pModule->flags & (NE_FFLAGS_LIBMODULE | NE_FFLAGS_IMPLICIT)) == - NE_FFLAGS_LIBMODULE ) - NE_InitializeDLLs( hModule ); + return hModule; } else /* module is already loaded, just create a new data segment if it's a task */ { - pModule = MODULE_GetPtr( hModule ); - hPrevInstance = MODULE_GetInstance( hModule ); - hInstance = MODULE_CreateInstance( hModule, (cmd_line == NULL) ); + pModule = MODULE_GetPtr32( hModule ); + hInstance = MODULE_CreateInstance( hModule, &hPrevInstance, + (cmd_line == NULL) ); if (hInstance != hPrevInstance) /* not a library */ NE_LoadSegment( pModule, pModule->dgroup ); pModule->count++; @@ -1337,7 +695,7 @@ BOOL16 WINAPI FreeModule16( HMODULE16 hModule ) { NE_MODULE *pModule; - if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE; + if (!(pModule = MODULE_GetPtr16( hModule ))) return FALSE; TRACE(module, "%s count %d\n", MODULE_GetModuleName(hModule), pModule->count ); @@ -1350,13 +708,13 @@ BOOL16 WINAPI FreeModule16( HMODULE16 hModule ) */ HMODULE16 WINAPI WIN16_GetModuleHandle( SEGPTR name ) { - if (HIWORD(name) == 0) return MODULE_HANDLEtoHMODULE16( (HINSTANCE16)name ); - return MODULE_FindModule( PTR_SEG_TO_LIN(name) ); + if (HIWORD(name) == 0) return GetExePtr( (HINSTANCE16)name ); + return MODULE_FindModule16( PTR_SEG_TO_LIN(name) ); } HMODULE16 WINAPI GetModuleHandle16( LPCSTR name ) { - return MODULE_FindModule( name ); + return MODULE_FindModule16( name ); } /*********************************************************************** @@ -1364,17 +722,12 @@ HMODULE16 WINAPI GetModuleHandle16( LPCSTR name ) */ HMODULE32 WINAPI GetModuleHandle32A(LPCSTR module) { - HMODULE32 hModule; TRACE(win32, "%s\n", module ? module : "NULL"); -/* Freecell uses the result of GetModuleHandleA(0) as the hInstance in -all calls to e.g. CreateWindowEx. */ - if (module == NULL) { - TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() ); - hModule = pTask->hInstance; - } else - hModule = MODULE_FindModule(module); - return MODULE_HANDLEtoHMODULE32(hModule); + if (module == NULL) + return PROCESS_Current()->exe_modref->module; + else + return MODULE_FindModule32(PROCESS_Current(),module); } HMODULE32 WINAPI GetModuleHandle32W(LPCWSTR module) @@ -1394,7 +747,7 @@ INT16 WINAPI GetModuleUsage( HINSTANCE16 hModule ) { NE_MODULE *pModule; - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; + if (!(pModule = MODULE_GetPtr16( hModule ))) return 0; TRACE(module, "(%04x): returning %d\n", hModule, pModule->count ); return pModule->count; @@ -1410,7 +763,7 @@ INT16 WINAPI GetModuleFileName16( HINSTANCE16 hModule, LPSTR lpFileName, NE_MODULE *pModule; if (!hModule) hModule = GetCurrentTask(); - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; + if (!(pModule = MODULE_GetPtr16( hModule ))) return 0; lstrcpyn32A( lpFileName, NE_MODULE_NAME(pModule), nSize ); TRACE(module, "%s\n", lpFileName ); return strlen(lpFileName); @@ -1419,6 +772,7 @@ INT16 WINAPI GetModuleFileName16( HINSTANCE16 hModule, LPSTR lpFileName, /*********************************************************************** * GetModuleFileName32A (KERNEL32.235) + * FIXME FIXME */ DWORD WINAPI GetModuleFileName32A( HMODULE32 hModule, LPSTR lpFileName, DWORD size ) @@ -1430,7 +784,7 @@ DWORD WINAPI GetModuleFileName32A( HMODULE32 hModule, LPSTR lpFileName, TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() ); hModule = pTask->hInstance; } - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; + if (!(pModule = MODULE_GetPtr32( hModule ))) return 0; lstrcpyn32A( lpFileName, NE_MODULE_NAME(pModule), size ); TRACE(module, "%s\n", lpFileName ); return strlen(lpFileName); @@ -1471,7 +825,7 @@ BOOL16 WINAPI GetModuleName( HINSTANCE16 hinst, LPSTR buf, INT16 nSize ) HMODULE32 WINAPI LoadLibraryEx32W16( LPCSTR libname, HANDLE16 hf, DWORD flags ) { - fprintf(stderr,"LoadLibraryEx32W(%s,%d,%08lx)\n",libname,hf,flags); + TRACE(module,"(%s,%d,%08lx)\n",libname,hf,flags); return LoadLibraryEx32A(libname, hf,flags); } @@ -1528,9 +882,8 @@ HMODULE32 WINAPI LoadLibraryEx32W(LPCWSTR libnameW,HFILE32 hfile,DWORD flags) */ BOOL32 WINAPI FreeLibrary32(HINSTANCE32 hLibModule) { - TRACE(module,"hLibModule=%08x\n", hLibModule); - return MODULE_FreeModule(hLibModule, - GlobalLock16(GetCurrentTask()) ); + TRACE(module,"hLibModule=%08x\n", hLibModule); + return MODULE_FreeModule(hLibModule,GlobalLock16(GetCurrentTask()) ); } @@ -1541,11 +894,6 @@ HINSTANCE16 WINAPI LoadLibrary16( LPCSTR libname ) { HINSTANCE16 handle; - if (__winelib) - { - fprintf( stderr, "LoadLibrary not supported in Winelib\n" ); - return 0; - } TRACE(module, "(%08x) %s\n", (int)libname, libname); handle = MODULE_Load( libname, 0, NULL, NULL, 0 ); @@ -1730,7 +1078,7 @@ HINSTANCE32 WINAPI WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow ) execvp(argv[0] , (char**)argv); /* Failed ! */ - fprintf(stderr, "WinExec: can't exec 'wine %s'\n", + MSG("WinExec: can't exec 'wine %s'\n", lpCmdLine); } exit(1); @@ -1752,12 +1100,12 @@ FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE32 hModule, LPSTR name ) FARPROC16 ret; if (!hModule) { - fprintf(stderr,"WIN32_GetProcAddress16: hModule may not be 0!\n"); + WARN(module,"hModule may not be 0!\n"); return (FARPROC16)0; } hModule = MODULE_HANDLEtoHMODULE16(hModule); if (HIWORD(name)) { - ordinal = MODULE_GetOrdinal( hModule, name ); + ordinal = NE_GetOrdinal( hModule, name ); TRACE(module, "%04x '%s'\n", hModule, name ); } else { @@ -1766,7 +1114,7 @@ FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE32 hModule, LPSTR name ) hModule, ordinal ); } if (!ordinal) return (FARPROC16)0; - ret = MODULE_GetEntryPoint( hModule, ordinal ); + ret = NE_GetEntryPoint( hModule, ordinal ); TRACE(module,"returning %08x\n",(UINT32)ret); return ret; } @@ -1780,11 +1128,11 @@ FARPROC16 WINAPI GetProcAddress16( HMODULE16 hModule, SEGPTR name ) FARPROC16 ret; if (!hModule) hModule = GetCurrentTask(); - hModule = MODULE_HANDLEtoHMODULE16( hModule ); + hModule = GetExePtr( hModule ); if (HIWORD(name) != 0) { - ordinal = MODULE_GetOrdinal( hModule, (LPSTR)PTR_SEG_TO_LIN(name) ); + ordinal = NE_GetOrdinal( hModule, (LPSTR)PTR_SEG_TO_LIN(name) ); TRACE(module, "%04x '%s'\n", hModule, (LPSTR)PTR_SEG_TO_LIN(name) ); } @@ -1796,7 +1144,7 @@ FARPROC16 WINAPI GetProcAddress16( HMODULE16 hModule, SEGPTR name ) } if (!ordinal) return (FARPROC16)0; - ret = MODULE_GetEntryPoint( hModule, ordinal ); + ret = NE_GetEntryPoint( hModule, ordinal ); TRACE(module, "returning %08x\n", (UINT32)ret ); return ret; @@ -1804,29 +1152,41 @@ FARPROC16 WINAPI GetProcAddress16( HMODULE16 hModule, SEGPTR name ) /*********************************************************************** - * GetProcAddress32 (KERNEL32.257) + * GetProcAddress32 (KERNEL32.257) */ FARPROC32 WINAPI GetProcAddress32( HMODULE32 hModule, LPCSTR function ) { - NE_MODULE *pModule; + return MODULE_GetProcAddress32( PROCESS_Current(), hModule, function ); +} + + +/*********************************************************************** + * MODULE_GetProcAddress32 (internal) + */ +FARPROC32 MODULE_GetProcAddress32( + PDB32 *process, /* [in] process context */ + HMODULE32 hModule, /* [in] current module handle */ + LPCSTR function ) /* [in] function to be looked up */ +{ + WINE_MODREF *wm = MODULE32_LookupHMODULE(process,hModule); if (HIWORD(function)) TRACE(win32,"(%08lx,%s)\n",(DWORD)hModule,function); else TRACE(win32,"(%08lx,%p)\n",(DWORD)hModule,function); - if (!(pModule = MODULE_GetPtr( hModule ))) + if (!wm) return (FARPROC32)0; - if (!pModule->module32) + switch (wm->type) { - fprintf(stderr,"Oops, Module 0x%08lx has got no module32?\n", - (DWORD)MODULE_HANDLEtoHMODULE32(hModule) - ); - return (FARPROC32)0; + case MODULE32_PE: + return PE_FindExportedFunction( process, wm, function); + default: + ERR(module,"wine_modref type %d not handled.\n",wm->type); + return (FARPROC32)0; } - return PE_FindExportedFunction( PROCESS_Current(), pModule->module32, - function ); } + /*********************************************************************** * RtlImageNtHeaders (NTDLL) */ @@ -1837,13 +1197,9 @@ LPIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE32 hModule) * but we could get HMODULE16 or the like (think builtin modules) */ - NE_MODULE *pModule; - - if (!(pModule = MODULE_GetPtr( hModule ))) - return (LPIMAGE_NT_HEADERS)0; - if (!(pModule->flags & NE_FFLAGS_WIN32) || !pModule->module32) - return (LPIMAGE_NT_HEADERS)0; - return PE_HEADER(pModule->module32); + WINE_MODREF *wm = MODULE32_LookupHMODULE( PROCESS_Current(), hModule ); + if (!wm || (wm->type != MODULE32_PE)) return (LPIMAGE_NT_HEADERS)0; + return PE_HEADER(wm->module); } @@ -1852,7 +1208,7 @@ LPIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE32 hModule) */ WORD WINAPI GetExpWinVer( HMODULE16 hModule ) { - NE_MODULE *pModule = MODULE_GetPtr( hModule ); + NE_MODULE *pModule = MODULE_GetPtr16( hModule ); return pModule ? pModule->expected_version : 0; } @@ -1863,7 +1219,7 @@ WORD WINAPI GetExpWinVer( HMODULE16 hModule ) BOOL16 WINAPI IsSharedSelector( HANDLE16 selector ) { /* Check whether the selector belongs to a DLL */ - NE_MODULE *pModule = MODULE_GetPtr( selector ); + NE_MODULE *pModule = MODULE_GetPtr16( selector ); if (!pModule) return FALSE; return (pModule->flags & NE_FFLAGS_LIBMODULE) != 0; } @@ -1888,7 +1244,7 @@ BOOL16 WINAPI ModuleNext( MODULEENTRY *lpme ) char *name; if (!lpme->wNext) return FALSE; - if (!(pModule = MODULE_GetPtr( lpme->wNext ))) return FALSE; + if (!(pModule = MODULE_GetPtr16( lpme->wNext ))) return FALSE; name = (char *)pModule + pModule->name_table; memcpy( lpme->szModule, name + 1, *name ); lpme->szModule[(BYTE)*name] = '\0'; @@ -1916,7 +1272,7 @@ BOOL16 WINAPI ModuleFindName( MODULEENTRY *lpme, LPCSTR name ) */ BOOL16 WINAPI ModuleFindHandle( MODULEENTRY *lpme, HMODULE16 hModule ) { - hModule = MODULE_HANDLEtoHMODULE16( hModule ); + hModule = GetExePtr( hModule ); lpme->wNext = hModule; return ModuleNext( lpme ); } diff --git a/loader/ne/Makefile.in b/loader/ne/Makefile.in new file mode 100644 index 00000000000..0acbdc1b9a0 --- /dev/null +++ b/loader/ne/Makefile.in @@ -0,0 +1,17 @@ +DEFS = @DLLFLAGS@ -D__WINE__ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = ne + +C_SRCS = \ + module.c \ + resource.c \ + segment.c + +all: $(MODULE).o + +@MAKE_RULES@ + +### Dependencies: diff --git a/loader/ne/module.c b/loader/ne/module.c new file mode 100644 index 00000000000..5cd97f8c9a0 --- /dev/null +++ b/loader/ne/module.c @@ -0,0 +1,736 @@ +/* + * NE modules + * + * Copyright 1995 Alexandre Julliard + */ + +#include +#include +#include "module.h" +#include "ldt.h" +#include "heap.h" +#include "global.h" +#include "process.h" +#include "debug.h" + +HMODULE16 hFirstModule = 0; + +/*********************************************************************** + * NE_DumpModule + */ +void NE_DumpModule( HMODULE16 hModule ) +{ + int i, ordinal; + SEGTABLEENTRY *pSeg; + BYTE *pstr; + WORD *pword; + NE_MODULE *pModule; + + if (!(pModule = MODULE_GetPtr16( hModule ))) + { + fprintf( stderr, "**** %04x is not a module handle\n", hModule ); + return; + } + + /* Dump the module info */ + DUMP( "---\n" ); + DUMP( "Module %04x:\n", hModule ); + DUMP( "count=%d flags=%04x heap=%d stack=%d\n", + pModule->count, pModule->flags, + pModule->heap_size, pModule->stack_size ); + DUMP( "cs:ip=%04x:%04x ss:sp=%04x:%04x ds=%04x nb seg=%d modrefs=%d\n", + pModule->cs, pModule->ip, pModule->ss, pModule->sp, pModule->dgroup, + pModule->seg_count, pModule->modref_count ); + DUMP( "os_flags=%d swap_area=%d version=%04x\n", + pModule->os_flags, pModule->min_swap_area, + pModule->expected_version ); + if (pModule->flags & NE_FFLAGS_WIN32) + DUMP( "PE module=%08x\n", pModule->module32 ); + + /* Dump the file info */ + DUMP( "---\n" ); + DUMP( "Filename: '%s'\n", NE_MODULE_NAME(pModule) ); + + /* Dump the segment table */ + DUMP( "---\n" ); + DUMP( "Segment table:\n" ); + pSeg = NE_SEG_TABLE( pModule ); + for (i = 0; i < pModule->seg_count; i++, pSeg++) + DUMP( "%02x: pos=%d size=%d flags=%04x minsize=%d sel=%04x\n", + i + 1, pSeg->filepos, pSeg->size, pSeg->flags, + pSeg->minsize, pSeg->selector ); + + /* Dump the resource table */ + DUMP( "---\n" ); + DUMP( "Resource table:\n" ); + if (pModule->res_table) + { + pword = (WORD *)((BYTE *)pModule + pModule->res_table); + DUMP( "Alignment: %d\n", *pword++ ); + while (*pword) + { + struct resource_typeinfo_s *ptr = (struct resource_typeinfo_s *)pword; + struct resource_nameinfo_s *pname = (struct resource_nameinfo_s *)(ptr + 1); + DUMP( "id=%04x count=%d\n", ptr->type_id, ptr->count ); + for (i = 0; i < ptr->count; i++, pname++) + DUMP( "offset=%d len=%d id=%04x\n", + pname->offset, pname->length, pname->id ); + pword = (WORD *)pname; + } + } + else DUMP( "None\n" ); + + /* Dump the resident name table */ + DUMP( "---\n" ); + DUMP( "Resident-name table:\n" ); + pstr = (char *)pModule + pModule->name_table; + while (*pstr) + { + DUMP( "%*.*s: %d\n", *pstr, *pstr, pstr + 1, + *(WORD *)(pstr + *pstr + 1) ); + pstr += *pstr + 1 + sizeof(WORD); + } + + /* Dump the module reference table */ + DUMP( "---\n" ); + DUMP( "Module ref table:\n" ); + if (pModule->modref_table) + { + pword = (WORD *)((BYTE *)pModule + pModule->modref_table); + for (i = 0; i < pModule->modref_count; i++, pword++) + { + DUMP( "%d: %04x -> '%s'\n", i, *pword, + MODULE_GetModuleName(*pword)); + } + } + else DUMP( "None\n" ); + + /* Dump the entry table */ + DUMP( "---\n" ); + DUMP( "Entry table:\n" ); + pstr = (char *)pModule + pModule->entry_table; + ordinal = 1; + while (*pstr) + { + DUMP( "Bundle %d-%d: %02x\n", ordinal, ordinal + *pstr - 1, pstr[1]); + if (!pstr[1]) + { + ordinal += *pstr; + pstr += 2; + } + else if ((BYTE)pstr[1] == 0xff) /* moveable */ + { + i = *pstr; + pstr += 2; + while (i--) + { + DUMP( "%d: %02x:%04x (moveable)\n", + ordinal++, pstr[3], *(WORD *)(pstr + 4) ); + pstr += 6; + } + } + else /* fixed */ + { + i = *pstr; + pstr += 2; + while (i--) + { + DUMP( "%d: %04x (fixed)\n", + ordinal++, *(WORD *)(pstr + 1) ); + pstr += 3; + } + } + } + + /* Dump the non-resident names table */ + DUMP( "---\n" ); + DUMP( "Non-resident names table:\n" ); + if (pModule->nrname_handle) + { + pstr = (char *)GlobalLock16( pModule->nrname_handle ); + while (*pstr) + { + DUMP( "%*.*s: %d\n", *pstr, *pstr, pstr + 1, + *(WORD *)(pstr + *pstr + 1) ); + pstr += *pstr + 1 + sizeof(WORD); + } + } + DUMP( "\n" ); +} + + +/*********************************************************************** + * NE_WalkModules + * + * Walk the module list and print the modules. + */ +void NE_WalkModules(void) +{ + HMODULE16 hModule = hFirstModule; + fprintf( stderr, "Module Flags Name\n" ); + while (hModule) + { + NE_MODULE *pModule = MODULE_GetPtr16( hModule ); + if (!pModule) + { + fprintf( stderr, "**** Bad module %04x in list\n", hModule ); + return; + } + fprintf( stderr, " %04x %04x %.*s\n", hModule, pModule->flags, + *((char *)pModule + pModule->name_table), + (char *)pModule + pModule->name_table + 1 ); + hModule = pModule->next; + } +} + + +/********************************************************************** + * NE_RegisterModule + */ +void NE_RegisterModule( NE_MODULE *pModule ) +{ + pModule->next = hFirstModule; + hFirstModule = pModule->self; +} + + +/*********************************************************************** + * NE_GetOrdinal + * + * Lookup the ordinal for a given name. + */ +WORD NE_GetOrdinal( HMODULE16 hModule, const char *name ) +{ + unsigned char buffer[256], *cpnt; + BYTE len; + NE_MODULE *pModule; + + if (!(pModule = MODULE_GetPtr16( hModule ))) return 0; + assert( !(pModule->flags & NE_FFLAGS_WIN32) ); + + TRACE( module, "(%04x,'%s')\n", hModule, name ); + + /* First handle names of the form '#xxxx' */ + + if (name[0] == '#') return atoi( name + 1 ); + + /* Now copy and uppercase the string */ + + strcpy( buffer, name ); + CharUpper32A( buffer ); + len = strlen( buffer ); + + /* First search the resident names */ + + cpnt = (char *)pModule + pModule->name_table; + + /* Skip the first entry (module name) */ + cpnt += *cpnt + 1 + sizeof(WORD); + while (*cpnt) + { + if (((BYTE)*cpnt == len) && !memcmp( cpnt+1, buffer, len )) + { + TRACE(module, " Found: ordinal=%d\n", + *(WORD *)(cpnt + *cpnt + 1) ); + return *(WORD *)(cpnt + *cpnt + 1); + } + cpnt += *cpnt + 1 + sizeof(WORD); + } + + /* Now search the non-resident names table */ + + if (!pModule->nrname_handle) return 0; /* No non-resident table */ + cpnt = (char *)GlobalLock16( pModule->nrname_handle ); + + /* Skip the first entry (module description string) */ + cpnt += *cpnt + 1 + sizeof(WORD); + while (*cpnt) + { + if (((BYTE)*cpnt == len) && !memcmp( cpnt+1, buffer, len )) + { + TRACE(module, " Found: ordinal=%d\n", + *(WORD *)(cpnt + *cpnt + 1) ); + return *(WORD *)(cpnt + *cpnt + 1); + } + cpnt += *cpnt + 1 + sizeof(WORD); + } + return 0; +} + + +/*********************************************************************** + * NE_GetEntryPoint (WPROCS.27) + * + * Return the entry point for a given ordinal. + */ +FARPROC16 NE_GetEntryPoint( HMODULE16 hModule, WORD ordinal ) +{ + NE_MODULE *pModule; + WORD curOrdinal = 1; + BYTE *p; + WORD sel, offset; + + if (!(pModule = MODULE_GetPtr16( hModule ))) return 0; + assert( !(pModule->flags & NE_FFLAGS_WIN32) ); + + p = (BYTE *)pModule + pModule->entry_table; + while (*p && (curOrdinal + *p <= ordinal)) + { + /* Skipping this bundle */ + curOrdinal += *p; + switch(p[1]) + { + case 0: p += 2; break; /* unused */ + case 0xff: p += 2 + *p * 6; break; /* moveable */ + default: p += 2 + *p * 3; break; /* fixed */ + } + } + if (!*p) return 0; + + switch(p[1]) + { + case 0: /* unused */ + return 0; + case 0xff: /* moveable */ + p += 2 + 6 * (ordinal - curOrdinal); + sel = p[3]; + offset = *(WORD *)(p + 4); + break; + default: /* fixed */ + sel = p[1]; + p += 2 + 3 * (ordinal - curOrdinal); + offset = *(WORD *)(p + 1); + break; + } + + if (sel == 0xfe) sel = 0xffff; /* constant entry */ + else sel = (WORD)(DWORD)NE_SEG_TABLE(pModule)[sel-1].selector; + return (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset ); +} + + +/*********************************************************************** + * NE_SetEntryPoint + * + * Change the value of an entry point. Use with caution! + * It can only change the offset value, not the selector. + */ +BOOL16 NE_SetEntryPoint( HMODULE16 hModule, WORD ordinal, WORD offset ) +{ + NE_MODULE *pModule; + WORD curOrdinal = 1; + BYTE *p; + + if (!(pModule = MODULE_GetPtr16( hModule ))) return FALSE; + assert( !(pModule->flags & NE_FFLAGS_WIN32) ); + + p = (BYTE *)pModule + pModule->entry_table; + while (*p && (curOrdinal + *p <= ordinal)) + { + /* Skipping this bundle */ + curOrdinal += *p; + switch(p[1]) + { + case 0: p += 2; break; /* unused */ + case 0xff: p += 2 + *p * 6; break; /* moveable */ + default: p += 2 + *p * 3; break; /* fixed */ + } + } + if (!*p) return FALSE; + + switch(p[1]) + { + case 0: /* unused */ + return FALSE; + case 0xff: /* moveable */ + p += 2 + 6 * (ordinal - curOrdinal); + *(WORD *)(p + 4) = offset; + break; + default: /* fixed */ + p += 2 + 3 * (ordinal - curOrdinal); + *(WORD *)(p + 1) = offset; + break; + } + return TRUE; +} + + +/*********************************************************************** + * NE_LoadExeHeader + */ +static HMODULE16 NE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs ) +{ + IMAGE_DOS_HEADER mz_header; + IMAGE_OS2_HEADER ne_header; + int size; + HMODULE16 hModule; + NE_MODULE *pModule; + BYTE *pData; + char *buffer, *fastload = NULL; + int fastload_offset = 0, fastload_length = 0; + + /* Read a block from either the file or the fast-load area. */ +#define READ(offset,size,buffer) \ + ((fastload && ((offset) >= fastload_offset) && \ + ((offset)+(size) <= fastload_offset+fastload_length)) ? \ + (memcpy( buffer, fastload+(offset)-fastload_offset, (size) ), TRUE) : \ + (_llseek32( hFile, (offset), SEEK_SET), \ + _lread32( hFile, (buffer), (size) ) == (size))) + + _llseek32( hFile, 0, SEEK_SET ); + if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) || + (mz_header.e_magic != IMAGE_DOS_SIGNATURE)) + return (HMODULE16)11; /* invalid exe */ + + _llseek32( hFile, mz_header.e_lfanew, SEEK_SET ); + if (_lread32( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header)) + return (HMODULE16)11; /* invalid exe */ + + if (ne_header.ne_magic == IMAGE_NT_SIGNATURE) return (HMODULE16)21; /* win32 exe */ + if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE) return (HMODULE16)11; /* invalid exe */ + + if (ne_header.ne_magic == IMAGE_OS2_SIGNATURE_LX) { + fprintf(stderr, "Sorry, this is an OS/2 linear executable (LX) file !\n"); + return (HMODULE16)12; + } + + /* We now have a valid NE header */ + + size = sizeof(NE_MODULE) + + /* loaded file info */ + sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1+ + /* segment table */ + ne_header.n_segment_tab * sizeof(SEGTABLEENTRY) + + /* resource table */ + ne_header.rname_tab_offset - ne_header.resource_tab_offset + + /* resident names table */ + ne_header.moduleref_tab_offset - ne_header.rname_tab_offset + + /* module ref table */ + ne_header.n_mod_ref_tab * sizeof(WORD) + + /* imported names table */ + ne_header.entry_tab_offset - ne_header.iname_tab_offset + + /* entry table length */ + ne_header.entry_tab_length; + + hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size ); + if (!hModule) return (HMODULE16)11; /* invalid exe */ + FarSetOwner( hModule, hModule ); + pModule = (NE_MODULE *)GlobalLock16( hModule ); + memcpy( pModule, &ne_header, sizeof(ne_header) ); + pModule->count = 0; + pModule->module32 = 0; + pModule->self = hModule; + pModule->self_loading_sel = 0; + pData = (BYTE *)(pModule + 1); + + /* Clear internal Wine flags in case they are set in the EXE file */ + + pModule->flags &= ~(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32|NE_FFLAGS_IMPLICIT); + + /* Read the fast-load area */ + + if (ne_header.additional_flags & NE_AFLAGS_FASTLOAD) + { + fastload_offset=ne_header.fastload_offset<fileinfo = (int)pData - (int)pModule; + size = sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1; + memcpy( pData, ofs, size ); + ((OFSTRUCT *)pData)->cBytes = size - 1; + pData += size; + + /* Get the segment table */ + + pModule->seg_table = (int)pData - (int)pModule; + buffer = HeapAlloc( SystemHeap, 0, ne_header.n_segment_tab * + sizeof(struct ne_segment_table_entry_s)); + if (buffer) + { + int i; + struct ne_segment_table_entry_s *pSeg; + + if (!READ( mz_header.e_lfanew + ne_header.segment_tab_offset, + ne_header.n_segment_tab * sizeof(struct ne_segment_table_entry_s), + buffer )) + { + HeapFree( SystemHeap, 0, buffer ); + if (fastload) HeapFree( SystemHeap, 0, fastload ); + GlobalFree16( hModule ); + return (HMODULE16)11; /* invalid exe */ + } + pSeg = (struct ne_segment_table_entry_s *)buffer; + for (i = ne_header.n_segment_tab; i > 0; i--, pSeg++) + { + memcpy( pData, pSeg, sizeof(*pSeg) ); + pData += sizeof(SEGTABLEENTRY); + } + HeapFree( SystemHeap, 0, buffer ); + } + else + { + if (fastload) HeapFree( SystemHeap, 0, fastload ); + GlobalFree16( hModule ); + return (HMODULE16)11; /* invalid exe */ + } + + /* Get the resource table */ + + if (ne_header.resource_tab_offset < ne_header.rname_tab_offset) + { + pModule->res_table = (int)pData - (int)pModule; + if (!READ(mz_header.e_lfanew + ne_header.resource_tab_offset, + ne_header.rname_tab_offset - ne_header.resource_tab_offset, + pData )) return (HMODULE16)11; /* invalid exe */ + pData += ne_header.rname_tab_offset - ne_header.resource_tab_offset; + NE_InitResourceHandler( hModule ); + } + else pModule->res_table = 0; /* No resource table */ + + /* Get the resident names table */ + + pModule->name_table = (int)pData - (int)pModule; + if (!READ( mz_header.e_lfanew + ne_header.rname_tab_offset, + ne_header.moduleref_tab_offset - ne_header.rname_tab_offset, + pData )) + { + if (fastload) HeapFree( SystemHeap, 0, fastload ); + GlobalFree16( hModule ); + return (HMODULE16)11; /* invalid exe */ + } + pData += ne_header.moduleref_tab_offset - ne_header.rname_tab_offset; + + /* Get the module references table */ + + if (ne_header.n_mod_ref_tab > 0) + { + pModule->modref_table = (int)pData - (int)pModule; + if (!READ( mz_header.e_lfanew + ne_header.moduleref_tab_offset, + ne_header.n_mod_ref_tab * sizeof(WORD), + pData )) + { + if (fastload) HeapFree( SystemHeap, 0, fastload ); + GlobalFree16( hModule ); + return (HMODULE16)11; /* invalid exe */ + } + pData += ne_header.n_mod_ref_tab * sizeof(WORD); + } + else pModule->modref_table = 0; /* No module references */ + + /* Get the imported names table */ + + pModule->import_table = (int)pData - (int)pModule; + if (!READ( mz_header.e_lfanew + ne_header.iname_tab_offset, + ne_header.entry_tab_offset - ne_header.iname_tab_offset, + pData )) + { + if (fastload) HeapFree( SystemHeap, 0, fastload ); + GlobalFree16( hModule ); + return (HMODULE16)11; /* invalid exe */ + } + pData += ne_header.entry_tab_offset - ne_header.iname_tab_offset; + + /* Get the entry table */ + + pModule->entry_table = (int)pData - (int)pModule; + if (!READ( mz_header.e_lfanew + ne_header.entry_tab_offset, + ne_header.entry_tab_length, + pData )) + { + if (fastload) HeapFree( SystemHeap, 0, fastload ); + GlobalFree16( hModule ); + return (HMODULE16)11; /* invalid exe */ + } + pData += ne_header.entry_tab_length; + + /* Free the fast-load area */ + +#undef READ + if (fastload) HeapFree( SystemHeap, 0, fastload ); + + /* Get the non-resident names table */ + + if (ne_header.nrname_tab_length) + { + pModule->nrname_handle = GLOBAL_Alloc( 0, ne_header.nrname_tab_length, + hModule, FALSE, FALSE, FALSE ); + if (!pModule->nrname_handle) + { + GlobalFree16( hModule ); + return (HMODULE16)11; /* invalid exe */ + } + buffer = GlobalLock16( pModule->nrname_handle ); + _llseek32( hFile, ne_header.nrname_tab_offset, SEEK_SET ); + if (_lread32( hFile, buffer, ne_header.nrname_tab_length ) + != ne_header.nrname_tab_length) + { + GlobalFree16( pModule->nrname_handle ); + GlobalFree16( hModule ); + return (HMODULE16)11; /* invalid exe */ + } + } + else pModule->nrname_handle = 0; + + /* Allocate a segment for the implicitly-loaded DLLs */ + + if (pModule->modref_count) + { + pModule->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT, + (pModule->modref_count+1)*sizeof(HMODULE16), + hModule, FALSE, FALSE, FALSE ); + if (!pModule->dlls_to_init) + { + if (pModule->nrname_handle) GlobalFree16( pModule->nrname_handle ); + GlobalFree16( hModule ); + return (HMODULE16)11; /* invalid exe */ + } + } + else pModule->dlls_to_init = 0; + + NE_RegisterModule( pModule ); + return hModule; +} + + +/*********************************************************************** + * NE_LoadDLLs + * + * Load all DLLs implicitly linked to a module. + */ +static BOOL32 NE_LoadDLLs( NE_MODULE *pModule ) +{ + int i; + WORD *pModRef = (WORD *)((char *)pModule + pModule->modref_table); + WORD *pDLLs = (WORD *)GlobalLock16( pModule->dlls_to_init ); + + for (i = 0; i < pModule->modref_count; i++, pModRef++) + { + char buffer[256]; + BYTE *pstr = (BYTE *)pModule + pModule->import_table + *pModRef; + memcpy( buffer, pstr + 1, *pstr ); + strcpy( buffer + *pstr, ".dll" ); + TRACE(module, "Loading '%s'\n", buffer ); + if (!(*pModRef = MODULE_FindModule16( buffer ))) + { + /* If the DLL is not loaded yet, load it and store */ + /* its handle in the list of DLLs to initialize. */ + HMODULE16 hDLL; + + if ((hDLL = MODULE_Load( buffer, NE_FFLAGS_IMPLICIT, + NULL, NULL, 0 )) == 2) + { + /* file not found */ + char *p; + + /* Try with prepending the path of the current module */ + GetModuleFileName16( pModule->self, buffer, sizeof(buffer) ); + if (!(p = strrchr( buffer, '\\' ))) p = buffer; + memcpy( p + 1, pstr + 1, *pstr ); + strcpy( p + 1 + *pstr, ".dll" ); + hDLL = MODULE_Load( buffer, NE_FFLAGS_IMPLICIT, NULL, NULL, 0); + } + if (hDLL < 32) + { + /* FIXME: cleanup what was done */ + + fprintf( stderr, "Could not load '%s' required by '%.*s', error = %d\n", + buffer, *((BYTE*)pModule + pModule->name_table), + (char *)pModule + pModule->name_table + 1, hDLL ); + return FALSE; + } + *pModRef = GetExePtr( hDLL ); + *pDLLs++ = *pModRef; + } + else /* Increment the reference count of the DLL */ + { + NE_MODULE *pOldDLL = MODULE_GetPtr16( *pModRef ); + if (pOldDLL) pOldDLL->count++; + } + } + return TRUE; +} + + +/********************************************************************** + * NE_LoadModule + * + * Implementation of LoadModule(). + * + * cmd_line must contain the whole command-line, including argv[0] (and + * without a preceding length byte). + * If cmd_line is NULL, the module is loaded as a library even if it is a .exe + */ +HINSTANCE16 NE_LoadModule( HFILE32 hFile, OFSTRUCT *ofs, UINT16 flags, + LPCSTR cmd_line, LPCSTR env, UINT32 show_cmd ) +{ + HMODULE16 hModule; + HINSTANCE16 hInstance; + NE_MODULE *pModule; + + /* Create the module structure */ + + if ((hModule = NE_LoadExeHeader( hFile, ofs )) < 32) return hModule; + + pModule = MODULE_GetPtr16( hModule ); + pModule->flags |= flags; /* stamp implicitly loaded modules */ + + /* Allocate the segments for this module */ + + NE_CreateSegments( hModule ); + hInstance = MODULE_CreateInstance( hModule, NULL, (cmd_line == NULL) ); + + /* Load the referenced DLLs */ + + if (!NE_LoadDLLs( pModule )) + return 2; /* File not found (FIXME: free everything) */ + + /* Load the segments */ + + NE_LoadAllSegments( pModule ); + + /* Fixup the functions prologs */ + + NE_FixupPrologs( pModule ); + + /* Make sure the usage count is 1 on the first loading of */ + /* the module, even if it contains circular DLL references */ + + pModule->count = 1; + + /* Call initialization rountines for all loaded DLLs. Note that + * when we load implicitly linked DLLs this will be done by InitTask(). + */ + + if ((pModule->flags & (NE_FFLAGS_LIBMODULE | NE_FFLAGS_IMPLICIT)) == + NE_FFLAGS_LIBMODULE) + NE_InitializeDLLs( hModule ); + + /* Create a task for this instance */ + + if (cmd_line && !(pModule->flags & NE_FFLAGS_LIBMODULE)) + { + PDB32 *pdb; + + pModule->flags |= NE_FFLAGS_GUI; + + pdb = PROCESS_Create( pModule, cmd_line, env, hInstance, 0, show_cmd ); + if (pdb && (GetNumTasks() > 1)) Yield16(); + } + + return hInstance; +} diff --git a/loader/ne_resource.c b/loader/ne/resource.c similarity index 66% rename from loader/ne_resource.c rename to loader/ne/resource.c index abf688c432a..832be3b7060 100644 --- a/loader/ne_resource.c +++ b/loader/ne/resource.c @@ -1,10 +1,12 @@ /* + * NE resource functions * * Copyright 1993 Robert J. Amstadt * Copyright 1995 Alexandre Julliard - * 1997 Alex Korobka + * Copyright 1997 Alex Korobka */ +#include #include #include #include @@ -20,7 +22,7 @@ #include "resource.h" #include "debug.h" -#define NEXT_TYPEINFO(pTypeInfo) ((NE_TYPEINFO *)((char*)((pTypeInfo) + 1) + \ +#define NEXT_TYPEINFO(pTypeInfo) ((NE_TYPEINFO *)((char*)((pTypeInfo) + 1) + \ (pTypeInfo)->count * sizeof(NE_NAMEINFO))) /*********************************************************************** @@ -181,7 +183,7 @@ HGLOBAL16 WINAPI NE_DefResourceHandler( HGLOBAL16 hMemObj, HMODULE16 hModule, HRSRC16 hRsrc ) { int fd; - NE_MODULE* pModule = MODULE_GetPtr( hModule ); + NE_MODULE* pModule = MODULE_GetPtr16( hModule ); if ( pModule && (fd = MODULE_OpenFile( hModule )) >= 0) { HGLOBAL16 handle; @@ -194,7 +196,7 @@ HGLOBAL16 WINAPI NE_DefResourceHandler( HGLOBAL16 hMemObj, HMODULE16 hModule, if( hMemObj ) handle = GlobalReAlloc16( hMemObj, pNameInfo->length << sizeShift, 0 ); else - handle = NE_AllocResource( hModule, hRsrc, 0 ); + handle = AllocResource( hModule, hRsrc, 0 ); if( handle ) { @@ -213,95 +215,131 @@ HGLOBAL16 WINAPI NE_DefResourceHandler( HGLOBAL16 hMemObj, HMODULE16 hModule, */ BOOL32 NE_InitResourceHandler( HMODULE16 hModule ) { - NE_MODULE *pModule = MODULE_GetPtr( hModule ); + NE_MODULE *pModule = MODULE_GetPtr16( hModule ); NE_TYPEINFO *pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2); TRACE(resource,"InitResourceHandler[%04x]\n", hModule ); while(pTypeInfo->type_id) { - pTypeInfo->resloader = (DWORD)&NE_DefResourceHandler; + pTypeInfo->resloader = (FARPROC16)&NE_DefResourceHandler; pTypeInfo = NEXT_TYPEINFO(pTypeInfo); } return TRUE; } -/*********************************************************************** - * NE_SetResourceHandler - */ -FARPROC32 NE_SetResourceHandler( HMODULE16 hModule, SEGPTR typeId, - FARPROC32 resourceHandler ) -{ - NE_MODULE *pModule = MODULE_GetPtr( hModule ); - NE_TYPEINFO *pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2); - FARPROC32 prevHandler = NULL; - do +/********************************************************************** + * SetResourceHandler (KERNEL.43) + */ +FARPROC16 WINAPI SetResourceHandler( HMODULE16 hModule, SEGPTR typeId, + FARPROC16 resourceHandler ) +{ + FARPROC16 prevHandler = NULL; + NE_MODULE *pModule = MODULE_GetPtr16( hModule ); + NE_TYPEINFO *pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2); + + if (!pModule || !pModule->res_table) return NULL; + + TRACE( resource, "module=%04x type=%s\n", + hModule, debugres_a(PTR_SEG_TO_LIN(typeId)) ); + + for (;;) { - pTypeInfo = NE_FindTypeSection( pModule, pTypeInfo, typeId ); - if( pTypeInfo ) - { - prevHandler = (FARPROC32)pTypeInfo->resloader; - pTypeInfo->resloader = (DWORD)resourceHandler; - pTypeInfo = NEXT_TYPEINFO(pTypeInfo); - } - } while( pTypeInfo ); + if (!(pTypeInfo = NE_FindTypeSection( pModule, pTypeInfo, typeId ))) + break; + prevHandler = pTypeInfo->resloader; + pTypeInfo->resloader = resourceHandler; + pTypeInfo = NEXT_TYPEINFO(pTypeInfo); + } return prevHandler; } -/*********************************************************************** - * NE_FindResource + +/********************************************************************** + * FindResource16 (KERNEL.60) */ -HRSRC16 NE_FindResource( HMODULE16 hModule, SEGPTR typeId, SEGPTR resId ) +HRSRC16 WINAPI FindResource16( HMODULE16 hModule, SEGPTR name, SEGPTR type ) { NE_TYPEINFO *pTypeInfo; HRSRC16 hRsrc; - NE_MODULE *pModule = MODULE_GetPtr( hModule ); + NE_MODULE *pModule = MODULE_GetPtr16( hModule ); if (!pModule || !pModule->res_table) return 0; - pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2); - if (HIWORD(typeId) || HIWORD(resId)) + assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */ + + TRACE( resource, "module=%04x name=%s type=%s\n", + hModule, debugres_a(PTR_SEG_TO_LIN(name)), + debugres_a(PTR_SEG_TO_LIN(type)) ); + + if (HIWORD(name)) /* Check for '#xxx' name */ { - DWORD id = NE_FindNameTableId( pModule, typeId, resId ); + char *ptr = PTR_SEG_TO_LIN( name ); + if (ptr[0] == '#') + if (!(name = (SEGPTR)atoi( ptr + 1 ))) + { + WARN(resource, "Incorrect resource name: %s\n", ptr); + return 0; + } + } + + if (HIWORD(type)) /* Check for '#xxx' type */ + { + char *ptr = PTR_SEG_TO_LIN( type ); + if (ptr[0] == '#') + if (!(type = (SEGPTR)atoi( ptr + 1 ))) + { + WARN(resource, "Incorrect resource type: %s\n", ptr); + return 0; + } + } + + if (HIWORD(type) || HIWORD(name)) + { + DWORD id = NE_FindNameTableId( pModule, type, name ); if (id) /* found */ { - typeId = LOWORD(id); - resId = HIWORD(id); + type = LOWORD(id); + name = HIWORD(id); } } - do + pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2); + + for (;;) { - pTypeInfo = NE_FindTypeSection( pModule, pTypeInfo, typeId ); - if( pTypeInfo ) - { - hRsrc = NE_FindResourceFromType(pModule, pTypeInfo, resId); - if( hRsrc ) - { - TRACE(resource, " Found id %08lx\n", resId ); - return hRsrc; - } - TRACE(resource, " Not found, going on\n" ); - pTypeInfo = NEXT_TYPEINFO(pTypeInfo); - } - } while( pTypeInfo ); + if (!(pTypeInfo = NE_FindTypeSection( pModule, pTypeInfo, type ))) + break; + if ((hRsrc = NE_FindResourceFromType(pModule, pTypeInfo, name))) + { + TRACE(resource, " Found id %08lx\n", name ); + return hRsrc; + } + TRACE(resource, " Not found, going on\n" ); + pTypeInfo = NEXT_TYPEINFO(pTypeInfo); + } WARN(resource, "failed!\n"); return 0; } -/*********************************************************************** - * NE_AllocResource +/********************************************************************** + * AllocResource (KERNEL.66) */ -HGLOBAL16 NE_AllocResource( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size ) +HGLOBAL16 WINAPI AllocResource( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size) { NE_NAMEINFO *pNameInfo=NULL; WORD sizeShift; - NE_MODULE *pModule = MODULE_GetPtr( hModule ); - if (!pModule || !pModule->res_table) return 0; + NE_MODULE *pModule = MODULE_GetPtr16( hModule ); + if (!pModule || !pModule->res_table || !hRsrc) return 0; + + TRACE( resource, "module=%04x res=%04x size=%ld\n", hModule, hRsrc, size ); + + assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */ + sizeShift = *(WORD *)((char *)pModule + pModule->res_table); pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc); if (size < (DWORD)pNameInfo->length << sizeShift) @@ -310,55 +348,84 @@ HGLOBAL16 NE_AllocResource( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size ) } -/*********************************************************************** - * NE_AccessResource +/********************************************************************** + * DirectResAlloc (KERNEL.168) + * + * Check Schulman, p. 232 for details */ -int NE_AccessResource( HMODULE16 hModule, HRSRC16 hRsrc ) +HGLOBAL16 WINAPI DirectResAlloc( HINSTANCE16 hInstance, WORD wType, + UINT16 wSize ) +{ + TRACE(resource,"(%04x,%04x,%04x)\n", + hInstance, wType, wSize ); + if (!(hInstance = GetExePtr( hInstance ))) return 0; + if(wType != 0x10) /* 0x10 is the only observed value, passed from + CreateCursorIndirect. */ + fprintf(stderr, "DirectResAlloc: wType = %x\n", wType); + return GLOBAL_Alloc(GMEM_MOVEABLE, wSize, hInstance, FALSE, FALSE, FALSE); +} + + +/********************************************************************** + * AccessResource16 (KERNEL.64) + */ +INT16 WINAPI AccessResource16( HINSTANCE16 hModule, HRSRC16 hRsrc ) { - NE_NAMEINFO *pNameInfo=NULL; HFILE32 fd; - NE_MODULE *pModule = MODULE_GetPtr( hModule ); - if (!pModule || !pModule->res_table) return -1; - pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc); + NE_MODULE *pModule = MODULE_GetPtr16( hModule ); + if (!pModule || !pModule->res_table || !hRsrc) return -1; + + TRACE(resource, "module=%04x res=%04x\n", hModule, hRsrc ); + + assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */ if ((fd = _lopen32( NE_MODULE_NAME(pModule), OF_READ )) != -1) { WORD sizeShift = *(WORD *)((char *)pModule + pModule->res_table); + NE_NAMEINFO *pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc); _llseek32( fd, (int)pNameInfo->offset << sizeShift, SEEK_SET ); } return fd; } -/*********************************************************************** - * NE_SizeofResource +/********************************************************************** + * SizeofResource16 (KERNEL.65) */ -DWORD NE_SizeofResource( HMODULE16 hModule, HRSRC16 hRsrc ) +DWORD WINAPI SizeofResource16( HMODULE16 hModule, HRSRC16 hRsrc ) { NE_NAMEINFO *pNameInfo=NULL; WORD sizeShift; - NE_MODULE *pModule = MODULE_GetPtr( hModule ); + NE_MODULE *pModule = MODULE_GetPtr16( hModule ); if (!pModule || !pModule->res_table) return 0; + + TRACE(resource, "module=%04x res=%04x\n", hModule, hRsrc ); + + assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */ + sizeShift = *(WORD *)((char *)pModule + pModule->res_table); pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc); return (DWORD)pNameInfo->length << sizeShift; } -/*********************************************************************** - * NE_LoadResource +/********************************************************************** + * LoadResource16 (KERNEL.61) */ -HGLOBAL16 NE_LoadResource( HMODULE16 hModule, HRSRC16 hRsrc ) +HGLOBAL16 WINAPI LoadResource16( HMODULE16 hModule, HRSRC16 hRsrc ) { NE_TYPEINFO *pTypeInfo; NE_NAMEINFO *pNameInfo = NULL; - NE_MODULE *pModule = MODULE_GetPtr( hModule ); + NE_MODULE *pModule = MODULE_GetPtr16( hModule ); int d; + TRACE( resource, "module=%04x res=%04x\n", hModule, hRsrc ); if (!hRsrc || !pModule || !pModule->res_table) return 0; + assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */ + /* First, verify hRsrc (just an offset from pModule to the needed pNameInfo) */ d = pModule->res_table + 2; @@ -383,7 +450,7 @@ HGLOBAL16 NE_LoadResource( HMODULE16 hModule, HRSRC16 hRsrc ) if (pNameInfo) { - RESOURCEHANDLER16 __r16loader; + RESOURCEHANDLER16 loader; if (pNameInfo->handle && !(GlobalFlags16(pNameInfo->handle) & GMEM_DISCARDED)) { @@ -394,16 +461,16 @@ HGLOBAL16 NE_LoadResource( HMODULE16 hModule, HRSRC16 hRsrc ) else { if (pTypeInfo->resloader) - __r16loader = (RESOURCEHANDLER16)pTypeInfo->resloader; + loader = (RESOURCEHANDLER16)pTypeInfo->resloader; else /* this is really bad */ { fprintf( stderr, "[%04x]: Missing resource handler!!!...\n", hModule); - __r16loader = NE_DefResourceHandler; + loader = NE_DefResourceHandler; } /* Finally call resource loader */ - if ((pNameInfo->handle = __r16loader(pNameInfo->handle, hModule, hRsrc))) + if ((pNameInfo->handle = loader(pNameInfo->handle, hModule, hRsrc))) { pNameInfo->usage++; pNameInfo->flags |= NE_SEGFLAGS_LOADED; @@ -415,28 +482,46 @@ HGLOBAL16 NE_LoadResource( HMODULE16 hModule, HRSRC16 hRsrc ) } -/*********************************************************************** - * NE_LockResource +/********************************************************************** + * LockResource16 (KERNEL.62) */ -SEGPTR NE_LockResource( HMODULE16 hModule, HGLOBAL16 handle ) +/* 16-bit version */ +SEGPTR WINAPI WIN16_LockResource16( HGLOBAL16 handle ) { + TRACE( resource, "handle=%04x\n", handle ); + if (!handle) return (SEGPTR)0; + /* May need to reload the resource if discarded */ return (SEGPTR)WIN16_GlobalLock16( handle ); } +/* Winelib 16-bit version */ +LPVOID WINAPI LockResource16( HGLOBAL16 handle ) +{ + assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */ -/*********************************************************************** - * NE_FreeResource + return (LPVOID)PTR_SEG_TO_LIN( WIN16_LockResource16( handle ) ); +} + + +/********************************************************************** + * FreeResource16 (KERNEL.63) */ -BOOL32 NE_FreeResource( HMODULE16 hModule, HGLOBAL16 handle ) +BOOL16 WINAPI FreeResource16( HGLOBAL16 handle ) { NE_TYPEINFO *pTypeInfo; NE_NAMEINFO *pNameInfo; WORD count; + HMODULE16 hModule = GetExePtr( handle ); + NE_MODULE *pModule = MODULE_GetPtr16( hModule ); - NE_MODULE *pModule = MODULE_GetPtr( hModule ); if (!handle || !pModule || !pModule->res_table) return handle; + + TRACE(resource, "handle=%04x\n", handle ); + + assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */ + pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2); while (pTypeInfo->type_id) { diff --git a/loader/ne_image.c b/loader/ne/segment.c similarity index 86% rename from loader/ne_image.c rename to loader/ne/segment.c index 5bb108835f8..99f78ce911f 100644 --- a/loader/ne_image.c +++ b/loader/ne/segment.c @@ -1,10 +1,11 @@ /* - * NE modules + * NE segment loading * * Copyright 1993 Robert J. Amstadt * Copyright 1995 Alexandre Julliard */ +#include #include #include #include @@ -160,8 +161,11 @@ BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum ) read( fd, &count, sizeof(count) ); if (!count) return TRUE; - TRACE(fixup, "Fixups for %*.*s, segment %d, selector %04x\n", + TRACE(fixup, "Fixups for %.*s, segment %d, selector %04x\n", *((BYTE *)pModule + pModule->name_table), + (char *)pModule + pModule->name_table + 1, + segnum, pSeg->selector ); + TRACE(segment, "Fixups for %.*s, segment %d, selector %04x\n", *((BYTE *)pModule + pModule->name_table), (char *)pModule + pModule->name_table + 1, segnum, pSeg->selector ); @@ -194,10 +198,10 @@ BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum ) case NE_RELTYPE_ORDINAL: module = pModuleTable[rep->target1-1]; ordinal = rep->target2; - address = MODULE_GetEntryPoint( module, ordinal ); + address = NE_GetEntryPoint( module, ordinal ); if (!address) { - NE_MODULE *pTarget = MODULE_GetPtr( module ); + NE_MODULE *pTarget = MODULE_GetPtr16( module ); if (!pTarget) fprintf( stderr, "Module not found: %04x, reference %d of module %*.*s\n", module, rep->target1, @@ -212,7 +216,7 @@ BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum ) } if (TRACE_ON(fixup)) { - NE_MODULE *pTarget = MODULE_GetPtr( module ); + NE_MODULE *pTarget = MODULE_GetPtr16( module ); TRACE( fixup, "%d: %.*s.%d=%04x:%04x %s\n", i + 1, *((BYTE *)pTarget + pTarget->name_table), (char *)pTarget + pTarget->name_table + 1, @@ -227,20 +231,19 @@ BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum ) memcpy( buffer, func_name+1, *func_name ); buffer[*func_name] = '\0'; func_name = buffer; - ordinal = MODULE_GetOrdinal( module, func_name ); - - address = MODULE_GetEntryPoint( module, ordinal ); + ordinal = NE_GetOrdinal( module, func_name ); + address = NE_GetEntryPoint( module, ordinal ); if (ERR_ON(fixup) && !address) { - NE_MODULE *pTarget = MODULE_GetPtr( module ); + NE_MODULE *pTarget = MODULE_GetPtr16( module ); ERR(fixup, "Warning: no handler for %.*s.%s, setting to 0:0\n", *((BYTE *)pTarget + pTarget->name_table), (char *)pTarget + pTarget->name_table + 1, func_name ); } if (TRACE_ON(fixup)) { - NE_MODULE *pTarget = MODULE_GetPtr( module ); + NE_MODULE *pTarget = MODULE_GetPtr16( module ); TRACE( fixup, "%d: %.*s.%s=%04x:%04x %s\n", i + 1, *((BYTE *)pTarget + pTarget->name_table), (char *)pTarget + pTarget->name_table + 1, @@ -252,7 +255,7 @@ BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum ) case NE_RELTYPE_INTERNAL: if ((rep->target1 & 0xff) == 0xff) { - address = MODULE_GetEntryPoint( pModule->self, rep->target2 ); + address = NE_GetEntryPoint( pModule->self, rep->target2 ); } else { @@ -310,6 +313,7 @@ BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum ) ERR(fixup,"Additive selector to %04x.Please report\n",*sp); else *sp = HIWORD(address); + break; default: goto unknown; } @@ -383,9 +387,9 @@ BOOL32 NE_LoadAllSegments( NE_MODULE *pModule ) if (!NE_LoadSegment( pModule, 1 )) return FALSE; selfloadheader = (SELFLOADHEADER *) PTR_SEG_OFF_TO_LIN(pSegTable->selector, 0); - selfloadheader->EntryAddrProc = MODULE_GetEntryPoint(hselfload,27); - selfloadheader->MyAlloc = MODULE_GetEntryPoint(hselfload,28); - selfloadheader->SetOwner = MODULE_GetEntryPoint(GetModuleHandle16("KERNEL"),403); + selfloadheader->EntryAddrProc = NE_GetEntryPoint(hselfload,27); + selfloadheader->MyAlloc = NE_GetEntryPoint(hselfload,28); + selfloadheader->SetOwner = NE_GetEntryPoint(GetModuleHandle16("KERNEL"),403); pModule->self_loading_sel = GlobalHandleToSel(GLOBAL_Alloc(GMEM_ZEROINIT, 0xFF00, pModule->self, FALSE, FALSE, FALSE)); oldstack = thdb->cur_stack; thdb->cur_stack = PTR_SEG_OFF_TO_SEGPTR(pModule->self_loading_sel, @@ -419,63 +423,6 @@ BOOL32 NE_LoadAllSegments( NE_MODULE *pModule ) } -/*********************************************************************** - * NE_LoadDLLs - */ -BOOL32 NE_LoadDLLs( NE_MODULE *pModule ) -{ - int i; - WORD *pModRef = (WORD *)((char *)pModule + pModule->modref_table); - WORD *pDLLs = (WORD *)GlobalLock16( pModule->dlls_to_init ); - - for (i = 0; i < pModule->modref_count; i++, pModRef++) - { - char buffer[256]; - BYTE *pstr = (BYTE *)pModule + pModule->import_table + *pModRef; - memcpy( buffer, pstr + 1, *pstr ); - strcpy( buffer + *pstr, ".dll" ); - TRACE(module, "Loading '%s'\n", buffer ); - if (!(*pModRef = MODULE_FindModule( buffer ))) - { - /* If the DLL is not loaded yet, load it and store */ - /* its handle in the list of DLLs to initialize. */ - HMODULE16 hDLL; - - if ((hDLL = MODULE_Load( buffer, NE_FFLAGS_IMPLICIT, - NULL, NULL, 0 )) == 2) - { - /* file not found */ - char *p; - - /* Try with prepending the path of the current module */ - GetModuleFileName16( pModule->self, buffer, sizeof(buffer) ); - if (!(p = strrchr( buffer, '\\' ))) p = buffer; - memcpy( p + 1, pstr + 1, *pstr ); - strcpy( p + 1 + *pstr, ".dll" ); - hDLL = MODULE_Load( buffer, NE_FFLAGS_IMPLICIT, NULL, NULL, 0); - } - if (hDLL < 32) - { - /* FIXME: cleanup what was done */ - - fprintf( stderr, "Could not load '%s' required by '%.*s', error = %d\n", - buffer, *((BYTE*)pModule + pModule->name_table), - (char *)pModule + pModule->name_table + 1, hDLL ); - return FALSE; - } - *pModRef = MODULE_HANDLEtoHMODULE16( hDLL ); - *pDLLs++ = *pModRef; - } - else /* Increment the reference count of the DLL */ - { - NE_MODULE *pOldDLL = MODULE_GetPtr( *pModRef ); - if (pOldDLL) pOldDLL->count++; - } - } - return TRUE; -} - - /*********************************************************************** * NE_FixupPrologs * @@ -589,7 +536,7 @@ static BOOL32 NE_InitDLL( TDB* pTask, HMODULE16 hModule ) * es:si command line (always 0) */ - if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE; + if (!(pModule = MODULE_GetPtr16( hModule ))) return FALSE; pSegTable = NE_SEG_TABLE( pModule ); if (!(pModule->flags & NE_FFLAGS_LIBMODULE) || @@ -666,7 +613,7 @@ void NE_InitializeDLLs( HMODULE16 hModule ) NE_MODULE *pModule; HMODULE16 *pDLL; - if (!(pModule = MODULE_GetPtr( hModule ))) return; + if (!(pModule = MODULE_GetPtr16( hModule ))) return; if (pModule->flags & NE_FFLAGS_WIN32) return; if (pModule->dlls_to_init) @@ -694,3 +641,72 @@ void WINAPI PatchCodeHandle(HANDLE16 hSel) { fprintf(stderr,"PatchCodeHandle(%04x),stub!\n",hSel); } + + +/*********************************************************************** + * NE_Ne2MemFlags + * + * This function translates NE segment flags to GlobalAlloc flags + */ +static WORD NE_Ne2MemFlags(WORD flags) +{ + WORD memflags = 0; +#if 0 + if (flags & NE_SEGFLAGS_DISCARDABLE) + memflags |= GMEM_DISCARDABLE; + if (flags & NE_SEGFLAGS_MOVEABLE || + ( ! (flags & NE_SEGFLAGS_DATA) && + ! (flags & NE_SEGFLAGS_LOADED) && + ! (flags & NE_SEGFLAGS_ALLOCATED) + ) + ) + memflags |= GMEM_MOVEABLE; + memflags |= GMEM_ZEROINIT; +#else + memflags = GMEM_ZEROINIT | GMEM_FIXED; + return memflags; +#endif +} + +/*********************************************************************** + * NE_AllocateSegment (WPROCS.26) + */ +DWORD WINAPI NE_AllocateSegment( WORD wFlags, WORD wSize, WORD wElem ) +{ + WORD size = wSize << wElem; + HANDLE16 hMem = GlobalAlloc16( NE_Ne2MemFlags(wFlags), size); + return MAKELONG( hMem, GlobalHandleToSel(hMem) ); +} + + +/*********************************************************************** + * NE_CreateSegments + */ +BOOL32 NE_CreateSegments( HMODULE16 hModule ) +{ + SEGTABLEENTRY *pSegment; + NE_MODULE *pModule; + int i, minsize; + + if (!(pModule = MODULE_GetPtr16( hModule ))) return FALSE; + assert( !(pModule->flags & NE_FFLAGS_WIN32) ); + + pSegment = NE_SEG_TABLE( pModule ); + for (i = 1; i <= pModule->seg_count; i++, pSegment++) + { + minsize = pSegment->minsize ? pSegment->minsize : 0x10000; + if (i == pModule->ss) minsize += pModule->stack_size; + /* The DGROUP is allocated by MODULE_CreateInstance */ + if (i == pModule->dgroup) continue; + pSegment->selector = GLOBAL_Alloc( NE_Ne2MemFlags(pSegment->flags), + minsize, hModule, + !(pSegment->flags & NE_SEGFLAGS_DATA), + FALSE, + FALSE /*pSegment->flags & NE_SEGFLAGS_READONLY*/ ); + if (!pSegment->selector) return FALSE; + } + + pModule->dgroup_entry = pModule->dgroup ? pModule->seg_table + + (pModule->dgroup - 1) * sizeof(SEGTABLEENTRY) : 0; + return TRUE; +} diff --git a/loader/pe_image.c b/loader/pe_image.c index 43cc74c224b..12c962e69a4 100644 --- a/loader/pe_image.c +++ b/loader/pe_image.c @@ -49,6 +49,7 @@ #include "winbase.h" #include "callback.h" #include "file.h" +#include "heap.h" #include "neexe.h" #include "peexe.h" #include "process.h" @@ -59,11 +60,13 @@ #include "task.h" #include "debug.h" -static void PE_InitDLL(PE_MODREF* modref, DWORD type, LPVOID lpReserved); +static void PE_InitDLL(WINE_MODREF *wm, DWORD type, LPVOID lpReserved); /* convert PE image VirtualAddress to Real Address */ #define RVA(x) ((unsigned int)load_addr+(unsigned int)(x)) +#define AdjustPtr(ptr,delta) ((char *)(ptr) + (delta)) + void dump_exports( HMODULE32 hModule ) { char *Module; @@ -116,44 +119,40 @@ void dump_exports( HMODULE32 hModule ) * If it is a ordinal: * - use ordinal-pe_export->Base as offset into the functionlist */ -FARPROC32 PE_FindExportedFunction( PDB32 *process, HMODULE32 hModule, - LPCSTR funcName) +FARPROC32 PE_FindExportedFunction( + PDB32 *process, /* [in] process context */ + WINE_MODREF *wm, /* [in] WINE modreference */ + LPCSTR funcName ) /* [in] function name */ { - IMAGE_EXPORT_DIRECTORY *exports; - unsigned load_addr; u_short * ordinal; u_long * function; u_char ** name, *ename; int i; - PE_MODREF *pem; + PE_MODREF *pem = &(wm->binfmt.pe); + IMAGE_EXPORT_DIRECTORY *exports = pem->pe_export; + unsigned int load_addr = wm->module; u_long rva_start, rva_end, addr; char * forward; - pem = process->modref_list; - while (pem && (pem->module != hModule)) - pem=pem->next; - if (!pem) { - fprintf(stderr,"No MODREF found for PE_MODULE %08x in process %p\n",hModule,process); - return NULL; - } - load_addr = hModule; - exports = pem->pe_export; - if (HIWORD(funcName)) TRACE(win32,"(%s)\n",funcName); else TRACE(win32,"(%d)\n",(int)funcName); if (!exports) { - fprintf(stderr,"Module %08x/MODREF %p doesn't have a exports table.\n",hModule,pem); + /* Not a fatal problem, some apps do + * GetProcAddress(0,"RegisterPenApp") which triggers this + * case. + */ + WARN(win32,"Module %08x(%s)/MODREF %p doesn't have a exports table.\n",wm->module,wm->modname,pem); return NULL; } ordinal = (u_short*) RVA(exports->AddressOfNameOrdinals); function= (u_long*) RVA(exports->AddressOfFunctions); name = (u_char **) RVA(exports->AddressOfNames); forward = NULL; - rva_start = PE_HEADER(hModule)->OptionalHeader + rva_start = PE_HEADER(wm->module)->OptionalHeader .DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; - rva_end = rva_start + PE_HEADER(hModule)->OptionalHeader + rva_end = rva_start + PE_HEADER(wm->module)->OptionalHeader .DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size; if (HIWORD(funcName)) { @@ -188,23 +187,30 @@ FARPROC32 PE_FindExportedFunction( PDB32 *process, HMODULE32 hModule, HMODULE32 hMod; char module[256]; char *end = strchr(forward, '.'); + if (!end) return NULL; + assert(end-forward<256); strncpy(module, forward, (end - forward)); module[end-forward] = 0; - hMod = MODULE_HANDLEtoHMODULE32( MODULE_FindModule(module) ); - return PE_FindExportedFunction( process, hMod, end + 1); + hMod = MODULE_FindModule32(process,module); + assert(hMod); + return MODULE_GetProcAddress32( process, hMod, end + 1); } return NULL; } -DWORD fixup_imports (PDB32 *process,PE_MODREF *pem) +DWORD fixup_imports (PDB32 *process,WINE_MODREF *wm) { IMAGE_IMPORT_DESCRIPTOR *pe_imp; + WINE_MODREF *xwm; + PE_MODREF *pem; int fixup_failed = 0; - unsigned int load_addr = pem->module; + unsigned int load_addr = wm->module; int i; char *modname; + assert(wm->type==MODULE32_PE); + pem = &(wm->binfmt.pe); if (pem->pe_export) modname = (char*) RVA(pem->pe_export->Name); else @@ -229,10 +235,8 @@ DWORD fixup_imports (PDB32 *process,PE_MODREF *pem) /* FIXME: should terminate on 0 Characteristics */ for (i = 0, pe_imp = pem->pe_import; pe_imp->Name; pe_imp++) { HMODULE32 res; - PE_MODREF *xpem,**ypem; - - - char *name = (char *) RVA(pe_imp->Name); + WINE_MODREF **ywm; + char *name = (char *) RVA(pe_imp->Name); /* don't use MODULE_Load, Win32 creates new task differently */ res = PE_LoadLibraryEx32A( name, process, 0, 0 ); @@ -240,7 +244,7 @@ DWORD fixup_imports (PDB32 *process,PE_MODREF *pem) char buffer[1024]; /* Try with prepending the path of the current module */ - if (GetModuleFileName32A( pem->module, buffer, sizeof (buffer))) { + if (GetModuleFileName32A( wm->module, buffer, sizeof (buffer))) { char *p; if (!(p = strrchr (buffer, '\\'))) @@ -251,36 +255,35 @@ DWORD fixup_imports (PDB32 *process,PE_MODREF *pem) ERR(win32,"cannot find the module just loaded!\n"); } if (res <= (HMODULE32) 32) { - fprintf (stderr, "Module %s not found\n", name); + WARN (module, "Module %s not found\n", name); return res; } - res = MODULE_HANDLEtoHMODULE32(res); - xpem = pem->next; - while (xpem) { - if (xpem->module == res) + xwm = wm->next; + while (xwm) { + if (xwm->module == res) break; - xpem = xpem->next; + xwm = xwm->next; } - if (xpem) { + if (xwm) { /* It has been loaded *BEFORE* us, so we have to initialize - * it before us. We cannot just link in the xpem before pem, - * since xpem might reference more dlls which would be in the + * it before us. We cannot just link in the xwm before wm, + * since xwm might reference more dlls which would be in the * wrong order after that. - * Instead we link in pem right AFTER xpem, which should keep + * Instead we link in wm right AFTER xwm, which should keep * the correct order. (I am not 100% sure about that.) */ - /* unlink pem from chain */ - ypem = &(process->modref_list); - while (*ypem) { - if ((*ypem)==pem) + /* unlink wm from chain */ + ywm = &(process->modref_list); + while (*ywm) { + if ((*ywm)==wm) break; - ypem = &((*ypem)->next); + ywm = &((*ywm)->next); } - *ypem = pem->next; + *ywm = wm->next; - /* link pem directly AFTER xpem */ - pem->next = xpem->next; - xpem->next = pem; + /* link wm directly AFTER xwm */ + wm->next = xwm->next; + xwm->next = wm; } i++; @@ -293,7 +296,8 @@ DWORD fixup_imports (PDB32 *process,PE_MODREF *pem) HMODULE32 hImpModule; Module = (char *) RVA(pe_imp->Name); - hImpModule = MODULE_HANDLEtoHMODULE32( MODULE_FindModule(Module) ); + hImpModule = MODULE_FindModule32(process,Module); + assert(hImpModule); /* we have imported it, so it MUST be there */ TRACE(win32, "%s\n", Module); /* FIXME: forwarder entries ... */ @@ -308,20 +312,22 @@ DWORD fixup_imports (PDB32 *process,PE_MODREF *pem) int ordinal = IMAGE_ORDINAL(import_list->u1.Ordinal); TRACE(win32, "--- Ordinal %s,%d\n", Module, ordinal); - thunk_list->u1.Function=(LPDWORD)PE_FindExportedFunction( - process, hImpModule, (LPCSTR)ordinal); + thunk_list->u1.Function=(LPDWORD)MODULE_GetProcAddress32( + process, hImpModule, (LPCSTR)ordinal + ); if (!thunk_list->u1.Function) { - fprintf(stderr,"No implementation for %s.%d, setting to NULL\n", + WARN(win32,"No implementation for %s.%d, setting to NULL\n", Module, ordinal); /* fixup_failed=1; */ } } else { /* import by name */ pe_name = (LPIMAGE_IMPORT_BY_NAME)RVA(import_list->u1.AddressOfData); TRACE(win32, "--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint); - thunk_list->u1.Function=(LPDWORD)PE_FindExportedFunction( - process, hImpModule, pe_name->Name); + thunk_list->u1.Function=(LPDWORD)MODULE_GetProcAddress32( + process, hImpModule, pe_name->Name + ); if (!thunk_list->u1.Function) { - fprintf(stderr,"No implementation for %s.%d(%s), setting to NULL\n", + WARN(win32,"No implementation for %s.%d(%s), setting to NULL\n", Module,pe_name->Hint,pe_name->Name); /* fixup_failed=1; */ } @@ -338,10 +344,11 @@ DWORD fixup_imports (PDB32 *process,PE_MODREF *pem) int ordinal = IMAGE_ORDINAL(thunk_list->u1.Ordinal); TRACE(win32,"--- Ordinal %s.%d\n",Module,ordinal); - thunk_list->u1.Function=(LPDWORD)PE_FindExportedFunction( - process, hImpModule, (LPCSTR) ordinal); + thunk_list->u1.Function=(LPDWORD)MODULE_GetProcAddress32( + process, hImpModule, (LPCSTR) ordinal + ); if (!thunk_list->u1.Function) { - fprintf(stderr, "No implementation for %s.%d, setting to NULL\n", + WARN(win32, "No implementation for %s.%d, setting to NULL\n", Module,ordinal); /* fixup_failed=1; */ } @@ -349,10 +356,11 @@ DWORD fixup_imports (PDB32 *process,PE_MODREF *pem) pe_name=(LPIMAGE_IMPORT_BY_NAME) RVA(thunk_list->u1.AddressOfData); TRACE(win32,"--- %s %s.%d\n", pe_name->Name,Module,pe_name->Hint); - thunk_list->u1.Function=(LPDWORD)PE_FindExportedFunction( - process, hImpModule, pe_name->Name ); + thunk_list->u1.Function=(LPDWORD)MODULE_GetProcAddress32( + process, hImpModule, pe_name->Name + ); if (!thunk_list->u1.Function) { - fprintf(stderr, "No implementation for %s.%d, setting to NULL\n", + WARN(win32, "No implementation for %s.%d, setting to NULL\n", Module, pe_name->Hint); /* fixup_failed=1; */ } @@ -392,10 +400,12 @@ static int calc_vma_size( HMODULE32 hModule ) return vma_size; } -static void do_relocations(PE_MODREF *pem) +static void do_relocations(WINE_MODREF *wm) { - int delta = pem->module - PE_HEADER(pem->module)->OptionalHeader.ImageBase; - unsigned int load_addr= pem->module; + PE_MODREF *pem = &(wm->binfmt.pe); + int delta = wm->module - PE_HEADER(wm->module)->OptionalHeader.ImageBase; + unsigned int load_addr= wm->module; + IMAGE_BASE_RELOCATION *r = pem->pe_reloc; int hdelta = (delta >> 16) & 0xFFFF; int ldelta = delta & 0xFFFF; @@ -438,13 +448,13 @@ static void do_relocations(PE_MODREF *pem) #endif break; case IMAGE_REL_BASED_HIGHADJ: - fprintf(stderr, "Don't know what to do with IMAGE_REL_BASED_HIGHADJ\n"); + WARN(win32, "Don't know what to do with IMAGE_REL_BASED_HIGHADJ\n"); break; case IMAGE_REL_BASED_MIPS_JMPADDR: - fprintf(stderr, "Is this a MIPS machine ???\n"); + WARN(win32, "Is this a MIPS machine ???\n"); break; default: - fprintf(stderr, "Unknown fixup type\n"); + WARN(win32, "Unknown fixup type\n"); break; } } @@ -476,7 +486,7 @@ static HMODULE32 PE_LoadImage( HFILE32 hFile ) 0, 0, NULL ); if (!mapping) { - fprintf( stderr, "PE_LoadImage: CreateFileMapping error %ld\n", + WARN( win32, "CreateFileMapping error %ld\n", GetLastError() ); return 0; } @@ -484,34 +494,33 @@ static HMODULE32 PE_LoadImage( HFILE32 hFile ) CloseHandle( mapping ); if (!hModule) { - fprintf( stderr, "PE_LoadImage: MapViewOfFile error %ld\n", + WARN( win32, "PE_LoadImage: MapViewOfFile error %ld\n", GetLastError() ); return 0; } if (PE_HEADER(hModule)->Signature != IMAGE_NT_SIGNATURE) { - fprintf(stderr,"image doesn't have PE signature, but 0x%08lx\n", + WARN(win32,"image doesn't have PE signature, but 0x%08lx\n", PE_HEADER(hModule)->Signature ); goto error; } if (PE_HEADER(hModule)->FileHeader.Machine != IMAGE_FILE_MACHINE_I386) { - fprintf(stderr,"trying to load PE image for unsupported architecture ("); + MSG("Trying to load PE image for unsupported architecture ("); switch (PE_HEADER(hModule)->FileHeader.Machine) { - case IMAGE_FILE_MACHINE_UNKNOWN: fprintf(stderr,"Unknown"); break; - case IMAGE_FILE_MACHINE_I860: fprintf(stderr,"I860"); break; - case IMAGE_FILE_MACHINE_R3000: fprintf(stderr,"R3000"); break; - case IMAGE_FILE_MACHINE_R4000: fprintf(stderr,"R4000"); break; - case IMAGE_FILE_MACHINE_R10000: fprintf(stderr,"R10000"); break; - case IMAGE_FILE_MACHINE_ALPHA: fprintf(stderr,"Alpha"); break; - case IMAGE_FILE_MACHINE_POWERPC: fprintf(stderr,"PowerPC"); break; - default: fprintf(stderr,"Unknown-%04x", + case IMAGE_FILE_MACHINE_UNKNOWN: MSG("Unknown\n"); break; + case IMAGE_FILE_MACHINE_I860: MSG("I860\n"); break; + case IMAGE_FILE_MACHINE_R3000: MSG("R3000\n"); break; + case IMAGE_FILE_MACHINE_R4000: MSG("R4000\n"); break; + case IMAGE_FILE_MACHINE_R10000: MSG("R10000\n"); break; + case IMAGE_FILE_MACHINE_ALPHA: MSG("Alpha\n"); break; + case IMAGE_FILE_MACHINE_POWERPC: MSG("PowerPC\n"); break; + default: MSG("Unknown-%04x\n", PE_HEADER(hModule)->FileHeader.Machine); break; } - fprintf(stderr,")\n"); goto error; } return hModule; @@ -527,6 +536,7 @@ error: static BOOL32 PE_MapImage( HMODULE32 *phModule, PDB32 *process, OFSTRUCT *ofs, DWORD flags ) { + WINE_MODREF *wm; PE_MODREF *pem; int i, result; DWORD load_addr; @@ -539,17 +549,21 @@ static BOOL32 PE_MapImage( HMODULE32 *phModule, PDB32 *process, IMAGE_DOS_HEADER *dos_header = (IMAGE_DOS_HEADER *)hModule; IMAGE_NT_HEADERS *nt_header = PE_HEADER(hModule); - pem = (PE_MODREF*)HeapAlloc(process->heap,HEAP_ZERO_MEMORY, - sizeof(*pem)); + + wm = (WINE_MODREF*)HeapAlloc(process->heap,HEAP_ZERO_MEMORY, + sizeof(*wm)); + wm->type= MODULE32_PE; + pem = &(wm->binfmt.pe); + /* NOTE: fixup_imports takes care of the correct order */ - pem->next = process->modref_list; - process->modref_list = pem; + wm->next = process->modref_list; + process->modref_list = wm; if (!(nt_header->FileHeader.Characteristics & IMAGE_FILE_DLL)) { if (process->exe_modref) - fprintf(stderr,"overwriting old exe_modref... arrgh\n"); - process->exe_modref = pem; + WARN(win32,"overwriting old exe_modref... arrgh\n"); + process->exe_modref = wm; } load_addr = nt_header->OptionalHeader.ImageBase; @@ -566,10 +580,13 @@ static BOOL32 PE_MapImage( HMODULE32 *phModule, PDB32 *process, /* *phModule is the module32 entry in the NE_MODULE. We need to * change it here, since it can get referenced by fixup_imports() */ - pem->module = *phModule = (HMODULE32)load_addr; + wm->module = *phModule = (HMODULE32)load_addr; TRACE(win32, "Load addr is really %lx, range %x\n", load_addr, vma_size); + + TRACE(segment, "Loading %s at %lx, range %x\n", + ofs->szPathName, load_addr, vma_size ); /* Store the NT header at the load addr * (FIXME: should really use mmap) @@ -620,7 +637,7 @@ static BOOL32 PE_MapImage( HMODULE32 *phModule, PDB32 *process, if(dir.Size) { if(pem->pe_export && (int)pem->pe_export!=RVA(dir.VirtualAddress)) - fprintf(stderr,"wrong export directory??\n"); + WARN(win32,"wrong export directory??\n"); /* always trust the directory */ pem->pe_export = (LPIMAGE_EXPORT_DIRECTORY) RVA(dir.VirtualAddress); } @@ -630,7 +647,7 @@ static BOOL32 PE_MapImage( HMODULE32 *phModule, PDB32 *process, { /* if(pem->pe_import && (int)pem->pe_import!=RVA(dir.VirtualAddress)) - fprintf(stderr,"wrong import directory??\n"); + WARN(win32,"wrong import directory??\n"); */ pem->pe_import = (LPIMAGE_IMPORT_DESCRIPTOR) RVA(dir.VirtualAddress); } @@ -639,7 +656,7 @@ static BOOL32 PE_MapImage( HMODULE32 *phModule, PDB32 *process, if(dir.Size) { if(pem->pe_resource && (int)pem->pe_resource!=RVA(dir.VirtualAddress)) - fprintf(stderr,"wrong resource directory??\n"); + WARN(win32,"wrong resource directory??\n"); pem->pe_resource = (LPIMAGE_RESOURCE_DIRECTORY) RVA(dir.VirtualAddress); } @@ -655,7 +672,7 @@ static BOOL32 PE_MapImage( HMODULE32 *phModule, PDB32 *process, if(dir.Size) { if(pem->pe_reloc && (int)pem->pe_reloc!= RVA(dir.VirtualAddress)) - fprintf(stderr,"wrong relocation list??\n"); + WARN(win32,"wrong relocation list??\n"); pem->pe_reloc = (void *) RVA(dir.VirtualAddress); } @@ -685,20 +702,33 @@ static BOOL32 PE_MapImage( HMODULE32 *phModule, PDB32 *process, if(nt_header->OptionalHeader.DataDirectory[15].Size) FIXME(win32,"Unknown directory 15 ignored\n"); - if(pem->pe_reloc) do_relocations(pem); - if(pem->pe_export) dump_exports(pem->module); + if(pem->pe_reloc) do_relocations(wm); + if(pem->pe_export) { + dump_exports(wm->module); + + wm->modname = HEAP_strdupA(process->heap,0,(char*)RVA(pem->pe_export->Name)); + } else { + /* try to find out the name from the OFSTRUCT */ + char *s; + modname = s = ofs->szPathName; + while ((s=strchr(modname,'\\'))) + modname = s+1; + if ((s=strchr(modname,'.'))) + *s='\0'; + wm->modname = HEAP_strdupA(process->heap,0,modname); + } if(pem->pe_import) { - if (fixup_imports(process,pem)) { - PE_MODREF **xpem; + if (fixup_imports(process,wm)) { + WINE_MODREF **xwm; /* remove entry from modref chain */ - xpem = &(process->modref_list); - while (*xpem) { - if (*xpem==pem) { - *xpem = pem->next; + xwm = &(process->modref_list); + while (*xwm) { + if (*xwm==wm) { + *xwm = wm->next; break; } - xpem = &((*xpem)->next); + xwm = &((*xwm)->next); } /* FIXME: there are several more dangling references * left. Including dlls loaded by this dll before the @@ -710,17 +740,6 @@ static BOOL32 PE_MapImage( HMODULE32 *phModule, PDB32 *process, } } - if (pem->pe_export) - modname = (char*)RVA(pem->pe_export->Name); - else { - char *s; - modname = s = ofs->szPathName; - while ((s=strchr(modname,'\\'))) - modname = s+1; - if ((s=strchr(modname,'.'))) - *s='\0'; - } - /* Now that we got everything at the right address, * we can unmap the previous module */ UnmapViewOfFile( (LPVOID)hModule ); @@ -738,71 +757,52 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, PDB32 *process, OFSTRUCT ofs; HMODULE32 hModule; NE_MODULE *pModule; - PE_MODREF *pem; + WINE_MODREF *wm; - if ((hModule = MODULE_FindModule( name ))) { - /* the .DLL is either loaded or internal */ - hModule = MODULE_HANDLEtoHMODULE32(hModule); - if (!HIWORD(hModule)) /* internal (or bad) */ - return hModule; - /* check if this module is already mapped */ - pem = process->modref_list; - pModule = MODULE_GetPtr(hModule); - while (pem) { - if (pem->module == hModule) { + if ((hModule = MODULE_FindModule32( process, name ))) { + + pModule = MODULE_GetPtr32(hModule); + for (wm= process->modref_list;wm;wm=wm->next) + if (wm->module == hModule) { pModule->count++; return hModule; } - pem = pem->next; - } - if (pModule->flags & NE_FFLAGS_BUILTIN) { - IMAGE_DOS_HEADER *dh; - IMAGE_NT_HEADERS *nh; - IMAGE_SECTION_HEADER *sh; - - /* we only come here if we already have 'loaded' the - * internal dll but in another process. Just create - * a PE_MODREF and return. - */ - pem = (PE_MODREF*)HeapAlloc(process->heap, - HEAP_ZERO_MEMORY,sizeof(*pem)); - pem->module = hModule; - dh = (IMAGE_DOS_HEADER*)pem->module; - nh = (IMAGE_NT_HEADERS*)(dh+1); - sh = (IMAGE_SECTION_HEADER*)(nh+1); - pem->pe_export = (IMAGE_EXPORT_DIRECTORY*)(sh+2); - pem->next = process->modref_list; - process->modref_list = pem; - return hModule; - } - } else { - - /* try to load builtin, enabled modules first */ - if ((hModule = BUILTIN32_LoadModule( name, FALSE, process ))) - return MODULE_HANDLEtoHMODULE32( hModule ); - - /* try to open the specified file */ - if (HFILE_ERROR32==(hFile=OpenFile32(name,&ofs,OF_READ))) { - /* Now try the built-in even if disabled */ - if ((hModule = BUILTIN32_LoadModule( name, TRUE, process ))) { - fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name ); - return MODULE_HANDLEtoHMODULE32( hModule ); - } - return 1; - } - if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) { - _lclose32(hFile); - return hModule; - } - pModule = (NE_MODULE *)GlobalLock16( hModule ); - pModule->flags = NE_FFLAGS_WIN32; - pModule->module32 = PE_LoadImage( hFile ); - CloseHandle( hFile ); - if (pModule->module32 < 32) return 21; + /* Since MODULE_FindModule32 uses the modref chain too, the + * module MUST have been found above. If not, something has gone + * terribly wrong. + */ + assert(0); } - /* recurse */ + /* try to load builtin, enabled modules first */ + if ((hModule = BUILTIN32_LoadModule( name, FALSE, process ))) + return hModule; + + /* try to load the specified dll/exe */ + if (HFILE_ERROR32==(hFile=OpenFile32(name,&ofs,OF_READ))) { + /* Now try the built-in even if disabled */ + if ((hModule = BUILTIN32_LoadModule( name, TRUE, process ))) { + fprintf( stderr, "Warning: could not load external DLL '%s', using built-in module.\n", name ); + return hModule; + } + return 1; + } + if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) { + _lclose32(hFile); + return hModule; + } + pModule = (NE_MODULE *)GlobalLock16( hModule ); + pModule->flags = NE_FFLAGS_WIN32; + pModule->module32 = PE_LoadImage( hFile ); + CloseHandle( hFile ); + if (pModule->module32 < 32) + { + FreeLibrary32( hModule); + return 21; /* FIXME: probably 0 */ + } + + /* (possible) recursion */ if (!PE_MapImage( &(pModule->module32), process, &ofs,flags)) { - /* should free this module and the already referenced ones */ + /* FIXME: should free this module and its referenced ones */ return 0; } return pModule->module32; @@ -829,7 +829,7 @@ HINSTANCE16 PE_LoadModule( HFILE32 hFile, OFSTRUCT *ofs, LPCSTR cmd_line, pModule->module32 = hModule32 = PE_LoadImage( hFile ); if (hModule32 < 32) return 21; - hInstance = MODULE_CreateInstance( hModule16, (cmd_line == NULL) ); + hInstance = MODULE_CreateInstance( hModule16, NULL, (cmd_line == NULL) ); if (cmd_line && !(PE_HEADER(hModule32)->FileHeader.Characteristics & IMAGE_FILE_DLL)) { @@ -848,9 +848,12 @@ HINSTANCE16 PE_LoadModule( HFILE32 hFile, OFSTRUCT *ofs, LPCSTR cmd_line, return hInstance; } +/********************************************************************* + * PE_UnloadImage [internal] + */ int PE_UnloadImage( HMODULE32 hModule ) { - fprintf(stderr,"PEunloadImage() called!\n"); + FIXME(win32,"stub.\n"); /* free resources, image, unmap */ return 1; } @@ -860,10 +863,12 @@ int PE_UnloadImage( HMODULE32 hModule ) * DLL_PROCESS_ATTACH. Only new created threads do DLL_THREAD_ATTACH * (SDK) */ -static void PE_InitDLL(PE_MODREF *pem, DWORD type,LPVOID lpReserved) +static void PE_InitDLL(WINE_MODREF *wm, DWORD type,LPVOID lpReserved) { + if (wm->type!=MODULE32_PE) + return; if (type==DLL_PROCESS_ATTACH) - pem->flags |= PE_MODREF_PROCESS_ATTACHED; + wm->binfmt.pe.flags |= PE_MODREF_PROCESS_ATTACHED; /* DLL_ATTACH_PROCESS: * lpreserved is NULL for dynamic loads, not-NULL for static loads @@ -873,14 +878,14 @@ static void PE_InitDLL(PE_MODREF *pem, DWORD type,LPVOID lpReserved) */ /* Is this a library? And has it got an entrypoint? */ - if ((PE_HEADER(pem->module)->FileHeader.Characteristics & IMAGE_FILE_DLL) && - (PE_HEADER(pem->module)->OptionalHeader.AddressOfEntryPoint) + if ((PE_HEADER(wm->module)->FileHeader.Characteristics & IMAGE_FILE_DLL) && + (PE_HEADER(wm->module)->OptionalHeader.AddressOfEntryPoint) ) { - FARPROC32 entry = (FARPROC32)RVA_PTR( pem->module, + FARPROC32 entry = (FARPROC32)RVA_PTR( wm->module, OptionalHeader.AddressOfEntryPoint ); TRACE(relay, "CallTo32(entryproc=%p,module=%08x,type=%ld,res=%p)\n", - entry, pem->module, type, lpReserved ); - entry( pem->module, type, lpReserved ); + entry, wm->module, type, lpReserved ); + entry( wm->module, type, lpReserved ); } } @@ -889,57 +894,70 @@ static void PE_InitDLL(PE_MODREF *pem, DWORD type,LPVOID lpReserved) * LoadLibrary) ... but it won't matter) */ void PE_InitializeDLLs(PDB32 *process,DWORD type,LPVOID lpReserved) { - PE_MODREF *pem; + WINE_MODREF *wm; - pem = process->modref_list; - while (pem) { - if (pem->flags & PE_MODREF_NO_DLL_CALLS) { - pem = pem->next; + for (wm = process->modref_list;wm;wm=wm->next) { + PE_MODREF *pem = NULL; + if (wm->type!=MODULE32_PE) + continue; + pem = &(wm->binfmt.pe); + if (pem->flags & PE_MODREF_NO_DLL_CALLS) continue; - } if (type==DLL_PROCESS_ATTACH) { - if (pem->flags & PE_MODREF_PROCESS_ATTACHED) { - pem = pem->next; + if (pem->flags & PE_MODREF_PROCESS_ATTACHED) continue; - } } - PE_InitDLL( pem, type, lpReserved ); - pem = pem->next; + PE_InitDLL( wm, type, lpReserved ); } } void PE_InitTls(THDB *thdb) { - /* FIXME: tls callbacks ??? */ + WINE_MODREF *wm; PE_MODREF *pem; IMAGE_NT_HEADERS *peh; DWORD size,datasize; LPVOID mem; LPIMAGE_TLS_DIRECTORY pdir; PDB32 *pdb = thdb->process; - - pem = pdb->modref_list; - while (pem) { - peh = PE_HEADER(pem->module); - if (!peh->OptionalHeader.DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress) { - pem = pem->next; + int delta; + + for (wm = pdb->modref_list;wm;wm=wm->next) { + if (wm->type!=MODULE32_PE) continue; - } - pdir = (LPVOID)(pem->module + peh->OptionalHeader. + pem = &(wm->binfmt.pe); + peh = PE_HEADER(wm->module); + delta = wm->module - peh->OptionalHeader.ImageBase; + if (!peh->OptionalHeader.DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress) + continue; + pdir = (LPVOID)(wm->module + peh->OptionalHeader. DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress); + if (!(pem->flags & PE_MODREF_TLS_ALLOCED)) { pem->tlsindex = THREAD_TlsAlloc(thdb); - *(pdir->AddressOfIndex)=pem->tlsindex; + *(LPDWORD)AdjustPtr(pdir->AddressOfIndex,delta) + =pem->tlsindex; } pem->flags |= PE_MODREF_TLS_ALLOCED; datasize= pdir->EndAddressOfRawData-pdir->StartAddressOfRawData; size = datasize + pdir->SizeOfZeroFill; mem=VirtualAlloc(0,size,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); - memcpy(mem,(LPVOID) pdir->StartAddressOfRawData, datasize); + memcpy(mem, + AdjustPtr(pdir->StartAddressOfRawData,delta), + datasize); + /* don't use TlsSetValue, we are in the wrong thread */ + if (pdir->AddressOfCallBacks) { + LPIMAGE_TLS_CALLBACK *cbs = + (LPIMAGE_TLS_CALLBACK *) + AdjustPtr(pdir->AddressOfCallBacks, delta); + + if (*cbs) { + FIXME(win32, "TLS Callbacks aren't going to be called\n"); + } + } thdb->tls_array[pem->tlsindex] = mem; - pem=pem->next; } } @@ -949,13 +967,10 @@ void PE_InitTls(THDB *thdb) */ BOOL32 WINAPI DisableThreadLibraryCalls(HMODULE32 hModule) { - PDB32 *process = PROCESS_Current(); - PE_MODREF *pem = process->modref_list; + WINE_MODREF *wm; - while (pem) { - if (pem->module == hModule) - pem->flags|=PE_MODREF_NO_DLL_CALLS; - pem = pem->next; - } + for (wm=PROCESS_Current()->modref_list;wm;wm=wm->next) + if ((wm->module == hModule) && (wm->type==MODULE32_PE)) + wm->binfmt.pe.flags|=PE_MODREF_NO_DLL_CALLS; return TRUE; } diff --git a/loader/pe_resource.c b/loader/pe_resource.c index da06142d72e..2d058b52fd0 100644 --- a/loader/pe_resource.c +++ b/loader/pe_resource.c @@ -31,18 +31,13 @@ */ static PE_MODREF* HMODULE32toPE_MODREF(HMODULE32 hmod) { - NE_MODULE *pModule; + WINE_MODREF *wm; PDB32 *pdb = PROCESS_Current(); - PE_MODREF *pem; - if (!hmod) hmod = GetTaskDS(); /* FIXME: correct? */ - hmod = MODULE_HANDLEtoHMODULE32( hmod ); - if (!hmod) return NULL; - if (!(pModule = MODULE_GetPtr( hmod ))) return 0; - pem = pdb->modref_list; - while (pem && pem->module != hmod) - pem=pem->next; - return pem; + wm = MODULE32_LookupHMODULE( pdb, hmod ); + if (!wm || wm->type!=MODULE32_PE) + return NULL; + return &(wm->binfmt.pe); } /********************************************************************** @@ -106,12 +101,12 @@ LPIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(LPIMAGE_RESOURCE_DIRECTORY resdirptr, * PE_FindResourceEx32W */ HANDLE32 PE_FindResourceEx32W( - HINSTANCE32 hModule,LPCWSTR name,LPCWSTR type,WORD lang + WINE_MODREF *wm,LPCWSTR name,LPCWSTR type,WORD lang ) { LPIMAGE_RESOURCE_DIRECTORY resdirptr; DWORD root; HANDLE32 result; - PE_MODREF *pem = HMODULE32toPE_MODREF(hModule); + PE_MODREF *pem = &(wm->binfmt.pe); if (!pem || !pem->pe_resource) return 0; @@ -133,15 +128,11 @@ HANDLE32 PE_FindResourceEx32W( /********************************************************************** * PE_LoadResource32 */ -HANDLE32 PE_LoadResource32( HINSTANCE32 hModule, HANDLE32 hRsrc ) +HANDLE32 PE_LoadResource32( WINE_MODREF *wm, HANDLE32 hRsrc ) { - PE_MODREF *pem = HMODULE32toPE_MODREF(hModule); - - if (!pem || !pem->pe_resource) + if (!hRsrc || !wm || wm->type!=MODULE32_PE) return 0; - if (!hRsrc) - return 0; - return (HANDLE32) (pem->module + ((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData); + return (HANDLE32) (wm->module + ((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData); } diff --git a/loader/resource.c b/loader/resource.c index e3591b02352..32f2a6dba33 100644 --- a/loader/resource.c +++ b/loader/resource.c @@ -5,6 +5,7 @@ * Copyright 1995 Alexandre Julliard */ +#include #include #include #include @@ -18,6 +19,7 @@ #include "heap.h" #include "neexe.h" #include "task.h" +#include "process.h" #include "module.h" #include "resource.h" #include "debug.h" @@ -26,65 +28,11 @@ extern WORD WINE_LanguageId; -/* error message when 16-bit resource function is called for Win32 module */ -static const char* NEWin32FailureString = "fails with Win32 module\n"; -/* error message when 32-bit resource function is called for Win16 module */ -static const char* PEWin16FailureString = "fails with Win16 module\n"; - -/********************************************************************** - * FindResource16 (KERNEL.60) - */ -HRSRC16 WINAPI FindResource16( HMODULE16 hModule, SEGPTR name, SEGPTR type ) -{ - NE_MODULE *pModule; - - hModule = MODULE_HANDLEtoHMODULE16( hModule ); - - if (HIWORD(name)) /* Check for '#xxx' name */ - { - char *ptr = PTR_SEG_TO_LIN( name ); - if (ptr[0] == '#') - if (!(name = (SEGPTR)atoi( ptr + 1 ))) { - WARN(resource, "Incorrect resource name: %s\n", ptr); - return 0; - } - } - - if (HIWORD(type)) /* Check for '#xxx' type */ - { - char *ptr = PTR_SEG_TO_LIN( type ); - if (ptr[0] == '#') - if (!(type = (SEGPTR)atoi( ptr + 1 ))){ - WARN(resource, "Incorrect resource type: %s\n", ptr); - return 0; - } - } - - TRACE(resource, "module=%04x name=%s type=%s\n", - hModule, debugres_a(PTR_SEG_TO_LIN(name)), - debugres_a(PTR_SEG_TO_LIN(type)) ); - - if ((pModule = MODULE_GetPtr( hModule ))) - { - if (!__winelib) - { - if (pModule->flags & NE_FFLAGS_WIN32) - fprintf(stderr,"FindResource16: %s", NEWin32FailureString); - else - return NE_FindResource( hModule, type, name ); - } - else return LIBRES_FindResource16( hModule, - (LPCSTR)PTR_SEG_TO_LIN(name), - (LPCSTR)PTR_SEG_TO_LIN(type) ); - } - return 0; -} - /********************************************************************** * FindResource32A (KERNEL32.128) */ -HANDLE32 WINAPI FindResource32A( HINSTANCE32 hModule, LPCSTR name, LPCSTR type) +HANDLE32 WINAPI FindResource32A( HMODULE32 hModule, LPCSTR name, LPCSTR type) { return FindResourceEx32A(hModule,name,type,WINE_LanguageId); } @@ -92,9 +40,9 @@ HANDLE32 WINAPI FindResource32A( HINSTANCE32 hModule, LPCSTR name, LPCSTR type) /********************************************************************** * FindResourceEx32A (KERNEL32.129) */ -HANDLE32 WINAPI FindResourceEx32A( HINSTANCE32 hModule, LPCSTR name, - LPCSTR type, WORD lang ) -{ +HANDLE32 WINAPI FindResourceEx32A( HMODULE32 hModule, LPCSTR name, LPCSTR type, + WORD lang +) { LPWSTR xname,xtype; HANDLE32 ret; @@ -116,27 +64,34 @@ HANDLE32 WINAPI FindResourceEx32A( HINSTANCE32 hModule, LPCSTR name, /********************************************************************** * FindResourceEx32W (KERNEL32.130) */ -HRSRC32 WINAPI FindResourceEx32W( HINSTANCE32 hModule, LPCWSTR name, +HRSRC32 WINAPI FindResourceEx32W( HMODULE32 hModule, LPCWSTR name, LPCWSTR type, WORD lang ) { - if (!__winelib) - { - NE_MODULE *pModule; + WINE_MODREF *wm = MODULE32_LookupHMODULE(PROCESS_Current(),hModule); + HRSRC32 hrsrc; - if (!hModule) hModule = GetTaskDS(); - hModule = MODULE_HANDLEtoHMODULE32( hModule ); - TRACE(resource, "module=%08x " - "type=%s%p name=%s%p\n", hModule, - (HIWORD(type))? "" : "#", type, - (HIWORD(name))? "" : "#", name); - - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; - if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0; - return PE_FindResourceEx32W(hModule,name,type,lang); + TRACE(resource, "module=%08x " + "type=%s%p name=%s%p\n", wm->module, + (HIWORD(type))? "" : "#", type, + (HIWORD(name))? "" : "#", name); + if (__winelib) { + hrsrc = LIBRES_FindResource( hModule, name, type ); + if (hrsrc) + return hrsrc; } - else return LIBRES_FindResource32( hModule, name, type ); + if (wm) { + switch (wm->type) { + case MODULE32_PE: + return PE_FindResourceEx32W(wm,name,type,lang); + default: + ERR(module,"unknown module type %d\n",wm->type); + break; + } + } + return (HRSRC32)0; } + /********************************************************************** * FindResource32W (KERNEL32.131) */ @@ -146,99 +101,36 @@ HRSRC32 WINAPI FindResource32W(HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type) } -/********************************************************************** - * LoadResource16 (KERNEL.61) - */ -HGLOBAL16 WINAPI LoadResource16( HMODULE16 hModule, HRSRC16 hRsrc ) -{ - NE_MODULE *pModule; - - hModule = MODULE_HANDLEtoHMODULE16( hModule ); - TRACE(resource, "module=%04x res=%04x\n", - hModule, hRsrc ); - if (!hRsrc) return 0; - if ((pModule = MODULE_GetPtr( hModule ))) - { - if (!__winelib) - { - if (pModule->flags & NE_FFLAGS_WIN32) - fprintf(stderr,"LoadResource16: %s", NEWin32FailureString); - else - return NE_LoadResource( hModule, hRsrc ); - } - else return LIBRES_LoadResource( hModule, hRsrc ); - } - return 0; -} - /********************************************************************** * LoadResource32 (KERNEL32.370) + * 'loads' a resource. The current implementation just returns a pointer + * into the already mapped image. + * RETURNS + * pointer into the mapped resource of the passed module */ -HGLOBAL32 WINAPI LoadResource32( HINSTANCE32 hModule, HRSRC32 hRsrc ) +HGLOBAL32 WINAPI LoadResource32( + HINSTANCE32 hModule, /* [in] module handle */ + HRSRC32 hRsrc ) /* [in] resource handle */ { - if (!__winelib) - { - NE_MODULE *pModule; + WINE_MODREF *wm = MODULE32_LookupHMODULE(PROCESS_Current(),hModule); - if (!hModule) hModule = GetTaskDS(); /* FIXME: see FindResource32W */ - hModule = MODULE_HANDLEtoHMODULE32( hModule ); - TRACE(resource, "module=%04x res=%04x\n", - hModule, hRsrc ); - if (!hRsrc) return 0; - - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; - if (!(pModule->flags & NE_FFLAGS_WIN32)) - { - fprintf(stderr,"LoadResource32: %s", PEWin16FailureString ); - return 0; /* FIXME? */ - } - return PE_LoadResource32(hModule,hRsrc); + TRACE(resource, "module=%04x res=%04x\n", + hModule, hRsrc ); + if (!hRsrc) { + ERR(resource,"hRsrc is 0, return 0.\n"); + return 0; } - else return LIBRES_LoadResource( hModule, hRsrc ); -} - - -/********************************************************************** - * LockResource (KERNEL.62) - */ -/* 16-bit version */ -SEGPTR WINAPI WIN16_LockResource16(HGLOBAL16 handle) -{ - HMODULE16 hModule; - NE_MODULE *pModule; - - TRACE(resource, "handle=%04x\n", handle ); - if (!handle) return (SEGPTR)0; - hModule = MODULE_HANDLEtoHMODULE16( handle ); - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; - if (pModule->flags & NE_FFLAGS_WIN32) - { - fprintf(stderr,"LockResource16: %s", NEWin32FailureString); - return 0; - } - return NE_LockResource( hModule, handle ); -} - -/* Winelib 16-bit version */ -LPVOID WINAPI LockResource16( HGLOBAL16 handle ) -{ - if (!__winelib) - { - HMODULE16 hModule; - NE_MODULE *pModule; - - TRACE(resource, "handle=%04x\n", handle ); - if (!handle) return NULL; - hModule = MODULE_HANDLEtoHMODULE16( handle ); - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; - if (pModule->flags & NE_FFLAGS_WIN32) - { - fprintf(stderr,"LockResource16: %s", NEWin32FailureString); - return 0; - } - return (LPSTR)PTR_SEG_TO_LIN( NE_LockResource( hModule, handle ) ); - } - else return LIBRES_LockResource( handle ); + if (wm) + switch (wm->type) { + case MODULE32_PE: + return PE_LoadResource32(wm,hRsrc); + default: + ERR(resource,"unknown module type %d\n",wm->type); + break; + } + if (__winelib) + return LIBRES_LoadResource( hModule, hRsrc ); + return 0; } @@ -251,30 +143,6 @@ LPVOID WINAPI LockResource32( HGLOBAL32 handle ) } -/********************************************************************** - * FreeResource16 (KERNEL.63) - */ -BOOL16 WINAPI FreeResource16( HGLOBAL16 handle ) -{ - if (!__winelib) - { - HMODULE16 hModule; - NE_MODULE *pModule; - - TRACE(resource, "handle=%04x\n", handle ); - if (!handle) return FALSE; - hModule = MODULE_HANDLEtoHMODULE16( handle ); - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; - if (pModule->flags & NE_FFLAGS_WIN32) - { - fprintf(stderr,"FreeResource16: %s", NEWin32FailureString); - return 0; - } - return NE_FreeResource( hModule, handle ); - } - else return LIBRES_FreeResource( handle ); -} - /********************************************************************** * FreeResource32 (KERNEL32.145) */ @@ -285,126 +153,42 @@ BOOL32 WINAPI FreeResource32( HGLOBAL32 handle ) } -/********************************************************************** - * AccessResource16 (KERNEL.64) - */ -INT16 WINAPI AccessResource16( HINSTANCE16 hModule, HRSRC16 hRsrc ) -{ - NE_MODULE *pModule; - - hModule = MODULE_HANDLEtoHMODULE16( hModule ); - TRACE(resource, "module=%04x res=%04x\n", - hModule, hRsrc ); - if (!hRsrc) return 0; - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; - if (!__winelib) - { - if (pModule->flags & NE_FFLAGS_WIN32) - { - fprintf(stderr,"AccessResource16: %s", NEWin32FailureString); - return 0; - } - return NE_AccessResource( hModule, hRsrc ); - } - else return LIBRES_AccessResource( hModule, hRsrc ); -} - - /********************************************************************** * AccessResource32 (KERNEL32.64) */ -INT32 WINAPI AccessResource32( HINSTANCE32 hModule, HRSRC32 hRsrc ) +INT32 WINAPI AccessResource32( HMODULE32 hModule, HRSRC32 hRsrc ) { - hModule = MODULE_HANDLEtoHMODULE32( hModule ); - TRACE(resource, "module=%04x res=%04x\n", - hModule, hRsrc ); - if (!hRsrc) return 0; - fprintf(stderr,"AccessResource32: not implemented\n"); + FIXME(resource,"(module=%08x res=%08x),not implemented\n", hModule, hRsrc); return 0; } -/********************************************************************** - * SizeofResource16 (KERNEL.65) - */ -DWORD WINAPI SizeofResource16( HMODULE16 hModule, HRSRC16 hRsrc ) -{ - NE_MODULE *pModule; - - hModule = MODULE_HANDLEtoHMODULE16( hModule ); - TRACE(resource, "module=%04x res=%04x\n", - hModule, hRsrc ); - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; - if (!__winelib) - { - if (pModule->flags & NE_FFLAGS_WIN32) - { - fprintf(stderr,"SizeOfResource16: %s", NEWin32FailureString); - return 0; - } - return NE_SizeofResource( hModule, hRsrc ); - } - else return LIBRES_SizeofResource( hModule, hRsrc ); -} - - /********************************************************************** * SizeofResource32 (KERNEL32.522) */ DWORD WINAPI SizeofResource32( HINSTANCE32 hModule, HRSRC32 hRsrc ) { - hModule = MODULE_HANDLEtoHMODULE32( hModule ); - TRACE(resource, "module=%04x res=%04x\n", - hModule, hRsrc ); - if (!__winelib) return PE_SizeofResource32(hModule,hRsrc); - else - { - fprintf(stderr,"SizeofResource32: not implemented\n"); - return 0; - } -} + WINE_MODREF *wm = MODULE32_LookupHMODULE(PROCESS_Current(),hModule); - -/********************************************************************** - * AllocResource16 (KERNEL.66) - */ -HGLOBAL16 WINAPI AllocResource16( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size) -{ - NE_MODULE *pModule; - - hModule = MODULE_HANDLEtoHMODULE16( hModule ); - TRACE(resource, "module=%04x res=%04x size=%ld\n", - hModule, hRsrc, size ); - if (!hRsrc) return 0; - if (!(pModule = MODULE_GetPtr( hModule ))) return 0; - if (!__winelib) - { - if (pModule->flags & NE_FFLAGS_WIN32) + TRACE(resource, "module=%08x res=%08x\n", hModule, hRsrc ); + if (wm) + switch (wm->type) { - fprintf(stderr,"AllocResource16: %s", NEWin32FailureString); - return 0; - } - return NE_AllocResource( hModule, hRsrc, size ); - } - else return LIBRES_AllocResource( hModule, hRsrc, size ); -} - -/********************************************************************** - * DirectResAlloc (KERNEL.168) - * - * Check Schulman, p. 232 for details - */ -HGLOBAL16 WINAPI DirectResAlloc( HINSTANCE16 hInstance, WORD wType, - UINT16 wSize ) -{ - TRACE(resource,"(%04x,%04x,%04x)\n", - hInstance, wType, wSize ); - hInstance = MODULE_HANDLEtoHMODULE16(hInstance); - if(!hInstance)return 0; - if(wType != 0x10) /* 0x10 is the only observed value, passed from - CreateCursorIndirect. */ - fprintf(stderr, "DirectResAlloc: wType = %x\n", wType); - return GLOBAL_Alloc(GMEM_MOVEABLE, wSize, hInstance, FALSE, FALSE, FALSE); + case MODULE32_PE: + { + DWORD ret; + ret = PE_SizeofResource32(hModule,hRsrc); + if (ret) + return ret; + break; + } + default: + ERR(module,"unknown module type %d\n",wm->type); + break; + } + if (__winelib) + fprintf(stderr,"SizeofResource32: not implemented for WINELIB\n"); + return 0; } @@ -576,14 +360,22 @@ HACCEL32 WINAPI CreateAcceleratorTable32A(LPACCEL32 lpaccel, INT32 cEntries) return hAccel; } -/********************************************************************** - * DestroyAcceleratorTable (USER32.130) + +/****************************************************************************** + * DestroyAcceleratorTable [USER32.130] + * Destroys an accelerator table * - * By mortene@pvv.org 980321 + * NOTES + * By mortene@pvv.org 980321 + * + * PARAMS + * handle [I] Handle to accelerator table + * + * RETURNS STD */ BOOL32 WINAPI DestroyAcceleratorTable( HACCEL32 handle ) { - FIXME(accel, "stub (handle 0x%x)\n", handle); + FIXME(accel, "(0x%x): stub\n", handle); /* Weird.. I thought this should work. According to the API @@ -647,8 +439,7 @@ INT16 WINAPI LoadString16( HINSTANCE16 instance, UINT16 resource_id, buffer[0] = '\0'; return 0; } - fprintf(stderr,"LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p); - fprintf(stderr,"LoadString // and try to obtain string '%s'\n", p + 1); + WARN(resource,"Dont know why caller give buflen=%d *p=%d trying to obtain string '%s'\n", buflen, *p, p + 1); } FreeResource16( hmem ); @@ -698,8 +489,7 @@ INT32 WINAPI LoadString32W( HINSTANCE32 instance, UINT32 resource_id, return 0; } #if 0 - fprintf(stderr,"LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p); - fprintf(stderr,"LoadString // and try to obtain string '%s'\n", p + 1); + WARN(resource,"Dont know why caller give buflen=%d *p=%d trying to obtain string '%s'\n", buflen, *p, p + 1); #endif } @@ -757,7 +547,7 @@ INT32 WINAPI LoadString32A( HINSTANCE32 instance, UINT32 resource_id, /********************************************************************** * LoadMessage32A (internal) */ -INT32 LoadMessage32A( HINSTANCE32 instance, UINT32 id, WORD lang, +INT32 LoadMessage32A( HMODULE32 instance, UINT32 id, WORD lang, LPSTR buffer, INT32 buflen ) { HGLOBAL32 hmem; @@ -824,7 +614,7 @@ INT32 LoadMessage32A( HINSTANCE32 instance, UINT32 id, WORD lang, /********************************************************************** * LoadMessage32W (internal) */ -INT32 LoadMessage32W( HINSTANCE32 instance, UINT32 id, WORD lang, +INT32 LoadMessage32W( HMODULE32 instance, UINT32 id, WORD lang, LPWSTR buffer, INT32 buflen ) { INT32 retval; @@ -844,36 +634,13 @@ INT32 LoadMessage32W( HINSTANCE32 instance, UINT32 id, WORD lang, } -/********************************************************************** - * SetResourceHandler (KERNEL.43) - */ -FARPROC16 WINAPI SetResourceHandler( HMODULE16 hModule, SEGPTR s, - FARPROC16 resourceHandler ) -{ - NE_MODULE *pModule; - - hModule = GetExePtr( hModule ); - - TRACE(resource, "module=%04x type=%s\n", - hModule, debugres_a(PTR_SEG_TO_LIN(s)) ); - - if ((pModule = MODULE_GetPtr( hModule ))) - { - if (pModule->flags & NE_FFLAGS_WIN32) - fprintf(stderr,"SetResourceHandler: %s\n", NEWin32FailureString); - else if (pModule->res_table) - return NE_SetResourceHandler( hModule, s, resourceHandler ); - } - return NULL; -} - - /********************************************************************** * EnumResourceTypesA (KERNEL32.90) */ BOOL32 WINAPI EnumResourceTypes32A( HMODULE32 hmodule,ENUMRESTYPEPROC32A lpfun, LONG lParam) { + /* FIXME: move WINE_MODREF stuff here */ return PE_EnumResourceTypes32A(hmodule,lpfun,lParam); } @@ -883,6 +650,7 @@ BOOL32 WINAPI EnumResourceTypes32A( HMODULE32 hmodule,ENUMRESTYPEPROC32A lpfun, BOOL32 WINAPI EnumResourceTypes32W( HMODULE32 hmodule,ENUMRESTYPEPROC32W lpfun, LONG lParam) { + /* FIXME: move WINE_MODREF stuff here */ return PE_EnumResourceTypes32W(hmodule,lpfun,lParam); } @@ -892,6 +660,7 @@ BOOL32 WINAPI EnumResourceTypes32W( HMODULE32 hmodule,ENUMRESTYPEPROC32W lpfun, BOOL32 WINAPI EnumResourceNames32A( HMODULE32 hmodule, LPCSTR type, ENUMRESNAMEPROC32A lpfun, LONG lParam ) { + /* FIXME: move WINE_MODREF stuff here */ return PE_EnumResourceNames32A(hmodule,type,lpfun,lParam); } /********************************************************************** @@ -900,6 +669,7 @@ BOOL32 WINAPI EnumResourceNames32A( HMODULE32 hmodule, LPCSTR type, BOOL32 WINAPI EnumResourceNames32W( HMODULE32 hmodule, LPCWSTR type, ENUMRESNAMEPROC32W lpfun, LONG lParam ) { + /* FIXME: move WINE_MODREF stuff here */ return PE_EnumResourceNames32W(hmodule,type,lpfun,lParam); } @@ -910,6 +680,7 @@ BOOL32 WINAPI EnumResourceLanguages32A( HMODULE32 hmodule, LPCSTR type, LPCSTR name, ENUMRESLANGPROC32A lpfun, LONG lParam) { + /* FIXME: move WINE_MODREF stuff here */ return PE_EnumResourceLanguages32A(hmodule,type,name,lpfun,lParam); } /********************************************************************** @@ -919,5 +690,6 @@ BOOL32 WINAPI EnumResourceLanguages32W( HMODULE32 hmodule, LPCWSTR type, LPCWSTR name, ENUMRESLANGPROC32W lpfun, LONG lParam) { + /* FIXME: move WINE_MODREF stuff here */ return PE_EnumResourceLanguages32W(hmodule,type,name,lpfun,lParam); } diff --git a/loader/task.c b/loader/task.c index f168427de5c..99c76113091 100644 --- a/loader/task.c +++ b/loader/task.c @@ -208,7 +208,7 @@ static void TASK_CallToStart(void) { int exit_code = 1; TDB *pTask = (TDB *)GlobalLock16( hCurrentTask ); - NE_MODULE *pModule = MODULE_GetPtr( pTask->hModule ); + NE_MODULE *pModule = MODULE_GetPtr16( pTask->hModule ); SEGTABLEENTRY *pSegTable = NE_SEG_TABLE( pModule ); SET_CUR_THREAD( pTask->thdb ); @@ -262,7 +262,7 @@ static void TASK_CallToStart(void) Callbacks->CallRegisterShortProc( &context, 0 ); /* This should never return */ - fprintf( stderr, "TASK_CallToStart: Main program returned!\n" ); + ERR( task, "Main program returned! (should never happen)\n" ); TASK_KillCurrentTask( 1 ); } } @@ -331,7 +331,7 @@ HTASK16 TASK_Create( THDB *thdb, NE_MODULE *pModule, HINSTANCE16 hInstance, pTask->pdb.int20 = 0x20cd; pTask->pdb.dispatcher[0] = 0x9a; /* ljmp */ - PUT_DWORD(&pTask->pdb.dispatcher[1], (DWORD)MODULE_GetEntryPoint( + PUT_DWORD(&pTask->pdb.dispatcher[1], (DWORD)NE_GetEntryPoint( GetModuleHandle16("KERNEL"), 102 )); /* KERNEL.102 is DOS3Call() */ pTask->pdb.savedint22 = INT_GetHandler( 0x22 ); pTask->pdb.savedint23 = INT_GetHandler( 0x23 ); @@ -509,7 +509,7 @@ void TASK_KillCurrentTask( INT16 exitCode ) /* We should never return from this Yield() */ - fprintf(stderr,"Return of the living dead %04x!!!\n", hCurrentTask); + ERR(task,"Return of the living dead %04x!!!\n", hCurrentTask); exit(1); } @@ -660,7 +660,7 @@ void WINAPI InitTask( CONTEXT *context ) if (context) EAX_reg(context) = 0; if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return; - if (!(pModule = MODULE_GetPtr( pTask->hModule ))) return; + if (!(pModule = MODULE_GetPtr16( pTask->hModule ))) return; /* This is a hack to install task USER signal handler before * implicitly loaded DLLs are initialized (see windows/user.c) */ @@ -681,7 +681,6 @@ void WINAPI InitTask( CONTEXT *context ) * es:bx pointer to command-line inside PSP */ EAX_reg(context) = 1; - EBX_reg(context) = pTask->pdb.cmdLine[0] ? 0x81 : 0x80; if (!pTask->pdb.cmdLine[0]) EBX_reg(context) = 0x80; else @@ -857,7 +856,6 @@ FARPROC16 WINAPI MakeProcInstance16( FARPROC16 func, HANDLE16 hInstance ) SEGPTR thunkaddr; if (!hInstance) return 0; - if (__winelib) return func; /* func can be called directly in Winelib */ thunkaddr = TASK_AllocThunk( hCurrentTask ); if (!thunkaddr) return (FARPROC16)0; thunk = PTR_SEG_TO_LIN( thunkaddr ); @@ -868,7 +866,7 @@ FARPROC16 WINAPI MakeProcInstance16( FARPROC16 func, HANDLE16 hInstance ) if (((lfunc[0]==0x8c) && (lfunc[1]==0xd8)) || ((lfunc[0]==0x1e) && (lfunc[1]==0x58)) ) { - fprintf(stderr,"FIXME: MakeProcInstance16 thunk would be useless for %p, overwriting with nop;nop;\n", func ); + FIXME(task,"thunk would be useless for %p, overwriting with nop;nop;\n", func ); lfunc[0]=0x90; /* nop */ lfunc[1]=0x90; /* nop */ } @@ -888,7 +886,7 @@ FARPROC16 WINAPI MakeProcInstance16( FARPROC16 func, HANDLE16 hInstance ) void WINAPI FreeProcInstance16( FARPROC16 func ) { TRACE(task, "(%08lx)\n", (DWORD)func ); - if (!__winelib) TASK_FreeThunk( hCurrentTask, (SEGPTR)func ); + TASK_FreeThunk( hCurrentTask, (SEGPTR)func ); } @@ -900,8 +898,6 @@ HANDLE16 WINAPI GetCodeHandle( FARPROC16 proc ) HANDLE16 handle; BYTE *thunk = (BYTE *)PTR_SEG_TO_LIN( proc ); - if (__winelib) return 0; - /* Return the code segment containing 'proc'. */ /* Not sure if this is really correct (shouldn't matter that much). */ @@ -1015,7 +1011,7 @@ void WINAPI SwitchStackBack(void) return; if (!pData->old_ss_sp) { - fprintf( stderr, "SwitchStackBack: no previous SwitchStackTo\n" ); + WARN( task, "No previous SwitchStackTo\n" ); return; } TRACE(task, "restoring stack %04x:%04x\n", diff --git a/memory/environ.c b/memory/environ.c index 8e4a28a05ad..7fa10244d27 100644 --- a/memory/environ.c +++ b/memory/environ.c @@ -28,8 +28,8 @@ static const char ENV_program_name[] = "C:\\WINDOWS\\SYSTEM\\KRNL386.EXE"; -/* Maximum length of an environment string (including NULL) */ -#define MAX_STR_LEN 128 +/* Maximum length of a Win16 environment string (including NULL) */ +#define MAX_WIN16_LEN 128 /* Extra bytes to reserve at the end of an environment */ #define EXTRA_ENV_SIZE (sizeof(BYTE) + sizeof(WORD) + sizeof(ENV_program_name)) @@ -68,29 +68,23 @@ BOOL32 ENV_BuildEnvironment( PDB32 *pdb ) { extern char **environ; LPSTR p, *e; - int size, len; + int size; /* Compute the total size of the Unix environment */ size = EXTRA_ENV_SIZE; - for (e = environ; *e; e++) - { - len = strlen(*e) + 1; - size += MIN( len, MAX_STR_LEN ); - } + for (e = environ; *e; e++) size += strlen(*e) + 1; /* Now allocate the environment */ if (!(p = HeapAlloc( SystemHeap, 0, size ))) return FALSE; pdb->env_db->environ = p; - pdb->env_db->env_sel = SELECTOR_AllocBlock( p, 0x10000, SEGMENT_DATA, - FALSE, FALSE ); /* And fill it with the Unix environment */ for (e = environ; *e; e++) { - lstrcpyn32A( p, *e, MAX_STR_LEN ); + strcpy( p, *e ); p += strlen(p) + 1; } @@ -110,16 +104,24 @@ BOOL32 ENV_BuildEnvironment( PDB32 *pdb ) BOOL32 ENV_InheritEnvironment( PDB32 *pdb, LPCSTR env ) { DWORD size; - LPCSTR p; + LPCSTR src; + LPSTR dst; /* FIXME: should lock the parent environment */ if (!env) env = pdb->parent->env_db->environ; /* Compute the environment size */ - p = env; - while (*p) p += strlen(p) + 1; - size = (p - env); + src = env; + size = EXTRA_ENV_SIZE; + while (*src) + { + int len = strlen(src) + 1; + src += len; + if ((len > MAX_WIN16_LEN) && (pdb->flags & PDB32_WIN16_PROC)) + len = MAX_WIN16_LEN; + size += len; + } /* Copy the environment */ @@ -129,8 +131,18 @@ BOOL32 ENV_InheritEnvironment( PDB32 *pdb, LPCSTR env ) pdb->env_db->env_sel = SELECTOR_AllocBlock( pdb->env_db->environ, 0x10000, SEGMENT_DATA, FALSE, FALSE ); - memcpy( pdb->env_db->environ, env, size ); - FILL_EXTRA_ENV( pdb->env_db->environ + size ); + src = env; + dst = pdb->env_db->environ; + while (*src) + { + if (pdb->flags & PDB32_WIN16_PROC) + lstrcpyn32A( dst, src, MAX_WIN16_LEN ); + else + strcpy( dst, src ); + src += strlen(src) + 1; + dst += strlen(dst) + 1; + } + FILL_EXTRA_ENV( dst ); return TRUE; } @@ -314,7 +326,8 @@ BOOL32 WINAPI SetEnvironmentVariable32A( LPCSTR name, LPCSTR value ) } if (!(new_env = HeapReAlloc( pdb->heap, 0, env, old_size + len ))) goto done; - SELECTOR_MoveBlock( pdb->env_db->env_sel, new_env ); + if (pdb->env_db->env_sel) + SELECTOR_MoveBlock( pdb->env_db->env_sel, new_env ); p = new_env + (p - env); if (len > 0) memmove( p + len, p, old_size - (p - new_env) ); diff --git a/memory/global.c b/memory/global.c index fdb0208abb7..b4b4d05759b 100644 --- a/memory/global.c +++ b/memory/global.c @@ -418,7 +418,7 @@ HGLOBAL16 WINAPI GlobalFree16( void *ptr; if (!VALID_HANDLE(handle)) { - fprintf(stderr," Invalid handle 0x%04x passed to GlobalFree16!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to GlobalFree16!\n",handle); return 0; } ptr = (void *)GET_ARENA_PTR(handle)->base; @@ -452,7 +452,7 @@ SEGPTR WINAPI WIN16_GlobalLock16( HGLOBAL16 handle ) #endif /* CONFIG_IPC */ if (!VALID_HANDLE(handle)) { - fprintf(stderr,"Invalid handle 0x%04x passed to WIN16_GlobalLock16!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to WIN16_GlobalLock16!\n",handle); return (SEGPTR)0; } if (!GET_ARENA_PTR(handle)->base) return (SEGPTR)0; @@ -501,7 +501,7 @@ BOOL16 WINAPI GlobalUnlock16( ) { GLOBALARENA *pArena = GET_ARENA_PTR(handle); if (!VALID_HANDLE(handle)) { - fprintf(stderr,"Invalid handle 0x%04x passed to GlobalUnlock16!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to GlobalUnlock16!\n",handle); return 0; } TRACE(global, "%04x\n", handle ); @@ -541,7 +541,7 @@ DWORD WINAPI GlobalHandle16( ) { TRACE(global, "%04x\n", sel ); if (!VALID_HANDLE(sel)) { - fprintf(stderr,"Invalid handle 0x%04x passed to GlobalHandle16!\n",sel); + WARN(global,"Invalid handle 0x%04x passed to GlobalHandle16!\n",sel); return 0; } return MAKELONG( GET_ARENA_PTR(sel)->handle, GlobalHandleToSel(sel) ); @@ -578,7 +578,7 @@ UINT16 WINAPI GlobalFlags16( TRACE(global, "%04x\n", handle ); if (!VALID_HANDLE(handle)) { - fprintf(stderr,"Invalid handle 0x%04x passed to GlobalFlags16!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to GlobalFlags16!\n",handle); return 0; } pArena = GET_ARENA_PTR(handle); @@ -596,7 +596,7 @@ HGLOBAL16 WINAPI LockSegment16( HGLOBAL16 handle ) TRACE(global, "%04x\n", handle ); if (handle == (HGLOBAL16)-1) handle = CURRENT_DS; if (!VALID_HANDLE(handle)) { - fprintf(stderr,"Invalid handle 0x%04x passed to LockSegment16!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to LockSegment16!\n",handle); return 0; } GET_ARENA_PTR(handle)->lockCount++; @@ -612,7 +612,7 @@ void WINAPI UnlockSegment16( HGLOBAL16 handle ) TRACE(global, "%04x\n", handle ); if (handle == (HGLOBAL16)-1) handle = CURRENT_DS; if (!VALID_HANDLE(handle)) { - fprintf(stderr,"Invalid handle 0x%04x passed to UnlockSegment16!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to UnlockSegment16!\n",handle); return; } GET_ARENA_PTR(handle)->lockCount--; @@ -759,7 +759,7 @@ WORD WINAPI GlobalPageLock( HGLOBAL16 handle ) { TRACE(global, "%04x\n", handle ); if (!VALID_HANDLE(handle)) { - fprintf(stderr,"Invalid handle 0x%04x passed to GlobalPageLock!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to GlobalPageLock!\n",handle); return 0; } return ++(GET_ARENA_PTR(handle)->pageLockCount); @@ -773,7 +773,7 @@ WORD WINAPI GlobalPageUnlock( HGLOBAL16 handle ) { TRACE(global, "%04x\n", handle ); if (!VALID_HANDLE(handle)) { - fprintf(stderr,"Invalid handle 0x%04x passed to GlobalPageUnlock!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to GlobalPageUnlock!\n",handle); return 0; } return --(GET_ARENA_PTR(handle)->pageLockCount); @@ -787,7 +787,7 @@ void WINAPI GlobalFix16( HGLOBAL16 handle ) { TRACE(global, "%04x\n", handle ); if (!VALID_HANDLE(handle)) { - fprintf(stderr,"Invalid handle 0x%04x passed to GlobalFix16!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to GlobalFix16!\n",handle); return; } GET_ARENA_PTR(handle)->lockCount++; @@ -801,7 +801,7 @@ void WINAPI GlobalUnfix16( HGLOBAL16 handle ) { TRACE(global, "%04x\n", handle ); if (!VALID_HANDLE(handle)) { - fprintf(stderr,"Invalid handle 0x%04x passed to GlobalUnfix16!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to GlobalUnfix16!\n",handle); return; } GET_ARENA_PTR(handle)->lockCount--; @@ -814,7 +814,7 @@ void WINAPI GlobalUnfix16( HGLOBAL16 handle ) void WINAPI FarSetOwner( HGLOBAL16 handle, HANDLE16 hOwner ) { if (!VALID_HANDLE(handle)) { - fprintf(stderr,"Invalid handle 0x%04x passed to FarSetOwner!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to FarSetOwner!\n",handle); return; } GET_ARENA_PTR(handle)->hOwner = hOwner; @@ -827,7 +827,7 @@ void WINAPI FarSetOwner( HGLOBAL16 handle, HANDLE16 hOwner ) HANDLE16 WINAPI FarGetOwner( HGLOBAL16 handle ) { if (!VALID_HANDLE(handle)) { - fprintf(stderr,"Invalid handle 0x%04x passed to FarGetOwner!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to FarGetOwner!\n",handle); return 0; } return GET_ARENA_PTR(handle)->hOwner; @@ -845,12 +845,12 @@ WORD WINAPI GlobalHandleToSel( HGLOBAL16 handle ) if (is_dde_handle(handle)) return DDE_GlobalHandleToSel(handle); #endif if (!VALID_HANDLE(handle)) { - fprintf(stderr,"Invalid handle 0x%04x passed to GlobalHandleToSel!\n",handle); + WARN(global,"Invalid handle 0x%04x passed to GlobalHandleToSel!\n",handle); return 0; } if (!(handle & 7)) { - fprintf( stderr, "Program attempted invalid selector conversion\n" ); + WARN(global, "Program attempted invalid selector conversion\n" ); return handle - 1; } return handle | 7; diff --git a/memory/heap.c b/memory/heap.c index 2c2556dc106..b604f7ce969 100644 --- a/memory/heap.c +++ b/memory/heap.c @@ -188,7 +188,7 @@ static HEAP *HEAP_GetPtr( HEAP *heapPtr = (HEAP *)heap; if (!heapPtr || (heapPtr->magic != HEAP_MAGIC)) { - fprintf( stderr, "Invalid heap %08x!\n", heap ); + WARN(heap, "Invalid heap %08x!\n", heap ); SetLastError( ERROR_INVALID_HANDLE ); return NULL; } @@ -258,7 +258,7 @@ static BOOL32 HEAP_Commit( SUBHEAP *subheap, void *ptr ) size - subheap->commitSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)) { - fprintf( stderr, "HEAP_Commit: could not commit %08lx bytes at %08lx for heap %08lx\n", + WARN(heap, "Could not commit %08lx bytes at %08lx for heap %08lx\n", size - subheap->commitSize, (DWORD)((char *)subheap + subheap->commitSize), (DWORD)subheap->heap ); @@ -282,7 +282,7 @@ static BOOL32 HEAP_Decommit( SUBHEAP *subheap, void *ptr ) if (!VirtualFree( (char *)subheap + size, subheap->commitSize - size, MEM_DECOMMIT )) { - fprintf( stderr, "HEAP_Decommit: could not decommit %08lx bytes at %08lx for heap %08lx\n", + WARN(heap, "Could not decommit %08lx bytes at %08lx for heap %08lx\n", subheap->commitSize - size, (DWORD)((char *)subheap + size), (DWORD)subheap->heap ); @@ -458,13 +458,13 @@ static SUBHEAP *HEAP_CreateSubHeap( DWORD flags, DWORD commitSize, if (!(subheap = VirtualAlloc( NULL, totalSize, MEM_RESERVE, PAGE_EXECUTE_READWRITE ))) { - fprintf( stderr, "HEAP_CreateSubHeap: could not VirtualAlloc %08lx bytes\n", + WARN(heap, "Could not VirtualAlloc %08lx bytes\n", totalSize ); return NULL; } if (!VirtualAlloc(subheap, commitSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)) { - fprintf( stderr, "HEAP_CreateSubHeap: could not commit %08lx bytes for sub-heap %08lx\n", + WARN(heap, "Could not commit %08lx bytes for sub-heap %08lx\n", commitSize, (DWORD)subheap ); VirtualFree( subheap, 0, MEM_RELEASE ); return NULL; @@ -479,7 +479,7 @@ static SUBHEAP *HEAP_CreateSubHeap( DWORD flags, DWORD commitSize, (flags & HEAP_WINE_CODESEG) != 0, FALSE ); if (!selector) { - fprintf( stderr, "HEAP_CreateSubHeap: could not allocate selector\n" ); + WARN(heap, "Could not allocate selector\n" ); VirtualFree( subheap, 0, MEM_RELEASE ); return NULL; } @@ -534,7 +534,7 @@ static ARENA_FREE *HEAP_FindFreeBlock( HEAP *heap, DWORD size, if (!(heap->flags & HEAP_GROWABLE)) { - fprintf( stderr, "HEAP_FindFreeBlock: Not enough space in heap %08lx for %08lx bytes\n", + WARN(heap, "Not enough space in heap %08lx for %08lx bytes\n", (DWORD)heap, size ); return NULL; } @@ -586,7 +586,7 @@ static BOOL32 HEAP_ValidateFreeArena( SUBHEAP *subheap, ARENA_FREE *pArena ) /* Check magic number */ if (pArena->magic != ARENA_FREE_MAGIC) { - fprintf( stderr, "Heap %08lx: invalid free arena magic for %08lx\n", + WARN(heap, "Heap %08lx: invalid free arena magic for %08lx\n", (DWORD)subheap->heap, (DWORD)pArena ); return FALSE; } @@ -594,20 +594,20 @@ static BOOL32 HEAP_ValidateFreeArena( SUBHEAP *subheap, ARENA_FREE *pArena ) if (!(pArena->size & ARENA_FLAG_FREE) || (pArena->size & ARENA_FLAG_PREV_FREE)) { - fprintf( stderr, "Heap %08lx: bad flags %lx for free arena %08lx\n", + WARN(heap, "Heap %08lx: bad flags %lx for free arena %08lx\n", (DWORD)subheap->heap, pArena->size & ~ARENA_SIZE_MASK, (DWORD)pArena ); } /* Check arena size */ if ((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) > heapEnd) { - fprintf( stderr, "Heap %08lx: bad size %08lx for free arena %08lx\n", + WARN(heap, "Heap %08lx: bad size %08lx for free arena %08lx\n", (DWORD)subheap->heap, (DWORD)pArena->size & ARENA_SIZE_MASK, (DWORD)pArena ); return FALSE; } /* Check that next pointer is valid */ if (!HEAP_IsValidArenaPtr( subheap->heap, pArena->next )) { - fprintf( stderr, "Heap %08lx: bad next ptr %08lx for arena %08lx\n", + WARN(heap, "Heap %08lx: bad next ptr %08lx for arena %08lx\n", (DWORD)subheap->heap, (DWORD)pArena->next, (DWORD)pArena ); return FALSE; } @@ -615,14 +615,14 @@ static BOOL32 HEAP_ValidateFreeArena( SUBHEAP *subheap, ARENA_FREE *pArena ) if (!(pArena->next->size & ARENA_FLAG_FREE) || (pArena->next->magic != ARENA_FREE_MAGIC)) { - fprintf( stderr, "Heap %08lx: next arena %08lx invalid for %08lx\n", + WARN(heap, "Heap %08lx: next arena %08lx invalid for %08lx\n", (DWORD)subheap->heap, (DWORD)pArena->next, (DWORD)pArena ); return FALSE; } /* Check that prev pointer is valid */ if (!HEAP_IsValidArenaPtr( subheap->heap, pArena->prev )) { - fprintf( stderr, "Heap %08lx: bad prev ptr %08lx for arena %08lx\n", + WARN(heap, "Heap %08lx: bad prev ptr %08lx for arena %08lx\n", (DWORD)subheap->heap, (DWORD)pArena->prev, (DWORD)pArena ); return FALSE; } @@ -630,7 +630,7 @@ static BOOL32 HEAP_ValidateFreeArena( SUBHEAP *subheap, ARENA_FREE *pArena ) if (!(pArena->prev->size & ARENA_FLAG_FREE) || (pArena->prev->magic != ARENA_FREE_MAGIC)) { - fprintf( stderr, "Heap %08lx: prev arena %08lx invalid for %08lx\n", + WARN(heap, "Heap %08lx: prev arena %08lx invalid for %08lx\n", (DWORD)subheap->heap, (DWORD)pArena->prev, (DWORD)pArena ); return FALSE; } @@ -640,7 +640,7 @@ static BOOL32 HEAP_ValidateFreeArena( SUBHEAP *subheap, ARENA_FREE *pArena ) if (!(*(DWORD *)((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK)) & ARENA_FLAG_PREV_FREE)) { - fprintf( stderr, "Heap %08lx: free arena %08lx next block has no PREV_FREE flag\n", + WARN(heap, "Heap %08lx: free arena %08lx next block has no PREV_FREE flag\n", (DWORD)subheap->heap, (DWORD)pArena ); return FALSE; } @@ -648,7 +648,7 @@ static BOOL32 HEAP_ValidateFreeArena( SUBHEAP *subheap, ARENA_FREE *pArena ) if (*((ARENA_FREE **)((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK)) - 1) != pArena) { - fprintf( stderr, "Heap %08lx: arena %08lx has wrong back ptr %08lx\n", + WARN(heap, "Heap %08lx: arena %08lx has wrong back ptr %08lx\n", (DWORD)subheap->heap, (DWORD)pArena, *((DWORD *)((char *)(pArena+1)+ (pArena->size & ARENA_SIZE_MASK)) - 1)); return FALSE; @@ -668,20 +668,20 @@ static BOOL32 HEAP_ValidateInUseArena( SUBHEAP *subheap, ARENA_INUSE *pArena ) /* Check magic number */ if (pArena->magic != ARENA_INUSE_MAGIC) { - fprintf( stderr, "Heap %08lx: invalid in-use arena magic for %08lx\n", + WARN(heap, "Heap %08lx: invalid in-use arena magic for %08lx\n", (DWORD)subheap->heap, (DWORD)pArena ); return FALSE; } /* Check size flags */ if (pArena->size & ARENA_FLAG_FREE) { - fprintf( stderr, "Heap %08lx: bad flags %lx for in-use arena %08lx\n", + WARN(heap, "Heap %08lx: bad flags %lx for in-use arena %08lx\n", (DWORD)subheap->heap, pArena->size & ~ARENA_SIZE_MASK, (DWORD)pArena ); } /* Check arena size */ if ((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) > heapEnd) { - fprintf( stderr, "Heap %08lx: bad size %08lx for in-use arena %08lx\n", + WARN(heap, "Heap %08lx: bad size %08lx for in-use arena %08lx\n", (DWORD)subheap->heap, (DWORD)pArena->size & ARENA_SIZE_MASK, (DWORD)pArena ); return FALSE; } @@ -689,7 +689,7 @@ static BOOL32 HEAP_ValidateInUseArena( SUBHEAP *subheap, ARENA_INUSE *pArena ) if (((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) < heapEnd) && (*(DWORD *)((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK)) & ARENA_FLAG_PREV_FREE)) { - fprintf( stderr, "Heap %08lx: in-use arena %08lx next block has PREV_FREE flag\n", + WARN(heap, "Heap %08lx: in-use arena %08lx next block has PREV_FREE flag\n", (DWORD)subheap->heap, (DWORD)pArena ); return FALSE; } @@ -700,7 +700,7 @@ static BOOL32 HEAP_ValidateInUseArena( SUBHEAP *subheap, ARENA_INUSE *pArena ) /* Check prev pointer */ if (!HEAP_IsValidArenaPtr( subheap->heap, pPrev )) { - fprintf(stderr, "Heap %08lx: bad back ptr %08lx for arena %08lx\n", + WARN(heap, "Heap %08lx: bad back ptr %08lx for arena %08lx\n", (DWORD)subheap->heap, (DWORD)pPrev, (DWORD)pArena ); return FALSE; } @@ -708,14 +708,14 @@ static BOOL32 HEAP_ValidateInUseArena( SUBHEAP *subheap, ARENA_INUSE *pArena ) if (!(pPrev->size & ARENA_FLAG_FREE) || (pPrev->magic != ARENA_FREE_MAGIC)) { - fprintf( stderr, "Heap %08lx: prev arena %08lx invalid for in-use %08lx\n", + WARN(heap, "Heap %08lx: prev arena %08lx invalid for in-use %08lx\n", (DWORD)subheap->heap, (DWORD)pPrev, (DWORD)pArena ); return FALSE; } /* Check that prev arena is really the previous block */ if ((char *)(pPrev + 1) + (pPrev->size & ARENA_SIZE_MASK) != (char *)pArena) { - fprintf( stderr, "Heap %08lx: prev arena %08lx is not prev for in-use %08lx\n", + WARN(heap, "Heap %08lx: prev arena %08lx is not prev for in-use %08lx\n", (DWORD)subheap->heap, (DWORD)pPrev, (DWORD)pArena ); return FALSE; } @@ -775,7 +775,7 @@ SEGPTR HEAP_GetSegptr( HANDLE32 heap, DWORD flags, LPCVOID ptr ) flags |= heapPtr->flags; if (!(flags & HEAP_WINE_SEGPTR)) { - fprintf( stderr, "HEAP_GetSegptr: heap %08x is not a SEGPTR heap\n", + WARN(heap, "Heap %08x is not a SEGPTR heap\n", heap ); return 0; } @@ -785,7 +785,7 @@ SEGPTR HEAP_GetSegptr( HANDLE32 heap, DWORD flags, LPCVOID ptr ) if (!(subheap = HEAP_FindSubHeap( heapPtr, ptr ))) { - fprintf( stderr, "HEAP_GetSegptr: %p is not inside heap %08x\n", + WARN(heap, "%p is not inside heap %08x\n", ptr, heap ); if (!(flags & HEAP_NO_SERIALIZE)) HeapUnlock( heap ); return 0; @@ -1229,7 +1229,7 @@ BOOL32 WINAPI HeapValidate( if (!heapPtr || (heapPtr->magic != HEAP_MAGIC)) { - fprintf( stderr, "Invalid heap %08x!\n", heap ); + WARN(heap, "Invalid heap %08x!\n", heap ); return FALSE; } @@ -1240,7 +1240,7 @@ BOOL32 WINAPI HeapValidate( ((char *)block < (char *)subheap + subheap->headerSize + sizeof(ARENA_INUSE))) { - fprintf( stderr, "Heap %08lx: block %08lx is not inside heap\n", + WARN(heap, "Heap %08lx: block %08lx is not inside heap\n", (DWORD)heap, (DWORD)block ); return FALSE; } @@ -1284,7 +1284,7 @@ BOOL32 WINAPI HeapWalk( HANDLE32 heap, /* [in] Handle to heap to enumerate */ LPPROCESS_HEAP_ENTRY *entry /* [out] Pointer to structure of enumeration info */ ) { - fprintf( stderr, "HeapWalk(%08x): not implemented\n", heap ); + FIXME(heap, "(%08x): stub.\n", heap ); return FALSE; } @@ -1299,7 +1299,7 @@ LPVOID HEAP_xalloc( HANDLE32 heap, DWORD flags, DWORD size ) LPVOID p = HeapAlloc( heap, flags, size ); if (!p) { - fprintf( stderr, "Virtual memory exhausted.\n" ); + MSG("Virtual memory exhausted.\n" ); exit(1); } return p; diff --git a/memory/ldt.c b/memory/ldt.c index 64b8dd6e7a7..4ebd231ba36 100644 --- a/memory/ldt.c +++ b/memory/ldt.c @@ -182,7 +182,7 @@ int LDT_SetEntry( int entry, const ldt_entry *content ) { if (ldt_info.base_addr >= 0xc0000000) { - fprintf( stderr, "LDT_SetEntry: invalid base addr %08lx\n", + WARN(ldt, "Invalid base addr %08lx\n", ldt_info.base_addr ); return -1; } @@ -212,8 +212,7 @@ int LDT_SetEntry( int entry, const ldt_entry *content ) if (ret < 0) { perror("i386_set_ldt"); - fprintf(stderr, - "Did you reconfigure the kernel with \"options USER_LDT\"?\n"); + MSG("Did you reconfigure the kernel with \"options USER_LDT\"?\n"); exit(1); } } @@ -287,7 +286,7 @@ void LDT_Print( int start, int length ) flags[1] = (ldt_flags_copy[i] & LDT_FLAGS_READONLY) ? '-' : 'w'; flags[2] = '-'; } - fprintf(stderr,"%04x: sel=%04x base=%08lx limit=%08lx %d-bit %c%c%c\n", + TRACE(ldt,"%04x: sel=%04x base=%08lx limit=%08lx %d-bit %c%c%c\n", i, ENTRY_TO_SELECTOR(i), ldt_copy[i].base, ldt_copy[i].limit, ldt_flags_copy[i] & LDT_FLAGS_32BIT ? 32 : 16, diff --git a/memory/local.c b/memory/local.c index 8f5213dd08a..f20cda6c381 100644 --- a/memory/local.c +++ b/memory/local.c @@ -334,7 +334,7 @@ BOOL16 WINAPI LocalInit( HANDLE16 selector, WORD start, WORD end ) /* cleared before use, so we can test for double initialization. */ if (LOCAL_GetHeap(selector)) { - fprintf( stderr, "LocalInit: Heap %04x initialized twice.\n", selector); + WARN(local, "Heap %04x initialized twice.\n", selector); LOCAL_PrintHeap(selector); } } @@ -342,7 +342,7 @@ BOOL16 WINAPI LocalInit( HANDLE16 selector, WORD start, WORD end ) if (start == 0) { /* Check if the segment is the DGROUP of a module */ - if ((pModule = MODULE_GetPtr( selector ))) + if ((pModule = MODULE_GetPtr16( selector ))) { SEGTABLEENTRY *pSeg = NE_SEG_TABLE( pModule ) + pModule->dgroup - 1; if (pModule->dgroup && (pSeg->selector == selector)) { @@ -441,7 +441,7 @@ static void LOCAL_GrowHeap( HANDLE16 ds ) ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ); pHeapInfo = LOCAL_GetHeap( ds ); if (pHeapInfo == NULL) { - fprintf( stderr, "Local_GrowHeap: heap not found\n" ); + WARN(local, "Heap not found\n" ); return; } end = GlobalSize16( hseg ); @@ -496,7 +496,7 @@ static HLOCAL16 LOCAL_FreeArena( WORD ds, WORD arena ) if ((pArena->prev & 3) == LOCAL_ARENA_FREE) { /* shouldn't happen */ - fprintf( stderr, "LocalFreeArena: Trying to free block %04x twice!\n", + WARN(local, "Trying to free block %04x twice!\n", arena ); LOCAL_PrintHeap( ds ); return arena; @@ -619,7 +619,7 @@ static WORD LOCAL_GetFreeSpace(WORD ds, WORD countdiscard) if (!(pInfo = LOCAL_GetHeap( ds ))) { - fprintf( stderr, "LOCAL_GetFreeSpace: Local heap not found\n" ); + WARN(local, "Local heap not found\n" ); LOCAL_PrintHeap(ds); return 0; } @@ -654,7 +654,7 @@ WORD LOCAL_Compact( HANDLE16 ds, UINT16 minfree, UINT16 flags ) if (!(pInfo = LOCAL_GetHeap( ds ))) { - fprintf( stderr, "Local_Compact: Local heap not found\n" ); + WARN(local, "Local heap not found\n" ); LOCAL_PrintHeap(ds); return 0; } @@ -773,7 +773,7 @@ static HLOCAL16 LOCAL_FindFreeBlock( HANDLE16 ds, WORD size ) if (!(pInfo = LOCAL_GetHeap( ds ))) { - fprintf( stderr, "Local_FindFreeBlock: Local heap not found\n" ); + WARN(local, "Local heap not found\n" ); LOCAL_PrintHeap(ds); return 0; } @@ -805,7 +805,7 @@ static HLOCAL16 LOCAL_GetBlock( HANDLE16 ds, WORD size, WORD flags ) if (!(pInfo = LOCAL_GetHeap( ds ))) { - fprintf( stderr, "Local_GetBlock: Local heap not found\n"); + WARN(local, "Local heap not found\n"); LOCAL_PrintHeap(ds); return 0; } @@ -868,7 +868,7 @@ static BOOL16 LOCAL_NewHTable( HANDLE16 ds ) TRACE(local, "Local_NewHTable\n" ); if (!(pInfo = LOCAL_GetHeap( ds ))) { - fprintf( stderr, "Local heap not found\n"); + WARN(local, "Local heap not found\n"); LOCAL_PrintHeap(ds); return FALSE; } @@ -877,9 +877,9 @@ static BOOL16 LOCAL_NewHTable( HANDLE16 ds ) + 2 * sizeof(WORD), LMEM_FIXED ))) return FALSE; if (!(ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ))) - fprintf(stderr, "LOCAL_NewHTable: ptr == NULL after GetBlock.\n"); + WARN(local, "ptr == NULL after GetBlock.\n"); if (!(pInfo = LOCAL_GetHeap( ds ))) - fprintf(stderr,"LOCAL_NewHTable: pInfo == NULL after GetBlock.\n"); + WARN(local,"pInfo == NULL after GetBlock.\n"); /* Fill the entry table */ @@ -907,7 +907,7 @@ static HLOCAL16 LOCAL_GetNewHandleEntry( HANDLE16 ds ) if (!(pInfo = LOCAL_GetHeap( ds ))) { - fprintf( stderr, "LOCAL_GetNewHandleEntry: Local heap not found\n"); + WARN(local, "Local heap not found\n"); LOCAL_PrintHeap(ds); return 0; } @@ -970,7 +970,7 @@ static void LOCAL_FreeHandleEntry( HANDLE16 ds, HLOCAL16 handle ) } if (!*pTable) { - fprintf(stderr, "LOCAL_FreeHandleEntry: invalid entry %04x\n", handle); + WARN(local, "Invalid entry %04x\n", handle); LOCAL_PrintHeap( ds ); return; } @@ -1007,7 +1007,7 @@ HLOCAL16 LOCAL_Free( HANDLE16 ds, HLOCAL16 handle ) TRACE(local, "%04x ds=%04x\n", handle, ds ); - if (!handle) { fprintf( stderr, "LOCAL_Free: handle is 0.\n" ); return 0; } + if (!handle) { WARN(local, "Handle is 0.\n" ); return 0; } if (HANDLE_FIXED( handle )) { if (!LOCAL_FreeArena( ds, ARENA_HEADER( handle ) )) return 0; /* OK */ @@ -1057,7 +1057,7 @@ HLOCAL16 LOCAL_Alloc( HANDLE16 ds, WORD flags, WORD size ) hmem = 0; if (!(handle = LOCAL_GetNewHandleEntry( ds ))) { - fprintf( stderr, "LocalAlloc: couldn't get handle\n"); + WARN(local, "Couldn't get handle.\n"); if(hmem) LOCAL_FreeArena( ds, ARENA_HEADER(hmem) ); return 0; @@ -1120,8 +1120,7 @@ HLOCAL16 LOCAL_ReAlloc( HANDLE16 ds, HLOCAL16 handle, WORD size, WORD flags ) { HLOCAL16 hl; if(pEntry->addr) - fprintf(stderr, - "LOCAL_ReAlloc: Dicarded block has non-zero addr.\n"); + WARN(local,"Dicarded block has non-zero addr.\n"); TRACE(local, "ReAllocating discarded block\n"); if(size <= 4) size = 5; if (!(hl = LOCAL_GetBlock( ds, size + sizeof(HLOCAL16), flags))) @@ -1136,12 +1135,12 @@ HLOCAL16 LOCAL_ReAlloc( HANDLE16 ds, HLOCAL16 handle, WORD size, WORD flags ) } if (((blockhandle = pEntry->addr) & 3) != 2) { - fprintf( stderr, "Local_ReAlloc(%04x,%04x): invalid handle\n", + WARN(local, "(%04x,%04x): invalid handle\n", ds, handle ); return 0; } if(*((HLOCAL16 *)(ptr + blockhandle) - 1) != handle) { - fprintf(stderr, "Local_ReAlloc: Back ptr to handle is invalid\n"); + WARN(local, "Back ptr to handle is invalid\n"); return 0; } } @@ -1261,7 +1260,7 @@ HLOCAL16 LOCAL_ReAlloc( HANDLE16 ds, HLOCAL16 handle, WORD size, WORD flags ) { if (!(hmem = LOCAL_GetBlock( ds, oldsize, flags ))) { - fprintf( stderr, "LocalRealloc: can't restore saved block\n" ); + WARN(local, "Can't restore saved block\n" ); HeapFree( GetProcessHeap(), 0, buffer ); return 0; } @@ -1283,7 +1282,7 @@ HLOCAL16 LOCAL_ReAlloc( HANDLE16 ds, HLOCAL16 handle, WORD size, WORD flags ) pEntry->addr = hmem + sizeof(HLOCAL16); /* Back ptr should still be correct */ if(*(HLOCAL16 *)(ptr + hmem) != handle) - fprintf(stderr, "Local_ReAlloc: back ptr is invalid.\n"); + WARN(local, "back ptr is invalid.\n"); hmem = handle; } if (size == oldsize) hmem = 0; /* Realloc failed */ @@ -1423,7 +1422,7 @@ WORD LOCAL_CountFree( HANDLE16 ds ) if (!(pInfo = LOCAL_GetHeap( ds ))) { - fprintf( stderr, "LOCAL_Handle(%04x): Local heap not found\n", ds ); + WARN(local, "(%04x): Local heap not found\n", ds ); LOCAL_PrintHeap( ds ); return 0; } @@ -1456,7 +1455,7 @@ HLOCAL16 LOCAL_Handle( HANDLE16 ds, WORD addr ) if (!(pInfo = LOCAL_GetHeap( ds ))) { - fprintf( stderr, "LOCAL_Handle(%04x): Local heap not found\n", ds ); + WARN(local, "(%04x): Local heap not found\n", ds ); LOCAL_PrintHeap( ds ); return 0; } @@ -1602,7 +1601,7 @@ DWORD WINAPI GetHeapSpaces( HMODULE16 module ) NE_MODULE *pModule; WORD ds; - if (!(pModule = MODULE_GetPtr( module ))) return 0; + if (!(pModule = MODULE_GetPtr16( module ))) return 0; ds = (NE_SEG_TABLE( pModule ) + pModule->dgroup - 1)->selector; return MAKELONG( LOCAL_CountFree( ds ), LOCAL_HeapSize( ds ) ); } diff --git a/memory/selector.c b/memory/selector.c index 0fbb9bb35f3..218ee7115ec 100644 --- a/memory/selector.c +++ b/memory/selector.c @@ -13,9 +13,6 @@ #include "debug.h" -#define FIRST_LDT_ENTRY_TO_ALLOC 17 - - /*********************************************************************** * AllocSelectorArray (KERNEL.206) */ @@ -179,7 +176,7 @@ void SELECTOR_FreeBlock( WORD sel, WORD count ) GET_FS(fs); if ((fs >= sel) && (fs < nextsel)) { - fprintf( stderr, "SELECTOR_FreeBlock: freeing %%fs selector (%04x), not good.\n", fs ); + WARN(selector, "Freeing %%fs selector (%04x), not good.\n", fs ); SET_FS( 0 ); } GET_GS(gs); @@ -788,6 +785,5 @@ LPVOID WINAPI UTSelectorOffsetToLinear(SEGPTR sptr) */ SEGPTR WINAPI UTLinearToSelectorOffset(LPVOID lptr) { - fprintf( stderr, "UTLinearToSelectorOffset(%p): stub\n", lptr ); return (SEGPTR)lptr; } diff --git a/memory/virtual.c b/memory/virtual.c index fac4ee70eef..d2759e6b61d 100644 --- a/memory/virtual.c +++ b/memory/virtual.c @@ -84,7 +84,7 @@ static const BYTE VIRTUAL_Win32Flags[16] = static FILE_VIEW *VIRTUAL_FirstView; -#ifdef __i386___ +#ifdef __i386__ /* These are always the same on an i386, and it will be faster this way */ # define page_mask 0xfff # define page_shift 12 @@ -552,7 +552,7 @@ LPVOID WINAPI VirtualAlloc( /* FIXME: MEM_TOP_DOWN allocates the largest possible address. * Is there _ANY_ way to do it with UNIX mmap()? */ - fprintf(stderr,"VirtualAlloc:MEM_TOP_DOWN ignored\n"); + WARN(virtual,"MEM_TOP_DOWN ignored\n"); type &= ~MEM_TOP_DOWN; } /* Compute the protection flags */ @@ -795,7 +795,7 @@ BOOL32 WINAPI VirtualProtectEx( if (pdb == PROCESS_Current()) ret = VirtualProtect( addr, size, new_prot, old_prot ); else - fprintf(stderr,"Unsupported: VirtualProtectEx on other process\n"); + ERR(virtual,"Unsupported on other process\n"); K32OBJ_DecCount( &pdb->header ); } return ret; @@ -892,7 +892,7 @@ DWORD WINAPI VirtualQueryEx( if (pdb == PROCESS_Current()) ret = VirtualQuery( addr, info, len ); else - fprintf(stderr,"Unsupported: VirtualQueryEx on other process\n"); + ERR(virtual,"Unsupported on other process\n"); K32OBJ_DecCount( &pdb->header ); } return ret; @@ -1288,7 +1288,7 @@ LPVOID WINAPI MapViewOfFileEx( return NULL; if (mapping->size_high || offset_high) - fprintf( stderr, "MapViewOfFileEx: offsets larger than 4Gb not supported\n"); + ERR(virtual, "Offsets larger than 4Gb not supported\n"); if ((offset_low >= mapping->size_low) || (count > mapping->size_low - offset_low)) diff --git a/misc/Makefile.in b/misc/Makefile.in index 319264c5ea8..ee7f5c5aa95 100644 --- a/misc/Makefile.in +++ b/misc/Makefile.in @@ -19,7 +19,6 @@ C_SRCS = \ lstr.c \ lzexpand.c \ main.c \ - mpr.c \ network.c \ ntdll.c \ port.c \ diff --git a/misc/aspi.c b/misc/aspi.c index 8be4540a255..bf38b292e85 100644 --- a/misc/aspi.c +++ b/misc/aspi.c @@ -307,7 +307,7 @@ ASPI_ExecScsiCmd16(SRB_ExecSCSICmd16 *prb, SEGPTR segptr_prb) if (status < 0 || status != in_len) { int myerror = errno; - fprintf(stderr, "not enough bytes written to scsi device bytes=%d .. %d\n", in_len, status); + WARN(aspi, "Not enough bytes written to scsi device bytes=%d .. %d\n", in_len, status); if (status < 0) { if (myerror == ENOMEM) { fprintf(stderr, "ASPI: Linux generic scsi driver\n You probably need to re-compile your kernel with a larger SG_BIG_BUFF value (sg.h)\n Suggest 130560\n"); diff --git a/misc/callback.c b/misc/callback.c index 84354d5e01b..2dcf88336cb 100644 --- a/misc/callback.c +++ b/misc/callback.c @@ -6,6 +6,7 @@ #include #include +#include "debug.h" #include "windows.h" #include "callback.h" #include "task.h" @@ -27,7 +28,7 @@ static LRESULT WINAPI CALLBACK_CallWndProc( WNDPROC16 proc, HWND16 hwnd, */ static LONG WINAPI CALLBACK_CallRegisterProc( CONTEXT *context, INT32 offset) { - fprintf( stderr, "Cannot call a register proc in Winelib\n" ); + ERR(relay, "Cannot call a register proc in Winelib\n" ); assert( FALSE ); return 0; } @@ -208,7 +209,7 @@ static BOOL32 WINAPI CALLBACK_CallWOWCallback16Ex( ); break; default: - fprintf(stderr,"CALLBACK_CallWOWCallback16Ex(), %ld arguments not supported.!n",cbArgs); + WARN(relay,"(%ld) arguments not supported.\n",cbArgs); if (dwFlags == WCB16_CDECL) HeapFree(GetProcessHeap(),0,args); return FALSE; diff --git a/misc/comm.c b/misc/comm.c index 169d7332811..333adb9aee5 100644 --- a/misc/comm.c +++ b/misc/comm.c @@ -77,10 +77,10 @@ void COMM_Init(void) } stat(temp, &st); if (!S_ISCHR(st.st_mode)) - fprintf(stderr,"comm: can't use `%s' as %s !\n", temp, option); + WARN(comm,"Can't use `%s' as %s !\n", temp, option); else if ((COM[x].devicename = malloc(strlen(temp)+1)) == NULL) - fprintf(stderr,"comm: can't malloc for device info!\n"); + WARN(comm,"Can't malloc for device info!\n"); else { COM[x].fd = 0; strcpy(COM[x].devicename, temp); @@ -99,10 +99,10 @@ void COMM_Init(void) else { stat(temp, &st); if (!S_ISCHR(st.st_mode)) - fprintf(stderr,"comm: can't use `%s' as %s !\n", temp, option); + WARN(comm,"Can't use `%s' as %s !\n", temp, option); else if ((LPT[x].devicename = malloc(strlen(temp)+1)) == NULL) - fprintf(stderr,"comm: can't malloc for device info!\n"); + WARN(comm,"Can't malloc for device info!\n"); else { LPT[x].fd = 0; strcpy(LPT[x].devicename, temp); @@ -177,7 +177,7 @@ BOOL16 WINAPI BuildCommDCB16(LPCSTR device, LPDCB16 lpdcb) if (port-- == 0) { - fprintf(stderr, "comm: BUG ! COM0 can't exists!.\n"); + ERR(comm, "BUG ! COM0 can't exists!.\n"); commerror = IE_BADID; } @@ -229,7 +229,7 @@ BOOL16 WINAPI BuildCommDCB16(LPCSTR device, LPDCB16 lpdcb) lpdcb->Parity = ODDPARITY; break; default: - fprintf(stderr,"comm: unknown parity `%c'!\n", *ptr); + WARN(comm,"Unknown parity `%c'!\n", *ptr); return -1; } @@ -247,7 +247,7 @@ BOOL16 WINAPI BuildCommDCB16(LPCSTR device, LPDCB16 lpdcb) lpdcb->StopBits = TWOSTOPBITS; break; default: - fprintf(stderr,"comm: unknown # of stopbits `%c'!\n", *ptr); + WARN(comm,"Unknown # of stopbits `%c'!\n", *ptr); return -1; } } @@ -278,7 +278,7 @@ BOOL32 WINAPI BuildCommDCBAndTimeouts32A(LPCSTR device, LPDCB32 lpdcb, if (!lstrncmpi32A(device,"COM",3)) { port=device[3]-'0'; if (port--==0) { - fprintf(stderr,"comm:BUG! COM0 can't exists!.\n"); + ERR(comm,"BUG! COM0 can't exists!.\n"); return FALSE; } if (!ValidCOMPort(port)) @@ -346,19 +346,19 @@ BOOL32 WINAPI BuildCommDCBAndTimeouts32A(LPCSTR device, LPDCB32 lpdcb, flag=0; if (!strncmp("baud=",ptr,5)) { if (!sscanf(ptr+5,"%ld",&x)) - fprintf(stderr,"BuildCommDCB32A:Couldn't parse %s\n",ptr); + WARN(comm,"Couldn't parse %s\n",ptr); lpdcb->BaudRate = x; flag=1; } if (!strncmp("stop=",ptr,5)) { if (!sscanf(ptr+5,"%ld",&x)) - fprintf(stderr,"BuildCommDCB32A:Couldn't parse %s\n",ptr); + WARN(comm,"Couldn't parse %s\n",ptr); lpdcb->StopBits = x; flag=1; } if (!strncmp("data=",ptr,5)) { if (!sscanf(ptr+5,"%ld",&x)) - fprintf(stderr,"BuildCommDCB32A:Couldn't parse %s\n",ptr); + WARN(comm,"Couldn't parse %s\n",ptr); lpdcb->ByteSize = x; flag=1; } @@ -382,7 +382,7 @@ BOOL32 WINAPI BuildCommDCBAndTimeouts32A(LPCSTR device, LPDCB32 lpdcb, flag=1; } if (!flag) - fprintf(stderr,"BuildCommDCB32A: Unhandled specifier '%s', please report.\n",ptr); + ERR(comm,"Unhandled specifier '%s', please report.\n",ptr); ptr=strtok(NULL," "); } if (lpdcb->BaudRate==110) @@ -428,7 +428,7 @@ INT16 WINAPI OpenComm(LPCSTR device,UINT16 cbInQueue,UINT16 cbOutQueue) port = device[3] - '0'; if (port-- == 0) { - fprintf(stderr, "comm: BUG ! COM0 doesn't exist !\n"); + ERR(comm, "BUG ! COM0 doesn't exist !\n"); commerror = IE_BADID; } @@ -636,8 +636,7 @@ LONG WINAPI EscapeCommFunction16(UINT16 fd,UINT16 nFunction) break; default: - fprintf(stderr, - "EscapeCommFunction fd: %d, unknown function: %d\n", + WARN(comm,"(fd=%d,nFunction=%d): Unknown function\n", fd, nFunction); break; } @@ -709,8 +708,7 @@ BOOL32 WINAPI EscapeCommFunction32(INT32 fd,UINT32 nFunction) ptr->suspended = 0; break; default: - fprintf(stderr, - "EscapeCommFunction32 fd: %d, unknown function: %d\n", + WARN(comm,"(fd=%d,nFunction=%d): Unknown function\n", fd, nFunction); break; } @@ -737,8 +735,7 @@ INT16 WINAPI FlushComm(INT16 fd,INT16 fnQueue) break; case 1: queue = TCIFLUSH; break; - default:fprintf(stderr, - "FlushComm fd: %d, UNKNOWN queue: %d\n", + default:WARN(comm,"(fd=%d,fnQueue=%d):Unknown queue\n", fd, fnQueue); return -1; } @@ -774,11 +771,11 @@ INT16 WINAPI GetCommError(INT16 fd,LPCOMSTAT lpStat) lpStat->status = 0; rc = ioctl(fd, TIOCOUTQ, &cnt); - if (rc) fprintf(stderr, "Error !\n"); + if (rc) WARN(comm, "Error !\n"); lpStat->cbOutQue = cnt; rc = ioctl(fd, TIOCINQ, &cnt); - if (rc) fprintf(stderr, "Error !\n"); + if (rc) WARN(comm, "Error !\n"); lpStat->cbInQue = cnt; TRACE(comm, "fd %d, error %d, lpStat %d %d %d\n", @@ -1727,9 +1724,7 @@ INT16 WINAPI WriteComm(INT16 fd, LPSTR lpvBuf, INT16 cbWrite) */ BOOL32 WINAPI GetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) { - fprintf(stderr,"GetCommTimeouts(%x,%p), empty stub.\n", - fd,lptimeouts - ); + FIXME(comm,"(%x,%p):stub.\n",fd,lptimeouts); return TRUE; } @@ -1737,9 +1732,7 @@ BOOL32 WINAPI GetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) * SetCommTimeouts (KERNEL32.453) */ BOOL32 WINAPI SetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) { - fprintf(stderr,"SetCommTimeouts(%x,%p), empty stub.\n", - fd,lptimeouts - ); + FIXME(comm,"(%x,%p):stub.\n",fd,lptimeouts); return TRUE; } @@ -1749,7 +1742,7 @@ BOOL32 WINAPI SetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) { BOOL16 WINAPI EnableCommNotification( INT16 fd, HWND16 hwnd, INT16 cbWriteNotify, INT16 cbOutQueue ) { - fprintf(stderr, "EnableCommNotification(%d, %x, %d, %d), empty stub.\n", fd, hwnd, cbWriteNotify, cbOutQueue); + FIXME(comm, "(%d, %x, %d, %d):stub.\n", fd, hwnd, cbWriteNotify, cbOutQueue); return TRUE; } diff --git a/misc/commdlg.c b/misc/commdlg.c index e7122a6ebcb..d8ec825d9c4 100644 --- a/misc/commdlg.c +++ b/misc/commdlg.c @@ -18,6 +18,8 @@ #include "resource.h" #include "drive.h" #include "debug.h" +#include "font.h" +#include "winproc.h" static DWORD CommDlgLastError = 0; @@ -45,7 +47,7 @@ static BOOL32 FileDlg_Init() if (hFolder == 0 || hFolder2 == 0 || hFloppy == 0 || hHDisk == 0 || hCDRom == 0) { - fprintf(stderr, "FileDlg_Init // Error loading bitmaps !"); + WARN(commdlg, "Error loading bitmaps !\nprin"); return FALSE; } initialized = TRUE; @@ -611,7 +613,7 @@ static LONG FILEDLG_WMInitDialog(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) if (!FILEDLG_ScanDir(hWnd, tmpstr)) { *tmpstr = 0; if (!FILEDLG_ScanDir(hWnd, tmpstr)) - fprintf(stderr, "FileDlg: couldn't read initial directory %s!\n",tmpstr); + WARN(commdlg, "Couldn't read initial directory %s!\n",tmpstr); } /* select current drive in combo 2, omit missing drives */ for(i=0, n=-1; i<=DRIVE_GetCurrentDrive(); i++) @@ -630,7 +632,6 @@ static LONG FILEDLG_WMInitDialog(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) /*********************************************************************** * FILEDLG_WMCommand [internal] */ -BOOL32 in_lst1=FALSE; BOOL32 in_update=FALSE; static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) @@ -652,10 +653,7 @@ static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) case lst1: /* file list */ FILEDLG_StripEditControl(hWnd); if (notification == LBN_DBLCLK) - { - in_lst1=TRUE; goto almost_ok; - } lRet = SendDlgItemMessage16(hWnd, lst1, LB_GETCURSEL16, 0, 0); if (lRet == LB_ERR) return TRUE; if ((pstr = SEGPTR_ALLOC(512))) @@ -759,12 +757,9 @@ static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) PTR_SEG_TO_LIN(lpofn->lpstrFilter), lRet), sizeof(tmpstr2)); SetDlgItemText32A( hWnd, edt1, tmpstr2 ); - if (in_lst1) - { + if (!in_update) /* if ScanDir succeeds, we have changed the directory */ - in_lst1 = FALSE; if (FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE; - } /* if not, this must be a filename */ *pstr2 = 0; if (pstr != NULL) @@ -791,10 +786,7 @@ static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) strcat(tmpstr2, "\\"); strncat(tmpstr2, tmpstr, 511-strlen(tmpstr2)); tmpstr2[511]=0; if (lpofn->lpstrFile) - { - strncpy(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr2,lpofn->nMaxFile-1); - *((LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile)+lpofn->nMaxFile) ='\0'; - } + lstrcpyn32A(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr2,lpofn->nMaxFile); } lpofn->nFileOffset = strrchr(tmpstr2,'\\') - tmpstr2 +1; lpofn->nFileExtension = 0; @@ -949,10 +941,8 @@ HWND16 WINAPI FindText16( SEGPTR find ) * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here * For now, only the standard dialog works. */ - /* - * FIXME : We should do error checking on the lpFind structure here - * and make CommDlgExtendedError() return the error condition. - */ + if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE | + FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n"); ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT ); hInst = WIN_GetWindowInstance( lpFind->hwndOwner ); return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner, @@ -972,10 +962,8 @@ HWND32 WINAPI FindText32A( LPFINDREPLACE32A lpFind ) * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here * For now, only the standard dialog works. */ - /* - * FIXME : We should do error checking on the lpFind structure here - * and make CommDlgExtendedError() return the error condition. - */ + if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE | + FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n"); ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT ); hInst = WIN_GetWindowInstance( lpFind->hwndOwner ); return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner, @@ -994,10 +982,8 @@ HWND32 WINAPI FindText32W( LPFINDREPLACE32W lpFind ) * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here * For now, only the standard dialog works. */ - /* - * FIXME : We should do error checking on the lpFind structure here - * and make CommDlgExtendedError() return the error condition. - */ + if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE | + FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n"); ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT ); hInst = WIN_GetWindowInstance( lpFind->hwndOwner ); return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner, @@ -1013,14 +999,12 @@ HWND16 WINAPI ReplaceText16( SEGPTR find ) LPCVOID ptr; LPFINDREPLACE16 lpFind = (LPFINDREPLACE16)PTR_SEG_TO_LIN(find); - /* - * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here - * For now, only the standard dialog works. - */ /* * FIXME : We should do error checking on the lpFind structure here * and make CommDlgExtendedError() return the error condition. */ + if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE | + FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n"); ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT ); hInst = WIN_GetWindowInstance( lpFind->hwndOwner ); return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner, @@ -1040,10 +1024,8 @@ HWND32 WINAPI ReplaceText32A( LPFINDREPLACE32A lpFind ) * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here * For now, only the standard dialog works. */ - /* - * FIXME : We should do error checking on the lpFind structure here - * and make CommDlgExtendedError() return the error condition. - */ + if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE | + FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n"); ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT ); hInst = WIN_GetWindowInstance( lpFind->hwndOwner ); return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner, @@ -1058,14 +1040,12 @@ HWND32 WINAPI ReplaceText32W( LPFINDREPLACE32W lpFind ) HANDLE16 hInst; LPCVOID ptr; - /* - * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here - * For now, only the standard dialog works. - */ /* * FIXME : We should do error checking on the lpFind structure here * and make CommDlgExtendedError() return the error condition. */ + if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE | + FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n"); ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT ); hInst = WIN_GetWindowInstance( lpFind->hwndOwner ); return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner, @@ -2162,7 +2142,7 @@ static void CC_PaintColorGraph(HWND16 hDlg) if (lpp->hdcMem) BitBlt32(hDC,0,0,rect.right,rect.bottom,lpp->hdcMem,0,0,SRCCOPY); else - fprintf(stderr,"choose color: hdcMem is not defined\n"); + WARN(commdlg,"choose color: hdcMem is not defined\n"); ReleaseDC32(hwnd,hDC); } } @@ -2700,18 +2680,42 @@ LRESULT WINAPI ColorDlgProc(HWND16 hDlg, UINT16 message, return FALSE ; } +static void CFn_CHOOSEFONT16to32A(LPCHOOSEFONT16 chf16, LPCHOOSEFONT32A chf32a) +{ + chf32a->lStructSize=sizeof(CHOOSEFONT32A); + chf32a->hwndOwner=chf16->hwndOwner; + chf32a->hDC=chf16->hDC; + chf32a->iPointSize=chf16->iPointSize; + chf32a->Flags=chf16->Flags; + chf32a->rgbColors=chf16->rgbColors; + chf32a->lCustData=chf16->lCustData; + chf32a->lpfnHook=NULL; + chf32a->lpTemplateName=PTR_SEG_TO_LIN(chf16->lpTemplateName); + chf32a->hInstance=chf16->hInstance; + chf32a->lpszStyle=PTR_SEG_TO_LIN(chf16->lpszStyle); + chf32a->nFontType=chf16->nFontType; + chf32a->nSizeMax=chf16->nSizeMax; + chf32a->nSizeMin=chf16->nSizeMin; + FONT_LogFont16To32A(PTR_SEG_TO_LIN(chf16->lpLogFont), chf32a->lpLogFont); +} /*********************************************************************** - * ChooseFont (COMMDLG.15) + * ChooseFont16 (COMMDLG.15) */ -BOOL16 WINAPI ChooseFont(LPCHOOSEFONT lpChFont) +BOOL16 WINAPI ChooseFont16(LPCHOOSEFONT16 lpChFont) { HINSTANCE16 hInst; HANDLE16 hDlgTmpl = 0; BOOL16 bRet = FALSE, win32Format = FALSE; LPCVOID template; HWND32 hwndDialog; + CHOOSEFONT32A cf32a; + LOGFONT32A lf32a; + SEGPTR lpTemplateName; + + cf32a.lpLogFont=&lf32a; + CFn_CHOOSEFONT16to32A(lpChFont, &cf32a); TRACE(commdlg,"ChooseFont\n"); if (!lpChFont) return FALSE; @@ -2748,17 +2752,71 @@ BOOL16 WINAPI ChooseFont(LPCHOOSEFONT lpChFont) } hInst = WIN_GetWindowInstance( lpChFont->hwndOwner ); - + + /* lpTemplateName is not used in the dialog */ + lpTemplateName=lpChFont->lpTemplateName; + lpChFont->lpTemplateName=(SEGPTR)&cf32a; + hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format, lpChFont->hwndOwner, (DLGPROC16)MODULE_GetWndProcEntry16("FormatCharDlgProc"), (DWORD)lpChFont, WIN_PROC_16 ); if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner); if (hDlgTmpl) FreeResource16( hDlgTmpl ); + lpChFont->lpTemplateName=lpTemplateName; + FONT_LogFont32ATo16(cf32a.lpLogFont, + (LPLOGFONT16)(PTR_SEG_TO_LIN(lpChFont->lpLogFont))); return bRet; } +/*********************************************************************** + * ChooseFont32A (COMDLG32.3) + */ +BOOL32 WINAPI ChooseFont32A(LPCHOOSEFONT32A lpChFont) +{ + BOOL32 bRet=FALSE; + HWND32 hwndDialog; + HINSTANCE32 hInst=WIN_GetWindowInstance( lpChFont->hwndOwner ); + LPCVOID template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_FONT ); + if (lpChFont->Flags & (CF_SELECTSCRIPT | CF_NOVERTFONTS | CF_ENABLETEMPLATE | + CF_ENABLETEMPLATEHANDLE)) FIXME(commdlg, ": unimplemented flag (ignored)\n"); + hwndDialog = DIALOG_CreateIndirect(hInst, template, TRUE, lpChFont->hwndOwner, + (DLGPROC16)FormatCharDlgProc32A, (LPARAM)lpChFont, WIN_PROC_32A ); + if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner); + return bRet; +} + +/*********************************************************************** + * ChooseFont32W (COMDLG32.4) + */ +BOOL32 WINAPI ChooseFont32W(LPCHOOSEFONT32W lpChFont) +{ + BOOL32 bRet=FALSE; + HWND32 hwndDialog; + HINSTANCE32 hInst=WIN_GetWindowInstance( lpChFont->hwndOwner ); + CHOOSEFONT32A cf32a; + LOGFONT32A lf32a; + LPCVOID template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_FONT ); + if (lpChFont->Flags & (CF_SELECTSCRIPT | CF_NOVERTFONTS | CF_ENABLETEMPLATE | + CF_ENABLETEMPLATEHANDLE)) FIXME(commdlg, ": unimplemented flag (ignored)\n"); + memcpy(&cf32a, lpChFont, sizeof(cf32a)); + memcpy(&lf32a, lpChFont->lpLogFont, sizeof(LOGFONT32A)); + lstrcpynWtoA(lf32a.lfFaceName, lpChFont->lpLogFont->lfFaceName, LF_FACESIZE); + cf32a.lpLogFont=&lf32a; + cf32a.lpszStyle=HEAP_strdupWtoA(GetProcessHeap(), 0, lpChFont->lpszStyle); + lpChFont->lpTemplateName=(LPWSTR)&cf32a; + hwndDialog=DIALOG_CreateIndirect(hInst, template, TRUE, lpChFont->hwndOwner, + (DLGPROC16)FormatCharDlgProc32W, (LPARAM)lpChFont, WIN_PROC_32W ); + if (hwndDialog)bRet=DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner); + HeapFree(GetProcessHeap(), 0, cf32a.lpszStyle); + lpChFont->lpTemplateName=(LPWSTR)cf32a.lpTemplateName; + memcpy(lpChFont->lpLogFont, &lf32a, sizeof(CHOOSEFONT32A)); + lstrcpynAtoW(lpChFont->lpLogFont->lfFaceName, lf32a.lfFaceName, LF_FACESIZE); + return bRet; +} + + #define TEXT_EXTRAS 4 #define TEXT_COLORS 16 @@ -2773,7 +2831,19 @@ static const COLORREF textcolors[TEXT_COLORS]= /*********************************************************************** * CFn_HookCallChk [internal] */ -static BOOL32 CFn_HookCallChk(LPCHOOSEFONT lpcf) +static BOOL32 CFn_HookCallChk(LPCHOOSEFONT16 lpcf) +{ + if (lpcf) + if(lpcf->Flags & CF_ENABLEHOOK) + if (lpcf->lpfnHook) + return TRUE; + return FALSE; +} + +/*********************************************************************** + * CFn_HookCallChk32 [internal] + */ +static BOOL32 CFn_HookCallChk32(LPCHOOSEFONT32A lpcf) { if (lpcf) if(lpcf->Flags & CF_ENABLEHOOK) @@ -2783,18 +2853,14 @@ static BOOL32 CFn_HookCallChk(LPCHOOSEFONT lpcf) } -/*********************************************************************** - * FontFamilyEnumProc (COMMDLG.19) +/************************************************************************* + * AddFontFamily [internal] */ -INT16 WINAPI FontFamilyEnumProc( SEGPTR logfont, SEGPTR metrics, - UINT16 nFontType, LPARAM lParam ) +static INT32 AddFontFamily(LPLOGFONT32A lplf, UINT32 nFontType, + LPCHOOSEFONT32A lpcf, HWND32 hwnd) { int i; WORD w; - HWND16 hwnd=LOWORD(lParam); - HWND16 hDlg=GetParent16(hwnd); - LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER); - LOGFONT16 *lplf = (LOGFONT16 *)PTR_SEG_TO_LIN( logfont ); TRACE(commdlg,"font=%s (nFontType=%d)\n", lplf->lfFaceName,nFontType); @@ -2805,28 +2871,60 @@ INT16 WINAPI FontFamilyEnumProc( SEGPTR logfont, SEGPTR metrics, if (lplf->lfCharSet != ANSI_CHARSET) return 1; if (lpcf->Flags & CF_TTONLY) - if (!(nFontType & 0x0004)) /* this means 'TRUETYPE_FONTTYPE' */ + if (!(nFontType & TRUETYPE_FONTTYPE)) return 1; - i=SendMessage16(hwnd,CB_ADDSTRING16,0, - (LPARAM)logfont + ((char *)lplf->lfFaceName - (char *)lplf)); + i=SendMessage32A(hwnd, CB_ADDSTRING32, 0, (LPARAM)lplf->lfFaceName); if (i!=CB_ERR) { w=(lplf->lfCharSet << 8) | lplf->lfPitchAndFamily; - SendMessage16(hwnd, CB_SETITEMDATA16,i,MAKELONG(nFontType,w)); + SendMessage32A(hwnd, CB_SETITEMDATA32, i, MAKELONG(nFontType,w)); return 1 ; /* store some important font information */ } else return 0; } +typedef struct +{ + HWND32 hWnd1; + HWND32 hWnd2; + LPCHOOSEFONT32A lpcf32a; +} CFn_ENUMSTRUCT, *LPCFn_ENUMSTRUCT; + +/************************************************************************* + * FontFamilyEnumProc32 [internal] + */ +INT32 WINAPI FontFamilyEnumProc32(LPENUMLOGFONT32A lpEnumLogFont, + LPNEWTEXTMETRIC32A metrics, UINT32 nFontType, LPARAM lParam) +{ + LPCFn_ENUMSTRUCT e; + e=(LPCFn_ENUMSTRUCT)lParam; + return AddFontFamily(&lpEnumLogFont->elfLogFont, nFontType, e->lpcf32a, e->hWnd1); +} + +/*********************************************************************** + * FontFamilyEnumProc16 (COMMDLG.19) + */ +INT16 WINAPI FontFamilyEnumProc16( SEGPTR logfont, SEGPTR metrics, + UINT16 nFontType, LPARAM lParam ) +{ + HWND16 hwnd=LOWORD(lParam); + HWND16 hDlg=GetParent16(hwnd); + LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLong32A(hDlg, DWL_USER); + LOGFONT16 *lplf = (LOGFONT16 *)PTR_SEG_TO_LIN( logfont ); + LOGFONT32A lf32a; + FONT_LogFont16To32A(lplf, &lf32a); + return AddFontFamily(&lf32a, nFontType, (LPCHOOSEFONT32A)lpcf->lpTemplateName, + hwnd); +} + /************************************************************************* * SetFontStylesToCombo2 [internal] * * Fill font style information into combobox (without using font.c directly) */ -static int SetFontStylesToCombo2(HWND16 hwnd, HDC16 hdc, LPLOGFONT16 lplf, - LPTEXTMETRIC16 lptm) +static int SetFontStylesToCombo2(HWND32 hwnd, HDC32 hdc, LPLOGFONT32A lplf) { #define FSTYLES 4 struct FONTSTYLE @@ -2836,21 +2934,22 @@ static int SetFontStylesToCombo2(HWND16 hwnd, HDC16 hdc, LPLOGFONT16 lplf, static struct FONTSTYLE fontstyles[FSTYLES]={ { 0,FW_NORMAL,"Regular"},{0,FW_BOLD,"Bold"}, { 1,FW_NORMAL,"Italic"}, {1,FW_BOLD,"Bold Italic"}}; - HFONT16 hf; + HFONT16 hf; + TEXTMETRIC16 tm; int i,j; for (i=0;ilfItalic=fontstyles[i].italic; lplf->lfWeight=fontstyles[i].weight; - hf=CreateFontIndirect16(lplf); + hf=CreateFontIndirect32A(lplf); hf=SelectObject32(hdc,hf); - GetTextMetrics16(hdc,lptm); + GetTextMetrics16(hdc,&tm); hf=SelectObject32(hdc,hf); DeleteObject32(hf); - if (lptm->tmWeight==fontstyles[i].weight && - lptm->tmItalic==fontstyles[i].italic) /* font successful created ? */ + if (tm.tmWeight==fontstyles[i].weight && + tm.tmItalic==fontstyles[i].italic) /* font successful created ? */ { char *str = SEGPTR_STRDUP(fontstyles[i].stname); j=SendMessage16(hwnd,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(str) ); @@ -2862,56 +2961,50 @@ static int SetFontStylesToCombo2(HWND16 hwnd, HDC16 hdc, LPLOGFONT16 lplf, } } return 0; - } +} +/************************************************************************* + * AddFontSizeToCombo3 [internal] + */ +static int AddFontSizeToCombo3(HWND32 hwnd, UINT32 h, LPCHOOSEFONT32A lpcf) +{ + int j; + char buffer[20]; + + if ( (!(lpcf->Flags & CF_LIMITSIZE)) || + ((lpcf->Flags & CF_LIMITSIZE) && (h >= lpcf->nSizeMin) && (h <= lpcf->nSizeMax))) + { + sprintf(buffer, "%2d", h); + j=SendMessage32A(hwnd, CB_FINDSTRINGEXACT32, -1, (LPARAM)buffer); + if (j==CB_ERR) + { + j=SendMessage32A(hwnd, CB_ADDSTRING32, 0, (LPARAM)buffer); + if (j!=CB_ERR) j = SendMessage32A(hwnd, CB_SETITEMDATA32, j, h); + if (j==CB_ERR) return 1; + } + } + return 0; +} + /************************************************************************* * SetFontSizesToCombo3 [internal] */ -static int SetFontSizesToCombo3(HWND16 hwnd, LPLOGFONT16 lplf, LPCHOOSEFONT lpcf) +static int SetFontSizesToCombo3(HWND32 hwnd, LPCHOOSEFONT32A lpcf) { static const int sizes[]={8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72,0}; - int h,i,j; - char *buffer; - - if (!(buffer = SEGPTR_ALLOC(20))) return 1; - for (i=0;sizes[i] && !lplf->lfHeight;i++) - { - h=lplf->lfHeight ? lplf->lfHeight : sizes[i]; + int i; - if ( (!(lpcf->Flags & CF_LIMITSIZE)) || - ((lpcf->Flags & CF_LIMITSIZE) && (h >= lpcf->nSizeMin) && (h <= lpcf->nSizeMax))) - { - sprintf(buffer,"%2d",h); - j=SendMessage16(hwnd,CB_FINDSTRING16,-1,(LPARAM)SEGPTR_GET(buffer)); - if (j==CB_ERR) - { - j=SendMessage16(hwnd,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(buffer)); - if (j!=CB_ERR) j = SendMessage16(hwnd, CB_SETITEMDATA16, j, h); - if (j==CB_ERR) - { - SEGPTR_FREE(buffer); - return 1; - } - } - } - } - SEGPTR_FREE(buffer); - return 0; + for (i=0; sizes[i]; i++) + if (AddFontSizeToCombo3(hwnd, sizes[i], lpcf)) return 1; + return 0; } - /*********************************************************************** - * FontStyleEnumProc (COMMDLG.18) + * AddFontStyle [internal] */ -INT16 WINAPI FontStyleEnumProc( SEGPTR logfont, SEGPTR metrics, - UINT16 nFontType, LPARAM lParam ) +INT32 AddFontStyle(LPLOGFONT32A lplf, UINT32 nFontType, + LPCHOOSEFONT32A lpcf, HWND32 hcmb2, HWND32 hcmb3, HWND32 hDlg) { - HWND16 hcmb2=LOWORD(lParam); - HWND16 hcmb3=HIWORD(lParam); - HWND16 hDlg=GetParent16(hcmb3); - LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER); - LOGFONT16 *lplf = (LOGFONT16 *)PTR_SEG_TO_LIN(logfont); - TEXTMETRIC16 *lptm = (TEXTMETRIC16 *)PTR_SEG_TO_LIN(metrics); int i; TRACE(commdlg,"(nFontType=%d)\n",nFontType); @@ -2922,48 +3015,83 @@ INT16 WINAPI FontStyleEnumProc( SEGPTR logfont, SEGPTR metrics, lplf->lfWeight,lplf->lfItalic,lplf->lfUnderline, lplf->lfStrikeOut,lplf->lfCharSet, lplf->lfOutPrecision, lplf->lfClipPrecision,lplf->lfQuality, lplf->lfPitchAndFamily); + if (nFontType & RASTER_FONTTYPE) + { + if (AddFontSizeToCombo3(hcmb3, lplf->lfHeight, lpcf)) return 0; + } else if (SetFontSizesToCombo3(hcmb3, lpcf)) return 0; - if (SetFontSizesToCombo3(hcmb3, lplf ,lpcf)) - return 0; - - if (!SendMessage16(hcmb2,CB_GETCOUNT16,0,0)) + if (!SendMessage32A(hcmb2, CB_GETCOUNT32, 0, 0)) { HDC32 hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg); - i=SetFontStylesToCombo2(hcmb2,hdc,lplf,lptm); + i=SetFontStylesToCombo2(hcmb2,hdc,lplf); if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC)) ReleaseDC32(hDlg,hdc); if (i) - return 0; + return 0; } return 1 ; + +} + +/*********************************************************************** + * FontStyleEnumProc16 (COMMDLG.18) + */ +INT16 WINAPI FontStyleEnumProc16( SEGPTR logfont, SEGPTR metrics, + UINT16 nFontType, LPARAM lParam ) +{ + HWND16 hcmb2=LOWORD(lParam); + HWND16 hcmb3=HIWORD(lParam); + HWND16 hDlg=GetParent16(hcmb3); + LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLong32A(hDlg, DWL_USER); + LOGFONT16 *lplf = (LOGFONT16 *)PTR_SEG_TO_LIN(logfont); + LOGFONT32A lf32a; + FONT_LogFont16To32A(lplf, &lf32a); + return AddFontStyle(&lf32a, nFontType, (LPCHOOSEFONT32A)lpcf->lpTemplateName, + hcmb2, hcmb3, hDlg); } +/*********************************************************************** + * FontStyleEnumProc32 [internal] + */ +INT32 WINAPI FontStyleEnumProc32( LPENUMLOGFONT32A lpFont, + LPNEWTEXTMETRIC32A metrics, UINT32 nFontType, LPARAM lParam ) +{ + LPCFn_ENUMSTRUCT s=(LPCFn_ENUMSTRUCT)lParam; + HWND32 hcmb2=s->hWnd1; + HWND32 hcmb3=s->hWnd2; + HWND32 hDlg=GetParent32(hcmb3); + return AddFontStyle(&lpFont->elfLogFont, nFontType, s->lpcf32a, hcmb2, + hcmb3, hDlg); +} /*********************************************************************** * CFn_WMInitDialog [internal] */ -LRESULT CFn_WMInitDialog(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) +LRESULT CFn_WMInitDialog(HWND32 hDlg, WPARAM32 wParam, LPARAM lParam, + LPCHOOSEFONT32A lpcf) { HDC32 hdc; int i,j,res,init=0; long l; - LPLOGFONT16 lpxx; - HCURSOR16 hcursor=SetCursor16(LoadCursor16(0,IDC_WAIT16)); - LPCHOOSEFONT lpcf; + LPLOGFONT32A lpxx; + HCURSOR32 hcursor=SetCursor32(LoadCursor32A(0,IDC_WAIT32A)); SetWindowLong32A(hDlg, DWL_USER, lParam); - lpcf=(LPCHOOSEFONT)lParam; - lpxx=PTR_SEG_TO_LIN(lpcf->lpLogFont); + lpxx=lpcf->lpLogFont; TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam); - if (lpcf->lStructSize != sizeof(CHOOSEFONT)) + if (lpcf->lStructSize != sizeof(CHOOSEFONT32A)) { ERR(commdlg,"structure size failure !!!\n"); EndDialog32 (hDlg, 0); return FALSE; } if (!hBitmapTT) - hBitmapTT = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_TRTYPE)); + hBitmapTT = LoadBitmap32A(0, MAKEINTRESOURCE32A(OBM_TRTYPE)); + + /* This font will be deleted by WM_COMMAND */ + SendDlgItemMessage32A(hDlg,stc6,WM_SETFONT, + CreateFont32A(0, 0, 1, 1, 400, 0, 0, 0, 0, 0, 0, 0, 0, NULL),FALSE); if (!(lpcf->Flags & CF_SHOWHELP) || !IsWindow32(lpcf->hwndOwner)) ShowWindow32(GetDlgItem32(hDlg,pshHelp),SW_HIDE); @@ -2974,14 +3102,13 @@ LRESULT CFn_WMInitDialog(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) for (res=1,i=0;res && irgbColors) - SendDlgItemMessage16(hDlg,cmb4, CB_SETCURSEL16,j,0); + SendDlgItemMessage32A(hDlg,cmb4, CB_SETCURSEL32,j,0); } } else @@ -2995,50 +3122,52 @@ LRESULT CFn_WMInitDialog(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg); if (hdc) { - if (!EnumFontFamilies16(hdc, NULL,FontFamilyEnumProc, - (LPARAM)GetDlgItem32(hDlg,cmb1))) + CFn_ENUMSTRUCT s; + s.hWnd1=GetDlgItem32(hDlg,cmb1); + s.lpcf32a=lpcf; + if (!EnumFontFamilies32A(hdc, NULL, FontFamilyEnumProc32, (LPARAM)&s)) TRACE(commdlg,"EnumFontFamilies returns 0\n"); if (lpcf->Flags & CF_INITTOLOGFONTSTRUCT) { /* look for fitting font name in combobox1 */ - j=SendDlgItemMessage16(hDlg,cmb1,CB_FINDSTRING16,-1,(LONG)lpxx->lfFaceName); + j=SendDlgItemMessage32A(hDlg,cmb1,CB_FINDSTRING32,-1,(LONG)lpxx->lfFaceName); if (j!=CB_ERR) { - SendDlgItemMessage16(hDlg,cmb1,CB_SETCURSEL16,j,0); - SendMessage16(hDlg,WM_COMMAND,cmb1, - MAKELONG(GetDlgItem32(hDlg,cmb1),CBN_SELCHANGE)); + SendDlgItemMessage32A(hDlg, cmb1, CB_SETCURSEL32, j, 0); + SendMessage32A(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE), + GetDlgItem32(hDlg,cmb1)); init=1; /* look for fitting font style in combobox2 */ l=MAKELONG(lpxx->lfWeight > FW_MEDIUM ? FW_BOLD:FW_NORMAL,lpxx->lfItalic !=0); for (i=0;ilfHeight==(int)SendDlgItemMessage16(hDlg,cmb3, CB_GETITEMDATA16,i,0)) - SendDlgItemMessage16(hDlg,cmb3,CB_SETCURSEL16,i,0); + if (lpxx->lfHeight==(int)SendDlgItemMessage32A(hDlg,cmb3, CB_GETITEMDATA32,i,0)) + SendDlgItemMessage32A(hDlg,cmb3,CB_SETCURSEL32,i,0); } } - if (!init) - { - SendDlgItemMessage16(hDlg,cmb1,CB_SETCURSEL16,0,0); - SendMessage16(hDlg,WM_COMMAND,cmb1, - MAKELONG(GetDlgItem32(hDlg,cmb1),CBN_SELCHANGE)); - } } + if (!init) + { + SendDlgItemMessage32A(hDlg,cmb1,CB_SETCURSEL32,0,0); + SendMessage32A(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE), + GetDlgItem32(hDlg,cmb1)); + } if (lpcf->Flags & CF_USESTYLE && lpcf->lpszStyle) { - j=SendDlgItemMessage16(hDlg,cmb2,CB_FINDSTRING16,-1,(LONG)lpcf->lpszStyle); + j=SendDlgItemMessage32A(hDlg,cmb2,CB_FINDSTRING32,-1,(LONG)lpcf->lpszStyle); if (j!=CB_ERR) { - j=SendDlgItemMessage16(hDlg,cmb2,CB_SETCURSEL16,j,0); - SendMessage16(hDlg,WM_COMMAND,cmb2, - MAKELONG(GetDlgItem32(hDlg,cmb2),CBN_SELCHANGE)); + j=SendDlgItemMessage32A(hDlg,cmb2,CB_SETCURSEL32,j,0); + SendMessage32A(hDlg,WM_COMMAND,cmb2, + MAKELONG(GetDlgItem32(hDlg,cmb2),CBN_SELCHANGE)); } } } @@ -3051,24 +3180,21 @@ LRESULT CFn_WMInitDialog(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC)) ReleaseDC32(hDlg,hdc); - res=TRUE; - if (CFn_HookCallChk(lpcf)) - res=CallWindowProc16(lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam); - SetCursor16(hcursor); - return res; + SetCursor32(hcursor); + return TRUE; } /*********************************************************************** * CFn_WMMeasureItem [internal] */ -LRESULT CFn_WMMeasureItem(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) +LRESULT CFn_WMMeasureItem(HWND32 hDlg, WPARAM32 wParam, LPARAM lParam) { - BITMAP16 bm; - LPMEASUREITEMSTRUCT16 lpmi=PTR_SEG_TO_LIN((LPMEASUREITEMSTRUCT16)lParam); + BITMAP32 bm; + LPMEASUREITEMSTRUCT32 lpmi=(LPMEASUREITEMSTRUCT32)lParam; if (!hBitmapTT) - hBitmapTT = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_TRTYPE)); - GetObject16( hBitmapTT, sizeof(bm), &bm ); + hBitmapTT = LoadBitmap32A(0, MAKEINTRESOURCE32A(OBM_TRTYPE)); + GetObject32A( hBitmapTT, sizeof(bm), &bm ); lpmi->itemHeight=bm.bmHeight; /* FIXME: use MAX of bm.bmHeight and tm.tmHeight .*/ return 0; @@ -3078,45 +3204,52 @@ LRESULT CFn_WMMeasureItem(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) /*********************************************************************** * CFn_WMDrawItem [internal] */ -LRESULT CFn_WMDrawItem(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) +LRESULT CFn_WMDrawItem(HWND32 hDlg, WPARAM32 wParam, LPARAM lParam) { - HBRUSH16 hBrush; - char *buffer; - BITMAP16 bm; - COLORREF cr; - RECT16 rect; + HBRUSH32 hBrush; + char buffer[40]; + BITMAP32 bm; + COLORREF cr, oldText=0, oldBk=0; + RECT32 rect; #if 0 - HDC16 hMemDC; + HDC32 hMemDC; int nFontType; - HBITMAP16 hBitmap; /* for later TT usage */ + HBITMAP32 hBitmap; /* for later TT usage */ #endif - LPDRAWITEMSTRUCT16 lpdi = (LPDRAWITEMSTRUCT16)PTR_SEG_TO_LIN(lParam); + LPDRAWITEMSTRUCT32 lpdi = (LPDRAWITEMSTRUCT32)lParam; if (lpdi->itemID == 0xFFFF) /* got no items */ - DrawFocusRect16(lpdi->hDC, &lpdi->rcItem); + DrawFocusRect32(lpdi->hDC, &lpdi->rcItem); else { if (lpdi->CtlType == ODT_COMBOBOX) { - hBrush = SelectObject32(lpdi->hDC, GetStockObject32(LTGRAY_BRUSH)); - SelectObject32(lpdi->hDC, hBrush); - FillRect16(lpdi->hDC, &lpdi->rcItem, hBrush); + if (lpdi->itemState ==ODS_SELECTED) + { + hBrush=GetSysColorBrush32(COLOR_HIGHLIGHT); + oldText=SetTextColor32(lpdi->hDC, GetSysColor32(COLOR_HIGHLIGHTTEXT)); + oldBk=SetBkColor32(lpdi->hDC, GetSysColor32(COLOR_HIGHLIGHT)); + } else + { + hBrush = SelectObject32(lpdi->hDC, GetStockObject32(LTGRAY_BRUSH)); + SelectObject32(lpdi->hDC, hBrush); + } + FillRect32(lpdi->hDC, &lpdi->rcItem, hBrush); } else return TRUE; /* this should never happen */ rect=lpdi->rcItem; - buffer = SEGPTR_ALLOC(40); switch (lpdi->CtlID) { case cmb1: /* TRACE(commdlg,"WM_Drawitem cmb1\n"); */ - SendMessage16(lpdi->hwndItem, CB_GETLBTEXT16, lpdi->itemID, - (LPARAM)SEGPTR_GET(buffer)); - GetObject16( hBitmapTT, sizeof(bm), &bm ); - TextOut16(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10, - lpdi->rcItem.top, buffer, lstrlen16(buffer)); + SendMessage32A(lpdi->hwndItem, CB_GETLBTEXT32, lpdi->itemID, + (LPARAM)buffer); + GetObject32A( hBitmapTT, sizeof(bm), &bm ); + TextOut32A(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10, + lpdi->rcItem.top, buffer, lstrlen32A(buffer)); #if 0 - nFontType = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA16, lpdi->itemID,0L); + nFontType = SendMessage32A(lpdi->hwndItem, CB_GETITEMDATA32, lpdi->itemID,0L); /* FIXME: draw bitmap if truetype usage */ if (nFontType&TRUETYPE_FONTTYPE) { @@ -3131,18 +3264,18 @@ LRESULT CFn_WMDrawItem(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) break; case cmb2: case cmb3: /* TRACE(commdlg,"WM_DRAWITEN cmb2,cmb3\n"); */ - SendMessage16(lpdi->hwndItem, CB_GETLBTEXT16, lpdi->itemID, - (LPARAM)SEGPTR_GET(buffer)); - TextOut16(lpdi->hDC, lpdi->rcItem.left, - lpdi->rcItem.top, buffer, lstrlen16(buffer)); + SendMessage32A(lpdi->hwndItem, CB_GETLBTEXT32, lpdi->itemID, + (LPARAM)buffer); + TextOut32A(lpdi->hDC, lpdi->rcItem.left, + lpdi->rcItem.top, buffer, lstrlen32A(buffer)); break; case cmb4: /* TRACE(commdlg,"WM_DRAWITEM cmb4 (=COLOR)\n"); */ - SendMessage16(lpdi->hwndItem, CB_GETLBTEXT16, lpdi->itemID, - (LPARAM)SEGPTR_GET(buffer)); - TextOut16(lpdi->hDC, lpdi->rcItem.left + 25+5, - lpdi->rcItem.top, buffer, lstrlen16(buffer)); - cr = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA16, lpdi->itemID,0L); + SendMessage32A(lpdi->hwndItem, CB_GETLBTEXT32, lpdi->itemID, + (LPARAM)buffer); + TextOut32A(lpdi->hDC, lpdi->rcItem.left + 25+5, + lpdi->rcItem.top, buffer, lstrlen32A(buffer)); + cr = SendMessage32A(lpdi->hwndItem, CB_GETITEMDATA32, lpdi->itemID,0L); hBrush = CreateSolidBrush32(cr); if (hBrush) { @@ -3161,9 +3294,11 @@ LRESULT CFn_WMDrawItem(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) default: return TRUE; /* this should never happen */ } - SEGPTR_FREE(buffer); - if (lpdi->itemState ==ODS_SELECTED) - InvertRect16(lpdi->hDC, &rect); + if (lpdi->itemState == ODS_SELECTED) + { + SetTextColor32(lpdi->hDC, oldText); + SetBkColor32(lpdi->hDC, oldBk); + } } return TRUE; } @@ -3171,14 +3306,13 @@ LRESULT CFn_WMDrawItem(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) /*********************************************************************** * CFn_WMCtlColor [internal] */ -LRESULT CFn_WMCtlColor(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) +LRESULT CFn_WMCtlColorStatic(HWND32 hDlg, WPARAM32 wParam, LPARAM lParam, + LPCHOOSEFONT32A lpcf) { - LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER); - if (lpcf->Flags & CF_EFFECTS) - if (HIWORD(lParam)==CTLCOLOR_STATIC && GetDlgCtrlID32(LOWORD(lParam))==stc6) + if (GetDlgCtrlID32(lParam)==stc6) { - SetTextColor32(wParam,lpcf->rgbColors); + SetTextColor32((HDC32)wParam, lpcf->rgbColors); return GetStockObject32(WHITE_BRUSH); } return 0; @@ -3187,37 +3321,39 @@ LRESULT CFn_WMCtlColor(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) /*********************************************************************** * CFn_WMCommand [internal] */ -LRESULT CFn_WMCommand(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) +LRESULT CFn_WMCommand(HWND32 hDlg, WPARAM32 wParam, LPARAM lParam, + LPCHOOSEFONT32A lpcf) { - HFONT16 hFont; + HFONT32 hFont; int i,j; long l; - HDC16 hdc; - LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER); - LPLOGFONT16 lpxx=PTR_SEG_TO_LIN(lpcf->lpLogFont); + HDC32 hdc; + LPLOGFONT32A lpxx=lpcf->lpLogFont; - TRACE(commdlg,"WM_COMMAND lParam=%08lX\n", lParam); - switch (wParam) + TRACE(commdlg,"WM_COMMAND wParam=%08lX lParam=%08lX\n", (LONG)wParam, lParam); + switch (LOWORD(wParam)) { - case cmb1:if (HIWORD(lParam)==CBN_SELCHANGE) + case cmb1:if (HIWORD(wParam)==CBN_SELCHANGE) { hdc=(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg); if (hdc) { - SendDlgItemMessage16(hDlg,cmb2,CB_RESETCONTENT16,0,0); - SendDlgItemMessage16(hDlg,cmb3,CB_RESETCONTENT16,0,0); - i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL16,0,0); + SendDlgItemMessage32A(hDlg, cmb2, CB_RESETCONTENT16, 0, 0); + SendDlgItemMessage32A(hDlg, cmb3, CB_RESETCONTENT16, 0, 0); + i=SendDlgItemMessage32A(hDlg, cmb1, CB_GETCURSEL16, 0, 0); if (i!=CB_ERR) { - HCURSOR16 hcursor=SetCursor16(LoadCursor16(0,IDC_WAIT16)); - char *str = SEGPTR_ALLOC(256); - SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT16,i, - (LPARAM)SEGPTR_GET(str)); + HCURSOR32 hcursor=SetCursor32(LoadCursor32A(0,IDC_WAIT32A)); + CFn_ENUMSTRUCT s; + char str[256]; + SendDlgItemMessage32A(hDlg, cmb1, CB_GETLBTEXT32, i, + (LPARAM)str); TRACE(commdlg,"WM_COMMAND/cmb1 =>%s\n",str); - EnumFontFamilies16(hdc,str,FontStyleEnumProc, - MAKELONG(GetDlgItem32(hDlg,cmb2),GetDlgItem32(hDlg,cmb3))); - SetCursor16(hcursor); - SEGPTR_FREE(str); + s.hWnd1=GetDlgItem32(hDlg, cmb2); + s.hWnd2=GetDlgItem32(hDlg, cmb3); + s.lpcf32a=lpcf; + EnumFontFamilies32A(hdc, str, FontStyleEnumProc32, (LPARAM)&s); + SetCursor32(hcursor); } if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC)) ReleaseDC32(hDlg,hdc); @@ -3232,18 +3368,18 @@ LRESULT CFn_WMCommand(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) case chx1: case chx2: case cmb2: - case cmb3:if (HIWORD(lParam)==CBN_SELCHANGE || HIWORD(lParam)== BN_CLICKED ) + case cmb3:if (HIWORD(wParam)==CBN_SELCHANGE || HIWORD(wParam)== BN_CLICKED ) { - char *str = SEGPTR_ALLOC(256); + char str[256]; TRACE(commdlg,"WM_COMMAND/cmb2,3 =%08lX\n", lParam); - i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL16,0,0); + i=SendDlgItemMessage32A(hDlg,cmb1,CB_GETCURSEL32,0,0); if (i==CB_ERR) i=GetDlgItemText32A( hDlg, cmb1, str, 256 ); else { - SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT16,i, - (LPARAM)SEGPTR_GET(str)); - l=SendDlgItemMessage16(hDlg,cmb1,CB_GETITEMDATA16,i,0); + SendDlgItemMessage32A(hDlg,cmb1,CB_GETLBTEXT32,i, + (LPARAM)str); + l=SendDlgItemMessage32A(hDlg,cmb1,CB_GETITEMDATA32,i,0); j=HIWORD(l); lpcf->nFontType = LOWORD(l); /* FIXME: lpcf->nFontType |= .... SIMULATED_FONTTYPE and so */ @@ -3253,19 +3389,18 @@ LRESULT CFn_WMCommand(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) lpxx->lfCharSet=j>>8; } strcpy(lpxx->lfFaceName,str); - SEGPTR_FREE(str); - i=SendDlgItemMessage16(hDlg,cmb2,CB_GETCURSEL16,0,0); + i=SendDlgItemMessage32A(hDlg, cmb2, CB_GETCURSEL32, 0, 0); if (i!=CB_ERR) { - l=SendDlgItemMessage16(hDlg,cmb2,CB_GETITEMDATA16,i,0); + l=SendDlgItemMessage32A(hDlg, cmb2, CB_GETITEMDATA32, i, 0); if (0!=(lpxx->lfItalic=HIWORD(l))) lpcf->nFontType |= ITALIC_FONTTYPE; if ((lpxx->lfWeight=LOWORD(l)) > FW_MEDIUM) lpcf->nFontType |= BOLD_FONTTYPE; } - i=SendDlgItemMessage16(hDlg,cmb3,CB_GETCURSEL16,0,0); + i=SendDlgItemMessage32A(hDlg, cmb3, CB_GETCURSEL32, 0, 0); if (i!=CB_ERR) - lpxx->lfHeight=-LOWORD(SendDlgItemMessage16(hDlg,cmb3,CB_GETITEMDATA16,i,0)); + lpxx->lfHeight=-LOWORD(SendDlgItemMessage32A(hDlg, cmb3, CB_GETITEMDATA32, i, 0)); else lpxx->lfHeight=0; lpxx->lfStrikeOut=IsDlgButtonChecked32(hDlg,chx1); @@ -3276,14 +3411,18 @@ LRESULT CFn_WMCommand(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) lpxx->lfQuality=DEFAULT_QUALITY; lpcf->iPointSize= -10*lpxx->lfHeight; - hFont=CreateFontIndirect16(lpxx); + hFont=CreateFontIndirect32A(lpxx); if (hFont) - SendDlgItemMessage16(hDlg,stc6,WM_SETFONT,hFont,TRUE); - /* FIXME: Delete old font ...? */ + { + HFONT32 oldFont=SendDlgItemMessage32A(hDlg, stc6, + WM_GETFONT, 0, 0); + SendDlgItemMessage32A(hDlg,stc6,WM_SETFONT,hFont,TRUE); + DeleteObject32(oldFont); + } } break; - case cmb4:i=SendDlgItemMessage16(hDlg,cmb4,CB_GETCURSEL16,0,0); + case cmb4:i=SendDlgItemMessage32A(hDlg, cmb4, CB_GETCURSEL32, 0, 0); if (i!=CB_ERR) { lpcf->rgbColors=textcolors[i]; @@ -3293,9 +3432,9 @@ LRESULT CFn_WMCommand(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) case psh15:i=RegisterWindowMessage32A( HELPMSGSTRING ); if (lpcf->hwndOwner) - SendMessage16(lpcf->hwndOwner,i,0,(LPARAM)lpcf); - if (CFn_HookCallChk(lpcf)) - CallWindowProc16(lpcf->lpfnHook,hDlg,WM_COMMAND,psh15,(LPARAM)lpcf); + SendMessage32A(lpcf->hwndOwner, i, 0, (LPARAM)GetWindowLong32A(hDlg, DWL_USER)); +/* if (CFn_HookCallChk(lpcf)) + CallWindowProc16(lpcf->lpfnHook,hDlg,WM_COMMAND,psh15,(LPARAM)lpcf);*/ break; case IDOK:if ( (!(lpcf->Flags & CF_LIMITSIZE)) || @@ -3308,7 +3447,7 @@ LRESULT CFn_WMCommand(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) char buffer[80]; sprintf(buffer,"Select a font size between %d and %d points.", lpcf->nSizeMin,lpcf->nSizeMax); - MessageBox16(hDlg,buffer,NULL,MB_OK); + MessageBox32A(hDlg, buffer, NULL, MB_OK); } return(TRUE); case IDCANCEL:EndDialog32(hDlg, FALSE); @@ -3317,20 +3456,30 @@ LRESULT CFn_WMCommand(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) return(FALSE); } +static LRESULT CFn_WMDestroy(HWND32 hwnd, WPARAM32 wParam, LPARAM lParam) +{ + DeleteObject32(SendDlgItemMessage32A(hwnd, stc6, WM_GETFONT, 0, 0)); + return TRUE; +} + /*********************************************************************** - * FormatCharDlgProc (COMMDLG.16) + * FormatCharDlgProc16 (COMMDLG.16) FIXME: 1. some strings are "hardcoded", but it's better load from sysres 2. some CF_.. flags are not supported 3. some TType extensions */ -LRESULT WINAPI FormatCharDlgProc(HWND16 hDlg, UINT16 message, WPARAM16 wParam, - LPARAM lParam) +LRESULT WINAPI FormatCharDlgProc16(HWND16 hDlg, UINT16 message, WPARAM16 wParam, + LPARAM lParam) { - LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER); + LPCHOOSEFONT16 lpcf; + LPCHOOSEFONT32A lpcf32a; + UINT32 uMsg32; + WPARAM32 wParam32; + LRESULT res=0; if (message!=WM_INITDIALOG) { - int res=0; + lpcf=(LPCHOOSEFONT16)GetWindowLong32A(hDlg, DWL_USER); if (!lpcf) return FALSE; if (CFn_HookCallChk(lpcf)) @@ -3339,233 +3488,376 @@ LRESULT WINAPI FormatCharDlgProc(HWND16 hDlg, UINT16 message, WPARAM16 wParam, return res; } else - return CFn_WMInitDialog(hDlg,wParam,lParam); - switch (message) + { + lpcf=(LPCHOOSEFONT16)lParam; + lpcf32a=(LPCHOOSEFONT32A)lpcf->lpTemplateName; + if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf32a)) + { + TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n"); + return FALSE; + } + if (CFn_HookCallChk(lpcf)) + return CallWindowProc16(lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam); + } + WINPROC_MapMsg16To32A(message, wParam, &uMsg32, &wParam32, &lParam); + lpcf32a=(LPCHOOSEFONT32A)lpcf->lpTemplateName; + switch (uMsg32) { case WM_MEASUREITEM: - return CFn_WMMeasureItem(hDlg,wParam,lParam); + res=CFn_WMMeasureItem(hDlg, wParam32, lParam); + break; case WM_DRAWITEM: - return CFn_WMDrawItem(hDlg,wParam,lParam); - case WM_CTLCOLOR: - return CFn_WMCtlColor(hDlg,wParam,lParam); + res=CFn_WMDrawItem(hDlg, wParam32, lParam); + break; + case WM_CTLCOLORSTATIC: + res=CFn_WMCtlColorStatic(hDlg, wParam32, lParam, lpcf32a); + break; case WM_COMMAND: - return CFn_WMCommand(hDlg,wParam,lParam); + res=CFn_WMCommand(hDlg, wParam32, lParam, lpcf32a); + break; + case WM_DESTROY: + res=CFn_WMDestroy(hDlg, wParam32, lParam); + break; case WM_CHOOSEFONT_GETLOGFONT: TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam); FIXME(commdlg, "current logfont back to caller\n"); break; } - return FALSE; + WINPROC_UnmapMsg16To32A(uMsg32, wParam32, lParam, res); + return res; } - -#define GET_XXX_FILENAME(xxx) \ -BOOL32 WINAPI xxx##32A( LPOPENFILENAME32A ofn ) \ -{ \ - BOOL16 ret; \ - LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16)); \ - \ - memset(ofn16,'\0',sizeof(*ofn16)); \ - ofn16->lStructSize = sizeof(*ofn16); \ - ofn16->hwndOwner = ofn->hwndOwner; \ - /* FIXME: OPENFILENAME16 got only 16 bit for HINSTANCE... */ \ - ofn16->hInstance = MODULE_HANDLEtoHMODULE16(ofn->hInstance); \ - if (ofn->lpstrFilter) { \ - LPSTR s,x; \ - \ - /* filter is a list... title\0ext\0......\0\0 */ \ - s = (LPSTR)ofn->lpstrFilter; \ - while (*s) \ - s = s+strlen(s)+1; \ - s++; \ - x = (LPSTR)SEGPTR_ALLOC(s-ofn->lpstrFilter); \ - memcpy(x,ofn->lpstrFilter,s-ofn->lpstrFilter); \ - ofn16->lpstrFilter = SEGPTR_GET(x); \ - } \ - if (ofn->lpstrCustomFilter) { \ - LPSTR s,x; \ - \ - /* filter is a list... title\0ext\0......\0\0 */ \ - s = (LPSTR)ofn->lpstrCustomFilter; \ - while (*s) \ - s = s+strlen(s)+1; \ - x = SEGPTR_ALLOC(s-ofn->lpstrCustomFilter); \ - s++; \ - memcpy(x,ofn->lpstrCustomFilter,s-ofn->lpstrCustomFilter);\ - ofn16->lpstrCustomFilter = SEGPTR_GET(x); \ - } \ - ofn16->nMaxCustFilter = ofn->nMaxCustFilter; \ - ofn16->nFilterIndex = ofn->nFilterIndex; \ - if (ofn->nMaxFile) \ - ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile)); \ - ofn16->nMaxFile = ofn->nMaxFile; \ - if (ofn16->lpstrFileTitle) \ - ofn16->lpstrFileTitle= SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrFileTitle));\ - ofn16->nMaxFileTitle = ofn->nMaxFileTitle; \ - if (ofn16->nMaxFileTitle) \ - ofn16->lpstrFileTitle = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFileTitle));\ - if (ofn->lpstrInitialDir) \ - ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrInitialDir));\ - if (ofn->lpstrTitle) \ - ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrTitle));\ - ofn16->Flags = ofn->Flags|OFN_WINE32; \ - ofn16->nFileOffset = ofn->nFileOffset; \ - ofn16->nFileExtension = ofn->nFileExtension; \ - if (ofn->lpstrDefExt) \ - ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrDefExt));\ - ofn16->lCustData = ofn->lCustData; \ - ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook; \ - \ - if (ofn->lpTemplateName) \ - ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpTemplateName));\ - \ - ret = xxx##16(SEGPTR_GET(ofn16)); \ - \ - ofn->nFileOffset = ofn16->nFileOffset; \ - ofn->nFileExtension = ofn16->nFileExtension; \ - if (ofn16->lpstrFilter) \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter)); \ - if (ofn16->lpTemplateName) \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName)); \ - if (ofn16->lpstrDefExt) \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt)); \ - if (ofn16->lpstrTitle) \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle)); \ - if (ofn16->lpstrInitialDir) \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir)); \ - if (ofn16->lpstrCustomFilter) \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter)); \ - \ - if (ofn16->lpstrFile) { \ - strcpy(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile)); \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile)); \ - } \ - \ - if (ofn16->lpstrFileTitle) { \ - strcpy(ofn->lpstrFileTitle,PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));\ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle)); \ - } \ - SEGPTR_FREE(ofn16); \ - return ret; \ -} \ - \ -BOOL32 WINAPI xxx##32W( LPOPENFILENAME32W ofn ) \ -{ \ - BOOL16 ret; \ - LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16)); \ - \ - memset(ofn16,'\0',sizeof(*ofn16)); \ - ofn16->lStructSize = sizeof(*ofn16); \ - ofn16->hwndOwner = ofn->hwndOwner; \ - /* FIXME: OPENFILENAME16 got only 16 bit for HINSTANCE... */ \ - ofn16->hInstance = MODULE_HANDLEtoHMODULE16(ofn->hInstance); \ - if (ofn->lpstrFilter) { \ - LPWSTR s; \ - LPSTR x,y; \ - int n; \ - \ - /* filter is a list... title\0ext\0......\0\0 */ \ - s = (LPWSTR)ofn->lpstrFilter; \ - while (*s) \ - s = s+lstrlen32W(s)+1; \ - s++; \ - n = s - ofn->lpstrFilter; /* already divides by 2. ptr magic */\ - x = y = (LPSTR)SEGPTR_ALLOC(n); \ - s = (LPWSTR)ofn->lpstrFilter; \ - while (*s) { \ - lstrcpyWtoA(x,s); \ - x+=lstrlen32A(x)+1; \ - s+=lstrlen32W(s)+1; \ - } \ - *x=0; \ - ofn16->lpstrFilter = SEGPTR_GET(y); \ - } \ - if (ofn->lpstrCustomFilter) { \ - LPWSTR s; \ - LPSTR x,y; \ - int n; \ - \ - /* filter is a list... title\0ext\0......\0\0 */ \ - s = (LPWSTR)ofn->lpstrCustomFilter; \ - while (*s) \ - s = s+lstrlen32W(s)+1; \ - s++; \ - n = s - ofn->lpstrCustomFilter; \ - x = y = (LPSTR)SEGPTR_ALLOC(n); \ - s = (LPWSTR)ofn->lpstrCustomFilter; \ - while (*s) { \ - lstrcpyWtoA(x,s); \ - x+=lstrlen32A(x)+1; \ - s+=lstrlen32W(s)+1; \ - } \ - *x=0; \ - ofn16->lpstrCustomFilter = SEGPTR_GET(y); \ - } \ - ofn16->nMaxCustFilter = ofn->nMaxCustFilter; \ - ofn16->nFilterIndex = ofn->nFilterIndex; \ - if (ofn->nMaxFile) \ - ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile)); \ - ofn16->nMaxFile = ofn->nMaxFile; \ - if (ofn16->lpstrFileTitle) \ - ofn16->lpstrFileTitle= SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrFileTitle));\ - ofn16->nMaxFileTitle = ofn->nMaxFileTitle; \ - if (ofn->nMaxFileTitle) \ - ofn16->lpstrFileTitle = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFileTitle));\ - if (ofn->lpstrInitialDir) \ - ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrInitialDir));\ - if (ofn->lpstrTitle) \ - ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrTitle));\ - ofn16->Flags = ofn->Flags|OFN_WINE32|OFN_UNICODE; \ - ofn16->nFileOffset = ofn->nFileOffset; \ - ofn16->nFileExtension = ofn->nFileExtension; \ - if (ofn->lpstrDefExt) \ - ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrDefExt));\ - ofn16->lCustData = ofn->lCustData; \ - ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook; \ - if (ofn->lpTemplateName) { \ - ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpTemplateName));\ - } \ - ret = xxx##16(SEGPTR_GET(ofn16)); \ - \ - ofn->nFileOffset = ofn16->nFileOffset; \ - ofn->nFileExtension = ofn16->nFileExtension; \ - if (ofn16->lpstrFilter) \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter)); \ - if (ofn16->lpTemplateName) \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName)); \ - if (ofn16->lpstrDefExt) \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt)); \ - if (ofn16->lpstrTitle) \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle)); \ - if (ofn16->lpstrInitialDir) \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir)); \ - if (ofn16->lpstrCustomFilter) \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter)); \ - \ - if (ofn16->lpstrFile) { \ - lstrcpyAtoW(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile)); \ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile)); \ - } \ - \ - if (ofn16->lpstrFileTitle) { \ - lstrcpyAtoW(ofn->lpstrFileTitle,PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));\ - SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle)); \ - } \ - SEGPTR_FREE(ofn16); \ - return ret; \ -} - -GET_XXX_FILENAME(GetOpenFileName) -GET_XXX_FILENAME(GetSaveFileName) - /*********************************************************************** - * ChooseFontA (COMDLG32.3) + * FormatCharDlgProc32A [internal] */ -DWORD WINAPI ChooseFont32A(PCHOOSEFONT32A pChoosefont) +LRESULT WINAPI FormatCharDlgProc32A(HWND32 hDlg, UINT32 uMsg, WPARAM32 wParam, + LPARAM lParam) { - FIXME(commdlg,"empty stub!\n"); - - CommDlgLastError = CDERR_DIALOGFAILURE; - return NULL; + LPCHOOSEFONT32A lpcf; + LRESULT res=FALSE; + if (uMsg!=WM_INITDIALOG) + { + lpcf=(LPCHOOSEFONT32A)GetWindowLong32A(hDlg, DWL_USER); + if (!lpcf) + return FALSE; + if (CFn_HookCallChk32(lpcf)) + res=CallWindowProc32A(lpcf->lpfnHook, hDlg, uMsg, wParam, lParam); + if (res) + return res; + } + else + { + lpcf=(LPCHOOSEFONT32A)lParam; + if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf)) + { + TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n"); + return FALSE; + } + if (CFn_HookCallChk32(lpcf)) + return CallWindowProc32A(lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam); + } + switch (uMsg) + { + case WM_MEASUREITEM: + return CFn_WMMeasureItem(hDlg, wParam, lParam); + case WM_DRAWITEM: + return CFn_WMDrawItem(hDlg, wParam, lParam); + case WM_CTLCOLORSTATIC: + return CFn_WMCtlColorStatic(hDlg, wParam, lParam, lpcf); + case WM_COMMAND: + return CFn_WMCommand(hDlg, wParam, lParam, lpcf); + case WM_DESTROY: + return CFn_WMDestroy(hDlg, wParam, lParam); + case WM_CHOOSEFONT_GETLOGFONT: + TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", + lParam); + FIXME(commdlg, "current logfont back to caller\n"); + break; + } + return res; +} + +/*********************************************************************** + * FormatCharDlgProc32W [internal] + */ +LRESULT WINAPI FormatCharDlgProc32W(HWND32 hDlg, UINT32 uMsg, WPARAM32 wParam, + LPARAM lParam) +{ + LPCHOOSEFONT32W lpcf32w; + LPCHOOSEFONT32A lpcf32a; + LRESULT res=FALSE; + if (uMsg!=WM_INITDIALOG) + { + lpcf32w=(LPCHOOSEFONT32W)GetWindowLong32A(hDlg, DWL_USER); + if (!lpcf32w) + return FALSE; + if (CFn_HookCallChk32((LPCHOOSEFONT32A)lpcf32w)) + res=CallWindowProc32W(lpcf32w->lpfnHook, hDlg, uMsg, wParam, lParam); + if (res) + return res; + } + else + { + lpcf32w=(LPCHOOSEFONT32W)lParam; + lpcf32a=(LPCHOOSEFONT32A)lpcf32w->lpTemplateName; + if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf32a)) + { + TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n"); + return FALSE; + } + if (CFn_HookCallChk32((LPCHOOSEFONT32A)lpcf32w)) + return CallWindowProc32W(lpcf32w->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam); + } + lpcf32a=(LPCHOOSEFONT32A)lpcf32w->lpTemplateName; + switch (uMsg) + { + case WM_MEASUREITEM: + return CFn_WMMeasureItem(hDlg, wParam, lParam); + case WM_DRAWITEM: + return CFn_WMDrawItem(hDlg, wParam, lParam); + case WM_CTLCOLORSTATIC: + return CFn_WMCtlColorStatic(hDlg, wParam, lParam, lpcf32a); + case WM_COMMAND: + return CFn_WMCommand(hDlg, wParam, lParam, lpcf32a); + case WM_DESTROY: + return CFn_WMDestroy(hDlg, wParam, lParam); + case WM_CHOOSEFONT_GETLOGFONT: + TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", + lParam); + FIXME(commdlg, "current logfont back to caller\n"); + break; + } + return res; +} + + +static BOOL32 Commdlg_GetFileName32A( BOOL16 (*dofunction)(), + LPOPENFILENAME32A ofn ) +{ + BOOL16 ret; + LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16)); + + memset(ofn16,'\0',sizeof(*ofn16)); + ofn16->lStructSize = sizeof(*ofn16); + ofn16->hwndOwner = ofn->hwndOwner; + /* FIXME: OPENFILENAME16 got only 16 bit for HINSTANCE... */ + ofn16->hInstance = MODULE_HANDLEtoHMODULE16(ofn->hInstance); + if (ofn->lpstrFilter) { + LPSTR s,x; + + /* filter is a list... title\0ext\0......\0\0 */ + s = (LPSTR)ofn->lpstrFilter; + while (*s) + s = s+strlen(s)+1; + s++; + x = (LPSTR)SEGPTR_ALLOC(s-ofn->lpstrFilter); + memcpy(x,ofn->lpstrFilter,s-ofn->lpstrFilter); + ofn16->lpstrFilter = SEGPTR_GET(x); + } + if (ofn->lpstrCustomFilter) { + LPSTR s,x; + + /* filter is a list... title\0ext\0......\0\0 */ + s = (LPSTR)ofn->lpstrCustomFilter; + while (*s) + s = s+strlen(s)+1; + x = SEGPTR_ALLOC(s-ofn->lpstrCustomFilter); + s++; + memcpy(x,ofn->lpstrCustomFilter,s-ofn->lpstrCustomFilter); + ofn16->lpstrCustomFilter = SEGPTR_GET(x); + } + ofn16->nMaxCustFilter = ofn->nMaxCustFilter; + ofn16->nFilterIndex = ofn->nFilterIndex; + if (ofn->nMaxFile) + ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile)); + ofn16->nMaxFile = ofn->nMaxFile; + ofn16->nMaxFileTitle = ofn->nMaxFileTitle; + if (ofn16->nMaxFileTitle) + ofn16->lpstrFileTitle = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFileTitle)); + if (ofn->lpstrInitialDir) + ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrInitialDir)); + if (ofn->lpstrTitle) + ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrTitle)); + ofn16->Flags = ofn->Flags|OFN_WINE32; + ofn16->nFileOffset = ofn->nFileOffset; + ofn16->nFileExtension = ofn->nFileExtension; + if (ofn->lpstrDefExt) + ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrDefExt)); + ofn16->lCustData = ofn->lCustData; + ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook; + + if (ofn->lpTemplateName) + ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpTemplateName)); + + ret = dofunction(SEGPTR_GET(ofn16)); + + ofn->nFileOffset = ofn16->nFileOffset; + ofn->nFileExtension = ofn16->nFileExtension; + if (ofn16->lpstrFilter) + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter)); + if (ofn16->lpTemplateName) + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName)); + if (ofn16->lpstrDefExt) + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt)); + if (ofn16->lpstrTitle) + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle)); + if (ofn16->lpstrInitialDir) + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir)); + if (ofn16->lpstrCustomFilter) + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter)); + + if (ofn16->lpstrFile) + { + strcpy(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile)); + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile)); + } + + if (ofn16->lpstrFileTitle) + { + strcpy(ofn->lpstrFileTitle,PTR_SEG_TO_LIN(ofn16->lpstrFileTitle)); + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle)); + } + SEGPTR_FREE(ofn16); + return ret; +} + +static BOOL32 Commdlg_GetFileName32W( BOOL16 (*dofunction)(), + LPOPENFILENAME32W ofn ) +{ + BOOL16 ret; + LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16)); + + memset(ofn16,'\0',sizeof(*ofn16)); + ofn16->lStructSize = sizeof(*ofn16); + ofn16->hwndOwner = ofn->hwndOwner; + /* FIXME: OPENFILENAME16 got only 16 bit for HINSTANCE... */ + ofn16->hInstance = MODULE_HANDLEtoHMODULE16(ofn->hInstance); + if (ofn->lpstrFilter) { + LPWSTR s; + LPSTR x,y; + int n; + + /* filter is a list... title\0ext\0......\0\0 */ + s = (LPWSTR)ofn->lpstrFilter; + while (*s) + s = s+lstrlen32W(s)+1; + s++; + n = s - ofn->lpstrFilter; /* already divides by 2. ptr magic */ + x = y = (LPSTR)SEGPTR_ALLOC(n); + s = (LPWSTR)ofn->lpstrFilter; + while (*s) { + lstrcpyWtoA(x,s); + x+=lstrlen32A(x)+1; + s+=lstrlen32W(s)+1; + } + *x=0; + ofn16->lpstrFilter = SEGPTR_GET(y); +} + if (ofn->lpstrCustomFilter) { + LPWSTR s; + LPSTR x,y; + int n; + + /* filter is a list... title\0ext\0......\0\0 */ + s = (LPWSTR)ofn->lpstrCustomFilter; + while (*s) + s = s+lstrlen32W(s)+1; + s++; + n = s - ofn->lpstrCustomFilter; + x = y = (LPSTR)SEGPTR_ALLOC(n); + s = (LPWSTR)ofn->lpstrCustomFilter; + while (*s) { + lstrcpyWtoA(x,s); + x+=lstrlen32A(x)+1; + s+=lstrlen32W(s)+1; + } + *x=0; + ofn16->lpstrCustomFilter = SEGPTR_GET(y); + } + ofn16->nMaxCustFilter = ofn->nMaxCustFilter; + ofn16->nFilterIndex = ofn->nFilterIndex; + if (ofn->nMaxFile) + ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile)); + ofn16->nMaxFile = ofn->nMaxFile; + ofn16->nMaxFileTitle = ofn->nMaxFileTitle; + if (ofn->nMaxFileTitle) + ofn16->lpstrFileTitle = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFileTitle)); + if (ofn->lpstrInitialDir) + ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrInitialDir)); + if (ofn->lpstrTitle) + ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrTitle)); + ofn16->Flags = ofn->Flags|OFN_WINE32|OFN_UNICODE; + ofn16->nFileOffset = ofn->nFileOffset; + ofn16->nFileExtension = ofn->nFileExtension; + if (ofn->lpstrDefExt) + ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrDefExt)); + ofn16->lCustData = ofn->lCustData; + ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook; + if (ofn->lpTemplateName) + ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpTemplateName)); + ret = dofunction(SEGPTR_GET(ofn16)); + + ofn->nFileOffset = ofn16->nFileOffset; + ofn->nFileExtension = ofn16->nFileExtension; + if (ofn16->lpstrFilter) + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter)); + if (ofn16->lpTemplateName) + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName)); + if (ofn16->lpstrDefExt) + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt)); + if (ofn16->lpstrTitle) + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle)); + if (ofn16->lpstrInitialDir) + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir)); + if (ofn16->lpstrCustomFilter) + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter)); + + if (ofn16->lpstrFile) { + lstrcpyAtoW(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile)); + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile)); + } + + if (ofn16->lpstrFileTitle) { + lstrcpyAtoW(ofn->lpstrFileTitle,PTR_SEG_TO_LIN(ofn16->lpstrFileTitle)); + SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle)); + } + SEGPTR_FREE(ofn16); + return ret; +} + +/*********************************************************************** + * GetOpenFileName32A (COMDLG32.10) + */ +BOOL32 WINAPI GetOpenFileName32A( LPOPENFILENAME32A ofn ) +{ + BOOL16 (WINAPI * dofunction)(SEGPTR ofn16) = GetOpenFileName16; + return Commdlg_GetFileName32A(dofunction,ofn); +} + +/*********************************************************************** + * GetOpenFileName32W (COMDLG32.11) + */ +BOOL32 WINAPI GetOpenFileName32W( LPOPENFILENAME32W ofn ) +{ + BOOL16 (WINAPI * dofunction)(SEGPTR ofn16) = GetOpenFileName16; + return Commdlg_GetFileName32W(dofunction,ofn); +} + +/*********************************************************************** + * GetSaveFileName32A (COMDLG32.12) + */ +BOOL32 WINAPI GetSaveFileName32A( LPOPENFILENAME32A ofn ) +{ + BOOL16 (WINAPI * dofunction)(SEGPTR ofn16) = GetSaveFileName16; + return Commdlg_GetFileName32A(dofunction,ofn); +} + +/*********************************************************************** + * GetSaveFileName32W (COMDLG32.13) + */ +BOOL32 WINAPI GetSaveFileName32W( LPOPENFILENAME32W ofn ) +{ + BOOL16 (WINAPI * dofunction)(SEGPTR ofn16) = GetSaveFileName16; + return Commdlg_GetFileName32W(dofunction,ofn); } diff --git a/misc/crtdll.c b/misc/crtdll.c index 2c00a326ebd..e9f1dd366b1 100644 --- a/misc/crtdll.c +++ b/misc/crtdll.c @@ -67,6 +67,8 @@ UINT32 CRTDLL_winmajor_dll; /* CRTDLL.329 */ UINT32 CRTDLL_winminor_dll; /* CRTDLL.330 */ UINT32 CRTDLL_winver_dll; /* CRTDLL.331 */ +BYTE CRTDLL_iob[32*3]; /* FIXME */ + typedef VOID (*new_handler_type)(VOID); static new_handler_type new_handler; @@ -177,6 +179,21 @@ DWORD __cdecl CRTDLL__fdopen(INT32 handle, LPCSTR mode) return (DWORD)file; } +static FILE *xlat_file_ptr(void *ptr) +{ + unsigned long dif; + + /* CRT sizeof(FILE) == 32 */ + dif = ((char *)ptr - (char *)CRTDLL_iob) / 32; + switch(dif) + { + case 0: return stdin; + case 1: return stdout; + case 2: return stderr; + } + return (FILE*)ptr; +} + /******************************************************************* * _global_unwind2 (CRTDLL.129) */ @@ -246,9 +263,10 @@ DWORD __cdecl CRTDLL_fopen(LPCSTR path, LPCSTR mode) /********************************************************************* * fread (CRTDLL.377) */ -DWORD __cdecl CRTDLL_fread(LPVOID ptr, INT32 size, INT32 nmemb, LPVOID file) +DWORD __cdecl CRTDLL_fread(LPVOID ptr, INT32 size, INT32 nmemb, LPVOID vfile) { size_t ret=1; + FILE *file=xlat_file_ptr(vfile); #if 0 int i=0; void *temp=ptr; @@ -293,7 +311,7 @@ LONG __cdecl CRTDLL_fseek(LPVOID stream, LONG offset, INT32 whence) { long ret; - ret=fseek(stream,offset,whence); + ret=fseek(xlat_file_ptr(stream),offset,whence); TRACE(crtdll, "file %p to 0x%08lx pos %s\n", stream,offset,(whence==SEEK_SET)?"SEEK_SET": (whence==SEEK_CUR)?"SEEK_CUR": @@ -311,7 +329,7 @@ LONG __cdecl CRTDLL_ftell(LPVOID stream) { long ret; - ret=ftell(stream); + ret=ftell(xlat_file_ptr(stream)); TRACE(crtdll, "file %p at 0x%08lx\n", stream,ret); return ret; @@ -320,9 +338,10 @@ LONG __cdecl CRTDLL_ftell(LPVOID stream) /********************************************************************* * fwrite (CRTDLL.386) */ -DWORD __cdecl CRTDLL_fwrite(LPVOID ptr, INT32 size, INT32 nmemb, LPVOID file) +DWORD __cdecl CRTDLL_fwrite(LPVOID ptr, INT32 size, INT32 nmemb, LPVOID vfile) { size_t ret; + FILE *file=xlat_file_ptr(vfile); ret=fwrite(ptr,size,nmemb,file); TRACE(crtdll, "0x%08x items of size %d from %p to file %p\n", @@ -342,7 +361,7 @@ INT32 __cdecl CRTDLL_setbuf(LPVOID file, LPSTR buf) /* this doesn't work:"void value not ignored as it ought to be" return setbuf(file,buf); */ - setbuf(file,buf); + setbuf(xlat_file_ptr(file),buf); return 0; } @@ -393,7 +412,7 @@ INT32 __cdecl CRTDLL_fprintf( FILE *file, LPSTR format, ... ) INT32 res; va_start( valist, format ); - res = vfprintf( file, format, valist ); + res = vfprintf( xlat_file_ptr(file), format, valist ); va_end( valist ); return res; } @@ -403,7 +422,7 @@ INT32 __cdecl CRTDLL_fprintf( FILE *file, LPSTR format, ... ) */ INT32 __cdecl CRTDLL_vfprintf( FILE *file, LPSTR format, va_list args ) { - return vfprintf( file, format, args ); + return vfprintf( xlat_file_ptr(file), format, args ); } /********************************************************************* @@ -511,7 +530,7 @@ INT32 __cdecl CRTDLL_fflush(LPVOID stream) { int ret; - ret = fflush(stream); + ret = fflush(xlat_file_ptr(stream)); TRACE(crtdll,"%p returnd %d\n",stream,ret); if(ret) WARN(crtdll, " Failed!\n"); @@ -559,7 +578,7 @@ void __cdecl CRTDLL_putchar( INT32 x ) INT32 __cdecl CRTDLL_fputc( INT32 c, FILE *stream ) { TRACE(crtdll, "%c to file %p\n",c,stream); - return fputc(c,stream); + return fputc(c,xlat_file_ptr(stream)); } @@ -569,7 +588,7 @@ INT32 __cdecl CRTDLL_fputc( INT32 c, FILE *stream ) INT32 __cdecl CRTDLL_fputs( LPCSTR s, FILE *stream ) { TRACE(crtdll, "%s to file %p\n",s,stream); - return fputs(s,stream); + return fputs(s,xlat_file_ptr(stream)); } @@ -589,14 +608,14 @@ INT32 __cdecl CRTDLL_puts(LPCSTR s) INT32 __cdecl CRTDLL_putc(INT32 c, FILE *stream) { TRACE(crtdll, " %c to file %p\n",c,stream); - return fputc(c,stream); + return fputc(c,xlat_file_ptr(stream)); } /********************************************************************* * fgetc (CRTDLL.366) */ INT32 __cdecl CRTDLL_fgetc( FILE *stream ) { - int ret= fgetc(stream); + int ret= fgetc(xlat_file_ptr(stream)); TRACE(crtdll, "got %d\n",ret); return ret; } @@ -607,7 +626,7 @@ INT32 __cdecl CRTDLL_fgetc( FILE *stream ) */ INT32 __cdecl CRTDLL_getc( FILE *stream ) { - int ret= fgetc(stream); + int ret= fgetc(xlat_file_ptr(stream)); TRACE(crtdll, "got %d\n",ret); return ret; } @@ -646,7 +665,7 @@ CHAR* __cdecl CRTDLL_fgets(LPSTR s,INT32 size, LPVOID stream) char * ret; char * control_M; - ret=fgets(s, size,stream); + ret=fgets(s, size,xlat_file_ptr(stream)); /*FIXME: Control with CRTDLL_setmode */ control_M= strrchr(s,'\r'); /*delete CR if we read a DOS File */ @@ -937,10 +956,13 @@ LPSTR __cdecl CRTDLL__strdup(LPSTR ptr) */ INT32 __cdecl CRTDLL_fclose( FILE *stream ) { - int unix_handle=fileno(stream); + int unix_handle; HFILE32 dos_handle=1; HFILE32 ret=EOF; + stream=xlat_file_ptr(stream); + unix_handle=fileno(stream); + if (unix_handle<4) ret= fclose(stream); else { while(FILE_GetUnixHandle(dos_handle) != unix_handle) dos_handle++; @@ -1090,7 +1112,7 @@ INT32 __cdecl CRTDLL_feof( FILE *stream ) { int ret; - ret=feof(stream); + ret=feof(xlat_file_ptr(stream)); TRACE(crtdll,"(%p) %s\n",stream,(ret)?"true":"false"); return ret; } @@ -1686,7 +1708,7 @@ typedef VOID (*sig_handler_type)(VOID); */ VOID __cdecl CRTDLL_signal(int sig, sig_handler_type ptr) { - FIXME(crtdll, "(%d %p): STUB!\n", sig, ptr); + FIXME(crtdll, "(%d %p):stub.\n", sig, ptr); } /********************************************************************* diff --git a/misc/ddeml.c b/misc/ddeml.c index 87b1f849e86..5d599400f72 100644 --- a/misc/ddeml.c +++ b/misc/ddeml.c @@ -11,40 +11,52 @@ #include "ddeml.h" #include "debug.h" +/* FIXME: What are these values? */ +#define DMLERR_NO_ERROR 0 static LONG DDE_current_handle; -/***************************************************************** +/****************************************************************************** * DdeInitialize16 (DDEML.2) */ UINT16 WINAPI DdeInitialize16( LPDWORD pidInst, PFNCALLBACK16 pfnCallback, DWORD afCmd, DWORD ulRes) { - FIXME( ddeml, "empty stub\n" ); - return 0; + return (UINT16)DdeInitialize32A(pidInst,(PFNCALLBACK32)pfnCallback, + afCmd, ulRes); } -/***************************************************************** +/****************************************************************************** * DdeInitialize32A (USER32.106) */ UINT32 WINAPI DdeInitialize32A( LPDWORD pidInst, PFNCALLBACK32 pfnCallback, DWORD afCmd, DWORD ulRes ) { - FIXME( ddeml, "empty stub\n" ); - return 0; + return DdeInitialize32W(pidInst,pfnCallback,afCmd,ulRes); } -/***************************************************************** - * DdeInitialize32W (USER32.107) +/****************************************************************************** + * DdeInitialize32W [USER32.107] + * Registers an application with the DDEML + * + * PARAMS + * pidInst [I] Pointer to instance identifier + * pfnCallback [I] Pointer to callback function + * afCmd [I] Set of command and filter flags + * ulRes [I] Reserved + * + * RETURNS + * Success: DMLERR_NO_ERROR + * Failure: DMLERR_DLL_USAGE, DMLERR_INVALIDPARAMETER, DMLERR_SYS_ERROR */ UINT32 WINAPI DdeInitialize32W( LPDWORD pidInst, PFNCALLBACK32 pfnCallback, DWORD afCmd, DWORD ulRes ) { - FIXME( ddeml, "empty stub\n" ); - return 0; + FIXME(ddeml, "(%p,%p,%ld,%ld): stub\n",pidInst,pfnCallback,afCmd,ulRes); + return DMLERR_NO_ERROR; } @@ -58,24 +70,56 @@ BOOL16 WINAPI DdeUninitialize16( DWORD idInst ) /***************************************************************** - * DdeUninitialize32 (USER32.119) + * DdeUninitialize32 [USER32.119] Frees DDEML resources + * + * PARAMS + * idInst [I] Instance identifier + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ BOOL32 WINAPI DdeUninitialize32( DWORD idInst ) { - FIXME( ddeml, "empty stub\n" ); + FIXME(ddeml, "(%ld): stub\n", idInst); return TRUE; } + /***************************************************************** - * DdeConnectList (DDEML.4) + * DdeConnectList16 [DDEML.4] */ -HCONVLIST WINAPI DdeConnectList( DWORD idInst, HSZ hszService, HSZ hszTopic, - HCONVLIST hConvList, LPCONVCONTEXT16 pCC ) +HCONVLIST WINAPI DdeConnectList16( DWORD idInst, HSZ hszService, HSZ hszTopic, + HCONVLIST hConvList, LPCONVCONTEXT16 pCC ) { - FIXME( ddeml, "empty stub\n" ); - return 0; + return DdeConnectList32(idInst, hszService, hszTopic, hConvList, + (LPCONVCONTEXT32)pCC); } + +/****************************************************************************** + * DdeConnectList32 [USER32.93] Establishes conversation with DDE servers + * + * PARAMS + * idInst [I] Instance identifier + * hszService [I] Handle to service name string + * hszTopic [I] Handle to topic name string + * hConvList [I] Handle to conversation list + * pCC [I] Pointer to structure with context data + * + * RETURNS + * Success: Handle to new conversation list + * Failure: 0 + */ +HCONVLIST WINAPI DdeConnectList32( DWORD idInst, HSZ hszService, HSZ hszTopic, + HCONVLIST hConvList, LPCONVCONTEXT32 pCC ) +{ + FIXME(ddeml, "(%ld,%ld,%ld,%ld,%p): stub\n", idInst, hszService, hszTopic, + hConvList,pCC); + return 1; +} + + /***************************************************************** * DdeQueryNextServer (DDEML.5) */ @@ -88,12 +132,27 @@ HCONV WINAPI DdeQueryNextServer( HCONVLIST hConvList, HCONV hConvPrev ) /***************************************************************** * DdeDisconnectList (DDEML.6) */ -BOOL16 WINAPI DdeDisconnectList( HCONVLIST hConvList ) +BOOL16 WINAPI DdeDisconnectList16( HCONVLIST hConvList ) { - FIXME( ddeml, "empty stub\n" ); - return 0; + return (BOOL16)DdeDisconnectList32(hConvList); } + +/****************************************************************************** + * DdeDisconnectList32 [USER32.98] Destroys list and terminates conversations + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL32 WINAPI DdeDisconnectList32( + HCONVLIST hConvList) /* [in] Handle to conversation list */ +{ + FIXME(ddeml, "(%ld): stub\n", hConvList); + return TRUE; +} + + /***************************************************************** * DdeConnect16 (DDEML.7) */ @@ -111,7 +170,7 @@ HCONV WINAPI DdeConnect16( DWORD idInst, HSZ hszService, HSZ hszTopic, HCONV WINAPI DdeConnect32( DWORD idInst, HSZ hszService, HSZ hszTopic, LPCONVCONTEXT32 pCC ) { - FIXME( ddeml, "empty stub\n" ); + FIXME( ddeml, "(...): stub\n"); return 0; } @@ -172,22 +231,29 @@ HSZ WINAPI DdeCreateStringHandle16( DWORD idInst, LPCSTR str, INT16 codepage ) /***************************************************************** - * DdeCreateStringHandle32A (USER32.95) + * DdeCreateStringHandle32A [USER32.95] */ HSZ WINAPI DdeCreateStringHandle32A( DWORD idInst, LPCSTR psz, INT32 codepage ) { - FIXME( ddeml, "empty stub\n" ); + FIXME(ddeml, "(...): stub\n" ); DDE_current_handle++; return DDE_current_handle; } -/***************************************************************** - * DdeCreateStringHandle32W (USER32.96) +/****************************************************************************** + * DdeCreateStringHandle32W [USER32.96] Creates handle to identify string + * + * RETURNS + * Success: String handle + * Failure: 0 */ -HSZ WINAPI DdeCreateStringHandle32W( DWORD idInst, LPCWSTR psz, INT32 codepage) +HSZ WINAPI DdeCreateStringHandle32W( + DWORD idInst, /* [in] Instance identifier */ + LPCWSTR psz, /* [in] Pointer to string */ + INT32 codepage) /* [in] Code page identifier */ { - FIXME( ddeml, "empty stub\n" ); + FIXME(ddeml, "(%ld,%s,%d): stub\n",idInst,debugstr_w(psz),codepage); DDE_current_handle++; return DDE_current_handle; } @@ -285,15 +351,33 @@ BOOL16 WINAPI DdeAbandonTransaction( DWORD idInst, HCONV hConv, return 0; } + /***************************************************************** - * DdePostAdvise (DDEML.13) + * DdePostAdvise16 [DDEML.13] */ -BOOL16 WINAPI DdePostAdvise( DWORD idInst, HSZ hszTopic, HSZ hszItem ) +BOOL16 WINAPI DdePostAdvise16( DWORD idInst, HSZ hszTopic, HSZ hszItem ) { - FIXME( ddeml, "empty stub\n" ); - return 0; + return (BOOL16)DdePostAdvise32(idInst, hszTopic, hszItem); } + +/****************************************************************************** + * DdePostAdvise32 [USER32.110] Send transaction to DDE callback function. + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL32 WINAPI DdePostAdvise32( + DWORD idInst, /* [in] Instance identifier */ + HSZ hszTopic, /* [in] Handle to topic name string */ + HSZ hszItem) /* [in] Handle to item name string */ +{ + FIXME(ddeml, "(%ld,%ld,%ld): stub\n",idInst,hszTopic,hszItem); + return TRUE; +} + + /***************************************************************** * DdeAddData (DDEML.15) */ @@ -304,16 +388,37 @@ HDDEDATA WINAPI DdeAddData( HDDEDATA hData, LPBYTE pSrc, DWORD cb, return 0; } -/***************************************************************** - * DdeGetData (DDEML.16) + +/****************************************************************************** + * DdeGetData32 [USER32.102] Copies data from DDE object ot local buffer + * + * RETURNS + * Size of memory object associated with handle */ -DWORD WINAPI DdeGetData( HDDEDATA hData, LPBYTE pDst, DWORD cbMax, - DWORD cbOff ) +DWORD WINAPI DdeGetData32( + HDDEDATA hData, /* [in] Handle to DDE object */ + LPBYTE pDst, /* [in] Pointer to destination buffer */ + DWORD cbMax, /* [in] Amount of data to copy */ + DWORD cbOff) /* [in] Offset to beginning of data */ { - FIXME( ddeml, "empty stub\n" ); - return 0; + FIXME(ddeml, "(%ld,%p,%ld,%ld): stub\n",hData,pDst,cbMax,cbOff); + return cbMax; } + +/***************************************************************** + * DdeGetData16 [DDEML.16] + */ +DWORD WINAPI DdeGetData16( + HDDEDATA hData, + LPBYTE pDst, + DWORD cbMax, + DWORD cbOff) +{ + return DdeGetData32(hData, pDst, cbMax, cbOff); +} + + /***************************************************************** * DdeAccessData (DDEML.17) */ @@ -351,14 +456,24 @@ HDDEDATA WINAPI DdeNameService16( DWORD idInst, HSZ hsz1, HSZ hsz2, } -/***************************************************************** - * DdeNameService32 (USER32.109) +/****************************************************************************** + * DdeNameService32 [USER32.109] {Un}registers service name of DDE server + * + * PARAMS + * idInst [I] Instance identifier + * hsz1 [I] Handle to service name string + * hsz2 [I] Reserved + * afCmd [I] Service name flags + * + * RETURNS + * Success: Non-zero + * Failure: 0 */ HDDEDATA WINAPI DdeNameService32( DWORD idInst, HSZ hsz1, HSZ hsz2, - UINT32 afCmd ) + UINT32 afCmd ) { - FIXME( ddeml, "empty stub\n" ); - return 0; + FIXME(ddeml, "(%ld,%ld,%ld,%d): stub\n",idInst,hsz1,hsz2,afCmd); + return 1; } @@ -371,15 +486,22 @@ UINT16 WINAPI DdeGetLastError16( DWORD idInst ) } -/***************************************************************** - * DdeGetLastError32 (USER32.103) +/****************************************************************************** + * DdeGetLastError32 [USER32.103] Gets most recent error code + * + * PARAMS + * idInst [I] Instance identifier + * + * RETURNS + * Last error code */ UINT32 WINAPI DdeGetLastError32( DWORD idInst ) { - FIXME( ddeml, "empty stub\n" ); + FIXME(ddeml, "(%ld): stub\n",idInst); return 0; } + /***************************************************************** * DdeCmpStringHandles (DDEML.36) */ diff --git a/misc/error.c b/misc/error.c index 3a36237d8a8..4ae65a71974 100644 --- a/misc/error.c +++ b/misc/error.c @@ -140,8 +140,7 @@ static const char *GetParamErrorString(UINT16 uErr) { */ VOID WINAPI LogError(UINT16 uErr, LPVOID lpvInfo) { - fprintf(stddeb, "LogError(%s, %p)\n", - GetErrorString(uErr), lpvInfo); + MSG("(%s, %p)\n", GetErrorString(uErr), lpvInfo); } @@ -153,6 +152,5 @@ void WINAPI LogParamError(UINT16 uErr, FARPROC16 lpfn, LPVOID lpvParam) /* FIXME: is it possible to get the module name/function * from the lpfn param? */ - fprintf(stddeb, "LogParamError(%s, %p, %p)\n", - GetParamErrorString(uErr), lpfn, lpvParam); + MSG("(%s, %p, %p)\n", GetParamErrorString(uErr), lpfn, lpvParam); } diff --git a/misc/imagelist.c b/misc/imagelist.c index 474de9ee251..17f6d2c2424 100644 --- a/misc/imagelist.c +++ b/misc/imagelist.c @@ -1452,9 +1452,9 @@ BOOL32 WINAPI ImageList_Remove ( /* create new bitmap(s) */ cxNew = (himl->cCurImage + himl->cGrow - 1) * himl->cx; - fprintf (stderr, " - Number of images: %d / %d (Old/New)\n", + TRACE(imagelist, " - Number of images: %d / %d (Old/New)\n", himl->cCurImage, himl->cCurImage - 1); - fprintf (stderr, " - Max. number of images: %d / %d (Old/New)\n", + TRACE(imagelist, " - Max. number of images: %d / %d (Old/New)\n", himl->cMaxImage, himl->cCurImage + himl->cGrow - 1); hbmNewImage = diff --git a/misc/lstr.c b/misc/lstr.c index 05b7fb3dbdf..98d87488a75 100644 --- a/misc/lstr.c +++ b/misc/lstr.c @@ -159,7 +159,7 @@ void WINAPI OutputDebugString16( LPCSTR str ) *p = '\0'; if ((p > buffer) && (p[-1] == '\n')) p[1] = '\0'; /* Remove trailing \n */ module = MODULE_GetModuleName( GetCurrentTask() ); - fprintf( stderr, "OutputDebugString: %s says '%s'\n", + TRACE(resource, "%s says '%s'\n", module ? module : "???", buffer ); HeapFree( GetProcessHeap(), 0, buffer ); } @@ -646,8 +646,18 @@ DWORD WINAPI FormatMessage32A( } *t='\0'; } - if (!nolinefeed && t[-1]!='\n') - ADD_TO_T('\n'); + if (nolinefeed) { + /* remove linefeed */ + if(t>target && t[-1]=='\n') { + *--t=0; + if(t>target && t[-1]=='\r') + *--t=0; + } + } else { + /* add linefeed */ + if(t==target || t[-1]!='\n') + ADD_TO_T('\n'); /* FIXME: perhaps add \r too? */ + } talloced = strlen(target)+1; if (nSize && tallocedtarget && t[-1]=='\n') { + *--t=0; + if(t>target && t[-1]=='\r') + *--t=0; + } + } else { + /* add linefeed */ + if(t==target || t[-1]!='\n') + ADD_TO_T('\n'); /* FIXME: perhaps add \r too? */ + } talloced = strlen(target)+1; if (nSize && tallocedname; p++) fprintf( stderr, "%s ", p->name ); - fprintf( stderr, "\n" ); + MSG( "Invalid language specified '%s'. Supported languages are: ", arg ); + for (p = Languages; p->name; p++) MSG( "%s ", p->name ); + MSG( "\n" ); exit(1); } @@ -299,8 +299,8 @@ static void MAIN_ParseModeOption( char *arg ) else if (!lstrcmpi32A("standard", arg)) Options.mode = MODE_STANDARD; else { - fprintf(stderr, "Invalid mode '%s' specified.\n", arg); - fprintf(stderr, "Valid modes are: 'standard', 'enhanced' (default).\n"); + MSG( "Invalid mode '%s' specified.\n", arg); + MSG( "Valid modes are: 'standard', 'enhanced' (default).\n"); exit(1); } } @@ -339,7 +339,7 @@ static void MAIN_ParseOptions( int *argc, char *argv[] ) if (!(display = TSXOpenDisplay( display_name ))) { - fprintf( stderr, "%s: Can't open display: %s\n", + MSG( "%s: Can't open display: %s\n", argv[0], display_name ? display_name : "(none specified)" ); exit(1); } @@ -387,7 +387,7 @@ static void MAIN_ParseOptions( int *argc, char *argv[] ) if (MAIN_GetResource( db, ".debugmsg", &value)) { #ifndef DEBUG_RUNTIME - fprintf(stderr,"%s: Option \"-debugmsg\" not implemented.\n" \ + MSG("%s: Option \"-debugmsg\" not implemented.\n" \ " Recompile with DEBUG_RUNTIME in include/debugtools.h defined.\n", argv[0]); exit(1); @@ -395,23 +395,23 @@ static void MAIN_ParseOptions( int *argc, char *argv[] ) if (ParseDebugOptions((char*)value.addr)==FALSE) { int i; - fprintf(stderr,"%s: Syntax: -debugmsg [class]+xxx,... or " + MSG("%s: Syntax: -debugmsg [class]+xxx,... or " "-debugmsg [class]-xxx,...\n",argv[0]); - fprintf(stderr,"Example: -debugmsg +all,warn-heap" + MSG("Example: -debugmsg +all,warn-heap" "turn on all messages except warning heap messages\n"); - fprintf(stderr,"Available message classes:\n"); + MSG("Available message classes:\n"); for(i=0;imin_width = size_hints->max_width = width; @@ -557,11 +557,11 @@ BOOL32 MAIN_WineInit( int *argc, char *argv[] ) mcheck(NULL); if (!(trace = getenv("MALLOC_TRACE"))) { - fprintf( stderr, "MALLOC_TRACE not set. No trace generated\n" ); + MSG( "MALLOC_TRACE not set. No trace generated\n" ); } else { - fprintf( stderr, "malloc trace goes to %s\n", trace ); + MSG( "malloc trace goes to %s\n", trace ); mtrace(); } #endif @@ -584,7 +584,7 @@ BOOL32 MAIN_WineInit( int *argc, char *argv[] ) if (Options.desktopGeometry && Options.managed) { - fprintf( stderr, "%s: -managed and -desktop options cannot be used together\n", + MSG( "%s: -managed and -desktop options cannot be used together\n", Options.programName ); exit(1); } @@ -600,7 +600,7 @@ BOOL32 MAIN_WineInit( int *argc, char *argv[] ) TSXFree( depth_list ); if (i >= depth_count) { - fprintf( stderr, "%s: Depth %d not supported on this screen.\n", + MSG( "%s: Depth %d not supported on this screen.\n", Options.programName, screenDepth ); exit(1); } @@ -796,7 +796,7 @@ BOOL32 WINAPI SystemParametersInfo32A( UINT32 uAction, UINT32 uParam, LPANIMATIONINFO lpAnimInfo = (LPANIMATIONINFO)lpvParam; /* Do nothing */ - fprintf(stderr, "SystemParametersInfo: SPI_SETANIMATION ignored.\n"); + WARN(system, "SPI_SETANIMATION ignored.\n"); lpAnimInfo->cbSize = sizeof(ANIMATIONINFO); uParam = sizeof(ANIMATIONINFO); break; @@ -982,7 +982,7 @@ BOOL16 WINAPI SystemParametersInfo16( UINT16 uAction, UINT16 uParam, case SPI_SETKEYBOARDDELAY: case SPI_SETKEYBOARDSPEED: case SPI_GETHIGHCONTRAST: - fprintf(stderr, "SystemParametersInfo: option %d ignored.\n", uAction); + WARN(system, "Option %d ignored.\n", uAction); break; case SPI_GETWORKAREA: @@ -992,7 +992,7 @@ BOOL16 WINAPI SystemParametersInfo16( UINT16 uAction, UINT16 uParam, break; default: - fprintf(stderr, "SystemParametersInfo: unknown option %d.\n", uAction); + WARN(system, "Unknown option %d.\n", uAction); break; } return 1; diff --git a/misc/mpr.c b/misc/mpr.c deleted file mode 100644 index dce6dc12854..00000000000 --- a/misc/mpr.c +++ /dev/null @@ -1,71 +0,0 @@ -/* MPR.dll - * - * Copyright 1996 Marcus Meissner - */ - -#include -#include "win.h" -#include "debug.h" -#include "wnet.h" - - -/************************************************************************** - * WNetCachePassword [MPR.52] Saves password in cache - * - * RETURNS - * Success: WN_SUCCESS - * Failure: WNACCESS_DENIED, WN_BAD_PASSWORD, WN_BADVALUE, WN_NET_ERROR, - * WN_NOT_SUPPORTED, WN_OUT_OF_MEMORY - */ -DWORD WINAPI WNetCachePassword( - LPSTR pbResource, /* [in] Name of workgroup, computer, or resource */ - WORD cbResource, /* [in] Size of name */ - LPSTR pbPassword, /* [in] Buffer containing password */ - WORD cbPassword, /* [in] Size of password */ - BYTE nType) /* [in] Type of password to cache */ -{ - FIXME(mpr,"(%s,%d,%s,%d,%d): stub\n", pbResource,cbResource, - pbPassword,cbPassword,nType); - return WN_SUCCESS; -} - - -/************************************************************************** - * WNetGetCachedPassword [MPR.???] Retrieves password from cache - * - * RETURNS - * Success: WN_SUCCESS - * Failure: WNACCESS_DENIED, WN_BAD_PASSWORD, WN_BAD_VALUE, WN_NET_ERROR, - * WN_NOT_SUPPORTED, WN_OUT_OF_MEMORY - */ -DWORD WINAPI WNetGetCachedPassword( - LPSTR pbResource, /* [in] Name of workgroup, computer, or resource */ - WORD cbResource, /* [in] Size of name */ - LPSTR pbPassword, /* [out] Buffer to receive password */ - LPWORD pcbPassword, /* [out] Receives size of password */ - BYTE nType) /* [in] Type of password to retrieve */ -{ - FIXME(mpr,"(%s,%d,%p,%d,%d): stub\n", - pbResource,cbResource,pbPassword,*pcbPassword,nType); - return WN_ACCESS_DENIED; -} - - -/************************************************************************** - * MultinetGetConnectionPerformance32A [MPR.???] - * - * RETURNS - * Success: NO_ERROR - * Failure: ERROR_NOT_SUPPORTED, ERROR_NOT_CONNECTED, - * ERROR_NO_NET_OR_BAD_PATH, ERROR_BAD_DEVICE, - * ERROR_BAD_NET_NAME, ERROR_INVALID_PARAMETER, - * ERROR_NO_NETWORK, ERROR_EXTENDED_ERROR - */ -DWORD WINAPI MultinetGetConnectionPerformance32A( - LPNETRESOURCE32A lpNetResource, /* [in] Specifies resource */ - LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct) /* [in] Pointer to struct */ -{ - FIXME(mpr,"(%p,%p): stub\n",lpNetResource,lpNetConnectInfoStruct); - return WN_NOT_SUPPORTED; -} - diff --git a/misc/network.c b/misc/network.c index 7af8b4c47c8..1df5a1c4fd6 100644 --- a/misc/network.c +++ b/misc/network.c @@ -1,5 +1,9 @@ /* * Network functions + * + * This is the MPR.DLL stuff from Win32, as well as the USER + * stuff by the same names in Win 3.x. + * */ #include @@ -10,9 +14,114 @@ #include "drive.h" #include "wnet.h" #include "debug.h" +#include "win.h" + +/******************************************************************** + * WNetAddConnection16 [USER.517] Directs a local device to net + * + * Redirects a local device (either a disk drive or printer port) + * to a shared device on a remote server. + */ +UINT16 WINAPI WNetAddConnection16(LPSTR lpNetPath, LPSTR lpPassWord, + LPSTR lpLocalName) +{ + return WNetAddConnection32A(lpNetPath, lpPassWord, lpLocalName); +} + +/* [MPR.50] */ + +UINT32 WNetAddConnection32A(LPSTR NetPath, LPSTR PassWord, + LPSTR LocalName) +{ + FIXME(wnet, "('%s', %p, '%s'): stub\n", + NetPath, PassWord, LocalName); + return WN_NO_NETWORK; +} + +/* [MPR.51] */ + +UINT32 WNetAddConnection32W(LPWSTR NetPath, + LPWSTR PassWord, + LPWSTR LocalName) +{ + FIXME(wnet, " stub!\n"); + return WN_NO_NETWORK; +} + +/* **************************************************************** + * WNetAddConnection2_32A [MPR.46] + */ + +UINT32 +WNetAddConnection2_32A(LPNETRESOURCE32A netresource, /* [in] */ + LPCSTR password, /* [in] */ + LPCSTR username, /* [in] */ + DWORD flags /* [in] */ ) +{ + FIXME(wnet, "(%p,%s,%s,0x%08lx), stub!\n", netresource, + password, username, (unsigned long) flags); + SetLastError(WN_NO_NETWORK); + return WN_NO_NETWORK; +} + +/* **************************************************************** + * WNetAddConnection2W [MPR.47] + */ + +UINT32 +WNetAddConnection2_32W(LPNETRESOURCE32W netresource, /* [in] */ + LPCWSTR password, /* [in] */ + LPCWSTR username, /* [in] */ + DWORD flags /* [in] */ ) +{ + FIXME(wnet, ", stub!\n"); + SetLastError(WN_NO_NETWORK); + return WN_NO_NETWORK; +} + +/* **************************************************************** + * WNetAddConnection3_32A [MPR.48] + */ + +UINT32 WNetAddConnection3_32A(HWND32 owner, + LPNETRESOURCE32A netresource, + LPCSTR password, + LPCSTR username, + DWORD flags) +{ + TRACE(wnet, "owner = 0x%x\n", owner); + return WNetAddConnection2_32A(netresource, + password, username, flags); +} + +/* **************************************************************** + * WNetAddConnection3W [MPR.49] + */ + +UINT32 WNetAddConnection3_32W(HWND32 owner, + LPNETRESOURCE32W netresource, + LPCWSTR username, + LPCWSTR password, + DWORD flags) +{ + TRACE(wnet,"owner = 0x%x\n", owner); + return WNetAddConnection2_32W(netresource, username, password, + flags); +} + + +/******************************************************************** + * WNetCancelConnection [USER.518] undirects a local device + */ +UINT16 WINAPI WNetCancelConnection(LPSTR lpName, BOOL16 bForce) +{ + FIXME(wnet, "('%s', %04X): stub\n", lpName, bForce); + return WN_NO_NETWORK; +} + /************************************************************************** - * WNetErrorText [USER.499] + * WNetErrorText16 [USER.499] */ int WINAPI WNetErrorText(WORD nError,LPSTR lpszText,WORD cbText) { @@ -21,7 +130,7 @@ int WINAPI WNetErrorText(WORD nError,LPSTR lpszText,WORD cbText) } /************************************************************************** - * WNetOpenJob [USER.501] + * WNetOpenJob16 [USER.501] */ int WINAPI WNetOpenJob(LPSTR szQueue,LPSTR szJobTitle,WORD nCopies,LPWORD pfh) { @@ -120,8 +229,15 @@ int WINAPI WNetUnlockQueueData(LPSTR szQueue) return WN_NET_ERROR; } -/************************************************************************** - * WNetGetConnection [USER.512] + +/******************************************************************** + * WNetGetConnection16 [USER.512] reverse-resolves a local device + * + * RETURNS + * - WN_BAD_LOCALNAME lpLocalName makes no sense + * - WN_NOT_CONNECTED drive is a local drive + * - WN_MORE_DATA buffer isn't big enough + * - WN_SUCCESS success (net path in buffer) */ int WINAPI WNetGetConnection16(LPCSTR lpLocalName, LPSTR lpRemoteName, UINT16 *cbRemoteName) @@ -154,6 +270,19 @@ int WINAPI WNetGetConnection16(LPCSTR lpLocalName, return WN_BAD_LOCALNAME; } +/************************************************************************** + * WNetGetConnectionA [MPR.70] + */ +DWORD WINAPI +WNetGetConnection32A(LPCSTR localname,LPSTR remotename,LPDWORD buflen) +{ + UINT16 x; + DWORD ret = WNetGetConnection16(localname,remotename,&x); + *buflen = x; + return ret; +} + + /************************************************************************** * WNetGetCaps [USER.513] */ @@ -254,27 +383,6 @@ UINT16 WINAPI WNetGetUser(LPSTR lpLocalName, LPSTR lpUserName, DWORD *lpSize) return WN_NO_NETWORK; } -/************************************************************************** - * WNetAddConnection [USER.517] - */ -UINT16 WINAPI WNetAddConnection(LPSTR lpNetPath, LPSTR lpPassWord, - LPSTR lpLocalName) -{ - FIXME(wnet, "('%s', %p, '%s'): stub\n", - lpNetPath,lpPassWord,lpLocalName); - return WN_NO_NETWORK; -} - - -/************************************************************************** - * WNetCancelConnection [USER.518] - */ -UINT16 WINAPI WNetCancelConnection(LPSTR lpName, BOOL16 bForce) -{ - FIXME(wnet, "('%s', %04X): stub\n", lpName, bForce); - return WN_NO_NETWORK; -} - /************************************************************************** * WNetGetError [USER.519] */ @@ -311,8 +419,8 @@ int WINAPI WNetWriteJob(HANDLE16 hJob,void *lpData,LPWORD lpcbData) return WN_NO_NETWORK; } -/************************************************************************** - * WnetConnectDialog [USER.525] +/******************************************************************** + * WNetConnectDialog [USER.525] */ UINT16 WINAPI WNetConnectDialog(HWND16 hWndParent, WORD iType) { @@ -338,6 +446,8 @@ UINT16 WINAPI WNetConnectionDialog(HWND16 hWndParent, WORD iType) return WN_SUCCESS; } + + /************************************************************************** * WNetViewQueueDialog [USER.528] */ @@ -358,15 +468,30 @@ int WINAPI WNetPropertyDialog(HWND16 hwndParent,WORD iButton, return WN_NO_NETWORK; } -/************************************************************************** - * WNetGetDirectoryType [USER.530] +/********************************************************************* + * WNetGetDirectoryType [USER.530] Decides whether resource is local + * + * RETURNS + * on success, puts one of the following in *lpType: + * - WNDT_NETWORK on a network + * - WNDT_LOCAL local */ -int WINAPI WNetGetDirectoryType(LPSTR lpName,void *lpType) +int WINAPI WNetGetDirectoryType16(LPSTR lpName, LPINT16 lpType) { FIXME(wnet, "('%s',%p): stub\n",lpName,lpType); + *lpType = 0; return WN_NO_NETWORK; } +/***************************************************************** + * WNetGetDirectoryTypeA [MPR.109] + */ + +UINT32 WINAPI WNetGetDirectoryType32A(LPSTR lpName,void *lpType) +{ + return WNetGetDirectoryType16(lpName, lpType); +} + /************************************************************************** * WNetDirectoryNotify [USER.531] */ @@ -387,16 +512,6 @@ int WINAPI WNetGetPropertyText(HWND16 hwndParent,WORD iButton,WORD nPropSel, return WN_NO_NETWORK; } -/************************************************************************** - * WNetAddConnection2 [USER.???] - */ -UINT16 WINAPI WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord, - LPSTR lpLocalName, LPSTR lpUserName) -{ - FIXME(wnet, "('%s', %p, '%s', '%s'): stub\n", - lpNetPath, lpPassWord, lpLocalName, lpUserName); - return WN_NO_NETWORK; -} /************************************************************************** * WNetCloseEnum [USER.???] @@ -440,17 +555,9 @@ UINT32 WINAPI WNetOpenEnum32A(DWORD dwScope, DWORD dwType, return WN_NO_NETWORK; } -/************************************************************************** - * WNetGetConnectionA [MPR.92] - */ -DWORD WINAPI -WNetGetConnection32A(LPCSTR localname,LPSTR remotename,LPDWORD buflen) -{ - UINT16 x; - DWORD ret = WNetGetConnection16(localname,remotename,&x); - *buflen = x; - return ret; -} +/* **************************************************************** + * WNetGetResourceInformationA [MPR.80] + * */ DWORD WINAPI WNetGetResourceInformation32A( @@ -459,3 +566,63 @@ WNetGetResourceInformation32A( FIXME(wnet,"(%p,%p,%p,%p): stub!\n",netres,buf,buflen,systemstr); return WN_NO_NETWORK; } + +/************************************************************************** + * WNetCachePassword [MPR.52] Saves password in cache + * + * RETURNS + * Success: WN_SUCCESS + * Failure: WNACCESS_DENIED, WN_BAD_PASSWORD, WN_BADVALUE, WN_NET_ERROR, + * WN_NOT_SUPPORTED, WN_OUT_OF_MEMORY + */ +DWORD WINAPI WNetCachePassword( + LPSTR pbResource, /* [in] Name of workgroup, computer, or resource */ + WORD cbResource, /* [in] Size of name */ + LPSTR pbPassword, /* [in] Buffer containing password */ + WORD cbPassword, /* [in] Size of password */ + BYTE nType) /* [in] Type of password to cache */ +{ + FIXME(mpr,"(%s,%d,%s,%d,%d): stub\n", pbResource,cbResource, + pbPassword,cbPassword,nType); + return WN_SUCCESS; +} + + + +/***************************************************************** + * WNetGetCachedPassword [MPR.69] Retrieves password from cache + * + * RETURNS + * Success: WN_SUCCESS + * Failure: WNACCESS_DENIED, WN_BAD_PASSWORD, WN_BAD_VALUE, + * WN_NET_ERROR, WN_NOT_SUPPORTED, WN_OUT_OF_MEMORY + */ +DWORD WINAPI WNetGetCachedPassword( + LPSTR pbResource, /* [in] Name of workgroup, computer, or resource */ + WORD cbResource, /* [in] Size of name */ + LPSTR pbPassword, /* [out] Buffer to receive password */ + LPWORD pcbPassword, /* [out] Receives size of password */ + BYTE nType) /* [in] Type of password to retrieve */ +{ + FIXME(mpr,"(%s,%d,%p,%d,%d): stub\n", + pbResource,cbResource,pbPassword,*pcbPassword,nType); + return WN_ACCESS_DENIED; +} + +/* **************************************************************** + * MultinetGetConnectionPerformanceA [MPR.25] + * + * RETURNS + * Success: NO_ERROR + * Failure: ERROR_NOT_SUPPORTED, ERROR_NOT_CONNECTED, + * ERROR_NO_NET_OR_BAD_PATH, ERROR_BAD_DEVICE, + * ERROR_BAD_NET_NAME, ERROR_INVALID_PARAMETER, + * ERROR_NO_NETWORK, ERROR_EXTENDED_ERROR + */ +DWORD WINAPI MultinetGetConnectionPerformance32A( + LPNETRESOURCE32A lpNetResource, + LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct +) { + FIXME(mpr,"(%p,%p): stub\n",lpNetResource,lpNetConnectInfoStruct); + return 1; +} diff --git a/misc/ntdll.c b/misc/ntdll.c index e52e201509f..7744f954472 100644 --- a/misc/ntdll.c +++ b/misc/ntdll.c @@ -36,8 +36,11 @@ DWORD WINAPI RtlLengthSid(LPSID sid) /************************************************************************** * RtlCreateAcl [NTDLL] + * + * NOTES + * This should return NTSTATUS */ -DWORD /* NTSTATUS */ WINAPI RtlCreateAcl(LPACL acl,DWORD size,DWORD rev) +DWORD WINAPI RtlCreateAcl(LPACL acl,DWORD size,DWORD rev) { if (rev!=ACL_REVISION) return STATUS_INVALID_PARAMETER; diff --git a/misc/printdrv.c b/misc/printdrv.c index 2466010e141..7389ed3c8c1 100644 --- a/misc/printdrv.c +++ b/misc/printdrv.c @@ -39,16 +39,16 @@ DWORD WINAPI DrvGetPrinterData(LPSTR lpPrinter, LPSTR lpProfile, LPDWORD lpType, LPBYTE lpPrinterData, int cbData, LPDWORD lpNeeded) { - fprintf(stderr,"In DrvGetPrinterData "); + FIXME(print, "stub.\n"); if (HIWORD(lpPrinter)) - fprintf(stderr,"printer %s ",lpPrinter); + TRACE(print,"printer %s\n",lpPrinter); else - fprintf(stderr,"printer %p ",lpPrinter); + TRACE(print,"printer %p\n",lpPrinter); if (HIWORD(lpProfile)) - fprintf(stderr,"profile %s ",lpProfile); + TRACE(print,"profile %s\n",lpProfile); else - fprintf(stderr,"profile %p ",lpProfile); - fprintf(stderr,"lpType %p\n",lpType); + TRACE(print,"profile %p\n",lpProfile); + TRACE(print,"lpType %p\n",lpType); return 0; } @@ -58,16 +58,16 @@ DWORD WINAPI DrvSetPrinterData(LPSTR lpPrinter, LPSTR lpProfile, LPDWORD lpType, LPBYTE lpPrinterData, DWORD dwSize) { - fprintf(stderr,"In DrvSetPrinterData "); + FIXME(print, "stub.\n"); if (HIWORD(lpPrinter)) - fprintf(stderr,"printer %s ",lpPrinter); + TRACE(print,"printer %s\n",lpPrinter); else - fprintf(stderr,"printer %p ",lpPrinter); + TRACE(print,"printer %p\n",lpPrinter); if (HIWORD(lpProfile)) - fprintf(stderr,"profile %s ",lpProfile); + TRACE(print,"profile %s\n",lpProfile); else - fprintf(stderr,"profile %p ",lpProfile); - fprintf(stderr,"lpType %p\n",lpType); + TRACE(print,"profile %p\n",lpProfile); + TRACE(print,"lpType %p\n",lpType); return 0; } @@ -75,7 +75,7 @@ DWORD WINAPI DrvSetPrinterData(LPSTR lpPrinter, LPSTR lpProfile, INT32 WINAPI DeviceCapabilities32A(LPCSTR printer,LPCSTR target,WORD z, LPSTR a,LPDEVMODE32A b) { - fprintf(stderr,"DeviceCapabilitiesA(%s,%s,%d,%p,%p)\n",printer,target,z,a,b); + FIXME(print,"(%s,%s,%d,%p,%p):stub.\n",printer,target,z,a,b); return 1; } @@ -83,7 +83,7 @@ LONG WINAPI DocumentProperties32A(HWND32 hWnd,HANDLE32 hPrinter, LPSTR pDeviceName, LPDEVMODE32A pDevModeOutput, LPDEVMODE32A pDevModeInput,DWORD fMode ) { - fprintf(stderr,"DocumentPropertiesA(%d,%d,%s,%p,%p,%ld)\n", + FIXME(print,"(%d,%d,%s,%p,%p,%ld):stub.\n", hWnd,hPrinter,pDeviceName,pDevModeOutput,pDevModeInput,fMode ); return 1; @@ -92,7 +92,7 @@ LONG WINAPI DocumentProperties32A(HWND32 hWnd,HANDLE32 hPrinter, BOOL32 WINAPI OpenPrinter32A(LPSTR lpPrinterName,HANDLE32 *phPrinter, LPPRINTER_DEFAULTS32A pDefault) { - fprintf(stderr,"OpenPrinter32A(%s,%p,%p), stub\n", + FIXME(print,"(%s,%p,%p):stub.\n", lpPrinterName, phPrinter, pDefault); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; @@ -102,7 +102,7 @@ BOOL32 WINAPI EnumPrinters32A(DWORD dwType, LPSTR lpszName, DWORD cbBuf, LPDWORD lpdwNeeded, LPDWORD lpdwReturned) { - fprintf(stderr,"EnumPrinters32A nearly empty stub\n"); + FIXME(print,"Nearly empty stub\n"); *lpdwReturned=0; return TRUE; } diff --git a/misc/registry.c b/misc/registry.c index b73c7f57dd5..537c4edce98 100644 --- a/misc/registry.c +++ b/misc/registry.c @@ -250,7 +250,7 @@ SHELL_Init() { ADD_ROOT_KEY(key_local_machine); if (RegCreateKey16(HKEY_LOCAL_MACHINE,"\\SOFTWARE\\Classes",&cl_r_hkey)!=ERROR_SUCCESS) { - fprintf(stderr,"couldn't create HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes. This is impossible.\n"); + ERR(reg,"couldn't create HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes. This is impossible.\n"); exit(1); } key_classes_root = lookup_hkey(cl_r_hkey); @@ -439,7 +439,7 @@ _savereg(LPKEYSTRUCT lpkey,char *fn,int all) { F=fopen(fn,"w"); if (F==NULL) { - fprintf(stddeb,__FILE__":_savereg:Couldn't open %s for writing: %s\n", + WARN(reg,"Couldn't open %s for writing: %s\n", fn,strerror(errno) ); return FALSE; @@ -447,7 +447,7 @@ _savereg(LPKEYSTRUCT lpkey,char *fn,int all) { if (!_savesubreg(F,lpkey,all)) { fclose(F); unlink(fn); - fprintf(stddeb,__FILE__":_savereg:Failed to save keys, perhaps no more diskspace for %s?\n",fn); + WARN(reg,"Failed to save keys, perhaps no more diskspace for %s?\n",fn); return FALSE; } fclose(F); @@ -519,7 +519,7 @@ SHELL_SaveRegistry() { free(tmp); free(fn); } else - fprintf(stderr,"SHELL_SaveRegistry:failed to get homedirectory of UID %d.\n",getuid()); + WARN(reg,"Failed to get homedirectory of UID %d.\n",getuid()); } /************************ LOAD Registry Function ****************************/ @@ -669,7 +669,7 @@ _wine_read_USTRING(char *buf,LPWSTR *str) { continue; } if (*s!='u') { - fprintf(stderr,"_wine_read_USTRING:Non unicode escape sequence \\%c found in |%s|\n",*s,buf); + WARN(reg,"Non unicode escape sequence \\%c found in |%s|\n",*s,buf); *ws++='\\'; *ws++=*s++; } else { @@ -679,7 +679,7 @@ _wine_read_USTRING(char *buf,LPWSTR *str) { s++; memcpy(xbuf,s,4);xbuf[4]='\0'; if (!sscanf(xbuf,"%x",&wc)) - fprintf(stderr,"_wine_read_USTRING:strange escape sequence %s found in |%s|\n",xbuf,buf); + WARN(reg,"Strange escape sequence %s found in |%s|\n",xbuf,buf); s+=4; *ws++ =(unsigned short)wc; } @@ -716,7 +716,7 @@ _wine_loadsubkey( } if (i>level) { if (lpxkey==NULL) { - fprintf(stderr,"_load_subkey:Got a subhierarchy without resp. key?\n"); + WARN(reg,"Got a subhierarchy without resp. key?\n"); return 0; } _wine_loadsubkey(F,lpxkey,level+1,buf,buflen,optflag); @@ -739,12 +739,12 @@ _wine_loadsubkey( int len,lastmodified,type; if (*s!='=') { - fprintf(stderr,"_wine_load_subkey:unexpected character: %c\n",*s); + WARN(reg,"Unexpected character: %c\n",*s); break; } s++; if (2!=sscanf(s,"%d,%d,",&type,&lastmodified)) { - fprintf(stderr,"_wine_load_subkey: haven't understood possible value in |%s|, skipping.\n",*buf); + WARN(reg,"Haven't understood possible value in |%s|, skipping.\n",*buf); break; } /* skip the 2 , */ @@ -764,16 +764,16 @@ _wine_loadsubkey( if (*s>='0' && *s<='9') data[i]=(*s-'0')<<4; if (*s>='a' && *s<='f') - data[i]=(*s-'a')<<4; + data[i]=(*s-'a'+'\xa')<<4; if (*s>='A' && *s<='F') - data[i]=(*s-'A')<<4; + data[i]=(*s-'A'+'\xa')<<4; s++; if (*s>='0' && *s<='9') data[i]|=*s-'0'; if (*s>='a' && *s<='f') - data[i]|=*s-'a'; + data[i]|=*s-'a'+'\xa'; if (*s>='A' && *s<='F') - data[i]|=*s-'A'; + data[i]|=*s-'A'+'\xa'; s++; } } @@ -1173,7 +1173,7 @@ _w95_loadreg(char* fn,LPKEYSTRUCT lpkey) { if (4!=_lread32(hfd,magic,4)) return; if (strcmp(magic,"CREG")) { - fprintf(stddeb,"%s is not a w95 registry.\n",fn); + WARN(reg,"%s is not a w95 registry.\n",fn); return; } if (4!=_lread32(hfd,&version,4)) @@ -1479,7 +1479,7 @@ SHELL_LoadRegistry() { _wine_loadreg(key_local_machine,fn,REG_OPTION_TAINTED); free(fn); } else - fprintf(stderr,"SHELL_LoadRegistry:failed to get homedirectory of UID %d.\n",getuid()); + WARN(reg,"Failed to get homedirectory of UID %d.\n",getuid()); if (ERROR_SUCCESS==RegCreateKey16(HKEY_CURRENT_USER,KEY_REGISTRY,&hkey)) { DWORD junk,type,len; char data[5]; @@ -2266,7 +2266,7 @@ DWORD WINAPI RegSetValue32W( } else xhkey=hkey; if (dwType!=REG_SZ) { - fprintf(stddeb,"RegSetValueX called with dwType=%ld!\n",dwType); + TRACE(reg,"RegSetValueX called with dwType=%ld!\n",dwType); dwType=REG_SZ; } if (cbData!=2*lstrlen32W(lpszData)+2) { @@ -2799,13 +2799,25 @@ DWORD WINAPI RegDeleteValue16(HKEY hkey,LPSTR lpszValue) return RegDeleteValue32A(hkey,lpszValue); } -/* RegFlushKey [ADVAPI32.143] [KERNEL.227] */ -DWORD WINAPI RegFlushKey(HKEY hkey) + +/****************************************************************************** + * RegFlushKey [KERNEL.227] [ADVAPI32.143] + * Writes key to registry + * + * PARAMS + * hkey [I] Handle of key to write + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: Error code + */ +DWORD WINAPI RegFlushKey( HKEY hkey ) { - FIXME(reg, "(%x), STUB.\n", hkey); - return SHELL_ERROR_SUCCESS; + FIXME(reg, "(%x): stub\n", hkey); + return ERROR_SUCCESS; } + /* FIXME: lpcchXXXX ... is this counting in WCHARS or in BYTEs ?? */ /* RegQueryInfoKeyW [ADVAPI32.153] */ @@ -2940,8 +2952,29 @@ DWORD WINAPI RegQueryInfoKey32A( /* RegConnectRegistryA [ADVAPI32.127] */ DWORD WINAPI RegConnectRegistry32A(LPCSTR machine,HKEY hkey,LPHKEY reskey) { - fprintf(stderr,"RegConnectRegistry32A(%s,%08x,%p), STUB.\n", - machine,hkey,reskey - ); + FIXME(reg,"(%s,%08x,%p):stub.\n",machine,hkey,reskey); return ERROR_FILE_NOT_FOUND; /* FIXME */ } + + +/****************************************************************************** + * RegGetKeySecurity [ADVAPI32.144] + * Retrieves a copy of security descriptor protecting the registry key + * + * NOTES + * pSecurityDescriptor should be PSECURITY_DESCRIPTOR + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: Error code + */ +LONG WINAPI RegGetKeySecurity( HKEY hKey, + SECURITY_INFORMATION SecurityInformation, + LPVOID pSecurityDescriptor, + LPDWORD lpcbSecurityDescriptor ) +{ + FIXME(reg, "(%d,%ld,%p,%p): stub\n", hKey, SecurityInformation, + pSecurityDescriptor, lpcbSecurityDescriptor); + return ERROR_SUCCESS; +} + diff --git a/misc/shellord.c b/misc/shellord.c index 8cbfa400146..a21ab8ae9d2 100644 --- a/misc/shellord.c +++ b/misc/shellord.c @@ -34,7 +34,7 @@ * SHELL32_2 [SHELL32.2] */ DWORD WINAPI SHELL32_2(HWND32 hwnd,DWORD x2,DWORD x3,DWORD x4,DWORD x5,DWORD x6) { - fprintf(stderr,"SHELL32_2(0x%04x,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx),stub!\n", + FIXME(shell,"(0x%04x,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx):stub.\n", hwnd,x2,x3,x4,x5,x6 ); return 0; @@ -286,7 +286,7 @@ VOID WINAPI SHELL32_56(LPSTR str) { * SHELL32_58 [SHELL32.58] */ DWORD WINAPI SHELL32_58(LPCSTR src,DWORD x2,LPSTR target,DWORD pathlen) { - fprintf(stderr,"SHELL32_58(%s,0x%08lx,%p,%ld),STUB!\n", + FIXME(shell,"(%s,0x%08lx,%p,%ld):stub.\n", src,x2,target,pathlen ); if (!src) @@ -298,7 +298,7 @@ DWORD WINAPI SHELL32_58(LPCSTR src,DWORD x2,LPSTR target,DWORD pathlen) { * SHELL32_62 [SHELL32.62] */ DWORD WINAPI SHELL32_62(DWORD x,DWORD y,DWORD z,DWORD a) { - fprintf(stderr,"SHELL32_62(%08lx,%08lx,%08lx,%08lx),stub!\n",x,y,z,a); + FIXME(shell,"(%08lx,%08lx,%08lx,%08lx):stub.\n",x,y,z,a); return 0xffffffff; } @@ -306,7 +306,7 @@ DWORD WINAPI SHELL32_62(DWORD x,DWORD y,DWORD z,DWORD a) { * SHELL32_63 [SHELL32.63] */ DWORD WINAPI SHELL32_63(HWND32 howner, LPSTR targetbuf, DWORD len, DWORD x, LPCSTR suffix, LPCSTR y, LPCSTR cmd) { - fprintf(stderr,"SHELL32_63(%04x,%p,%ld,%08lx,%s,%s,%s),stub!\n", + FIXME(shell,"(%04x,%p,%ld,%08lx,%s,%s,%s):stub.\n", howner,targetbuf,len,x,suffix,y,cmd ); /* puts up a Open Dialog and requests input into targetbuf */ @@ -319,7 +319,7 @@ DWORD WINAPI SHELL32_63(HWND32 howner, LPSTR targetbuf, DWORD len, DWORD x, LPCS * SHELL32_68 [SHELL32.68] */ DWORD WINAPI SHELL32_68(DWORD x,DWORD y,DWORD z) { - fprintf(stderr,"SHELL32_68(0x%08lx,0x%08lx,0x%08lx),stub!\n", + FIXME(shell,"(0x%08lx,0x%08lx,0x%08lx):stub.\n", x,y,z ); return 0; @@ -330,7 +330,7 @@ DWORD WINAPI SHELL32_68(DWORD x,DWORD y,DWORD z) { */ BOOL32 WINAPI SHELL32_71(LPDWORD x,LPDWORD y) { - fprintf(stderr,"SHELL32_71(%p,%p),stub!\n",x,y); + FIXME(shell,"(%p,%p):stub.\n",x,y); return TRUE; } @@ -339,14 +339,14 @@ BOOL32 WINAPI SHELL32_71(LPDWORD x,LPDWORD y) { * dunno. something with icons */ void WINAPI SHELL32_72(LPSTR x,DWORD y,DWORD z) { - fprintf(stderr,"SHELL32_72(%s,%08lx,%08lx),stub!\n",x,y,z); + FIXME(shell,"(%s,%08lx,%08lx):stub.\n",x,y,z); } /************************************************************************* * SHELL32_89 [SHELL32.89] */ DWORD WINAPI SHELL32_89(DWORD x1,DWORD x2,DWORD x3) { - fprintf(stderr,"SHELL32_89(0x%08lx,0x%08lx,0x%08lx),stub!\n", + FIXME(shell,"(0x%08lx,0x%08lx,0x%08lx):stub.\n", x1,x2,x3 ); return 0; @@ -357,7 +357,7 @@ DWORD WINAPI SHELL32_89(DWORD x1,DWORD x2,DWORD x3) { * unknown */ void WINAPI SHELL32_119(LPVOID x) { - fprintf(stderr,"SHELL32_119(%p(%s)),stub\n",x,(char *)x); + FIXME(shell,"(%p(%s)):stub.\n",x,(char *)x); } /************************************************************************* @@ -365,7 +365,7 @@ void WINAPI SHELL32_119(LPVOID x) { * unknown */ void WINAPI SHELL32_175(DWORD x1,DWORD x2,DWORD x3,DWORD x4) { - fprintf(stderr,"SHELL32_175(0x%08lx,0x%08lx,0x%08lx,0x%08lx),stub\n", + FIXME(shell,"(0x%08lx,0x%08lx,0x%08lx,0x%08lx):stub.\n", x1,x2,x3,x4 ); } @@ -375,7 +375,7 @@ void WINAPI SHELL32_175(DWORD x1,DWORD x2,DWORD x3,DWORD x4) { * unknown */ void WINAPI SHELL32_181(DWORD x,DWORD y) { - fprintf(stderr,"SHELL32_181(0x%08lx,0x%08lx)\n",x,y); + FIXME(shell,"(0x%08lx,0x%08lx):stub.\n",x,y); } /************************************************************************* @@ -383,7 +383,7 @@ void WINAPI SHELL32_181(DWORD x,DWORD y) { * unknown */ BOOL32 WINAPI SHELL32_75(LPDWORD x,LPDWORD y) { - fprintf(stderr,"SHELL32_75(%p,%p),stub\n",x,y); + FIXME(shell,"(%p,%p):stub.\n",x,y); return TRUE; } @@ -391,7 +391,7 @@ BOOL32 WINAPI SHELL32_75(LPDWORD x,LPDWORD y) { * SHELL32_77 [SHELL32.77] */ DWORD WINAPI SHELL32_77(DWORD x,DWORD y,DWORD z) { - fprintf(stderr,"SHELL32_77(%08lx,%08lx,%08lx),stub!\n",x,y,z); + FIXME(shell,"(%08lx,%08lx,%08lx):stub.\n",x,y,z); return 0; } @@ -400,20 +400,24 @@ DWORD WINAPI SHELL32_77(DWORD x,DWORD y,DWORD z) { * create_directory_and_notify(...) */ DWORD WINAPI SHELL32_79(LPCSTR dir,LPVOID xvoid) { - fprintf(stderr,"mkdir %s,%p\n",dir,xvoid); + TRACE(shell,"mkdir %s,%p\n",dir,xvoid); if (!CreateDirectory32A(dir,xvoid)) return FALSE; /* SHChangeNotify(8,1,dir,0); */ return TRUE; } -static FARPROC32 _find_moduleproc(LPSTR dllname,HMODULE32 *xhmod,LPSTR name) { +typedef DWORD (* WINAPI GetClassPtr)(REFCLSID,REFIID,LPVOID); + +static GetClassPtr SH_find_moduleproc(LPSTR dllname,HMODULE32 *xhmod, + LPSTR name) +{ HMODULE32 hmod; FARPROC32 dllunload,nameproc; if (xhmod) *xhmod = 0; if (!lstrcmpi32A(SHELL32_34(dllname),"shell32.dll")) - return (FARPROC32)SHELL32_DllGetClassObject; + return (GetClassPtr)SHELL32_DllGetClassObject; hmod = LoadLibraryEx32A(dllname,0,LOAD_WITH_ALTERED_SEARCH_PATH); if (!hmod) @@ -427,17 +431,17 @@ static FARPROC32 _find_moduleproc(LPSTR dllname,HMODULE32 *xhmod,LPSTR name) { return NULL; } /* register unloadable dll with unloadproc ... */ - return nameproc; + return (GetClassPtr)nameproc; } -static DWORD _get_instance(REFCLSID clsid,LPSTR dllname, +static DWORD SH_get_instance(REFCLSID clsid,LPSTR dllname, LPVOID unknownouter,REFIID refiid,LPVOID inst ) { - DWORD WINAPI (*dllgetclassob)(REFCLSID,REFIID,LPVOID); + GetClassPtr dllgetclassob; DWORD hres; LPCLASSFACTORY classfac; - dllgetclassob = (DWORD(*)(REFCLSID,REFIID,LPVOID))_find_moduleproc(dllname,NULL,"DllGetClassObject"); + dllgetclassob = SH_find_moduleproc(dllname,NULL,"DllGetClassObject"); if (!dllgetclassob) return 0x80070000|GetLastError(); @@ -455,6 +459,7 @@ static DWORD _get_instance(REFCLSID clsid,LPSTR dllname, classfac->lpvtbl->fnRelease(classfac); return 0; } + /************************************************************************* * SHELL32_102 [SHELL32.102] * unknown @@ -476,29 +481,29 @@ LRESULT WINAPI SHELL32_102( return 0x80040154; strcpy(xclsid,aclsid); } - fprintf(stderr,"SHELL32_102(%p,%s,%p,%s,%p)\n", + TRACE(shell,"(%p,%s,%p,%s,%p)\n", aclsid,xclsid,unknownouter,xiid,inst ); sprintf(buffer,"CLSID\\%s\\InProcServer32",xclsid); if (RegOpenKeyEx32A(HKEY_CLASSES_ROOT,buffer,0,0x02000000,&inprockey)) - return _get_instance(clsid,"shell32.dll",unknownouter,refiid,inst); + return SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst); pathlen=sizeof(path); if (RegQueryValue32A(inprockey,NULL,path,&pathlen)) { RegCloseKey(inprockey); - return _get_instance(clsid,"shell32.dll",unknownouter,refiid,inst); + return SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst); } - fprintf(stderr," -> server dll is %s\n",path); + TRACE(shell, "Server dll is %s\n",path); tmodellen=sizeof(tmodel); type=REG_SZ; if (RegQueryValueEx32A(inprockey,"ThreadingModel",NULL,&type,tmodel,&tmodellen)) { RegCloseKey(inprockey); - return _get_instance(clsid,"shell32.dll",unknownouter,refiid,inst); + return SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst); } - fprintf(stderr," -> threading model is %s\n",tmodel); - hres=_get_instance(clsid,path,unknownouter,refiid,inst); + TRACE(shell, "Threading model is %s\n",tmodel); + hres=SH_get_instance(clsid,path,unknownouter,refiid,inst); if (hres<0) - hres=_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst); + hres=SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst); RegCloseKey(inprockey); return hres; } @@ -518,7 +523,7 @@ void __cdecl SHELL32_183(HMODULE32 hmod,HWND32 hwnd,DWORD id,DWORD x,DWORD type, /* FIXME: the varargs handling doesn't. */ FormatMessage32A(0x500,buf2,0,0,&buf3,256,&args); - fprintf(stderr,"SHELL32_183(%08lx,%08lx,%08lx(%s),%08lx(%s),%08lx,%p),stub!\n", + FIXME(shell,"(%08lx,%08lx,%08lx(%s),%08lx(%s),%08lx,%p):stub.\n", (DWORD)hmod,(DWORD)hwnd,id,buf2,x,buf,type,arglist ); /*MessageBox32A(hwnd,buf3,buf,id|0x10000);*/ @@ -553,7 +558,7 @@ void __cdecl SHELL32_183(HMODULE32 hmod,HWND32 hwnd,DWORD id,DWORD x,DWORD type, DWORD WINAPI SHELL32_100(DWORD pol) { HKEY xhkey; - fprintf(stderr,"SHELL32_100(%08lx),stub!\n",pol); + FIXME(shell,"(%08lx):stub.\n",pol); if (RegOpenKey32A(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies",&xhkey)) return 0; /* FIXME: do nothing for now, just return 0 (== "allowed") */ @@ -583,7 +588,7 @@ DWORD WINAPI SHELL32_152(LPITEMIDLIST iil) { * SHELL32_158 [SHELL32.158] */ LPSTR WINAPI SHELL32_158(LPSTR path,DWORD y,DWORD z) { - fprintf(stderr,"SHELL32_158(%s,%08lx,%08lx)\n",path,y,z); + TRACE(shell,"(%s,%08lx,%08lx)\n",path,y,z); path = SHELL32_31(path); return *path?(path+1):path; } @@ -595,7 +600,7 @@ LPSTR WINAPI SHELL32_158(LPSTR path,DWORD y,DWORD z) { DWORD WINAPI SHELL32_165(DWORD x,LPCSTR path) { if (SHELL32_79(path,(LPVOID)x)) return 0; - fprintf(stderr,"SHELL32_165(%08lx,%s),stub!\n",x,path); + FIXME(shell,"(%08lx,%s):stub.\n",x,path); return 0; } @@ -654,3 +659,4 @@ DWORD WINAPI SHELL32_155(LPVOID x) { return 0; return SHELL32_195(x); } + diff --git a/misc/system.c b/misc/system.c index 65646bc58d5..99fbcfb4c24 100644 --- a/misc/system.c +++ b/misc/system.c @@ -16,6 +16,7 @@ #include "callback.h" #include "windows.h" #include "miscemu.h" +#include "debug.h" typedef struct { @@ -115,10 +116,10 @@ DWORD WINAPI InquireSystem( WORD code, WORD arg ) return MAKELONG( drivetype, drivetype ); case 2: /* Enable one-drive logic */ - fprintf( stderr, "InquireSystem(2): set single-drive %d not supported\n", arg ); + FIXME(system, "Case %d: set single-drive %d not supported\n", code, arg ); return 0; } - fprintf( stderr, "InquireSystem: unknown code %d\n", code ); + WARN(system, "Unknown code %d\n", code ); return 0; } diff --git a/misc/ver.c b/misc/ver.c index da9f8e54d70..851b37b59d1 100644 --- a/misc/ver.c +++ b/misc/ver.c @@ -297,7 +297,7 @@ static int read_xx_header(HFILE32 lzfd) { if (magic[0] == 'P' && magic[1] == 'E') return IMAGE_NT_SIGNATURE; magic[2]='\0'; - fprintf(stderr,"misc/ver.c:read_ne_header:can't handle %s files.\n",magic); + WARN(ver,"Can't handle %s files.\n",magic); return 0; } @@ -447,7 +447,7 @@ find_pe_resource( resdir = pehd.OptionalHeader.DataDirectory[IMAGE_FILE_RESOURCE_DIRECTORY]; TRACE(ver,"(.,%p,%p,....)\n",typeid,resid); if (!resdir.Size) { - fprintf(stderr,"misc/ver.c:find_pe_resource() no resource directory found in PE file.\n"); + WARN(ver,"No resource directory found in PE file.\n"); return 0; } imagesize = pehd.OptionalHeader.SizeOfImage; @@ -474,8 +474,10 @@ find_pe_resource( LZSeek32(lzfd,sections[i].PointerToRawData,SEEK_SET); if ( sections[i].SizeOfRawData!= LZRead32(lzfd,image+sections[i].VirtualAddress,sections[i].SizeOfRawData) - ) - continue; + ) { + HeapFree(GetProcessHeap(),0,image); + return 0; + } } resourcedir = (LPIMAGE_RESOURCE_DIRECTORY)(image+resdir.VirtualAddress); xresdir = GetResDirEntryW(resourcedir,typeid,(DWORD)resourcedir,FALSE); @@ -620,7 +622,7 @@ DWORD WINAPI GetFileVersionInfoSize16(LPCSTR filename,LPDWORD handle) isuni = 1; vffi = (VS_FIXEDFILEINFO*)(buf+0x28); } else { - fprintf(stderr,"vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n", + WARN(ver,"vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n", vffi->dwSignature,VS_FFI_SIGNATURE ); return 0; @@ -898,7 +900,6 @@ DWORD WINAPI VerInstallFile16( return ret; } -/* VerInstallFileA [VERSION.7] */ static LPBYTE _fetch_versioninfo(LPSTR fn,VS_FIXEDFILEINFO **vffi) { DWORD alloclen; @@ -922,7 +923,7 @@ _fetch_versioninfo(LPSTR fn,VS_FIXEDFILEINFO **vffi) { if ((*vffi)->dwSignature == 0x004f0049) /* hack to detect unicode */ *vffi = (VS_FIXEDFILEINFO*)(buf+0x28); if ((*vffi)->dwSignature != VS_FFI_SIGNATURE) - fprintf(stderr,"_fetch_versioninfo:bad VS_FIXEDFILEINFO signature 0x%08lx\n",(*vffi)->dwSignature); + WARN(ver,"Bad VS_FIXEDFILEINFO signature 0x%08lx\n",(*vffi)->dwSignature); return buf; } } @@ -940,9 +941,10 @@ _error2vif(DWORD error) { } } -/* VerInstallFile32A - */ +/****************************************************************************** + * VerInstallFile32A [VERSION.7] + */ DWORD WINAPI VerInstallFile32A( UINT32 flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir, LPCSTR destdir,LPCSTR curdir,LPSTR tmpfile,UINT32 *tmpfilelen ) @@ -954,7 +956,7 @@ DWORD WINAPI VerInstallFile32A( LPBYTE buf1,buf2; OFSTRUCT ofs; - fprintf(stddeb,"VerInstallFile(%x,%s,%s,%s,%s,%s,%p,%d)\n", + TRACE(ver,"(%x,%s,%s,%s,%s,%s,%p,%d)\n", flags,srcfilename,destfilename,srcdir,destdir,curdir,tmpfile,*tmpfilelen ); xret = 0; @@ -1106,6 +1108,7 @@ DWORD WINAPI VerInstallFile32A( return xret; } + /* VerInstallFileW [VERSION.8] */ DWORD WINAPI VerInstallFile32W( UINT32 flags,LPCWSTR srcfilename,LPCWSTR destfilename,LPCWSTR srcdir, @@ -1302,7 +1305,7 @@ DWORD WINAPI VerQueryValue16(SEGPTR segblock,LPCSTR subblock,SEGPTR *buffer, b=_find_dataW(block,wstr,*(WORD*)block); HeapFree(GetProcessHeap(),0,wstr); if (!b) { - fprintf(stderr,"key %s not found in versionresource.\n",s); + WARN(ver,"key %s not found in versionresource.\n",s); *buflen=0; free (s); return 0; @@ -1320,7 +1323,7 @@ DWORD WINAPI VerQueryValue16(SEGPTR segblock,LPCSTR subblock,SEGPTR *buffer, struct dbA *db; b=_find_dataA(block,s,*(WORD*)block); if (!b) { - fprintf(stderr,"key %s not found in versionresource.\n",s); + WARN(ver,"key %s not found in versionresource.\n",s); *buflen=0; free (s); return 0; @@ -1364,7 +1367,7 @@ DWORD WINAPI VerQueryValue32A(LPVOID vblock,LPCSTR subblock, b=_find_dataW(block,wstr,*(WORD*)block); HeapFree(GetProcessHeap(),0,wstr); if (!b) { - fprintf(stderr,"key %s not found in versionresource.\n",s); + WARN(ver,"key %s not found in versionresource.\n",s); *buflen=0; free (s); return 0; @@ -1384,7 +1387,7 @@ DWORD WINAPI VerQueryValue32A(LPVOID vblock,LPCSTR subblock, struct dbA *db; b=_find_dataA(block,s,*(WORD*)block); if (!b) { - fprintf(stderr,"key %s not found in versionresource.\n",subblock); + WARN(ver,"key %s not found in versionresource.\n",subblock); *buflen=0; free (s); return 0; diff --git a/misc/w32skrnl.c b/misc/w32skrnl.c index f05cc9960e6..df9d65aa61d 100644 --- a/misc/w32skrnl.c +++ b/misc/w32skrnl.c @@ -12,10 +12,10 @@ LPSTR WINAPI GetWin32sDirectory(void) { - static char *sysdir; + static char sysdir[0x80]; LPSTR text; - sysdir = getenv("winsysdir"); + GetEnvironmentVariable32A("winsysdir", sysdir, 0x80); if (!sysdir) return NULL; strcat(sysdir, "\\WIN32S"); text = HeapAlloc(GetProcessHeap(), 0, strlen(sysdir)+1); diff --git a/misc/win32s16.c b/misc/win32s16.c index d602aefcb38..fde1b28fed1 100644 --- a/misc/win32s16.c +++ b/misc/win32s16.c @@ -6,13 +6,14 @@ */ #include "windows.h" +#include "debug.h" #include #include #include void BootTask() { - fprintf(stderr, "BootTask(): should only be used by WIN32S.EXE.\n"); + MSG("BootTask(): should only be used by WIN32S.EXE.\n"); } /*********************************************************************** @@ -22,6 +23,6 @@ void BootTask() */ SEGPTR WINAPI StackLinearToSegmented(WORD w1, WORD w2) { - fprintf(stderr, "StackLinearToSegmented(), stub !\n"); + FIXME(dll,"(%d,%d):stub.\n",w1,w2); return (SEGPTR)NULL; } diff --git a/misc/windebug.c b/misc/windebug.c index 9e54dfcda8e..5e74cf46c6b 100644 --- a/misc/windebug.c +++ b/misc/windebug.c @@ -9,6 +9,7 @@ #include #include "windows.h" #include "module.h" +#include "debug.h" /*********************************************************************** * WinNotify (WINDEBUG.3) @@ -16,7 +17,7 @@ */ void WinNotify(CONTEXT *context) { - fprintf(stderr, "WinNotify(AX=%04x): stub !\n", AX_reg(context)); + FIXME(dll, "(AX=%04x):stub.\n", AX_reg(context)); switch (AX_reg(context)) { case 0x000D: diff --git a/misc/winsock.c b/misc/winsock.c index 79a7a105bce..505adfdd78e 100644 --- a/misc/winsock.c +++ b/misc/winsock.c @@ -57,7 +57,7 @@ #define DEBUG_SOCKADDR 0 #define dump_sockaddr(a) \ - fprintf(stderr, "sockaddr_in: family %d, address %s, port %d\n", \ + DUMP("sockaddr_in: family %d, address %s, port %d\n", \ ((struct sockaddr_in *)a)->sin_family, \ inet_ntoa(((struct sockaddr_in *)a)->sin_addr), \ ntohs(((struct sockaddr_in *)a)->sin_port)) @@ -116,7 +116,7 @@ static void convert_sockopt(INT32 *level, INT32 *optname) for(i=0; _ws_sock_ops[i]; i++) if( _ws_sock_ops[i] == *optname ) break; if( _ws_sock_ops[i] ) *optname = _px_sock_ops[i]; - else fprintf(stderr, "convert_sockopt() unknown optname %d\n", *optname); + else WARN(winsock, "Unknown optname %d\n", *optname); break; case WS_IPPROTO_TCP: *optname = IPPROTO_TCP; @@ -136,7 +136,7 @@ static LPWSINFO wsi_find(HTASK16 hTask) LPWSINFO pwsi = _wsi_list; while( pwsi && pwsi->tid != hTask ) pwsi = pwsi->next; if( pwsi ) - fprintf(stderr,"loose wsi struct! pwsi=0x%08x, task=0x%04x\n", + WARN(winsock,"(pwsi=0x%08x,task=0x%04x):Loose wsi struct! \n", (unsigned)pwsi, hTask ); return pwsi; } @@ -326,7 +326,7 @@ INT16 WINAPI WSAStartup16(UINT16 wVersionRequested, LPWSADATA lpWSAData) _WSHeap = HeapCreate(HEAP_ZERO_MEMORY, 8120, 32768); if( !(_ws_stub = WS_ALLOC(0x10)) ) { - fprintf(stderr,"Fatal: failed to create WinSock heap\n"); + ERR(winsock,"Fatal: failed to create WinSock heap\n"); return 0; } } @@ -919,7 +919,7 @@ INT32 WINAPI WINSOCK_ioctlsocket32(SOCKET32 s, UINT32 cmd, UINT32 *argp) break; case WS_IOW('f',125,u_long): - fprintf(stderr,"Warning: WS1.1 shouldn't be using async I/O\n"); + WARN(winsock,"Warning: WS1.1 shouldn't be using async I/O\n"); pwsi->err = WSAEINVAL; return SOCKET_ERROR; @@ -1033,7 +1033,7 @@ INT32 WINAPI WINSOCK_recvfrom32(SOCKET32 s, char *buf, INT32 len, INT32 flags, len, flags); #if DEBUG_SOCKADDR if( from ) dump_sockaddr(from); - else fprintf(stderr, "\tfrom = NULL\n"); + else DUMP("from = NULL\n"); #endif if( _check_ws(pwsi, pws) ) @@ -1396,7 +1396,7 @@ SOCKET32 WINAPI WINSOCK_socket32(INT32 af, INT32 type, INT32 protocol) if (errno == EPERM) /* raw socket denied */ { - fprintf(stderr, "WS_SOCKET: not enough privileges\n"); + WARN(winsock, "WS_SOCKET: not enough privileges\n"); pwsi->err = WSAESOCKTNOSUPPORT; } else pwsi->err = wsaErrno(); } @@ -2648,7 +2648,7 @@ UINT16 wsaErrno(void) /* just in case we ever get here and there are no problems */ case 0: return 0; default: - fprintf(stderr, "winsock: unknown errno %d!\n", errno); + WARN(winsock, "Unknown errno %d!\n", errno); return WSAEOPNOTSUPP; } } @@ -2673,7 +2673,7 @@ UINT16 wsaHerrno(void) case 0: return 0; default: - fprintf(stderr, "winsock: unknown h_errno %d!\n", h_errno); + WARN(winsock,"Unknown h_errno %d!\n", h_errno); return WSAEOPNOTSUPP; } } diff --git a/misc/winsock_dns.c b/misc/winsock_dns.c index d01b8f7ed41..dc9b298b040 100644 --- a/misc/winsock_dns.c +++ b/misc/winsock_dns.c @@ -301,7 +301,7 @@ static int aop_control(ws_async_op* p_aop, int flag ) case WSMSG_ASYNC_SERVBYPORT: fixup_wsse((struct ws_servent*)buffer, p_aop->b.ptr_base); break; default: - if( p_aop->flags ) fprintf(stderr,"Received unknown async request!\n"); + if( p_aop->flags ) WARN(winsock,"Received unknown async request!\n"); return AOP_CONTROL_REMOVE; } } diff --git a/misc/wsprintf.c b/misc/wsprintf.c index 540dc4a5080..fcfd5894172 100644 --- a/misc/wsprintf.c +++ b/misc/wsprintf.c @@ -23,6 +23,7 @@ typedef enum { + WPR_UNKNOWN, WPR_CHAR, WPR_WCHAR, WPR_STRING, @@ -108,8 +109,9 @@ static INT32 WPRINTF_ParseFormatA( LPCSTR format, WPRINTF_FORMAT *res ) case 'x': res->type = WPR_HEXA; break; - default: - fprintf( stderr, "wvsprintf32A: unknown format '%c'\n", *p ); + default: /* unknown format char */ + res->type = WPR_UNKNOWN; + p--; /* print format as normal char */ break; } return (INT32)(p - format) + 1; @@ -180,7 +182,8 @@ static INT32 WPRINTF_ParseFormatW( LPCWSTR format, WPRINTF_FORMAT *res ) res->type = WPR_HEXA; break; default: - fprintf( stderr, "wvsprintf32W: unknown format '%c'\n", (CHAR)*p ); + res->type = WPR_UNKNOWN; + p--; /* print format as normal char */ break; } return (INT32)(p - format) + 1; @@ -282,6 +285,8 @@ INT16 WINAPI wvsnprintf16( LPSTR buffer, UINT16 maxlen, LPCSTR spec, else cur_arg = (DWORD)VA_ARG16( args, UINT16 ); break; + case WPR_UNKNOWN: + continue; } len = WPRINTF_GetLen( &format, &cur_arg, number, maxlen - 1 ); if (!(format.flags & WPRINTF_LEFTALIGN)) @@ -317,6 +322,8 @@ INT16 WINAPI wvsnprintf16( LPSTR buffer, UINT16 maxlen, LPCSTR spec, if (len) memcpy( p, number, len ); p += len; break; + case WPR_UNKNOWN: + continue; } if (format.flags & WPRINTF_LEFTALIGN) for (i = format.precision; i < format.width; i++, maxlen--) @@ -389,6 +396,8 @@ INT32 WINAPI wvsnprintf32A( LPSTR buffer, UINT32 maxlen, LPCSTR spec, p += len; (void)va_arg( args, INT32 ); /* Go to the next arg */ break; + case WPR_UNKNOWN: + continue; } if (format.flags & WPRINTF_LEFTALIGN) for (i = format.precision; i < format.width; i++, maxlen--) @@ -461,6 +470,8 @@ INT32 WINAPI wvsnprintf32W( LPWSTR buffer, UINT32 maxlen, LPCWSTR spec, for (i = 0; i < len; i++) *p++ = (WCHAR)number[i]; (void)va_arg( args, INT32 ); /* Go to the next arg */ break; + case WPR_UNKNOWN: + continue; } if (format.flags & WPRINTF_LEFTALIGN) for (i = format.precision; i < format.width; i++, maxlen--) diff --git a/misc/xmalloc.c b/misc/xmalloc.c index a228f71a5b5..8ff7b38416d 100644 --- a/misc/xmalloc.c +++ b/misc/xmalloc.c @@ -17,6 +17,7 @@ #include #include #include "xmalloc.h" +#include "debug.h" void *xmalloc( int size ) { @@ -25,7 +26,7 @@ void *xmalloc( int size ) res = malloc (size ? size : 1); if (res == NULL) { - fprintf (stderr, "Virtual memory exhausted.\n"); + MSG("Virtual memory exhausted.\n"); exit (1); } return res; @@ -37,7 +38,7 @@ void *xrealloc( void *ptr, int size ) void *res = realloc (ptr, size); if ((res == NULL) && size) { - fprintf (stderr, "Virtual memory exhausted.\n"); + MSG("Virtual memory exhausted.\n"); exit (1); } return res; @@ -49,7 +50,7 @@ char *xstrdup( const char *str ) char *res = strdup( str ); if (!res) { - fprintf (stderr, "Virtual memory exhausted.\n"); + MSG("Virtual memory exhausted.\n"); exit (1); } return res; diff --git a/miscemu/instr.c b/miscemu/instr.c index 46cd421bc0a..1b6570d58e1 100644 --- a/miscemu/instr.c +++ b/miscemu/instr.c @@ -9,14 +9,19 @@ #include "ldt.h" #include "miscemu.h" #include "sig_context.h" +#include "debug.h" #define STACK_sig(context) \ - ((GET_SEL_FLAGS(SS_sig(context)) & LDT_FLAGS_32BIT) ? \ - ESP_sig(context) : SP_sig(context)) + (IS_SELECTOR_32BIT(SS_sig(context)) ? ESP_sig(context) : SP_sig(context)) + +#define MAKE_PTR(seg,off) \ + (IS_SELECTOR_SYSTEM(seg) ? (void *)(off) : PTR_SEG_OFF_TO_LIN(seg,off)) #define STACK_PTR(context) \ - (PTR_SEG_OFF_TO_LIN(SS_sig(context),STACK_sig(context))) + (IS_SELECTOR_SYSTEM(SS_sig(context)) ? (void *)ESP_sig(context) : \ + (PTR_SEG_OFF_TO_LIN(SS_sig(context),STACK_sig(context)))) + /*********************************************************************** * INSTR_ReplaceSelector @@ -191,6 +196,7 @@ static BYTE *INSTR_GetOperandAddr( SIGCONTEXT *context, BYTE *instr, if (segprefix != -1) seg = segprefix; /* Make sure the segment and offset are valid */ + if (IS_SELECTOR_SYSTEM(seg)) return (BYTE *)(base + (index << ss)); if (((seg & 7) != 7) || IS_SELECTOR_FREE(seg)) return NULL; if (GET_SEL_LIMIT(seg) < (base + (index << ss))) return NULL; return (BYTE *)PTR_SEG_OFF_TO_LIN( seg, (base + (index << ss)) ); @@ -291,8 +297,8 @@ BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context ) int prefix, segprefix, prefixlen, len, repX, long_op, long_addr; BYTE *instr; - long_op = long_addr = (GET_SEL_FLAGS(CS_sig(context)) & LDT_FLAGS_32BIT) != 0; - instr = (BYTE *) PTR_SEG_OFF_TO_LIN( CS_sig(context), EIP_sig(context) ); + long_op = long_addr = IS_SELECTOR_32BIT(CS_sig(context)); + instr = (BYTE *)MAKE_PTR(CS_sig(context),EIP_sig(context)); /* First handle any possible prefix */ @@ -456,14 +462,14 @@ BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context ) void *data; if (outp) { - data = PTR_SEG_OFF_TO_LIN (seg, + data = MAKE_PTR(seg, long_addr ? ESI_sig(context) : SI_sig(context)); if (long_addr) ESI_sig(context) += step; else SI_sig(context) += step; } else { - data = PTR_SEG_OFF_TO_LIN (seg, + data = MAKE_PTR(seg, long_addr ? EDI_sig(context) : DI_sig(context)); if (long_addr) EDI_sig(context) += step; else DI_sig(context) += step; @@ -554,7 +560,7 @@ BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context ) case 0xcd: /* int */ if (long_op) { - fprintf(stderr, "int xx from 32-bit code is not supported.\n"); + ERR(int, "int xx from 32-bit code is not supported.\n"); break; /* Unable to emulate it */ } else @@ -643,7 +649,7 @@ BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context ) EIP_sig(context) += prefixlen + 1; return TRUE; } - fprintf(stderr, "Unexpected Windows program segfault" + MSG("Unexpected Windows program segfault" " - opcode = %x\n", *instr); return FALSE; /* Unable to emulate it */ } diff --git a/miscemu/main.c b/miscemu/main.c index 6110790a4dc..e7c6e9f1b16 100644 --- a/miscemu/main.c +++ b/miscemu/main.c @@ -10,6 +10,7 @@ #include "miscemu.h" #include "module.h" #include "options.h" +#include "debug.h" /*********************************************************************** @@ -72,7 +73,7 @@ int main( int argc, char *argv[] ) { if (!BUILTIN_ParseDLLOptions( Options.dllFlags )) { - fprintf( stderr, "%s: Syntax: -dll +xxx,... or -dll -xxx,...\n", + MSG("%s: Syntax: -dll +xxx,... or -dll -xxx,...\n", argv[0] ); BUILTIN_PrintDLLs(); exit(1); @@ -92,13 +93,13 @@ int main( int argc, char *argv[] ) { if ((handle = WinExec32( argv[i], SW_SHOWNORMAL )) < 32) { - fprintf(stderr, "wine: can't exec '%s': ", argv[i]); + MSG("wine: can't exec '%s': ", argv[i]); switch (handle) { - case 2: fprintf( stderr, "file not found\n" ); break; - case 11: fprintf( stderr, "invalid exe file\n" ); break; - case 21: fprintf( stderr, "win32 executable\n" ); break; - default: fprintf( stderr, "error=%d\n", handle ); break; + case 2: MSG("file not found\n" ); break; + case 11: MSG("invalid exe file\n" ); break; + case 21: MSG("win32 executable\n" ); break; /* FIXME: Obsolete? */ + default: MSG("error=%d\n", handle ); break; } return 1; } @@ -113,13 +114,13 @@ int main( int argc, char *argv[] ) if (!GetNumTasks()) { - fprintf( stderr, "wine: no executable file found.\n" ); + MSG("wine: no executable file found.\n" ); return 0; } if (Options.debug) DEBUG_AddModuleBreakpoints(); Yield16(); /* Start the first task */ - fprintf( stderr, "WinMain: Should never happen: returned from Yield()\n" ); + MSG("WinMain: Should never happen: returned from Yield16()\n" ); return 0; } diff --git a/msdos/dosmem.c b/msdos/dosmem.c index 4482cf9be6b..6048ec5a99d 100644 --- a/msdos/dosmem.c +++ b/msdos/dosmem.c @@ -208,7 +208,7 @@ BOOL32 DOSMEM_Init(void) PAGE_EXECUTE_READWRITE ); if (!DOSMEM_dosmem) { - fprintf( stderr, "Could not allocate DOS memory.\n" ); + WARN(dosmem, "Could not allocate DOS memory.\n" ); return FALSE; } DOSMEM_BiosSeg = GLOBAL_CreateBlock(GMEM_FIXED,DOSMEM_dosmem+0x400,0x100, @@ -219,26 +219,6 @@ BOOL32 DOSMEM_Init(void) return TRUE; } -void DOSMEM_InitExports(HMODULE16 hKernel) -{ -#define SET_ENTRY_POINT(num,addr) \ - MODULE_SetEntryPoint( hKernel, (num), GLOBAL_CreateBlock( GMEM_FIXED, \ - DOSMEM_dosmem+(addr), 0x10000, hKernel, \ - FALSE, FALSE, FALSE, NULL )) - - SET_ENTRY_POINT( 183, 0x00000 ); /* KERNEL.183: __0000H */ - SET_ENTRY_POINT( 174, 0xa0000 ); /* KERNEL.174: __A000H */ - SET_ENTRY_POINT( 181, 0xb0000 ); /* KERNEL.181: __B000H */ - SET_ENTRY_POINT( 182, 0xb8000 ); /* KERNEL.182: __B800H */ - SET_ENTRY_POINT( 195, 0xc0000 ); /* KERNEL.195: __C000H */ - SET_ENTRY_POINT( 179, 0xd0000 ); /* KERNEL.179: __D000H */ - SET_ENTRY_POINT( 190, 0xe0000 ); /* KERNEL.190: __E000H */ - SET_ENTRY_POINT( 173, 0xf0000 ); /* KERNEL.173: __ROMBIOS */ - SET_ENTRY_POINT( 194, 0xf0000 ); /* KERNEL.194: __F000H */ - MODULE_SetEntryPoint(hKernel, 193,DOSMEM_BiosSeg); /* KERNEL.193: __0040H */ - -#undef SET_ENTRY_POINT -} /*********************************************************************** * DOSMEM_Tick @@ -272,7 +252,7 @@ LPVOID DOSMEM_GetBlock(UINT32 size, UINT16* pseg) #ifdef __DOSMEM_DEBUG__ if( (dm->size & DM_BLOCK_DEBUG) != DM_BLOCK_DEBUG ) { - fprintf(stderr,"DOSMEM_GetBlock: MCB overrun! [prev = 0x%08x]\n", 4 + (UINT32)prev); + WARN(dosmem,"MCB overrun! [prev = 0x%08x]\n", 4 + (UINT32)prev); return NULL; } prev = dm; diff --git a/msdos/dpmi.c b/msdos/dpmi.c index 5aea15394c2..a4525921644 100644 --- a/msdos/dpmi.c +++ b/msdos/dpmi.c @@ -16,10 +16,14 @@ #include "msdos.h" #include "toolhelp.h" #include "debug.h" +#include "selectors.h" +#include "thread.h" +#include "stackframe.h" +#include "callback.h" #define DOS_GET_DRIVE(reg) ((reg) ? (reg) - 1 : DRIVE_GetCurrentDrive()) -void CreateBPB(int drive, BYTE *data); /* defined in int21.c */ +void CreateBPB(int drive, BYTE *data, BOOL16 limited); /* defined in int21.c */ /* Structure for real-mode callbacks */ @@ -46,6 +50,14 @@ typedef struct +typedef struct tagRMCB { + DWORD address; + struct tagRMCB *next; + +} RMCB; + +static RMCB *FirstRMCB = NULL; + /********************************************************************** * INT_GetRealModeContext */ @@ -189,7 +201,7 @@ static void INT_DoRealModeInt( CONTEXT *context ) setword(&dataptr[2], 0x02); /* removable */ setword(&dataptr[4], 80); /* # of cylinders */ } - CreateBPB(drive, &dataptr[7]); + CreateBPB(drive, &dataptr[7], FALSE); break; default: SET_CFLAG(context); @@ -223,6 +235,130 @@ static void INT_DoRealModeInt( CONTEXT *context ) } +static void CallRMProcFar( CONTEXT *context ) +{ + REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) ); + CONTEXT context16; + THDB *thdb = THREAD_Current(); + WORD argsize, sel; + LPVOID addr; + SEGPTR seg_addr; + + TRACE(int31, "RealModeCall: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n", + p->eax, p->ebx, p->ecx, p->edx); + TRACE(int31, " ESI=%08lx EDI=%08lx ES=%04x DS=%04x CS:IP=%04x:%04x, %d WORD arguments\n", + p->esi, p->edi, p->es, p->ds, p->cs, p->ip, CX_reg(context) ); + + if (!(p->cs) && !(p->ip)) { /* remove this check + if Int21/6501 case map function + has been implemented */ + SET_CFLAG(context); + return; + } + INT_GetRealModeContext(p, &context16); + + addr = DOSMEM_MapRealToLinear(MAKELONG(p->ip, p->cs)); + sel = SELECTOR_AllocBlock( addr, 0x10000, SEGMENT_CODE, FALSE, FALSE ); + seg_addr = PTR_SEG_OFF_TO_SEGPTR( sel, 0 ); + + CS_reg(&context16) = HIWORD(seg_addr); + IP_reg(&context16) = LOWORD(seg_addr); + EBP_reg(&context16) = OFFSETOF( thdb->cur_stack ) + + (WORD)&((STACK16FRAME*)0)->bp; + + argsize = CX_reg(context)*sizeof(WORD); + memcpy( ((LPBYTE)THREAD_STACK16(thdb))-argsize, + (LPBYTE)PTR_SEG_OFF_TO_LIN(SS_reg(context), SP_reg(context))+6, argsize ); + + Callbacks->CallRegisterShortProc(&context16, argsize); + + UnMapLS(seg_addr); + INT_SetRealModeContext(p, &context16); +} + + +void WINAPI RMCallbackProc( FARPROC16 pmProc, REALMODECALL *rmc ) +{ + CONTEXT ctx; + INT_GetRealModeContext(rmc, &ctx); + Callbacks->CallRegisterShortProc(&ctx, 0); +} + + +static void AllocRMCB( CONTEXT *context ) +{ + RMCB *NewRMCB = HeapAlloc(GetProcessHeap(), 0, sizeof(RMCB)); + REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) ); + UINT16 uParagraph; + + FIXME(int31, "EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n", p->eax, p->ebx, p->ecx, p->edx); + FIXME(int31, " ESI=%08lx EDI=%08lx ES=%04x DS=%04x CS:IP=%04x:%04x\n", p->esi, p->edi, p->es, p->ds, p->cs, p->ip); + FIXME(int31, " Function to call: %04x:%04x\n", + (WORD)DS_reg(context), SI_reg(context) ); + + if (NewRMCB) + { + LPVOID RMCBmem = DOSMEM_GetBlock(20, &uParagraph); + LPBYTE p = RMCBmem; + + *p++ = 0x68; /* pushl */ + *(FARPROC16 *)p = + PTR_SEG_OFF_TO_LIN(ES_reg(context), SI_reg(context)); /* pmode proc to call */ + p+=4; + *p++ = 0x68; /* pushl */ + *(LPVOID *)p = + PTR_SEG_OFF_TO_LIN(ES_reg(context), DI_reg(context)); + p+=4; + *p++ = 0x9a; /* lcall */ + *(FARPROC16 *)p = (FARPROC16)RMCallbackProc; /* FIXME ? */ + p+=4; + GET_CS(*(WORD *)p); + p+=2; + *p++=0xc3; /* retf */ + NewRMCB->address = MAKELONG(0, uParagraph); + NewRMCB->next = FirstRMCB; + FirstRMCB = NewRMCB; + CX_reg(context) = uParagraph; + DX_reg(context) = 0; + } + else + { + AX_reg(context) = 0x8015; /* callback unavailable */ + SET_CFLAG(context); + } +} + + +static void FreeRMCB( CONTEXT *context ) +{ + RMCB *CurrRMCB = FirstRMCB; + RMCB *PrevRMCB = NULL; + + FIXME(int31, "callback address: %04x:%04x\n", + CX_reg(context), DX_reg(context)); + + while (CurrRMCB && (CurrRMCB->address != MAKELONG(DX_reg(context), CX_reg(context)))) + { + PrevRMCB = CurrRMCB; + CurrRMCB = CurrRMCB->next; + } + if (CurrRMCB) + { + if (PrevRMCB) + PrevRMCB->next = CurrRMCB->next; + else + FirstRMCB = CurrRMCB->next; + DOSMEM_FreeBlock(DOSMEM_MapRealToLinear(CurrRMCB->address)); + HeapFree(GetProcessHeap(), 0, CurrRMCB); + } + else + { + AX_reg(context) = 0x8024; /* invalid callback address */ + SET_CFLAG(context); + } +} + + /********************************************************************** * INT_Int31Handler * @@ -280,7 +416,7 @@ void WINAPI INT_Int31Handler( CONTEXT *context ) break; } if (entryPoint) - AX_reg(context) = LOWORD(MODULE_GetEntryPoint( + AX_reg(context) = LOWORD(NE_GetEntryPoint( GetModuleHandle16( "KERNEL" ), entryPoint )); } @@ -382,15 +518,8 @@ void WINAPI INT_Int31Handler( CONTEXT *context ) break; case 0x0301: /* Call real mode procedure with far return */ - { - REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) ); - FIXME(int31, "RealModeCall: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n", - p->eax, p->ebx, p->ecx, p->edx); - FIXME(int31, " ESI=%08lx EDI=%08lx ES=%04x DS=%04x CS:IP=%04x:%04x\n", - p->esi, p->edi, p->es, p->ds, p->cs, p->ip ); - SET_CFLAG(context); - } - break; + CallRMProcFar( context ); + break; case 0x0302: /* Call real mode procedure with interrupt return */ { @@ -402,22 +531,11 @@ void WINAPI INT_Int31Handler( CONTEXT *context ) break; case 0x0303: /* Allocate Real Mode Callback Address */ - { - REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) ); - FIXME(int31, "AllocRMCB: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n", p->eax, p->ebx, p->ecx, p->edx); - FIXME(int31, " ESI=%08lx EDI=%08lx ES=%04x DS=%04x CS:IP=%04x:%04x\n", p->esi, p->edi, p->es, p->ds, p->cs, p->ip); - FIXME(int31, " Function to call: %04x:%04x\n", - (WORD)DS_reg(context), SI_reg(context) ); - SET_CFLAG(context); - } - break; + AllocRMCB( context ); + break; case 0x0304: /* Free Real Mode Callback Address */ - { - FIXME(int31, "FreeRMCB: callback address: %04x:%04x\n", - CX_reg(context), DX_reg(context)); - SET_CFLAG(context); - } + FreeRMCB( context ); break; case 0x0400: /* Get DPMI version */ diff --git a/msdos/int13.c b/msdos/int13.c index 761b2ad6d57..68719d2afec 100644 --- a/msdos/int13.c +++ b/msdos/int13.c @@ -67,7 +67,7 @@ void WINAPI INT_Int13Handler( CONTEXT *context ) if ( (floppy_fd = DRIVE_OpenDevice( drive_nr, O_NONBLOCK)) == -1) { - fprintf(stderr, "INT 0x13 (GET DRIVE PARAMETERS): can't determine floppy geometry !\n"); + WARN(int, "(GET DRIVE PARAMETERS): Can't determine floppy geometry !\n"); BX_reg(context) = 0; CX_reg(context) = 0; DH_reg(context) = 0; diff --git a/msdos/int21.c b/msdos/int21.c index 8a7c0a25082..5ccf18faf3a 100644 --- a/msdos/int21.c +++ b/msdos/int21.c @@ -83,7 +83,7 @@ static BOOL32 INT21_CreateHeap(void) { if (!(DosHeapHandle = GlobalAlloc16(GMEM_FIXED,sizeof(struct DosHeap)))) { - fprintf( stderr, "INT21_Init: Out of memory\n"); + WARN(int21, "Out of memory\n"); return FALSE; } heap = (struct DosHeap *) GlobalLock16(DosHeapHandle); @@ -100,7 +100,8 @@ static BYTE *GetCurrentDTA(void) } -void CreateBPB(int drive, BYTE *data) +void CreateBPB(int drive, BYTE *data, BOOL16 limited) +/* limited == TRUE is used with INT 0x21/0x440d */ { if (drive > 1) { setword(data, 512); @@ -114,9 +115,11 @@ void CreateBPB(int drive, BYTE *data) setword(&data[0x0d], 56); setword(&data[0x0f], 2); setword(&data[0x11], 0); - setword(&data[0x1f], 800); - data[0x21] = 5; - setword(&data[0x22], 1); + if (!limited) { + setword(&data[0x1f], 800); + data[0x21] = 5; + setword(&data[0x22], 1); + } } else { /* 1.44mb */ setword(data, 512); data[2] = 2; @@ -129,9 +132,11 @@ void CreateBPB(int drive, BYTE *data) setword(&data[0x0d], 18); setword(&data[0x0f], 2); setword(&data[0x11], 0); - setword(&data[0x1f], 80); - data[0x21] = 7; - setword(&data[0x22], 2); + if (!limited) { + setword(&data[0x1f], 80); + data[0x21] = 7; + setword(&data[0x22], 2); + } } } @@ -215,6 +220,8 @@ static void ioctlGetDeviceInfo( CONTEXT *context ) * bit 6 - file has NOT been written..FIXME: correct? * bit 8 - generate int24 if no diskspace on write/ read past end of file * bit 11 - media not removable + * bit 14 - don't set file date/time on closing + * bit 15 - file is remote */ RESET_CFLAG(context); } @@ -244,7 +251,7 @@ static BOOL32 ioctlGenericBlkDevReq( CONTEXT *context ) case 0x60: /* get device parameters */ /* used by w4wgrp's winfile */ - memset(dataptr, 0, 0x26); + memset(dataptr, 0, 0x20); /* DOS 6.22 uses 0x20 bytes */ dataptr[0] = 0x04; dataptr[6] = 0; /* media type */ if (drive > 1) @@ -259,7 +266,7 @@ static BOOL32 ioctlGenericBlkDevReq( CONTEXT *context ) setword(&dataptr[2], 0x02); /* removable */ setword(&dataptr[4], 80); /* # of cylinders */ } - CreateBPB(drive, &dataptr[7]); + CreateBPB(drive, &dataptr[7], TRUE); RESET_CFLAG(context); break; @@ -589,7 +596,7 @@ static int INT21_FindNext( CONTEXT *context ) } if ((int)dta->count + count > 0xffff) { - fprintf( stderr, "Too many directory entries in %s\n", dta->unixPath ); + WARN(int21, "Too many directory entries in %s\n", dta->unixPath ); HeapFree( GetProcessHeap(), 0, dta->unixPath ); dta->unixPath = NULL; return 0; @@ -1632,6 +1639,7 @@ void WINAPI DOS3Call( CONTEXT *context ) *(WORD*)(dataptr+1) = 41; *(WORD*)(dataptr+3) = WINE_LanguageId; *(WORD*)(dataptr+5) = CodePage; + *(DWORD*)(dataptr+0x19) = NULL; /* FIXME: ptr to case map routine */ break; case 0x06: TRACE(int21,"\tget pointer to collating sequence table\n"); diff --git a/msdos/int2f.c b/msdos/int2f.c index c2d25644c37..fb8cf67bfcd 100644 --- a/msdos/int2f.c +++ b/msdos/int2f.c @@ -133,14 +133,14 @@ static void do_int2f_16( CONTEXT *context ) break; case 0x84: /* Get device API entry point */ - addr = (DWORD)MODULE_GetEntryPoint( GetModuleHandle16("WPROCS"), - VXD_BASE + BX_reg(context) ); + addr = (DWORD)NE_GetEntryPoint( GetModuleHandle16("WPROCS"), + VXD_BASE + BX_reg(context) ); if (!addr) /* not supported */ { - fprintf( stderr,"Application attempted to access VxD %04x\n", + WARN(int,"Application attempted to access VxD %04x\n", BX_reg(context) ); - fprintf( stderr,"This device is not known to Wine."); - fprintf( stderr,"Expect a failure now\n"); + WARN(int,"This device is not known to Wine."); + WARN(int,"Expect a failure now\n"); } ES_reg(context) = SELECTOROF(addr); DI_reg(context) = OFFSETOF(addr); @@ -217,7 +217,7 @@ void do_mscdex( CONTEXT *context ) break; default: - fprintf(stderr, "Unimplemented MSCDEX function 0x%02.2X.\n", AL_reg(context)); + FIXME(int, "Unimplemented MSCDEX function 0x%02.2X.\n", AL_reg(context)); break; } } diff --git a/msdos/ioports.c b/msdos/ioports.c index b4924bd7cc9..4233fffbe1f 100644 --- a/msdos/ioports.c +++ b/msdos/ioports.c @@ -236,7 +236,7 @@ DWORD IO_inport( int port, int count ) b = cmosimage[cmosaddress & 0x3f]; break; default: - fprintf( stderr, "Direct I/O read attempted from port %x\n", port); + WARN( int, "Direct I/O read attempted from port %x\n", port); b = 0xff; break; } @@ -274,7 +274,7 @@ void IO_outport( int port, int count, DWORD value ) case 2: outw( LOWORD(value), port ); break; case 4: outl( value, port ); break; default: - fprintf( stderr, "IO_outport: invalid count %d\n", count); + WARN(int, "Invalid count %d\n", count); } iopl(0); return; @@ -295,8 +295,7 @@ void IO_outport( int port, int count, DWORD value ) cmosimage[cmosaddress & 0x3f] = b; break; default: - fprintf( stderr, "Direct I/O write attempted " - "to port %x\n", port ); + WARN(int, "Direct I/O write attempted to port %x\n", port ); break; } port++; diff --git a/msdos/vxd.c b/msdos/vxd.c index bc922e370b6..60a120d645e 100644 --- a/msdos/vxd.c +++ b/msdos/vxd.c @@ -12,7 +12,7 @@ #define VXD_BARF(context,name) \ - fprintf( stderr, "vxd %s: unknown/not implemented parameters:\n" \ + DUMP( "vxd %s: unknown/not implemented parameters:\n" \ "vxd %s: AX %04x, BX %04x, CX %04x, DX %04x, " \ "SI %04x, DI %04x, DS %04x, ES %04x\n", \ (name), (name), AX_reg(context), BX_reg(context), \ diff --git a/multimedia/audio.c b/multimedia/audio.c index 780e035c7d7..c192a5c2b8c 100644 --- a/multimedia/audio.c +++ b/multimedia/audio.c @@ -1541,7 +1541,8 @@ static DWORD widStart(WORD wDevID) lpWIHdr->dwBufferLength); if (bytesRead==-1) perror("read from audio device"); - fprintf(stderr,"bytesread = %d (%ld)\n",bytesRead,lpWIHdr->dwBufferLength); + TRACE(mciwave,"bytesread=%d (%ld)\n", + bytesRead,lpWIHdr->dwBufferLength); lpWIHdr->dwBytesRecorded = bytesRead; WInDev[wDevID].dwTotalRecorded += lpWIHdr->dwBytesRecorded; lpWIHdr->dwFlags &= ~WHDR_INQUEUE; @@ -1804,7 +1805,7 @@ LONG WAVE_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, DWORD wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) { - fprintf(stderr,"wodMessage(%u, %04X, %08lX, %08lX, %08lX);\n", + FIXME(mciwave,"(%u, %04X, %08lX, %08lX, %08lX):stub\n", wDevID, wMsg, dwUser, dwParam1, dwParam2); return MMSYSERR_NOTENABLED; } @@ -1815,7 +1816,7 @@ DWORD wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser, DWORD widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) { - fprintf(stderr,"widMessage(%u, %04X, %08lX, %08lX, %08lX);\n", + FIXME(mciwave,"(%u, %04X, %08lX, %08lX, %08lX):stub\n", wDevID, wMsg, dwUser, dwParam1, dwParam2); return MMSYSERR_NOTENABLED; } diff --git a/multimedia/dsound.c b/multimedia/dsound.c index c541d27c305..4d4ac1cd6aa 100644 --- a/multimedia/dsound.c +++ b/multimedia/dsound.c @@ -103,7 +103,7 @@ static HRESULT WINAPI IDirectSoundNotify_QueryInterface( char xbuf[50]; WINE_StringFromCLSID(riid,xbuf); - fprintf(stderr,"IDirectSound(%p)->QueryInterface(%s,%p)\n",this,xbuf,ppobj); + TRACE(dsound,"(%p,%s,%p)\n",this,xbuf,ppobj); return E_FAIL; } @@ -134,9 +134,10 @@ static HRESULT WINAPI IDirectSoundNotify_SetNotificationPositions( int i; if (TRACE_ON(dsound)) { - fprintf(stderr,"IDirectSoundNotify(%p)->SetNotificationPositions(0x%08lx,%p)\n",this,howmuch,notify); + TRACE(dsound,"(%p,0x%08lx,%p)\n",this,howmuch,notify); for (i=0;idsb->notifies = HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,this->dsb->notifies,(this->dsb->nrofnotifies+howmuch)*sizeof(DSBPOSITIONNOTIFY)); memcpy( this->dsb->notifies+this->dsb->nrofnotifies, @@ -163,10 +164,9 @@ static HRESULT WINAPI IDirectSoundBuffer_SetFormat( ) { memcpy(&(this->wfx),wfex,sizeof(this->wfx)); - TRACE(dsound,"(%p)->SetFormat(%p)\n", - this,wfex); - TRACE(dsound," [formattag=0x%04x,chans=%d,samplerate=%ld" - "bytespersec=%ld,blockalign=%d,bitspersamp=%d,cbSize=%d]\n", + TRACE(dsound,"(%p,%p)\n", this,wfex); + TRACE(dsound,"(formattag=0x%04x,chans=%d,samplerate=%ld" + "bytespersec=%ld,blockalign=%d,bitspersamp=%d,cbSize=%d)\n", wfex->wFormatTag, wfex->nChannels, wfex->nSamplesPerSec, wfex->nAvgBytesPerSec, wfex->nBlockAlign, wfex->wBitsPerSample, wfex->cbSize); @@ -177,7 +177,7 @@ static HRESULT WINAPI IDirectSoundBuffer_SetFormat( static HRESULT WINAPI IDirectSoundBuffer_SetVolume( LPDIRECTSOUNDBUFFER this,LONG vol ) { - fprintf(stderr,"(%p)->SetVolume(%ld)\n",this,vol); + TRACE(dsound,"(%p,%ld)\n",this,vol); this->volume = vol; this->volfac = ((double)vol+10000.0)/10000.0; return 0; @@ -186,7 +186,7 @@ static HRESULT WINAPI IDirectSoundBuffer_SetVolume( static HRESULT WINAPI IDirectSoundBuffer_GetVolume( LPDIRECTSOUNDBUFFER this,LPLONG vol ) { - TRACE(dsound,"(%p)->GetVolume(%p)\n",this,vol); + TRACE(dsound,"(%p,%p)\n",this,vol); *vol = this->volume; return 0; } @@ -194,7 +194,7 @@ static HRESULT WINAPI IDirectSoundBuffer_GetVolume( static HRESULT WINAPI IDirectSoundBuffer_SetFrequency( LPDIRECTSOUNDBUFFER this,DWORD freq ) { - TRACE(dsound,"(%p)->SetFrequency(%ld)\n",this,freq); + TRACE(dsound,"(%p,%ld)\n",this,freq); this->wfx.nSamplesPerSec = freq; this->wfx.nAvgBytesPerSec = freq*this->wfx.nChannels*(this->wfx.wBitsPerSample/8); return 0; @@ -203,7 +203,7 @@ static HRESULT WINAPI IDirectSoundBuffer_SetFrequency( static HRESULT WINAPI IDirectSoundBuffer_Play( LPDIRECTSOUNDBUFFER this,DWORD reserved1,DWORD reserved2,DWORD flags ) { - TRACE(dsound,"(%p)->Play(%08lx,%08lx,%08lx)\n", + TRACE(dsound,"(%p,%08lx,%08lx,%08lx)\n", this,reserved1,reserved2,flags ); this->playpos = 0; @@ -213,7 +213,7 @@ static HRESULT WINAPI IDirectSoundBuffer_Play( } static HRESULT WINAPI IDirectSoundBuffer_Stop(LPDIRECTSOUNDBUFFER this) { - TRACE(dsound,"(%p)->Stop()\n",this); + TRACE(dsound,"(%p)\n",this); this->playing = 0; this->writepos = 0; /* hmm */ return 0; @@ -247,7 +247,7 @@ static DWORD WINAPI IDirectSoundBuffer_Release(LPDIRECTSOUNDBUFFER this) { static HRESULT WINAPI IDirectSoundBuffer_GetCurrentPosition( LPDIRECTSOUNDBUFFER this,LPDWORD playpos,LPDWORD writepos ) { - TRACE(dsound,"(%p)->GetCurrentPosition(%p,%p)\n",this,playpos,writepos); + TRACE(dsound,"(%p,%p,%p)\n",this,playpos,writepos); if (playpos) *playpos = this->playpos; if (writepos) *writepos = this->writepos; return 0; @@ -256,7 +256,7 @@ static HRESULT WINAPI IDirectSoundBuffer_GetCurrentPosition( static HRESULT WINAPI IDirectSoundBuffer_GetStatus( LPDIRECTSOUNDBUFFER this,LPDWORD status ) { - TRACE(dsound,"(%p)->GetStatus(%p)\n",this,status); + TRACE(dsound,"(%p,%p)\n",this,status); *status = 0; if (this->playing) *status |= DSBSTATUS_PLAYING; @@ -268,7 +268,7 @@ static HRESULT WINAPI IDirectSoundBuffer_GetStatus( static HRESULT WINAPI IDirectSoundBuffer_GetFormat( LPDIRECTSOUNDBUFFER this,LPWAVEFORMATEX lpwf,DWORD wfsize,LPDWORD wfwritten ) { - TRACE(dsound,"(%p)->GetFormat(%p,%ld,%p)\n",this,lpwf,wfsize,wfwritten); + TRACE(dsound,"(%p,%p,%ld,%p)\n",this,lpwf,wfsize,wfwritten); if (wfsize>sizeof(this->wfx)) wfsize = sizeof(this->wfx); memcpy(lpwf,&(this->wfx),wfsize); if (wfwritten) *wfwritten = wfsize; @@ -279,7 +279,7 @@ static HRESULT WINAPI IDirectSoundBuffer_Lock( LPDIRECTSOUNDBUFFER this,DWORD writecursor,DWORD writebytes,LPVOID lplpaudioptr1,LPDWORD audiobytes1,LPVOID lplpaudioptr2,LPDWORD audiobytes2,DWORD flags ) { - TRACE(dsound,"(%p)->Lock(%ld,%ld,%p,%p,%p,%p,0x%08lx)\n", + TRACE(dsound,"(%p,%ld,%ld,%p,%p,%p,%p,0x%08lx)\n", this, writecursor, writebytes, @@ -317,7 +317,7 @@ static HRESULT WINAPI IDirectSoundBuffer_Lock( static HRESULT WINAPI IDirectSoundBuffer_SetCurrentPosition( LPDIRECTSOUNDBUFFER this,DWORD newpos ) { - TRACE(dsound,"(%p)->SetCurrentPosition(%ld)\n",this,newpos); + TRACE(dsound,"(%p,%ld)\n",this,newpos); this->playpos = newpos; return 0; } @@ -325,7 +325,7 @@ static HRESULT WINAPI IDirectSoundBuffer_SetCurrentPosition( static HRESULT WINAPI IDirectSoundBuffer_SetPan( LPDIRECTSOUNDBUFFER this,LONG newpan ) { - TRACE(dsound,"(%p)->SetPan(%ld)\n",this,newpan); + TRACE(dsound,"(%p,%ld)\n",this,newpan); this->pan = newpan; return 0; } @@ -333,7 +333,7 @@ static HRESULT WINAPI IDirectSoundBuffer_SetPan( static HRESULT WINAPI IDirectSoundBuffer_GetPan( LPDIRECTSOUNDBUFFER this,LPLONG pan ) { - TRACE(dsound,"(%p)->GetPan(%p)\n",this,pan); + TRACE(dsound,"(%p,%p)\n",this,pan); *pan = this->pan; return 0; } @@ -341,18 +341,14 @@ static HRESULT WINAPI IDirectSoundBuffer_GetPan( static HRESULT WINAPI IDirectSoundBuffer_Unlock( LPDIRECTSOUNDBUFFER this,LPVOID p1,DWORD x1,LPVOID p2,DWORD x2 ) { - TRACE(dsound,"(%p)->Unlock(%p,%ld,%p,%ld)\n", - this,p1,x1,p2,x2 - ); + FIXME(dsound,"(%p,%p,%ld,%p,%ld):stub\n", this,p1,x1,p2,x2); return 0; } static HRESULT WINAPI IDirectSoundBuffer_GetFrequency( LPDIRECTSOUNDBUFFER this,LPDWORD freq ) { - TRACE(dsound,"(%p)->GetFrequency(%p)\n", - this,freq - ); + TRACE(dsound,"(%p,%p)\n",this,freq); *freq = this->wfx.nSamplesPerSec; return 0; } @@ -360,7 +356,7 @@ static HRESULT WINAPI IDirectSoundBuffer_GetFrequency( static HRESULT WINAPI IDirectSoundBuffer_Initialize( LPDIRECTSOUNDBUFFER this,LPDIRECTSOUND dsound,LPDSBUFFERDESC dbsd ) { - fprintf(stderr,"(%p)->Initialize(%p,%p)\n",this,dsound,dbsd); + FIXME(dsound,"(%p,%p,%p):stub\n",this,dsound,dbsd); return DSERR_ALREADYINITIALIZED; } @@ -392,7 +388,7 @@ static HRESULT WINAPI IDirectSoundBuffer_QueryInterface( return 0; } WINE_StringFromCLSID(riid,xbuf); - fprintf(stderr,"(%p)->QueryInterface(%s,%p)\n",this,xbuf,ppobj); + TRACE(dsound,"(%p,%s,%p)\n",this,xbuf,ppobj); return E_FAIL; } @@ -426,9 +422,7 @@ static struct tagLPDIRECTSOUNDBUFFER_VTABLE dsbvt = { static HRESULT WINAPI IDirectSound_SetCooperativeLevel( LPDIRECTSOUND this,HWND32 hwnd,DWORD level ) { - TRACE(dsound,"(%p)->SetCooperativeLevel(%08lx,%ld)\n", - this,(DWORD)hwnd,level - ); + FIXME(dsound,"(%p,%08lx,%ld):stub\n",this,(DWORD)hwnd,level); return 0; } @@ -437,12 +431,12 @@ static HRESULT WINAPI IDirectSound_CreateSoundBuffer( LPDIRECTSOUND this,LPDSBUFFERDESC dsbd,LPLPDIRECTSOUNDBUFFER ppdsb,LPUNKNOWN lpunk ) { if (TRACE_ON(dsound)) { - fprintf(stderr,"IDirectSound(%p)->CreateSoundBuffer(%p,%p,%p)\n",this,dsbd,ppdsb,lpunk); - fprintf(stderr,"[size=%ld,",dsbd->dwSize); - fprintf(stderr,"flags = 0x%08lx,",dsbd->dwFlags); + TRACE(dsound,"(%p,%p,%p,%p)\n",this,dsbd,ppdsb,lpunk); + TRACE(dsound,"(size=%ld)\n",dsbd->dwSize); + TRACE(dsound,"(flags=0x%08lx\n",dsbd->dwFlags); _dump_DSBCAPS(dsbd->dwFlags); - fprintf(stderr,"bufferbytes = %ld,",dsbd->dwBufferBytes); - fprintf(stderr,"lpwfxFormat = %p]\n",dsbd->lpwfxFormat); + TRACE(dsound,"(bufferbytes=%ld)\n",dsbd->dwBufferBytes); + TRACE(dsound,"(lpwfxFormat=%p)\n",dsbd->lpwfxFormat); } *ppdsb = (LPDIRECTSOUNDBUFFER)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectSoundBuffer)); (*ppdsb)->ref =1; @@ -469,7 +463,7 @@ static HRESULT WINAPI IDirectSound_CreateSoundBuffer( static HRESULT WINAPI IDirectSound_DuplicateSoundBuffer( LPDIRECTSOUND this,LPDIRECTSOUNDBUFFER pdsb,LPLPDIRECTSOUNDBUFFER ppdsb ) { - TRACE(dsound,"IDirectSound(%p)->DuplicateSoundBuffer(%p,%p)\n",this,pdsb,ppdsb); + TRACE(dsound,"(%p,%p,%p)\n",this,pdsb,ppdsb); *ppdsb = (LPDIRECTSOUNDBUFFER)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectSoundBuffer)); (*ppdsb)->ref =1; @@ -491,8 +485,8 @@ static HRESULT WINAPI IDirectSound_DuplicateSoundBuffer( static HRESULT WINAPI IDirectSound_GetCaps(LPDIRECTSOUND this,LPDSCAPS caps) { - TRACE(dsound,"IDirectSound(%p)->GetCaps(%p)\n",this,caps); - TRACE(dsound," flags = 0x%08lx\n",caps->dwFlags); + TRACE(dsound,"(%p,%p)\n",this,caps); + TRACE(dsound,"(flags=0x%08lx)\n",caps->dwFlags); caps->dwSize = sizeof(*caps); caps->dwFlags = DSCAPS_PRIMARYSTEREO|DSCAPS_PRIMARY16BIT|DSCAPS_EMULDRIVER|DSCAPS_SECONDARYSTEREO|DSCAPS_SECONDARY16BIT; @@ -521,7 +515,7 @@ static ULONG WINAPI IDirectSound_Release(LPDIRECTSOUND this) { static HRESULT WINAPI IDirectSound_SetSpeakerConfig( LPDIRECTSOUND this,DWORD config ) { - fprintf(stderr,"IDirectSound(%p)->SetSpeakerConfig(0x%08lx)\n",this,config); + FIXME(dsound,"(%p,0x%08lx):stub\n",this,config); return 0; } @@ -531,7 +525,7 @@ static HRESULT WINAPI IDirectSound_QueryInterface( char xbuf[50]; WINE_StringFromCLSID(riid,xbuf); - fprintf(stderr,"IDirectSound(%p)->QueryInterface(%s,%p)\n",this,xbuf,ppobj); + TRACE(dsound,"(%p,%s,%p)\n",this,xbuf,ppobj); return E_FAIL; } @@ -556,7 +550,7 @@ DSOUND_setformat(LPWAVEFORMATEX wfex) { switch (wfex->wFormatTag) { default: - fprintf(stderr,"unknown WAVE_FORMAT tag %d\n",wfex->wFormatTag); + WARN(dsound,"unknown WAVE_FORMAT tag %d\n",wfex->wFormatTag); return DSERR_BADFORMAT; case WAVE_FORMAT_PCM: break; @@ -571,7 +565,7 @@ DSOUND_setformat(LPWAVEFORMATEX wfex) { return -1; } if ((xx&format)!=format) {/* format unsupported */ - fprintf(stderr,"SNDCTL_DSP_GETFMTS: format not supported\n"); + WARN(dsound,"SNDCTL_DSP_GETFMTS: format not supported\n"); return -1; } nformat = format; @@ -580,7 +574,7 @@ DSOUND_setformat(LPWAVEFORMATEX wfex) { return -1; } if (nformat!=format) {/* didn't work */ - fprintf(stderr,"SNDCTL_DSP_GETFMTS: format not set\n"); + WARN(dsound,"SNDCTL_DSP_GETFMTS: format not set\n"); return -1; } @@ -594,7 +588,7 @@ DSOUND_setformat(LPWAVEFORMATEX wfex) { perror("ioctl SNDCTL_DSP_SPEED"); return -1; } - fprintf(stderr,"freq %ld channels %d bits %d\n", + TRACE(dsound,"(freq=%ld,channels=%d,bits=%d)\n", wfex->nSamplesPerSec,wfex->nChannels,wfex->wBitsPerSample ); return 0; @@ -619,7 +613,7 @@ DSOUND_nextevent(IDirectSoundBuffer *dsb) { #define CHECK_EVENT \ if (nextevent && (dsb->playpos == nextevent->dwOffset)) { \ SetEvent(nextevent->hEventNotify); \ - fprintf(stderr,"signalled event %d\n",nextevent->hEventNotify);\ + TRACE(dsound,"signalled event %d\n",nextevent->hEventNotify);\ nextevent = DSOUND_nextevent(dsb); \ } @@ -633,10 +627,11 @@ DSOUND_MixInBuffer(IDirectSoundBuffer *dsb) { if (xdiff<0) xdiff=-xdiff; if (xdiff>1500) { - fprintf(stderr,"mixing in buffer of different frequency (%ld vs %ld), argh!\n",dsb->wfx.nSamplesPerSec,dsound->wfx.nSamplesPerSec); + WARN(dsound,"mixing in buffer of different frequency (%ld vs %ld), argh!\n", + dsb->wfx.nSamplesPerSec,dsound->wfx.nSamplesPerSec); } nextevent = DSOUND_nextevent(dsb); -/* fprintf(stderr,"%d.%d.%d.%d\n",dsound->wfx.wBitsPerSample,dsb->wfx.wBitsPerSample,dsound->wfx.nChannels,dsb->wfx.nChannels);*/ +/* TRACE(dsound,"(%d.%d.%d.%d)\n",dsound->wfx.wBitsPerSample,dsb->wfx.wBitsPerSample,dsound->wfx.nChannels,dsb->wfx.nChannels);*/ if (dsound->wfx.wBitsPerSample == 8) { char *playbuf8 = (char*)playbuf; @@ -766,14 +761,14 @@ static DWORD DSOUND_thread(LPVOID arg) { int res,i,curleft,playing,haveprimary = 0; - fprintf(stderr,"dsound is at pid %d\n",getpid()); + TRACE(dsound,"dsound is at pid %d\n",getpid()); while (1) { if (!dsound) { - fprintf(stderr,"DSOUND thread giving up.\n"); + WARN(dsound,"DSOUND thread giving up.\n"); ExitThread(0); } if (getppid()==1) { - fprintf(stderr,"DSOUND father died? Giving up.\n"); + WARN(dsound,"DSOUND father died? Giving up.\n"); ExitThread(0); } /* RACE: dsound could be deleted */ @@ -849,7 +844,7 @@ DSOUND_thread(LPVOID arg) { HRESULT WINAPI DirectSoundCreate(LPGUID lpGUID,LPDIRECTSOUND *ppDS,IUnknown *pUnkOuter ) { int xx; if (lpGUID) - fprintf(stderr,"DirectSoundCreate(%p,%p,%p)\n",lpGUID,ppDS,pUnkOuter); + TRACE(dsound,"(%p,%p,%p)\n",lpGUID,ppDS,pUnkOuter); #ifdef HAVE_OSS if (audiofd>=0) return DSERR_ALLOCATED; @@ -863,7 +858,7 @@ HRESULT WINAPI DirectSoundCreate(LPGUID lpGUID,LPDIRECTSOUND *ppDS,IUnknown *pUn if (-1==ioctl(audiofd,SNDCTL_DSP_SETFRAGMENT,&xx)) perror("ioctl SETFRAGMENT"); /* - fprintf(stderr,"SETFRAGMENT. count is now %d, fragsize is %d\n", + TRACE(dsound,"SETFRAGMENT. count is now %d, fragsize is %d\n", (xx>>16)+1,xx&0xffff ); */ @@ -896,3 +891,42 @@ HRESULT WINAPI DirectSoundCreate(LPGUID lpGUID,LPDIRECTSOUND *ppDS,IUnknown *pUn return DSERR_NODRIVER; #endif } + + +/******************************************************************************* + * DllGetClassObject [DSOUND.4] + * Retrieves class object from a DLL object + * + * NOTES + * Docs say returns STDAPI + * + * PARAMS + * rclsid [I] CLSID for the class object + * riid [I] Reference to identifier of interface for class object + * ppv [O] Address of variable to receive interface pointer for riid + * + * RETURNS + * Success: S_OK + * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG, + * E_UNEXPECTED + */ +DWORD WINAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, LPVOID *ppv ) +{ + FIXME(dsound, "(%p,%p,%p): stub\n", rclsid, riid, ppv); + return S_OK; +} + + +/******************************************************************************* + * DllCanUnloadNow [DSOUND.3] Determines whether the DLL is in use. + * + * RETURNS + * Success: S_OK + * Failure: S_FALSE + */ +DWORD WINAPI DllCanUnloadNow(void) +{ + FIXME(dsound, "(void): stub\n"); + return S_FALSE; +} + diff --git a/multimedia/joystick.c b/multimedia/joystick.c index 6a8d2e68a47..7873daaf178 100644 --- a/multimedia/joystick.c +++ b/multimedia/joystick.c @@ -145,7 +145,7 @@ UINT16 WINAPI joyGetNumDevs16(void) joy_cnt++; } TRACE(mmsys, "returning %d\n", joy_cnt); - if (!joy_cnt) fprintf(stderr, "No joystick found - " + if (!joy_cnt) ERR(mmsys, "No joystick found - " "perhaps get joystick-0.8.0.tar.gz and load" "it as module or use Linux >= 2.1.45 to be " "able to use joysticks.\n"); @@ -409,6 +409,6 @@ MMRESULT16 WINAPI joySetThreshold16(UINT16 wID, UINT16 wThreshold) */ MMRESULT16 WINAPI joySetCalibration16(UINT16 wID) { - fprintf(stderr, "EMPTY STUB !!! joySetCalibration(%04X);\n", wID); + FIXME(mmsys, "(%04X): stub.\n", wID); return JOYERR_NOCANDO; } diff --git a/multimedia/mcianim.c b/multimedia/mcianim.c index dc915a3dd8b..e56f5030901 100644 --- a/multimedia/mcianim.c +++ b/multimedia/mcianim.c @@ -196,7 +196,7 @@ static DWORD ANIM_CalcTime(UINT16 wDevID, DWORD dwFormatType, DWORD dwFrame) case MCI_FORMAT_TMSF: for (wTrack = 0; wTrack < AnimDev[wDevID].nTracks; wTrack++) { /* dwTime += AnimDev[wDevID].lpdwTrackLen[wTrack - 1]; - printf("Adding trk#%u curpos=%u \n", dwTime); + TRACE(mcianim, "Adding trk#%u curpos=%u \n", dwTime); if (dwTime >= dwFrame) break; */ if (AnimDev[wDevID].lpdwTrackPos[wTrack - 1] >= dwFrame) break; } @@ -361,11 +361,11 @@ static DWORD ANIM_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpP lpParms->dwReturn = MCI_FORMAT_MILLISECONDS; return 0; default: - fprintf(stderr,"ANIM_mciStatus // unknown command %08lX !\n", lpParms->dwItem); + WARN(mcianim,"Unknown command %08lX !\n", lpParms->dwItem); return MCIERR_UNRECOGNIZED_COMMAND; } } - fprintf(stderr,"ANIM_mciStatus // not MCI_STATUS_ITEM !\n"); + WARN(mcianim,"Not MCI_STATUS_ITEM !\n"); return 0; } @@ -500,8 +500,8 @@ static DWORD ANIM_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) TRACE(mcianim,"(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_INTERNAL; /* - printf("ANIM_mciSet // dwTimeFormat=%08lX\n", lpParms->dwTimeFormat); - printf("ANIM_mciSet // dwAudio=%08lX\n", lpParms->dwAudio); + TRACE(mcianim,"(dwTimeFormat=%08lX)\n", lpParms->dwTimeFormat); + TRACE(mcianim,"(dwAudio=%08lX)\n", lpParms->dwAudio); */ if (dwFlags & MCI_SET_TIME_FORMAT) { switch (lpParms->dwTimeFormat) { @@ -515,7 +515,7 @@ static DWORD ANIM_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) TRACE(mcianim,"MCI_FORMAT_TMSF !\n"); break; default: - fprintf(stderr,"ANIM_mciSet // bad time format !\n"); + WARN(mcianim,"Bad time format !\n"); return MCIERR_BAD_TIME_FORMAT; } AnimDev[wDevID].dwTimeFormat = lpParms->dwTimeFormat; diff --git a/multimedia/mcicda.c b/multimedia/mcicda.c index 48e6ea19511..77ce44b50ad 100644 --- a/multimedia/mcicda.c +++ b/multimedia/mcicda.c @@ -582,7 +582,7 @@ static DWORD CDAUDIO_CalcTime(UINT16 wDevID, DWORD dwFormatType, DWORD dwFrame) case MCI_FORMAT_TMSF: for (wTrack = 0; wTrack < CDADev[wDevID].nTracks; wTrack++) { /* dwTime += CDADev[wDevID].lpdwTrackLen[wTrack - 1]; - printf("Adding trk#%u curpos=%u \n", dwTime); + TRACE(cdaudio, "Adding trk#%u curpos=%u \n", dwTime); if (dwTime >= dwFrame) break; */ if (CDADev[wDevID].lpdwTrackPos[wTrack - 1] >= dwFrame) break; } @@ -938,8 +938,8 @@ static DWORD CDAUDIO_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParm TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_INTERNAL; /* - printf("CDAUDIO_mciSet // dwTimeFormat=%08lX\n", lpParms->dwTimeFormat); - printf("CDAUDIO_mciSet // dwAudio=%08lX\n", lpParms->dwAudio); + TRACE(cdaudio,"dwTimeFormat=%08lX\n", lpParms->dwTimeFormat); + TRACE(cdaudio,"dwAudio=%08lX\n", lpParms->dwAudio); */ if (dwFlags & MCI_SET_TIME_FORMAT) { switch (lpParms->dwTimeFormat) { diff --git a/multimedia/mixer.c b/multimedia/mixer.c index 12335318cda..4b554e69610 100644 --- a/multimedia/mixer.c +++ b/multimedia/mixer.c @@ -150,18 +150,18 @@ static DWORD MIX_GetLineInfo(WORD wDevID, LPMIXERLINE16 lpml, DWORD fdwInfo) lpml->fdwLine |= MIXERLINE_LINEF_SOURCE; break; default: - fprintf(stderr,"MIX_GetLineInfo:mixertype %d not handle.\n",i); + ERR(mmaux,"Mixertype %d not handle.\n",i); break; } break; case MIXER_GETLINEINFOF_LINEID: - fprintf(stderr,"MIX_GetLineInfo: _LINEID (%ld) not implemented yet.\n",lpml->dwLineID); + FIXME(mmaux,"_LINEID (%ld) not implemented yet.\n",lpml->dwLineID); break; case MIXER_GETLINEINFOF_COMPONENTTYPE: - fprintf(stderr,"MIX_GetLineInfo: _COMPONENTTYPE not implemented yet.\n"); + FIXME(mmaux," _COMPONENTTYPE not implemented yet.\n"); break; case MIXER_GETLINEINFOF_TARGETTYPE: - fprintf(stderr,"MIX_GetLineInfo: _TARGETTYPE not implemented yet.\n"); + FIXME(mmaux,"_TARGETTYPE not implemented yet.\n"); break; } lpml->Target.dwType = MIXERLINE_TARGETTYPE_AUX; diff --git a/multimedia/mmio.c b/multimedia/mmio.c index c7117a01f35..b1f6941818c 100644 --- a/multimedia/mmio.c +++ b/multimedia/mmio.c @@ -375,8 +375,9 @@ UINT16 WINAPI mmioSetInfo(HMMIO16 hmmio, const MMIOINFO16 * lpmmioinfo, UINT16 u UINT16 WINAPI mmioSetBuffer(HMMIO16 hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT16 uFlags) { - FIXME(mmio, "empty stub \n"); - return 0; + FIXME(mmio, "(hmmio=%d, pchBuf=%p, cchBuf=%d, uFlags=%#08x): stub\n", + hmmio, pchBuffer, cchBuffer, uFlags); + return MMIOERR_OUTOFMEMORY; } /************************************************************************** diff --git a/multimedia/time.c b/multimedia/time.c index 1afcce483ab..a1ae385c30c 100644 --- a/multimedia/time.c +++ b/multimedia/time.c @@ -380,7 +380,7 @@ DWORD WINAPI timeGetTime() /* FIXME all this function should have to be is long result; struct timeval time; - dprintf_mmtime(stddeb, "timeGetTime(); !\n"); + TRACE(mmtime,"timeGetTime(); !\n"); gettimeofday(&time, 0); result = (((long)time.tv_sec * (long)1000) + ((long)time.tv_usec / (long)1000)); diff --git a/objects/bitmap.c b/objects/bitmap.c index 71fc644e9a7..241eaf38d43 100644 --- a/objects/bitmap.c +++ b/objects/bitmap.c @@ -81,7 +81,7 @@ INT32 BITMAP_GetBitsPadding( int bmWidth, int bpp ) break; default: - fprintf(stderr,"GetBitsPadding: unknown depth %d, please report.\n", bpp ); + WARN(bitmap,"Unknown depth %d, please report.\n", bpp ); return -1; } return pad; @@ -115,7 +115,7 @@ INT32 BITMAP_GetBitsWidth( int bmWidth, int bpp ) return 2 * ((bmWidth+3) >> 2); default: - fprintf(stderr,"GetBitsPadding: unknown depth %d, please report.\n", bpp ); + WARN(bitmap,"Unknown depth %d, please report.\n", bpp ); } return -1; } @@ -130,8 +130,19 @@ HBITMAP16 WINAPI CreateBitmap16( INT16 width, INT16 height, UINT16 planes, } -/*********************************************************************** - * CreateBitmap32 (GDI32.25) +/****************************************************************************** + * CreateBitmap32 [GDI32.25] Creates a bitmap with the specified info + * + * PARAMS + * width [I] bitmap width + * height [I] bitmap height + * planes [I] Number of color planes + * bpp [I] Number of bits to identify a color + * bits [I] Pointer to array containing color data + * + * RETURNS + * Success: Handle to bitmap + * Failure: NULL */ HBITMAP32 WINAPI CreateBitmap32( INT32 width, INT32 height, UINT32 planes, UINT32 bpp, LPCVOID bits ) @@ -142,8 +153,7 @@ HBITMAP32 WINAPI CreateBitmap32( INT32 width, INT32 height, UINT32 planes, planes = (BYTE)planes; bpp = (BYTE)bpp; - TRACE(gdi, "%dx%d, %d colors\n", - width, height, 1 << (planes*bpp) ); + TRACE(gdi, "%dx%d, %d colors\n", width, height, 1 << (planes*bpp) ); /* Check parameters */ if (!height || !width || planes != 1) return 0; @@ -190,17 +200,31 @@ HBITMAP16 WINAPI CreateCompatibleBitmap16(HDC16 hdc, INT16 width, INT16 height) } -/*********************************************************************** - * CreateCompatibleBitmap32 (GDI32.30) +/****************************************************************************** + * CreateCompatibleBitmap32 [GDI32.30] Creates a bitmap compatible with the DC + * + * PARAMS + * hdc [I] Handle to device context + * width [I] Width of bitmap + * height [I] Height of bitmap + * + * RETURNS + * Success: Handle to bitmap + * Failure: NULL */ -HBITMAP32 WINAPI CreateCompatibleBitmap32(HDC32 hdc, INT32 width, INT32 height) +HBITMAP32 WINAPI CreateCompatibleBitmap32( HDC32 hdc, INT32 width, INT32 height) { HBITMAP32 hbmpRet = 0; DC *dc; - TRACE(gdi, "(%04x,%d,%d) = \n", - hdc, width, height ); + TRACE(gdi, "(%04x,%d,%d) = \n", hdc, width, height ); if (!(dc = DC_GetDCPtr( hdc ))) return 0; + if ((width >0x1000) || (height > 0x1000)) + { + FIXME(gdi,"got bad width %d or height %d, please look for reason\n", + width, height ); + return 0; + } hbmpRet = CreateBitmap32( width, height, 1, dc->w.bitsPerPixel, NULL ); TRACE(gdi,"\t\t%04x\n", hbmpRet); return hbmpRet; @@ -217,10 +241,15 @@ HBITMAP16 WINAPI CreateBitmapIndirect16( const BITMAP16 * bmp ) } -/*********************************************************************** - * CreateBitmapIndirect32 (GDI32.26) +/****************************************************************************** + * CreateBitmapIndirect32 [GDI32.26] Creates a bitmap with the specifies info + * + * RETURNS + * Success: Handle to bitmap + * Failure: NULL */ -HBITMAP32 WINAPI CreateBitmapIndirect32( const BITMAP32 * bmp ) +HBITMAP32 WINAPI CreateBitmapIndirect32( + const BITMAP32 * bmp) /* [in] Pointer to the bitmap data */ { return CreateBitmap32( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes, bmp->bmBitsPixel, bmp->bmBits ); @@ -249,9 +278,16 @@ LONG WINAPI GetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPVOID buffer ) /*********************************************************************** - * GetBitmapBits32 (GDI32.143) + * GetBitmapBits32 [GDI32.143] Copies bitmap bits of bitmap to buffer + * + * RETURNS + * Success: Number of bytes copied + * Failure: 0 */ -LONG WINAPI GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer ) +LONG WINAPI GetBitmapBits32( + HBITMAP32 hbitmap, /* [in] Handle to bitmap */ + LONG count, /* [in] Number of bytes to copy */ + LPVOID buffer) /* [out] Pointer to buffer to receive bits */ { BITMAPOBJ * bmp; LONG height, old_height; @@ -261,7 +297,7 @@ LONG WINAPI GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer ) /* KLUDGE! */ if (count < 0) { - fprintf(stderr, "Negative number of bytes (%ld) passed to GetBitmapBits???\n", count ); + WARN(bitmap, "(%ld): Negative number of bytes passed???\n", count ); count = -count; } bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ); @@ -356,6 +392,9 @@ LONG WINAPI GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer ) } tbuf += pad; } + break; + default: + FIXME(bitmap, "Unhandled bits:%d\n", bmp->bitmap.bmBitsPixel); } XDestroyImage( image ); LeaveCriticalSection( &X11DRV_CritSection ); @@ -374,10 +413,17 @@ LONG WINAPI SetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPCVOID buffer ) } -/*********************************************************************** - * SetBitmapBits32 (GDI32.303) +/****************************************************************************** + * SetBitmapBits32 [GDI32.303] Sets bits of color data for a bitmap + * + * RETURNS + * Success: Number of bytes used in setting the bitmap bits + * Failure: 0 */ -LONG WINAPI SetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPCVOID buffer ) +LONG WINAPI SetBitmapBits32( + HBITMAP32 hbitmap, /* [in] Handle to bitmap */ + LONG count, /* [in] Number of bytes in bitmap array */ + LPCVOID buffer) /* [in] Address of array with bitmap bits */ { struct XPutImage_descr descr; BITMAPOBJ * bmp; @@ -388,7 +434,7 @@ LONG WINAPI SetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPCVOID buffer ) /* KLUDGE! */ if (count < 0) { - fprintf(stderr, "Negative number of bytes (%ld) passed to SetBitmapBits???\n", count ); + WARN(bitmap, "(%ld): Negative number of bytes passed???\n", count ); count = -count; } bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ); @@ -491,17 +537,19 @@ LONG WINAPI SetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPCVOID buffer ) return height * bmp->bitmap.bmWidthBytes; } +/*********************************************************************** + * LoadImage16 [USER.389] + * + */ HANDLE16 WINAPI LoadImage16( HINSTANCE16 hinst, LPCSTR name, UINT16 type, INT16 desiredx, INT16 desiredy, UINT16 loadflags) { if (HIWORD(name)) { - fprintf(stddeb,"LoadImage16(0x%04x,%s,%d,%d,%d,0x%08x)\n", - hinst,(char *)PTR_SEG_TO_LIN(name),type,desiredx,desiredy,loadflags - ); + TRACE(resource,"(0x%04x,%s,%d,%d,%d,0x%08x)\n", + hinst,(char *)PTR_SEG_TO_LIN(name),type,desiredx,desiredy,loadflags); } else { - fprintf(stddeb,"LoadImage16(0x%04x,%p,%d,%d,%d,0x%08x)\n", - hinst,name,type,desiredx,desiredy,loadflags - ); + TRACE(resource,"LoadImage16(0x%04x,%p,%d,%d,%d,0x%08x)\n", + hinst,name,type,desiredx,desiredy,loadflags); } switch (type) { case IMAGE_BITMAP: @@ -514,8 +562,10 @@ HANDLE16 WINAPI LoadImage16( HINSTANCE16 hinst, LPCSTR name, UINT16 type, return 0; } + /********************************************************************** * LoadImage32A (USER32.365) + * * FIXME: implementation still lacks nearly all features, see LR_* * defines in windows.h */ @@ -543,8 +593,35 @@ HANDLE32 WINAPI LoadImage32A( HINSTANCE32 hinst, LPCSTR name, UINT32 type, return 0; } +/********************************************************************** + * LoadImage32W (USER32.366) + * + * FIXME: implementation still lacks nearly all features, see LR_* + * defines in windows.h + */ + + +/****************************************************************************** + * LoadImage32W [USER32.366] Loads an icon, cursor, or bitmap + * + * PARAMS + * hinst [I] Handle of instance that contains image + * name [I] Name of image + * type [I] Type of image + * desiredx [I] Desired width + * desiredy [I] Desired height + * loadflags [I] Load flags + * + * RETURNS + * Success: Handle to newly loaded image + * Failure: NULL + * + * BUGS + * Implementation still lacks nearly all features, see LR_* + * defines in windows.h + */ HANDLE32 WINAPI LoadImage32W( HINSTANCE32 hinst, LPCWSTR name, UINT32 type, - INT32 desiredx, INT32 desiredy, UINT32 loadflags) + INT32 desiredx, INT32 desiredy, UINT32 loadflags ) { if (HIWORD(name)) { TRACE(resource,"(0x%04x,%p,%d,%d,%d,0x%08x)\n", @@ -555,20 +632,25 @@ HANDLE32 WINAPI LoadImage32W( HINSTANCE32 hinst, LPCWSTR name, UINT32 type, hinst,name,type,desiredx,desiredy,loadflags ); } - switch (type) { - case IMAGE_BITMAP: - return LoadBitmap32W(hinst,name); - case IMAGE_ICON: - return LoadIcon32W(hinst,name); - case IMAGE_CURSOR: - return LoadCursor32W(hinst,name); - } - return 0; + + switch (type) { + case IMAGE_BITMAP: + return LoadBitmap32W(hinst,name); + case IMAGE_ICON: + return LoadIcon32W(hinst,name); + case IMAGE_CURSOR: + return LoadCursor32W(hinst,name); + } + return NULL; } + /********************************************************************** * CopyBitmap32 (not an API) * + * NOTES + * If it is not an API, why is it declared with WINAPI? + * */ HBITMAP32 WINAPI CopyBitmap32 (HBITMAP32 hnd) { @@ -583,8 +665,20 @@ HBITMAP32 WINAPI CopyBitmap32 (HBITMAP32 hnd) return res; } -/********************************************************************** - * CopyImage32 (USER32.61) + +/****************************************************************************** + * CopyImage32 [USER32.61] Creates new image and copies attributes to it + * + * PARAMS + * hnd [I] Handle to image to copy + * type [I] Type of image to copy + * desiredx [I] Desired width of new image + * desiredy [I] Desired height of new image + * flags [I] Copy flags + * + * RETURNS + * Success: Handle to newly created image + * Failure: NULL * * FIXME: implementation still lacks nearly all features, see LR_* * defines in windows.h @@ -607,6 +701,9 @@ HANDLE32 WINAPI CopyImage32( HANDLE32 hnd, UINT32 type, INT32 desiredx, /********************************************************************** * LoadBitmap16 (USER.175) + * + * NOTES + * Can this call LoadBitmap32? */ HBITMAP16 WINAPI LoadBitmap16( HINSTANCE16 instance, SEGPTR name ) { @@ -647,10 +744,17 @@ HBITMAP16 WINAPI LoadBitmap16( HINSTANCE16 instance, SEGPTR name ) return hbitmap; } -/********************************************************************** - * LoadBitmap32W (USER32.358) + +/****************************************************************************** + * LoadBitmap32W [USER32.358] Loads bitmap from the executable file + * + * RETURNS + * Success: Handle to specified bitmap + * Failure: NULL */ -HBITMAP32 WINAPI LoadBitmap32W( HINSTANCE32 instance, LPCWSTR name ) +HBITMAP32 WINAPI LoadBitmap32W( + HINSTANCE32 instance, /* [in] Handle to application instance */ + LPCWSTR name) /* [in] Address of bitmap resource name */ { HBITMAP32 hbitmap = 0; HDC32 hdc; @@ -754,7 +858,6 @@ INT32 BITMAP_GetObject32( BITMAPOBJ * bmp, INT32 count, LPVOID buffer ) } - /*********************************************************************** * CreateDiscardableBitmap16 (GDI.156) */ @@ -765,11 +868,17 @@ HBITMAP16 WINAPI CreateDiscardableBitmap16( HDC16 hdc, INT16 width, } -/*********************************************************************** - * CreateDiscardableBitmap32 (GDI32.38) +/****************************************************************************** + * CreateDiscardableBitmap32 [GDI32.38] Creates a discardable bitmap + * + * RETURNS + * Success: Handle to bitmap + * Failure: NULL */ -HBITMAP32 WINAPI CreateDiscardableBitmap32( HDC32 hdc, INT32 width, - INT32 height ) +HBITMAP32 WINAPI CreateDiscardableBitmap32( + HDC32 hdc, /* [in] Handle to device context */ + INT32 width, /* [in] Bitmap width */ + INT32 height) /* [in] Bitmap height */ { return CreateCompatibleBitmap32( hdc, width, height ); } @@ -777,6 +886,9 @@ HBITMAP32 WINAPI CreateDiscardableBitmap32( HDC32 hdc, INT32 width, /*********************************************************************** * GetBitmapDimensionEx16 (GDI.468) + * + * NOTES + * Can this call GetBitmapDimensionEx32? */ BOOL16 WINAPI GetBitmapDimensionEx16( HBITMAP16 hbitmap, LPSIZE16 size ) { @@ -788,10 +900,16 @@ BOOL16 WINAPI GetBitmapDimensionEx16( HBITMAP16 hbitmap, LPSIZE16 size ) } -/*********************************************************************** - * GetBitmapDimensionEx32 (GDI32.144) +/****************************************************************************** + * GetBitmapDimensionEx32 [GDI32.144] Retrieves dimensions of a bitmap + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ -BOOL32 WINAPI GetBitmapDimensionEx32( HBITMAP32 hbitmap, LPSIZE32 size ) +BOOL32 WINAPI GetBitmapDimensionEx32( + HBITMAP32 hbitmap, /* [in] Handle to bitmap */ + LPSIZE32 size) /* [out] Address of struct receiving dimensions */ { BITMAPOBJ * bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ); if (!bmp) return FALSE; @@ -829,11 +947,18 @@ BOOL16 WINAPI SetBitmapDimensionEx16( HBITMAP16 hbitmap, INT16 x, INT16 y, } -/*********************************************************************** - * SetBitmapDimensionEx32 (GDI32.304) +/****************************************************************************** + * SetBitmapDimensionEx32 [GDI32.304] Assignes dimensions to a bitmap + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ -BOOL32 WINAPI SetBitmapDimensionEx32( HBITMAP32 hbitmap, INT32 x, INT32 y, - LPSIZE32 prevSize ) +BOOL32 WINAPI SetBitmapDimensionEx32( + HBITMAP32 hbitmap, /* [in] Handle to bitmap */ + INT32 x, /* [in] Bitmap width */ + INT32 y, /* [in] Bitmap height */ + LPSIZE32 prevSize) /* [out] Address of structure for orig dims */ { BITMAPOBJ * bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ); if (!bmp) return FALSE; diff --git a/objects/clipping.c b/objects/clipping.c index 17360924bad..7025d74dd05 100644 --- a/objects/clipping.c +++ b/objects/clipping.c @@ -29,7 +29,7 @@ void CLIPPING_UpdateGCRegion( DC * dc ) if (!dc->w.hVisRgn) { - fprintf( stderr, "UpdateGCRegion: hVisRgn is zero. Please report this.\n" ); + ERR(region, "hVisRgn is zero. Please report this.\n" ); exit(1); } @@ -463,7 +463,7 @@ HRGN16 WINAPI SaveVisRgn( HDC16 hdc ) TRACE(clipping, "%04x\n", hdc ); if (!dc->w.hVisRgn) { - fprintf( stderr, "SaveVisRgn: hVisRgn is zero. Please report this.\n" ); + ERR(region, "hVisRgn is zero. Please report this.\n" ); exit(1); } if( dc->w.flags & DC_DIRTY ) UPDATE_DIRTY_DC(dc); diff --git a/objects/color.c b/objects/color.c index 9f37ebc270f..50779dcd333 100644 --- a/objects/color.c +++ b/objects/color.c @@ -288,7 +288,7 @@ static BOOL32 COLOR_BuildPrivateMap(CSPACE* cs) COLOR_sysPal = (PALETTEENTRY*)xmalloc(sizeof(PALETTEENTRY)*cs->size); - TRACE(palette,"\tbuilding private map - %i palette entries\n", cs->size); + TRACE(palette,"Building private map - %i palette entries\n", cs->size); /* Allocate system palette colors */ @@ -347,7 +347,7 @@ static BOOL32 COLOR_BuildSharedMap(CSPACE* cs) else if (COLOR_max < 20) COLOR_max = 20; TRACE(palette,"%d colors configured.\n", COLOR_max); - TRACE(palette,"\tbuilding shared map - %i palette entries\n", cs->size); + TRACE(palette,"Building shared map - %i palette entries\n", cs->size); /* Be nice and allocate system colors as read-only */ @@ -402,7 +402,7 @@ static BOOL32 COLOR_BuildSharedMap(CSPACE* cs) sysPixel[i] = color.pixel; - TRACE(palette,"\tsyscolor(%lx) -> pixel %i\n", + TRACE(palette,"syscolor(%lx) -> pixel %i\n", *(COLORREF*)(__sysPalTemplate+i), (int)color.pixel); /* Set EGA mapping if color in the first or last eight */ @@ -419,7 +419,7 @@ static BOOL32 COLOR_BuildSharedMap(CSPACE* cs) { int c_min = 0, c_max = cs->size, c_val; - TRACE(palette,"\tdynamic colormap... \n"); + TRACE(palette,"Dynamic colormap... \n"); /* comment this out if you want to debug palette init */ @@ -453,7 +453,7 @@ static BOOL32 COLOR_BuildSharedMap(CSPACE* cs) if( !TSXAllocColorCells(display, cs->colorMap, False, plane_masks, 0, pixDynMapping, c_min) ) { - fprintf(stderr,"Inexplicable failure during colorcell allocation.\n"); + WARN(palette,"Inexplicable failure during colorcell allocation.\n"); c_min = 0; } @@ -470,7 +470,7 @@ static BOOL32 COLOR_BuildSharedMap(CSPACE* cs) * to maintain compatibility */ cs->size = 256; - TRACE(palette,"\tvirtual colorspace - screendepth %i\n", screenDepth); + TRACE(palette,"Virtual colorspace - screendepth %i\n", screenDepth); } else cs->size = NB_RESERVED_COLORS; /* system palette only - however we can alloc a bunch * of colors and map to them */ @@ -529,7 +529,7 @@ static BOOL32 COLOR_BuildSharedMap(CSPACE* cs) else COLOR_PaletteToPixel[i] = i; - TRACE(palette,"\tindex %i -> pixel %i\n", i, COLOR_PaletteToPixel[i]); + TRACE(palette,"index %i -> pixel %i\n", i, COLOR_PaletteToPixel[i]); if( COLOR_PixelToPalette ) COLOR_PixelToPalette[COLOR_PaletteToPixel[i]] = i; @@ -798,7 +798,7 @@ COLORREF COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, COLORREF else if( spec_type == 1 ) /* PALETTEINDEX */ if( (i = color & 0x0000ffff) >= size ) { - fprintf(stderr, "\tRGB(%lx) : idx %d is out of bounds, assuming NULL\n", color, i); + WARN(palette, "RGB(%lx) : idx %d is out of bounds, assuming NULL\n", color, i); color = *(COLORREF*)palPalEntry; } else color = *(COLORREF*)(palPalEntry + i); @@ -888,7 +888,7 @@ int COLOR_ToPhysical( DC *dc, COLORREF color ) if( (idx = color & 0xffff) >= palPtr->logpalette.palNumEntries) { - fprintf(stderr, "\tRGB(%lx) : idx %d is out of bounds, assuming black\n", color, idx); + WARN(palette, "RGB(%lx) : idx %d is out of bounds, assuming black\n", color, idx); GDI_HEAP_UNLOCK( hPal ); return 0; } @@ -941,7 +941,7 @@ int COLOR_ToPhysical( DC *dc, COLORREF color ) if( !palPtr ) return 0; else if( !palPtr->mapping ) - WARN(palette, "\tpalette %04x is not realized\n", dc->w.hPalette); + WARN(palette, "Palette %04x is not realized\n", dc->w.hPalette); switch(spec_type) /* we have to peruse DC and system palette */ { @@ -960,24 +960,24 @@ int COLOR_ToPhysical( DC *dc, COLORREF color ) index = COLOR_PaletteLookupPixel( COLOR_sysPal, 256, COLOR_PaletteToPixel, color, FALSE); - /* TRACE(palette,"\tRGB(%lx) -> pixel %i\n", color, index); + /* TRACE(palette,"RGB(%lx) -> pixel %i\n", color, index); */ break; case 1: /* PALETTEINDEX */ index = color & 0xffff; if( index >= palPtr->logpalette.palNumEntries ) - fprintf(stderr, "\tRGB(%lx) : index %i is out of bounds\n", color, index); + WARN(palette, "RGB(%lx) : index %i is out of bounds\n", color, index); else if( palPtr->mapping ) index = palPtr->mapping[index]; - /* TRACE(palette,"\tPALETTEINDEX(%04x) -> pixel %i\n", (WORD)color, index); + /* TRACE(palette,"PALETTEINDEX(%04x) -> pixel %i\n", (WORD)color, index); */ break; case 2: /* PALETTERGB */ index = COLOR_PaletteLookupPixel( palPtr->logpalette.palPalEntry, palPtr->logpalette.palNumEntries, palPtr->mapping, color, FALSE); - /* TRACE(palette,"\tPALETTERGB(%lx) -> pixel %i\n", color, index); + /* TRACE(palette,"PALETTERGB(%lx) -> pixel %i\n", color, index); */ break; } @@ -1020,7 +1020,7 @@ int COLOR_SetMapping( PALETTEOBJ* palPtr, UINT32 uStart, UINT32 uNum, BOOL32 map index = *(WORD*)(palPtr->logpalette.palPalEntry + uStart); if( index > 255 || (index >= COLOR_gapStart && index <= COLOR_gapEnd) ) { - fprintf(stderr,"PC_EXPLICIT: idx %d out of system palette, assuming black.\n", index); + WARN(palette,"PC_EXPLICIT: idx %d out of system palette, assuming black.\n", index); index = 0; } break; @@ -1077,7 +1077,7 @@ int COLOR_SetMapping( PALETTEOBJ* palPtr, UINT32 uStart, UINT32 uNum, BOOL32 map if( !prevMapping || palPtr->mapping[uStart] != index ) iRemapped++; palPtr->mapping[uStart] = index; - TRACE(palette,"\tentry %i (%lx) -> pixel %i\n", uStart, + TRACE(palette,"entry %i (%lx) -> pixel %i\n", uStart, *(COLORREF*)(palPtr->logpalette.palPalEntry + uStart), index); } diff --git a/objects/cursoricon.c b/objects/cursoricon.c index 84170bfeb0d..36918eff337 100644 --- a/objects/cursoricon.c +++ b/objects/cursoricon.c @@ -44,6 +44,7 @@ #include "keyboard.h" extern UINT16 COLOR_GetSystemPaletteSize(); +extern void _XInitImageFuncPtrs(XImage *); Cursor CURSORICON_XCursor = None; /* Current X cursor */ static HCURSOR32 hActiveCursor = 0; /* Active cursor */ @@ -63,7 +64,7 @@ static ICONDIRENTRY *CURSORICON_FindBestIcon( CURSORICONDIR *dir, int width, if (dir->idCount < 1) { - fprintf( stderr, "Icon: empty directory!\n" ); + WARN(icon, "Empty directory!\n" ); return NULL; } if (dir->idCount == 1) return &dir->idEntries[0].icon; /* No choice... */ @@ -168,7 +169,7 @@ static CURSORDIRENTRY *CURSORICON_FindBestCursor( CURSORICONDIR *dir, if (dir->idCount < 1) { - fprintf( stderr, "Cursor: empty directory!\n" ); + WARN(cursor, "Empty directory!\n" ); return NULL; } if (dir->idCount == 1) return &dir->idEntries[0].cursor; /* No choice... */ @@ -278,7 +279,7 @@ static BOOL32 CURSORICON_LoadDirEntry32( HINSTANCE32 hInstance, LPCWSTR name, * Convert to mono when cFlag is LR_MONOCHROME. Do something * with cbSize parameter as well. */ -static HGLOBAL16 CURSORICON_CreateFromResource( HINSTANCE32 hInstance, HGLOBAL16 hObj, LPBYTE bits, +static HGLOBAL16 CURSORICON_CreateFromResource( HINSTANCE16 hInstance, HGLOBAL16 hObj, LPBYTE bits, UINT32 cbSize, BOOL32 bIcon, DWORD dwVersion, INT32 width, INT32 height, UINT32 cFlag ) { @@ -400,7 +401,7 @@ static HGLOBAL16 CURSORICON_CreateFromResource( HINSTANCE32 hInstance, HGLOBAL16 CURSORICONINFO *info; /* Make it owned by the module */ - if (hInstance) FarSetOwner( hObj, MODULE_HANDLEtoHMODULE16(hInstance)); + if (hInstance) FarSetOwner( hObj, GetExePtr(hInstance) ); info = (CURSORICONINFO *)GlobalLock16( hObj ); info->ptHotSpot.x = hotspot.x; @@ -571,7 +572,7 @@ static HGLOBAL32 CURSORICON_Load32( HINSTANCE32 hInstance, LPCWSTR name, if( !pRsrcEntry->ResourceHandle ) { LPBYTE bits = (LPBYTE)LockResource32( handle ); - h = CURSORICON_CreateFromResource( hInstance, 0, bits, dirEntry.icon.dwBytesInRes, + h = CURSORICON_CreateFromResource( 0, 0, bits, dirEntry.icon.dwBytesInRes, !fCursor, 0x00030000, width, height, LR_DEFAULTCOLOR ); pRsrcEntry->ResourceHandle = h; } @@ -1099,7 +1100,8 @@ static BOOL32 CURSORICON_SetCursor( HCURSOR16 hCursor ) while(hwnd) { Window win = WIN_GetXWindow( hwnd ); - if (win) XDefineCursor( display, win, cursor ); + if (win && win!=DefaultRootWindow(display)) + XDefineCursor( display, win, cursor ); hwnd = GetWindow32( hwnd, GW_HWNDNEXT ); } } @@ -1555,31 +1557,54 @@ HICON32 WINAPI CreateIconIndirect(LPICONINFO iconinfo) { return hObj; } + /********************************************************************** * DrawIconEx16 (USER.394) */ - BOOL16 WINAPI DrawIconEx16 (HDC16 hdc, INT16 xLeft, INT16 yTop, HICON16 hIcon, INT16 cxWidth, INT16 cyWidth, UINT16 istep, HBRUSH16 hbr, UINT16 flags) { - return DrawIconEx32 (hdc, xLeft, yTop, hIcon, cxWidth, cyWidth, - istep, hbr, flags); + return DrawIconEx32(hdc, xLeft, yTop, hIcon, cxWidth, cyWidth, + istep, hbr, flags); } -/********************************************************************** - * DrawIconEx32 (USER32.160) - */ -BOOL32 WINAPI DrawIconEx32 (HDC32 hdc, INT32 x0, INT32 y0, HICON32 hIcon, - INT32 cxWidth, INT32 cyWidth, UINT32 istep, - HBRUSH32 hbr, UINT32 flags) +/****************************************************************************** + * DrawIconEx32 [USER32.160] Draws an icon or cursor on device context + * + * NOTES + * Why is this using SM_CXICON instead of SM_CXCURSOR? + * + * PARAMS + * hdc [I] Handle to device context + * x0 [I] X coordinate of upper left corner + * y0 [I] Y coordinate of upper left corner + * hIcon [I] Handle to icon to draw + * cxWidth [I] Width of icon + * cyWidth [I] Height of icon + * istep [I] Index of frame in animated cursor + * hbr [I] Handle to background brush + * flags [I] Icon-drawing flags + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL32 WINAPI DrawIconEx32( HDC32 hdc, INT32 x0, INT32 y0, HICON32 hIcon, + INT32 cxWidth, INT32 cyWidth, UINT32 istep, + HBRUSH32 hbr, UINT32 flags ) { CURSORICONINFO *ptr = (CURSORICONINFO *)GlobalLock16 (hIcon); HDC32 hMemDC = CreateCompatibleDC32 (hdc); BOOL32 result = FALSE; - FIXME(icon, "part stub.\n"); + if (istep) + FIXME(icon, "Ignoring istep=%d\n", istep); + if (hbr) + FIXME(icon, "Ignoring hbr=%x\n", hbr); + if (flags & DI_COMPAT) + FIXME(icon, "Ignoring flag DI_COMPAT\n"); if (hMemDC && ptr) { diff --git a/objects/dc.c b/objects/dc.c index 8db9adcd1dd..6c71c18bfab 100644 --- a/objects/dc.c +++ b/objects/dc.c @@ -428,7 +428,7 @@ BOOL32 DC_SetupGCForText( DC * dc ) GCFont, &val ); return TRUE; } - fprintf( stderr, "DC_SetupGCForText: physical font failure\n" ); + WARN(dc, "Physical font failure\n" ); return FALSE; } @@ -911,7 +911,7 @@ BOOL32 WINAPI DeleteDC32( HDC32 hdc ) */ HDC16 WINAPI ResetDC16( HDC16 hdc, const DEVMODE16 *devmode ) { - fprintf( stderr, "ResetDC16: empty stub!\n" ); + FIXME(dc, "stub\n" ); return hdc; } @@ -921,7 +921,7 @@ HDC16 WINAPI ResetDC16( HDC16 hdc, const DEVMODE16 *devmode ) */ HDC32 WINAPI ResetDC32A( HDC32 hdc, const DEVMODE32A *devmode ) { - fprintf( stderr, "ResetDC32A: empty stub!\n" ); + FIXME(dc, "stub\n" ); return hdc; } @@ -931,7 +931,7 @@ HDC32 WINAPI ResetDC32A( HDC32 hdc, const DEVMODE32A *devmode ) */ HDC32 WINAPI ResetDC32W( HDC32 hdc, const DEVMODE32W *devmode ) { - fprintf( stderr, "ResetDC32A: empty stub!\n" ); + FIXME(dc, "stub\n" ); return hdc; } diff --git a/objects/dib.c b/objects/dib.c index 7dd033f4c8b..a5ae6e370df 100644 --- a/objects/dib.c +++ b/objects/dib.c @@ -77,7 +77,8 @@ int DIB_GetXImageWidthBytes( int width, int depth ) for( i = 0; bitmapDepthTable[i] ; i++ ) if( bitmapDepthTable[i] == depth ) return (4 * ((width * ximageDepthTable[i] + 31)/32)); - fprintf(stderr, "DIB: unsupported depth %d.\n", depth ); + + WARN(bitmap, "(%d): Unsupported depth\n", depth ); return (4 * width); } @@ -101,7 +102,7 @@ int DIB_GetDIBWidthBytes( int width, int depth ) case 24: words = (width * 3 + 3)/4; break; default: - fprintf(stderr, "DIB: unsupported depth %d.\n", depth ); + WARN(bitmap, "(%d): Unsupported depth\n", depth ); /* fall through */ case 32: words = width; @@ -161,8 +162,7 @@ static int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, DWORD *width, *bpp = core->bcBitCount; return 0; } - fprintf( stderr, "DIB_GetBitmapInfo: wrong size (%ld) for header\n", - header->biSize ); + WARN(bitmap, "(%ld): wrong size for header\n", header->biSize ); return -1; } @@ -825,7 +825,7 @@ static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr ) descr->width, descr->xSrc, descr->dc, bmpImage); break; default: - fprintf( stderr, "Invalid depth %d for SetDIBits!\n", descr->infoBpp ); + WARN(bitmap, "(%d): Invalid depth\n", descr->infoBpp ); break; } if (colorMapping) HeapFree( GetProcessHeap(), 0, colorMapping ); @@ -886,8 +886,21 @@ INT16 WINAPI SetDIBits16( HDC16 hdc, HBITMAP16 hbitmap, UINT16 startscan, } -/*********************************************************************** - * SetDIBits32 (GDI32.312) +/****************************************************************************** + * SetDIBits32 [GDI32.312] Sets pixels in a bitmap using colors from DIB + * + * PARAMS + * hdc [I] Handle to device context + * hbitmap [I] Handle to bitmap + * startscan [I] Starting scan line + * lines [I] Number of scan lines + * bits [I] Array of bitmap bits + * info [I] Address of structure with data + * coloruse [I] Type of color indexes to use + * + * RETURNS + * Success: Number of scan lines copied + * Failure: 0 */ INT32 WINAPI SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan, UINT32 lines, LPCVOID bits, const BITMAPINFO *info, @@ -1124,14 +1137,23 @@ INT16 WINAPI GetDIBits16( HDC16 hdc, HBITMAP16 hbitmap, UINT16 startscan, } -/*********************************************************************** - * GetDIBits32 (GDI32.170) +/****************************************************************************** + * GetDIBits32 [GDI32.170] Retrieves bits of bitmap and copies to buffer + * + * RETURNS + * Success: Number of scan lines copied from bitmap + * Failure: 0 * * http://www.microsoft.com/msdn/sdk/platforms/doc/sdk/win32/func/src/f30_14.htm */ -INT32 WINAPI GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan, - UINT32 lines, LPSTR bits, BITMAPINFO * info, - UINT32 coloruse ) +INT32 WINAPI GetDIBits32( + HDC32 hdc, /* [in] Handle to device context */ + HBITMAP32 hbitmap, /* [in] Handle to bitmap */ + UINT32 startscan, /* [in] First scan line to set in dest bitmap */ + UINT32 lines, /* [in] Number of scan lines to copy */ + LPSTR bits, /* [out] Address of array for bitmap bits */ + BITMAPINFO * info, /* [out] Address of structure with bitmap data */ + UINT32 coloruse) /* [in] RGB or palette index */ { DC * dc; BITMAPOBJ * bmp; @@ -1292,9 +1314,8 @@ INT32 WINAPI GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan, } break; default: - fprintf(stderr,"GetDIBits*: unsupported depth %d\n", - info->bmiHeader.biBitCount - ); + WARN(bitmap,"Unsupported depth %d\n", + info->bmiHeader.biBitCount); break; } @@ -1386,7 +1407,7 @@ HBITMAP32 WINAPI CreateDIBitmap32( HDC32 hdc, const BITMAPINFOHEADER *header, } else { - fprintf( stderr, "CreateDIBitmap: wrong size (%ld) for data\n", + WARN(bitmap, "(%ld): wrong size for data\n", data->bmiHeader.biSize ); return 0; } @@ -1422,11 +1443,11 @@ HBITMAP32 WINAPI CreateDIBSection32 (HDC32 hdc, BITMAPINFO *bmi, UINT32 usage, { HBITMAP32 res = 0; - fprintf(stderr, - "CreateDIBSection(%d,[w=%ld,h=%ld],%d,%p,0x%08x,%ld),semistub\n", + FIXME(bitmap, + "(%d,[w=%ld,h=%ld],%d,%p,0x%08x,%ld),semistub\n", hdc,bmi->bmiHeader.biWidth,bmi->bmiHeader.biHeight, - usage,bits,section,offset - ); + usage,bits,section,offset); + if (bmi->bmiHeader.biHeight < 0 ) bmi->bmiHeader.biHeight = -bmi->bmiHeader.biHeight; if (bmi->bmiHeader.biWidth < 0 ) bmi->bmiHeader.biWidth = -bmi->bmiHeader.biWidth; /* FIXME. The following line isn't quite right. */ @@ -1439,8 +1460,10 @@ HBITMAP32 WINAPI CreateDIBSection32 (HDC32 hdc, BITMAPINFO *bmi, UINT32 usage, /* FIXME: this is wrong! (bmBits is always NULL) */ if (bits) *bits = bmp.bmBits; /* hmpf */ - fprintf(stderr,"allocating %ld bytes of memory\n",bmi->bmiHeader.biWidth*bmi->bmiHeader.biHeight*4); - if (bits) *bits = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,bmi->bmiHeader.biWidth*bmi->bmiHeader.biHeight*4); + TRACE(bitmap,"allocating %ld bytes of memory\n", + bmi->bmiHeader.biWidth*bmi->bmiHeader.biHeight*4); + if (bits) *bits = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, + bmi->bmiHeader.biWidth*bmi->bmiHeader.biHeight*4); return res; } } diff --git a/objects/enhmetafile.c b/objects/enhmetafile.c index 9745666f4c7..d6b784fdc8f 100644 --- a/objects/enhmetafile.c +++ b/objects/enhmetafile.c @@ -22,7 +22,7 @@ HENHMETAFILE32 WINAPI GetEnhMetaFile32A( { HENHMETAFILE32 hmf = 0; ENHMETAHEADER h; - char *p; + BYTE *p; DWORD read; HFILE32 hf = CreateFile32A(lpszMetaFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); @@ -31,7 +31,7 @@ HENHMETAFILE32 WINAPI GetEnhMetaFile32A( if (read!=sizeof(ENHMETAHEADER)) return 0; SetFilePointer(hf, 0, NULL, FILE_BEGIN); /* hmf = CreateFileMapping32A( hf, NULL, NULL, NULL, NULL, "temp"); */ - hmf = GlobalAlloc32(GHND, h.nBytes); + hmf = GlobalAlloc32(GPTR, h.nBytes); p = GlobalLock32(hmf); if (!ReadFile(hf, p, h.nBytes, &read, NULL)) return 0; GlobalUnlock32(hmf); @@ -54,6 +54,7 @@ UINT32 WINAPI GetEnhMetaFileHeader( LPENHMETAHEADER p = GlobalLock32(hmf); if (!buf) return sizeof(ENHMETAHEADER); memmove(buf, p, MIN(sizeof(ENHMETAHEADER), bufsize)); + GlobalUnlock32(hmf); return MIN(sizeof(ENHMETAHEADER), bufsize); } @@ -105,6 +106,32 @@ UINT32 WINAPI GetEnhMetaFileDescription32W( return MIN(size,p->nDescription); } +/**************************************************************************** + * SetEnhMetaFileBits (GDI32.315) + * + * Creates an enhanced metafile by copying _bufsize_ bytes from _buf_. + */ +HENHMETAFILE32 WINAPI SetEnhMetaFileBits(UINT32 bufsize, const BYTE *buf) +{ + HENHMETAFILE32 hmf = GlobalAlloc32(GPTR, bufsize); + LPENHMETAHEADER h = GlobalLock32(hmf); + memmove(h, buf, bufsize); + GlobalUnlock32(hmf); + return hmf; +} + +/***************************************************************************** + * GetEnhMetaFileBits (GDI32.175) + * + */ +UINT32 WINAPI GetEnhMetaFileBits( + HENHMETAFILE32 hmf, + UINT32 bufsize, + LPBYTE buf +) { + return 0; +} + /***************************************************************************** * PlayEnhMetaFileRecord (GDI32.264) * @@ -142,11 +169,9 @@ BOOL32 WINAPI PlayEnhMetaFileRecord( } case EMR_EOF: break; - case EMR_GDICOMMENT: /* application defined and processed */ break; - case EMR_SETMAPMODE: { DWORD mode = mr->dParm[0]; @@ -212,7 +237,6 @@ BOOL32 WINAPI PlayEnhMetaFileRecord( IntersectClipRect32(hdc, left, top, right, bottom); break; } - case EMR_SELECTOBJECT: { DWORD obj = mr->dParm[0]; @@ -226,7 +250,6 @@ BOOL32 WINAPI PlayEnhMetaFileRecord( (handletable->objectHandle)[obj] = 0; break; } - case EMR_SETWINDOWORGEX: { DWORD x = mr->dParm[0], y = mr->dParm[1]; @@ -251,7 +274,6 @@ BOOL32 WINAPI PlayEnhMetaFileRecord( SetViewportExtEx32(hdc, x, y, NULL); break; } - case EMR_CREATEPEN: { DWORD obj = mr->dParm[0]; @@ -264,7 +286,7 @@ BOOL32 WINAPI PlayEnhMetaFileRecord( DWORD obj = mr->dParm[0]; DWORD style = mr->dParm[1], brush = mr->dParm[2]; LOGBRUSH32 *b = (LOGBRUSH32 *) &mr->dParm[3]; - /* FIXME: other args not handled */ + FIXME(metafile, "Some ExtCreatePen args not handled\n"); (handletable->objectHandle)[obj] = ExtCreatePen32(style, brush, b, 0, NULL); break; @@ -283,7 +305,6 @@ BOOL32 WINAPI PlayEnhMetaFileRecord( CreateFontIndirect32W((LOGFONT32W *) &(mr->dParm[1])); break; } - case EMR_MOVETOEX: { DWORD x = mr->dParm[0], y = mr->dParm[1]; @@ -310,14 +331,23 @@ BOOL32 WINAPI PlayEnhMetaFileRecord( Ellipse32(hdc, left, top, right, bottom); break; } - case EMR_POLYGON16: { - /* FIXME: 0-3 : a bounding rectangle? */ + /* 0-3 : a bounding rectangle? */ INT32 count = mr->dParm[4]; + FIXME(metafile, "Some Polygon16 args not handled\n"); Polygon16(hdc, (POINT16 *)&mr->dParm[5], count); break; } + case EMR_POLYLINE16: + { + /* 0-3 : a bounding rectangle? */ + INT32 count = mr->dParm[4]; + FIXME(metafile, "Some Polyline16 args not handled\n"); + Polyline16(hdc, (POINT16 *)&mr->dParm[5], count); + break; + } + #if 0 case EMR_POLYPOLYGON16: { @@ -338,6 +368,7 @@ BOOL32 WINAPI PlayEnhMetaFileRecord( /* 10-16: ??? */ LPWSTR str = (LPWSTR)& mr->dParm[17]; /* trailing info: dx array? */ + FIXME(metafile, "Many ExtTextOut args not handled\n"); ExtTextOut32W(hdc, x, y, flags, /* lpRect */ NULL, str, count, /* lpDx */ NULL); break; @@ -413,27 +444,61 @@ BOOL32 WINAPI PlayEnhMetaFile( INT32 count = ((LPENHMETAHEADER) p)->nHandles; HANDLETABLE32 *ht = (HANDLETABLE32 *)GlobalAlloc32(GPTR, sizeof(HANDLETABLE32)*count); + BOOL32 ret = FALSE; + if (lpRect) { + LPENHMETAHEADER h = (LPENHMETAHEADER) p; + FLOAT xscale = (h->rclBounds.right-h->rclBounds.left)/(lpRect->right-lpRect->left); + FLOAT yscale = (h->rclBounds.bottom-h->rclBounds.top)/(lpRect->bottom-lpRect->top); + XFORM xform = {xscale, 0, 0, yscale, 0, 0}; + /* xform.eDx = lpRect->left; + xform.eDy = lpRect->top; */ + FIXME(metafile, "play into rect doesn't work\n"); + if (!SetWorldTransform(hdc, &xform)) { + WARN(metafile, "World transform failed!\n"); + } + } + ht->objectHandle[0] = hmf; while (1) { PlayEnhMetaFileRecord(hdc, ht, p, count); if (p->iType == EMR_EOF) break; p = (void *) p + p->nSize; /* casted so that arithmetic is in bytes */ } - return FALSE; + GlobalUnlock32(hmf); + return TRUE; } /***************************************************************************** * DeleteEnhMetaFile (GDI32.68) + * + * Deletes an enhanced metafile and frees the associated storage. */ BOOL32 WINAPI DeleteEnhMetaFile(HENHMETAFILE32 hmf) { return !GlobalFree32(hmf); } /***************************************************************************** - * CopyEnhMetaFileA (GDI32.21) + * CopyEnhMetaFileA (GDI32.21) Duplicate an enhanced metafile + * + * */ -HENHMETAFILE32 WINAPI CopyEnhMetaFile32A(HENHMETAFILE32 hmf, LPCSTR file) { - return 0; +HENHMETAFILE32 WINAPI CopyEnhMetaFile32A( + HENHMETAFILE32 hmf, + LPCSTR file) +{ + if (!file) { + LPENHMETAHEADER h = GlobalLock32(hmf); + HENHMETAFILE32 hmf2 = GlobalAlloc32(GPTR, h->nBytes); + LPENHMETAHEADER h2 = GlobalLock32(hmf2); + if (!h2) return 0; + memmove(h2, h, h->nBytes); + GlobalUnlock32(hmf2); + GlobalUnlock32(hmf); + return hmf2; + } else { + FIXME(metafile, "write to file not implemented\n"); + return 0; + } } diff --git a/objects/font.c b/objects/font.c index 76948e8aa5c..7117e7e7098 100644 --- a/objects/font.c +++ b/objects/font.c @@ -221,12 +221,21 @@ HFONT16 WINAPI CreateFontIndirect16( const LOGFONT16 *font ) fontPtr = (FONTOBJ *) GDI_HEAP_LOCK( hFont ); memcpy( &fontPtr->logfont, font, sizeof(LOGFONT16) ); - TRACE(font,"(%i %i) '%s' %s %s => %04x\n", + TRACE(font,"(%i %i %i %i) '%s' %s %s => %04x\n", font->lfHeight, font->lfWidth, + font->lfEscapement, font->lfOrientation, font->lfFaceName ? font->lfFaceName : "NULL", font->lfWeight > 400 ? "Bold" : "", font->lfItalic ? "Italic" : "", hFont); + + if (font->lfEscapement != font->lfOrientation) { + /* this should really depend on whether GM_ADVANCED is set */ + fontPtr->logfont.lfOrientation = fontPtr->logfont.lfEscapement; + WARN(font, + "orientation angle %f set to escapement angle %f for new font %04x\n", + font->lfOrientation/10., font->lfEscapement/10., hFont); + } GDI_HEAP_UNLOCK( hFont ); } } @@ -1052,19 +1061,32 @@ BOOL16 WINAPI GetCharABCWidths16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar, BOOL32 WINAPI GetCharABCWidths32A(HDC32 hdc, UINT32 firstChar, UINT32 lastChar, LPABC32 abc ) { - /* No TrueType fonts in Wine so far */ - FIXME(font, "(%04x,%04x,%04x,%p): stub\n", hdc, firstChar, lastChar, abc ); - return FALSE; + return GetCharABCWidths32W( hdc, firstChar, lastChar, abc ); } -/*********************************************************************** - * GetCharABCWidths32W (GDI32.152) +/****************************************************************************** + * GetCharABCWidths32W [GDI32.152] Retrieves widths of characters in range + * + * PARAMS + * hdc [I] Handle of device context + * firstChar [I] First character in range to query + * lastChar [I] Last character in range to query + * abc [O] Address of character-width structure + * + * NOTES + * Only works with TrueType fonts + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ -BOOL32 WINAPI GetCharABCWidths32W(HDC32 hdc, UINT32 firstChar, UINT32 lastChar, - LPABC32 abc ) +BOOL32 WINAPI GetCharABCWidths32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar, + LPABC32 abc ) { - return GetCharABCWidths32A( hdc, firstChar, lastChar, abc ); + /* No TrueType fonts in Wine so far */ + FIXME(font, "(%04x,%04x,%04x,%p): stub\n", hdc, firstChar, lastChar, abc); + return FALSE; } diff --git a/objects/gdiobj.c b/objects/gdiobj.c index 8d060b04059..ae4ad7ebf1b 100644 --- a/objects/gdiobj.c +++ b/objects/gdiobj.c @@ -471,7 +471,7 @@ INT32 WINAPI GetObject32A( HANDLE32 handle, INT32 count, LPVOID buffer ) result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer ); break; default: - fprintf( stderr, "GetObject32: magic %04x not implemented\n", + FIXME(gdi, "Magic %04x not implemented\n", ptr->wMagic ); break; } @@ -527,8 +527,8 @@ DWORD WINAPI GetObjectType( HANDLE32 handle ) result = OBJ_METADC; break; - default: - fprintf( stderr, "GetObjectType: magic %04x not implemented\n", + default: + FIXME(gdi, "Magic %04x not implemented\n", ptr->wMagic ); break; } @@ -561,7 +561,7 @@ HANDLE32 WINAPI GetCurrentObject(HDC32 hdc,UINT32 type) case OBJ_BITMAP: return dc->w.hBitmap; default: /* the SDK only mentions those above */ - fprintf(stderr,"GetCurrentObject(%08x,%d), unknown type.\n",hdc,type); + WARN(gdi,"(%08x,%d): unknown type.\n",hdc,type); return 0; } } @@ -699,7 +699,7 @@ INT16 WINAPI EnumObjects16( HDC16 hdc, INT16 nObjType, break; default: - fprintf( stderr, "EnumObjects16: invalid type %d\n", nObjType ); + WARN(gdi, "(%d): Invalid type\n", nObjType ); break; } return retval; @@ -775,7 +775,7 @@ INT32 WINAPI EnumObjects32( HDC32 hdc, INT32 nObjType, default: /* FIXME: implement Win32 types */ - fprintf( stderr, "EnumObjects32: invalid type %d\n", nObjType ); + WARN( gdi, "(%d): Invalid type\n", nObjType ); break; } return retval; @@ -867,7 +867,7 @@ DWORD WINAPI GdiSeeGdiDo( WORD wReqType, WORD wParam1, WORD wParam2, case 0x0103: /* LocalHeap */ return GDI_HeapSel; default: - fprintf(stderr, "GdiSeeGdiDo: wReqType %04x (unknown)", wReqType); + WARN(gdi, "(wReqType=%04x): Unknown\n", wReqType); return (DWORD)-1; } } diff --git a/objects/metafile.c b/objects/metafile.c index ea424bc8df8..6e3d0b866a5 100644 --- a/objects/metafile.c +++ b/objects/metafile.c @@ -186,7 +186,7 @@ HMETAFILE32 WINAPI CopyMetaFile32A( METAHEADER *mh2; HFILE32 hFile; - TRACE(metafile,"%s\n", lpFilename); + TRACE(metafile,"(%08x,%s)\n", hSrcMetaFile, lpFilename); mh = (METAHEADER *)GlobalLock16(hSrcMetaFile); @@ -213,7 +213,8 @@ HMETAFILE32 WINAPI CopyMetaFile32A( memcpy(mh2,mh, mh->mtSize * 2); GlobalUnlock16(handle); } - + + GlobalUnlock16(hSrcMetaFile); return handle; } @@ -295,6 +296,8 @@ BOOL32 WINAPI PlayMetaFile32( TRACE(metafile,"(%04x %04x)\n",hdc,hmf); if (!mh) return FALSE; + + /* save the current pen, brush and font */ if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0; hPen = dc->w.hPen; hBrush = dc->w.hBrush; @@ -311,10 +314,11 @@ BOOL32 WINAPI PlayMetaFile32( while (offset < mh->mtSize * 2) { mr = (METARECORD *)((char *)mh + offset); - TRACE(metafile,"offset = %04x size = %08lx\n", - offset, mr->rdSize); + TRACE(metafile,"offset=%04x,size=%08lx\n", + offset, mr->rdSize); if (!mr->rdSize) { - fprintf(stderr,"METAFILE entry got size 0 at offset %d, total mf length is %ld\n",offset,mh->mtSize*2); + TRACE(metafile,"Entry got size 0 at offset %d, total mf length is %ld\n", + offset,mh->mtSize*2); break; /* would loop endlessly otherwise */ } offset += mr->rdSize * 2; @@ -423,6 +427,68 @@ BOOL16 WINAPI EnumMetaFile16( return result; } +BOOL32 WINAPI EnumMetaFile32( + HDC32 hdc, + HMETAFILE32 hmf, + MFENUMPROC32 lpEnumFunc, + LPARAM lpData +) { + METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf); + METARECORD *mr; + HANDLETABLE32 *ht; + BOOL32 result = TRUE; + int i, offset = 0; + DC *dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); + HPEN32 hPen; + HBRUSH32 hBrush; + HFONT32 hFont; + + TRACE(metafile,"(%08x,%08x,%p,%p)\n", + hdc, hmf, lpEnumFunc, lpData); + if (!mh) return 0; + + /* save the current pen, brush and font */ + if (!dc) return 0; + hPen = dc->w.hPen; + hBrush = dc->w.hBrush; + hFont = dc->w.hFont; + GDI_HEAP_UNLOCK(hdc); + + + ht = (HANDLETABLE32 *) GlobalAlloc32(GPTR, + sizeof(HANDLETABLE32) * mh->mtNoObjects); + + /* loop through metafile records */ + offset = mh->mtHeaderSize * 2; + + while (offset < (mh->mtSize * 2)) + { + mr = (METARECORD *)((char *)mh + offset); + if (!lpEnumFunc( hdc, ht, mr, mh->mtNoObjects, (LONG)lpData )) + { + result = FALSE; + break; + } + + offset += (mr->rdSize * 2); + } + + /* restore pen, brush and font */ + SelectObject32(hdc, hBrush); + SelectObject32(hdc, hPen); + SelectObject32(hdc, hFont); + + /* free objects in handle table */ + for(i = 0; i < mh->mtNoObjects; i++) + if(*(ht->objectHandle + i) != 0) + DeleteObject32(*(ht->objectHandle + i)); + + /* free handle table */ + GlobalFree32(ht); + GlobalUnlock16(hmf); + return result; +} + static BOOL32 MF_Meta_CreateRegion( METARECORD *mr, HRGN32 hrgn ); /****************************************************************** @@ -893,7 +959,16 @@ BOOL32 WINAPI PlayMetaFileRecord32( UINT32 handles ) { - PlayMetaFileRecord16(hdc, handletable, metarecord, handles); + HANDLETABLE16 * ht = (void *)GlobalAlloc32(GPTR, + handles*sizeof(HANDLETABLE16)); + int i = 0; + TRACE(metafile, "(%08x,%p,%p,%d)\n", hdc, handletable, metarecord, handles); + for (i=0; iobjectHandle[i] = handletable->objectHandle[i]; + PlayMetaFileRecord16(hdc, ht, metarecord, handles); + for (i=0; iobjectHandle[i] = ht->objectHandle[i]; + GlobalFree32(ht); return TRUE; } @@ -961,11 +1036,39 @@ HMETAFILE32 WINAPI SetMetaFileBitsEx( { HMETAFILE32 hmf = GlobalAlloc16(GHND, size); BYTE *p = GlobalLock16(hmf) ; + TRACE(metafile, "(%d,%p) returning %08x\n", size, lpData, hmf); + if (!hmf || !p) return 0; memcpy(p, lpData, size); GlobalUnlock16(hmf); return hmf; } +/***************************************************************** + * GetMetaFileBitsEx (GDI32.198) Get raw metafile data + * + * Copies the data from metafile _hmf_ into the buffer _buf_. + * If _buf_ is zero, returns size of buffer required. Otherwise, + * returns number of bytes copied. + */ +UINT32 WINAPI GetMetaFileBitsEx( + HMETAFILE32 hmf, /* metafile */ + UINT32 nSize, /* size of buf */ + LPVOID buf /* buffer to receive raw metafile data */ +) { + METAHEADER *h = GlobalLock16(hmf); + TRACE(metafile, "(%08x,%d,%p)\n", hmf, nSize, buf); + if (!h) return 0; /* FIXME: error code */ + if (!buf) { + GlobalUnlock16(hmf); + TRACE(metafile,"returning size %d\n", h->mtSize); + return h->mtSize; + } + memmove(buf, h, MIN(nSize, h->mtSize)); + GlobalUnlock16(hmf); + return MIN(nSize, h->mtSize); +} + + /****************************************************************** * MF_Meta_CreateRegion * @@ -1008,20 +1111,20 @@ static BOOL32 MF_Meta_CreateRegion( METARECORD *mr, HRGN32 hrgn ) for(band = 0, start = &(mr->rdParam[11]); band < mr->rdParam[5]; band++, start = end + 1) { if(*start / 2 != (*start + 1) / 2) { - fprintf(stderr, "META_CREATEREGION: delimiter not even.\n"); + WARN(metafile, "Delimiter not even.\n"); DeleteObject32( hrgn2 ); return FALSE; } end = start + *start + 3; if(end > (WORD *)mr + mr->rdSize) { - WARN(metafile, "META_CREATEREGION: end points outside record.\n"); + WARN(metafile, "End points outside record.\n"); DeleteObject32( hrgn2 ); return FALSE; } if(*start != *end) { - WARN(metafile, "META_CREATEREGION: mismatched delimiters.\n"); + WARN(metafile, "Mismatched delimiters.\n"); DeleteObject32( hrgn2 ); return FALSE; } @@ -1384,7 +1487,7 @@ BOOL32 MF_ExtTextOut(DC*dc, short x, short y, UINT16 flags, const RECT16 *rect, METARECORD *mr; if((!flags && rect) || (flags && !rect)) - fprintf(stderr, "MF_ExtTextOut: Inconsistent flags and rect\n"); + WARN(metafile, "Inconsistent flags and rect\n"); len = sizeof(METARECORD) + (((count + 1) >> 1) * 2) + 2 * sizeof(short) + sizeof(UINT16); if(rect) diff --git a/objects/oembitmap.c b/objects/oembitmap.c index f7b83ce40f3..9f2cd4b5e8f 100644 --- a/objects/oembitmap.c +++ b/objects/oembitmap.c @@ -410,7 +410,7 @@ HBITMAP16 OBM_LoadBitmap( WORD id ) if (!CALL_LARGE_STACK( OBM_CreateBitmaps, &descr )) { LeaveCriticalSection( &X11DRV_CritSection ); - fprintf( stderr, "Error creating OEM bitmap %d\n", OBM_FIRST+id ); + WARN(bitmap, "Error creating OEM bitmap %d\n", OBM_FIRST+id ); return 0; } LeaveCriticalSection( &X11DRV_CritSection ); @@ -462,7 +462,7 @@ HGLOBAL16 OBM_LoadCursorIcon( WORD id, BOOL32 fCursor ) if (!CALL_LARGE_STACK( OBM_CreateBitmaps, &descr )) { LeaveCriticalSection( &X11DRV_CritSection ); - fprintf( stderr, "Error creating OEM cursor/icon %d\n", id ); + WARN(cursor, "Error creating OEM cursor/icon %d\n", id ); return 0; } LeaveCriticalSection( &X11DRV_CritSection ); diff --git a/objects/pen.c b/objects/pen.c index 79ca82c13f5..e9ee9a83c9f 100644 --- a/objects/pen.c +++ b/objects/pen.c @@ -85,10 +85,10 @@ HPEN32 WINAPI ExtCreatePen32( DWORD style, DWORD width, LOGPEN32 logpen; if ((style & PS_STYLE_MASK) == PS_USERSTYLE) - fprintf(stderr, "ExtCreatePen: PS_USERSTYLE not handled\n"); + FIXME(gdi, "PS_USERSTYLE not handled\n"); if ((style & PS_TYPE_MASK) == PS_GEOMETRIC) if (brush->lbHatch) - fprintf(stderr, "ExtCreatePen: Hatches not implemented\n"); + FIXME(gdi, "Hatches not implemented\n"); logpen.lopnStyle = style & ~PS_TYPE_MASK; logpen.lopnWidth.x = (style & PS_GEOMETRIC) ? width : 1; diff --git a/objects/region.c b/objects/region.c index 8572d56a78c..9f771ed79ac 100644 --- a/objects/region.c +++ b/objects/region.c @@ -536,15 +536,15 @@ HRGN32 WINAPI ExtCreateRegion( XFORM *lpXform, DWORD dwCount, RGNDATA *rgndata) lpXform, dwCount, rgndata, hrgn); if(!hrgn) { - fprintf(stderr, "ExtCreateRegion can't create a region!\n"); + WARN(region, "Can't create a region!\n"); return 0; } if(lpXform) - fprintf(stderr, "ExtCreateRegion: Xform not implemented - ignoring\n"); + WARN(region, "Xform not implemented - ignoring\n"); if(rgndata->rdh.iType != RDH_RECTANGLES) { - fprintf(stderr, "ExtCreateRegion: type not RDH_RECTANGLES\n"); + WARN(region, "Type not RDH_RECTANGLES\n"); GDI_HEAP_UNLOCK( hrgn ); DeleteObject32( hrgn ); return 0; @@ -1923,7 +1923,7 @@ static void REGION_InsertEdgeInET(EdgeTable *ET, EdgeTableEntry *ETE, tmpSLLBlock = HeapAlloc( SystemHeap, 0, sizeof(ScanLineListBlock)); if(!tmpSLLBlock) { - fprintf(stderr, "REGION_InsertEdgeInET(): Can't alloc SLLB\n"); + WARN(region, "Can't alloc SLLB\n"); return; } (*SLLBlock)->next = tmpSLLBlock; @@ -2371,8 +2371,7 @@ HRGN32 WINAPI CreatePolyPolygonRgn32(const POINT32 *Pts, const INT32 *Count, if (iPts == NUMPTSTOBUFFER) { tmpPtBlock = HeapAlloc( SystemHeap, 0, sizeof(POINTBLOCK)); if(!tmpPtBlock) { - fprintf(stderr, - "CreatePolyPolygonRgn(): can't alloc tPB\n"); + WARN(region, "Can't alloc tPB\n"); return 0; } curPtBlock->next = tmpPtBlock; @@ -2423,8 +2422,7 @@ HRGN32 WINAPI CreatePolyPolygonRgn32(const POINT32 *Pts, const INT32 *Count, tmpPtBlock = HeapAlloc( SystemHeap, 0, sizeof(POINTBLOCK) ); if(!tmpPtBlock) { - fprintf(stderr, - "CreatePolyPolygonRgn(): can't alloc tPB\n"); + WARN(region, "Can't alloc tPB\n"); return 0; } curPtBlock->next = tmpPtBlock; diff --git a/ole/compobj.c b/ole/compobj.c index fc6346bd533..ce448064ad8 100644 --- a/ole/compobj.c +++ b/ole/compobj.c @@ -288,7 +288,7 @@ OLESTATUS WINAPI StringFromCLSID16( (LPVOID)args, (LPDWORD)idstr )) { - fprintf(stderr,"CallTo16 IMalloc16 failed\n"); + WARN(ole,"CallTo16 IMalloc16 failed\n"); return E_FAIL; } return WINE_StringFromCLSID(id,PTR_SEG_TO_LIN(*idstr)); @@ -395,7 +395,7 @@ OLESTATUS WINAPI CLSIDFromProgID32( * LookupETask (COMPOBJ.94) */ OLESTATUS WINAPI LookupETask(LPVOID p1,LPVOID p2) { - fprintf(stderr,"LookupETask(%p,%p),stub!\n",p1,p2); + FIXME(ole,"(%p,%p),stub!\n",p1,p2); return 0; } @@ -403,7 +403,7 @@ OLESTATUS WINAPI LookupETask(LPVOID p1,LPVOID p2) { * LookupETask (COMPOBJ.201) */ OLESTATUS WINAPI CallObjectInWOW(LPVOID p1,LPVOID p2) { - fprintf(stderr,"CallObjectInWOW(%p,%p),stub!\n",p1,p2); + FIXME(ole,"(%p,%p),stub!\n",p1,p2); return 0; } @@ -539,7 +539,7 @@ VOID WINAPI CoTaskMemFree( * CoInitializeWOW (OLE32.27) */ HRESULT WINAPI CoInitializeWOW(DWORD x,DWORD y) { - fprintf(stderr,"CoInitializeWOW(0x%08lx,0x%08lx),stub!\n",x,y); + FIXME(ole,"(0x%08lx,0x%08lx),stub!\n",x,y); return 0; } @@ -551,6 +551,6 @@ HRESULT WINAPI CoLockObjectExternal16( BOOL16 fLock, /* [in] do lock */ BOOL16 fLastUnlockReleases /* [in] ? */ ) { - fprintf(stderr,"CoLockObjectExternal(%p,%d,%d),stub!\n",pUnk,fLock,fLastUnlockReleases); + FIXME(ole,"(%p,%d,%d),stub!\n",pUnk,fLock,fLastUnlockReleases); return S_OK; } diff --git a/ole/folders.c b/ole/folders.c index 7903e899f1d..6d159f518a3 100644 --- a/ole/folders.c +++ b/ole/folders.c @@ -19,14 +19,14 @@ */ static ULONG WINAPI IEnumIDList_AddRef(LPENUMIDLIST this) { - fprintf(stderr,"IEnumIDList(%p)->AddRef()\n",this); + TRACE(ole,"(%p)->()\n",this); return ++(this->ref); } static ULONG WINAPI IEnumIDList_Release(LPENUMIDLIST this) { - fprintf(stderr,"IEnumIDList(%p)->Release()\n",this); + TRACE(ole,"(%p)->()\n",this); if (!--(this->ref)) { - fprintf(stderr," -> freeing IEnumIDList(%p)\n",this); + WARN(ole," freeing IEnumIDList(%p)\n",this); HeapFree(GetProcessHeap(),0,this); return 0; } @@ -36,7 +36,7 @@ static ULONG WINAPI IEnumIDList_Release(LPENUMIDLIST this) { static HRESULT WINAPI IEnumIDList_Next( LPENUMIDLIST this,ULONG celt,LPITEMIDLIST *rgelt,ULONG *pceltFetched ) { - fprintf(stderr,"IEnumIDList(%p)->Next(%ld,%p,%p),stub!\n", + FIXME(ole,"(%p)->(%ld,%p,%p),stub!\n", this,celt,rgelt,pceltFetched ); *pceltFetched = 0; /* we don't have any ... */ @@ -66,9 +66,9 @@ LPENUMIDLIST IEnumIDList_Constructor() { * IShellFolder implementation */ static ULONG WINAPI IShellFolder_Release(LPSHELLFOLDER this) { - fprintf(stderr,"IShellFolder(%p)->Release()\n",this); + TRACE(ole,"(%p)->()\n",this); if (!--(this->ref)) { - fprintf(stderr," -> freeing IShellFolder(%p)\n",this); + WARN(ole," freeing IShellFolder(%p)\n",this); HeapFree(GetProcessHeap(),0,this); return 0; } @@ -76,14 +76,14 @@ static ULONG WINAPI IShellFolder_Release(LPSHELLFOLDER this) { } static ULONG WINAPI IShellFolder_AddRef(LPSHELLFOLDER this) { - fprintf(stderr,"IShellFolder(%p)->AddRef()\n",this); + TRACE(ole,"(%p)->()\n",this); return ++(this->ref); } static HRESULT WINAPI IShellFolder_GetAttributesOf( LPSHELLFOLDER this,UINT32 cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut ) { - fprintf(stderr,"IShellFolder(%p)->GetAttributesOf(%d,%p,%p),stub!\n", + FIXME(ole,"(%p)->(%d,%p,%p),stub!\n", this,cidl,apidl,rgfInOut ); return 0; @@ -95,7 +95,7 @@ static HRESULT WINAPI IShellFolder_BindToObject( char xclsid[50]; WINE_StringFromCLSID(riid,xclsid); - fprintf(stderr,"IShellFolder(%p)->BindToObject(%p,%p,%s,%p),stub!\n", + FIXME(ole,"(%p)->(%p,%p,%s,%p),stub!\n", this,pidl,pbcReserved,xclsid,ppvOut ); *ppvOut = IShellFolder_Constructor(); @@ -107,7 +107,7 @@ static HRESULT WINAPI IShellFolder_ParseDisplayName( LPOLESTR32 lpszDisplayName,DWORD *pchEaten,LPITEMIDLIST *ppidl, DWORD *pdwAttributes ) { - fprintf(stderr,"IShellFolder(%p)->ParseDisplayName(%08x,%p,%p,%p,%p,%p),stub!\n", + FIXME(ole,"(%p)->(%08x,%p,%p,%p,%p,%p),stub!\n", this,hwndOwner,pbcReserved,lpszDisplayName,pchEaten,ppidl,pdwAttributes ); *(DWORD*)pbcReserved = 0; @@ -118,7 +118,7 @@ static HRESULT WINAPI IShellFolder_EnumObjects( LPSHELLFOLDER this,HWND32 hwndOwner,DWORD grfFlags, LPENUMIDLIST* ppenumIDList ) { - fprintf(stderr,"IShellFolder(%p)->EnumObjects(0x%04x,0x%08lx,%p),stub!\n", + FIXME(ole,"(%p)->(0x%04x,0x%08lx,%p),stub!\n", this,hwndOwner,grfFlags,ppenumIDList ); *ppenumIDList = IEnumIDList_Constructor(); @@ -131,7 +131,7 @@ static HRESULT WINAPI IShellFolder_CreateViewObject( char xclsid[50]; WINE_StringFromCLSID(riid,xclsid); - fprintf(stderr,"IShellFolder(%p)->CreateViewObject(0x%04x,%s,%p),stub!\n", + FIXME(ole,"(%p)->(0x%04x,%s,%p),stub!\n", this,hwndOwner,xclsid,ppv ); *(DWORD*)ppv = 0; diff --git a/ole/ifs.c b/ole/ifs.c index 6f24584ecc3..2980ed132af 100644 --- a/ole/ifs.c +++ b/ole/ifs.c @@ -137,29 +137,25 @@ static IMalloc16_VTable *msegvt16 = NULL; LPMALLOC16 IMalloc16_Constructor() { LPMALLOC16 this; + HMODULE16 hcomp = GetModuleHandle16("COMPOBJ"); this = (LPMALLOC16)SEGPTR_NEW(IMalloc16); - if (__winelib) { - this->lpvtbl = &mvt16; - } else { - HMODULE16 hcomp = GetModuleHandle16("COMPOBJ"); - if (!msegvt16) { - this->lpvtbl = msegvt16 = SEGPTR_NEW(IMalloc16_VTable); + if (!msegvt16) { + this->lpvtbl = msegvt16 = SEGPTR_NEW(IMalloc16_VTable); -#define FN(x) this->lpvtbl->fn##x = (void*)WIN32_GetProcAddress16(hcomp,"IMalloc16_"#x);assert(this->lpvtbl->fn##x); - FN(QueryInterface) - FN(AddRef) - FN(Release) - FN(Alloc) - FN(Realloc) - FN(Free) - FN(GetSize) - FN(DidAlloc) - FN(HeapMinimize) - msegvt16 = (LPMALLOC16_VTABLE)SEGPTR_GET(msegvt16); +#define FN(x) this->lpvtbl->fn##x = (void*)WIN32_GetProcAddress16(hcomp,"IMalloc16_"#x);assert(this->lpvtbl->fn##x) + FN(QueryInterface); + FN(AddRef); + FN(Release); + FN(Alloc); + FN(Realloc); + FN(Free); + FN(GetSize); + FN(DidAlloc); + FN(HeapMinimize); + msegvt16 = (LPMALLOC16_VTABLE)SEGPTR_GET(msegvt16); #undef FN - } - this->lpvtbl = msegvt16; + this->lpvtbl = msegvt16; } this->ref = 1; /* FIXME: implement multiple heaps */ diff --git a/ole/moniker.c b/ole/moniker.c index 17365cd92ff..7904ab858e8 100644 --- a/ole/moniker.c +++ b/ole/moniker.c @@ -28,6 +28,6 @@ CreateFileMoniker16( LPCOLESTR16 lpszPathName, /* [in] pathname */ LPMONIKER * ppmk /* [out] new moniker object */ ) { - fprintf(stderr,"CreateFileMoniker(%s,%p),stub!\n",lpszPathName,ppmk); + FIXME(ole,"(%s,%p),stub!\n",lpszPathName,ppmk); return E_FAIL; } diff --git a/ole/ole2.c b/ole/ole2.c index d6e42323d1a..577c41dd5fb 100644 --- a/ole/ole2.c +++ b/ole/ole2.c @@ -66,7 +66,7 @@ HRESULT WINAPI CoRegisterMessageFilter32( * OleInitializeWOW (OLE32.27) */ HRESULT WINAPI OleInitializeWOW(DWORD x) { - fprintf(stderr,"OleInitializeWOW(0x%08lx),stub!\n",x); + FIXME(ole,"(0x%08lx),stub!\n",x); return 0; } @@ -74,7 +74,7 @@ HRESULT WINAPI OleInitializeWOW(DWORD x) { * GetRunningObjectTable (OLE2.30) */ HRESULT WINAPI GetRunningObjectTable16(DWORD reserved, LPVOID *pprot) { - fprintf(stderr,"GetRunningObjectTable(%ld,%p),stub!\n",reserved,pprot); + FIXME(ole,"(%ld,%p),stub!\n",reserved,pprot); return E_FAIL; } @@ -85,7 +85,7 @@ HRESULT WINAPI RegisterDragDrop16( HWND16 hwnd, LPDROPTARGET pDropTarget ) { - fprintf(stderr,"RegisterDragDrop(0x%04x,%p),stub!\n",hwnd,pDropTarget); + FIXME(ole,"(0x%04x,%p),stub!\n",hwnd,pDropTarget); return S_OK; } diff --git a/ole/ole2disp.c b/ole/ole2disp.c index 38d339944f9..169f30ce3cd 100644 --- a/ole/ole2disp.c +++ b/ole/ole2disp.c @@ -7,6 +7,7 @@ #include "windows.h" #include "ole.h" #include "ole2.h" +#include "oleauto.h" #include "interfaces.h" #include "heap.h" #include "ldt.h" @@ -16,20 +17,18 @@ represents BSTR as a 16:16 far pointer, and the strings as ISO-8859 */ -typedef DWORD BSTR; - -static BSTR BSTR_AllocBytes(int n) +static BSTR16 BSTR_AllocBytes(int n) { void *ptr = SEGPTR_ALLOC(n); - return SEGPTR_GET(ptr); + return (BSTR16)SEGPTR_GET(ptr); } -static void BSTR_Free(BSTR in) +static void BSTR_Free(BSTR16 in) { SEGPTR_FREE( PTR_SEG_TO_LIN(in) ); } -static void* BSTR_GetAddr(BSTR in) +static void* BSTR_GetAddr(BSTR16 in) { return in ? PTR_SEG_TO_LIN(in) : 0; } @@ -37,31 +36,50 @@ static void* BSTR_GetAddr(BSTR in) /*********************************************************************** * SysAllocString [OLE2DISP.2] */ -BSTR WINAPI SysAllocString(char *in) +BSTR16 WINAPI SysAllocString16(LPOLESTR16 in) { - BSTR out=BSTR_AllocBytes(strlen(in)+1); + BSTR16 out=BSTR_AllocBytes(strlen(in)+1); if(!out)return 0; strcpy(BSTR_GetAddr(out),in); return out; } +/*********************************************************************** + * SysAllocString [OLEAUT32.2] + */ +BSTR32 WINAPI SysAllocString32(LPOLESTR32 in) +{ + return HEAP_strdupW(GetProcessHeap(),0,in); +} + /*********************************************************************** * SysReAllocString [OLE2DISP.3] */ -int WINAPI SysReAllocString(BSTR *old,char *in) +INT16 WINAPI SysReAllocString16(LPBSTR16 old,LPOLESTR16 in) { - BSTR new=SysAllocString(in); + BSTR16 new=SysAllocString16(in); BSTR_Free(*old); *old=new; return 1; } +/*********************************************************************** + * SysReAllocString [OLEAUT32.3] + */ +INT32 WINAPI SysReAllocString32(LPBSTR32 old,LPOLESTR32 in) +{ + BSTR32 new=SysAllocString32(in); + HeapFree(GetProcessHeap(),0,*old); + *old=new; + return 1; +} + /*********************************************************************** * SysAllocStringLen [OLE2DISP.4] */ -BSTR WINAPI SysAllocStringLen(char *in, int len) +BSTR16 WINAPI SysAllocStringLen16(char *in, int len) { - BSTR out=BSTR_AllocBytes(len+1); + BSTR16 out=BSTR_AllocBytes(len+1); if(!out)return 0; strcpy(BSTR_GetAddr(out),in); return out; @@ -70,9 +88,9 @@ BSTR WINAPI SysAllocStringLen(char *in, int len) /*********************************************************************** * SysReAllocStringLen [OLE2DISP.5] */ -int WINAPI SysReAllocStringLen(BSTR *old,char *in,int len) +int WINAPI SysReAllocStringLen16(BSTR16 *old,char *in,int len) { - BSTR new=SysAllocStringLen(in,len); + BSTR16 new=SysAllocStringLen16(in,len); BSTR_Free(*old); *old=new; return 1; @@ -81,25 +99,29 @@ int WINAPI SysReAllocStringLen(BSTR *old,char *in,int len) /*********************************************************************** * SysFreeString [OLE2DISP.6] */ -void WINAPI SysFreeString(BSTR in) +void WINAPI SysFreeString16(BSTR16 in) { BSTR_Free(in); } +/*********************************************************************** + * SysFreeString [OLEAUT32.6] + */ +void WINAPI SysFreeString32(BSTR32 in) +{ + HeapFree(GetProcessHeap(),0,in); +} + /*********************************************************************** * SysStringLen [OLE2DISP.7] */ -int WINAPI SysStringLen(BSTR str) +int WINAPI SysStringLen16(BSTR16 str) { return strlen(BSTR_GetAddr(str)); } -OLESTATUS WINAPI CreateDispTypeInfo( - INTERFACEDATA * pidata, - LCID lcid, - LPVOID * * pptinfo) /* ITypeInfo */ -{ - fprintf(stderr,"CreateDispTypeInfo(%p,%ld,%p),stub\n",pidata,lcid,pptinfo); +OLESTATUS WINAPI CreateDispTypeInfo(INTERFACEDATA * pidata,LCID lcid,LPVOID/*ITypeInfo*/ * * pptinfo) { + FIXME(ole,"(%p,%ld,%p),stub\n",pidata,lcid,pptinfo); return 0; } @@ -108,6 +130,6 @@ OLESTATUS WINAPI RegisterActiveObject( ) { char buf[80]; WINE_StringFromCLSID(rclsid,buf); - fprintf(stderr,"RegisterActiveObject(%p,%s,0x%08lx,%p),stub\n",punk,buf,dwFlags,pdwRegister); + FIXME(ole,"RegisterActiveObject(%p,%s,0x%08lx,%p),stub\n",punk,buf,dwFlags,pdwRegister); return 0; } diff --git a/ole/ole2nls.c b/ole/ole2nls.c index a0d560811b4..ec8d0388441 100644 --- a/ole/ole2nls.c +++ b/ole/ole2nls.c @@ -528,120 +528,105 @@ LOCVAL(LOCALE_INEGSEPBYSPACE, "0") case LANG_En: switch (LCType) { -LOCVAL(LOCALE_ILANGUAGE,"9") -LOCVAL(LOCALE_SLANGUAGE,"English") -LOCVAL(LOCALE_SENGLANGUAGE,"English") -LOCVAL(LOCALE_SABBREVLANGNAME,"en") -LOCVAL(LOCALE_SNATIVELANGNAME,"English") -LOCVAL(LOCALE_ICOUNTRY,"11") -LOCVAL(LOCALE_SCOUNTRY,"United States") -LOCVAL(LOCALE_SENGCOUNTRY,"United States") -LOCVAL(LOCALE_SABBREVCTRYNAME,"US") -LOCVAL(LOCALE_SNATIVECTRYNAME,"United States") -LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9") -LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49") -LOCVAL(LOCALE_IDEFAULTCODEPAGE,"437") -/* Dunno -LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) -*/ -LOCVAL(LOCALE_SLIST,";") -LOCVAL(LOCALE_IMEASURE,"0") -LOCVAL(LOCALE_SDECIMAL,".") -LOCVAL(LOCALE_STHOUSAND,",") +LOCVAL(LOCALE_ILANGUAGE, "0409") +LOCVAL(LOCALE_SLANGUAGE, "English (United States)") +LOCVAL(LOCALE_SENGLANGUAGE, "English") +LOCVAL(LOCALE_SABBREVLANGNAME, "ENU") +LOCVAL(LOCALE_SNATIVELANGNAME, "English") +LOCVAL(LOCALE_ICOUNTRY, "1") +LOCVAL(LOCALE_SCOUNTRY, "United States") +LOCVAL(LOCALE_SENGCOUNTRY, "United States") +LOCVAL(LOCALE_SABBREVCTRYNAME, "USA") +LOCVAL(LOCALE_SNATIVECTRYNAME, "United States") +LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409") +LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1") +LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437") +LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252") +LOCVAL(LOCALE_SLIST, ",") +LOCVAL(LOCALE_IMEASURE, "1") +LOCVAL(LOCALE_SDECIMAL, ".") +LOCVAL(LOCALE_STHOUSAND, ",") LOCVAL(LOCALE_SGROUPING, "3;0") -LOCVAL(LOCALE_IDIGITS,"2") -LOCVAL(LOCALE_ILZERO,"1") -/* -LOCVAL(LOCALE_INEGNUMBER) -Is this "0123456789" ?? -LOCVAL(LOCALE_SNATIVEDIGITS) -*/ -LOCVAL(LOCALE_SCURRENCY,"DM") +LOCVAL(LOCALE_IDIGITS, "2") +LOCVAL(LOCALE_ILZERO, "1") +LOCVAL(LOCALE_INEGNUMBER, "1") +LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789") +LOCVAL(LOCALE_SCURRENCY, "$") LOCVAL(LOCALE_SINTLSYMBOL, "USD") LOCVAL(LOCALE_SMONDECIMALSEP, ".") -LOCVAL(LOCALE_SMONTHOUSANDSEP, ".") +LOCVAL(LOCALE_SMONTHOUSANDSEP, ",") LOCVAL(LOCALE_SMONGROUPING, "3;0") -LOCVAL(LOCALE_ICURRDIGITS,"2") -LOCVAL(LOCALE_IINTLCURRDIGITS,"2") -LOCVAL(LOCALE_ICURRENCY,"3") -LOCVAL(LOCALE_INEGCURR,"8") -LOCVAL(LOCALE_SDATE,".") -LOCVAL(LOCALE_STIME,":") -LOCVAL(LOCALE_SSHORTDATE,"MM/dd/yy") -LOCVAL(LOCALE_SLONGDATE,"ddd, MMMM d\'th\', yyyy") +LOCVAL(LOCALE_ICURRDIGITS, "2") +LOCVAL(LOCALE_IINTLCURRDIGITS, "2") +LOCVAL(LOCALE_ICURRENCY, "0") +LOCVAL(LOCALE_INEGCURR, "0") +LOCVAL(LOCALE_SDATE, "/") +LOCVAL(LOCALE_STIME, ":") +LOCVAL(LOCALE_SSHORTDATE, "M/d/yy") +LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy") LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt") -LOCVAL(LOCALE_IDATE,"1") -/* -LOCVAL(LOCALE_ILDATE) -*/ -LOCVAL(LOCALE_ITIME,"1") -/* -LOCVAL(LOCALE_ITIMEMARKPOSN) -LOCVAL(LOCALE_ICENTURY) -*/ -LOCVAL(LOCALE_ITLZERO,"1") -/* -LOCVAL(LOCALE_IDAYLZERO) -LOCVAL(LOCALE_IMONLZERO) -*/ -LOCVAL(LOCALE_S1159,"AM") -LOCVAL(LOCALE_S2359,"PM") -LOCVAL(LOCALE_ICALENDARTYPE,"1") -/* -LOCVAL(LOCALE_IOPTIONALCALENDAR) -LOCVAL(LOCALE_IFIRSTDAYOFWEEK) -LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) -*/ -LOCVAL(LOCALE_SDAYNAME1,"Monday") -LOCVAL(LOCALE_SDAYNAME2,"Tuesday") -LOCVAL(LOCALE_SDAYNAME3,"Wednesday") -LOCVAL(LOCALE_SDAYNAME4,"Thursday") -LOCVAL(LOCALE_SDAYNAME5,"Friday") -LOCVAL(LOCALE_SDAYNAME6,"Saturday") -LOCVAL(LOCALE_SDAYNAME7,"Sunday") -LOCVAL(LOCALE_SABBREVDAYNAME1,"Mon") -LOCVAL(LOCALE_SABBREVDAYNAME2,"Tue") -LOCVAL(LOCALE_SABBREVDAYNAME3,"Wed") -LOCVAL(LOCALE_SABBREVDAYNAME4,"Thu") -LOCVAL(LOCALE_SABBREVDAYNAME5,"Fri") -LOCVAL(LOCALE_SABBREVDAYNAME6,"Sat") -LOCVAL(LOCALE_SABBREVDAYNAME7,"Sun") -LOCVAL(LOCALE_SMONTHNAME1,"January") -LOCVAL(LOCALE_SMONTHNAME2,"February") -LOCVAL(LOCALE_SMONTHNAME3,"March") -LOCVAL(LOCALE_SMONTHNAME4,"April") -LOCVAL(LOCALE_SMONTHNAME5,"May") -LOCVAL(LOCALE_SMONTHNAME6,"June") -LOCVAL(LOCALE_SMONTHNAME7,"July") -LOCVAL(LOCALE_SMONTHNAME8,"August") -LOCVAL(LOCALE_SMONTHNAME9,"September") -LOCVAL(LOCALE_SMONTHNAME10,"October") -LOCVAL(LOCALE_SMONTHNAME11,"November") -LOCVAL(LOCALE_SMONTHNAME12,"December") -LOCVAL(LOCALE_SMONTHNAME13,"") -LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan") -LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb") -LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar") -LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr") -LOCVAL(LOCALE_SABBREVMONTHNAME5,"May") -LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun") -LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul") -LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug") -LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep") -LOCVAL(LOCALE_SABBREVMONTHNAME10,"Oct") -LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov") -LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec") -LOCVAL(LOCALE_SABBREVMONTHNAME13,"") -LOCVAL(LOCALE_SPOSITIVESIGN,"") -LOCVAL(LOCALE_SNEGATIVESIGN,"-") -/* -LOCVAL(LOCALE_IPOSSIGNPOSN) -LOCVAL(LOCALE_INEGSIGNPOSN) -LOCVAL(LOCALE_IPOSSYMPRECEDES) -LOCVAL(LOCALE_IPOSSEPBYSPACE) -LOCVAL(LOCALE_INEGSYMPRECEDES) -LOCVAL(LOCALE_INEGSEPBYSPACE) -*/ +LOCVAL(LOCALE_IDATE, "0") +LOCVAL(LOCALE_ILDATE, "0") +LOCVAL(LOCALE_ITIME, "0") +LOCVAL(LOCALE_ITIMEMARKPOSN, "0") +LOCVAL(LOCALE_ICENTURY, "0") +LOCVAL(LOCALE_ITLZERO, "0") +LOCVAL(LOCALE_IDAYLZERO, "0") +LOCVAL(LOCALE_IMONLZERO, "0") +LOCVAL(LOCALE_S1159, "AM") +LOCVAL(LOCALE_S2359, "PM") +LOCVAL(LOCALE_ICALENDARTYPE, "1") +LOCVAL(LOCALE_IOPTIONALCALENDAR, "0") +LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6") +LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0") +LOCVAL(LOCALE_SDAYNAME1, "Monday") +LOCVAL(LOCALE_SDAYNAME2, "Tuesday") +LOCVAL(LOCALE_SDAYNAME3, "Wednesday") +LOCVAL(LOCALE_SDAYNAME4, "Thursday") +LOCVAL(LOCALE_SDAYNAME5, "Friday") +LOCVAL(LOCALE_SDAYNAME6, "Saturday") +LOCVAL(LOCALE_SDAYNAME7, "Sunday") +LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon") +LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue") +LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed") +LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu") +LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri") +LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat") +LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun") +LOCVAL(LOCALE_SMONTHNAME1, "January") +LOCVAL(LOCALE_SMONTHNAME2, "February") +LOCVAL(LOCALE_SMONTHNAME3, "March") +LOCVAL(LOCALE_SMONTHNAME4, "April") +LOCVAL(LOCALE_SMONTHNAME5, "May") +LOCVAL(LOCALE_SMONTHNAME6, "June") +LOCVAL(LOCALE_SMONTHNAME7, "July") +LOCVAL(LOCALE_SMONTHNAME8, "August") +LOCVAL(LOCALE_SMONTHNAME9, "September") +LOCVAL(LOCALE_SMONTHNAME10, "October") +LOCVAL(LOCALE_SMONTHNAME11, "November") +LOCVAL(LOCALE_SMONTHNAME12, "December") +LOCVAL(LOCALE_SMONTHNAME13, "") +LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan") +LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb") +LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar") +LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr") +LOCVAL(LOCALE_SABBREVMONTHNAME5, "May") +LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun") +LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul") +LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug") +LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep") +LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct") +LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov") +LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec") +LOCVAL(LOCALE_SABBREVMONTHNAME13, "") +LOCVAL(LOCALE_SPOSITIVESIGN, "") +LOCVAL(LOCALE_SNEGATIVESIGN, "-") +LOCVAL(LOCALE_IPOSSIGNPOSN, "3") +LOCVAL(LOCALE_INEGSIGNPOSN, "0") +LOCVAL(LOCALE_IPOSSYMPRECEDES, "1") +LOCVAL(LOCALE_IPOSSEPBYSPACE, "0") +LOCVAL(LOCALE_INEGSYMPRECEDES, "1") +LOCVAL(LOCALE_INEGSEPBYSPACE, "0") default: found=0;break; } break; /* LANG(En) */ @@ -1005,111 +990,6 @@ LOCVAL(LOCALE_INEGSEPBYSPACE) } break; /* LANG(It) */ - case 0x0409: - switch (LCType) { -LOCVAL(LOCALE_ILANGUAGE, "0409") -LOCVAL(LOCALE_SLANGUAGE, "English (United States)") -LOCVAL(LOCALE_SENGLANGUAGE, "English") -LOCVAL(LOCALE_SABBREVLANGNAME, "ENU") -LOCVAL(LOCALE_SNATIVELANGNAME, "English") -LOCVAL(LOCALE_ICOUNTRY, "1") -LOCVAL(LOCALE_SCOUNTRY, "United States") -LOCVAL(LOCALE_SENGCOUNTRY, "United States") -LOCVAL(LOCALE_SABBREVCTRYNAME, "USA") -LOCVAL(LOCALE_SNATIVECTRYNAME, "United States") -LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409") -LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1") -LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437") -LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252") -LOCVAL(LOCALE_SLIST, ",") -LOCVAL(LOCALE_IMEASURE, "1") -LOCVAL(LOCALE_SDECIMAL, ".") -LOCVAL(LOCALE_STHOUSAND, ",") -LOCVAL(LOCALE_SGROUPING, "3;0") -LOCVAL(LOCALE_IDIGITS, "2") -LOCVAL(LOCALE_ILZERO, "1") -LOCVAL(LOCALE_INEGNUMBER, "1") -LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789") -LOCVAL(LOCALE_SCURRENCY, "$") -LOCVAL(LOCALE_SINTLSYMBOL, "USD") -LOCVAL(LOCALE_SMONDECIMALSEP, ".") -LOCVAL(LOCALE_SMONTHOUSANDSEP, ",") -LOCVAL(LOCALE_SMONGROUPING, "3;0") -LOCVAL(LOCALE_ICURRDIGITS, "2") -LOCVAL(LOCALE_IINTLCURRDIGITS, "2") -LOCVAL(LOCALE_ICURRENCY, "0") -LOCVAL(LOCALE_INEGCURR, "0") -LOCVAL(LOCALE_SDATE, "/") -LOCVAL(LOCALE_STIME, ":") -LOCVAL(LOCALE_SSHORTDATE, "M/d/yy") -LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy") -LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt") -LOCVAL(LOCALE_IDATE, "0") -LOCVAL(LOCALE_ILDATE, "0") -LOCVAL(LOCALE_ITIME, "0") -LOCVAL(LOCALE_ITIMEMARKPOSN, "0") -LOCVAL(LOCALE_ICENTURY, "0") -LOCVAL(LOCALE_ITLZERO, "0") -LOCVAL(LOCALE_IDAYLZERO, "0") -LOCVAL(LOCALE_IMONLZERO, "0") -LOCVAL(LOCALE_S1159, "AM") -LOCVAL(LOCALE_S2359, "PM") -LOCVAL(LOCALE_ICALENDARTYPE, "1") -LOCVAL(LOCALE_IOPTIONALCALENDAR, "0") -LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6") -LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0") -LOCVAL(LOCALE_SDAYNAME1, "Monday") -LOCVAL(LOCALE_SDAYNAME2, "Tuesday") -LOCVAL(LOCALE_SDAYNAME3, "Wednesday") -LOCVAL(LOCALE_SDAYNAME4, "Thursday") -LOCVAL(LOCALE_SDAYNAME5, "Friday") -LOCVAL(LOCALE_SDAYNAME6, "Saturday") -LOCVAL(LOCALE_SDAYNAME7, "Sunday") -LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon") -LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue") -LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed") -LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu") -LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri") -LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat") -LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun") -LOCVAL(LOCALE_SMONTHNAME1, "January") -LOCVAL(LOCALE_SMONTHNAME2, "February") -LOCVAL(LOCALE_SMONTHNAME3, "March") -LOCVAL(LOCALE_SMONTHNAME4, "April") -LOCVAL(LOCALE_SMONTHNAME5, "May") -LOCVAL(LOCALE_SMONTHNAME6, "June") -LOCVAL(LOCALE_SMONTHNAME7, "July") -LOCVAL(LOCALE_SMONTHNAME8, "August") -LOCVAL(LOCALE_SMONTHNAME9, "September") -LOCVAL(LOCALE_SMONTHNAME10, "October") -LOCVAL(LOCALE_SMONTHNAME11, "November") -LOCVAL(LOCALE_SMONTHNAME12, "December") -LOCVAL(LOCALE_SMONTHNAME13, "") -LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan") -LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb") -LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar") -LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr") -LOCVAL(LOCALE_SABBREVMONTHNAME5, "May") -LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun") -LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul") -LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug") -LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep") -LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct") -LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov") -LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec") -LOCVAL(LOCALE_SABBREVMONTHNAME13, "") -LOCVAL(LOCALE_SPOSITIVESIGN, "") -LOCVAL(LOCALE_SNEGATIVESIGN, "-") -LOCVAL(LOCALE_IPOSSIGNPOSN, "3") -LOCVAL(LOCALE_INEGSIGNPOSN, "0") -LOCVAL(LOCALE_IPOSSYMPRECEDES, "1") -LOCVAL(LOCALE_IPOSSEPBYSPACE, "0") -LOCVAL(LOCALE_INEGSYMPRECEDES, "1") -LOCVAL(LOCALE_INEGSEPBYSPACE, "0") - default: found=0;break; - } - break; /* LANG(0x0409) (U.S. English) */ - case 0x0809: switch (LCType) { LOCVAL(LOCALE_ILANGUAGE, "0809") @@ -1879,7 +1759,7 @@ UINT32 WINAPI CompareString32W(DWORD lcid, DWORD fdwStyle, } /*********************************************************************** - * SetLocalInfoA (KERNEL32.499) + * SetLocaleInfoA [KERNEL32.499] */ BOOL16 WINAPI SetLocaleInfoA(DWORD lcid, DWORD lctype, LPCSTR data) { @@ -1888,7 +1768,7 @@ BOOL16 WINAPI SetLocaleInfoA(DWORD lcid, DWORD lctype, LPCSTR data) } /*********************************************************************** - * IsValidLocale (KERNEL32.361) + * IsValidLocale [KERNEL32.361] */ BOOL32 WINAPI IsValidLocale(LCID lcid,DWORD flags) { @@ -1897,7 +1777,7 @@ BOOL32 WINAPI IsValidLocale(LCID lcid,DWORD flags) } /*********************************************************************** - * EnumSystemLocales32W (KERNEL32.93) + * EnumSystemLocales32W [KERNEL32.93] */ BOOL32 WINAPI EnumSystemLocales32W( LOCALE_ENUMPROC32W lpfnLocaleEnum, DWORD flags ) @@ -1940,7 +1820,7 @@ BOOL32 WINAPI EnumSystemLocales32W( LOCALE_ENUMPROC32W lpfnLocaleEnum, } /*********************************************************************** - * EnumSystemLocales32A (KERNEL32.92) + * EnumSystemLocales32A [KERNEL32.92] */ BOOL32 WINAPI EnumSystemLocales32A(LOCALE_ENUMPROC32A lpfnLocaleEnum, DWORD flags) @@ -1975,7 +1855,7 @@ BOOL32 WINAPI EnumSystemLocales32A(LOCALE_ENUMPROC32A lpfnLocaleEnum, } /*********************************************************************** - * GetStringTypeA (OLE2NLS.7) + * GetStringTypeA [OLE2NLS.7] */ BOOL16 WINAPI GetStringType16(LCID locale,DWORD dwInfoType,LPCSTR src, INT16 cchSrc,LPWORD chartype) @@ -1983,7 +1863,7 @@ BOOL16 WINAPI GetStringType16(LCID locale,DWORD dwInfoType,LPCSTR src, return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype); } /*********************************************************************** - * GetStringTypeA (KERNEL32.277) + * GetStringTypeA [KERNEL32.277] */ BOOL32 WINAPI GetStringType32A(LCID locale,DWORD dwInfoType,LPCSTR src, INT32 cchSrc,LPWORD chartype) @@ -1991,7 +1871,7 @@ BOOL32 WINAPI GetStringType32A(LCID locale,DWORD dwInfoType,LPCSTR src, return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype); } /*********************************************************************** - * GetStringTypeExA (KERNEL32.276) + * GetStringTypeExA [KERNEL32.276] */ BOOL32 WINAPI GetStringTypeEx32A(LCID locale,DWORD dwInfoType,LPCSTR src, INT32 cchSrc,LPWORD chartype) @@ -2026,8 +1906,10 @@ BOOL32 WINAPI GetStringTypeEx32A(LCID locale,DWORD dwInfoType,LPCSTR src, return TRUE; } -/*********************************************************************** - * GetStringTypeW (KERNEL32.279) +/********************************************************************* + * GetStringTypeW [KERNEL32.279] + * + * NOTES * Yes, this is missing LCID locale. MS fault. */ BOOL32 WINAPI GetStringType32W(DWORD dwInfoType,LPCWSTR src,INT32 cchSrc, @@ -2036,8 +1918,8 @@ BOOL32 WINAPI GetStringType32W(DWORD dwInfoType,LPCWSTR src,INT32 cchSrc, return GetStringTypeEx32W(0/*defaultlocale*/,dwInfoType,src,cchSrc,chartype); } -/*********************************************************************** - * GetStringTypeW (KERNEL32.278) +/********************************************************************* + * GetStringTypeW [KERNEL32.278] * FIXME: unicode chars are assumed chars */ BOOL32 WINAPI GetStringTypeEx32W(LCID locale,DWORD dwInfoType,LPCWSTR src, @@ -2073,7 +1955,9 @@ BOOL32 WINAPI GetStringTypeEx32W(LCID locale,DWORD dwInfoType,LPCWSTR src, return TRUE; } -/* VerLanguageName [VER.10] */ +/***************************************************************** + * VerLanguageName16 [VER.10] + */ DWORD WINAPI VerLanguageName16(UINT16 langid,LPSTR langname,UINT16 langnamelen) { int i; @@ -2098,14 +1982,18 @@ DWORD WINAPI VerLanguageName16(UINT16 langid,LPSTR langname,UINT16 langnamelen) return strlen(languages[i].langname); } -/* VerLanguageNameA [VERSION.9] */ +/***************************************************************** + * VerLanguageName32A [VERSION.9] + */ DWORD WINAPI VerLanguageName32A(UINT32 langid,LPSTR langname, UINT32 langnamelen) { return VerLanguageName16(langid,langname,langnamelen); } -/* VerLanguageNameW [VERSION.10] */ +/***************************************************************** + * VerLanguageName32W [VERSION.10] + */ DWORD WINAPI VerLanguageName32W(UINT32 langid,LPWSTR langname, UINT32 langnamelen) { @@ -2207,8 +2095,8 @@ INT32 WINAPI LCMapString32W( /***************************************************************** * - * OLE_GetFormatA() - * OLE_GetFormatW() + * OLE_GetFormatA() [internal] + This function implements stuff for GetDateFormat() and GetTimeFormat(). @@ -2257,7 +2145,7 @@ INT32 WINAPI OLE_GetFormatA(LCID locale, const char ** dgfmt = _dgfmt - 1; /* report, for debugging */ - TRACE(ole, "func(%#lx,%#lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p (%9s), len=%d)\n", locale, flags, + TRACE(ole, "func(%8lx,%8lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p (%9s), len=%d)\n", locale, flags, xtime->wDay, xtime->wHour, xtime->wMinute, xtime->wSecond, format, format, date, date, datelen); @@ -2430,39 +2318,233 @@ c=%c, n=%d\n", type, count); return outpos; } +/* OLE_GetFormatW [internal] */ + INT32 WINAPI OLE_GetFormatW(LCID locale, DWORD flags, LPSYSTEMTIME xtime, LPCWSTR format, - LPWSTR timestr, INT32 timelen) + LPWSTR output, INT32 outlen) { - FIXME(ole, "(unicode GetDateFormat) STUB\n"); - return 0; + INT32 inpos, outpos; + int count, type, inquote; + int Overflow; /* loop check */ + int usedate, usetime; + WCHAR buf[40]; + int buflen; + char abuf[40]; + WCHAR arg0[] = {0}, arg1[] = {'%','d',0}; + WCHAR arg2[] = {'%','0','2','d',0}; + WCHAR *argarr[] = {arg0, arg1, arg2}; + int datevars, timevars; + + /* make a debug report */ + lstrcpynWtoA(abuf, format, sizeof(format)); + TRACE(ole, "args: %8lx, %8lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p with max len %d\n", + locale, flags, + xtime->wDay, xtime->wHour, xtime->wMinute, xtime->wSecond, + abuf, format, output, outlen); + + + /* initialize state variables */ + inpos = outpos = 0; + count = 0; + inquote = Overflow = 0; + /* this is really just a sanity check */ + output[0] = buf[0] = 0; + abuf[0] = '\0'; + /* for compatibility with official Windows behavior */ + usedate = flags & DATE_DATEVARSONLY; + usetime = flags & TIME_TIMEVARSONLY; + + /* this loop is the core of the function */ + for (inpos = 0; /* we have several break points */ ; inpos++) { + if (inquote) { + if (format[inpos] == (WCHAR) '\'') { + if (format[inpos+1] == '\'') { + inpos++; + output[outpos++] = '\''; + } else { + inquote = 0; + continue; + } + } else if (format[inpos] == 0) { + output[outpos++] = 0; + if (outpos > outlen) Overflow = 1; + break; /* normal exit (within a quote) */ + } else { + output[outpos++] = format[inpos]; /* copy input */ + if (outpos > outlen) { + Overflow = 1; + output[outpos-1] = 0; + break; + } + } + } else if ( (count && (format[inpos] != type)) + || ( (count==4 && type =='y') || + (count==4 && type =='M') || + (count==4 && type =='d') || + (count==2 && type =='g') || + (count==2 && type =='h') || + (count==2 && type =='H') || + (count==2 && type =='m') || + (count==2 && type =='s') || + (count==2 && type =='t') ) ) { + if (type == 'd') { + if (count == 3) { + GetLocaleInfo32W(locale, + LOCALE_SDAYNAME1 + xtime->wDayOfWeek -1, + buf, sizeof(buf)/sizeof(WCHAR) ); + } else if (count == 3) { + GetLocaleInfo32W(locale, + LOCALE_SABBREVDAYNAME1 + + xtime->wDayOfWeek -1, + buf, sizeof(buf)/sizeof(WCHAR) ); + } else { + wsnprintf32W(buf, 5, argarr[count], xtime->wDay ); + }; + } else if (type == 'M') { + if (count == 4) { + GetLocaleInfo32W(locale, LOCALE_SMONTHNAME1 + + xtime->wMonth -1, buf, + sizeof(buf)/sizeof(WCHAR) ); + } else if (count == 3) { + GetLocaleInfo32W(locale, LOCALE_SABBREVMONTHNAME1 + + xtime->wMonth -1, buf, + sizeof(buf)/sizeof(WCHAR) ); + } else { + wsnprintf32W(buf, 5, argarr[count], xtime->wMonth); + } + } else if (type == 'y') { + if (count == 4) { + wsnprintf32W(buf, 6, argarr[1] /* "%d" */, + xtime->wYear); + } else if (count == 3) { + lstrcpynAtoW(buf, "yyy", 5); + } else { + wsnprintf32W(buf, 6, argarr[count], + xtime->wYear % 100); + } + } else if (type == 'g') { + if (count == 2) { + FIXME(ole, "LOCALE_ICALENDARTYPE unimplemented\n"); + lstrcpynAtoW(buf, "AD", 5); + } else { + /* Win API sez we copy it verbatim */ + lstrcpynAtoW(buf, "g", 5); + } + } else if (type == 'h') { + /* hours 1:00-12:00 --- is this right? */ + wsnprintf32W(buf, 5, argarr[count], + (xtime->wHour-1)%12 +1); + } else if (type == 'H') { + wsnprintf32W(buf, 5, argarr[count], + xtime->wHour); + } else if (type == 'm') { + wsnprintf32W(buf, 5, argarr[count], + xtime->wMinute); + } else if (type == 's') { + wsnprintf32W(buf, 5, argarr[count], + xtime->wSecond); + } else if (type == 't') { + GetLocaleInfo32W(locale, (xtime->wHour < 12) ? + LOCALE_S1159 : LOCALE_S2359, + buf, sizeof(buf) ); + if (count == 1) { + buf[1] = 0; + } +} + + /* no matter what happened, we need to check this next + character the next time we loop through */ + inpos--; + + /* cat buf onto the output */ + outlen = lstrlen32W(buf); + if (outpos + buflen < outlen) { + output[outpos] = 0; /* a "hook" for strcat */ + lstrcat32W(output, buf); + outpos += buflen; + } else { + output[outpos] = 0; + lstrcatn32W(output, buf, outlen - outpos); + output[outlen - 1] = 0; + Overflow = 1; + break; /* Abnormal exit */ + } + + /* reset the variables we used this time */ + count = 0; + type = '\0'; + } else if (format[inpos] == 0) { + /* we can't check for this at the beginning, because that + would keep us from printing a format spec that ended the + string */ + output[outpos] = 0; + break; /* NORMAL EXIT */ + } else if (count) { + /* how we keep track of the middle of a format spec */ + count++; + continue; + } else if ( (datevars && (format[inpos]=='d' || + format[inpos]=='M' || + format[inpos]=='y' || + format[inpos]=='g') ) || + (timevars && (format[inpos]=='H' || + format[inpos]=='h' || + format[inpos]=='m' || + format[inpos]=='s' || + format[inpos]=='t') ) ) { + type = format[inpos]; + count = 1; + continue; + } else if (format[inpos] == '\'') { + inquote = 1; + continue; + } else { + /* unquoted literals */ + output[outpos++] = format[inpos]; + } + } + + if (Overflow) { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + WARN(ole, " buffer overflow\n"); + }; + + /* final string terminator and sanity check */ + outpos++; + if (outpos > outlen-1) outpos = outlen-1; + output[outpos] = '0'; + + lstrcpynWtoA(abuf, output, sizeof(abuf) ); + TRACE(ole, " returning string \'%s\'\n", abuf); + + return (!Overflow) ? outlen : 0; } /***************************************************************** + * GetDateFormat32A() [KERNEL32.310] Makes an ASCII string of the date * - * GetDateFormat32A() - - This function uses format to format the date, or, if format - is NULL, uses the default for the locale. format is a string - of literal fields and characters as follows: - - d single-digit (no leading zero) day (of month) - dd two-digit day (of month) - ddd short day-of-week name - dddd long day-of-week name - M single-digit month - MM two-digit month - MMM short month name - MMMM full month name - y two-digit year, no leading 0 - yy two-digit year - yyyy four-digit year - gg era string - - * ***********************/ + * This function uses format to format the date, or, if format + * is NULL, uses the default for the locale. format is a string + * of literal fields and characters as follows: + * + * - d single-digit (no leading zero) day (of month) + * - dd two-digit day (of month) + * - ddd short day-of-week name + * - dddd long day-of-week name + * - M single-digit month + * - MM two-digit month + * - MMM short month name + * - MMMM full month name + * - y two-digit year, no leading 0 + * - yy two-digit year + * - yyyy four-digit year + * - gg era string + * + */ INT32 WINAPI GetDateFormat32A(LCID locale,DWORD flags, LPSYSTEMTIME xtime, @@ -2521,11 +2603,11 @@ INT32 WINAPI GetDateFormat32A(LCID locale,DWORD flags, } /* **************************************************************** - * GetDateFormat32W() - + * GetDateFormat32W() [KERNEL32.311] Makes a Unicode string of the date + * * Acts the same as GetDateFormat32A(), except that it's Unicode. * Accepts & returns sizes as counts of Unicode characters. - + * */ INT32 WINAPI GetDateFormat32W(LCID locale,DWORD flags, LPSYSTEMTIME xtime, @@ -2534,37 +2616,67 @@ INT32 WINAPI GetDateFormat32W(LCID locale,DWORD flags, { short datearr[] = {'1','9','9','4','-','1','-','1',0}; - FIXME(ole, "STUB\n"); + FIXME(ole, "STUB (should call OLE_GetFormatW)\n"); lstrcpyn32W(date, datearr, datelen); return ( datelen < 9) ? datelen : 9; } + +/************************************************************************** + * GetNumberFormat32A (KERNEL32.355) + */ +INT32 WINAPI GetNumberFormat32A(LCID locale, DWORD dwflags, + LPCSTR lpvalue, char *lpFormat, + LPSTR lpNumberStr, int cchNumber) +/* NOTE: type of lpFormat should be CONST NUMBERFORMAT */ + +{ + int n; + + FIXME(file,"%s: stub, no reformating done\n",lpvalue); + + n = strlen(lpvalue); + if (cchNumber) { + strncpy(lpNumberStr,lpvalue,cchNumber); + if (cchNumber <= n) { + lpNumberStr[cchNumber-1] = 0; + n = cchNumber-1; + } + } + return n; +} + + + /***************************************************************** * - * GetTimeFormat32A() - - Formats date according to format, or locale default if format is - NULL. The format consists of literal characters and fields as follows: - - h hours with no leading zero (12-hour) - hh hours with full two digits - H hours with no leading zero (24-hour) - HH hours with full two digits - m minutes with no leading zero - mm minutes with full two digits - s seconds with no leading zero - ss seconds with full two digits - t time marker (A or P) - tt time marker (AM, PM) - + * GetTimeFormat32A() [KERNEL32.422] Makes an ASCII string of the time + * + * Formats date according to format, or locale default if format is + * NULL. The format consists of literal characters and fields as follows: + * + * h hours with no leading zero (12-hour) + * hh hours with full two digits + * H hours with no leading zero (24-hour) + * HH hours with full two digits + * m minutes with no leading zero + * mm minutes with full two digits + * s seconds with no leading zero + * ss seconds with full two digits + * t time marker (A or P) + * tt time marker (AM, PM) + * */ -INT32 WINAPI GetTimeFormat32A(LCID locale,DWORD flags, - LPSYSTEMTIME xtime, - LPCSTR format, - LPSTR timestr,INT32 timelen) +INT32 WINAPI +GetTimeFormat32A(LCID locale, /* in */ + DWORD flags, /* in */ + LPSYSTEMTIME xtime, /* in */ + LPCSTR format, /* in */ + LPSTR timestr, /* out */ + INT32 timelen /* in */) { LPCSTR realformat; char fmt_buf[40]; @@ -2585,40 +2697,78 @@ INT32 WINAPI GetTimeFormat32A(LCID locale,DWORD flags, if (!locale) { locale = GetSystemDefaultLCID(); } - - return OLE_GetFormatA(locale, flags, xtime, realformat, timestr, timelen); - } + /* **************************************************************** - * GetTimeFormat32W() + * GetTimeFormat32W() [KERNEL32.423] Makes a Unicode string of the time * + * */ -INT32 WINAPI GetTimeFormat32W(LCID locale,DWORD flags, +INT32 WINAPI +GetTimeFormat32W(LCID locale,DWORD flags, LPSYSTEMTIME xtime, LPCWSTR format, LPWSTR timestr,INT32 timelen) { - char buf[40]; - - lstrcpynWtoA(buf, format, (sizeof(buf))/2); + char debugbuf[40]; + WCHAR buf[20]; + LPCWSTR realformat; + SYSTEMTIME t; + LPSYSTEMTIME realtime; + WCHAR * fmt_buf = NULL; + int fmt_buf_size = 0; /* units of WCHARs */ + INT32 retval; + lstrcpynWtoA(debugbuf, format, (sizeof(buf))/2); TRACE(ole, "GetTimeFormatW len %d flags 0x%lX format >%s<\n", - timelen, flags, buf); - FIXME(ole, "STUB"); - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return 0; + timelen, flags, debugbuf); + /* Enforce the Windows behavior */ + flags |= ~LOCALE_TIMEDATEBOTH; + flags |= TIME_TIMEVARSONLY; + /* take care of the format or locale not being given */ + if (format) { + realformat = format; + } else if (locale) { + /* allocate memory */ + fmt_buf = malloc((fmt_buf_size+=7) * sizeof(WCHAR)); + if (!fmt_buf) { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + WARN(ole, "could not allocate %d chars of memory\n", fmt_buf_size); + return 0; + }; + while(!GetLocaleInfo32W(locale, LOCALE_STIMEFORMAT, + fmt_buf, fmt_buf_size)) { + fmt_buf = realloc(fmt_buf, + (fmt_buf_size += 10) * sizeof(WCHAR)); + if (!fmt_buf) { + SetLastError(ERROR_OUTOFMEMORY); + WARN(ole, "could not allocate %d chars of memory\n", fmt_buf_size); + return 0; + }; + }; + realformat = fmt_buf; + } else { + FIXME(ole, "caller gave no locale, no format; what should we do?\n"); + SetLastError(ERROR_BAD_FORMAT); + }; + if (!locale) { + locale = GetSystemDefaultLCID(); } + realtime = xtime; + if (!realtime) { + realtime = &t; + GetSystemTime(realtime); + }; - - - - - + retval = OLE_GetFormatW(locale, flags, realtime, realformat, timestr, timelen); + if (fmt_buf) free(fmt_buf); + return retval; +} diff --git a/ole/storage.c b/ole/storage.c index 19f4fbd4cb7..d7fcdc67a97 100644 --- a/ole/storage.c +++ b/ole/storage.c @@ -54,12 +54,12 @@ static BOOL32 STORAGE_get_big_block(HFILE32 hf,int n,BYTE *block) { assert(n>=-1); if (-1==_llseek32(hf,(n+1)*BIGSIZE,SEEK_SET)) { - fprintf(stderr,"STORAGE_get_big_block: seek failed (%ld)\n",GetLastError()); + WARN(ole," seek failed (%ld)\n",GetLastError()); return FALSE; } assert((n+1)*BIGSIZE==_llseek32(hf,0,SEEK_CUR)); if (BIGSIZE!=_lread32(hf,block,BIGSIZE)) { - fprintf(stderr,"STORAGE_get_big_block(%d): read didn't (%ld)\n",n,GetLastError()); + WARN(ole,"(block size %d): read didn't read (%ld)\n",n,GetLastError()); assert(0); return FALSE; } @@ -70,12 +70,12 @@ static BOOL32 STORAGE_put_big_block(HFILE32 hf,int n,BYTE *block) { assert(n>=-1); if (-1==_llseek32(hf,(n+1)*BIGSIZE,SEEK_SET)) { - fprintf(stderr,"STORAGE_put_big_block: seek failed (%ld)\n",GetLastError()); + WARN(ole," seek failed (%ld)\n",GetLastError()); return FALSE; } assert((n+1)*BIGSIZE==_llseek32(hf,0,SEEK_CUR)); if (BIGSIZE!=_lwrite32(hf,block,BIGSIZE)) { - fprintf(stderr,"STORAGE_put_big_block: write failed (%ld)\n",GetLastError()); + WARN(ole," write failed (%ld)\n",GetLastError()); return FALSE; } return TRUE; @@ -291,22 +291,22 @@ STORAGE_dump_pps_entry(struct storage_pps_entry *stde) { lstrcpyWtoA(name,stde->pps_rawname); if (!stde->pps_sizeofname) return; - fprintf(stderr,"name: %s\n",name); - fprintf(stderr,"type: %d\n",stde->pps_type); - fprintf(stderr,"prev pps: %ld\n",stde->pps_prev); - fprintf(stderr,"next pps: %ld\n",stde->pps_next); - fprintf(stderr,"dir pps: %ld\n",stde->pps_dir); - fprintf(stderr,"guid: %s\n",xguid); + DUMP("name: %s\n",name); + DUMP("type: %d\n",stde->pps_type); + DUMP("prev pps: %ld\n",stde->pps_prev); + DUMP("next pps: %ld\n",stde->pps_next); + DUMP("dir pps: %ld\n",stde->pps_dir); + DUMP("guid: %s\n",xguid); if (stde->pps_type !=2) { time_t t; t = DOSFS_FileTimeToUnixTime(&(stde->pps_ft1),NULL); - fprintf(stderr,"ts1: %s\n",ctime(&t)); + DUMP("ts1: %s\n",ctime(&t)); t = DOSFS_FileTimeToUnixTime(&(stde->pps_ft2),NULL); - fprintf(stderr,"ts2: %s\n",ctime(&t)); + DUMP("ts2: %s\n",ctime(&t)); } - fprintf(stderr,"startblock: %ld\n",stde->pps_sb); - fprintf(stderr,"size: %ld\n",stde->pps_size); + DUMP("startblock: %ld\n",stde->pps_sb); + DUMP("size: %ld\n",stde->pps_size); } static BOOL32 @@ -585,7 +585,7 @@ HRESULT WINAPI IStream16_QueryInterface( char xrefiid[50]; WINE_StringFromCLSID((LPCLSID)refiid,xrefiid); - TRACE(relay,"(%p)->QueryInterface(%s,%p)\n",this,xrefiid,obj); + TRACE(relay,"(%p)->(%s,%p)\n",this,xrefiid,obj); if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) { *obj = this; return 0; @@ -613,7 +613,7 @@ ULONG WINAPI IStream16_Release(LPSTREAM16 this) { HRESULT WINAPI IStream16_Seek( LPSTREAM16 this,LARGE_INTEGER offset,DWORD whence,ULARGE_INTEGER *newpos ) { - TRACE(relay,"(%p)->Seek([%ld.%ld],%ld,%p)\n",this,offset.HighPart,offset.LowPart,whence,newpos); + TRACE(relay,"(%p)->([%ld.%ld],%ld,%p)\n",this,offset.HighPart,offset.LowPart,whence,newpos); switch (whence) { /* unix SEEK_xx should be the same as win95 ones */ @@ -657,7 +657,7 @@ HRESULT WINAPI IStream16_Read( ULONG *bytesread=pcbRead,xxread; int blocknr; - TRACE(relay,"(%p)->Read(%p,%ld,%p)\n",this,pv,cb,pcbRead); + TRACE(relay,"(%p)->(%p,%ld,%p)\n",this,pv,cb,pcbRead); if (!pcbRead) bytesread=&xxread; *bytesread = 0; @@ -670,7 +670,7 @@ HRESULT WINAPI IStream16_Read( int cc; if (!STORAGE_get_small_block(this->hf,blocknr,block)) { - fprintf(stderr,"small block read failed!!!!\n"); + WARN(ole,"small block read failed!!!\n"); return E_FAIL; } cc = cb; @@ -690,7 +690,7 @@ HRESULT WINAPI IStream16_Read( int cc; if (!STORAGE_get_big_block(this->hf,blocknr,block)) { - fprintf(stderr,"big block read failed!!!!\n"); + WARN(ole,"big block read failed!!!\n"); return E_FAIL; } cc = cb; @@ -718,7 +718,7 @@ HRESULT WINAPI IStream16_Write( if (!pcbWrite) byteswritten=&xxwritten; *byteswritten = 0; - TRACE(relay,"(%p)->Write(%p,%ld,%p)\n",this,pv,cb,pcbWrite); + TRACE(relay,"(%p)->(%p,%ld,%p)\n",this,pv,cb,pcbWrite); /* do we need to junk some blocks? */ newsize = this->offset.LowPart+cb; oldsize = this->stde.pps_size; @@ -1028,7 +1028,7 @@ HRESULT WINAPI IStream32_QueryInterface( char xrefiid[50]; WINE_StringFromCLSID((LPCLSID)refiid,xrefiid); - TRACE(relay,"(%p)->QueryInterface(%s,%p)\n",this,xrefiid,obj); + TRACE(relay,"(%p)->(%s,%p)\n",this,xrefiid,obj); if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) { *obj = this; return 0; @@ -1075,7 +1075,7 @@ HRESULT WINAPI IStorage16_QueryInterface( char xrefiid[50]; WINE_StringFromCLSID((LPCLSID)refiid,xrefiid); - TRACE(relay,"(%p)->QueryInterface(%s,%p)\n",this,xrefiid,obj); + TRACE(relay,"(%p)->(%s,%p)\n",this,xrefiid,obj); if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) { *obj = this; @@ -1099,13 +1099,13 @@ ULONG WINAPI IStorage16_Release(LPSTORAGE16 this) { HRESULT WINAPI IStorage16_Stat( LPSTORAGE16 this,STATSTG *pstatstg, DWORD grfStatFlag ) { - fprintf(stderr,"IStorage16(%p)->Stat(%p,0x%08lx)\n", + TRACE(ole,"(%p)->(%p,0x%08lx)\n", this,pstatstg,grfStatFlag ); pstatstg->pwcsName=SEGPTR_GET(SEGPTR_STRDUP_WtoA(this->stde.pps_rawname)); pstatstg->type = this->stde.pps_type; pstatstg->cbSize.LowPart = this->stde.pps_size; - pstatstg->mtime = this->stde.pps_ft1; /* FIXME */ + pstatstg->mtime = this->stde.pps_ft1; /* FIXME */ /* why? */ pstatstg->atime = this->stde.pps_ft2; /* FIXME */ pstatstg->ctime = this->stde.pps_ft2; /* FIXME */ pstatstg->grfMode = 0; /* FIXME */ @@ -1119,7 +1119,7 @@ HRESULT WINAPI IStorage16_Stat( HRESULT WINAPI IStorage16_Commit( LPSTORAGE16 this,DWORD commitflags ) { - fprintf(stderr,"IStorage16(%p)->Commit(0x%08lx),STUB!\n", + FIXME(ole,"(%p)->(0x%08lx),STUB!\n", this,commitflags ); return OLE_OK; @@ -1132,7 +1132,7 @@ HRESULT WINAPI IStorage16_CopyTo(LPSTORAGE16 this,DWORD ciidExclude,const IID *r WINE_StringFromCLSID(rgiidExclude,xguid); else strcpy(xguid,""); - fprintf(stderr,"IStorage16(%p)->CopyTo(0x%08lx,%s,%p,%p),stub!\n", + FIXME(ole,"IStorage16(%p)->(0x%08lx,%s,%p,%p),stub!\n", this,ciidExclude,xguid,SNB16Exclude,pstgDest ); return OLE_OK; @@ -1151,11 +1151,11 @@ HRESULT WINAPI IStorage16_CreateStorage( READ_HEADER; - fprintf(stderr,"IStorage16(%p)->CreateStorage(%s,0x%08lx,0x%08lx,0x%08lx,%p)\n", + TRACE(ole,"(%p)->(%s,0x%08lx,0x%08lx,0x%08lx,%p)\n", this,pwcsName,grfMode,dwStgFormat,reserved2,ppstg ); if (grfMode & STGM_TRANSACTED) - fprintf(stderr,"IStorage::CreateStorage:We do not support transacted Compound Storage. Using direct mode.\n"); + FIXME(ole,"We do not support transacted Compound Storage. Using direct mode.\n"); _create_istorage16(ppstg); lpstg = (LPSTORAGE16)PTR_SEG_TO_LIN(*ppstg); lpstg->hf = this->hf; @@ -1168,7 +1168,7 @@ HRESULT WINAPI IStorage16_CreateStorage( stde.pps_dir = ppsent; x = this->ppsent; } else { - /* FIXME: use prev chain too ? */ + FIXME(ole," use prev chain too ?\n"); x=stde.pps_dir; if (1!=STORAGE_get_pps_entry(lpstg->hf,x,&stde)) return E_FAIL; @@ -1203,11 +1203,11 @@ HRESULT WINAPI IStorage16_CreateStream( int ppsent,x; struct storage_pps_entry stde; - fprintf(stderr,"IStorage16(%p)->CreateStream(%s,0x%08lx,0x%08lx,0x%08lx,%p)\n", + TRACE(ole,"(%p)->(%s,0x%08lx,0x%08lx,0x%08lx,%p)\n", this,pwcsName,grfMode,reserved1,reserved2,ppstm ); if (grfMode & STGM_TRANSACTED) - fprintf(stderr,"IStorage::CreateStream:We do not support transacted Compound Storage. Using direct mode.\n"); + FIXME(ole,"We do not support transacted Compound Storage. Using direct mode.\n"); _create_istream16(ppstm); lpstr = (LPSTREAM16)PTR_SEG_TO_LIN(*ppstm); lpstr->hf = FILE_Dup(this->hf); @@ -1251,11 +1251,11 @@ HRESULT WINAPI IStorage16_OpenStorage( WCHAR name[33]; int newpps; - TRACE(relay,"(%p)->OpenStorage(%s,%p,0x%08lx,%p,0x%08lx,%p)\n", + TRACE(relay,"(%p)->(%s,%p,0x%08lx,%p,0x%08lx,%p)\n", this,pwcsName,pstgPrio,grfMode,snbExclude,reserved,ppstg ); if (grfMode & STGM_TRANSACTED) - fprintf(stderr,"IStorage::OpenStorage:We do not support transacted Compound Storage. Using direct mode.\n"); + FIXME(ole,"We do not support transacted Compound Storage. Using direct mode.\n"); _create_istorage16(ppstg); lpstg = (LPSTREAM16)PTR_SEG_TO_LIN(*ppstg); lpstg->hf = FILE_Dup(this->hf); @@ -1281,11 +1281,11 @@ HRESULT WINAPI IStorage16_OpenStream( WCHAR name[33]; int newpps; - TRACE(relay,"(%p)->OpenStream(%s,%p,0x%08lx,0x%08lx,%p)\n", + TRACE(relay,"(%p)->(%s,%p,0x%08lx,0x%08lx,%p)\n", this,pwcsName,reserved1,grfMode,reserved2,ppstm ); if (grfMode & STGM_TRANSACTED) - fprintf(stderr,"IStorage::OpenStream:We do not support transacted Compound Storage. Using direct mode.\n"); + FIXME(ole,"We do not support transacted Compound Storage. Using direct mode.\n"); _create_istream16(ppstm); lpstr = (LPSTREAM16)PTR_SEG_TO_LIN(*ppstm); lpstr->hf = FILE_Dup(this->hf); @@ -1377,7 +1377,7 @@ HRESULT WINAPI IStorage32_QueryInterface( char xrefiid[50]; WINE_StringFromCLSID((LPCLSID)refiid,xrefiid); - TRACE(relay,"(%p)->QueryInterface(%s,%p)\n",this,xrefiid,obj); + TRACE(relay,"(%p)->(%s,%p)\n",this,xrefiid,obj); if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) { *obj = this; @@ -1401,7 +1401,7 @@ ULONG WINAPI IStorage32_Release(LPSTORAGE32 this) { HRESULT WINAPI IStorage32_CreateStream( LPSTORAGE32 this,LPCOLESTR32 pwcsName,DWORD grfMode,DWORD reserved1,DWORD reserved2, IStream32 **ppstm ) { - fprintf(stderr,"IStorage32(%p)->CreateStream(%p,0x%08lx,0x%08lx,0x%08lx,%p)\n", + TRACE(ole,"(%p)->(%p,0x%08lx,0x%08lx,0x%08lx,%p)\n", this,pwcsName,grfMode,reserved1,reserved2,ppstm ); *ppstm = (IStream32*)HeapAlloc(GetProcessHeap(),0,sizeof(IStream32)); @@ -1414,7 +1414,7 @@ HRESULT WINAPI IStorage32_CreateStream( HRESULT WINAPI IStorage32_OpenStream( LPSTORAGE32 this,LPCOLESTR32 pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream32 **ppstm ) { - fprintf(stderr,"IStorage32(%p)->OpenStream(%p,%p,0x%08lx,0x%08lx,%p)\n", + TRACE(ole,"(%p)->(%p,%p,0x%08lx,0x%08lx,%p)\n", this,pwcsName,reserved1,grfMode,reserved2,ppstm ); *ppstm = (IStream32*)HeapAlloc(GetProcessHeap(),0,sizeof(IStream32)); @@ -1453,13 +1453,13 @@ OLESTATUS WINAPI StgCreateDocFile16( LPSTORAGE16 lpstg; struct storage_pps_entry stde; - fprintf(stderr,"StgCreateDocfile(%s,0x%08lx,0x%08lx,%p)\n", + TRACE(ole,"(%s,0x%08lx,0x%08lx,%p)\n", pwcsName,grfMode,reserved,ppstgOpen ); _create_istorage16(ppstgOpen); hf = CreateFile32A(pwcsName,GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_NEW,0,0); if (hf==INVALID_HANDLE_VALUE32) { - fprintf(stderr,"couldn't open file for storage:%ld\n",GetLastError()); + WARN(ole,"couldn't open file for storage:%ld\n",GetLastError()); return E_FAIL; } lpstg = (LPSTORAGE16)PTR_SEG_TO_LIN(*ppstgOpen); @@ -1489,7 +1489,7 @@ OLESTATUS WINAPI StgCreateDocFile16( OLESTATUS WINAPI StgCreateDocFile32( LPCOLESTR32 pwcsName,DWORD grfMode,DWORD reserved,IStorage32 **ppstgOpen ) { - fprintf(stderr,"StgCreateDocfile(%p,0x%08lx,0x%08lx,%p)\n", + TRACE(ole,"(%p,0x%08lx,0x%08lx,%p)\n", pwcsName,grfMode,reserved,ppstgOpen ); *ppstgOpen = (IStorage32*)HeapAlloc(GetProcessHeap(),0,sizeof(IStorage32)); @@ -1503,7 +1503,7 @@ OLESTATUS WINAPI StgIsStorageFile16(LPCOLESTR16 fn) { OFSTRUCT ofs; BYTE magic[24]; - fprintf(stderr,"StgIsStorageFile(%s)",fn); + TRACE(ole,"(\'%s\')",fn); hf = OpenFile32(fn,&ofs,OF_SHARE_DENY_NONE); if (hf==HFILE_ERROR32) return STG_E_FILENOTFOUND; @@ -1527,12 +1527,14 @@ OLESTATUS WINAPI StgIsStorageFile16(LPCOLESTR16 fn) { _lclose32(hf); return STG_E_OLDFORMAT; } - fprintf(stderr," -> Invalid header.\n"); + WARN(ole," -> Invalid header.\n"); _lclose32(hf); return STG_E_INVALIDHEADER; } -OLESTATUS WINAPI StgIsStorageFile32(LPCOLESTR32 fn) { +OLESTATUS WINAPI +StgIsStorageFile32(LPCOLESTR32 fn) +{ LPOLESTR16 xfn = HEAP_strdupWtoA(GetProcessHeap(),0,fn); OLESTATUS ret = StgIsStorageFile16(xfn); @@ -1551,7 +1553,7 @@ OLESTATUS WINAPI StgOpenStorage16( LPSTORAGE16 lpstg; struct storage_pps_entry stde; - fprintf(stderr,"StgOpenStorage(%s,%p,0x%08lx,%p,%ld,%p)\n", + TRACE(ole,"(%s,%p,0x%08lx,%p,%ld,%p)\n", pwcsName,pstgPriority,grfMode,snbExclude,reserved,ppstgOpen ); _create_istorage16(ppstgOpen); @@ -1584,11 +1586,13 @@ OLESTATUS WINAPI StgOpenStorage32( const OLECHAR32 * pwcsName,IStorage32 *pstgPriority,DWORD grfMode, SNB32 snbExclude,DWORD reserved, IStorage32 **ppstgOpen ) { - fprintf(stderr,"StgOpenStorage32(%p,%p,0x%08lx,%p,%ld,%p),stub!\n", - pwcsName,pstgPriority,grfMode,snbExclude,reserved,ppstgOpen - ); + FIXME(ole,"StgOpenStorage32(%p,%p,0x%08lx,%p,%ld,%p),stub!\n", + pwcsName,pstgPriority,grfMode,snbExclude,reserved, + ppstgOpen); *ppstgOpen = (IStorage32*)HeapAlloc(GetProcessHeap(),0,sizeof(IStorage32)); (*ppstgOpen)->ref = 1; (*ppstgOpen)->lpvtbl = &stvt32; return OLE_OK; } + + diff --git a/ole/typelib.c b/ole/typelib.c index 4ad759db5aa..9e529fe97cd 100644 --- a/ole/typelib.c +++ b/ole/typelib.c @@ -8,36 +8,115 @@ #include #include #include "wintypes.h" +#include "heap.h" #include "windows.h" +#include "winreg.h" #include "winerror.h" #include "ole.h" #include "ole2.h" +#include "oleauto.h" #include "compobj.h" #include "debug.h" /**************************************************************************** * QueryPathOfRegTypeLib (TYPELIB.14) + * the path is "Classes\Typelib\\.\\win16\" * RETURNS * path of typelib */ HRESULT WINAPI -QueryPathOfRegTypeLib( +QueryPathOfRegTypeLib16( REFGUID guid, /* [in] referenced guid */ WORD wMaj, /* [in] major version */ WORD wMin, /* [in] minor version */ LCID lcid, /* [in] locale id */ - LPSTR path /* [out] path of typelib */ + LPBSTR16 path /* [out] path of typelib */ ) { char xguid[80]; + char typelibkey[100],pathname[260]; + DWORD plen; - if (HIWORD(guid)) + if (HIWORD(guid)) { WINE_StringFromCLSID(guid,xguid); - else + sprintf(typelibkey,"SOFTWARE\\Classes\\Typelib\\%s\\%d.%d\\%ld\\win16", + xguid,wMaj,wMin,lcid&0xff + ); + } else { sprintf(xguid,"",(DWORD)guid); - FIXME(ole,"(%s,%d,%d,0x%04lx,%p),stub!\n",xguid,wMaj,wMin,lcid,path); - return E_FAIL; + FIXME(ole,"(%s,%d,%d,0x%04x,%p),can't handle non-string guids.\n",xguid,wMaj,wMin,lcid,path); + return E_FAIL; + } + plen = sizeof(pathname); + if (RegQueryValue16(HKEY_LOCAL_MACHINE,typelibkey,pathname,&plen)) { + FIXME(ole,"key %s not found\n",typelibkey); + return E_FAIL; + } + *path = SysAllocString16(pathname); + return S_OK; } +/**************************************************************************** + * QueryPathOfRegTypeLib (OLEAUT32.164) + * RETURNS + * path of typelib + */ +HRESULT WINAPI +QueryPathOfRegTypeLib32( + REFGUID guid, /* [in] referenced guid */ + WORD wMaj, /* [in] major version */ + WORD wMin, /* [in] minor version */ + LCID lcid, /* [in] locale id */ + LPBSTR32 path /* [out] path of typelib */ +) { + char xguid[80]; + char typelibkey[100],pathname[260]; + DWORD plen; + + + if (HIWORD(guid)) { + WINE_StringFromCLSID(guid,xguid); + sprintf(typelibkey,"SOFTWARE\\Classes\\Typelib\\%s\\%d.%d\\%ld\\win32", + xguid,wMaj,wMin,lcid&0xff + ); + } else { + sprintf(xguid,"",(DWORD)guid); + FIXME(ole,"(%s,%d,%d,0x%04x,%p),stub!\n",xguid,wMaj,wMin,lcid,path); + return E_FAIL; + } + plen = sizeof(pathname); + if (RegQueryValue16(HKEY_LOCAL_MACHINE,typelibkey,pathname,&plen)) { + FIXME(ole,"key %s not found\n",typelibkey); + return E_FAIL; + } + *path = HEAP_strdupAtoW(GetProcessHeap(),0,pathname); + return S_OK; +} + +/****************************************************************************** + * LoadTypeLib [TYPELIB.3] Loads and registers a type library + * + * NOTES + * Docs: OLECHAR FAR* szFile + * Docs: iTypeLib FAR* FAR* pptLib + * + * RETURNS + * Success: S_OK + * Failure: Status + */ +HRESULT WINAPI LoadTypeLib( + void *szFile, /* [in] Name of file to load from */ + void * *pptLib) /* [out] Pointer to pointer to loaded type library */ +{ + FIXME(ole, "(%s,%p): stub\n",debugstr_a(szFile),pptLib); + return E_FAIL; +} + + +/**************************************************************************** + * OABuildVersion (TYPELIB.15) + * RETURNS + * path of typelib + */ DWORD WINAPI OABuildVersion() { return MAKELONG(0xbd3, 0x3); diff --git a/programs/clock/main.c b/programs/clock/main.c index 7df60026a91..5d865018ed0 100644 --- a/programs/clock/main.c +++ b/programs/clock/main.c @@ -274,7 +274,7 @@ int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show) class.hCursor = LoadCursor (0, IDC_ARROW); class.hbrBackground = GetStockObject (GRAY_BRUSH); class.lpszMenuName = "\0"; - class.lpszClassName = (SEGPTR)className; + class.lpszClassName = className; } if (!RegisterClass (&class)) return FALSE; diff --git a/programs/notepad/main.c b/programs/notepad/main.c index 4b434a22a7c..8cd5fcd678b 100644 --- a/programs/notepad/main.c +++ b/programs/notepad/main.c @@ -149,7 +149,7 @@ int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show) class.hCursor = LoadCursor (0, IDC_ARROW); class.hbrBackground = GetStockObject (WHITE_BRUSH); class.lpszMenuName = 0; - class.lpszClassName = (SEGPTR)className; + class.lpszClassName = className; } if (!RegisterClass (&class)) diff --git a/programs/progman/dialog.c b/programs/progman/dialog.c index 76efc95f058..5157d92b1f3 100644 --- a/programs/progman/dialog.c +++ b/programs/progman/dialog.c @@ -573,7 +573,7 @@ static VOID DIALOG_AddFilterItem(LPSTR *p, UINT ids, LPCSTR filter) { LoadString(Globals.hInstance, ids, *p, MAX_STRING_LEN); *p += strlen(*p) + 1; - lstrcpy(*p, (SEGPTR) filter); + lstrcpy(*p, filter); *p += strlen(*p) + 1; **p = '\0'; } diff --git a/programs/progman/grpfile.c b/programs/progman/grpfile.c index bb4a5e5feef..01c83de18f6 100644 --- a/programs/progman/grpfile.c +++ b/programs/progman/grpfile.c @@ -631,7 +631,7 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, GROUP *group) { PROGRAM *program = LocalLock(hProgram); CURSORICONINFO *iconinfo = LocalLock(program->hIcon); - SEGPTR XorBits, AndBits; + LPVOID XorBits, AndBits; INT sizeXor = iconinfo->nHeight * iconinfo->nWidthBytes; INT sizeAnd = iconinfo->nHeight * ((iconinfo->nWidth + 15) / 16 * 2); DumpIcon(LocalLock(program->hIcon), 0, &XorBits, &AndBits); diff --git a/programs/winhelp/hlp2sgml.c b/programs/winhelp/hlp2sgml.c index 2294c851d4b..ba7827a16c3 100644 --- a/programs/winhelp/hlp2sgml.c +++ b/programs/winhelp/hlp2sgml.c @@ -264,7 +264,7 @@ HFILE _lclose32( HFILE hFile ) return 0; } -LONG _hread32( HFILE hFile, SEGPTR buffer, LONG count ) +LONG _hread32( HFILE hFile, LPVOID buffer, LONG count ) { return fread(buffer, 1, count, file); } diff --git a/relay32/Makefile.in b/relay32/Makefile.in index 52e1e6a2062..b42f3c4e19a 100644 --- a/relay32/Makefile.in +++ b/relay32/Makefile.in @@ -14,6 +14,7 @@ DLLS = \ ddraw.spec \ dinput.spec \ dplay.spec \ + dplayx.spec \ dsound.spec \ gdi32.spec \ kernel32.spec \ @@ -22,6 +23,7 @@ DLLS = \ msvfw32.spec \ ntdll.spec \ ole32.spec \ + oleaut32.spec \ olecli32.spec \ olesvr32.spec \ shell32.spec \ diff --git a/relay32/advapi32.spec b/relay32/advapi32.spec index 7c2edcc7d49..53a9508a864 100644 --- a/relay32/advapi32.spec +++ b/relay32/advapi32.spec @@ -23,17 +23,17 @@ type win32 0019 stub ClearEventLogA 0020 stub ClearEventLogW 0021 stub CloseEventLog -0022 stub CloseServiceHandle -0023 stub ControlService +0022 stdcall CloseServiceHandle(long) CloseServiceHandle +0023 stdcall ControlService(long long ptr) ControlService 0024 stdcall CopySid(long ptr ptr) CopySid 0025 stub CreatePrivateObjectSecurity 0026 stub CreateProcessAsUserA 0027 stub CreateProcessAsUserW -0028 stub CreateServiceA +0028 stdcall CreateServiceA(long ptr ptr long long long long ptr ptr ptr ptr ptr ptr) CreateServiceA 0029 stub CreateServiceW 0030 stub DeleteAce -0031 stub DeleteService -0032 stub DeregisterEventSource +0031 stdcall DeleteService(long) DeleteService +0032 stdcall DeregisterEventSource(long) DeregisterEventSource 0033 stub DestroyPrivateObjectSecurity 0034 stub DuplicateToken 0035 stub EnumDependentServicesA @@ -94,7 +94,7 @@ type win32 0090 stub LookupPrivilegeNameA 0091 stub LookupPrivilegeNameW 0092 stdcall LookupPrivilegeValueA(ptr ptr ptr) LookupPrivilegeValue32A -0093 stub LookupPrivilegeValueW +0093 stdcall LookupPrivilegeValueW(ptr ptr ptr) LookupPrivilegeValue32W 0094 stub MakeAbsoluteSD 0095 stub MakeSelfRelativeSD 0096 stub MapGenericMask @@ -111,10 +111,10 @@ type win32 0107 stub OpenEventLogA 0108 stub OpenEventLogW 0109 stdcall OpenProcessToken(long long ptr) OpenProcessToken -0110 stdcall OpenSCManagerA(ptr ptr long) OpenSCManagerA -0111 stdcall OpenSCManagerW(ptr ptr long) OpenSCManagerW -0112 stub OpenServiceA -0113 stub OpenServiceW +0110 stdcall OpenSCManagerA(ptr ptr long) OpenSCManager32A +0111 stdcall OpenSCManagerW(ptr ptr long) OpenSCManager32W +0112 stdcall OpenServiceA(long str long) OpenService32A +0113 stdcall OpenServiceW(long wstr long) OpenService32W 0114 stdcall OpenThreadToken(long long long ptr) OpenThreadToken 0115 stub PrivilegeCheck 0116 stub PrivilegedServiceAuditAlarmA @@ -145,7 +145,7 @@ type win32 0141 stdcall RegEnumValueA(long long ptr ptr ptr ptr ptr ptr) RegEnumValue32A 0142 stdcall RegEnumValueW(long long ptr ptr ptr ptr ptr ptr) RegEnumValue32W 0143 stdcall RegFlushKey(long) RegFlushKey -0144 stub RegGetKeySecurity +0144 stdcall RegGetKeySecurity(long long ptr ptr) RegGetKeySecurity 0145 stub RegLoadKeyA 0146 stub RegLoadKeyW 0147 stub RegNotifyChangeKeyValue @@ -175,8 +175,8 @@ type win32 0171 stdcall RegSetValueW(long wstr long ptr long) RegSetValue32W 0172 stub RegUnLoadKeyA 0173 stub RegUnLoadKeyW -0174 stub RegisterEventSourceA -0175 stub RegisterEventSourceW +0174 stdcall RegisterEventSourceA(ptr ptr) RegisterEventSource32A +0175 stdcall RegisterEventSourceW(ptr ptr) RegisterEventSource32W 0176 stub RegisterServiceCtrlHandlerA 0177 stub RegisterServiceCtrlHandlerW 0178 stub ReportEventA @@ -196,10 +196,10 @@ type win32 0192 stub SetServiceStatus 0193 stub SetThreadToken 0194 stub SetTokenInformation -0195 stub StartServiceA +0195 stdcall StartServiceA(long long ptr) StartService32A 0196 stdcall StartServiceCtrlDispatcherA(ptr) StartServiceCtrlDispatcher32A 0197 stdcall StartServiceCtrlDispatcherW(ptr) StartServiceCtrlDispatcher32W -0198 stub StartServiceW +0198 stdcall StartServiceW(long long ptr) StartService32W 0199 stub UnlockServiceDatabase 0200 stub LsaOpenPolicy 0201 stub LsaLookupSids diff --git a/relay32/builtin32.c b/relay32/builtin32.c index baa32d707c2..593cc101ce4 100644 --- a/relay32/builtin32.c +++ b/relay32/builtin32.c @@ -9,6 +9,7 @@ #include #include "builtin32.h" #include "module.h" +#include "heap.h" #include "task.h" #include "process.h" #include "debug.h" @@ -46,6 +47,7 @@ extern const BUILTIN32_DESCRIPTOR DCIMAN32_Descriptor; extern const BUILTIN32_DESCRIPTOR DDRAW_Descriptor; extern const BUILTIN32_DESCRIPTOR DINPUT_Descriptor; extern const BUILTIN32_DESCRIPTOR DPLAY_Descriptor; +extern const BUILTIN32_DESCRIPTOR DPLAYX_Descriptor; extern const BUILTIN32_DESCRIPTOR DSOUND_Descriptor; extern const BUILTIN32_DESCRIPTOR GDI32_Descriptor; extern const BUILTIN32_DESCRIPTOR KERNEL32_Descriptor; @@ -54,6 +56,7 @@ extern const BUILTIN32_DESCRIPTOR MPR_Descriptor; extern const BUILTIN32_DESCRIPTOR MSVFW32_Descriptor; extern const BUILTIN32_DESCRIPTOR NTDLL_Descriptor; extern const BUILTIN32_DESCRIPTOR OLE32_Descriptor; +extern const BUILTIN32_DESCRIPTOR OLEAUT32_Descriptor; extern const BUILTIN32_DESCRIPTOR OLECLI32_Descriptor; extern const BUILTIN32_DESCRIPTOR OLESVR32_Descriptor; extern const BUILTIN32_DESCRIPTOR SHELL32_Descriptor; @@ -76,6 +79,7 @@ static BUILTIN32_DLL BuiltinDLLs[] = { &DDRAW_Descriptor, NULL, TRUE }, { &DINPUT_Descriptor, NULL, TRUE }, { &DPLAY_Descriptor, NULL, TRUE }, + { &DPLAYX_Descriptor, NULL, TRUE }, { &DSOUND_Descriptor, NULL, TRUE }, { &GDI32_Descriptor, NULL, TRUE }, { &KERNEL32_Descriptor, NULL, TRUE }, @@ -84,6 +88,7 @@ static BUILTIN32_DLL BuiltinDLLs[] = { &MSVFW32_Descriptor, NULL, FALSE }, { &NTDLL_Descriptor, NULL, TRUE }, { &OLE32_Descriptor, NULL, FALSE }, + { &OLEAUT32_Descriptor, NULL, FALSE }, { &OLECLI32_Descriptor, NULL, FALSE }, { &OLESVR32_Descriptor, NULL, FALSE }, { &SHELL32_Descriptor, NULL, TRUE }, @@ -93,7 +98,7 @@ static BUILTIN32_DLL BuiltinDLLs[] = { &W32SKRNL_Descriptor, NULL, TRUE }, { &WINMM_Descriptor, NULL, TRUE }, { &WINSPOOL_Descriptor, NULL, TRUE }, - { &WOW32_Descriptor, NULL, TRUE }, + { &WOW32_Descriptor, NULL, TRUE }, { &WSOCK32_Descriptor, NULL, TRUE }, /* Last entry */ { NULL, NULL, FALSE } @@ -122,6 +127,7 @@ static HMODULE32 BUILTIN32_DoLoadModule( BUILTIN32_DLL *dll, PDB32 *pdb ) LPSTR *names; DEBUG_ENTRY_POINT *debug; REG_ENTRY_POINT *regs; + WINE_MODREF *wm; PE_MODREF *pem; INT32 i, size; BYTE *addr; @@ -212,7 +218,7 @@ static HMODULE32 BUILTIN32_DoLoadModule( BUILTIN32_DLL *dll, PDB32 *pdb ) /* Build the exports section data */ - exp->Name = (BYTE *)dll->descr->name - addr; /*??*/ + exp->Name = ((BYTE *)dll->descr->name) - addr; /*??*/ exp->Base = dll->descr->base; exp->NumberOfFunctions = dll->descr->nb_funcs; exp->NumberOfNames = dll->descr->nb_names; @@ -276,12 +282,16 @@ static HMODULE32 BUILTIN32_DoLoadModule( BUILTIN32_DLL *dll, PDB32 *pdb ) *names = (LPSTR)((BYTE *)dll->descr->names[i] - addr); /* Create a modref */ + wm = (WINE_MODREF *)HeapAlloc( pdb->heap, HEAP_ZERO_MEMORY, sizeof(*wm) ); + wm->type = MODULE32_PE; + pem = &(wm->binfmt.pe); + wm->module = (HMODULE32)addr; + wm->next = pdb->modref_list; + pdb->modref_list = wm; + wm->modname = HEAP_strdupA(pdb->heap,0,dll->descr->name); - pem = (PE_MODREF *)HeapAlloc( pdb->heap, HEAP_ZERO_MEMORY, sizeof(*pem) ); - pem->module = (HMODULE32)addr; - pem->pe_export = exp; - pem->next = pdb->modref_list; - pdb->modref_list = pem; + pem->pe_export = exp; + pem->flags = PE_MODREF_INTERNAL; /* Create a Win16 dummy module */ diff --git a/relay32/comdlg32.spec b/relay32/comdlg32.spec index 14de9bdb72c..696d149fdff 100644 --- a/relay32/comdlg32.spec +++ b/relay32/comdlg32.spec @@ -5,7 +5,7 @@ type win32 1 stub ChooseColorA 2 stub ChooseColorW 3 stdcall ChooseFontA(ptr) ChooseFont32A - 4 stub ChooseFontW + 4 stdcall ChooseFontW(ptr) ChooseFont32W 5 stdcall CommDlgExtendedError() CommDlgExtendedError 6 stdcall FindTextA(ptr) FindText32A 7 stdcall FindTextW(ptr) FindText32W diff --git a/relay32/crtdll.spec b/relay32/crtdll.spec index 01274c5bb58..2c4b15d1af3 100644 --- a/relay32/crtdll.spec +++ b/relay32/crtdll.spec @@ -137,7 +137,7 @@ type win32 133 stub _heapwalk 134 stub _hypot 135 cdecl _initterm(ptr ptr) CRTDLL__initterm -136 stub _iob +136 extern _iob CRTDLL_iob 137 cdecl _isatty(long) CRTDLL__isatty 138 cdecl _isctype(long long) CRTDLL__isctype 139 stub _ismbbalnum diff --git a/relay32/dplayx.spec b/relay32/dplayx.spec new file mode 100644 index 00000000000..7a7cd758042 --- /dev/null +++ b/relay32/dplayx.spec @@ -0,0 +1,9 @@ +name dplayx +type win32 + + 1 stub DirectPlayCreate + 2 stub DirectPlayEnumerateA + 3 stub DirectPlayEnumerateW + 4 stub DirectPlayLobbyCreateA + 5 stub DirectPlayLobbyCreateW + 9 stub DirectPlayEnumerate diff --git a/relay32/dsound.spec b/relay32/dsound.spec index cfb19a7b158..f0d79ee831d 100644 --- a/relay32/dsound.spec +++ b/relay32/dsound.spec @@ -4,8 +4,8 @@ type win32 0 stdcall DirectSoundCreate(ptr ptr ptr) DirectSoundCreate 1 stdcall DirectSoundEnumerateA(ptr ptr) DirectSoundEnumerate32A 2 stub DirectSoundEnumerateW -3 stub DllCanUnloadNow -4 stub DllGetClassObject +3 stdcall DllCanUnloadNow() DllCanUnloadNow +4 stdcall DllGetClassObject(ptr ptr ptr) DllGetClassObject 5 stub DirectSoundCaptureCreate 6 stub DirectSoundCaptureEnumerateA 7 stub DirectSoundCaptureEnumerateW diff --git a/relay32/gdi32.spec b/relay32/gdi32.spec index a741b2d482d..a447b8d8d5b 100644 --- a/relay32/gdi32.spec +++ b/relay32/gdi32.spec @@ -14,7 +14,7 @@ type win32 10 stdcall BitBlt(long long long long long long long long long) BitBlt32 11 stub CancelDC 12 stub CheckColorsInGamut - 13 stub ChoosePixelFormat + 13 stdcall ChoosePixelFormat(long ptr) ChoosePixelFormat 14 stdcall Chord(long long long long long long long long long) Chord32 15 stdcall CloseEnhMetaFile(long) CloseEnhMetaFile32 16 stdcall CloseFigure(long) CloseFigure32 @@ -22,7 +22,7 @@ type win32 18 stub ColorMatchToTarget 19 stdcall CombineRgn(long long long long) CombineRgn32 20 stub CombineTransform - 21 stub CopyEnhMetaFileA + 21 stdcall CopyEnhMetaFileA(long str) CopyEnhMetaFile32A 22 stub CopyEnhMetaFileW 23 stdcall CopyMetaFileA(long str) CopyMetaFile32A 24 stdcall CopyMetaFileW(long wstr) CopyMetaFile32W @@ -75,7 +75,7 @@ type win32 68 stdcall DeleteEnhMetaFile(long) DeleteEnhMetaFile 69 stdcall DeleteMetaFile(long) DeleteMetaFile32 70 stdcall DeleteObject(long) DeleteObject32 - 71 stub DescribePixelFormat + 71 stdcall DescribePixelFormat(long long long ptr) DescribePixelFormat 72 stub DeviceCapabilitiesExA 73 stub DeviceCapabilitiesExW 74 stub DrawEscape @@ -92,7 +92,7 @@ type win32 85 stdcall EnumFontsW(long wstr ptr long) EnumFonts32W 86 stub EnumICMProfilesA 87 stub EnumICMProfilesW - 88 stub EnumMetaFile + 88 stdcall EnumMetaFile(long long ptr ptr) EnumMetaFile32 89 stdcall EnumObjects(long long ptr long) EnumObjects32 90 stdcall EqualRgn(long long) EqualRgn32 91 stdcall Escape(long long long ptr ptr) Escape32 @@ -179,7 +179,7 @@ type win32 172 stub GetDeviceGammaRamp 173 stub GetETM 174 stdcall GetEnhMetaFileA(ptr) GetEnhMetaFile32A -175 stub GetEnhMetaFileBits +175 stdcall GetEnhMetaFileBits(long long ptr) GetEnhMetaFileBits 176 stdcall GetEnhMetaFileDescriptionA(long long ptr) GetEnhMetaFileDescription32A 177 stub GetEnhMetaFileDescriptionW 178 stdcall GetEnhMetaFileHeader(long long ptr) GetEnhMetaFileHeader @@ -202,7 +202,7 @@ type win32 195 stub GetLogColorSpaceW 196 stdcall GetMapMode(long) GetMapMode32 197 stdcall GetMetaFileA(str) GetMetaFile32A -198 stub GetMetaFileBitsEx +198 stdcall GetMetaFileBitsEx(long long ptr) GetMetaFileBitsEx 199 stdcall GetMetaFileW(wstr) GetMetaFile32W 200 stub GetMetaRgn 201 stub GetMiterLimit @@ -216,7 +216,7 @@ type win32 209 stdcall GetPaletteEntries(long long long ptr) GetPaletteEntries32 210 stdcall GetPath(long ptr ptr long) GetPath32 211 stdcall GetPixel(long long long) GetPixel32 -212 stub GetPixelFormat +212 stdcall GetPixelFormat(long) GetPixelFormat 213 stdcall GetPolyFillMode(long) GetPolyFillMode32 214 stdcall GetROP2(long) GetROP232 215 stub GetRandomRgn @@ -272,11 +272,11 @@ type win32 265 stdcall PlayMetaFile(long long) PlayMetaFile32 266 stdcall PlayMetaFileRecord(long ptr ptr long) PlayMetaFileRecord32 267 stub PlgBlt -268 stub PolyBezier +268 stdcall PolyBezier(long ptr long) PolyBezier32 269 stub PolyBezierTo 270 stub PolyDraw 271 stdcall PolyPolygon(long ptr ptr long) PolyPolygon32 -272 stub PolyPolyline +272 stdcall PolyPolyline(long ptr ptr long) PolyPolyline32 273 stub PolyTextOutA 274 stub PolyTextOutW 275 stdcall Polygon(long ptr long) Polygon32 @@ -320,7 +320,7 @@ type win32 313 stdcall SetDIBitsToDevice(long long long long long long long long long ptr ptr long) SetDIBitsToDevice32 314 stub SetDeviceGammaRamp -315 stub SetEnhMetaFileBits +315 stdcall SetEnhMetaFileBits(long ptr) SetEnhMetaFileBits 316 stub SetFontEnumeration 317 stdcall SetGraphicsMode(long long) SetGraphicsMode 318 stub SetICMMode @@ -333,7 +333,7 @@ type win32 325 stub SetMiterLimit 326 stdcall SetPaletteEntries(long long long ptr) SetPaletteEntries32 327 stdcall SetPixel(long long long long) SetPixel32 -328 stub SetPixelFormat +328 stdcall SetPixelFormat(long long ptr) SetPixelFormat 329 stdcall SetPixelV(long long long long) SetPixelV32 330 stdcall SetPolyFillMode(long long) SetPolyFillMode32 331 stdcall SetROP2(long long) SetROP232 @@ -361,7 +361,7 @@ type win32 ptr ptr long long) StretchDIBits32 352 stub StrokeAndFillPath 353 stub StrokePath -354 stub SwapBuffers +354 stdcall SwapBuffers(long) SwapBuffers 355 stdcall TextOutA(long long long str long) TextOut32A 356 stdcall TextOutW(long long long wstr long) TextOut32W 357 stub UnloadNetworkFonts diff --git a/relay32/kernel32.spec b/relay32/kernel32.spec index b4cbeb2ec90..5a996b4e553 100644 --- a/relay32/kernel32.spec +++ b/relay32/kernel32.spec @@ -175,8 +175,8 @@ type win32 161 stdcall CreateFileW(wstr long long ptr long long long) CreateFile32W 162 stub CreateIoCompletionPort 163 stub CreateKernelThread -164 stub CreateMailslotA -165 stub CreateMailslotW +164 stdcall CreateMailslotA(ptr long long ptr) CreateMailslot32A +165 stdcall CreateMailslotW(ptr long long ptr) CreateMailslot32W 166 stdcall CreateMutexA(ptr long str) CreateMutex32A 167 stdcall CreateMutexW(ptr long wstr) CreateMutex32W 168 stdcall CreateNamedPipeA(str long long long long long long ptr) CreateNamedPipeA @@ -252,9 +252,9 @@ type win32 238 stdcall FileTimeToDosDateTime(ptr ptr ptr) FileTimeToDosDateTime 239 stdcall FileTimeToLocalFileTime(ptr ptr) FileTimeToLocalFileTime 240 stdcall FileTimeToSystemTime(ptr ptr) FileTimeToSystemTime -241 stub FillConsoleOutputAttribute -242 stub FillConsoleOutputCharacterA -243 stub FillConsoleOutputCharacterW +241 stdcall FillConsoleOutputAttribute(long long long long ptr) FillConsoleOutputAttribute +242 stdcall FillConsoleOutputCharacterA(long long long long ptr) FillConsoleOutputCharacterA +243 stdcall FillConsoleOutputCharacterW(long long long long ptr) FillConsoleOutputCharacterW 244 stdcall FindAtomA(str) FindAtom32A 245 stdcall FindAtomW(wstr) FindAtom32W 247 stub FindCloseChangeNotification @@ -302,8 +302,8 @@ type win32 288 stdcall GetCommTimeouts(long ptr) GetCommTimeouts 289 stdcall GetCommandLineA() GetCommandLine32A 290 stdcall GetCommandLineW() GetCommandLine32W -291 stub GetCompressedFileSizeA -292 stub GetCompressedFileSizeW +291 stdcall GetCompressedFileSizeA(long ptr) GetCompressedFileSize32A +292 stdcall GetCompressedFileSizeW(long ptr) GetCompressedFileSize32W 293 stdcall GetComputerNameA(ptr ptr) GetComputerName32A 294 stdcall GetComputerNameW(ptr ptr) GetComputerName32W 295 stdcall GetConsoleCP() GetConsoleCP @@ -321,8 +321,8 @@ type win32 307 stdcall GetCurrentProcessId() GetCurrentProcessId 308 stdcall GetCurrentThread() GetCurrentThread 309 stdcall GetCurrentThreadId() GetCurrentThreadId -310 stdcall GetDateFormatA(long long ptr ptr ptr long) GetDateFormat32A -311 stub GetDateFormatW +310 stdcall GetDateFormatA(long long ptr str ptr long) GetDateFormat32A +311 stdcall GetDateFormatW(long long ptr wstr ptr long) GetDateFormat32W 312 stub GetDaylightFlag 313 stub GetDefaultCommConfigA 314 stub GetDefaultCommConfigW @@ -336,7 +336,7 @@ type win32 322 stdcall GetEnvironmentVariableA(str ptr long) GetEnvironmentVariable32A 323 stdcall GetEnvironmentVariableW(wstr ptr long) GetEnvironmentVariable32W 324 stub GetErrorMode -325 stub GetExitCodeProcess +325 stdcall GetExitCodeProcess(long ptr) GetExitCodeProcess 326 stdcall GetExitCodeThread(long ptr) GetExitCodeThread 327 stdcall GetFileAttributesA(str) GetFileAttributes32A 328 stdcall GetFileAttributesW(wstr) GetFileAttributes32W @@ -358,7 +358,7 @@ type win32 344 stdcall GetLogicalDriveStringsA(long ptr) GetLogicalDriveStrings32A 345 stdcall GetLogicalDriveStringsW(long ptr) GetLogicalDriveStrings32W 346 stdcall GetLogicalDrives() GetLogicalDrives -347 stub GetMailslotInfo +347 stdcall GetMailslotInfo(long ptr ptr ptr ptr) GetMailslotInfo 348 stdcall GetModuleFileNameA(long ptr long) GetModuleFileName32A 349 stdcall GetModuleFileNameW(long ptr long) GetModuleFileName32W 350 stdcall GetModuleHandleA(str) GetModuleHandle32A @@ -434,7 +434,7 @@ type win32 420 stdcall GetThreadTimes(long ptr ptr ptr ptr) GetThreadTimes 421 stdcall GetTickCount() GetTickCount 422 stdcall GetTimeFormatA(long long ptr str ptr long) GetTimeFormat32A -423 stub GetTimeFormatW +423 stdcall GetTimeFormatW(long long ptr wstr ptr long) GetTimeFormat32W 424 stdcall GetTimeZoneInformation(ptr) GetTimeZoneInformation 425 stdcall GetUserDefaultLCID() GetUserDefaultLCID 426 stdcall GetUserDefaultLangID() GetUserDefaultLangID @@ -580,7 +580,7 @@ type win32 566 stub QueueUserAPC 567 register RaiseException() EXC_RaiseException 568 stdcall ReadConsoleA(long ptr long ptr ptr) ReadConsole32A -569 stub ReadConsoleInputA +569 stdcall ReadConsoleInputA(long ptr long ptr) ReadConsoleInputA 570 stub ReadConsoleInputW 571 stub ReadConsoleOutputA 572 stub ReadConsoleOutputAttribute @@ -632,8 +632,8 @@ type win32 618 stdcall SetCommMask(long ptr) SetCommMask 619 stdcall SetCommState(long ptr) SetCommState32 620 stdcall SetCommTimeouts(long ptr) SetCommTimeouts -621 stub SetComputerNameA -622 stub SetComputerNameW +621 stdcall SetComputerNameA(str) SetComputerName32A +622 stdcall SetComputerNameW(wstr) SetComputerName32W 623 stdcall SetConsoleActiveScreenBuffer(long) SetConsoleActiveScreenBuffer 624 stub SetConsoleCP 625 stdcall SetConsoleCtrlHandler(ptr long) SetConsoleCtrlHandler @@ -641,11 +641,11 @@ type win32 627 stdcall SetConsoleCursorPosition(long long) SetConsoleCursorPosition 628 stdcall SetConsoleMode(long long) SetConsoleMode 629 stub SetConsoleOutputCP -630 stub SetConsoleScreenBufferSize -631 stub SetConsoleTextAttribute +630 stdcall SetConsoleScreenBufferSize(long long) SetConsoleScreenBufferSize +631 stdcall SetConsoleTextAttribute(long long) SetConsoleTextAttribute32 632 stdcall SetConsoleTitleA(str) SetConsoleTitle32A 633 stdcall SetConsoleTitleW(wstr) SetConsoleTitle32W -634 stub SetConsoleWindowInfo +634 stdcall SetConsoleWindowInfo(long long ptr) SetConsoleWindowInfo 635 stdcall SetCurrentDirectoryA(str) SetCurrentDirectory32A 636 stdcall SetCurrentDirectoryW(wstr) SetCurrentDirectory32W 637 stub SetDaylightFlag @@ -731,7 +731,7 @@ type win32 717 stdcall VirtualQueryEx(long ptr ptr long) VirtualQueryEx 718 stdcall VirtualUnlock(ptr long) VirtualUnlock 719 stub WaitCommEvent -720 stub WaitForDebugEvent +720 stdcall WaitForDebugEvent(ptr long) WaitForDebugEvent 721 stdcall WaitForMultipleObjects(long ptr long long) WaitForMultipleObjects 722 stdcall WaitForMultipleObjectsEx(long ptr long long long) WaitForMultipleObjectsEx 723 stdcall WaitForSingleObject(long long) WaitForSingleObject diff --git a/relay32/mpr.spec b/relay32/mpr.spec index 2be81b5b6b1..ce8e8213306 100644 --- a/relay32/mpr.spec +++ b/relay32/mpr.spec @@ -24,13 +24,13 @@ type win32 0043 stub PwdGetPasswordStatusW 0044 stub PwdSetPasswordStatusA 0045 stub PwdSetPasswordStatusW -0046 stub WNetAddConnection2A -0047 stub WNetAddConnection2W -0048 stub WNetAddConnection3A -0049 stub WNetAddConnection3W -0050 stub WNetAddConnectionA -0051 stub WNetAddConnectionW -0052 stdcall WNetCachePassword(ptr long ptr long long) WNetCachePassword +0046 stdcall WNetAddConnection2A(ptr str str long) WNetAddConnection2_32A +0047 stdcall WNetAddConnection2W(ptr wstr wstr long) WNetAddConnection2_32W +0048 stdcall WNetAddConnection3A(long ptr str str long) WNetAddConnection3_32A +0049 stdcall WNetAddConnection3W(long ptr wstr wstr long) WNetAddConnection3_32W +0050 stdcall WNetAddConnectionA(str str str) WNetAddConnection32A +0051 stdcall WNetAddConnectionW(wstr wstr wstr) WNetAddConnection32W +0052 stdcall WNetCachePassword(str long str long long) WNetCachePassword 0053 stub WNetCancelConnection2A 0054 stub WNetCancelConnection2W 0055 stub WNetCancelConnectionA diff --git a/relay32/oleaut32.spec b/relay32/oleaut32.spec new file mode 100644 index 00000000000..a315b0a6d46 --- /dev/null +++ b/relay32/oleaut32.spec @@ -0,0 +1,292 @@ +name oleaut32 +type win32 + +1 stub DllGetClassObject +2 stdcall SysAllocString(wstr) SysAllocString32 +3 stdcall SysReAllocString(ptr wstr) SysReAllocString32 +4 stub SysAllocStringLen +5 stub SysReAllocStringLen +6 stdcall SysFreeString(wstr) SysFreeString32 +7 stub SysStringLen +8 stub VariantInit +9 stub VariantClear +10 stub VariantCopy +11 stub VariantCopyInd +12 stub VariantChangeType +13 stub VariantTimeToDosDateTime +14 stub DosDateTimeToVariantTime +15 stub SafeArrayCreate +16 stub SafeArrayDestroy +17 stub SafeArrayGetDim +18 stub SafeArrayGetElemsize +19 stub SafeArrayGetUBound +20 stub SafeArrayGetLBound +21 stub SafeArrayLock +22 stub SafeArrayUnlock +23 stub SafeArrayAccessData +24 stub SafeArrayUnaccessData +25 stub SafeArrayGetElement +26 stub SafeArrayPutElement +27 stub SafeArrayCopy +28 stub DispGetParam +29 stub DispGetIDsOfNames +30 stub DispInvoke +31 stub CreateDispTypeInfo +32 stub CreateStdDispatch +33 stub RegisterActiveObject +34 stub RevokeActiveObject +35 stub GetActiveObject +36 stub SafeArrayAllocDescriptor +37 stub SafeArrayAllocData +38 stub SafeArrayDestroyDescriptor +39 stub SafeArrayDestroyData +40 stub SafeArrayRedim +41 stub OACreateTypeLib2 +46 stub VarParseNumFromStr +47 stub VarNumFromParseNum +48 stub VarI2FromUI1 +49 stub VarI2FromI4 +50 stub VarI2FromR4 +51 stub VarI2FromR8 +52 stub VarI2FromCy +53 stub VarI2FromDate +54 stub VarI2FromStr +55 stub VarI2FromDisp +56 stub VarI2FromBool +58 stub VarI4FromUI1 +59 stub VarI4FromI2 +60 stub VarI4FromR4 +61 stub VarI4FromR8 +62 stub VarI4FromCy +63 stub VarI4FromDate +64 stub VarI4FromStr +65 stub VarI4FromDisp +66 stub VarI4FromBool +68 stub VarR4FromUI1 +69 stub VarR4FromI2 +70 stub VarR4FromI4 +71 stub VarR4FromR8 +72 stub VarR4FromCy +73 stub VarR4FromDate +74 stub VarR4FromStr +75 stub VarR4FromDisp +76 stub VarR4FromBool +78 stub VarR8FromUI1 +79 stub VarR8FromI2 +80 stub VarR8FromI4 +81 stub VarR8FromR4 +82 stub VarR8FromCy +83 stub VarR8FromDate +84 stub VarR8FromStr +85 stub VarR8FromDisp +86 stub VarR8FromBool +88 stub VarDateFromUI1 +89 stub VarDateFromI2 +90 stub VarDateFromI4 +91 stub VarDateFromR4 +92 stub VarDateFromR8 +93 stub VarDateFromCy +94 stub VarDateFromStr +95 stub VarDateFromDisp +96 stub VarDateFromBool +98 stub VarCyFromUI1 +99 stub VarCyFromI2 +100 stub VarCyFromI4 +101 stub VarCyFromR4 +102 stub VarCyFromR8 +103 stub VarCyFromDate +104 stub VarCyFromStr +105 stub VarCyFromDisp +106 stub VarCyFromBool +108 stub VarBstrFromUI1 +109 stub VarBstrFromI2 +110 stub VarBstrFromI4 +111 stub VarBstrFromR4 +112 stub VarBstrFromR8 +113 stub VarBstrFromCy +114 stub VarBstrFromDate +115 stub VarBstrFromDisp +116 stub VarBstrFromBool +118 stub VarBoolFromUI1 +119 stub VarBoolFromI2 +120 stub VarBoolFromI4 +121 stub VarBoolFromR4 +122 stub VarBoolFromR8 +123 stub VarBoolFromDate +124 stub VarBoolFromCy +125 stub VarBoolFromStr +126 stub VarBoolFromDisp +130 stub VarUI1FromI2 +131 stub VarUI1FromI4 +132 stub VarUI1FromR4 +133 stub VarUI1FromR8 +134 stub VarUI1FromCy +135 stub VarUI1FromDate +136 stub VarUI1FromStr +137 stub VarUI1FromDisp +138 stub VarUI1FromBool +146 stub DispCallFunc +147 stub VariantChangeTypeEx +148 stub SafeArrayPtrOfIndex +149 stub SysStringByteLen +150 stub SysAllocStringByteLen +160 stub CreateTypeLib +161 stub LoadTypeLib +162 stub LoadRegTypeLib +163 stub RegisterTypeLib +164 stdcall QueryPathOfRegTypeLib(ptr long long long ptr) QueryPathOfRegTypeLib32 +165 stub LHashValOfNameSys +166 stub LHashValOfNameSysA +170 stub OaBuildVersion +171 stub ClearCustData +180 stub CreateTypeLib2 +183 stub LoadTypeLibEx +184 stub SystemTimeToVariantTime +185 stub VariantTimeToSystemTime +186 stub UnRegisterTypeLib +190 stub VarDecFromUI1 +191 stub VarDecFromI2 +192 stub VarDecFromI4 +193 stub VarDecFromR4 +194 stub VarDecFromR8 +195 stub VarDecFromDate +196 stub VarDecFromCy +197 stub VarDecFromStr +198 stub VarDecFromDisp +199 stub VarDecFromBool +200 stub GetErrorInfo +201 stub SetErrorInfo +202 stub CreateErrorInfo +205 stub VarI2FromI1 +206 stub VarI2FromUI2 +207 stub VarI2FromUI4 +208 stub VarI2FromDec +209 stub VarI4FromI1 +210 stub VarI4FromUI2 +211 stub VarI4FromUI4 +212 stub VarI4FromDec +213 stub VarR4FromI1 +214 stub VarR4FromUI2 +215 stub VarR4FromUI4 +216 stub VarR4FromDec +217 stub VarR8FromI1 +218 stub VarR8FromUI2 +219 stub VarR8FromUI4 +220 stub VarR8FromDec +221 stub VarDateFromI1 +222 stub VarDateFromUI2 +223 stub VarDateFromUI4 +224 stub VarDateFromDec +225 stub VarCyFromI1 +226 stub VarCyFromUI2 +227 stub VarCyFromUI4 +228 stub VarCyFromDec +229 stub VarBstrFromI1 +230 stub VarBstrFromUI2 +231 stub VarBstrFromUI4 +232 stub VarBstrFromDec +233 stub VarBoolFromI1 +234 stub VarBoolFromUI2 +235 stub VarBoolFromUI4 +236 stub VarBoolFromDec +237 stub VarUI1FromI1 +238 stub VarUI1FromUI2 +239 stub VarUI1FromUI4 +240 stub VarUI1FromDec +241 stub VarDecFromI1 +242 stub VarDecFromUI2 +243 stub VarDecFromUI4 +244 stub VarI1FromUI1 +245 stub VarI1FromI2 +246 stub VarI1FromI4 +247 stub VarI1FromR4 +248 stub VarI1FromR8 +249 stub VarI1FromDate +250 stub VarI1FromCy +251 stub VarI1FromStr +252 stub VarI1FromDisp +253 stub VarI1FromBool +254 stub VarI1FromUI2 +255 stub VarI1FromUI4 +256 stub VarI1FromDec +257 stub VarUI2FromUI1 +258 stub VarUI2FromI2 +259 stub VarUI2FromI4 +260 stub VarUI2FromR4 +261 stub VarUI2FromR8 +262 stub VarUI2FromDate +263 stub VarUI2FromCy +264 stub VarUI2FromStr +265 stub VarUI2FromDisp +266 stub VarUI2FromBool +267 stub VarUI2FromI1 +268 stub VarUI2FromUI4 +269 stub VarUI2FromDec +270 stub VarUI4FromUI1 +271 stub VarUI4FromI2 +272 stub VarUI4FromI4 +273 stub VarUI4FromR4 +274 stub VarUI4FromR8 +275 stub VarUI4FromDate +276 stub VarUI4FromCy +277 stub VarUI4FromStr +278 stub VarUI4FromDisp +279 stub VarUI4FromBool +280 stub VarUI4FromI1 +281 stub VarUI4FromUI2 +282 stub VarUI4FromDec +283 stub BSTR_UserSize +284 stub BSTR_UserMarshal +285 stub BSTR_UserUnmarshal +286 stub BSTR_UserFree +287 stub VARIANT_UserSize +288 stub VARIANT_UserMarshal +289 stub VARIANT_UserUnmarshal +290 stub VARIANT_UserFree +291 stub LPSAFEARRAY_UserSize +292 stub LPSAFEARRAY_UserMarshal +293 stub LPSAFEARRAY_UserUnmarshal +294 stub LPSAFEARRAY_UserFree +295 stub LPSAFEARRAY_Size +296 stub LPSAFEARRAY_Marshal +297 stub LPSAFEARRAY_Unmarshal +320 stub DllRegisterServer +321 stub DllUnregisterServer +330 stub VarDateFromUdate +331 stub VarUdateFromDate +332 stub GetAltMonthNames +380 stub UserHWND_from_local +381 stub UserHWND_to_local +382 stub UserHWND_free_inst +383 stub UserHWND_free_local +384 stub UserBSTR_from_local +385 stub UserBSTR_to_local +386 stub UserBSTR_free_inst +387 stub UserBSTR_free_local +388 stub UserVARIANT_from_local +389 stub UserVARIANT_to_local +390 stub UserVARIANT_free_inst +391 stub UserVARIANT_free_local +392 stub UserEXCEPINFO_from_local +393 stub UserEXCEPINFO_to_local +394 stub UserEXCEPINFO_free_inst +395 stub UserEXCEPINFO_free_local +396 stub UserMSG_from_local +397 stub UserMSG_to_local +398 stub UserMSG_free_inst +399 stub UserMSG_free_local +410 stub DllCanUnloadNow +411 stub SafeArrayCreateVector +412 stub SafeArrayCopyData +413 stub VectorFromBstr +414 stub BstrFromVector +415 stub OleIconToCursor +416 stub OleCreatePropertyFrameIndirect +417 stub OleCreatePropertyFrame +418 stub OleLoadPicture +419 stub OleCreatePictureIndirect +420 stub OleCreateFontIndirect +421 stub OleTranslateColor +422 stub OleLoadPictureFile +423 stub OleSavePictureFile +424 stub OleLoadPicturePath diff --git a/relay32/relay386.c b/relay32/relay386.c index 5177ac29696..8203e407016 100644 --- a/relay32/relay386.c +++ b/relay32/relay386.c @@ -190,8 +190,8 @@ int RELAY_CallFrom32( int ret_addr, ... ) void RELAY_CallFrom32Regs( CONTEXT context ) { - void (CALLBACK *entry_point)(CONTEXT *) = - *(void (CALLBACK **)(CONTEXT *)) (ESP_reg(&context) - 4); + typedef void (CALLBACK *entry_point_t)(CONTEXT *); + entry_point_t entry_point = *(entry_point_t*) (ESP_reg(&context) - 4); if (!TRACE_ON(relay)) { diff --git a/relay32/user32.spec b/relay32/user32.spec index 1b3e611db7c..e73bd807120 100644 --- a/relay32/user32.spec +++ b/relay32/user32.spec @@ -79,8 +79,8 @@ type win32 76 stdcall CreateIconFromResource (ptr long long long) CreateIconFromResource32 77 stdcall CreateIconFromResourceEx(ptr long long long long long long) CreateIconFromResourceEx32 78 stdcall CreateIconIndirect(ptr) CreateIconIndirect - 79 stub CreateMDIWindowA - 80 stub CreateMDIWindowW + 79 stdcall CreateMDIWindowA(ptr ptr long long long long long long long long) CreateMDIWindowA + 80 stdcall CreateMDIWindowW(ptr ptr long long long long long long long long) CreateMDIWindowW 81 stdcall CreateMenu() CreateMenu32 82 stdcall CreatePopupMenu() CreatePopupMenu32 83 stdcall CreateWindowExA(long str str long long long long long @@ -95,16 +95,16 @@ type win32 90 stdcall DdeClientTransaction(ptr long long long long long long ptr) DdeClientTransaction32 91 stub DdeCmpStringHandles 92 stdcall DdeConnect(long long long ptr) DdeConnect32 - 93 stub DdeConnectList + 93 stdcall DdeConnectList(long long long long ptr) DdeConnectList32 94 stub DdeCreateDataHandle 95 stdcall DdeCreateStringHandleA(long ptr long) DdeCreateStringHandle32A 96 stdcall DdeCreateStringHandleW(long ptr long) DdeCreateStringHandle32W 97 stdcall DdeDisconnect(long) DdeDisconnect32 - 98 stub DdeDisconnectList + 98 stdcall DdeDisconnectList(long) DdeDisconnectList32 99 stub DdeEnableCallback 100 stdcall DdeFreeDataHandle(long) DdeFreeDataHandle32 101 stdcall DdeFreeStringHandle(long long) DdeFreeStringHandle32 -102 stub DdeGetData +102 stdcall DdeGetData(long ptr long long) DdeGetData32 103 stdcall DdeGetLastError(long) DdeGetLastError32 104 stub DdeGetQualityOfService 105 stub DdeImpersonateClient @@ -112,7 +112,7 @@ type win32 107 stdcall DdeInitializeW(ptr ptr long long) DdeInitialize32W 108 stdcall DdeKeepStringHandle(long long) DdeKeepStringHandle32 109 stdcall DdeNameService(long long long long) DdeNameService32 -110 stub DdePostAdvise +110 stdcall DdePostAdvise(long long long) DdePostAdvise32 111 stub DdeQueryConvInfo 112 stub DdeQueryNextServer 113 stub DdeQueryStringA @@ -282,7 +282,7 @@ type win32 277 stdcall GetOpenClipboardWindow() GetOpenClipboardWindow32 278 stdcall GetParent(long) GetParent32 279 stdcall GetPriorityClipboardFormat(ptr long) GetPriorityClipboardFormat32 -280 stub GetProcessWindowStation +280 stdcall GetProcessWindowStation() GetProcessWindowStation 281 stdcall GetPropA(long ptr) GetProp32A 282 stdcall GetPropW(long ptr) GetProp32W 283 stdcall GetQueueStatus(long) GetQueueStatus32 @@ -297,7 +297,7 @@ type win32 292 stdcall GetSystemMetrics(long) GetSystemMetrics32 293 stdcall GetTabbedTextExtentA(long str long long ptr) GetTabbedTextExtent32A 294 stdcall GetTabbedTextExtentW(long wstr long long ptr) GetTabbedTextExtent32W -295 stub GetThreadDesktop +295 stdcall GetThreadDesktop(long) GetThreadDesktop 296 stdcall GetTopWindow(long) GetTopWindow32 297 stdcall GetUpdateRect(long ptr long) GetUpdateRect32 298 stdcall GetUpdateRgn(long long long) GetUpdateRgn32 @@ -477,7 +477,7 @@ type win32 472 stdcall SetCursor(long) SetCursor32 473 stub SetCursorContents 474 stdcall SetCursorPos(long long) SetCursorPos32 -475 stub SetDebugErrorLevel +475 stdcall SetDebugErrorLevel(long) SetDebugErrorLevel 476 stdcall SetDeskWallPaper(str) SetDeskWallPaper32 477 stdcall SetDlgItemInt(long long long long) SetDlgItemInt32 478 stdcall SetDlgItemTextA(long long str) SetDlgItemText32A @@ -597,10 +597,10 @@ type win32 591 stub EnumDesktopWindows 592 stdcall EnumDisplaySettingsA(str long ptr) EnumDisplaySettings32A 593 stub EnumDisplaySettingsW -594 stub GetWindowRgn +594 stdcall GetWindowRgn(long long) GetWindowRgn32 595 stub MapVirtualKeyExW 596 stub RegisterServicesProcess -597 stub SetWindowRgn +597 stdcall SetWindowRgn(long long long) SetWindowRgn32 598 stub ToUnicodeEx 599 stdcall DrawCaptionTempA(long long ptr long long str long) DrawCaptionTemp32A 600 stub RegisterNetworkCapabilities @@ -609,3 +609,4 @@ type win32 603 stub IsHungAppWindow 604 stub ChangeDisplaySettingsA 605 stub ChangeDisplaySettingsW +606 stdcall SetWindowText(long str) SetWindowText32A diff --git a/scheduler/process.c b/scheduler/process.c index ce6fc50fe74..361875e0156 100644 --- a/scheduler/process.c +++ b/scheduler/process.c @@ -261,6 +261,7 @@ PDB32 *PROCESS_Create( NE_MODULE *pModule, LPCSTR cmd_line, LPCSTR env, { size = 0x10000; commit = 0; + pdb->flags |= PDB32_WIN16_PROC; /* This is a Win16 process */ } if (!(pdb->heap = HeapCreate( HEAP_GROWABLE, size, commit ))) goto error; pdb->heap_list = pdb->heap; @@ -668,3 +669,28 @@ DWORD RegisterServiceProcess(DWORD dwProcessId, DWORD dwType) /* I don't think that Wine needs to do anything in that function */ return 1; /* success */ } + +/*********************************************************************** + * GetExitCodeProcess [KERNEL32.325] + * + * Gets termination status of specified process + * + * RETURNS + * Success: TRUE + * Failure: FALSE + * + * FIXME + * Should call SetLastError (but doesn't). + */ +BOOL32 WINAPI GetExitCodeProcess( + HANDLE32 hProcess, /* [I] handle to the process */ + LPDWORD lpExitCode) /* [O] address to receive termination status */ +{ + PDB32 *process; + + if (!(process = PROCESS_GetPtr( hProcess, PROCESS_QUERY_INFORMATION ))) + return FALSE; + if (lpExitCode) *lpExitCode = process->exit_code; + K32OBJ_DecCount( &process->header ); + return TRUE; +} diff --git a/win32/advapi.c b/win32/advapi.c index d84a2f11657..cee2675caea 100644 --- a/win32/advapi.c +++ b/win32/advapi.c @@ -35,16 +35,26 @@ BOOL32 WINAPI StartServiceCtrlDispatcher32W(LPSERVICE_TABLE_ENTRY32W servent) } -/*********************************************************************** - * OpenProcessToken [ADVAPI32.197] +/****************************************************************************** + * OpenProcessToken [ADVAPI32.109] + * Opens the access token associated with a process + * + * PARAMS + * ProcessHandle [I] Handle to process + * DesiredAccess [I] Desired access to process + * TokenHandle [O] Pointer to handle of open access token + * + * RETURNS STD */ -BOOL32 WINAPI OpenProcessToken(HANDLE32 process,DWORD desiredaccess, - HANDLE32 *thandle) +BOOL32 WINAPI OpenProcessToken( HANDLE32 ProcessHandle, DWORD DesiredAccess, + HANDLE32 *TokenHandle ) { - FIXME(advapi,"(%08x,%08lx,%p):stub!\n",process,desiredaccess,thandle); - return TRUE; + FIXME(advapi,"(%08x,%08lx,%p): stub\n",ProcessHandle,DesiredAccess, + TokenHandle); + return TRUE; } + /*********************************************************************** * OpenThreadToken [ADVAPI32.114] */ @@ -56,15 +66,45 @@ BOOL32 WINAPI OpenThreadToken( HANDLE32 thread,DWORD desiredaccess, return TRUE; } -/*********************************************************************** - * LookupPrivilegeValueA [ADVAPI32.90] + +/****************************************************************************** + * LookupPrivilegeValue32A [ADVAPI32.92] */ -BOOL32 WINAPI LookupPrivilegeValue32A(LPCSTR system,LPCSTR name,LPVOID bla) +BOOL32 WINAPI LookupPrivilegeValue32A( LPCSTR lpSystemName, + LPCSTR lpName, LPVOID lpLuid) { - FIXME(advapi,"(%s,%s,%p): stub\n",system,name,bla); - return TRUE; + LPWSTR lpSystemNameW = HEAP_strdupAtoW(GetProcessHeap(), 0, lpSystemName); + LPWSTR lpNameW = HEAP_strdupAtoW(GetProcessHeap(), 0, lpName); + BOOL32 ret = LookupPrivilegeValue32W( lpSystemNameW, lpNameW, lpLuid); + HeapFree(GetProcessHeap(), 0, lpNameW); + HeapFree(GetProcessHeap(), 0, lpSystemNameW); + return ret; } + +/****************************************************************************** + * LookupPrivilegeValue32W [ADVAPI32.93] + * Retrieves LUID used on a system to represent the privilege name. + * + * NOTES + * lpLuid should be PLUID + * + * PARAMS + * lpSystemName [I] Address of string specifying the system + * lpName [I] Address of string specifying the privilege + * lpLuid [I] Address of locally unique identifier + * + * RETURNS STD + */ +BOOL32 WINAPI LookupPrivilegeValue32W( LPCWSTR lpSystemName, + LPCWSTR lpName, LPVOID lpLuid ) +{ + FIXME(advapi,"(%s,%s,%p): stub\n",debugstr_w(lpSystemName), + debugstr_w(lpName), lpLuid); + return TRUE; +} + + /*********************************************************************** * AdjustTokenPrivileges [ADVAPI32.10] */ @@ -87,25 +127,245 @@ BOOL32 WINAPI GetTokenInformation( return TRUE; } -/*SC_HANDLE*/ -DWORD WINAPI OpenSCManagerA(LPCSTR machine,LPCSTR dbname,DWORD desiredaccess) + +/****************************************************************************** + * OpenSCManager32A [ADVAPI32.110] + */ +HANDLE32 WINAPI OpenSCManager32A( LPCSTR lpMachineName, LPCSTR lpDatabaseName, + DWORD dwDesiredAccess ) { - FIXME(advapi,"(%s,%s,%08lx): stub\n",machine,dbname,desiredaccess); - return 0; + LPWSTR lpMachineNameW = HEAP_strdupAtoW(GetProcessHeap(),0,lpMachineName); + LPWSTR lpDatabaseNameW = HEAP_strdupAtoW(GetProcessHeap(),0,lpDatabaseName); + DWORD ret = OpenSCManager32W(lpMachineNameW,lpDatabaseNameW, + dwDesiredAccess); + HeapFree(GetProcessHeap(),0,lpDatabaseNameW); + HeapFree(GetProcessHeap(),0,lpMachineNameW); + return ret; } -DWORD WINAPI OpenSCManagerW(LPCWSTR machine,LPCWSTR dbname,DWORD desiredaccess) + +/****************************************************************************** + * OpenSCManager32W [ADVAPI32.111] + * Establishes a connection to the service control manager and opens database + * + * NOTES + * This should return a SC_HANDLE + * + * PARAMS + * lpMachineName [I] Pointer to machine name string + * lpDatabaseName [I] Pointer to database name string + * dwDesiredAccess [I] Type of access + * + * RETURNS + * Success: Handle to service control manager database + * Failure: NULL + */ +HANDLE32 WINAPI OpenSCManager32W( LPCWSTR lpMachineName, LPCWSTR lpDatabaseName, + DWORD dwDesiredAccess ) { - LPSTR machineA = HEAP_strdupWtoA(GetProcessHeap(),0,machine); - LPSTR dbnameA = HEAP_strdupWtoA(GetProcessHeap(),0,dbname); - FIXME(advapi,"(%s,%s,%08lx): stub\n",machineA,dbnameA,desiredaccess); - HeapFree(GetProcessHeap(),0,machineA); - HeapFree(GetProcessHeap(),0,dbnameA); - return 0; + FIXME(advapi,"(%s,%s,%08lx): stub\n", debugstr_w(lpMachineName), + debugstr_w(lpDatabaseName), dwDesiredAccess); + return 1; } + BOOL32 WINAPI AllocateLocallyUniqueId(LPLUID lpluid) { lpluid->LowPart = time(NULL); lpluid->HighPart = 0; return TRUE; } + + +/****************************************************************************** + * ControlService [ADVAPI32.23] + * Sends a control code to a Win32-based service. + * + * NOTES + * hService should be SC_HANDLE + * + * RETURNS STD + */ +BOOL32 WINAPI ControlService( HANDLE32 hService, DWORD dwControl, + LPSERVICE_STATUS lpServiceStatus ) +{ + FIXME(advapi, "(%d,%ld,%p): stub\n",hService,dwControl,lpServiceStatus); + return TRUE; +} + + +/****************************************************************************** + * CloseServiceHandle [ADVAPI32.22] + * Close handle to service or service control manager + * + * PARAMS + * hSCObject [I] Handle to service or service control manager database + * + * NOTES + * hSCObject should be SC_HANDLE + * + * RETURNS STD + */ +BOOL32 WINAPI CloseServiceHandle( HANDLE32 hSCObject ) +{ + FIXME(advapi, "(%d): stub\n", hSCObject); + return TRUE; +} + + +/****************************************************************************** + * OpenService32A [ADVAPI32.112] + */ +HANDLE32 WINAPI OpenService32A( HANDLE32 hSCManager, LPCSTR lpServiceName, + DWORD dwDesiredAccess ) +{ + LPWSTR lpServiceNameW = HEAP_strdupAtoW(GetProcessHeap(),0,lpServiceName); + DWORD ret = OpenService32W( hSCManager, lpServiceNameW, dwDesiredAccess); + HeapFree(GetProcessHeap(),0,lpServiceNameW); + return ret; +} + + +/****************************************************************************** + * OpenService32W [ADVAPI32.113] + * Opens a handle to an existing service + * + * NOTES + * The return value should be SC_HANDLE + * hSCManager should be SC_HANDLE + * + * RETURNS + * Success: Handle to the service + * Failure: NULL + */ +HANDLE32 WINAPI OpenService32W( HANDLE32 hSCManager, LPCWSTR lpServiceName, + DWORD dwDesiredAccess ) +{ + FIXME(advapi, "(%d,%p,%ld): stub\n",hSCManager, lpServiceName, + dwDesiredAccess); + return 1; +} + + +/****************************************************************************** + * CreateServiceA [ADVAPI32.28] + */ +DWORD WINAPI CreateServiceA( DWORD hSCManager, LPCSTR lpServiceName, + LPCSTR lpDisplayName, DWORD dwDesiredAccess, + DWORD dwServiceType, DWORD dwStartType, + DWORD dwErrorControl, LPCSTR lpBinaryPathName, + LPCSTR lpLoadOrderGroup, LPDWORD lpdwTagId, + LPCSTR lpDependencies, LPCSTR lpServiceStartName, + LPCSTR lpPassword ) +{ + FIXME(advapi, "(%ld,%s,%s,...): stub\n", + hSCManager, debugstr_a(lpServiceName), debugstr_a(lpDisplayName)); + return 1; +} + + +/****************************************************************************** + * DeleteService [ADVAPI32.31] + * + * PARAMS + * hService [I] Handle to service + * + * RETURNS STD + * + * NOTES + * hService should be SC_HANDLE + */ +BOOL32 WINAPI DeleteService( HANDLE32 hService ) +{ + FIXME(advapi, "(%d): stub\n",hService); + return TRUE; +} + + +/****************************************************************************** + * StartService32A [ADVAPI32.195] + * + * NOTES + * How do we convert lpServiceArgVectors to use the 32W version? + */ +BOOL32 WINAPI StartService32A( HANDLE32 hService, DWORD dwNumServiceArgs, + LPCSTR *lpServiceArgVectors ) +{ + FIXME(advapi, "(%d,%ld,%p): stub\n",hService,dwNumServiceArgs,lpServiceArgVectors); + return TRUE; +} + + +/****************************************************************************** + * StartService32W [ADVAPI32.198] + * Starts a service + * + * PARAMS + * hService [I] Handle of service + * dwNumServiceArgs [I] Number of arguments + * lpServiceArgVectors [I] Address of array of argument string pointers + * + * RETURNS STD + * + * NOTES + * hService should be SC_HANDLE + */ +BOOL32 WINAPI StartService32W( HANDLE32 hService, DWORD dwNumServiceArgs, + LPCWSTR *lpServiceArgVectors ) +{ + FIXME(advapi, "(%d,%ld,%p): stub\n",hService,dwNumServiceArgs, + lpServiceArgVectors); + return TRUE; +} + + +/****************************************************************************** + * DeregisterEventSource [ADVAPI32.32] + * Closes a handle to the specified event log + * + * PARAMS + * hEventLog [I] Handle to event log + * + * RETURNS STD + */ +BOOL32 WINAPI DeregisterEventSource( HANDLE32 hEventLog ) +{ + FIXME(advapi, "(%d): stub\n",hEventLog); + return TRUE; +} + + +/****************************************************************************** + * RegisterEventSource32A [ADVAPI32.174] + */ +HANDLE32 WINAPI RegisterEventSource32A( LPCSTR lpUNCServerName, + LPCSTR lpSourceName ) +{ + LPWSTR lpUNCServerNameW = HEAP_strdupAtoW(GetProcessHeap(),0,lpUNCServerName); + LPWSTR lpSourceNameW = HEAP_strdupAtoW(GetProcessHeap(),0,lpSourceName); + HANDLE32 ret = RegisterEventSource32W(lpUNCServerNameW,lpSourceNameW); + HeapFree(GetProcessHeap(),0,lpSourceNameW); + HeapFree(GetProcessHeap(),0,lpUNCServerNameW); + return ret; +} + + +/****************************************************************************** + * RegisterEventSource32W [ADVAPI32.175] + * Returns a registered handle to an event log + * + * PARAMS + * lpUNCServerName [I] Server name for source + * lpSourceName [I] Source name for registered handle + * + * RETURNS + * Success: Handle + * Failure: NULL + */ +HANDLE32 WINAPI RegisterEventSource32W( LPCWSTR lpUNCServerName, + LPCWSTR lpSourceName ) +{ + FIXME(advapi, "(%s,%s): stub\n", debugstr_w(lpUNCServerName), + debugstr_w(lpSourceName)); + return 1; +} + diff --git a/win32/code_page.c b/win32/code_page.c index a43c2268a05..f730121810d 100644 --- a/win32/code_page.c +++ b/win32/code_page.c @@ -13,14 +13,20 @@ #include "debug.h" -/*********************************************************************** - * GetACP (KERNEL32.148) +/****************************************************************************** + * GetACP [KERNEL32.276] Gets current ANSI code-page identifier. + * + * RETURNS + * Current ANSI code-page identifier, default if no current defined */ UINT32 WINAPI GetACP(void) { + /* This introduces too many messages */ +/* FIXME(win32, "(void): stub\n"); */ return 1252; /* Windows 3.1 ISO Latin */ } + /*********************************************************************** * GetCPInfo (KERNEL32.154) */ @@ -82,7 +88,34 @@ BOOL32 WINAPI IsValidCodePage(UINT32 CodePage) /*********************************************************************** - * MultiByteToWideChar (KERNEL32.392) + * MultiByteToWideChar (KERNEL32.534) + * + * PARAMS + * page [in] Codepage character set to convert from + * flags [in] Character mapping flags + * src [in] Source string buffer + * srclen [in] Length of source string buffer + * dst [in] Destination buffer + * dstlen [in] Length of destination buffer + * + * NOTES + * The returned length includes the null terminator character. + * + * RETURNS + * Success: If dstlen > 0, number of characters written to destination + * buffer. If dstlen == 0, number of characters needed to do + * conversion. + * Failure: 0. Occurs if not enough space is available. + * + * ERRORS + * ERROR_INSUFFICIENT_BUFFER + * ERROR_INVALID_FLAGS (not yet implemented) + * ERROR_INVALID_PARAMETER (not yet implemented) + * + * BUGS + * Does not properly handle codepage conversions. + * Does not properly handle flags. + * */ INT32 WINAPI MultiByteToWideChar(UINT32 page, DWORD flags, LPCSTR src, INT32 srclen, @@ -91,25 +124,56 @@ INT32 WINAPI MultiByteToWideChar(UINT32 page, DWORD flags, int ret; if (srclen == -1) - srclen = lstrlen32A(src); + srclen = lstrlen32A(src)+1; if (!dstlen || !dst) return srclen; ret = srclen; - while (srclen > 0 && dstlen > 0) { + while (srclen && dstlen) { *dst = (WCHAR)(unsigned char)*src; - if (!*src) - return ret; dst++; src++; dstlen--; srclen--; } - if ((dstlen == 0) && *src) { + if (!dstlen && srclen) { SetLastError(ERROR_INSUFFICIENT_BUFFER); return 0; } return ret; } +/*********************************************************************** + * WideCharToMultiByte (KERNEL32.727) + * + * PARAMS + * page [in] Codepage character set to convert to + * flags [in] Character mapping flags + * src [in] Source string buffer + * srclen [in] Length of source string buffer + * dst [in] Destination buffer + * dstlen [in] Length of destination buffer + * defchar [in] Default character to use for conversion if no exact + * conversion can be made + * used [out] Set if default character was used in the conversion + * + * NOTES + * The returned length includes the null terminator character. + * + * RETURNS + * Success: If dstlen > 0, number of characters written to destination + * buffer. If dstlen == 0, number of characters needed to do + * conversion. + * Failure: 0. Occurs if not enough space is available. + * + * ERRORS + * ERROR_INSUFFICIENT_BUFFER + * ERROR_INVALID_FLAGS (not yet implemented) + * ERROR_INVALID_PARAMETER (not yet implemented) + * + * BUGS + * Does not properly handle codepage conversions. + * Does not properly handle flags. + * + */ INT32 WINAPI WideCharToMultiByte(UINT32 page, DWORD flags, LPCWSTR src, INT32 srclen,LPSTR dst, INT32 dstlen, LPCSTR defchar, BOOL32 *used) diff --git a/win32/console.c b/win32/console.c index 1ab7d84d12e..89d70dc96ac 100644 --- a/win32/console.c +++ b/win32/console.c @@ -48,6 +48,14 @@ typedef struct _CONSOLE { } CONSOLE; +/* This probably belongs somewhere else */ +typedef struct _CONSOLE_CURSOR_INFO { + DWORD dwSize; /* Between 1 & 100 for percentage of cell filled */ + BOOL32 bVisible; /* Visibility of cursor */ +} CONSOLE_CURSOR_INFO, *LPCONSOLE_CURSOR_INFO; + + + static void CONSOLE_Destroy( K32OBJ *obj ); static BOOL32 CONSOLE_Write(K32OBJ *ptr, LPCVOID lpBuffer, DWORD nNumberOfChars, LPDWORD lpNumberOfChars, @@ -72,7 +80,9 @@ const K32OBJ_OPS CONSOLE_Ops = - +/*********************************************************************** + * CONSOLE_Destroy + */ static void CONSOLE_Destroy(K32OBJ *obj) { CONSOLE *console = (CONSOLE *)obj; @@ -91,7 +101,12 @@ static void CONSOLE_Destroy(K32OBJ *obj) } -/* lpOverlapped is ignored */ +/*********************************************************************** + * CONSOLE_Read + * + * NOTES + * lpOverlapped is ignored + */ static BOOL32 CONSOLE_Read(K32OBJ *ptr, LPVOID lpBuffer, DWORD nNumberOfChars, LPDWORD lpNumberOfChars, LPOVERLAPPED lpOverlapped) { @@ -112,7 +127,12 @@ static BOOL32 CONSOLE_Read(K32OBJ *ptr, LPVOID lpBuffer, DWORD nNumberOfChars, } -/* lpOverlapped is ignored */ +/*********************************************************************** + * CONSOLE_Write + * + * NOTES + * lpOverlapped is ignored + */ static BOOL32 CONSOLE_Write(K32OBJ *ptr, LPCVOID lpBuffer, DWORD nNumberOfChars, LPDWORD lpNumberOfChars, LPOVERLAPPED lpOverlapped) @@ -145,29 +165,51 @@ static BOOL32 CONSOLE_Write(K32OBJ *ptr, LPCVOID lpBuffer, } - - -/*********************************************************************** - * SetConsoleCtrlHandler (KERNEL32.459) +/****************************************************************************** + * SetConsoleCtrlHandler [KERNEL32.459] Adds function to calling process list + * + * PARAMS + * func [I] Address of handler function + * add [I] Handler to add or remove + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ -BOOL32 WINAPI SetConsoleCtrlHandler(HANDLER_ROUTINE * func, BOOL32 a) +BOOL32 WINAPI SetConsoleCtrlHandler( HANDLER_ROUTINE *func, BOOL32 add ) { - return 0; + FIXME(console, "(%p,%i): stub\n",func,add); + return TRUE; } -/*********************************************************************** - * CreateConsoleScreenBuffer (KERNEL32.151) + +/****************************************************************************** + * CreateConsoleScreenBuffer [KERNEL32.151] Creates a console screen buffer + * + * PARAMS + * dwDesiredAccess [I] Access flag + * dwShareMode [I] Buffer share mode + * sa [I] Security attributes + * dwFlags [I] Type of buffer to create + * lpScreenBufferData [I] Reserved + * + * NOTES + * Should call SetLastError + * + * RETURNS + * Success: Handle to new console screen buffer + * Failure: INVALID_HANDLE_VALUE */ HANDLE32 WINAPI CreateConsoleScreenBuffer( DWORD dwDesiredAccess, - DWORD dwShareMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwFlags, - LPVOID lpScreenBufferData) + DWORD dwShareMode, LPSECURITY_ATTRIBUTES sa, + DWORD dwFlags, LPVOID lpScreenBufferData ) { - FIXME(console, "(...): stub !\n"); - return INVALID_HANDLE_VALUE32; + FIXME(console, "(%ld,%ld,%p,%ld,%p): stub\n",dwDesiredAccess, + dwShareMode, sa, dwFlags, lpScreenBufferData); + return 1; } + /*********************************************************************** * GetConsoleScreenBufferInfo (KERNEL32.190) */ @@ -188,15 +230,22 @@ BOOL32 WINAPI GetConsoleScreenBufferInfo( HANDLE32 hConsoleOutput, return TRUE; } -/*********************************************************************** - * SetConsoleActiveScreenBuffer (KERNEL32.623) + +/****************************************************************************** + * SetConsoleActiveScreenBuffer [KERNEL32.623] Sets buffer to current console + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ -BOOL32 WINAPI SetConsoleActiveScreenBuffer(HANDLE32 hConsoleOutput) +BOOL32 WINAPI SetConsoleActiveScreenBuffer( + HANDLE32 hConsoleOutput) /* [in] Handle to console screen buffer */ { - FIXME(console, "(%x): stub!\n", hConsoleOutput); - return 0; + FIXME(console, "(%x): stub\n", hConsoleOutput); + return FALSE; } + /*********************************************************************** * GetLargestConsoleWindowSize (KERNEL32.226) */ @@ -433,14 +482,18 @@ BOOL32 WINAPI AllocConsole(VOID) } -/*********************************************************************** - * GetConsoleCP (KERNEL32.226) +/****************************************************************************** + * GetConsoleCP [KERNEL32.295] Returns the OEM code page for the console + * + * RETURNS + * Code page code */ UINT32 WINAPI GetConsoleCP(VOID) { return GetACP(); } + /*********************************************************************** * GetConsoleOutputCP (KERNEL32.189) */ @@ -460,15 +513,25 @@ BOOL32 WINAPI GetConsoleMode(HANDLE32 hcon,LPDWORD mode) return TRUE; } -/*********************************************************************** - * SetConsoleMode (KERNEL32.628) + +/****************************************************************************** + * SetConsoleMode [KERNEL32.628] Sets input mode of console's input buffer + * + * PARAMS + * hcon [I] Handle to console input or screen buffer + * mode [I] Input or output mode to set + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ -BOOL32 WINAPI SetConsoleMode(HANDLE32 hcon,DWORD mode) +BOOL32 WINAPI SetConsoleMode( HANDLE32 hcon, DWORD mode ) { - FIXME(console,"(%08x,%08lx): stub\n",hcon,mode); - return TRUE; + FIXME(console,"(%08x,%08lx): stub\n",hcon,mode); + return TRUE; } + /*********************************************************************** * GetConsoleTitleA (KERNEL32.191) */ @@ -485,21 +548,31 @@ DWORD WINAPI GetConsoleTitle32A(LPSTR title,DWORD size) return 0; } -/*********************************************************************** - * GetConsoleTitleW (KERNEL32.192) + +/****************************************************************************** + * GetConsoleTitle32W [KERNEL32.192] Retrieves title string for console + * + * PARAMS + * title [O] Address of buffer for title + * size [I] Size of buffer + * + * RETURNS + * Success: Length of string copied + * Failure: 0 */ -DWORD WINAPI GetConsoleTitle32W(LPWSTR title,DWORD size) +DWORD WINAPI GetConsoleTitle32W( LPWSTR title, DWORD size ) { - PDB32 *pdb = PROCESS_Current(); - CONSOLE *console= (CONSOLE *)pdb->console; - if(console && console->title) - { - lstrcpynAtoW(title,console->title,size); - return (lstrlen32W(title)); - } - return 0; + PDB32 *pdb = PROCESS_Current(); + CONSOLE *console= (CONSOLE *)pdb->console; + if(console && console->title) + { + lstrcpynAtoW(title,console->title,size); + return (lstrlen32W(title)); + } + return 0; } + /*********************************************************************** * WriteConsoleA (KERNEL32.729) */ @@ -514,6 +587,7 @@ BOOL32 WINAPI WriteConsole32A( HANDLE32 hConsoleOutput, lpNumberOfCharsWritten, NULL); } + /*********************************************************************** * WriteConsoleOutputA (KERNEL32.732) */ @@ -523,7 +597,8 @@ BOOL32 WINAPI WriteConsoleOutput32A( HANDLE32 hConsoleOutput, COORD dwBufferCoord, LPSMALL_RECT lpWriteRegion) { - return FALSE; + FIXME(console, "(...):stub\n"); + return FALSE; } /*********************************************************************** @@ -545,9 +620,9 @@ BOOL32 WINAPI WriteConsole32W( HANDLE32 hConsoleOutput, lpNumberOfCharsWritten, NULL); HeapFree( GetProcessHeap(), 0, xstring ); return ret; - } + /*********************************************************************** * ReadConsoleA (KERNEL32.419) */ @@ -610,6 +685,31 @@ BOOL32 WINAPI ReadConsole32W( HANDLE32 hConsoleInput, } + +/****************************************************************************** + * ReadConsoleInputA [KERNEL32.569] Reads data from a console + * + * PARAMS + * hConsoleInput [I] Handle to console input buffer + * lpBuffer [O] Address of buffer for read data + * nLength [I] Number of records to read + * lpNumberOfEventsRead [O] Address of number of records read + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL32 WINAPI ReadConsoleInputA( HANDLE32 hConsoleInput, + LPINPUT_RECORD lpBuffer, + DWORD nLength, LPDWORD lpNumberOfEventsRead) +{ + FIXME(console, "(%d,%p,%ld,%p): stub\n",hConsoleInput, lpBuffer, nLength, + lpNumberOfEventsRead); + return ReadConsole32A(hConsoleInput, lpBuffer, nLength, + lpNumberOfEventsRead, 0); +} + + /*********************************************************************** * SetConsoleTitle32A (KERNEL32.476) */ @@ -622,7 +722,7 @@ BOOL32 WINAPI SetConsoleTitle32A(LPCSTR title) LPSTR titlestring; BOOL32 ret=FALSE; - TRACE(console,"SetConsoleTitle(%s)\n",title); + TRACE(console,"(%s)\n",title); console = (CONSOLE *)pdb->console; if (!console) @@ -645,8 +745,19 @@ BOOL32 WINAPI SetConsoleTitle32A(LPCSTR title) return ret; } -/*********************************************************************** - * SetConsoleTitle32W (KERNEL32.477) + +/****************************************************************************** + * SetConsoleTitle32W [KERNEL32.477] Sets title bar string for console + * + * PARAMS + * title [I] Address of new title + * + * NOTES + * This should not be calling the A version + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ BOOL32 WINAPI SetConsoleTitle32W( LPCWSTR title ) { @@ -658,6 +769,7 @@ BOOL32 WINAPI SetConsoleTitle32W( LPCWSTR title ) return ret; } + /*********************************************************************** * FlushConsoleInputBuffer (KERNEL32.132) */ @@ -667,26 +779,43 @@ BOOL32 WINAPI FlushConsoleInputBuffer(HANDLE32 hConsoleInput) return TRUE; } -BOOL32 WINAPI SetConsoleCursorPosition(HANDLE32 hcons,COORD c) + +/****************************************************************************** + * SetConsoleCursorPosition [KERNEL32.627] + * Sets the cursor position in console + * + * PARAMS + * hConsoleOutput [I] Handle of console screen buffer + * dwCursorPosition [I] New cursor position coordinates + * + * RETURNS STD + */ +BOOL32 WINAPI SetConsoleCursorPosition( HANDLE32 hConsoleOutput, + COORD dwCursorPosition ) { + TRACE(console, "%d (%d x %d)\n", hConsoleOutput, dwCursorPosition.x, + dwCursorPosition.y); /* x are columns, y rows */ - if (!c.y) { + if (!dwCursorPosition.y) { fprintf(stderr,"\r"); - if (c.x) - fprintf(stderr,"%c[%dC", 0x1B, c.x); /* note: 0x1b == ESC */ + if (dwCursorPosition.x) + /* note: 0x1B == ESC */ + fprintf(stderr,"%c[%dC", 0x1B, dwCursorPosition.x); return TRUE; } - /* handle rest of the cases */ + FIXME(console, "Unhandled case: y=%d\n", dwCursorPosition.y); return FALSE; } + /*********************************************************************** * GetNumberOfConsoleInputEvents (KERNEL32.246) */ BOOL32 WINAPI GetNumberOfConsoleInputEvents(HANDLE32 hcon,LPDWORD nrofevents) { - *nrofevents = 0; - return TRUE; + *nrofevents = 0; + FIXME(console,"(%x): stub\n", hcon); + return TRUE; } /*********************************************************************** @@ -694,11 +823,12 @@ BOOL32 WINAPI GetNumberOfConsoleInputEvents(HANDLE32 hcon,LPDWORD nrofevents) */ BOOL32 WINAPI GetNumberOfConsoleMouseButtons(LPDWORD nrofbuttons) { + FIXME(console,"(%p): stub\n", nrofbuttons); *nrofbuttons = 2; - FIXME(console,"(%p): STUB returning 2\n", nrofbuttons); return TRUE; } + /*********************************************************************** * PeekConsoleInputA (KERNEL32.550) */ @@ -710,10 +840,12 @@ BOOL32 WINAPI PeekConsoleInput32A(HANDLE32 hConsoleInput, pirBuffer = NULL; cInRecords = 0; *lpcRead = 0; - FIXME(console,"(...): STUB returning TRUE\n"); - return TRUE; + FIXME(console,"(%d,%p,%ld,%p): stub\n",hConsoleInput, pirBuffer, + cInRecords, lpcRead); + return TRUE; } + /*********************************************************************** * PeekConsoleInputW (KERNEL32.551) */ @@ -725,45 +857,169 @@ BOOL32 WINAPI PeekConsoleInput32W(HANDLE32 hConsoleInput, pirBuffer = NULL; cInRecords = 0; *lpcRead = 0; - FIXME(console,"(...): STUB returning TRUE\n"); + FIXME(console,"(%d,%p,%ld,%p): stub\n", hConsoleInput, pirBuffer, + cInRecords, lpcRead); return TRUE; } -/*********************************************************************** - * GetConsoleCursorInfo32 (KERNEL32.296) + +/****************************************************************************** + * GetConsoleCursorInfo32 [KERNEL32.296] Gets size and visibility of console + * + * PARAMS + * hcon [I] Handle to console screen buffer + * cinfo [O] Address of cursor information + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ -BOOL32 WINAPI GetConsoleCursorInfo32(HANDLE32 hcon, LPDWORD cinfo) +BOOL32 WINAPI GetConsoleCursorInfo32( HANDLE32 hcon, + LPCONSOLE_CURSOR_INFO cinfo ) { - cinfo[0] = 10; /* 10% of character box is cursor. */ - cinfo[1] = TRUE; /* Cursor is visible. */ - FIXME(console, "(%x,%p): STUB!\n", hcon, cinfo); - return TRUE; + FIXME(console, "(%x,%p): stub\n", hcon, cinfo); + if (!cinfo) return FALSE; + cinfo->dwSize = 10; /* 10% of character box is cursor. */ + cinfo->bVisible = TRUE; /* Cursor is visible. */ + return TRUE; } -/*********************************************************************** - * SetConsoleCursorInfo32 (KERNEL32.626) + +/****************************************************************************** + * SetConsoleCursorInfo32 [KERNEL32.626] Sets size and visibility of cursor + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ -BOOL32 WINAPI SetConsoleCursorInfo32(HANDLE32 hcon, LPDWORD cinfo) +BOOL32 WINAPI SetConsoleCursorInfo32( + HANDLE32 hcon, /* [in] Handle to console screen buffer */ + LPCONSOLE_CURSOR_INFO cinfo) /* [in] Address of cursor information */ { - FIXME(console, "(%#x,%p): STUB!\n", hcon, cinfo); - return TRUE; + FIXME(console, "(%x,%ld,%i): stub\n", hcon,cinfo->dwSize,cinfo->bVisible); + return TRUE; } -/*********************************************************************** - * SetConsoleWindowInfo32 (KERNEL32.634) + +/****************************************************************************** + * SetConsoleWindowInfo [KERNEL32.634] Sets size and position of console + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ -BOOL32 WINAPI SetConsoleWindowInfo32(HANDLE32 hcon, BOOL32 flag, LPSMALL_RECT window) +BOOL32 WINAPI SetConsoleWindowInfo( + HANDLE32 hcon, /* [in] Handle to console screen buffer */ + BOOL32 bAbsolute, /* [in] Coordinate type flag */ + LPSMALL_RECT window) /* [in] Address of new window rectangle */ { - FIXME(console, "(%x,%d,%p): STUB!\n", hcon, flag, window); - return TRUE; + FIXME(console, "(%x,%d,%p): stub\n", hcon, bAbsolute, window); + return TRUE; } -/*********************************************************************** - * (KERNEL32.631) + +/****************************************************************************** + * SetConsoleTextAttribute32 [KERNEL32.631] Sets colors for text + * + * Sets the foreground and background color attributes of characters + * written to the screen buffer. + * + * RETURNS + * Success: TRUE + * Failure: FALSE */ -BOOL32 WINAPI SetConsoleTextAttribute32(HANDLE32 hcon, DWORD attributes) +BOOL32 WINAPI SetConsoleTextAttribute32( + HANDLE32 hcon, /* [in] Handle to console screen buffer */ + DWORD attributes) /* [in] Text and background colors */ { - FIXME(console, "(%#x,%#lx): STUB!\n", hcon, attributes); - return TRUE; + FIXME(console, "(%x,%lx): stub\n", hcon, attributes); + return TRUE; +} + + +/****************************************************************************** + * SetConsoleScreenBufferSize [KERNEL32.630] Changes size of console + * + * PARAMS + * hConsoleOutput [I] Handle to console screen buffer + * dwSize [I] New size in character rows and cols + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL32 WINAPI SetConsoleScreenBufferSize( HANDLE32 hConsoleOutput, + COORD dwSize ) +{ + FIXME(console, "(%d,%dx%d): stub\n",hConsoleOutput,dwSize.x,dwSize.y); + return TRUE; +} + + +/****************************************************************************** + * FillConsoleOutputCharacterA [KERNEL32.242] + */ +BOOL32 WINAPI FillConsoleOutputCharacterA( + HANDLE32 hConsoleOutput, + CHAR cCharacter, + DWORD nLength, + COORD dwWriteCoord, + LPDWORD lpNumberOfCharsWritten) +{ + FIXME(console, "(%d,%c,%ld,%dx%d,%p): stub\n", hConsoleOutput,cCharacter, + nLength,dwWriteCoord.x,dwWriteCoord.y,lpNumberOfCharsWritten); + *lpNumberOfCharsWritten = 0; + return TRUE; +} + + +/****************************************************************************** + * FillConsoleOutputCharacterW [KERNEL32.243] Writes characters to console + * + * PARAMS + * hConsoleOutput [I] Handle to screen buffer + * cCharacter [I] Character to write + * nLength [I] Number of cells to write to + * dwCoord [I] Coords of first cell + * lpNumCharsWritten [O] Pointer to number of cells written + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL32 WINAPI FillConsoleOutputCharacterW( HANDLE32 hConsoleOutput, + WCHAR cCharacter, DWORD nLength, + COORD dwCoord, + LPDWORD lpNumCharsWritten ) +{ + FIXME(console, "(%d,%c,%ld,%dx%d,%p): stub\n", hConsoleOutput, + cCharacter,nLength,dwCoord.x,dwCoord.y,lpNumCharsWritten); + *lpNumCharsWritten = 0; + return TRUE; +} + + +/****************************************************************************** + * FillConsoleOutputAttribute [KERNEL32.241] Sets attributes for console + * + * PARAMS + * hConsoleOutput [I] Handle to screen buffer + * wAttribute [I] Color attribute to write + * nLength [I] Number of cells to write to + * dwCoord [I] Coords of first cell + * lpNumAttrsWritten [O] Pointer to number of cells written + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL32 WINAPI FillConsoleOutputAttribute( HANDLE32 hConsoleOutput, + WORD wAttribute, DWORD nLength, COORD dwCoord, + LPDWORD lpNumAttrsWritten) +{ + FIXME(console, "(%d,%d,%ld,%dx%d,%p): stub\n", hConsoleOutput, + wAttribute,nLength,dwCoord.x,dwCoord.y,lpNumAttrsWritten); + *lpNumAttrsWritten = nLength; + return TRUE; } diff --git a/win32/file.c b/win32/file.c index c0eb93262fb..c999fb31d1f 100644 --- a/win32/file.c +++ b/win32/file.c @@ -283,17 +283,20 @@ VOID WINAPI SetFileApisToOEM(void) */ VOID WINAPI SetFileApisToANSI(void) { - /*FIXME(file,"(): stub!\n");*/ + /*FIXME(file,"(): stub\n");*/ } -/************************************************************************** - * AreFileApisANSI (KERNEL32.105) +/****************************************************************************** + * AreFileApisANSI [KERNEL32.105] Determines if file functions are using ANSI + * + * RETURNS + * TRUE: Set of file functions is using ANSI code page + * FALSE: Set of file functions is using OEM code page */ BOOL32 WINAPI AreFileApisANSI(void) { - FIXME(file,"(): stub!\n"); + FIXME(file,"(void): stub\n"); return TRUE; } - diff --git a/win32/newfns.c b/win32/newfns.c index 3e6b9fd8f8c..ed0aa9d495a 100644 --- a/win32/newfns.c +++ b/win32/newfns.c @@ -14,6 +14,7 @@ at a later date. */ #include "windows.h" #include "winnt.h" #include "winerror.h" +#include "heap.h" #include "debug.h" /**************************************************************************** @@ -108,7 +109,10 @@ HANDLE32 WINAPI CreateNamedPipeA (LPCSTR lpName, DWORD dwOpenMode, DWORD nDafaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes) { - FIXME (win32, "CreateNamedPipeA: stub\n"); + FIXME (win32, "(Name=%s, OpenMode=%#08x, dwPipeMode=%#08x, MaxInst=%d, OutBSize=%d, InBuffSize=%d, DefTimeOut=%d, SecAttr=%p): stub\n", + debugstr_a(lpName), dwOpenMode, dwPipeMode, nMaxInstances, + nOutBufferSize, nInBufferSize, nDafaultTimeOut, + lpSecurityAttributes); /* if (nMaxInstances > PIPE_UNLIMITED_INSTANCES) { SetLastError (ERROR_INVALID_PARAMETER); return INVALID_HANDLE_VALUE; @@ -127,7 +131,10 @@ HANDLE32 WINAPI CreateNamedPipeW (LPCWSTR lpName, DWORD dwOpenMode, DWORD nDafaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes) { - FIXME (win32, "CreateNamedPipeW: stub\n"); + FIXME (win32, "(Name=%s, OpenMode=%#08x, dwPipeMode=%#08x, MaxInst=%d, OutBSize=%d, InBuffSize=%d, DefTimeOut=%d, SecAttr=%p): stub\n", + debugstr_w(lpName), dwOpenMode, dwPipeMode, nMaxInstances, + nOutBufferSize, nInBufferSize, nDafaultTimeOut, + lpSecurityAttributes); SetLastError (ERROR_UNKNOWN); return INVALID_HANDLE_VALUE32; @@ -163,26 +170,190 @@ BOOL32 WINAPI SetSystemPowerState(BOOL32 suspend_or_hibernate, return TRUE; } -/************************************************************************** - * GetNumberFormat32A (KERNEL32.355) + +/****************************************************************************** + * CreateMailslot32A [KERNEL32.164] */ -INT32 WINAPI GetNumberFormat32A(LCID locale, DWORD dwflags, - LPCSTR lpvalue, char *lpFormat, - LPSTR lpNumberStr, int cchNumber) -/* NOTE: type of lpFormat should be CONST NUMBERFORMAT */ - +HANDLE32 WINAPI CreateMailslot32A( LPCSTR lpName, DWORD nMaxMessageSize, + DWORD lReadTimeout, LPSECURITY_ATTRIBUTES sa) { - int n; - - FIXME(file,"%s: stub, no reformating done\n",lpvalue); - - n = strlen(lpvalue); - if (cchNumber) { - strncpy(lpNumberStr,lpvalue,cchNumber); - if (cchNumber <= n) { - lpNumberStr[cchNumber-1] = 0; - n = cchNumber-1; - } - } - return n; + FIXME(win32, "(%s,%ld,%ld,%p): stub\n", debugstr_a(lpName), + nMaxMessageSize, lReadTimeout, sa); + return 1; } + + +/****************************************************************************** + * CreateMailslot32W [KERNEL32.165] Creates a mailslot with specified name + * + * PARAMS + * lpName [I] Pointer to string for mailslot name + * nMaxMessageSize [I] Maximum message size + * lReadTimeout [I] Milliseconds before read time-out + * sa [I] Pointer to security structure + * + * RETURNS + * Success: Handle to mailslot + * Failure: INVALID_HANDLE_VALUE + */ +HANDLE32 WINAPI CreateMailslot32W( LPCWSTR lpName, DWORD nMaxMessageSize, + DWORD lReadTimeout, LPSECURITY_ATTRIBUTES sa ) +{ + FIXME(win32, "(%s,%ld,%ld,%p): stub\n", debugstr_w(lpName), + nMaxMessageSize, lReadTimeout, sa); + return 1; +} + + +/****************************************************************************** + * GetMailslotInfo [KERNEL32.347] Retrieves info about specified mailslot + * + * PARAMS + * hMailslot [I] Mailslot handle + * lpMaxMessageSize [O] Address of maximum message size + * lpNextSize [O] Address of size of next message + * lpMessageCount [O] Address of number of messages + * lpReadTimeout [O] Address of read time-out + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL32 WINAPI GetMailslotInfo( HANDLE32 hMailslot, LPDWORD lpMaxMessageSize, + LPDWORD lpNextSize, LPDWORD lpMessageCount, + LPDWORD lpReadTimeout ) +{ + FIXME(win32, "(%d): stub\n",hMailslot); + *lpMaxMessageSize = NULL; + *lpNextSize = NULL; + *lpMessageCount = NULL; + *lpReadTimeout = NULL; + return TRUE; +} + + +/****************************************************************************** + * GetCompressedFileSize32A [KERNEL32.291] + * + * NOTES + * This should call the W function below + */ +DWORD WINAPI GetCompressedFileSize32A( + LPCSTR lpFileName, + LPDWORD lpFileSizeHigh) +{ + FIXME(win32, "(...): stub\n"); + return 0xffffffff; +} + + +/****************************************************************************** + * GetCompressedFileSize32W [KERNEL32.292] + * + * RETURNS + * Success: Low-order doubleword of number of bytes + * Failure: 0xffffffff + */ +DWORD WINAPI GetCompressedFileSize32W( + LPCWSTR lpFileName, /* [in] Pointer to name of file */ + LPDWORD lpFileSizeHigh) /* [out] Receives high-order doubleword of size */ +{ + FIXME(win32, "(%s,%p): stub\n",debugstr_w(lpFileName),lpFileSizeHigh); + return 0xffffffff; +} + + +/****************************************************************************** + * GetProcessWindowStation [USER32.280] Returns handle of window station + * + * NOTES + * Docs say the return value is HWINSTA + * + * RETURNS + * Success: Handle to window station associated with calling process + * Failure: NULL + */ +DWORD WINAPI GetProcessWindowStation(void) +{ + FIXME(win32, "(void): stub\n"); + return 1; +} + + +/****************************************************************************** + * GetThreadDesktop [USER32.295] Returns handle to desktop + * + * NOTES + * Docs say the return value is HDESK + * + * PARAMS + * dwThreadId [I] Thread identifier + * + * RETURNS + * Success: Handle to desktop associated with specified thread + * Failure: NULL + */ +DWORD WINAPI GetThreadDesktop( DWORD dwThreadId ) +{ + FIXME(win32, "(%ld): stub\n",dwThreadId); + return 1; +} + + +/****************************************************************************** + * SetDebugErrorLevel [USER32.475] + * Sets the minimum error level for generating debugging events + * + * PARAMS + * dwLevel [I] Debugging error level + */ +VOID WINAPI SetDebugErrorLevel( DWORD dwLevel ) +{ + FIXME(win32, "(%ld): stub\n", dwLevel); +} + + +/****************************************************************************** + * WaitForDebugEvent [KERNEL32.720] + * Waits for a debugging event to occur in a process being debugged + * + * PARAMS + * lpDebugEvent [I] Address of structure for event information + * dwMilliseconds [I] Number of milliseconds to wait for event + * + * RETURNS STD + */ +BOOL32 WINAPI WaitForDebugEvent( LPDEBUG_EVENT lpDebugEvent, + DWORD dwMilliseconds ) +{ + FIXME(win32, "(%p,%ld): stub\n", lpDebugEvent, dwMilliseconds); + return TRUE; +} + + +/****************************************************************************** + * SetComputerName32A [KERNEL32.621] + */ +BOOL32 WINAPI SetComputerName32A( LPCSTR lpComputerName ) +{ + LPWSTR lpComputerNameW = HEAP_strdupAtoW(GetProcessHeap(),0,lpComputerName); + BOOL32 ret = SetComputerName32W(lpComputerNameW); + HeapFree(GetProcessHeap(),0,lpComputerNameW); + return ret; +} + + +/****************************************************************************** + * SetComputerName32W [KERNEL32.622] + * + * PARAMS + * lpComputerName [I] Address of new computer name + * + * RETURNS STD + */ +BOOL32 WINAPI SetComputerName32W( LPCWSTR lpComputerName ) +{ + FIXME(win32, "(%s): stub\n", debugstr_w(lpComputerName)); + return TRUE; +} + diff --git a/win32/ordinals.c b/win32/ordinals.c index 7d94d5415b5..6aa184a6301 100644 --- a/win32/ordinals.c +++ b/win32/ordinals.c @@ -20,16 +20,18 @@ static CRITICAL_SECTION Win16Mutex; static SEGPTR segWin16Mutex = NULL; + /*********************************************** * GetPWinLock (KERNEL32.93) * Return the infamous Win16Mutex. */ VOID WINAPI GetPWinLock(CRITICAL_SECTION **lock) { - fprintf(stderr,"GetPWinlock(%p)\n",lock); - *lock = &Win16Mutex; + FIXME(win32, "(%p)\n",lock); + *lock = &Win16Mutex; } + /********************************************************************** * WOW32_1 (KERNEL32.88) */ diff --git a/windows/defwnd.c b/windows/defwnd.c index 5ce21790177..0411b64cbf4 100644 --- a/windows/defwnd.c +++ b/windows/defwnd.c @@ -443,7 +443,8 @@ LRESULT WINAPI DefWindowProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, /*********************************************************************** - * DefWindowProc32A (USER32.126) + * DefWindowProc32A [USER32.126] + * */ LRESULT WINAPI DefWindowProc32A( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam ) @@ -504,10 +505,19 @@ LRESULT WINAPI DefWindowProc32A( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, /*********************************************************************** - * DefWindowProc32W (USER32.127) - */ -LRESULT WINAPI DefWindowProc32W( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, - LPARAM lParam ) + * DefWindowProc32W [USER32.127] Calls default window message handler + * + * Calls default window procedure for messages not processed + * by application. + * + * RETURNS + * Return value is dependent upon the message. +*/ +LRESULT WINAPI DefWindowProc32W( + HWND32 hwnd, /* [in] window procedure recieving message */ + UINT32 msg, /* [in] message identifier */ + WPARAM32 wParam, /* [in] first message parameter */ + LPARAM lParam ) /* [in] second message parameter */ { LRESULT result; diff --git a/windows/driver.c b/windows/driver.c index 317831f240b..a051bd9b267 100644 --- a/windows/driver.c +++ b/windows/driver.c @@ -119,9 +119,9 @@ HDRVR16 WINAPI OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam lpnewdrv->dis.hDriver = hDrvr; lstrcpy32A( lpnewdrv->dis.szAliasName, lpDriverName ); lpnewdrv->count = 1; - ordinal = MODULE_GetOrdinal( lpnewdrv->dis.hModule, "DRIVERPROC" ); + ordinal = NE_GetOrdinal( lpnewdrv->dis.hModule, "DRIVERPROC" ); if (!ordinal || - !(lpnewdrv->lpDrvProc = (DRIVERPROC16)MODULE_GetEntryPoint( + !(lpnewdrv->lpDrvProc = (DRIVERPROC16)NE_GetEntryPoint( lpnewdrv->dis.hModule, ordinal ))) { FreeModule16( lpnewdrv->dis.hModule ); diff --git a/windows/event.c b/windows/event.c index 94e1e52b07f..93a8d031e1e 100644 --- a/windows/event.c +++ b/windows/event.c @@ -1219,8 +1219,7 @@ HWND32 WINAPI GetCapture32(void) FARPROC16 WINAPI GetMouseEventProc(void) { HMODULE16 hmodule = GetModuleHandle16("USER"); - return MODULE_GetEntryPoint( hmodule, - MODULE_GetOrdinal( hmodule, "Mouse_Event" ) ); + return NE_GetEntryPoint( hmodule, NE_GetOrdinal( hmodule, "Mouse_Event" )); } diff --git a/windows/hook.c b/windows/hook.c index a9e10897347..9c8c0cafb70 100644 --- a/windows/hook.c +++ b/windows/hook.c @@ -1168,7 +1168,7 @@ void HOOK_FreeQueueHooks( HQUEUE16 hQueue ) FARPROC16 WINAPI SetWindowsHook16( INT16 id, HOOKPROC16 proc ) { HANDLE16 handle; - HINSTANCE16 hInst = __winelib ? 0 : FarGetOwner( HIWORD(proc) ); + HINSTANCE16 hInst = FarGetOwner( HIWORD(proc) ); /* WH_MSGFILTER is the only task-specific hook for SetWindowsHook() */ HTASK16 hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0; @@ -1191,12 +1191,10 @@ FARPROC16 WINAPI SetWindowsHook16( INT16 id, HOOKPROC16 proc ) */ HHOOK WINAPI SetWindowsHook32A( INT32 id, HOOKPROC32 proc ) { - HINSTANCE16 hInst = __winelib ? 0 : FarGetOwner( HIWORD(proc) ); - /* WH_MSGFILTER is the only task-specific hook for SetWindowsHook() */ HTASK16 hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0; - HANDLE16 handle = HOOK_SetHook( id, proc, HOOK_WIN32A, hInst, hTask ); + HANDLE16 handle = HOOK_SetHook( id, proc, HOOK_WIN32A, 0, hTask ); return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : 0; } @@ -1208,12 +1206,10 @@ HHOOK WINAPI SetWindowsHook32A( INT32 id, HOOKPROC32 proc ) */ HHOOK WINAPI SetWindowsHook32W( INT32 id, HOOKPROC32 proc ) { - HINSTANCE16 hInst = __winelib ? 0 : FarGetOwner( HIWORD(proc) ); - /* WH_MSGFILTER is the only task-specific hook for SetWindowsHook() */ HTASK16 hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0; - HANDLE16 handle = HOOK_SetHook( id, proc, HOOK_WIN32W, hInst, hTask ); + HANDLE16 handle = HOOK_SetHook( id, proc, HOOK_WIN32W, 0, hTask ); return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : 0; } @@ -1241,7 +1237,7 @@ HHOOK WINAPI SetWindowsHookEx32A( INT32 id, HOOKPROC32 proc, HINSTANCE32 hInst, if (dwThreadID == GetCurrentThreadId()) hTask = GetCurrentTask(); else - hTask = LOWORD(dwThreadID); + hTask = LOWORD(dwThreadID); /* FIXME! */ handle = HOOK_SetHook( id, proc, HOOK_WIN32A, hInst, hTask ); return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : (HHOOK)NULL; @@ -1260,7 +1256,7 @@ HHOOK WINAPI SetWindowsHookEx32W( INT32 id, HOOKPROC32 proc, HINSTANCE32 hInst, if (dwThreadID == GetCurrentThreadId()) hTask = GetCurrentTask(); else - hTask = LOWORD(dwThreadID); + hTask = LOWORD(dwThreadID); /* FIXME! */ handle = HOOK_SetHook( id, proc, HOOK_WIN32W, hInst, hTask ); return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : (HHOOK)NULL; diff --git a/windows/mdi.c b/windows/mdi.c index ac848c30a8a..394b4c3d22b 100644 --- a/windows/mdi.c +++ b/windows/mdi.c @@ -1466,12 +1466,51 @@ LRESULT WINAPI DefMDIChildProc32W( HWND32 hwnd, UINT32 message, /********************************************************************** - * CreateMDIWindowA (USER32.79) + * CreateMDIWindowA [USER32.79] */ +HWND32 WINAPI CreateMDIWindowA( + LPCSTR lpClassName, + LPCSTR lpWindowName, + DWORD dwStyle, + INT32 X, + INT32 Y, + INT32 nWidth, + INT32 nHeight, + HWND32 hWndParent, + HINSTANCE32 hInstance, + LPARAM lParam) +{ + FIXME(mdi, "(%s,%s,%ld,...): stub\n",debugstr_a(lpClassName), + debugstr_a(lpWindowName),dwStyle); + return (HWND32)NULL; +} -/********************************************************************** - * CreateMDIWindowW (USER32.80) + +/****************************************************************************** + * CreateMDIWindowW [USER32.80] Creates a MDI child window + * + * RETURNS + * Success: Handle to created window + * Failure: NULL */ +HWND32 WINAPI CreateMDIWindowW( + LPCWSTR lpClassName, /* [in] Pointer to registered child class name */ + LPCWSTR lpWindowName, /* [in] Pointer to window name */ + DWORD dwStyle, /* [in] Window style */ + INT32 X, /* [in] Horizontal position of window */ + INT32 Y, /* [in] Vertical position of window */ + INT32 nWidth, /* [in] Width of window */ + INT32 nHeight, /* [in] Height of window */ + HWND32 hWndParent, /* [in] Handle to parent window */ + HINSTANCE32 hInstance, /* [in] Handle to application instance */ + LPARAM lParam) /* [in] Application-defined value */ +{ + FIXME(mdi, "(%s,%s,%ld,%d,%d,%d,%d,%x,%d,%ld): stub\n", + debugstr_w(lpClassName),debugstr_w(lpWindowName),dwStyle,X,Y, + nWidth,nHeight,hWndParent,hInstance,lParam); + return (HWND32)NULL; +} + /********************************************************************** * TranslateMDISysAccel32 (USER32.555) diff --git a/windows/queue.c b/windows/queue.c index 1bf2270d534..7ecd256a8ba 100644 --- a/windows/queue.c +++ b/windows/queue.c @@ -816,7 +816,8 @@ BOOL16 WINAPI GetInputState16(void) */ DWORD WINAPI WaitForInputIdle (HANDLE32 hProcess, DWORD dwTimeOut) { - FIXME (msg, "WaitForInputIdle: stub\n"); + FIXME (msg, "(hProcess=%d, dwTimeOut=%d): stub\n", hProcess, dwTimeOut); + return WAIT_TIMEOUT; } diff --git a/windows/user.c b/windows/user.c index 249cfa7ad89..f0d920e8675 100644 --- a/windows/user.c +++ b/windows/user.c @@ -20,6 +20,7 @@ #include "debug.h" #include "toolhelp.h" #include "message.h" +#include "module.h" #include "miscemu.h" #include "shell.h" diff --git a/windows/win.c b/windows/win.c index c251cba38a4..5563a76e3f9 100644 --- a/windows/win.c +++ b/windows/win.c @@ -743,7 +743,11 @@ static HWND32 WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom, if (!(wndPtr->flags & WIN_NEED_SIZE)) { /* send it anyway */ - + if (((wndPtr->rectClient.right-wndPtr->rectClient.left) <0) + ||((wndPtr->rectClient.bottom-wndPtr->rectClient.top)<0)) + WARN(win,"sending bogus WM_SIZE message 0x%08lx\n", + MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left, + wndPtr->rectClient.bottom-wndPtr->rectClient.top)); SendMessage32A( hwnd, WM_SIZE, SIZE_RESTORED, MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left, wndPtr->rectClient.bottom-wndPtr->rectClient.top)); @@ -1408,7 +1412,8 @@ WORD WINAPI GetWindowWord32( HWND32 hwnd, INT32 offset ) if (HIWORD(wndPtr->wIDmenu)) fprintf(stderr,"GetWindowWord32(GWW_ID) discards high bits of 0x%08x!\n",wndPtr->wIDmenu); return (WORD)wndPtr->wIDmenu; - case GWW_HWNDPARENT: return wndPtr->parent ? wndPtr->parent->hwndSelf : 0; + case GWW_HWNDPARENT: return wndPtr->parent ? + wndPtr->parent->hwndSelf : wndPtr->owner->hwndSelf; case GWW_HINSTANCE: if (HIWORD(wndPtr->hInstance)) fprintf(stderr,"GetWindowWord32(GWW_HINSTANCE) discards high bits of 0x%08x!\n",wndPtr->hInstance); diff --git a/windows/winpos.c b/windows/winpos.c index e992accf6b2..516f6e8d0ad 100644 --- a/windows/winpos.c +++ b/windows/winpos.c @@ -237,6 +237,41 @@ void WINAPI GetWindowRect32( HWND32 hwnd, LPRECT32 rect ) } +/*********************************************************************** + * GetWindowRgn32 + */ +BOOL32 WINAPI GetWindowRgn32 ( HWND32 hwnd, HRGN32 hrgn ) + +{ + RECT32 rect; + WND * wndPtr = WIN_FindWndPtr( hwnd ); + if (!wndPtr) return (ERROR); + + FIXME (win, "GetWindowRgn32: doesn't really do regions\n"); + + memset (&rect, 0, sizeof(rect)); + + GetWindowRect32 ( hwnd, &rect ); + + FIXME (win, "Check whether a valid region here\n"); + + SetRectRgn32 ( hrgn, rect.left, rect.top, rect.right, rect.bottom ); + + return (SIMPLEREGION); +} + +/*********************************************************************** + * SetWindowRgn32 + */ +BOOL32 WINAPI SetWindowRgn32 ( HWND32 hwnd, HRGN32 hrgn,BOOL32 bRedraw) + +{ + + FIXME (win, "SetWindowRgn32: stub\n"); + return TRUE; +} + + /*********************************************************************** * GetClientRect16 (USER.33) */ diff --git a/windows/winproc.c b/windows/winproc.c index 66df7752b5e..517272b130b 100644 --- a/windows/winproc.c +++ b/windows/winproc.c @@ -251,7 +251,9 @@ WNDPROC16 WINPROC_GetProc( HWINDOWPROC proc, WINDOWPROCTYPE type ) if (((WINDOWPROC *)proc)->type == WIN_PROC_16) return (WNDPROC16)&((WINDOWPROC *)proc)->thunk; else - return (WNDPROC16)&((WINDOWPROC *)proc)->jmp; + /* return (WNDPROC16)&((WINDOWPROC *)proc)->jmp; */ + /* Some Win16 programs want to get back the proc they set */ + return (WNDPROC16)((WINDOWPROC *)proc)->thunk.t_from16.proc; } }