Release 970509

Tue May  6 19:12:20 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [loader/task.c] [loader/module.c]
	Fixed command line in LoadModule to already include the length
	indicator (thanks to Andreas Mohr).

	* [windows/dialog.c]
	DlgDirList: fixed behavior with DDL_DRIVES | DDL_EXCLUSIVE (thanks
	to Bruce Milner for this one); correctly update file spec on exit.

	* [windows/winproc.c] [if1632/thunk.c] [include/callback.h]
	Moved emulator-specific code for calling window procedure to
	thunk.c.

Mon Apr 28 10:21:59 1997  Huw D M Davies <h.davies1@physics.oxford.ac.uk>

	* [memory/local.c]
	Better implementation of moveable blocks (first word in block is
	the handle itself) and discarded blocks. Local(Re)Alloc is much
	more like the real thing.

Thu Apr 24 19:50:19 1997  Albrecht Kleine <kleine@ak.sax.de>

	* [objects/metafile.c]
	Added handling of meta record META_DIBCREATEPATTERNBRUSH.

Mon Apr 21 14:03:32 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [multimedia/mmsystem.c] [multimedia/audio.c]
	Fixed leftover problems with masked device IDs.

	* [msdos/int21.c]
	Removed code duplications, fixed Write.

	* [windows/event.c] [windows/dce.c] [windows/nonclient.c]
	  [windows/winpos.c]
	Yet another attempt to make -managed work better.

	* [controls/combo.c]
	UI fix.

Mon Apr 21 13:10:24 1997  Marcus Meissner <msmeissn@immd4.informatik.uni-erlangen.de>

	* [debugger/*]
	All "Loading from ..." lines merged into one so important
	information before the crash doesn't scroll out.

	* [if1632/kernel.spec]
	Added some ordinal stubs used by win95 OLE and friends.

	* [win32/process.c] [if1632/kernel.spec] [loader/module.c]
	MsgWaitForMultipleObjects,GetProcessTimes,RtlImageNtHeaders,
 	LoadLibraryEx32W and GetProcAddress32W added.

	* [objects/bitmap.c]
	XImages use another memory layout for depth 4 (and poss. other
 	depths) then Windows bitmaps. Replaced speedup hack by generic
 	(and better working) code.

	* [objects/dib.c]
	Another ximage!=bitmap memory layout bug. 
	All _XinitImageFuncPtrs except one removed.

Sun Apr 20 17:12:30 1997  Andrew Taylor <andrew@riscan.com>

	* [multimedia/audio.c]
	Fixed some regression bugs.

Sun Apr 20 12:15:09 1997  Andreas Mohr <100.30936@germany.net>

	* [loader/module.c]
	Fixed MODULE_LoadExeHeader() to use the correct offset for
	fast-load area.

Sat Apr 19 16:40:00 1997  Chad Fraleigh <chadf@bookcase.com>

	* [controls/*] [debugger/*] [graphics/win16drv/*] [loader/*] [misc/*]
	  [win32/*]
	Removed <malloc.h> and added <stdlib.h> where needed.
	Changed printf formaters to match argument types (%lx instead of %x).
	Casted some types to make the compiler happy. Mostly pointer<->ulong.

	* [graphics/win16drv/init.c]
	Fixed uninitialized variable.

	* [include/msdos.h]
	Added <sys/types.h> needed for <dirent.h>.

	* [include/sigcontext.h]
	Combined a common NetBSD & FreeBSD #ifdef, and added in OpenBSD.
	Casted EIP_sig/ESP_sig to be unsigned long (declared as 'int' in *BSD).

	* [misc/crtdll.c] [misc/lstr.c]
	Casted last argument in v*printf() to be va_list. This code seems to
	make BIG assumptions about the implementation of va_list.

	* [misc/ver.c]
	Fixed impossible if() expression (unsigned < 0).

	* [misc/winsock.c]
	Removed semicolon on the end of an if() statement.

	* [windows/mdi.c]
	Changed a counter/index to unsigned since it was complaining about
	signed/unsigned comparison and didn't need to be negative.

Wed Apr 16 17:43:19 1997 Georg Beyerle <gbeyerle@awi-potsdam.de>

	* [scheduler/thread.c]
	Minor fix in thread database initialization.

Wed Apr 16 17:28:05 1997  Andreas Mohr <100.30936@germany.net>

	* [files/file.c]
	Fixed FILE_FillInfo() to omit the archive flag when handling a DOS
	directory entry.
This commit is contained in:
Alexandre Julliard 1997-05-09 08:40:27 +00:00
parent 889f74244d
commit 84c70f55b5
62 changed files with 1724 additions and 1030 deletions

View File

@ -1,13 +1,13 @@
This is release 970415 of Wine, the MS Windows emulator. This is still a This is release 970509 of Wine, the MS Windows emulator. This is still a
developer's only release. There are many bugs and many unimplemented API developer's only release. There are many bugs and many unimplemented API
features. Most applications still do not work correctly. features. Most applications still do not work correctly.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry. forget to include a ChangeLog entry.
WHAT'S NEW with Wine-970415: (see ChangeLog for details) WHAT'S NEW with Wine-970509: (see ChangeLog for details)
- Edit control improvements. - Better local heap implementation.
- Some files moved around. - Improvements to -managed mode.
- Lots of bug fixes. - Lots of bug fixes.
See the README file in the distribution for installation instructions. See the README file in the distribution for installation instructions.
@ -16,11 +16,11 @@ Because of lags created by using mirror, this message may reach you before
the release is available at the ftp sites. The sources will be available the release is available at the ftp sites. The sources will be available
from the following locations: from the following locations:
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970415.tar.gz ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970509.tar.gz
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970415.tar.gz ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970509.tar.gz
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970415.tar.gz ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970509.tar.gz
ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-970415.tar.gz ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-970509.tar.gz
ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970415.tar.gz ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970509.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite. It should also be available from any site that mirrors tsx-11 or sunsite.

118
ChangeLog
View File

@ -1,3 +1,121 @@
----------------------------------------------------------------------
Tue May 6 19:12:20 1997 Alexandre Julliard <julliard@lrc.epfl.ch>
* [loader/task.c] [loader/module.c]
Fixed command line in LoadModule to already include the length
indicator (thanks to Andreas Mohr).
* [windows/dialog.c]
DlgDirList: fixed behavior with DDL_DRIVES | DDL_EXCLUSIVE (thanks
to Bruce Milner for this one); correctly update file spec on exit.
* [windows/winproc.c] [if1632/thunk.c] [include/callback.h]
Moved emulator-specific code for calling window procedure to
thunk.c.
Mon Apr 28 10:21:59 1997 Huw D M Davies <h.davies1@physics.oxford.ac.uk>
* [memory/local.c]
Better implementation of moveable blocks (first word in block is
the handle itself) and discarded blocks. Local(Re)Alloc is much
more like the real thing.
Thu Apr 24 19:50:19 1997 Albrecht Kleine <kleine@ak.sax.de>
* [objects/metafile.c]
Added handling of meta record META_DIBCREATEPATTERNBRUSH.
Mon Apr 21 14:03:32 1997 Alex Korobka <alex@trantor.pharm.sunysb.edu>
* [multimedia/mmsystem.c] [multimedia/audio.c]
Fixed leftover problems with masked device IDs.
* [msdos/int21.c]
Removed code duplications, fixed Write.
* [windows/event.c] [windows/dce.c] [windows/nonclient.c]
[windows/winpos.c]
Yet another attempt to make -managed work better.
* [controls/combo.c]
UI fix.
Mon Apr 21 13:10:24 1997 Marcus Meissner <msmeissn@immd4.informatik.uni-erlangen.de>
* [debugger/*]
All "Loading from ..." lines merged into one so important
information before the crash doesn't scroll out.
* [if1632/kernel.spec]
Added some ordinal stubs used by win95 OLE and friends.
* [win32/process.c] [if1632/kernel.spec] [loader/module.c]
MsgWaitForMultipleObjects,GetProcessTimes,RtlImageNtHeaders,
LoadLibraryEx32W and GetProcAddress32W added.
* [objects/bitmap.c]
XImages use another memory layout for depth 4 (and poss. other
depths) then Windows bitmaps. Replaced speedup hack by generic
(and better working) code.
* [objects/dib.c]
Another ximage!=bitmap memory layout bug.
All _XinitImageFuncPtrs except one removed.
Sun Apr 20 17:12:30 1997 Andrew Taylor <andrew@riscan.com>
* [multimedia/audio.c]
Fixed some regression bugs.
Sun Apr 20 12:15:09 1997 Andreas Mohr <100.30936@germany.net>
* [loader/module.c]
Fixed MODULE_LoadExeHeader() to use the correct offset for
fast-load area.
Sat Apr 19 16:40:00 1997 Chad Fraleigh <chadf@bookcase.com>
* [controls/*] [debugger/*] [graphics/win16drv/*] [loader/*] [misc/*]
[win32/*]
Removed <malloc.h> and added <stdlib.h> where needed.
Changed printf formaters to match argument types (%lx instead of %x).
Casted some types to make the compiler happy. Mostly pointer<->ulong.
* [graphics/win16drv/init.c]
Fixed uninitialized variable.
* [include/msdos.h]
Added <sys/types.h> needed for <dirent.h>.
* [include/sigcontext.h]
Combined a common NetBSD & FreeBSD #ifdef, and added in OpenBSD.
Casted EIP_sig/ESP_sig to be unsigned long (declared as 'int' in *BSD).
* [misc/crtdll.c] [misc/lstr.c]
Casted last argument in v*printf() to be va_list. This code seems to
make BIG assumptions about the implementation of va_list.
* [misc/ver.c]
Fixed impossible if() expression (unsigned < 0).
* [misc/winsock.c]
Removed semicolon on the end of an if() statement.
* [windows/mdi.c]
Changed a counter/index to unsigned since it was complaining about
signed/unsigned comparison and didn't need to be negative.
Wed Apr 16 17:43:19 1997 Georg Beyerle <gbeyerle@awi-potsdam.de>
* [scheduler/thread.c]
Minor fix in thread database initialization.
Wed Apr 16 17:28:05 1997 Andreas Mohr <100.30936@germany.net>
* [files/file.c]
Fixed FILE_FillInfo() to omit the archive flag when handling a DOS
directory entry.
---------------------------------------------------------------------- ----------------------------------------------------------------------
Mon Apr 14 11:22:54 1997 John Harvey <john@division.co.uk> Mon Apr 14 11:22:54 1997 John Harvey <john@division.co.uk>

View File

@ -111,7 +111,7 @@ wine wine.sym: $(COMMONSUBDIRS) $(EMUSUBDIRS) dummy
install_wine: dummy install_wine: dummy
$(INSTALL_PROGRAM) wine $(bindir)/wine $(INSTALL_PROGRAM) wine $(bindir)/wine
$(INSTALL_DATA) wine.man $(mandir)/wine$(manext) $(INSTALL_DATA) $(TOPSRC)/wine.man $(mandir)/wine$(manext)
libwine.a: $(COMMONSUBDIRS) $(LIBSUBDIRS) dummy libwine.a: $(COMMONSUBDIRS) $(LIBSUBDIRS) dummy
$(RM) $@ $(RM) $@
@ -139,7 +139,7 @@ depend: dummy
done done
etags: etags:
etags `find . -name '*.[chS]' -print` etags `find . -name '*.[chS]' -print | grep -v dbgmain`
clean: clean:
for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done

View File

@ -395,25 +395,25 @@ static void CBPaintButton(LPHEADCOMBO lphc, HDC16 hdc)
*/ */
static void CBPaintText(LPHEADCOMBO lphc, HDC16 hdc) static void CBPaintText(LPHEADCOMBO lphc, HDC16 hdc)
{ {
INT32 id, size; INT32 id, size = 0;
LPSTR pText = NULL; LPSTR pText = NULL;
/* follow Windows combobox that sends a bunch of text /* follow Windows combobox that sends a bunch of text
* inquiries to its listbox while processing WM_PAINT. * inquiries to its listbox while processing WM_PAINT. */
*/
size = SendMessage32A( lphc->hWndLBox, LB_GETTEXTLEN32,
(id = SendMessage32A(lphc->hWndLBox, LB_GETCURSEL32, 0, 0)), 0);
if( !(pText = HeapAlloc( GetProcessHeap(), 0, size + 1)) ) return;
if( (id = SendMessage32A(lphc->hWndLBox, LB_GETCURSEL32, 0, 0) ) != LB_ERR )
{
size = SendMessage32A( lphc->hWndLBox, LB_GETTEXTLEN32, id, 0);
if( (pText = HeapAlloc( GetProcessHeap(), 0, size + 1)) )
{
SendMessage32A( lphc->hWndLBox, LB_GETTEXT32, (WPARAM32)id, (LPARAM)pText ); SendMessage32A( lphc->hWndLBox, LB_GETTEXT32, (WPARAM32)id, (LPARAM)pText );
pText[size] = '\0'; /* just in case */ pText[size] = '\0'; /* just in case */
} else return;
}
if( lphc->wState & CBF_EDIT ) if( lphc->wState & CBF_EDIT )
{ {
if( CB_HASSTRINGS(lphc) ) if( CB_HASSTRINGS(lphc) ) SetWindowText32A( lphc->hWndEdit, pText );
SetWindowText32A( lphc->hWndEdit, (pText) ? pText : "" );
if( lphc->wState & CBF_FOCUSED ) if( lphc->wState & CBF_FOCUSED )
SendMessage32A( lphc->hWndEdit, EM_SETSEL32, 0, (LPARAM)(-1)); SendMessage32A( lphc->hWndEdit, EM_SETSEL32, 0, (LPARAM)(-1));
} }
@ -478,7 +478,8 @@ static void CBPaintText(LPHEADCOMBO lphc, HDC16 hdc)
else else
{ {
ExtTextOut32A( hDC, rect.left + 1, rect.top + 1, ExtTextOut32A( hDC, rect.left + 1, rect.top + 1,
ETO_OPAQUE | ETO_CLIPPED, &rect, pText, size, NULL ); ETO_OPAQUE | ETO_CLIPPED, &rect,
(pText) ? pText : "" , size, NULL );
if(lphc->wState & CBF_FOCUSED && !(lphc->wState & CBF_DROPPED)) if(lphc->wState & CBF_FOCUSED && !(lphc->wState & CBF_DROPPED))
DrawFocusRect32( hDC, &rect ); DrawFocusRect32( hDC, &rect );
} }
@ -957,7 +958,7 @@ static LRESULT COMBO_GetText( LPHEADCOMBO lphc, UINT32 N, LPSTR lpText)
/* get it from the listbox */ /* get it from the listbox */
idx = SendMessage32A( lphc->hWndLBox, LB_GETCURSEL32, 0, 0 ); idx = SendMessage32A( lphc->hWndLBox, LB_GETCURSEL32, 0, 0 );
if( idx >= 0 ) if( idx != LB_ERR )
{ {
LPSTR lpBuffer; LPSTR lpBuffer;
INT32 length = SendMessage32A( lphc->hWndLBox, LB_GETTEXTLEN32, INT32 length = SendMessage32A( lphc->hWndLBox, LB_GETTEXTLEN32,

View File

@ -2365,7 +2365,7 @@ UINT16 GetMenuItemID16( HMENU16 hMenu, INT16 nPos )
LPPOPUPMENU menu; LPPOPUPMENU menu;
if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return -1; if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return -1;
if ((nPos < 0) || (nPos >= menu->nItems)) return -1; if ((nPos < 0) || ((UINT16) nPos >= menu->nItems)) return -1;
if (menu->items[nPos].item_flags & MF_POPUP) return -1; if (menu->items[nPos].item_flags & MF_POPUP) return -1;
return menu->items[nPos].item_id; return menu->items[nPos].item_id;
} }

View File

@ -433,6 +433,7 @@ static void DEBUG_Main( int signal )
* don't grok that yet, and in this case we fall back to using * don't grok that yet, and in this case we fall back to using
* the wine.sym file. * the wine.sym file.
*/ */
fprintf(stderr,"Loading symbols: ");
if( DEBUG_ReadExecutableDbgInfo() == FALSE ) if( DEBUG_ReadExecutableDbgInfo() == FALSE )
{ {
PROFILE_GetWineIniString( "wine", "SymbolTableFile", "wine.sym", PROFILE_GetWineIniString( "wine", "SymbolTableFile", "wine.sym",
@ -447,6 +448,7 @@ static void DEBUG_Main( int signal )
DEBUG_ProcessDeferredDebug(); DEBUG_ProcessDeferredDebug();
DEBUG_LoadEntryPoints(); DEBUG_LoadEntryPoints();
fprintf(stderr,"\n");
} }
#if 0 #if 0

View File

@ -755,8 +755,7 @@ void DEBUG_LoadEntryPoints(void)
name = (unsigned char *)pModule + pModule->name_table; name = (unsigned char *)pModule + pModule->name_table;
fprintf( stderr, "Loading symbols from Win16 module %.*s...\n", fprintf( stderr, " %.*s",*name, name + 1 );
*name, name + 1 );
/* First search the resident names */ /* First search the resident names */

View File

@ -24,7 +24,6 @@
#include <limits.h> #include <limits.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <malloc.h>
#ifndef PATH_MAX #ifndef PATH_MAX
#define PATH_MAX _MAX_PATH #define PATH_MAX _MAX_PATH
#endif #endif
@ -2324,8 +2323,7 @@ DEBUG_ProcessDeferredDebug()
if( last_proc != deefer->dbg_index ) if( last_proc != deefer->dbg_index )
{ {
fprintf(stderr, "Loading symbols from Win32 file %s...\n", fprintf(stderr, " %s",deefer->module_name);
deefer->module_name);
last_proc = deefer->dbg_index; last_proc = deefer->dbg_index;
} }

View File

@ -15,7 +15,6 @@
#include <limits.h> #include <limits.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <malloc.h>
#ifndef PATH_MAX #ifndef PATH_MAX
#define PATH_MAX _MAX_PATH #define PATH_MAX _MAX_PATH
#endif #endif

View File

@ -1110,8 +1110,9 @@ DEBUG_ProcessElfObject(char * filename, unsigned int load_offset)
/* /*
* Give a nice status message here... * Give a nice status message here...
* Well not, just print the name.
*/ */
fprintf(stderr, "Loading symbols from ELF file %s...\n", filename); fprintf(stderr, " %s", filename);
/* /*
* Next, we need to find a few of the internal ELF headers within * Next, we need to find a few of the internal ELF headers within
@ -1359,7 +1360,7 @@ DEBUG_ReadExecutableDbgInfo(void)
/* /*
* Give a nice status message here... * Give a nice status message here...
*/ */
fprintf(stderr, "Loading symbols from a.out file %s...\n", exe_name); fprintf(stderr, " %s", exe_name);
rtn = TRUE; rtn = TRUE;

View File

@ -6,7 +6,7 @@
*/ */
#include <stdio.h> #include <stdio.h>
#include <malloc.h> #include <stdlib.h>
#include "xmalloc.h" #include "xmalloc.h"
#include "windows.h" #include "windows.h"
#include "debugger.h" #include "debugger.h"

View File

@ -17,7 +17,6 @@
#include <limits.h> #include <limits.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <malloc.h>
#include "win.h" #include "win.h"
#include "pe_image.h" #include "pe_image.h"

View File

@ -309,9 +309,10 @@ static HFILE32 FILE_Create( LPCSTR path, int mode, int unique )
*/ */
static void FILE_FillInfo( struct stat *st, BY_HANDLE_FILE_INFORMATION *info ) static void FILE_FillInfo( struct stat *st, BY_HANDLE_FILE_INFORMATION *info )
{ {
info->dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE;
if (S_ISDIR(st->st_mode)) if (S_ISDIR(st->st_mode))
info->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; info->dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
else
info->dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE;
if (!(st->st_mode & S_IWUSR)) if (!(st->st_mode & S_IWUSR))
info->dwFileAttributes |= FILE_ATTRIBUTE_READONLY; info->dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
@ -1168,6 +1169,9 @@ LPVOID FILE_mmap( FILE_OBJECT *file, LPVOID start,
if (!file) if (!file)
{ {
/* Linux EINVAL's on us if we don't pass MAP_PRIVATE to an anon mmap */
flags &= ~MAP_SHARED;
flags |= MAP_PRIVATE;
#ifdef MAP_ANON #ifdef MAP_ANON
flags |= MAP_ANON; flags |= MAP_ANON;
#else #else

View File

@ -39,7 +39,7 @@ BOOL32 WIN16DRV_GetTextExtentPoint( DC *dc, LPCSTR str, INT32 count,
NULL, str, NULL, str,
-count, physDev->segptrFontInfo, lpDrawMode, -count, physDev->segptrFontInfo, lpDrawMode,
lpTextXForm, NULL, NULL, 0); lpTextXForm, NULL, NULL, 0);
printf("LPGDI_GetTextExtPoint: cx=0x%x, cy=0x%x Ret 0x%x\n", size->cx,size->cy,dwRet); printf("LPGDI_GetTextExtPoint: cx=0x%x, cy=0x%x Ret 0x%lx\n", size->cx, size->cy, dwRet);
return TRUE; return TRUE;
} }

View File

@ -395,8 +395,8 @@ static INT32 WIN16DRV_Escape( DC *dc, INT32 nEscape, INT32 cbInput,
case 0x100: case 0x100:
{ {
LPEXTTEXTDATA textData = PTR_SEG_TO_LIN(lpInData); LPEXTTEXTDATA textData = PTR_SEG_TO_LIN(lpInData);
printf("Got in data 0x%x textData 0x%x\n",lpInData, textData); printf("Got in data 0x%lx textData 0x%p\n",lpInData, textData);
printf("size %d in 0x%x:0x%x font 0x%x:0x%x xform 0x%x:0x%x drawm 0x%x:0x%x\n", printf("size %d in 0x%p:0x%p font 0x%p:0x%p xform 0x%p:0x%p drawm 0x%p:0x%p\n",
textData->nSize, textData->nSize,
textData->lpindata,PTR_SEG_TO_LIN(textData->lpindata), textData->lpindata,PTR_SEG_TO_LIN(textData->lpindata),
textData->lpFont,PTR_SEG_TO_LIN(textData->lpFont), textData->lpFont,PTR_SEG_TO_LIN(textData->lpFont),
@ -450,7 +450,7 @@ int
ExtractPQ(HPQ hPQ) ExtractPQ(HPQ hPQ)
{ {
struct hpq *queue, *prev, *current, *currentPrev; struct hpq *queue, *prev, *current, *currentPrev;
int key, tag = -1; int key = 0, tag = -1;
currentPrev = prev = NULL; currentPrev = prev = NULL;
queue = current = hpqueue; queue = current = hpqueue;
if (current) if (current)
@ -651,7 +651,7 @@ int WriteDialog(HANDLE16 hJob, LPSTR lpMsg, WORD cchMsg)
dprintf_win16drv(stddeb, "WriteDialog: %04x %04x \"%s\"\n", hJob, cchMsg, lpMsg); dprintf_win16drv(stddeb, "WriteDialog: %04x %04x \"%s\"\n", hJob, cchMsg, lpMsg);
nRet = MessageBox16(NULL, lpMsg, "Printing Error", MB_OKCANCEL); nRet = MessageBox16(0, lpMsg, "Printing Error", MB_OKCANCEL);
return nRet; return nRet;
} }

View File

@ -19,8 +19,8 @@ base 1
0014 stub LoadAlterBitmap 0014 stub LoadAlterBitmap
0015 stub PageSetupDlgA 0015 stub PageSetupDlgA
0016 stub PageSetupDlgW 0016 stub PageSetupDlgW
0017 stub PrintDlgA 0017 return PrintDlgA 4 0
0018 stub PrintDlgW 0018 return PrintDlgW 4 0
0019 stub ReplaceTextA 0019 stub ReplaceTextA
0020 stub ReplaceTextW 0020 stub ReplaceTextW
0021 stub WantArrows 0021 stub WantArrows

View File

@ -73,8 +73,8 @@ type win16
74 pascal16 OpenFile(ptr ptr word) OpenFile16 74 pascal16 OpenFile(ptr ptr word) OpenFile16
75 stub OpenPathName 75 stub OpenPathName
76 stub DeletePathName 76 stub DeletePathName
#77 RESERVED1 77 stub KERNEL_77 #RESERVED1
#78 RESERVED2 78 stub KERNEL_78 #RESERVED2
#79 RESERVED3 #79 RESERVED3
#80 RESERVED4 #80 RESERVED4
81 pascal16 _lclose(word) _lclose16 81 pascal16 _lclose(word) _lclose16
@ -205,6 +205,12 @@ type win16
205 stub CVWBreak 205 stub CVWBreak
206 pascal16 AllocSelectorArray(word) AllocSelectorArray 206 pascal16 AllocSelectorArray(word) AllocSelectorArray
207 pascal16 IsDBCSLeadByte(word) IsDBCSLeadByte16 207 pascal16 IsDBCSLeadByte(word) IsDBCSLeadByte16
208 stub KERNEL_208
209 stub KERNEL_209
210 stub KERNEL_210
211 stub KERNEL_211
213 stub KERNEL_213
214 stub KERNEL_214
216 pascal RegEnumKey(long long ptr long) RegEnumKey16 216 pascal RegEnumKey(long long ptr long) RegEnumKey16
217 pascal RegOpenKey(long ptr ptr) RegOpenKey16 217 pascal RegOpenKey(long ptr ptr) RegOpenKey16
218 pascal RegCreateKey(long ptr ptr) RegCreateKey16 218 pascal RegCreateKey(long ptr ptr) RegCreateKey16
@ -217,14 +223,17 @@ type win16
225 pascal RegQueryValueEx(long ptr ptr ptr ptr ptr) RegQueryValueEx16 225 pascal RegQueryValueEx(long ptr ptr ptr ptr ptr) RegQueryValueEx16
226 pascal RegSetValueEx(long ptr long long ptr long) RegSetValueEx16 226 pascal RegSetValueEx(long ptr long long ptr long) RegSetValueEx16
227 pascal RegFlushKey(long) RegFlushKey 227 pascal RegFlushKey(long) RegFlushKey
#228 K228 228 stub K228
#229 K229 229 stub K229
230 stub GlobalSmartPageLock 230 stub GlobalSmartPageLock
231 stub GlobalSmartPageUnlock 231 stub GlobalSmartPageUnlock
232 stub RegLoadKey 232 stub RegLoadKey
233 stub RegUnloadKey 233 stub RegUnloadKey
234 stub RegSaveKey 234 stub RegSaveKey
235 stub InvalidateNlsCache 235 stub InvalidateNlsCache
237 stub KERNEL_237
262 stub KERNEL_262
263 stub KERNEL_263
310 pascal16 LocalHandleDelta(word) LocalHandleDelta 310 pascal16 LocalHandleDelta(word) LocalHandleDelta
311 stub GetSetKernelDosProc 311 stub GetSetKernelDosProc
314 stub DebugDefineSegment 314 stub DebugDefineSegment
@ -237,7 +246,7 @@ type win16
324 stub LogError 324 stub LogError
325 stub LogParamError 325 stub LogParamError
326 return IsRomFile 2 0 326 return IsRomFile 2 0
#327 K327 327 stub KERNEL_327
328 stub _DebugOutput 328 stub _DebugOutput
#329 K329 #329 K329
#332 stub THHOOK #332 stub THHOOK
@ -264,6 +273,9 @@ type win16
354 pascal GetAppCompatFlags(word) GetAppCompatFlags16 354 pascal GetAppCompatFlags(word) GetAppCompatFlags16
355 pascal16 GetWinDebugInfo(ptr word) GetWinDebugInfo 355 pascal16 GetWinDebugInfo(ptr word) GetWinDebugInfo
356 pascal16 SetWinDebugInfo(ptr) SetWinDebugInfo 356 pascal16 SetWinDebugInfo(ptr) SetWinDebugInfo
357 stub KERNEL_357
358 stub KERNEL_358
359 stub KERNEL_359
360 stub OpenFileEx 360 stub OpenFileEx
#361 PIGLET_361 #361 PIGLET_361
403 pascal16 FarSetOwner(word word) FarSetOwner 403 pascal16 FarSetOwner(word word) FarSetOwner
@ -282,14 +294,48 @@ type win16
420 pascal GetFileAttributes(ptr) GetFileAttributes16 420 pascal GetFileAttributes(ptr) GetFileAttributes16
421 pascal16 SetFileAttributes(ptr long) SetFileAttributes16 421 pascal16 SetFileAttributes(ptr long) SetFileAttributes16
422 pascal16 GetDiskFreeSpace(ptr ptr ptr ptr ptr) GetDiskFreeSpace16 422 pascal16 GetDiskFreeSpace(ptr ptr ptr ptr ptr) GetDiskFreeSpace16
431 stub KERNEL_431
432 stub FileTimeToLocalFileTime 432 stub FileTimeToLocalFileTime
435 stub KERNEL_435
439 stub KERNEL_439
440 stub KERNEL_440
444 stub KERNEL_444
445 stub KERNEL_445
446 stub KERNEL_446
447 stub KERNEL_447
449 stub KERNEL_449
450 pascal16 KERNEL_450() stub_KERNEL_450 450 pascal16 KERNEL_450() stub_KERNEL_450
454 stub KERNEL_454
455 stub KERNEL_455
471 stub KERNEL_471
472 stub KERNEL_472
473 stub KERNEL_473
482 stub KERNEL_482
491 stub RegisterServiceProcess 491 stub RegisterServiceProcess
513 stub LoadLibraryEx32W 500 stub KERNEL_500
502 stub KERNEL_502
503 stub KERNEL_503
511 stub KERNEL_511
513 pascal LoadLibraryEx32W(ptr long long) LoadLibraryEx32W16
514 stub FreeLibrary32W 514 stub FreeLibrary32W
515 stub GetProcAddress32W 515 pascal GetProcAddress32W(long ptr) GetProcAddress32
516 stub GetVDMPointer32W 516 stub GetVDMPointer32W
517 stub CallProc32W 517 stub CallProc32W
518 stub CallProcEx32W 518 stub CallProcEx32W
519 stub KERNEL_519
522 stub KERNEL_522
525 stub KERNEL_525
600 stub KERNEL_600
601 stub KERNEL_601
604 stub KERNEL_604
605 stub KERNEL_605
612 stub KERNEL_612
613 stub KERNEL_613
614 stub KERNEL_614
619 stub KERNEL_619
621 stub KERNEL_621
627 stub IsBadFlatReadWritePtr 627 stub IsBadFlatReadWritePtr
630 stub KERNEL_630
631 stub FUNC004 # shell hook 631 stub FUNC004 # shell hook
651 stub KERNEL_651
700 return KERNEL_700 0 1

View File

@ -264,7 +264,7 @@ base 1
0259 stdcall GetProcessHeap() GetProcessHeap 0259 stdcall GetProcessHeap() GetProcessHeap
0260 stub GetProcessHeaps 0260 stub GetProcessHeaps
0261 stub GetProcessShutdownParameters 0261 stub GetProcessShutdownParameters
0262 stub GetProcessTimes 0262 stdcall GetProcessTimes(long ptr ptr ptr ptr) GetProcessTimes
0263 stub GetProcessWorkingSetSize 0263 stub GetProcessWorkingSetSize
0264 stdcall GetProfileIntA(ptr ptr long) GetProfileInt32A 0264 stdcall GetProfileIntA(ptr ptr long) GetProfileInt32A
0265 stdcall GetProfileIntW(ptr ptr long) GetProfileInt32W 0265 stdcall GetProfileIntW(ptr ptr long) GetProfileInt32W
@ -685,3 +685,4 @@ base 1
0679 stdcall MapLS(ptr) MapLS 0679 stdcall MapLS(ptr) MapLS
0680 stdcall UnMapLS(long) UnMapLS 0680 stdcall UnMapLS(long) UnMapLS
0681 stub OpenVxDHandle 0681 stub OpenVxDHandle
0682 stub FT_Exit12

View File

@ -398,7 +398,7 @@ base 0
394 stub RtlGetUserInfoHeap 394 stub RtlGetUserInfoHeap
395 stub RtlIdentifierAuthoritySid 395 stub RtlIdentifierAuthoritySid
396 stub RtlImageDirectoryEntryToData 396 stub RtlImageDirectoryEntryToData
397 stub RtlImageNtHeader 397 stdcall RtlImageNtHeader(long) RtlImageNtHeader
398 stub RtlImpersonateSelf 398 stub RtlImpersonateSelf
399 stdcall RtlInitAnsiString(ptr ptr) RtlInitAnsiString 399 stdcall RtlInitAnsiString(ptr ptr) RtlInitAnsiString
400 stub RtlInitCodePageTable 400 stub RtlInitCodePageTable
@ -877,7 +877,7 @@ base 0
873 stub _stricmp 873 stub _stricmp
874 stub _strlwr 874 stub _strlwr
875 stub _strnicmp 875 stub _strnicmp
876 stub _strupr 876 stdcall _strupr(ptr) CRTDLL__strupr
877 stub _ultoa 877 stub _ultoa
878 stub _vsnprintf 878 stub _vsnprintf
879 stdcall _wcsicmp(ptr ptr) lstrcmpi32W 879 stdcall _wcsicmp(ptr ptr) lstrcmpi32W

View File

@ -26,6 +26,7 @@ dprintf_relay
BOOL32 RELAY_Init(void) BOOL32 RELAY_Init(void)
{ {
WORD codesel; WORD codesel;
extern BOOL32 THUNK_Init(void);
/* Allocate the code selector for CallTo16 routines */ /* Allocate the code selector for CallTo16 routines */
@ -44,7 +45,10 @@ BOOL32 RELAY_Init(void)
codesel ); codesel );
CALLTO16_RetAddr_long=MAKELONG( (int)CALLTO16_Ret_long-(int)CALLTO16_Start, CALLTO16_RetAddr_long=MAKELONG( (int)CALLTO16_Ret_long-(int)CALLTO16_Start,
codesel ); codesel );
return TRUE;
/* Initialize thunking */
return THUNK_Init();
} }

View File

@ -9,9 +9,11 @@
#include "heap.h" #include "heap.h"
#include "hook.h" #include "hook.h"
#include "module.h" #include "module.h"
#include "winproc.h"
#include "stackframe.h"
#include "except.h"
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
#include "except.h"
typedef void (*RELAY)(); typedef void (*RELAY)();
@ -37,6 +39,21 @@ typedef struct tagTHUNK
static THUNK *firstThunk = NULL; static THUNK *firstThunk = NULL;
static LRESULT THUNK_CallWndProc16( WNDPROC16 proc, HWND16 hwnd, UINT16 msg,
WPARAM16 wParam, LPARAM lParam );
/***********************************************************************
* THUNK_Init
*/
BOOL32 THUNK_Init(void)
{
/* Set the window proc calling functions */
WINPROC_SetCallWndProc16( THUNK_CallWndProc16 );
WINPROC_SetCallWndProc32( (WINPROC_CALLWNDPROC32)CallTo32_4 );
return TRUE;
}
/*********************************************************************** /***********************************************************************
* THUNK_Alloc * THUNK_Alloc
*/ */
@ -72,7 +89,7 @@ static THUNK *THUNK_Find( FARPROC32 func )
/*********************************************************************** /***********************************************************************
* THUNK_Free * THUNK_Free
*/ */
void THUNK_Free( THUNK *thunk ) static void THUNK_Free( THUNK *thunk )
{ {
if (HEAP_IsInsideHeap( GetProcessHeap(), 0, thunk )) if (HEAP_IsInsideHeap( GetProcessHeap(), 0, thunk ))
{ {
@ -89,6 +106,32 @@ void THUNK_Free( THUNK *thunk )
} }
/***********************************************************************
* THUNK_CallWndProc16
*
* Call a 16-bit window procedure
*/
static LRESULT THUNK_CallWndProc16( WNDPROC16 proc, HWND16 hwnd, UINT16 msg,
WPARAM16 wParam, LPARAM lParam )
{
if ((msg == WM_CREATE) || (msg == WM_NCCREATE))
{
CREATESTRUCT16 *cs = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
/* Build the CREATESTRUCT on the 16-bit stack. */
/* This is really ugly, but some programs (notably the */
/* "Undocumented Windows" examples) want it that way. */
return CallTo16_long_lllllllwlwwwl( (FARPROC16)proc,
cs->dwExStyle, cs->lpszClass, cs->lpszName, cs->style,
MAKELONG( cs->y, cs->x ), MAKELONG( cs->cy, cs->cx ),
MAKELONG( cs->hMenu, cs->hwndParent ), cs->hInstance,
(LONG)cs->lpCreateParams, hwnd, msg, wParam,
MAKELONG( IF1632_Saved16_sp-sizeof(CREATESTRUCT16),
IF1632_Saved16_ss ) );
}
return CallTo16_long_wwwl( (FARPROC16)proc, hwnd, msg, wParam, lParam );
}
/*********************************************************************** /***********************************************************************
* THUNK_EnumObjects16 (GDI.71) * THUNK_EnumObjects16 (GDI.71)
*/ */

View File

@ -403,7 +403,7 @@ base 1
0396 stdcall ModifyMenuA(long long long long ptr) ModifyMenu32A 0396 stdcall ModifyMenuA(long long long long ptr) ModifyMenu32A
0397 stdcall ModifyMenuW(long long long long ptr) ModifyMenu32W 0397 stdcall ModifyMenuW(long long long long ptr) ModifyMenu32W
0398 stdcall MoveWindow(long long long long long long) MoveWindow32 0398 stdcall MoveWindow(long long long long long long) MoveWindow32
0399 stub MsgWaitForMultipleObjects 0399 stdcall MsgWaitForMultipleObjects(long ptr long long long) MsgWaitForMultipleObjects
0400 stdcall OemKeyScan(long) OemKeyScan 0400 stdcall OemKeyScan(long) OemKeyScan
0401 stdcall OemToCharA(ptr ptr) OemToChar32A 0401 stdcall OemToCharA(ptr ptr) OemToChar32A
0402 stdcall OemToCharBuffA(ptr ptr long) OemToCharBuff32A 0402 stdcall OemToCharBuffA(ptr ptr long) OemToCharBuff32A

View File

@ -16,12 +16,10 @@ int CallTo32_LargeStack( int (*func)(), int nbargs, ... );
/* List of the 16-bit callback functions. This list is used */ /* List of the 16-bit callback functions. This list is used */
/* by the build program to generate the file if1632/callto16.S */ /* by the build program to generate the file if1632/callto16.S */
/* func parameters */
extern WORD CallTo16_word_ ( FARPROC16 );
#ifndef WINELIB #ifndef WINELIB
extern void CallTo16_regs_ ( const CONTEXT *context ); extern void CallTo16_regs_ ( const CONTEXT *context );
extern WORD CallTo16_word_ ( FARPROC16 );
extern WORD CallTo16_word_w ( FARPROC16, WORD ); extern WORD CallTo16_word_w ( FARPROC16, WORD );
extern WORD CallTo16_word_ww ( FARPROC16, WORD, WORD ); extern WORD CallTo16_word_ww ( FARPROC16, WORD, WORD );
extern WORD CallTo16_word_wl ( FARPROC16, WORD, LONG ); extern WORD CallTo16_word_wl ( FARPROC16, WORD, LONG );
@ -54,17 +52,8 @@ extern LONG CallTo16_long_lwwllwlllllw( FARPROC16, LONG, WORD, WORD, LONG,
CallTo16_word_wwlll( func, id, msg, dwUser, dw1, dw2 ) CallTo16_word_wwlll( func, id, msg, dwUser, dw1, dw2 )
#define CallWindowsExitProc( func, nExitType ) \ #define CallWindowsExitProc( func, nExitType ) \
CallTo16_word_w( func, nExitType ) CallTo16_word_w( func, nExitType )
#define CallWndProc16( func, hwnd, msg, wParam, lParam ) \
CallTo16_long_wwwl( (FARPROC16)(func), hwnd, msg, wParam, lParam )
#define CallWordBreakProc16( func, lpch, ichCurrent, cch, code ) \ #define CallWordBreakProc16( func, lpch, ichCurrent, cch, code ) \
CallTo16_word_lwww( func, lpch, ichCurrent, cch, code ) CallTo16_word_lwww( func, lpch, ichCurrent, cch, code )
#define CallWndProcNCCREATE16( func, exStyle, clsName, winName, style, \
x, y, cx, cy, hparent, hmenu, instance, \
params, hwnd, msg, wParam, lParam ) \
CallTo16_long_lllllllwlwwwl( (FARPROC16)(func), exStyle, clsName, winName,\
style, MAKELONG(y,x), MAKELONG(cy,cx), \
MAKELONG(hmenu,hparent), instance, params, \
hwnd, msg, wParam, lParam )
/* List of the 32-bit callback functions. This list is used */ /* List of the 32-bit callback functions. This list is used */
@ -81,8 +70,6 @@ extern LONG CallTo32_5( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD );
CallTo32_0( func ) CallTo32_0( func )
#define CallDLLEntryProc32( func, hmodule, a, b ) \ #define CallDLLEntryProc32( func, hmodule, a, b ) \
CallTo32_3( func, hmodule, a, b ) CallTo32_3( func, hmodule, a, b )
#define CallWndProc32( func, hwnd, msg, wParam, lParam ) \
CallTo32_4( func, hwnd, msg, wParam, lParam )
#define CallWordBreakProc32A( func, lpch, ichCurrent, cch, code ) \ #define CallWordBreakProc32A( func, lpch, ichCurrent, cch, code ) \
CallTo32_4( func, (DWORD)lpch, ichCurrent, cch, code ) CallTo32_4( func, (DWORD)lpch, ichCurrent, cch, code )
@ -95,10 +82,6 @@ extern LONG CallTo32_5( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD );
(*func)( id, msg, dwUser, dw1, dw2 ) (*func)( id, msg, dwUser, dw1, dw2 )
#define CallWindowsExitProc( func, nExitType ) \ #define CallWindowsExitProc( func, nExitType ) \
(*func)( nExitType ) (*func)( nExitType )
#define CallWndProc16( func, hwnd, msg, wParam, lParam ) \
(*func)( hwnd, msg, wParam, lParam )
#define CallWndProc32( func, hwnd, msg, wParam, lParam ) \
(*func)( hwnd, msg, wParam, lParam )
#define CallWordBreakProc16( func, lpch, ichCurrent, cch, code ) \ #define CallWordBreakProc16( func, lpch, ichCurrent, cch, code ) \
(*func)( lpch, ichCurrent, cch, code ) (*func)( lpch, ichCurrent, cch, code )
#define CallWordBreakProc32A( func, lpch, ichCurrent, cch, code ) \ #define CallWordBreakProc32A( func, lpch, ichCurrent, cch, code ) \

View File

@ -1,6 +1,7 @@
#ifndef __WINE_MSDOS_H #ifndef __WINE_MSDOS_H
#define __WINE_MSDOS_H #define __WINE_MSDOS_H
#include <sys/types.h>
#include <dirent.h> #include <dirent.h>
#include "windows.h" #include "windows.h"
#include "comm.h" #include "comm.h"

View File

@ -39,12 +39,7 @@ typedef struct
} SIGCONTEXT; } SIGCONTEXT;
#endif /* linux */ #endif /* linux */
#ifdef __NetBSD__ #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
#include <signal.h>
typedef struct sigcontext SIGCONTEXT;
#endif /* NetBSD */
#ifdef __FreeBSD__
#include <signal.h> #include <signal.h>
typedef struct sigcontext SIGCONTEXT; typedef struct sigcontext SIGCONTEXT;
#endif /* FreeBSD */ #endif /* FreeBSD */
@ -123,8 +118,8 @@ typedef struct _CONTEXT /* Note 1 */
#define EFL_sig(context) ((context)->sc_efl) #define EFL_sig(context) ((context)->sc_efl)
#endif #endif
#define EIP_sig(context) ((context)->sc_eip) #define EIP_sig(context) (*((unsigned long*)&(context)->sc_eip))
#define ESP_sig(context) ((context)->sc_esp) #define ESP_sig(context) (*((unsigned long*)&(context)->sc_esp))
#endif /* linux || __NetBSD__ || __FreeBSD__ */ #endif /* linux || __NetBSD__ || __FreeBSD__ */

View File

@ -5611,13 +5611,13 @@ LONG DispatchMessage16(const MSG16*);
LONG DispatchMessage32A(const MSG32*); LONG DispatchMessage32A(const MSG32*);
LONG DispatchMessage32W(const MSG32*); LONG DispatchMessage32W(const MSG32*);
#define DispatchMessage WINELIB_NAME_AW(DispatchMessage) #define DispatchMessage WINELIB_NAME_AW(DispatchMessage)
INT16 DlgDirList16(HWND16,LPCSTR,INT16,INT16,UINT16); INT16 DlgDirList16(HWND16,LPSTR,INT16,INT16,UINT16);
INT32 DlgDirList32A(HWND32,LPCSTR,INT32,INT32,UINT32); INT32 DlgDirList32A(HWND32,LPSTR,INT32,INT32,UINT32);
INT32 DlgDirList32W(HWND32,LPCWSTR,INT32,INT32,UINT32); INT32 DlgDirList32W(HWND32,LPWSTR,INT32,INT32,UINT32);
#define DlgDirList WINELIB_NAME_AW(DlgDirList) #define DlgDirList WINELIB_NAME_AW(DlgDirList)
INT16 DlgDirListComboBox16(HWND16,LPCSTR,INT16,INT16,UINT16); INT16 DlgDirListComboBox16(HWND16,LPSTR,INT16,INT16,UINT16);
INT32 DlgDirListComboBox32A(HWND32,LPCSTR,INT32,INT32,UINT32); INT32 DlgDirListComboBox32A(HWND32,LPSTR,INT32,INT32,UINT32);
INT32 DlgDirListComboBox32W(HWND32,LPCWSTR,INT32,INT32,UINT32); INT32 DlgDirListComboBox32W(HWND32,LPWSTR,INT32,INT32,UINT32);
#define DlgDirListComboBox WINELIB_NAME_AW(DlgDirListComboBox) #define DlgDirListComboBox WINELIB_NAME_AW(DlgDirListComboBox)
BOOL16 DlgDirSelectComboBoxEx16(HWND16,LPSTR,INT16,INT16); BOOL16 DlgDirSelectComboBoxEx16(HWND16,LPSTR,INT16,INT16);
BOOL32 DlgDirSelectComboBoxEx32A(HWND32,LPSTR,INT32,INT32); BOOL32 DlgDirSelectComboBoxEx32A(HWND32,LPSTR,INT32,INT32);

View File

@ -76,4 +76,9 @@ extern void WINPROC_UnmapMsg32ATo16( UINT32 msg, WPARAM32 wParam,
extern void WINPROC_UnmapMsg32WTo16( UINT32 msg, WPARAM32 wParam, extern void WINPROC_UnmapMsg32WTo16( UINT32 msg, WPARAM32 wParam,
LPARAM lParam, MSGPARAM16* pm16 ); LPARAM lParam, MSGPARAM16* pm16 );
typedef LRESULT (*WINPROC_CALLWNDPROC16)(WNDPROC16,HWND16,UINT16,WPARAM16,LPARAM);
typedef LRESULT (*WINPROC_CALLWNDPROC32)(WNDPROC32,HWND32,UINT32,WPARAM32,LPARAM);
extern void WINPROC_SetCallWndProc16( WINPROC_CALLWNDPROC16 proc );
extern void WINPROC_SetCallWndProc32( WINPROC_CALLWNDPROC32 proc );
#endif /* __WINE_WINPROC_H */ #endif /* __WINE_WINPROC_H */

View File

@ -17,6 +17,10 @@ void SIGNAL_MaskAsyncEvents( BOOL32 mask )
/* FIXME: signals don't work in the library */ /* FIXME: signals don't work in the library */
} }
/* for windows/winproc.c */
void CallFrom16_long_wwwll(void) {}
void CallFrom32_stdcall_5(void) {}
int CallTo32_LargeStack( int (*func)(), int nbargs, ...) int CallTo32_LargeStack( int (*func)(), int nbargs, ...)
{ {
va_list arglist; va_list arglist;

View File

@ -451,7 +451,7 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
((fastload && ((offset) >= fastload_offset) && \ ((fastload && ((offset) >= fastload_offset) && \
((offset)+(size) <= fastload_offset+fastload_length)) ? \ ((offset)+(size) <= fastload_offset+fastload_length)) ? \
(memcpy( buffer, fastload+(offset)-fastload_offset, (size) ), TRUE) : \ (memcpy( buffer, fastload+(offset)-fastload_offset, (size) ), TRUE) : \
(_llseek32( hFile, mz_header.ne_offset+(offset), SEEK_SET), \ (_llseek32( hFile, (offset), SEEK_SET), \
_lread32( hFile, (buffer), (size) ) == (size))) _lread32( hFile, (buffer), (size) ) == (size)))
_llseek32( hFile, 0, SEEK_SET ); _llseek32( hFile, 0, SEEK_SET );
@ -509,10 +509,11 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
fastload_offset, fastload_length ); fastload_offset, fastload_length );
if ((fastload = HeapAlloc( SystemHeap, 0, fastload_length )) != NULL) if ((fastload = HeapAlloc( SystemHeap, 0, fastload_length )) != NULL)
{ {
_llseek32( hFile, mz_header.ne_offset + fastload_offset, SEEK_SET); _llseek32( hFile, fastload_offset, SEEK_SET);
if (_lread32(hFile, fastload, fastload_length) != fastload_length) if (_lread32(hFile, fastload, fastload_length) != fastload_length)
{ {
HeapFree( SystemHeap, 0, fastload ); HeapFree( SystemHeap, 0, fastload );
fprintf(stderr, "Error reading fast-load area !\n");
fastload = NULL; fastload = NULL;
} }
} }
@ -536,12 +537,12 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
int i; int i;
struct ne_segment_table_entry_s *pSeg; struct ne_segment_table_entry_s *pSeg;
if (!READ( ne_header.segment_tab_offset, if (!READ( mz_header.ne_offset + ne_header.segment_tab_offset,
ne_header.n_segment_tab * sizeof(struct ne_segment_table_entry_s), ne_header.n_segment_tab * sizeof(struct ne_segment_table_entry_s),
buffer )) buffer ))
{ {
HeapFree( SystemHeap, 0, buffer ); HeapFree( SystemHeap, 0, buffer );
HeapFree( SystemHeap, 0, fastload ); if (fastload) HeapFree( SystemHeap, 0, fastload );
GlobalFree16( hModule ); GlobalFree16( hModule );
return (HMODULE16)11; /* invalid exe */ return (HMODULE16)11; /* invalid exe */
} }
@ -555,7 +556,7 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
} }
else else
{ {
HeapFree( SystemHeap, 0, fastload ); if (fastload) HeapFree( SystemHeap, 0, fastload );
GlobalFree16( hModule ); GlobalFree16( hModule );
return (HMODULE16)11; /* invalid exe */ return (HMODULE16)11; /* invalid exe */
} }
@ -565,7 +566,7 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
if (ne_header.resource_tab_offset < ne_header.rname_tab_offset) if (ne_header.resource_tab_offset < ne_header.rname_tab_offset)
{ {
pModule->res_table = (int)pData - (int)pModule; pModule->res_table = (int)pData - (int)pModule;
if (!READ(ne_header.resource_tab_offset, if (!READ(mz_header.ne_offset + ne_header.resource_tab_offset,
ne_header.rname_tab_offset - ne_header.resource_tab_offset, ne_header.rname_tab_offset - ne_header.resource_tab_offset,
pData )) return (HMODULE16)11; /* invalid exe */ pData )) return (HMODULE16)11; /* invalid exe */
pData += ne_header.rname_tab_offset - ne_header.resource_tab_offset; pData += ne_header.rname_tab_offset - ne_header.resource_tab_offset;
@ -575,11 +576,11 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
/* Get the resident names table */ /* Get the resident names table */
pModule->name_table = (int)pData - (int)pModule; pModule->name_table = (int)pData - (int)pModule;
if (!READ( ne_header.rname_tab_offset, if (!READ( mz_header.ne_offset + ne_header.rname_tab_offset,
ne_header.moduleref_tab_offset - ne_header.rname_tab_offset, ne_header.moduleref_tab_offset - ne_header.rname_tab_offset,
pData )) pData ))
{ {
HeapFree( SystemHeap, 0, fastload ); if (fastload) HeapFree( SystemHeap, 0, fastload );
GlobalFree16( hModule ); GlobalFree16( hModule );
return (HMODULE16)11; /* invalid exe */ return (HMODULE16)11; /* invalid exe */
} }
@ -590,11 +591,11 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
if (ne_header.n_mod_ref_tab > 0) if (ne_header.n_mod_ref_tab > 0)
{ {
pModule->modref_table = (int)pData - (int)pModule; pModule->modref_table = (int)pData - (int)pModule;
if (!READ( ne_header.moduleref_tab_offset, if (!READ( mz_header.ne_offset + ne_header.moduleref_tab_offset,
ne_header.n_mod_ref_tab * sizeof(WORD), ne_header.n_mod_ref_tab * sizeof(WORD),
pData )) pData ))
{ {
HeapFree( SystemHeap, 0, fastload ); if (fastload) HeapFree( SystemHeap, 0, fastload );
GlobalFree16( hModule ); GlobalFree16( hModule );
return (HMODULE16)11; /* invalid exe */ return (HMODULE16)11; /* invalid exe */
} }
@ -605,11 +606,11 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
/* Get the imported names table */ /* Get the imported names table */
pModule->import_table = (int)pData - (int)pModule; pModule->import_table = (int)pData - (int)pModule;
if (!READ( ne_header.iname_tab_offset, if (!READ( mz_header.ne_offset + ne_header.iname_tab_offset,
ne_header.entry_tab_offset - ne_header.iname_tab_offset, ne_header.entry_tab_offset - ne_header.iname_tab_offset,
pData )) pData ))
{ {
HeapFree( SystemHeap, 0, fastload ); if (fastload) HeapFree( SystemHeap, 0, fastload );
GlobalFree16( hModule ); GlobalFree16( hModule );
return (HMODULE16)11; /* invalid exe */ return (HMODULE16)11; /* invalid exe */
} }
@ -618,11 +619,11 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
/* Get the entry table */ /* Get the entry table */
pModule->entry_table = (int)pData - (int)pModule; pModule->entry_table = (int)pData - (int)pModule;
if (!READ( ne_header.entry_tab_offset, if (!READ( mz_header.ne_offset + ne_header.entry_tab_offset,
ne_header.entry_tab_length, ne_header.entry_tab_length,
pData )) pData ))
{ {
HeapFree( SystemHeap, 0, fastload ); if (fastload) HeapFree( SystemHeap, 0, fastload );
GlobalFree16( hModule ); GlobalFree16( hModule );
return (HMODULE16)11; /* invalid exe */ return (HMODULE16)11; /* invalid exe */
} }
@ -631,7 +632,7 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
/* Free the fast-load area */ /* Free the fast-load area */
#undef READ #undef READ
HeapFree( SystemHeap, 0, fastload ); if (fastload) HeapFree( SystemHeap, 0, fastload );
/* Get the non-resident names table */ /* Get the non-resident names table */
@ -1379,6 +1380,17 @@ BOOL16 GetModuleName( HINSTANCE16 hinst, LPSTR buf, INT16 nSize )
} }
/***********************************************************************
* LoadLibraryEx32W (KERNEL.513)
*/
HINSTANCE16 LoadLibraryEx32W16( LPCSTR libname, HANDLE16 hf, DWORD flags )
{
fprintf(stderr,"LoadLibraryEx32W(%s,%d,%08lx)\n",libname,hf,flags);
if (!flags && !hf)
return LoadLibrary32A(libname);
return 0;
}
/*********************************************************************** /***********************************************************************
* LoadLibrary (KERNEL.95) * LoadLibrary (KERNEL.95)
*/ */
@ -1459,8 +1471,9 @@ HINSTANCE32 WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
cmdline = (char *)GlobalLock16( cmdLineHandle ); cmdline = (char *)GlobalLock16( cmdLineHandle );
lstrcpyn32A(filename, lpCmdLine, sizeof(filename) - 4 /* for extension */); lstrcpyn32A(filename, lpCmdLine, sizeof(filename) - 4 /* for extension */);
for (p = filename; *p && (*p != ' ') && (*p != '\t'); p++); for (p = filename; *p && (*p != ' ') && (*p != '\t'); p++);
if (*p) lstrcpyn32A( cmdline, p + 1, 128 ); if (*p) lstrcpyn32A( cmdline + 1, p + 1, 127 );
else cmdline[0] = '\0'; else cmdline[1] = '\0';
cmdline[0] = strlen( cmdline + 1 ) + 1;
*p = '\0'; *p = '\0';
/* Now load the executable file */ /* Now load the executable file */
@ -1603,6 +1616,10 @@ FARPROC32 GetProcAddress32( HMODULE32 hModule, LPCSTR function )
#ifndef WINELIB #ifndef WINELIB
NE_MODULE *pModule; NE_MODULE *pModule;
if (HIWORD(function))
dprintf_win32(stddeb,"GetProcAddress32(%08lx,%s)\n",(DWORD)hModule,function);
else
dprintf_win32(stddeb,"GetProcAddress32(%08lx,%p)\n",(DWORD)hModule,function);
hModule = GetExePtr( hModule ); hModule = GetExePtr( hModule );
if (!(pModule = MODULE_GetPtr( hModule ))) if (!(pModule = MODULE_GetPtr( hModule )))
return (FARPROC32)0; return (FARPROC32)0;
@ -1616,6 +1633,26 @@ FARPROC32 GetProcAddress32( HMODULE32 hModule, LPCSTR function )
#endif #endif
} }
/***********************************************************************
* RtlImageNtHeaders (NTDLL)
*/
LPIMAGE_NT_HEADERS
RtlImageNtHeader(HMODULE32 hModule)
{
#ifndef WINELIB
NE_MODULE *pModule;
hModule = GetExePtr( hModule );
if (!(pModule = MODULE_GetPtr( hModule )))
return (LPIMAGE_NT_HEADERS)0;
if (!(pModule->flags & NE_FFLAGS_WIN32) || !pModule->pe_module)
return (LPIMAGE_NT_HEADERS)0;
return pModule->pe_module->pe_header;
#else
return NULL;
#endif
}
/********************************************************************** /**********************************************************************
* GetExpWinVer (KERNEL.167) * GetExpWinVer (KERNEL.167)

View File

@ -151,15 +151,15 @@ HANDLER_DEF(SIGNAL_fault)
HANDLER_PROLOG; HANDLER_PROLOG;
if (CS_sig(context) == WINE_CODE_SELECTOR) if (CS_sig(context) == WINE_CODE_SELECTOR)
{ {
fprintf( stderr, "Segmentation fault in Wine program (%x:%lx)." fprintf( stderr, "Segmentation fault in Wine program (%04x:%08lx)."
" Please debug.\n", " Please debug.\n",
CS_sig(context), EIP_sig(context) ); (unsigned short) CS_sig(context), EIP_sig(context));
} }
else else
{ {
if (INSTR_EmulateInstruction( context )) return; if (INSTR_EmulateInstruction( context )) return;
fprintf( stderr, "Segmentation fault in Windows program %x:%lx.\n", fprintf( stderr, "Segmentation fault in Windows program %04x:%08lx.\n",
CS_sig(context), EIP_sig(context) ); (unsigned short) CS_sig(context), EIP_sig(context) );
} }
wine_debug( signal, context ); wine_debug( signal, context );
HANDLER_EPILOG; HANDLER_EPILOG;

View File

@ -514,8 +514,7 @@ HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
memset( pTask->pdb.fileHandles, 0xff, sizeof(pTask->pdb.fileHandles) ); memset( pTask->pdb.fileHandles, 0xff, sizeof(pTask->pdb.fileHandles) );
pTask->pdb.environment = hEnvironment; pTask->pdb.environment = hEnvironment;
pTask->pdb.nbFiles = 20; pTask->pdb.nbFiles = 20;
lstrcpyn32A( pTask->pdb.cmdLine + 1, cmdLine, 127 ); lstrcpyn32A( pTask->pdb.cmdLine, cmdLine, 127 );
pTask->pdb.cmdLine[0] = strlen( pTask->pdb.cmdLine + 1 );
/* Get the compatibility flags */ /* Get the compatibility flags */
@ -539,6 +538,7 @@ HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
/* Create the Win32 part of the task */ /* Create the Win32 part of the task */
pdb32 = PROCESS_Create( pTask ); pdb32 = PROCESS_Create( pTask );
pdb32->task = hTask;
if (pModule->flags & NE_FFLAGS_WIN32) if (pModule->flags & NE_FFLAGS_WIN32)
{ {
LPTHREAD_START_ROUTINE start = LPTHREAD_START_ROUTINE start =

View File

@ -57,6 +57,18 @@ typedef struct
BYTE lock; /* Lock count */ BYTE lock; /* Lock count */
} LOCALHANDLEENTRY; } LOCALHANDLEENTRY;
/*
* We make addr = 4n + 2 and set *((WORD *)addr - 1) = &addr like Windows does
* in case something actually relies on this.
* Note the ARENA_HEADER(addr) still produces the desired result ie. 4n - 4
*
* An unused handle has lock = flags = 0xff. In windows addr is that of next
* free handle, at the moment in wine we set it to 0.
*
* A discarded block's handle has lock = addr = 0 and flags = 0x40
* (LMEM_DISCARDED >> 8)
*/
#pragma pack(1) #pragma pack(1)
typedef struct typedef struct
@ -564,6 +576,27 @@ static void LOCAL_GrowArenaDownward( WORD ds, WORD arena, WORD newsize )
} }
/***********************************************************************
* LOCAL_GrowArenaUpward
*
* Grow an arena upward by using the next arena (must be free and big
* enough). Newsize includes the arena header and must be aligned.
*/
static void LOCAL_GrowArenaUpward( WORD ds, WORD arena, WORD newsize )
{
char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
LOCALHEAPINFO *pInfo;
LOCALARENA *pArena = ARENA_PTR( ptr, arena );
WORD nextArena = pArena->next;
if (!(pInfo = LOCAL_GetHeap( ds ))) return;
LOCAL_RemoveBlock( ptr, nextArena );
pInfo->items--;
LOCAL_ShrinkArena( ds, arena, newsize );
}
/*********************************************************************** /***********************************************************************
* LOCAL_GetFreeSpace * LOCAL_GetFreeSpace
*/ */
@ -632,8 +665,7 @@ static WORD LOCAL_Compact( HANDLE16 ds, WORD minfree, WORD flags )
pEntry = (LOCALHANDLEENTRY *)(ptr + table + sizeof(WORD)); pEntry = (LOCALHANDLEENTRY *)(ptr + table + sizeof(WORD));
for(count = *(WORD *)(ptr + table); count > 0; count--, pEntry++) for(count = *(WORD *)(ptr + table); count > 0; count--, pEntry++)
{ {
if((pEntry->lock == 0) && !(pEntry->flags & if((pEntry->lock == 0) && (pEntry->flags != (LMEM_DISCARDED >> 8)))
(LMEM_DISCARDED >> 8)))
{ {
/* OK we can move this one if we want */ /* OK we can move this one if we want */
dprintf_local(stddeb, dprintf_local(stddeb,
@ -705,14 +737,14 @@ static WORD LOCAL_Compact( HANDLE16 ds, WORD minfree, WORD flags )
pEntry = (LOCALHANDLEENTRY *)(ptr + table + sizeof(WORD)); pEntry = (LOCALHANDLEENTRY *)(ptr + table + sizeof(WORD));
for(count = *(WORD *)(ptr + table); count > 0; count--, pEntry++) for(count = *(WORD *)(ptr + table); count > 0; count--, pEntry++)
{ {
if((pEntry->flags & (LMEM_DISCARDABLE >> 8)) && if(pEntry->addr && pEntry->lock == 0 &&
pEntry->lock == 0 && !(pEntry->flags & (LMEM_DISCARDED >> 8))) (pEntry->flags & (LMEM_DISCARDABLE >> 8)))
{ {
dprintf_local(stddeb, "Discarding handle %04x (block %04x).\n", dprintf_local(stddeb, "Discarding handle %04x (block %04x).\n",
(char *)pEntry - ptr, pEntry->addr); (char *)pEntry - ptr, pEntry->addr);
LOCAL_FreeArena(ds, pEntry->addr); LOCAL_FreeArena(ds, ARENA_HEADER(pEntry->addr));
pEntry->addr = 0; pEntry->addr = 0;
pEntry->flags |= (LMEM_DISCARDED >> 8); pEntry->flags = (LMEM_DISCARDED >> 8);
/* Call localnotify proc */ /* Call localnotify proc */
} }
} }
@ -801,8 +833,8 @@ static HLOCAL16 LOCAL_GetBlock( HANDLE16 ds, WORD size, WORD flags )
LOCAL_RemoveFreeBlock( ptr, arena ); LOCAL_RemoveFreeBlock( ptr, arena );
LOCAL_ShrinkArena( ds, arena, size ); LOCAL_ShrinkArena( ds, arena, size );
if (flags & LMEM_ZEROINIT) memset( (char *)pArena + ARENA_HEADER_SIZE, 0, if (flags & LMEM_ZEROINIT)
size - ARENA_HEADER_SIZE ); memset((char *)pArena + ARENA_HEADER_SIZE, 0, size-ARENA_HEADER_SIZE);
return arena + ARENA_HEADER_SIZE; return arena + ARENA_HEADER_SIZE;
} }
@ -838,7 +870,10 @@ static BOOL16 LOCAL_NewHTable( HANDLE16 ds )
*(WORD *)(ptr + handle) = pInfo->hdelta; *(WORD *)(ptr + handle) = pInfo->hdelta;
pEntry = (LOCALHANDLEENTRY *)(ptr + handle + sizeof(WORD)); pEntry = (LOCALHANDLEENTRY *)(ptr + handle + sizeof(WORD));
for (i = pInfo->hdelta; i > 0; i--) (pEntry++)->lock = 0xff; for (i = pInfo->hdelta; i > 0; i--, pEntry++) {
pEntry->lock = pEntry->flags = 0xff;
pEntry->addr = 0;
}
*(WORD *)pEntry = pInfo->htable; *(WORD *)pEntry = pInfo->htable;
pInfo->htable = handle; pInfo->htable = handle;
return TRUE; return TRUE;
@ -886,6 +921,7 @@ static HLOCAL16 LOCAL_GetNewHandleEntry( HANDLE16 ds )
/* Now allocate this entry */ /* Now allocate this entry */
pEntry->lock = 0; pEntry->lock = 0;
pEntry->flags = 0;
dprintf_local( stddeb, "LOCAL_GetNewHandleEntry(%04x): %04x\n", dprintf_local( stddeb, "LOCAL_GetNewHandleEntry(%04x): %04x\n",
ds, ((char *)pEntry - ptr) ); ds, ((char *)pEntry - ptr) );
return (HLOCAL16)((char *)pEntry - ptr); return (HLOCAL16)((char *)pEntry - ptr);
@ -928,7 +964,7 @@ static void LOCAL_FreeHandleEntry( HANDLE16 ds, HLOCAL16 handle )
pEntry->addr = 0; /* just in case */ pEntry->addr = 0; /* just in case */
pEntry->lock = 0xff; pEntry->lock = 0xff;
pEntry->flags = 0xff;
/* Now check if all entries in this table are free */ /* Now check if all entries in this table are free */
table = *pTable; table = *pTable;
@ -965,7 +1001,7 @@ HLOCAL16 LOCAL_Free( HANDLE16 ds, HLOCAL16 handle )
else else
{ {
LOCALHANDLEENTRY *pEntry = (LOCALHANDLEENTRY *)(ptr + handle); LOCALHANDLEENTRY *pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
if (!(pEntry->flags & (LMEM_DISCARDED >> 8))) if (pEntry->flags != (LMEM_DISCARDED >> 8))
{ {
dprintf_local( stddeb, "LocalFree: real block at %04x\n", dprintf_local( stddeb, "LocalFree: real block at %04x\n",
pEntry->addr ); pEntry->addr );
@ -982,6 +1018,7 @@ HLOCAL16 LOCAL_Free( HANDLE16 ds, HLOCAL16 handle )
* LOCAL_Alloc * LOCAL_Alloc
* *
* Implementation of LocalAlloc(). * Implementation of LocalAlloc().
*
*/ */
HLOCAL16 LOCAL_Alloc( HANDLE16 ds, WORD flags, WORD size ) HLOCAL16 LOCAL_Alloc( HANDLE16 ds, WORD flags, WORD size )
{ {
@ -990,26 +1027,47 @@ HLOCAL16 LOCAL_Alloc( HANDLE16 ds, WORD flags, WORD size )
dprintf_local( stddeb, "LocalAlloc: %04x %d ds=%04x\n", flags, size, ds ); dprintf_local( stddeb, "LocalAlloc: %04x %d ds=%04x\n", flags, size, ds );
if(size > 0 && size <= 4) size = 5;
if (flags & LMEM_MOVEABLE) if (flags & LMEM_MOVEABLE)
{ {
LOCALHANDLEENTRY *plhe; LOCALHANDLEENTRY *plhe;
HLOCAL16 hmem; HLOCAL16 hmem;
if (!(hmem = LOCAL_GetBlock( ds, size, flags ))) return 0; if(size)
{
if (!(hmem = LOCAL_GetBlock( ds, size + sizeof(HLOCAL16), flags )))
return 0;
}
else /* We just need to allocate a discarded handle */
hmem = 0;
if (!(handle = LOCAL_GetNewHandleEntry( ds ))) if (!(handle = LOCAL_GetNewHandleEntry( ds )))
{ {
fprintf( stderr, "LocalAlloc: couldn't get handle\n"); fprintf( stderr, "LocalAlloc: couldn't get handle\n");
if(hmem)
LOCAL_FreeArena( ds, ARENA_HEADER(hmem) ); LOCAL_FreeArena( ds, ARENA_HEADER(hmem) );
return 0; return 0;
} }
ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ); ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
plhe = (LOCALHANDLEENTRY *)(ptr + handle); plhe = (LOCALHANDLEENTRY *)(ptr + handle);
plhe->addr = hmem;
plhe->flags = (BYTE)(flags >> 8);
plhe->lock = 0; plhe->lock = 0;
if(hmem)
{
plhe->addr = hmem + sizeof(HLOCAL16);
plhe->flags = (BYTE)((flags & 0x0f00) >> 8);
*(HLOCAL16 *)(ptr + hmem) = handle;
}
else
{
plhe->addr = 0;
plhe->flags = LMEM_DISCARDED >> 8;
}
}
else /* FIXED */
{
if(!size)
return 0;
handle = LOCAL_GetBlock( ds, size, flags );
} }
else handle = LOCAL_GetBlock( ds, size, flags );
return handle; return handle;
} }
@ -1025,147 +1083,165 @@ HLOCAL16 LOCAL_ReAlloc( HANDLE16 ds, HLOCAL16 handle, WORD size, WORD flags )
LOCALHEAPINFO *pInfo; LOCALHEAPINFO *pInfo;
LOCALARENA *pArena, *pNext; LOCALARENA *pArena, *pNext;
LOCALHANDLEENTRY *pEntry; LOCALHANDLEENTRY *pEntry;
WORD arena, newhandle, blockhandle, oldsize; WORD arena, oldsize;
HLOCAL16 hmem, blockhandle;
LONG nextarena; LONG nextarena;
if (!handle) return LOCAL_Alloc( ds, size, flags ); if (!handle) return 0;
if(HANDLE_MOVEABLE(handle) &&
((LOCALHANDLEENTRY *)(ptr + handle))->lock == 0xff) /* An unused handle */
return 0;
dprintf_local( stddeb, "LocalReAlloc: %04x %d %04x ds=%04x\n", dprintf_local( stddeb, "LocalReAlloc: %04x %d %04x ds=%04x\n",
handle, size, flags, ds ); handle, size, flags, ds );
if (!(pInfo = LOCAL_GetHeap( ds ))) return 0; if (!(pInfo = LOCAL_GetHeap( ds ))) return 0;
if (HANDLE_FIXED( handle )) blockhandle = handle; if (HANDLE_FIXED( handle ))
blockhandle = handle;
else else
{ {
pEntry = (LOCALHANDLEENTRY *) (ptr + handle); pEntry = (LOCALHANDLEENTRY *) (ptr + handle);
if(pEntry->flags & (LMEM_DISCARDED >> 8)) if(pEntry->flags == (LMEM_DISCARDED >> 8))
{ {
HLOCAL16 hl;
if(pEntry->addr)
fprintf(stderr,
"LOCAL_ReAlloc: Dicarded block has non-zero addr.\n");
dprintf_local(stddeb, "ReAllocating discarded block\n"); dprintf_local(stddeb, "ReAllocating discarded block\n");
if (!(pEntry->addr = LOCAL_GetBlock( ds, size, flags))) return 0; if(size <= 4) size = 5;
if (!(hl = LOCAL_GetBlock( ds, size + sizeof(HLOCAL16), flags)))
return 0;
ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ); /* Reload ptr */ ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ); /* Reload ptr */
pEntry = (LOCALHANDLEENTRY *) (ptr + handle); pEntry = (LOCALHANDLEENTRY *) (ptr + handle);
pEntry->flags = (BYTE) (flags >> 8); pEntry->addr = hl + sizeof(HLOCAL16);
pEntry->flags = 0;
pEntry->lock = 0; pEntry->lock = 0;
*(HLOCAL16 *)(ptr + hl) = handle;
return handle; return handle;
} }
if (!(blockhandle = pEntry->addr)) if (((blockhandle = pEntry->addr) & 3) != 2)
{ {
fprintf( stderr, "Local_ReAlloc(%04x,%04x): invalid handle\n", fprintf( stderr, "Local_ReAlloc(%04x,%04x): invalid handle\n",
ds, handle ); ds, handle );
return 0; return 0;
} }
if(*((HLOCAL16 *)(ptr + blockhandle) - 1) != handle) {
fprintf(stderr, "Local_ReAlloc: Back ptr to handle is invalid\n");
return 0;
}
}
if (flags & LMEM_MODIFY)
{
if (HANDLE_MOVEABLE(handle))
{
pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
pEntry->flags = (flags & 0x0f00) >> 8;
dprintf_local(stddeb, "Changing flags to %x.\n", pEntry->flags);
}
return handle;
}
if (!size)
{
if (flags & LMEM_MOVEABLE)
{
if (HANDLE_FIXED(handle))
{
dprintf_local(stddeb, "Freeing fixed block.\n");
return LOCAL_Free( ds, handle );
}
else /* Moveable block */
{
pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
if (pEntry->lock == 0)
{
/* discards moveable blocks */
dprintf_local(stddeb,"Discarding block\n");
LOCAL_FreeArena(ds, ARENA_HEADER(pEntry->addr));
pEntry->addr = 0;
pEntry->flags = (LMEM_DISCARDED >> 8);
return handle;
}
}
return 0;
}
else if(flags == 0)
{
pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
if (pEntry->lock == 0)
{
/* Frees block */
return LOCAL_Free( ds, handle );
}
}
return 0;
} }
arena = ARENA_HEADER( blockhandle ); arena = ARENA_HEADER( blockhandle );
dprintf_local( stddeb, "LocalReAlloc: arena is %04x\n", arena ); dprintf_local( stddeb, "LocalReAlloc: arena is %04x\n", arena );
pArena = ARENA_PTR( ptr, arena ); pArena = ARENA_PTR( ptr, arena );
if ((flags & LMEM_MODIFY) && (flags & LMEM_DISCARDABLE)) if(size <= 4) size = 5;
{
if (HANDLE_FIXED(handle))
{
fprintf(stderr,"LocalReAlloc: LMEM_MODIFY & LMEM_DISCARDABLE on a fixed handle.\n");
return handle;
}
dprintf_local( stddeb, "Making block discardable.\n" );
pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
pEntry->flags |= (LMEM_DISCARDABLE >> 8);
return handle;
}
if ((flags & LMEM_MODIFY) || (flags & LMEM_DISCARDABLE))
{
fprintf(stderr,"LocalReAlloc: flags %04x. MODIFY & DISCARDABLE should both be set\n", flags);
return handle;
}
if (!size)
{
if (HANDLE_FIXED(handle))
{
if (flags & LMEM_MOVEABLE)
{
dprintf_local(stddeb, "Freeing fixed block.\n");
return LOCAL_Free( ds, handle );
}
else size = 1;
}
else
{
pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
if (pEntry->lock == 0)
{
/* discards moveable blocks is this right? */
dprintf_local(stddeb,"Discarding block\n");
LOCAL_FreeArena(ds, ARENA_HEADER(pEntry->addr));
pEntry->addr = 0;
pEntry->flags = (LMEM_DISCARDED >> 8);
return 0;
}
return handle;
}
}
size = LALIGN( size );
oldsize = pArena->next - arena - ARENA_HEADER_SIZE; oldsize = pArena->next - arena - ARENA_HEADER_SIZE;
nextarena = LALIGN(blockhandle + size); nextarena = LALIGN(blockhandle + size);
/* Check for size reduction */ /* Check for size reduction */
if (nextarena <= pArena->next) if (nextarena <= pArena->next)
{
if (nextarena < pArena->next - LALIGN(sizeof(LOCALARENA)))
{ {
dprintf_local( stddeb, "size reduction, making new free block\n"); dprintf_local( stddeb, "size reduction, making new free block\n");
/* It is worth making a new free block */ LOCAL_ShrinkArena(ds, arena, nextarena - arena);
LOCAL_AddBlock( ptr, arena, nextarena );
pInfo->items++;
LOCAL_FreeArena( ds, nextarena );
}
dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", handle ); dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", handle );
return handle; return handle;
} }
/* Check if the next block is free */ /* Check if the next block is free and large enough */
pNext = ARENA_PTR( ptr, pArena->next ); pNext = ARENA_PTR( ptr, pArena->next );
if (((pNext->prev & 3) == LOCAL_ARENA_FREE) && if (((pNext->prev & 3) == LOCAL_ARENA_FREE) &&
(nextarena <= pNext->next)) (nextarena <= pNext->next))
{
LOCAL_RemoveBlock( ptr, pArena->next );
if (nextarena < pArena->next - LALIGN(sizeof(LOCALARENA)))
{ {
dprintf_local( stddeb, "size increase, making new free block\n"); dprintf_local( stddeb, "size increase, making new free block\n");
/* It is worth making a new free block */ LOCAL_GrowArenaUpward(ds, arena, nextarena - arena);
LOCAL_AddBlock( ptr, arena, nextarena );
pInfo->items++;
LOCAL_FreeArena( ds, nextarena );
}
dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", handle ); dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", handle );
return handle; return handle;
} }
/* Now we have to allocate a new block, but not if fixed block and no /* Now we have to allocate a new block, but not if (fixed block or locked
LMEM_MOVEABLE */ block) and no LMEM_MOVEABLE */
if (HANDLE_FIXED(handle) && !(flags & LMEM_MOVEABLE)) if (!(flags & LMEM_MOVEABLE))
{ {
dprintf_local(stddeb, "Needed to move fixed block, but LMEM_MOVEABLE not specified.\n"); if (HANDLE_FIXED(handle))
return 0; /* FIXME: should we free it here? */ {
dprintf_local(stddeb,
"Needed to move fixed block, but LMEM_MOVEABLE not specified.\n");
return 0;
} }
else
newhandle = LOCAL_GetBlock( ds, size, flags ); {
if(((LOCALHANDLEENTRY *)(ptr + handle))->lock != 0)
{
dprintf_local(stddeb,
"Needed to move locked block, but LMEM_MOVEABLE not specified.\n");
return 0;
}
}
}
if(HANDLE_MOVEABLE(handle)) size += sizeof(HLOCAL16);
hmem = LOCAL_GetBlock( ds, size, flags );
ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ); /* Reload ptr */ ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ); /* Reload ptr */
if (!newhandle) if (!hmem)
{ {
/* Remove the block from the heap and try again */ /* Remove the block from the heap and try again */
LPSTR buffer = HeapAlloc( SystemHeap, 0, oldsize ); LPSTR buffer = HeapAlloc( SystemHeap, 0, oldsize );
if (!buffer) return 0; if (!buffer) return 0;
memcpy( buffer, ptr + (arena + ARENA_HEADER_SIZE), oldsize ); memcpy( buffer, ptr + arena + ARENA_HEADER_SIZE, oldsize );
LOCAL_FreeArena( ds, arena ); LOCAL_FreeArena( ds, arena );
if (!(newhandle = LOCAL_GetBlock( ds, size, flags ))) if (!(hmem = LOCAL_GetBlock( ds, size, flags )))
{ {
if (!(newhandle = LOCAL_GetBlock( ds, oldsize, flags ))) if (!(hmem = LOCAL_GetBlock( ds, oldsize, flags )))
{ {
fprintf( stderr, "LocalRealloc: can't restore saved block\n" ); fprintf( stderr, "LocalRealloc: can't restore saved block\n" );
HeapFree( SystemHeap, 0, buffer ); HeapFree( SystemHeap, 0, buffer );
@ -1174,25 +1250,27 @@ HLOCAL16 LOCAL_ReAlloc( HANDLE16 ds, HLOCAL16 handle, WORD size, WORD flags )
size = oldsize; size = oldsize;
} }
ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ); /* Reload ptr */ ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ); /* Reload ptr */
memcpy( ptr + newhandle, buffer, oldsize ); memcpy( ptr + hmem, buffer, oldsize );
HeapFree( SystemHeap, 0, buffer ); HeapFree( SystemHeap, 0, buffer );
} }
else else
{ {
memcpy( ptr + newhandle, ptr + (arena + ARENA_HEADER_SIZE), oldsize ); memcpy( ptr + hmem, ptr + (arena + ARENA_HEADER_SIZE), oldsize );
LOCAL_FreeArena( ds, arena ); LOCAL_FreeArena( ds, arena );
} }
if (HANDLE_MOVEABLE( handle )) if (HANDLE_MOVEABLE( handle ))
{ {
dprintf_local( stddeb, "LocalReAlloc: fixing handle\n"); dprintf_local( stddeb, "LocalReAlloc: fixing handle\n");
pEntry = (LOCALHANDLEENTRY *)(ptr + handle); pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
pEntry->addr = newhandle; pEntry->addr = hmem + sizeof(HLOCAL16);
pEntry->lock = 0; /* Back ptr should still be correct */
newhandle = handle; if(*(HLOCAL16 *)(ptr + hmem) != handle)
fprintf(stderr, "Local_ReAlloc: back ptr is invalid.\n");
hmem = handle;
} }
if (size == oldsize) newhandle = 0; /* Realloc failed */ if (size == oldsize) hmem = 0; /* Realloc failed */
dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", newhandle ); dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", hmem );
return newhandle; return hmem;
} }
@ -1205,6 +1283,7 @@ static HLOCAL16 LOCAL_InternalLock( LPSTR heap, HLOCAL16 handle )
if (HANDLE_MOVEABLE(handle)) if (HANDLE_MOVEABLE(handle))
{ {
LOCALHANDLEENTRY *pEntry = (LOCALHANDLEENTRY *)(heap + handle); LOCALHANDLEENTRY *pEntry = (LOCALHANDLEENTRY *)(heap + handle);
if (pEntry->flags == LMEM_DISCARDED) return 0;
if (pEntry->lock < 0xfe) pEntry->lock++; if (pEntry->lock < 0xfe) pEntry->lock++;
handle = pEntry->addr; handle = pEntry->addr;
} }
@ -1266,6 +1345,7 @@ WORD LOCAL_Size( HANDLE16 ds, HLOCAL16 handle )
dprintf_local( stddeb, "LocalSize: %04x ds=%04x\n", handle, ds ); dprintf_local( stddeb, "LocalSize: %04x ds=%04x\n", handle, ds );
if (HANDLE_MOVEABLE( handle )) handle = *(WORD *)(ptr + handle); if (HANDLE_MOVEABLE( handle )) handle = *(WORD *)(ptr + handle);
if (!handle) return 0;
pArena = ARENA_PTR( ptr, ARENA_HEADER(handle) ); pArena = ARENA_PTR( ptr, ARENA_HEADER(handle) );
return pArena->next - handle; return pArena->next - handle;
} }
@ -1477,6 +1557,7 @@ FARPROC16 LocalNotify( FARPROC16 func )
return 0; return 0;
} }
dprintf_local( stddeb, "LocalNotify(%04x): %08lx\n", ds, (DWORD)func ); dprintf_local( stddeb, "LocalNotify(%04x): %08lx\n", ds, (DWORD)func );
fprintf(stdnimp, "LocalNotify(): Half implemented\n");
oldNotify = pInfo->notify; oldNotify = pInfo->notify;
pInfo->notify = func; pInfo->notify = func;
return oldNotify; return oldNotify;

View File

@ -1019,6 +1019,7 @@ LPVOID MapViewOfFileEx( HANDLE32 handle, DWORD access, DWORD offset_high,
{ {
case FILE_MAP_ALL_ACCESS: case FILE_MAP_ALL_ACCESS:
case FILE_MAP_WRITE: case FILE_MAP_WRITE:
case FILE_MAP_WRITE | FILE_MAP_READ:
if (!(mapping->protect & VPROT_WRITE)) if (!(mapping->protect & VPROT_WRITE))
{ {
SetLastError( ERROR_INVALID_PARAMETER ); SetLastError( ERROR_INVALID_PARAMETER );
@ -1028,6 +1029,7 @@ LPVOID MapViewOfFileEx( HANDLE32 handle, DWORD access, DWORD offset_high,
/* fall through */ /* fall through */
case FILE_MAP_READ: case FILE_MAP_READ:
case FILE_MAP_COPY: case FILE_MAP_COPY:
case FILE_MAP_COPY | FILE_MAP_READ:
if (mapping->protect & VPROT_READ) break; if (mapping->protect & VPROT_READ) break;
/* fall through */ /* fall through */
default: default:

View File

@ -9,6 +9,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <time.h> #include <time.h>
@ -135,7 +136,8 @@ void CRTDLL_srand(DWORD seed)
int CRTDLL_fprintf(DWORD *args) int CRTDLL_fprintf(DWORD *args)
{ {
/* FIXME: use args[0] */ /* FIXME: use args[0] */
return vfprintf(stderr,(LPSTR)(args[1]),args+2); /* CMF - This makes a BIG assumption about va_list */
return vfprintf(stderr, (LPSTR) args[1], (va_list) &args[2]);
} }
/********************************************************************* /*********************************************************************
@ -143,7 +145,8 @@ int CRTDLL_fprintf(DWORD *args)
*/ */
int CRTDLL_printf(DWORD *args) int CRTDLL_printf(DWORD *args)
{ {
return vfprintf(stdout,(LPSTR)(args[0]),args+1); /* CMF - This makes a BIG assumption about va_list */
return vfprintf(stdout, (LPSTR) args[0], (va_list) &args[1]);
} }
/********************************************************************* /*********************************************************************
@ -151,7 +154,8 @@ int CRTDLL_printf(DWORD *args)
*/ */
int CRTDLL_sprintf(DWORD *args) int CRTDLL_sprintf(DWORD *args)
{ {
return vsprintf((LPSTR)(args[0]),(LPSTR)(args[1]),args+2); /* CMF - This makes a BIG assumption about va_list */
return vsprintf((LPSTR) args[0], (LPSTR) args[1], (va_list) &args[2]);
} }
/********************************************************************* /*********************************************************************
@ -577,7 +581,8 @@ unsigned char* CRTDLL__mbsinc(unsigned char *x)
*/ */
int CRTDLL_vsprintf(DWORD *args) int CRTDLL_vsprintf(DWORD *args)
{ {
return vsprintf((char *)args[0],(char *)args[1],args+2); /* CMF - This makes a BIG assumption about va_list */
return vsprintf((char *) args[0], (char *) args[1], (va_list) &args[2]);
} }
/********************************************************************* /*********************************************************************
@ -585,7 +590,8 @@ int CRTDLL_vsprintf(DWORD *args)
*/ */
int CRTDLL_sscanf(DWORD *args) int CRTDLL_sscanf(DWORD *args)
{ {
return vsscanf((char *)args[0],(char *)args[1],args+2); /* CMF - This makes a BIG assumption about va_list */
return vsscanf((char *) args[0], (char *) args[1], (va_list) &args[2]);
} }

View File

@ -504,8 +504,8 @@ FormatMessage32A(
if (dwFlags & FORMAT_MESSAGE_FROM_STRING) if (dwFlags & FORMAT_MESSAGE_FROM_STRING)
from = HEAP_strdupA( GetProcessHeap(), 0, (LPSTR)lpSource); from = HEAP_strdupA( GetProcessHeap(), 0, (LPSTR)lpSource);
if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) { if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) {
/* gather information from system message tables ... */ from = HeapAlloc( GetProcessHeap(),0,200 );
fprintf(stdnimp," - FORMAT_MESSAGE_FROM_SYSTEM not implemented.\n"); sprintf(from,"Systemmessage, messageid = 0x%08lx\n",dwMessageId);
} }
if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE) { if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE) {
INT32 bufsize; INT32 bufsize;
@ -585,7 +585,9 @@ FormatMessage32A(
sprintfbuf=HeapAlloc(GetProcessHeap(),0,strlen((LPSTR)argliststart[0])+1); sprintfbuf=HeapAlloc(GetProcessHeap(),0,strlen((LPSTR)argliststart[0])+1);
else else
sprintfbuf=HeapAlloc(GetProcessHeap(),0,100); sprintfbuf=HeapAlloc(GetProcessHeap(),0,100);
vsprintf(sprintfbuf,fmtstr,argliststart);
/* CMF - This makes a BIG assumption about va_list */
vsprintf(sprintfbuf, fmtstr, (va_list) argliststart);
x=sprintfbuf; x=sprintfbuf;
while (*x) { while (*x) {
ADD_TO_T(*x++); ADD_TO_T(*x++);
@ -697,7 +699,8 @@ FormatMessage32W(
from = HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR)lpSource); from = HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR)lpSource);
if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) { if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) {
/* gather information from system message tables ... */ /* gather information from system message tables ... */
fprintf(stdnimp," - FORMAT_MESSAGE_FROM_SYSTEM not implemented.\n"); from = HeapAlloc( GetProcessHeap(),0,200 );
sprintf(from,"Systemmessage, messageid = 0x%08lx\n",dwMessageId);
} }
if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE) { if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE) {
INT32 bufsize; INT32 bufsize;
@ -783,10 +786,14 @@ FormatMessage32W(
xarr[1]=*(argliststart+1); xarr[1]=*(argliststart+1);
xarr[2]=*(argliststart+2); xarr[2]=*(argliststart+2);
sprintfbuf=HeapAlloc(GetProcessHeap(),0,lstrlen32W((LPWSTR)argliststart[0])*2+1); sprintfbuf=HeapAlloc(GetProcessHeap(),0,lstrlen32W((LPWSTR)argliststart[0])*2+1);
vsprintf(sprintfbuf,fmtstr,xarr);
/* CMF - This makes a BIG assumption about va_list */
vsprintf(sprintfbuf, fmtstr, (va_list) xarr);
} else { } else {
sprintfbuf=HeapAlloc(GetProcessHeap(),0,100); sprintfbuf=HeapAlloc(GetProcessHeap(),0,100);
vsprintf(sprintfbuf,fmtstr,argliststart);
/* CMF - This makes a BIG assumption about va_list */
vsprintf(sprintfbuf, fmtstr, (va_list) argliststart);
} }
x=sprintfbuf; x=sprintfbuf;
while (*x) { while (*x) {

View File

@ -6,7 +6,7 @@
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
#include <malloc.h> #include <stdlib.h>
#include "windows.h" #include "windows.h"
#include "heap.h" #include "heap.h"
#include "ole.h" #include "ole.h"

View File

@ -7,7 +7,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <malloc.h>
#include <unistd.h> #include <unistd.h>
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
@ -669,7 +668,7 @@ _wine_read_USTRING(char *buf,LPWSTR *str) {
else { else {
s++; s++;
if (*s=='\\') { if (*s=='\\') {
*ws+='\\'; *ws++='\\';
s++; s++;
continue; continue;
} }

View File

@ -545,7 +545,7 @@ VerInstallFile32A(
} }
ret = LZCopy32(hfsrc,hfdst); ret = LZCopy32(hfsrc,hfdst);
_lclose32(hfdst); _lclose32(hfdst);
if (ret<0) { if (((long) ret) < 0) {
/* translate LZ errors into VIF_xxx */ /* translate LZ errors into VIF_xxx */
switch (ret) { switch (ret) {
case LZERROR_BADINHANDLE: case LZERROR_BADINHANDLE:

View File

@ -186,7 +186,7 @@ static void fd_set_normalize(fd_set* fds, LPWSINFO pwsi, ws_fd_set* ws, int* hig
* sockets set in it that the program never asked for. * sockets set in it that the program never asked for.
*/ */
static int inline sock_error_p(int s) __inline__ static int sock_error_p(int s)
{ {
unsigned int optval, optlen; unsigned int optval, optlen;
@ -704,7 +704,7 @@ INT16 WINSOCK_recvfrom(SOCKET16 s, char *buf, INT16 len, INT16 flags,
{ {
int length, fromlen32 = *fromlen16; int length, fromlen32 = *fromlen16;
if ((length = recvfrom(pws->fd, buf, len, flags, from, &fromlen32)) >= 0 ); if ((length = recvfrom(pws->fd, buf, len, flags, from, &fromlen32)) >= 0)
{ {
*fromlen16 = fromlen32; *fromlen16 = fromlen32;
notify_client(pws, WS_FD_READ); notify_client(pws, WS_FD_READ);

View File

@ -296,6 +296,7 @@ void INT_Int31Handler( CONTEXT *context )
SET_CFLAG(context); SET_CFLAG(context);
break; break;
} }
break;
default: default:
SET_CFLAG(context); SET_CFLAG(context);
break; break;

View File

@ -227,7 +227,7 @@ static void ioctlGetDeviceInfo( CONTEXT *context )
RESET_CFLAG(context); RESET_CFLAG(context);
} }
static void ioctlGenericBlkDevReq( CONTEXT *context ) static BOOL32 ioctlGenericBlkDevReq( CONTEXT *context )
{ {
BYTE *dataptr = PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context)); BYTE *dataptr = PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
int drive = DOS_GET_DRIVE( BL_reg(context) ); int drive = DOS_GET_DRIVE( BL_reg(context) );
@ -235,20 +235,21 @@ static void ioctlGenericBlkDevReq( CONTEXT *context )
if (!DRIVE_IsValid(drive)) if (!DRIVE_IsValid(drive))
{ {
DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk ); DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
AX_reg(context) = DOS_ExtendedError; return TRUE;
SET_CFLAG(context);
return;
} }
if (CH_reg(context) != 0x08) if (CH_reg(context) != 0x08)
{ {
INT_BARF( context, 0x21 ); INT_BARF( context, 0x21 );
return; return FALSE;
} }
switch (CL_reg(context)) {
switch (CL_reg(context))
{
case 0x4a: /* lock logical volume */ case 0x4a: /* lock logical volume */
dprintf_int(stddeb,"int21: lock logical volume (%d) level %d mode %d\n",drive,BH_reg(context),DX_reg(context)); dprintf_int(stddeb,"int21: lock logical volume (%d) level %d mode %d\n",drive,BH_reg(context),DX_reg(context));
return; break;
case 0x60: /* get device parameters */ case 0x60: /* get device parameters */
/* used by w4wgrp's winfile */ /* used by w4wgrp's winfile */
memset(dataptr, 0, 0x26); memset(dataptr, 0, 0x26);
@ -268,9 +269,11 @@ static void ioctlGenericBlkDevReq( CONTEXT *context )
} }
CreateBPB(drive, &dataptr[7]); CreateBPB(drive, &dataptr[7]);
RESET_CFLAG(context); RESET_CFLAG(context);
return; break;
case 0x66:/* get disk serial number */ case 0x66:/* get disk serial number */
{ char label[12],fsname[9],path[4]; {
char label[12],fsname[9],path[4];
DWORD serial; DWORD serial;
strcpy(path,"x:\\");path[0]=drive+'A'; strcpy(path,"x:\\");path[0]=drive+'A';
@ -281,14 +284,17 @@ static void ioctlGenericBlkDevReq( CONTEXT *context )
memcpy(dataptr+2,&serial,4); memcpy(dataptr+2,&serial,4);
memcpy(dataptr+6,label ,11); memcpy(dataptr+6,label ,11);
memcpy(dataptr+17,fsname,8); memcpy(dataptr+17,fsname,8);
return;
} }
break;
case 0x6a: case 0x6a:
dprintf_int(stddeb,"int21: logical volume %d unlocked.\n",drive); dprintf_int(stddeb,"int21: logical volume %d unlocked.\n",drive);
return; break;
default: default:
INT_BARF( context, 0x21 ); INT_BARF( context, 0x21 );
} }
return FALSE;
} }
static void INT21_GetSystemDate( CONTEXT *context ) static void INT21_GetSystemDate( CONTEXT *context )
@ -308,15 +314,11 @@ static void INT21_GetSystemTime( CONTEXT *context )
DX_reg(context) = (systime.wSecond << 8) | (systime.wMilliseconds / 10); DX_reg(context) = (systime.wSecond << 8) | (systime.wMilliseconds / 10);
} }
static void INT21_CreateFile( CONTEXT *context ) static BOOL32 INT21_CreateFile( CONTEXT *context )
{ {
AX_reg(context) = _lcreat16( PTR_SEG_OFF_TO_LIN( DS_reg(context), AX_reg(context) = _lcreat16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ), CX_reg(context) ); DX_reg(context) ), CX_reg(context) );
if (AX_reg(context) == (WORD)HFILE_ERROR16) return (AX_reg(context) == (WORD)HFILE_ERROR16);
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
} }
@ -406,64 +408,76 @@ static void CloseFile( CONTEXT *context )
} }
} }
void ExtendedOpenCreateFile(CONTEXT *context ) static BOOL32 INT21_ExtendedOpenCreateFile(CONTEXT *context )
{ {
BOOL32 bExtendedError = FALSE;
BYTE action = DL_reg(context); BYTE action = DL_reg(context);
/* Shuffle arguments to call OpenExistingFile */ /* Shuffle arguments to call OpenExistingFile */
AL_reg(context) = BL_reg(context); AL_reg(context) = BL_reg(context);
DX_reg(context) = SI_reg(context); DX_reg(context) = SI_reg(context);
/* BX,CX and DX should be preserved */ /* BX,CX and DX should be preserved */
OpenExistingFile(context); OpenExistingFile(context);
if ((EFL_reg(context) & 0x0001)==0)
{ /* It exists */ if ((EFL_reg(context) & 0x0001) == 0) /* File exists */
{
UINT16 uReturnCX = 0;
/* Now decide what do do */ /* Now decide what do do */
if ((action & 0x07) == 0) if ((action & 0x07) == 0)
{ {
BX_reg(context) = AX_reg(context); BX_reg(context) = AX_reg(context);
CloseFile(context); CloseFile(context);
AX_reg(context) = 0x0050; /*File exists*/ AX_reg(context) = 0x0050; /*File exists*/
CX_reg(context) = 0;
SET_CFLAG(context); SET_CFLAG(context);
dprintf_int(stddeb, "int21: extended open/create: failed because file exixts \n"); dprintf_int(stddeb, "int21: extended open/create: failed because file exists \n");
return;
} }
if ((action & 0x07)== 2) { else if ((action & 0x07) == 2)
{
/* Truncate it, but first check if opened for write */ /* Truncate it, but first check if opened for write */
if ((BL_reg(context) & 0x0007)== 0) { if ((BL_reg(context) & 0x0007)== 0)
{
BX_reg(context) = AX_reg(context); BX_reg(context) = AX_reg(context);
CloseFile(context); CloseFile(context);
dprintf_int(stddeb, "int21: extended open/create: failed, trunc on ro file"); dprintf_int(stddeb, "int21: extended open/create: failed, trunc on ro file");
AX_reg(context) = 0x000C; /*Access code invalid*/ AX_reg(context) = 0x000C; /*Access code invalid*/
CX_reg(context) = 0;
SET_CFLAG(context); SET_CFLAG(context);
return;
} }
/* Shuffle arguments to call CloseFile */ else
{
/* Shuffle arguments to call CloseFile while
* preserving BX and DX */
dprintf_int(stddeb, "int21: extended open/create: Closing before truncate\n"); dprintf_int(stddeb, "int21: extended open/create: Closing before truncate\n");
BX_reg(context) = AX_reg(context); BX_reg(context) = AX_reg(context);
/* BX and DX should be preserved */
CloseFile(context); CloseFile(context);
if (EFL_reg(context) & 0x0001) { if (EFL_reg(context) & 0x0001)
{
dprintf_int(stddeb, "int21: extended open/create: close before trunc failed"); dprintf_int(stddeb, "int21: extended open/create: close before trunc failed");
AX_reg(context) = 0x0019; /*Seek Error*/ AX_reg(context) = 0x0019; /*Seek Error*/
CX_reg(context) = 0; CX_reg(context) = 0;
SET_CFLAG(context); SET_CFLAG(context);
} }
/* Shuffle arguments to call CreateFile */ /* Shuffle arguments to call CreateFile */
dprintf_int(stddeb, "int21: extended open/create: Truncating\n"); dprintf_int(stddeb, "int21: extended open/create: Truncating\n");
AL_reg(context) = BL_reg(context); AL_reg(context) = BL_reg(context);
/* CX is still the same */ /* CX is still the same */
DX_reg(context) = SI_reg(context); DX_reg(context) = SI_reg(context);
INT21_CreateFile(context); bExtendedError = INT21_CreateFile(context);
if (EFL_reg(context) & 0x0001) { /*no file open, flags set */
if (EFL_reg(context) & 0x0001) /*no file open, flags set */
{
dprintf_int(stddeb, "int21: extended open/create: trunc failed"); dprintf_int(stddeb, "int21: extended open/create: trunc failed");
return; return bExtendedError;
} }
CX_reg(context) = 3; uReturnCX = 0x3;
return;
} }
CX_reg(context) = 1; }
return; else uReturnCX = 0x1;
CX_reg(context) = uReturnCX;
} }
else /* file does not exist */ else /* file does not exist */
{ {
@ -473,25 +487,29 @@ void ExtendedOpenCreateFile(CONTEXT *context )
CX_reg(context) = 0; CX_reg(context) = 0;
SET_CFLAG(context); SET_CFLAG(context);
dprintf_int(stddeb, "int21: extended open/create: failed, file dosen't exist\n"); dprintf_int(stddeb, "int21: extended open/create: failed, file dosen't exist\n");
return;
} }
else
{
/* Shuffle arguments to call CreateFile */ /* Shuffle arguments to call CreateFile */
dprintf_int(stddeb, "int21: extended open/create: Creating\n"); dprintf_int(stddeb, "int21: extended open/create: Creating\n");
AL_reg(context) = BL_reg(context); AL_reg(context) = BL_reg(context);
/* CX should still be the same */ /* CX should still be the same */
DX_reg(context) = SI_reg(context); DX_reg(context) = SI_reg(context);
INT21_CreateFile(context); bExtendedError = INT21_CreateFile(context);
if (EFL_reg(context) & 0x0001) { /*no file open, flags set */ if (EFL_reg(context) & 0x0001) /*no file open, flags set */
{
dprintf_int(stddeb, "int21: extended open/create: create failed\n"); dprintf_int(stddeb, "int21: extended open/create: create failed\n");
return; return bExtendedError;
} }
CX_reg(context) = 2; CX_reg(context) = 2;
return;
} }
} }
return bExtendedError;
}
static void INT21_ChangeDir( CONTEXT *context )
static BOOL32 INT21_ChangeDir( CONTEXT *context )
{ {
int drive; int drive;
char *dirname = PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)); char *dirname = PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context));
@ -503,11 +521,7 @@ static void INT21_ChangeDir( CONTEXT *context )
dirname += 2; dirname += 2;
} }
else drive = DRIVE_GetCurrentDrive(); else drive = DRIVE_GetCurrentDrive();
if (!DRIVE_Chdir( drive, dirname )) return DRIVE_Chdir( drive, dirname );
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
} }
@ -581,7 +595,7 @@ static int INT21_FindNext( CONTEXT *context )
} }
static int INT21_CreateTempFile( CONTEXT *context ) static BOOL32 INT21_CreateTempFile( CONTEXT *context )
{ {
static int counter = 0; static int counter = 0;
char *name = PTR_SEG_OFF_TO_LIN( DS_reg(context), DX_reg(context) ); char *name = PTR_SEG_OFF_TO_LIN( DS_reg(context), DX_reg(context) );
@ -595,14 +609,14 @@ static int INT21_CreateTempFile( CONTEXT *context )
if ((AX_reg(context) = _lcreat_uniq( name, 0 )) != (WORD)HFILE_ERROR16) if ((AX_reg(context) = _lcreat_uniq( name, 0 )) != (WORD)HFILE_ERROR16)
{ {
dprintf_int( stddeb, "INT21_CreateTempFile: created %s\n", name ); dprintf_int( stddeb, "INT21_CreateTempFile: created %s\n", name );
return 1; return TRUE;
} }
if (DOS_ExtendedError != ER_FileExists) return 0; if (DOS_ExtendedError != ER_FileExists) return FALSE;
} }
} }
static int INT21_GetCurrentDirectory( CONTEXT *context ) static BOOL32 INT21_GetCurrentDirectory( CONTEXT *context )
{ {
int drive = DOS_GET_DRIVE( DL_reg(context) ); int drive = DOS_GET_DRIVE( DL_reg(context) );
char *ptr = (char *)PTR_SEG_OFF_TO_LIN( DS_reg(context), SI_reg(context) ); char *ptr = (char *)PTR_SEG_OFF_TO_LIN( DS_reg(context), SI_reg(context) );
@ -610,11 +624,11 @@ static int INT21_GetCurrentDirectory( CONTEXT *context )
if (!DRIVE_IsValid(drive)) if (!DRIVE_IsValid(drive))
{ {
DOS_ERROR( ER_InvalidDrive, EC_NotFound, SA_Abort, EL_Disk ); DOS_ERROR( ER_InvalidDrive, EC_NotFound, SA_Abort, EL_Disk );
return 0; return FALSE;
} }
lstrcpyn32A( ptr, DRIVE_GetDosCwd(drive), 64 ); lstrcpyn32A( ptr, DRIVE_GetDosCwd(drive), 64 );
return 1; AX_reg(context) = 0x0100; /* success return code */
return TRUE;
} }
@ -885,6 +899,8 @@ extern void LOCAL_PrintHeap (WORD ds);
*/ */
void DOS3Call( CONTEXT *context ) void DOS3Call( CONTEXT *context )
{ {
BOOL32 bSetDOSExtendedError = FALSE;
dprintf_int( stddeb, "int21: AX=%04x BX=%04x CX=%04x DX=%04x " dprintf_int( stddeb, "int21: AX=%04x BX=%04x CX=%04x DX=%04x "
"SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n", "SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n",
AX_reg(context), BX_reg(context), CX_reg(context), AX_reg(context), BX_reg(context), CX_reg(context),
@ -1112,35 +1128,23 @@ void DOS3Call( CONTEXT *context )
break; break;
case 0x39: /* "MKDIR" - CREATE SUBDIRECTORY */ case 0x39: /* "MKDIR" - CREATE SUBDIRECTORY */
if (!CreateDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context), bSetDOSExtendedError = (!CreateDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ), NULL)) DX_reg(context) ), NULL));
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x3a: /* "RMDIR" - REMOVE SUBDIRECTORY */ case 0x3a: /* "RMDIR" - REMOVE SUBDIRECTORY */
if (!RemoveDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context), bSetDOSExtendedError = (!RemoveDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ))) DX_reg(context) )));
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x3b: /* "CHDIR" - SET CURRENT DIRECTORY */ case 0x3b: /* "CHDIR" - SET CURRENT DIRECTORY */
INT21_ChangeDir(context); bSetDOSExtendedError = !INT21_ChangeDir(context);
break; break;
case 0x3c: /* "CREAT" - CREATE OR TRUNCATE FILE */ case 0x3c: /* "CREAT" - CREATE OR TRUNCATE FILE */
AX_reg(context) = _lcreat16( PTR_SEG_OFF_TO_LIN( DS_reg(context), AX_reg(context) = _lcreat16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ), CX_reg(context) ); DX_reg(context) ), CX_reg(context) );
if (AX_reg(context) == (WORD)HFILE_ERROR16) bSetDOSExtendedError = (AX_reg(context) == (WORD)HFILE_ERROR16);
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x3d: /* "OPEN" - OPEN EXISTING FILE */ case 0x3d: /* "OPEN" - OPEN EXISTING FILE */
@ -1148,11 +1152,7 @@ void DOS3Call( CONTEXT *context )
break; break;
case 0x3e: /* "CLOSE" - CLOSE FILE */ case 0x3e: /* "CLOSE" - CLOSE FILE */
if ((AX_reg(context) = _lclose16( BX_reg(context) )) != 0) bSetDOSExtendedError = ((AX_reg(context) = _lclose16( BX_reg(context) )) != 0);
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x3f: /* "READ" - READ FROM FILE OR DEVICE */ case 0x3f: /* "READ" - READ FROM FILE OR DEVICE */
@ -1161,11 +1161,7 @@ void DOS3Call( CONTEXT *context )
PTR_SEG_OFF_TO_SEGPTR( DS_reg(context), PTR_SEG_OFF_TO_SEGPTR( DS_reg(context),
DX_reg(context) ), DX_reg(context) ),
CX_reg(context) ); CX_reg(context) );
if (result == -1) if (result == -1) bSetDOSExtendedError = TRUE;
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
else AX_reg(context) = (WORD)result; else AX_reg(context) = (WORD)result;
} }
break; break;
@ -1176,22 +1172,14 @@ void DOS3Call( CONTEXT *context )
PTR_SEG_OFF_TO_LIN( DS_reg(context), PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ), DX_reg(context) ),
CX_reg(context) ); CX_reg(context) );
if (result == -1) if (result == -1) bSetDOSExtendedError = TRUE;
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
else AX_reg(context) = (WORD)result; else AX_reg(context) = (WORD)result;
} }
break; break;
case 0x41: /* "UNLINK" - DELETE FILE */ case 0x41: /* "UNLINK" - DELETE FILE */
if (!DeleteFile32A( PTR_SEG_OFF_TO_LIN( DS_reg(context), bSetDOSExtendedError = (!DeleteFile32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ))) DX_reg(context) )));
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x42: /* "LSEEK" - SET CURRENT FILE POSITION */ case 0x42: /* "LSEEK" - SET CURRENT FILE POSITION */
@ -1199,15 +1187,13 @@ void DOS3Call( CONTEXT *context )
LONG status = _llseek16( BX_reg(context), LONG status = _llseek16( BX_reg(context),
MAKELONG(DX_reg(context),CX_reg(context)), MAKELONG(DX_reg(context),CX_reg(context)),
AL_reg(context) ); AL_reg(context) );
if (status == -1) if (status == -1) bSetDOSExtendedError = TRUE;
else
{ {
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
break;
}
AX_reg(context) = LOWORD(status); AX_reg(context) = LOWORD(status);
DX_reg(context) = HIWORD(status); DX_reg(context) = HIWORD(status);
} }
}
break; break;
case 0x43: /* FILE ATTRIBUTES */ case 0x43: /* FILE ATTRIBUTES */
@ -1217,21 +1203,15 @@ void DOS3Call( CONTEXT *context )
AX_reg(context) = (WORD)GetFileAttributes32A( AX_reg(context) = (WORD)GetFileAttributes32A(
PTR_SEG_OFF_TO_LIN(DS_reg(context), PTR_SEG_OFF_TO_LIN(DS_reg(context),
DX_reg(context))); DX_reg(context)));
if (AX_reg(context) == 0xffff) if (AX_reg(context) == 0xffff) bSetDOSExtendedError = TRUE;
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
else CX_reg(context) = AX_reg(context); else CX_reg(context) = AX_reg(context);
break; break;
case 0x01: case 0x01:
if (!SetFileAttributes32A( PTR_SEG_OFF_TO_LIN(DS_reg(context), bSetDOSExtendedError =
(!SetFileAttributes32A( PTR_SEG_OFF_TO_LIN(DS_reg(context),
DX_reg(context)), DX_reg(context)),
CX_reg(context) )) CX_reg(context) ));
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
} }
break; break;
@ -1312,8 +1292,9 @@ void DOS3Call( CONTEXT *context )
break; break;
case 0x0d: case 0x0d:
ioctlGenericBlkDevReq(context); bSetDOSExtendedError = ioctlGenericBlkDevReq(context);
break; break;
case 0x0e: /* get logical drive mapping */ case 0x0e: /* get logical drive mapping */
AL_reg(context) = 0; /* drive has no mapping */ AL_reg(context) = 0; /* drive has no mapping */
break; break;
@ -1333,29 +1314,15 @@ void DOS3Call( CONTEXT *context )
break; break;
case 0x45: /* "DUP" - DUPLICATE FILE HANDLE */ case 0x45: /* "DUP" - DUPLICATE FILE HANDLE */
if ((AX_reg(context) = FILE_Dup(BX_reg(context))) == (WORD)HFILE_ERROR16) bSetDOSExtendedError = ((AX_reg(context) = FILE_Dup(BX_reg(context))) == (WORD)HFILE_ERROR16);
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x46: /* "DUP2", "FORCEDUP" - FORCE DUPLICATE FILE HANDLE */ case 0x46: /* "DUP2", "FORCEDUP" - FORCE DUPLICATE FILE HANDLE */
if (FILE_Dup2( BX_reg(context), CX_reg(context) ) == HFILE_ERROR32) bSetDOSExtendedError = (FILE_Dup2( BX_reg(context), CX_reg(context) ) == HFILE_ERROR32);
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
else AX_reg(context) = 0x0100;
/* intlist: many Microsoft products for Windows rely on this */
break; break;
case 0x47: /* "CWD" - GET CURRENT DIRECTORY */ case 0x47: /* "CWD" - GET CURRENT DIRECTORY */
if (!INT21_GetCurrentDirectory(context)) bSetDOSExtendedError = !INT21_GetCurrentDirectory(context);
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x48: /* ALLOCATE MEMORY */ case 0x48: /* ALLOCATE MEMORY */
@ -1406,12 +1373,9 @@ void DOS3Call( CONTEXT *context )
break; break;
case 0x56: /* "RENAME" - RENAME FILE */ case 0x56: /* "RENAME" - RENAME FILE */
if (!MoveFile32A( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)), bSetDOSExtendedError =
PTR_SEG_OFF_TO_LIN(ES_reg(context),DI_reg(context)))) (!MoveFile32A( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)),
{ PTR_SEG_OFF_TO_LIN(ES_reg(context),DI_reg(context))));
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x57: /* FILE DATE AND TIME */ case 0x57: /* FILE DATE AND TIME */
@ -1421,10 +1385,7 @@ void DOS3Call( CONTEXT *context )
{ {
FILETIME filetime; FILETIME filetime;
if (!GetFileTime( BX_reg(context), NULL, NULL, &filetime )) if (!GetFileTime( BX_reg(context), NULL, NULL, &filetime ))
{ bSetDOSExtendedError = TRUE;
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
else FileTimeToDosDateTime( &filetime, &DX_reg(context), else FileTimeToDosDateTime( &filetime, &DX_reg(context),
&CX_reg(context) ); &CX_reg(context) );
} }
@ -1435,11 +1396,8 @@ void DOS3Call( CONTEXT *context )
FILETIME filetime; FILETIME filetime;
DosDateTimeToFileTime( DX_reg(context), CX_reg(context), DosDateTimeToFileTime( DX_reg(context), CX_reg(context),
&filetime ); &filetime );
if (!SetFileTime( BX_reg(context), NULL, NULL, &filetime )) bSetDOSExtendedError =
{ (!SetFileTime( BX_reg(context), NULL, NULL, &filetime ));
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
} }
break; break;
} }
@ -1462,27 +1420,20 @@ void DOS3Call( CONTEXT *context )
break; break;
case 0x5a: /* CREATE TEMPORARY FILE */ case 0x5a: /* CREATE TEMPORARY FILE */
if (!INT21_CreateTempFile(context)) bSetDOSExtendedError = !INT21_CreateTempFile(context);
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x5b: /* CREATE NEW FILE */ case 0x5b: /* CREATE NEW FILE */
if ((AX_reg(context) = _lcreat_uniq( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)), 0 )) == (WORD)HFILE_ERROR16) bSetDOSExtendedError = ((AX_reg(context) =
{ _lcreat_uniq( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)), 0 ))
AX_reg(context) = DOS_ExtendedError; == (WORD)HFILE_ERROR16);
SET_CFLAG(context);
}
break; break;
case 0x5d: /* NETWORK */ case 0x5d: /* NETWORK */
case 0x5e: case 0x5e:
/* network software not installed */ /* network software not installed */
DOS_ERROR( ER_NoNetwork, EC_NotFound, SA_Abort, EL_Network ); DOS_ERROR( ER_NoNetwork, EC_NotFound, SA_Abort, EL_Network );
AX_reg(context) = DOS_ExtendedError; bSetDOSExtendedError = TRUE;
SET_CFLAG(context);
break; break;
case 0x5f: /* NETWORK */ case 0x5f: /* NETWORK */
@ -1492,8 +1443,7 @@ void DOS3Call( CONTEXT *context )
if (!DRIVE_Enable( DL_reg(context) )) if (!DRIVE_Enable( DL_reg(context) ))
{ {
DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk ); DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
AX_reg(context) = DOS_ExtendedError; bSetDOSExtendedError = TRUE;
SET_CFLAG(context);
} }
break; break;
@ -1501,16 +1451,14 @@ void DOS3Call( CONTEXT *context )
if (!DRIVE_Disable( DL_reg(context) )) if (!DRIVE_Disable( DL_reg(context) ))
{ {
DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk ); DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
AX_reg(context) = DOS_ExtendedError; bSetDOSExtendedError = TRUE;
SET_CFLAG(context);
} }
break; break;
default: default:
/* network software not installed */ /* network software not installed */
DOS_ERROR( ER_NoNetwork, EC_NotFound, SA_Abort, EL_Network ); DOS_ERROR( ER_NoNetwork, EC_NotFound, SA_Abort, EL_Network );
AX_reg(context) = DOS_ExtendedError; bSetDOSExtendedError = TRUE;
SET_CFLAG(context);
break; break;
} }
break; break;
@ -1521,10 +1469,7 @@ void DOS3Call( CONTEXT *context )
SI_reg(context)), 128, SI_reg(context)), 128,
PTR_SEG_OFF_TO_LIN(ES_reg(context), PTR_SEG_OFF_TO_LIN(ES_reg(context),
DI_reg(context)),NULL)) DI_reg(context)),NULL))
{ bSetDOSExtendedError = TRUE;
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
else AX_reg(context) = 0; else AX_reg(context) = 0;
} }
break; break;
@ -1535,6 +1480,7 @@ void DOS3Call( CONTEXT *context )
INT_BARF( context, 0x21 ); INT_BARF( context, 0x21 );
SET_CFLAG(context); SET_CFLAG(context);
break; break;
case 0x65:{/* GET EXTENDED COUNTRY INFORMATION */ case 0x65:{/* GET EXTENDED COUNTRY INFORMATION */
extern WORD WINE_LanguageId; extern WORD WINE_LanguageId;
BYTE *dataptr=PTR_SEG_OFF_TO_LIN(ES_reg(context),DI_reg(context));; BYTE *dataptr=PTR_SEG_OFF_TO_LIN(ES_reg(context),DI_reg(context));;
@ -1573,66 +1519,45 @@ void DOS3Call( CONTEXT *context )
case 0x67: /* SET HANDLE COUNT */ case 0x67: /* SET HANDLE COUNT */
SetHandleCount16( BX_reg(context) ); SetHandleCount16( BX_reg(context) );
if (DOS_ExtendedError) if (DOS_ExtendedError) bSetDOSExtendedError = TRUE;
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x68: /* "FFLUSH" - COMMIT FILE */ case 0x68: /* "FFLUSH" - COMMIT FILE */
case 0x6a: /* COMMIT FILE */ case 0x6a: /* COMMIT FILE */
if (!FlushFileBuffers( BX_reg(context) )) bSetDOSExtendedError = (!FlushFileBuffers( BX_reg(context) ));
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x69: /* DISK SERIAL NUMBER */ case 0x69: /* DISK SERIAL NUMBER */
switch (AL_reg(context)) switch (AL_reg(context))
{ {
case 0x00: case 0x00:
if (!INT21_GetDiskSerialNumber(context)) if (!INT21_GetDiskSerialNumber(context)) bSetDOSExtendedError = TRUE;
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
else AX_reg(context) = 0; else AX_reg(context) = 0;
break; break;
case 0x01: case 0x01:
if (!INT21_SetDiskSerialNumber(context)) if (!INT21_SetDiskSerialNumber(context)) bSetDOSExtendedError = TRUE;
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
else AX_reg(context) = 1; else AX_reg(context) = 1;
break; break;
} }
break; break;
case 0x6C: /* Extended Open/Create*/ case 0x6C: /* Extended Open/Create*/
ExtendedOpenCreateFile(context); bSetDOSExtendedError = INT21_ExtendedOpenCreateFile(context);
break; break;
case 0x71: /* MS-DOS 7 (Windows95) - LONG FILENAME FUNCTIONS */ case 0x71: /* MS-DOS 7 (Windows95) - LONG FILENAME FUNCTIONS */
switch(AL_reg(context)) switch(AL_reg(context))
{ {
case 0x39: /* Create directory */ case 0x39: /* Create directory */
if (!CreateDirectory32A( PTR_SEG_OFF_TO_LIN( DS_reg(context), bSetDOSExtendedError = (!CreateDirectory32A(
DX_reg(context) ), NULL)) PTR_SEG_OFF_TO_LIN( DS_reg(context),
{ DX_reg(context) ), NULL));
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x3a: /* Remove directory */ case 0x3a: /* Remove directory */
if (!RemoveDirectory32A( PTR_SEG_OFF_TO_LIN( DS_reg(context), bSetDOSExtendedError = (!RemoveDirectory32A(
DX_reg(context) ))) PTR_SEG_OFF_TO_LIN( DS_reg(context),
{ DX_reg(context) )));
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x43: /* Get/Set file attributes */ case 0x43: /* Get/Set file attributes */
switch (BL_reg(context)) switch (BL_reg(context))
@ -1641,20 +1566,13 @@ void DOS3Call( CONTEXT *context )
CX_reg(context) = (WORD)GetFileAttributes32A( CX_reg(context) = (WORD)GetFileAttributes32A(
PTR_SEG_OFF_TO_LIN(DS_reg(context), PTR_SEG_OFF_TO_LIN(DS_reg(context),
DX_reg(context))); DX_reg(context)));
if (CX_reg(context) == 0xffff) if (CX_reg(context) == 0xffff) bSetDOSExtendedError = TRUE;
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x01: case 0x01:
if (!SetFileAttributes32A( PTR_SEG_OFF_TO_LIN(DS_reg(context), bSetDOSExtendedError = (!SetFileAttributes32A(
PTR_SEG_OFF_TO_LIN(DS_reg(context),
DX_reg(context)), DX_reg(context)),
CX_reg(context) )) CX_reg(context) ) );
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
default: default:
fprintf( stderr, fprintf( stderr,
@ -1666,14 +1584,9 @@ void DOS3Call( CONTEXT *context )
} }
break; break;
case 0x47: /* Get current directory */ case 0x47: /* Get current directory */
if (!INT21_GetCurrentDirectory(context)) bSetDOSExtendedError = !INT21_GetCurrentDirectory(context);
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
else AX_reg(context) = 0x0100;
/* intlist: many Microsoft products for Windows rely on this */
break; break;
case 0x4e: /* Find first file */ case 0x4e: /* Find first file */
/* FIXME: use attributes in CX */ /* FIXME: use attributes in CX */
if ((AX_reg(context) = FindFirstFile16( if ((AX_reg(context) = FindFirstFile16(
@ -1681,26 +1594,16 @@ void DOS3Call( CONTEXT *context )
(WIN32_FIND_DATA32A *)PTR_SEG_OFF_TO_LIN(ES_reg(context), (WIN32_FIND_DATA32A *)PTR_SEG_OFF_TO_LIN(ES_reg(context),
DI_reg(context)))) DI_reg(context))))
== INVALID_HANDLE_VALUE16) == INVALID_HANDLE_VALUE16)
{ bSetDOSExtendedError = TRUE;
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0x4f: /* Find next file */ case 0x4f: /* Find next file */
if (!FindNextFile16( BX_reg(context), if (!FindNextFile16( BX_reg(context),
(WIN32_FIND_DATA32A *)PTR_SEG_OFF_TO_LIN(ES_reg(context), (WIN32_FIND_DATA32A *)PTR_SEG_OFF_TO_LIN(ES_reg(context),
DI_reg(context)))) DI_reg(context))))
{ bSetDOSExtendedError = TRUE;
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0xa1: /* Find close */ case 0xa1: /* Find close */
if (!FindClose16( BX_reg(context) )) bSetDOSExtendedError = (!FindClose16( BX_reg(context) ));
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
break; break;
case 0xa0: case 0xa0:
break; break;
@ -1713,10 +1616,7 @@ void DOS3Call( CONTEXT *context )
SI_reg(context)), 128, SI_reg(context)), 128,
PTR_SEG_OFF_TO_LIN(ES_reg(context), PTR_SEG_OFF_TO_LIN(ES_reg(context),
DI_reg(context)),NULL)) DI_reg(context)),NULL))
{ bSetDOSExtendedError = TRUE;
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
else AX_reg(context) = 0; else AX_reg(context) = 0;
break; break;
default: default:
@ -1730,9 +1630,19 @@ void DOS3Call( CONTEXT *context )
break; break;
case 0x6c: /* Create or open file */ case 0x6c: /* Create or open file */
/* translate Dos 7 action to Dos 6 action */ /* translate Dos 7 action to Dos 6 action */
ExtendedOpenCreateFile(context); bSetDOSExtendedError = INT21_ExtendedOpenCreateFile(context);
break; break;
case 0x3b: /* Change directory */ case 0x3b: /* Change directory */
if (!SetCurrentDirectory32A(PTR_SEG_OFF_TO_LIN(
DS_reg(context),
DX_reg(context)
))
) {
SET_CFLAG(context);
AL_reg(context) = DOS_ExtendedError;
}
break;
case 0x41: /* Delete file */ case 0x41: /* Delete file */
case 0x56: /* Move (rename) file */ case 0x56: /* Move (rename) file */
default: default:
@ -1761,7 +1671,15 @@ void DOS3Call( CONTEXT *context )
default: default:
INT_BARF( context, 0x21 ); INT_BARF( context, 0x21 );
break; break;
} /* END OF SWITCH */
if( bSetDOSExtendedError ) /* set general error condition */
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
} }
dprintf_int( stddeb, "ret21: AX=%04x BX=%04x CX=%04x DX=%04x " dprintf_int( stddeb, "ret21: AX=%04x BX=%04x CX=%04x DX=%04x "
"SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n", "SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n",
AX_reg(context), BX_reg(context), CX_reg(context), AX_reg(context), BX_reg(context), CX_reg(context),
@ -1769,3 +1687,4 @@ void DOS3Call( CONTEXT *context )
(WORD)DS_reg(context), (WORD)ES_reg(context), (WORD)DS_reg(context), (WORD)ES_reg(context),
EFL_reg(context)); EFL_reg(context));
} }

View File

@ -211,8 +211,8 @@ static DWORD WAVE_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lp
lpDesc->lpFormat = (LPWAVEFORMAT) USER_HEAP_LIN_ADDR(hFormat); lpDesc->lpFormat = (LPWAVEFORMAT) USER_HEAP_LIN_ADDR(hFormat);
memcpy(lpDesc->lpFormat, lpWaveFormat, sizeof(PCMWAVEFORMAT)); memcpy(lpDesc->lpFormat, lpWaveFormat, sizeof(PCMWAVEFORMAT));
lpDesc = (LPWAVEOPENDESC) USER_HEAP_SEG_ADDR(hDesc); lpDesc = (LPWAVEOPENDESC) USER_HEAP_SEG_ADDR(hDesc);
dwRet = wodMessage(wDevID, WODM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL); dwRet = wodMessage(index, WODM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
dwRet = widMessage(wDevID, WIDM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL); dwRet = widMessage(index, WIDM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
USER_HEAP_FREE(hFormat); USER_HEAP_FREE(hFormat);
USER_HEAP_FREE(hDesc); USER_HEAP_FREE(hDesc);
return 0; return 0;
@ -233,9 +233,9 @@ static DWORD WAVE_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpP
mmioClose(MCIWavDev[index].hFile, 0); mmioClose(MCIWavDev[index].hFile, 0);
MCIWavDev[index].hFile = 0; MCIWavDev[index].hFile = 0;
} }
dwRet = wodMessage(wDevID, WODM_CLOSE, 0, 0L, 0L); dwRet = wodMessage(index, WODM_CLOSE, 0, 0L, 0L);
if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL; if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
dwRet = widMessage(wDevID, WIDM_CLOSE, 0, 0L, 0L); dwRet = widMessage(index, WIDM_CLOSE, 0, 0L, 0L);
if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL; if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
} }
return 0; return 0;
@ -300,7 +300,7 @@ static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr); lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR)); memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR));
lpWaveHdr = PTR_SEG_TO_LIN(lp16WaveHdr); lpWaveHdr = PTR_SEG_TO_LIN(lp16WaveHdr);
dwRet = wodMessage(wDevID, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR)); dwRet = wodMessage(index, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
while(TRUE) { while(TRUE) {
count = mmioRead(MCIWavDev[index].hFile, count = mmioRead(MCIWavDev[index].hFile,
PTR_SEG_TO_LIN(lpWaveHdr->lpData), bufsize); PTR_SEG_TO_LIN(lpWaveHdr->lpData), bufsize);
@ -310,9 +310,9 @@ static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
/* lpWaveHdr->dwBytesRecorded = count; */ /* lpWaveHdr->dwBytesRecorded = count; */
dprintf_mciwave(stddeb,"WAVE_mciPlay // before WODM_WRITE lpWaveHdr=%p dwBufferLength=%lu dwBytesRecorded=%lu\n", dprintf_mciwave(stddeb,"WAVE_mciPlay // before WODM_WRITE lpWaveHdr=%p dwBufferLength=%lu dwBytesRecorded=%lu\n",
lpWaveHdr, lpWaveHdr->dwBufferLength, lpWaveHdr->dwBytesRecorded); lpWaveHdr, lpWaveHdr->dwBufferLength, lpWaveHdr->dwBytesRecorded);
dwRet = wodMessage(wDevID, WODM_WRITE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR)); dwRet = wodMessage(index, WODM_WRITE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
} }
dwRet = wodMessage(wDevID, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR)); dwRet = wodMessage(index, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
if (lpWaveHdr->lpData != NULL) { if (lpWaveHdr->lpData != NULL) {
GlobalUnlock16(hData); GlobalUnlock16(hData);
GlobalFree16(hData); GlobalFree16(hData);
@ -371,18 +371,18 @@ static DWORD WAVE_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpP
lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr); lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR)); memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR));
lpWaveHdr = PTR_SEG_TO_LIN(lp16WaveHdr); lpWaveHdr = PTR_SEG_TO_LIN(lp16WaveHdr);
dwRet = widMessage(wDevID, WIDM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR)); dwRet = widMessage(index, WIDM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
dprintf_mciwave(stddeb,"WAVE_mciRecord // after WIDM_PREPARE \n"); dprintf_mciwave(stddeb,"WAVE_mciRecord // after WIDM_PREPARE \n");
while(TRUE) { while(TRUE) {
lpWaveHdr->dwBytesRecorded = 0; lpWaveHdr->dwBytesRecorded = 0;
dwRet = widMessage(wDevID, WIDM_START, 0, 0L, 0L); dwRet = widMessage(index, WIDM_START, 0, 0L, 0L);
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"WAVE_mciRecord // after WIDM_START lpWaveHdr=%p dwBytesRecorded=%lu\n", "WAVE_mciRecord // after WIDM_START lpWaveHdr=%p dwBytesRecorded=%lu\n",
lpWaveHdr, lpWaveHdr->dwBytesRecorded); lpWaveHdr, lpWaveHdr->dwBytesRecorded);
if (lpWaveHdr->dwBytesRecorded == 0) break; if (lpWaveHdr->dwBytesRecorded == 0) break;
} }
dprintf_mciwave(stddeb,"WAVE_mciRecord // before WIDM_UNPREPARE \n"); dprintf_mciwave(stddeb,"WAVE_mciRecord // before WIDM_UNPREPARE \n");
dwRet = widMessage(wDevID, WIDM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR)); dwRet = widMessage(index, WIDM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
dprintf_mciwave(stddeb,"WAVE_mciRecord // after WIDM_UNPREPARE \n"); dprintf_mciwave(stddeb,"WAVE_mciRecord // after WIDM_UNPREPARE \n");
if (lpWaveHdr->lpData != NULL) { if (lpWaveHdr->lpData != NULL) {
GlobalUnlock16(hData); GlobalUnlock16(hData);
@ -759,7 +759,6 @@ static DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPS lpCaps, DWORD dwSize)
*/ */
static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
int audio; int audio;
int abuf_size; int abuf_size;
int smplrate; int smplrate;
@ -777,7 +776,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
dprintf_mciwave(stddeb,"Linux 'wodOpen' // MAX_WAVOUTDRV reached !\n"); dprintf_mciwave(stddeb,"Linux 'wodOpen' // MAX_WAVOUTDRV reached !\n");
return MMSYSERR_ALLOCATED; return MMSYSERR_ALLOCATED;
} }
WOutDev[index].unixdev = 0; WOutDev[wDevID].unixdev = 0;
audio = open (SOUND_DEV, O_WRONLY, 0); audio = open (SOUND_DEV, O_WRONLY, 0);
if (audio == -1) { if (audio == -1) {
dprintf_mciwave(stddeb,"Linux 'wodOpen' // can't open !\n"); dprintf_mciwave(stddeb,"Linux 'wodOpen' // can't open !\n");
@ -791,8 +790,8 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
dprintf_mciwave(stddeb,"Linux 'wodOpen' // SNDCTL_DSP_GETBLKSIZE Invalid bufsize !\n"); dprintf_mciwave(stddeb,"Linux 'wodOpen' // SNDCTL_DSP_GETBLKSIZE Invalid bufsize !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
WOutDev[index].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); WOutDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
switch(WOutDev[index].wFlags) { switch(WOutDev[wDevID].wFlags) {
case DCB_NULL: case DCB_NULL:
dprintf_mciwave(stddeb, "Linux 'wodOpen' // CALLBACK_NULL !\n"); dprintf_mciwave(stddeb, "Linux 'wodOpen' // CALLBACK_NULL !\n");
break; break;
@ -806,13 +805,12 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
dprintf_mciwave(stddeb, "Linux 'wodOpen' // CALLBACK_FUNCTION !\n"); dprintf_mciwave(stddeb, "Linux 'wodOpen' // CALLBACK_FUNCTION !\n");
break; break;
} }
WOutDev[index].lpQueueHdr = NULL; WOutDev[wDevID].lpQueueHdr = NULL;
WOutDev[index].unixdev = audio; WOutDev[wDevID].unixdev = audio;
WOutDev[index].dwTotalPlayed = 0; WOutDev[wDevID].dwTotalPlayed = 0;
WOutDev[index].bufsize = abuf_size; WOutDev[wDevID].bufsize = abuf_size;
memcpy(&WOutDev[index].waveDesc, lpDesc, sizeof(WAVEOPENDESC)); memcpy(&WOutDev[wDevID].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
/* lpFormat = (LPWAVEFORMAT) PTR_SEG_TO_LIN(lpDesc->lpFormat); */ lpFormat = (LPWAVEFORMAT) PTR_SEG_TO_LIN(lpDesc->lpFormat);
lpFormat = lpDesc->lpFormat;
if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) { if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
dprintf_mciwave(stddeb,"Linux 'wodOpen' // Bad format %04X !\n", dprintf_mciwave(stddeb,"Linux 'wodOpen' // Bad format %04X !\n",
lpFormat->wFormatTag); lpFormat->wFormatTag);
@ -822,31 +820,31 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
lpFormat->nSamplesPerSec); lpFormat->nSamplesPerSec);
return WAVERR_BADFORMAT; return WAVERR_BADFORMAT;
} }
memcpy(&WOutDev[index].Format, lpFormat, sizeof(PCMWAVEFORMAT)); memcpy(&WOutDev[wDevID].Format, lpFormat, sizeof(PCMWAVEFORMAT));
if (WOutDev[index].Format.wf.nChannels == 0) return WAVERR_BADFORMAT; if (WOutDev[wDevID].Format.wf.nChannels == 0) return WAVERR_BADFORMAT;
if (WOutDev[index].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT; if (WOutDev[wDevID].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT;
dprintf_mciwave(stddeb,"Linux 'wodOpen' // wBitsPerSample=%u !\n", dprintf_mciwave(stddeb,"Linux 'wodOpen' // wBitsPerSample=%u !\n",
WOutDev[index].Format.wBitsPerSample); WOutDev[wDevID].Format.wBitsPerSample);
if (WOutDev[index].Format.wBitsPerSample == 0) { if (WOutDev[wDevID].Format.wBitsPerSample == 0) {
WOutDev[index].Format.wBitsPerSample = 8 * WOutDev[wDevID].Format.wBitsPerSample = 8 *
(WOutDev[index].Format.wf.nAvgBytesPerSec / (WOutDev[wDevID].Format.wf.nAvgBytesPerSec /
WOutDev[index].Format.wf.nSamplesPerSec) / WOutDev[wDevID].Format.wf.nSamplesPerSec) /
WOutDev[index].Format.wf.nChannels; WOutDev[wDevID].Format.wf.nChannels;
} }
samplesize = WOutDev[index].Format.wBitsPerSample; samplesize = WOutDev[wDevID].Format.wBitsPerSample;
smplrate = WOutDev[index].Format.wf.nSamplesPerSec; smplrate = WOutDev[wDevID].Format.wf.nSamplesPerSec;
dsp_stereo = (WOutDev[index].Format.wf.nChannels > 1) ? TRUE : FALSE; dsp_stereo = (WOutDev[wDevID].Format.wf.nChannels > 1) ? TRUE : FALSE;
IOCTL(audio, SNDCTL_DSP_SPEED, smplrate); IOCTL(audio, SNDCTL_DSP_SPEED, smplrate);
IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, samplesize); IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, samplesize);
IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo); IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo);
dprintf_mciwave(stddeb,"Linux 'wodOpen' // wBitsPerSample=%u !\n", dprintf_mciwave(stddeb,"Linux 'wodOpen' // wBitsPerSample=%u !\n",
WOutDev[index].Format.wBitsPerSample); WOutDev[wDevID].Format.wBitsPerSample);
dprintf_mciwave(stddeb,"Linux 'wodOpen' // nAvgBytesPerSec=%lu !\n", dprintf_mciwave(stddeb,"Linux 'wodOpen' // nAvgBytesPerSec=%lu !\n",
WOutDev[index].Format.wf.nAvgBytesPerSec); WOutDev[wDevID].Format.wf.nAvgBytesPerSec);
dprintf_mciwave(stddeb,"Linux 'wodOpen' // nSamplesPerSec=%lu !\n", dprintf_mciwave(stddeb,"Linux 'wodOpen' // nSamplesPerSec=%lu !\n",
WOutDev[index].Format.wf.nSamplesPerSec); WOutDev[wDevID].Format.wf.nSamplesPerSec);
dprintf_mciwave(stddeb,"Linux 'wodOpen' // nChannels=%u !\n", dprintf_mciwave(stddeb,"Linux 'wodOpen' // nChannels=%u !\n",
WOutDev[index].Format.wf.nChannels); WOutDev[wDevID].Format.wf.nChannels);
if (WAVE_NotifyClient(wDevID, WOM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) { if (WAVE_NotifyClient(wDevID, WOM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) {
dprintf_mciwave(stddeb,"Linux 'wodOpen' // can't notify client !\n"); dprintf_mciwave(stddeb,"Linux 'wodOpen' // can't notify client !\n");
return MMSYSERR_INVALPARAM; return MMSYSERR_INVALPARAM;
@ -859,16 +857,15 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
*/ */
static DWORD wodClose(WORD wDevID) static DWORD wodClose(WORD wDevID)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,"wodClose(%u);\n", wDevID); dprintf_mciwave(stddeb,"wodClose(%u);\n", wDevID);
if (WOutDev[index].unixdev == 0) { if (WOutDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'wodClose' // can't close !\n"); dprintf_mciwave(stddeb,"Linux 'wodClose' // can't close !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
close(WOutDev[index].unixdev); close(WOutDev[wDevID].unixdev);
WOutDev[index].unixdev = 0; WOutDev[wDevID].unixdev = 0;
WOutDev[index].bufsize = 0; WOutDev[wDevID].bufsize = 0;
WOutDev[index].lpQueueHdr = NULL; WOutDev[wDevID].lpQueueHdr = NULL;
if (WAVE_NotifyClient(wDevID, WOM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) { if (WAVE_NotifyClient(wDevID, WOM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
dprintf_mciwave(stddeb,"Linux 'wodClose' // can't notify client !\n"); dprintf_mciwave(stddeb,"Linux 'wodClose' // can't notify client !\n");
return MMSYSERR_INVALPARAM; return MMSYSERR_INVALPARAM;
@ -881,11 +878,10 @@ static DWORD wodClose(WORD wDevID)
*/ */
static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
int count; int count;
LPSTR lpData; LPSTR lpData;
dprintf_mciwave(stddeb,"wodWrite(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize); dprintf_mciwave(stddeb,"wodWrite(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
if (WOutDev[index].unixdev == 0) { if (WOutDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'wodWrite' // can't play !\n"); dprintf_mciwave(stddeb,"Linux 'wodWrite' // can't play !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
@ -897,16 +893,16 @@ static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"wodWrite() // dwBufferLength %lu !\n", lpWaveHdr->dwBufferLength); "wodWrite() // dwBufferLength %lu !\n", lpWaveHdr->dwBufferLength);
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"wodWrite() // WOutDev[%u].unixdev %u !\n", wDevID, WOutDev[index].unixdev); "wodWrite() // WOutDev[%u].unixdev %u !\n", wDevID, WOutDev[wDevID].unixdev);
lpData = PTR_SEG_TO_LIN(lpWaveHdr->lpData); lpData = PTR_SEG_TO_LIN(lpWaveHdr->lpData);
count = write (WOutDev[index].unixdev, lpData, lpWaveHdr->dwBufferLength); count = write (WOutDev[wDevID].unixdev, lpData, lpWaveHdr->dwBufferLength);
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"wodWrite() // write returned count %u !\n", count); "wodWrite() // write returned count %u !\n", count);
if (count != lpWaveHdr->dwBufferLength) { if (count != lpWaveHdr->dwBufferLength) {
dprintf_mciwave(stddeb,"Linux 'wodWrite' // error writting !\n"); dprintf_mciwave(stddeb,"Linux 'wodWrite' // error writting !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
WOutDev[index].dwTotalPlayed += count; WOutDev[wDevID].dwTotalPlayed += count;
lpWaveHdr->dwFlags &= ~WHDR_INQUEUE; lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
lpWaveHdr->dwFlags |= WHDR_DONE; lpWaveHdr->dwFlags |= WHDR_DONE;
if (WAVE_NotifyClient(wDevID, WOM_DONE, 0L, 0L) != MMSYSERR_NOERROR) { if (WAVE_NotifyClient(wDevID, WOM_DONE, 0L, 0L) != MMSYSERR_NOERROR) {
@ -921,22 +917,21 @@ static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/ */
static DWORD wodPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) static DWORD wodPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"wodPrepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize); "wodPrepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
if (WOutDev[index].unixdev == 0) { if (WOutDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'wodPrepare' // can't prepare !\n"); dprintf_mciwave(stddeb,"Linux 'wodPrepare' // can't prepare !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
/* the COOL waveeditor feels much better without this check... /* the COOL waveeditor feels much better without this check...
* someone please have a look at available documentation * someone please have a look at available documentation
if (WOutDev[index].lpQueueHdr != NULL) { if (WOutDev[wDevID].lpQueueHdr != NULL) {
dprintf_mciwave(stddeb,"Linux 'wodPrepare' // already prepare !\n"); dprintf_mciwave(stddeb,"Linux 'wodPrepare' // already prepare !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
*/ */
WOutDev[index].dwTotalPlayed = 0; WOutDev[wDevID].dwTotalPlayed = 0;
WOutDev[index].lpQueueHdr = lpWaveHdr; WOutDev[wDevID].lpQueueHdr = lpWaveHdr;
if (lpWaveHdr->dwFlags & WHDR_INQUEUE) return WAVERR_STILLPLAYING; if (lpWaveHdr->dwFlags & WHDR_INQUEUE) return WAVERR_STILLPLAYING;
lpWaveHdr->dwFlags |= WHDR_PREPARED; lpWaveHdr->dwFlags |= WHDR_PREPARED;
lpWaveHdr->dwFlags &= ~WHDR_DONE; lpWaveHdr->dwFlags &= ~WHDR_DONE;
@ -948,10 +943,9 @@ static DWORD wodPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/ */
static DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) static DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"wodUnprepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize); "wodUnprepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
if (WOutDev[index].unixdev == 0) { if (WOutDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'wodUnprepare' // can't unprepare !\n"); dprintf_mciwave(stddeb,"Linux 'wodUnprepare' // can't unprepare !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
@ -963,9 +957,8 @@ static DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/ */
static DWORD wodRestart(WORD wDevID) static DWORD wodRestart(WORD wDevID)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,"wodRestart(%u);\n", wDevID); dprintf_mciwave(stddeb,"wodRestart(%u);\n", wDevID);
if (WOutDev[index].unixdev == 0) { if (WOutDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'wodRestart' // can't restart !\n"); dprintf_mciwave(stddeb,"Linux 'wodRestart' // can't restart !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
@ -977,9 +970,8 @@ static DWORD wodRestart(WORD wDevID)
*/ */
static DWORD wodReset(WORD wDevID) static DWORD wodReset(WORD wDevID)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,"wodReset(%u);\n", wDevID); dprintf_mciwave(stddeb,"wodReset(%u);\n", wDevID);
if (WOutDev[index].unixdev == 0) { if (WOutDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'wodReset' // can't reset !\n"); dprintf_mciwave(stddeb,"Linux 'wodReset' // can't reset !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
@ -992,31 +984,30 @@ static DWORD wodReset(WORD wDevID)
*/ */
static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize) static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
int time; int time;
dprintf_mciwave(stddeb,"wodGetPosition(%u, %p, %lu);\n", wDevID, lpTime, uSize); dprintf_mciwave(stddeb,"wodGetPosition(%u, %p, %lu);\n", wDevID, lpTime, uSize);
if (WOutDev[index].unixdev == 0) { if (WOutDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'wodGetPosition' // can't get pos !\n"); dprintf_mciwave(stddeb,"Linux 'wodGetPosition' // can't get pos !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
if (lpTime == NULL) return MMSYSERR_INVALPARAM; if (lpTime == NULL) return MMSYSERR_INVALPARAM;
switch(lpTime->wType) { switch(lpTime->wType) {
case TIME_BYTES: case TIME_BYTES:
lpTime->u.cb = WOutDev[index].dwTotalPlayed; lpTime->u.cb = WOutDev[wDevID].dwTotalPlayed;
dprintf_mciwave(stddeb,"wodGetPosition // TIME_BYTES=%lu\n", lpTime->u.cb); dprintf_mciwave(stddeb,"wodGetPosition // TIME_BYTES=%lu\n", lpTime->u.cb);
break; break;
case TIME_SAMPLES: case TIME_SAMPLES:
dprintf_mciwave(stddeb,"wodGetPosition // dwTotalPlayed=%lu\n", dprintf_mciwave(stddeb,"wodGetPosition // dwTotalPlayed=%lu\n",
WOutDev[index].dwTotalPlayed); WOutDev[wDevID].dwTotalPlayed);
dprintf_mciwave(stddeb,"wodGetPosition // wBitsPerSample=%u\n", dprintf_mciwave(stddeb,"wodGetPosition // wBitsPerSample=%u\n",
WOutDev[index].Format.wBitsPerSample); WOutDev[wDevID].Format.wBitsPerSample);
lpTime->u.sample = WOutDev[index].dwTotalPlayed * 8 / lpTime->u.sample = WOutDev[wDevID].dwTotalPlayed * 8 /
WOutDev[index].Format.wBitsPerSample; WOutDev[wDevID].Format.wBitsPerSample;
dprintf_mciwave(stddeb,"wodGetPosition // TIME_SAMPLES=%lu\n", lpTime->u.sample); dprintf_mciwave(stddeb,"wodGetPosition // TIME_SAMPLES=%lu\n", lpTime->u.sample);
break; break;
case TIME_SMPTE: case TIME_SMPTE:
time = WOutDev[index].dwTotalPlayed / time = WOutDev[wDevID].dwTotalPlayed /
(WOutDev[index].Format.wf.nAvgBytesPerSec / 1000); (WOutDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
lpTime->u.smpte.hour = time / 108000; lpTime->u.smpte.hour = time / 108000;
time -= lpTime->u.smpte.hour * 108000; time -= lpTime->u.smpte.hour * 108000;
lpTime->u.smpte.min = time / 1800; lpTime->u.smpte.min = time / 1800;
@ -1034,8 +1025,8 @@ static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
dprintf_mciwave(stddeb,"wodGetPosition() format not supported ! use TIME_MS !\n"); dprintf_mciwave(stddeb,"wodGetPosition() format not supported ! use TIME_MS !\n");
lpTime->wType = TIME_MS; lpTime->wType = TIME_MS;
case TIME_MS: case TIME_MS:
lpTime->u.ms = WOutDev[index].dwTotalPlayed / lpTime->u.ms = WOutDev[wDevID].dwTotalPlayed /
(WOutDev[index].Format.wf.nAvgBytesPerSec / 1000); (WOutDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
dprintf_mciwave(stddeb,"wodGetPosition // TIME_MS=%lu\n", lpTime->u.ms); dprintf_mciwave(stddeb,"wodGetPosition // TIME_MS=%lu\n", lpTime->u.ms);
break; break;
} }
@ -1218,7 +1209,6 @@ static DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPS lpCaps, DWORD dwSize)
*/ */
static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
int audio; int audio;
int abuf_size; int abuf_size;
int smplrate; int smplrate;
@ -1234,7 +1224,7 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
dprintf_mciwave(stddeb,"Linux 'widOpen' // MAX_WAVINDRV reached !\n"); dprintf_mciwave(stddeb,"Linux 'widOpen' // MAX_WAVINDRV reached !\n");
return MMSYSERR_ALLOCATED; return MMSYSERR_ALLOCATED;
} }
WInDev[index].unixdev = 0; WInDev[wDevID].unixdev = 0;
audio = open (SOUND_DEV, O_RDONLY, 0); audio = open (SOUND_DEV, O_RDONLY, 0);
if (audio == -1) { if (audio == -1) {
dprintf_mciwave(stddeb,"Linux 'widOpen' // can't open !\n"); dprintf_mciwave(stddeb,"Linux 'widOpen' // can't open !\n");
@ -1248,8 +1238,8 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
dprintf_mciwave(stddeb,"Linux 'widOpen' // SNDCTL_DSP_GETBLKSIZE Invalid bufsize !\n"); dprintf_mciwave(stddeb,"Linux 'widOpen' // SNDCTL_DSP_GETBLKSIZE Invalid bufsize !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
WInDev[index].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); WInDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
switch(WInDev[index].wFlags) { switch(WInDev[wDevID].wFlags) {
case DCB_NULL: case DCB_NULL:
dprintf_mciwave(stddeb, "Linux 'widOpen' // CALLBACK_NULL !\n"); dprintf_mciwave(stddeb, "Linux 'widOpen' // CALLBACK_NULL !\n");
break; break;
@ -1263,41 +1253,41 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
dprintf_mciwave(stddeb, "Linux 'widOpen' // CALLBACK_FUNCTION !\n"); dprintf_mciwave(stddeb, "Linux 'widOpen' // CALLBACK_FUNCTION !\n");
break; break;
} }
WInDev[index].lpQueueHdr = NULL; WInDev[wDevID].lpQueueHdr = NULL;
WInDev[index].unixdev = audio; WInDev[wDevID].unixdev = audio;
WInDev[index].bufsize = abuf_size; WInDev[wDevID].bufsize = abuf_size;
WInDev[index].dwTotalRecorded = 0; WInDev[wDevID].dwTotalRecorded = 0;
memcpy(&WInDev[index].waveDesc, lpDesc, sizeof(WAVEOPENDESC)); memcpy(&WInDev[wDevID].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
lpFormat = lpDesc->lpFormat; lpFormat = lpDesc->lpFormat;
if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) { if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
dprintf_mciwave(stddeb,"Linux 'widOpen' // Bad format %04X !\n", dprintf_mciwave(stddeb,"Linux 'widOpen' // Bad format %04X !\n",
lpFormat->wFormatTag); lpFormat->wFormatTag);
return WAVERR_BADFORMAT; return WAVERR_BADFORMAT;
} }
memcpy(&WInDev[index].Format, lpFormat, sizeof(PCMWAVEFORMAT)); memcpy(&WInDev[wDevID].Format, lpFormat, sizeof(PCMWAVEFORMAT));
WInDev[index].Format.wBitsPerSample = 8; /* <-------------- */ WInDev[wDevID].Format.wBitsPerSample = 8; /* <-------------- */
if (WInDev[index].Format.wf.nChannels == 0) return WAVERR_BADFORMAT; if (WInDev[wDevID].Format.wf.nChannels == 0) return WAVERR_BADFORMAT;
if (WInDev[index].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT; if (WInDev[wDevID].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT;
if (WInDev[index].Format.wBitsPerSample == 0) { if (WInDev[wDevID].Format.wBitsPerSample == 0) {
WInDev[index].Format.wBitsPerSample = 8 * WInDev[wDevID].Format.wBitsPerSample = 8 *
(WInDev[index].Format.wf.nAvgBytesPerSec / (WInDev[wDevID].Format.wf.nAvgBytesPerSec /
WInDev[index].Format.wf.nSamplesPerSec) / WInDev[wDevID].Format.wf.nSamplesPerSec) /
WInDev[index].Format.wf.nChannels; WInDev[wDevID].Format.wf.nChannels;
} }
samplesize = WInDev[index].Format.wBitsPerSample; samplesize = WInDev[wDevID].Format.wBitsPerSample;
smplrate = WInDev[index].Format.wf.nSamplesPerSec; smplrate = WInDev[wDevID].Format.wf.nSamplesPerSec;
dsp_stereo = (WInDev[index].Format.wf.nChannels > 1) ? TRUE : FALSE; dsp_stereo = (WInDev[wDevID].Format.wf.nChannels > 1) ? TRUE : FALSE;
IOCTL(audio, SNDCTL_DSP_SPEED, smplrate); IOCTL(audio, SNDCTL_DSP_SPEED, smplrate);
IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, samplesize); IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, samplesize);
IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo); IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo);
dprintf_mciwave(stddeb,"Linux 'widOpen' // wBitsPerSample=%u !\n", dprintf_mciwave(stddeb,"Linux 'widOpen' // wBitsPerSample=%u !\n",
WInDev[index].Format.wBitsPerSample); WInDev[wDevID].Format.wBitsPerSample);
dprintf_mciwave(stddeb,"Linux 'widOpen' // nSamplesPerSec=%lu !\n", dprintf_mciwave(stddeb,"Linux 'widOpen' // nSamplesPerSec=%lu !\n",
WInDev[index].Format.wf.nSamplesPerSec); WInDev[wDevID].Format.wf.nSamplesPerSec);
dprintf_mciwave(stddeb,"Linux 'widOpen' // nChannels=%u !\n", dprintf_mciwave(stddeb,"Linux 'widOpen' // nChannels=%u !\n",
WInDev[index].Format.wf.nChannels); WInDev[wDevID].Format.wf.nChannels);
dprintf_mciwave(stddeb,"Linux 'widOpen' // nAvgBytesPerSec=%lu\n", dprintf_mciwave(stddeb,"Linux 'widOpen' // nAvgBytesPerSec=%lu\n",
WInDev[index].Format.wf.nAvgBytesPerSec); WInDev[wDevID].Format.wf.nAvgBytesPerSec);
if (WAVE_NotifyClient(wDevID, WIM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) { if (WAVE_NotifyClient(wDevID, WIM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) {
dprintf_mciwave(stddeb,"Linux 'widOpen' // can't notify client !\n"); dprintf_mciwave(stddeb,"Linux 'widOpen' // can't notify client !\n");
return MMSYSERR_INVALPARAM; return MMSYSERR_INVALPARAM;
@ -1310,15 +1300,14 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
*/ */
static DWORD widClose(WORD wDevID) static DWORD widClose(WORD wDevID)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,"widClose(%u);\n", wDevID); dprintf_mciwave(stddeb,"widClose(%u);\n", wDevID);
if (WInDev[index].unixdev == 0) { if (WInDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'widClose' // can't close !\n"); dprintf_mciwave(stddeb,"Linux 'widClose' // can't close !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
close(WInDev[index].unixdev); close(WInDev[wDevID].unixdev);
WInDev[index].unixdev = 0; WInDev[wDevID].unixdev = 0;
WInDev[index].bufsize = 0; WInDev[wDevID].bufsize = 0;
if (WAVE_NotifyClient(wDevID, WIM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) { if (WAVE_NotifyClient(wDevID, WIM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
dprintf_mciwave(stddeb,"Linux 'widClose' // can't notify client !\n"); dprintf_mciwave(stddeb,"Linux 'widClose' // can't notify client !\n");
return MMSYSERR_INVALPARAM; return MMSYSERR_INVALPARAM;
@ -1331,12 +1320,11 @@ static DWORD widClose(WORD wDevID)
*/ */
static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
int count = 1; int count = 1;
LPWAVEHDR lpWIHdr; LPWAVEHDR lpWIHdr;
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"widAddBuffer(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize); "widAddBuffer(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
if (WInDev[index].unixdev == 0) { if (WInDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'widAddBuffer' // can't do it !\n"); dprintf_mciwave(stddeb,"Linux 'widAddBuffer' // can't do it !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
@ -1352,14 +1340,14 @@ static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
lpWaveHdr->dwFlags |= WHDR_INQUEUE; lpWaveHdr->dwFlags |= WHDR_INQUEUE;
lpWaveHdr->dwFlags &= ~WHDR_DONE; lpWaveHdr->dwFlags &= ~WHDR_DONE;
lpWaveHdr->dwBytesRecorded = 0; lpWaveHdr->dwBytesRecorded = 0;
if (WInDev[index].lpQueueHdr == NULL) { if (WInDev[wDevID].lpQueueHdr == NULL) {
/* begin the queue with a first header ... */ /* begin the queue with a first header ... */
WInDev[index].lpQueueHdr = lpWaveHdr; WInDev[wDevID].lpQueueHdr = lpWaveHdr;
WInDev[index].dwTotalRecorded = 0; WInDev[wDevID].dwTotalRecorded = 0;
} }
else { else {
/* added to the queue, except if it's the one just prepared ... */ /* added to the queue, except if it's the one just prepared ... */
lpWIHdr = WInDev[index].lpQueueHdr; lpWIHdr = WInDev[wDevID].lpQueueHdr;
while (lpWIHdr->lpNext != NULL) { while (lpWIHdr->lpNext != NULL) {
lpWIHdr = lpWIHdr->lpNext; lpWIHdr = lpWIHdr->lpNext;
count++; count++;
@ -1377,14 +1365,13 @@ static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/ */
static DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) static DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"widPrepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize); "widPrepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
if (WInDev[index].unixdev == 0) { if (WInDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'widPrepare' // can't prepare !\n"); dprintf_mciwave(stddeb,"Linux 'widPrepare' // can't prepare !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
if (WInDev[index].lpQueueHdr != NULL) { if (WInDev[wDevID].lpQueueHdr != NULL) {
dprintf_mciwave(stddeb,"Linux 'widPrepare' // already prepare !\n"); dprintf_mciwave(stddeb,"Linux 'widPrepare' // already prepare !\n");
return WAVERR_BADFORMAT; return WAVERR_BADFORMAT;
} }
@ -1402,17 +1389,16 @@ static DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/ */
static DWORD widUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) static DWORD widUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"widUnprepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize); "widUnprepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
if (WInDev[index].unixdev == 0) { if (WInDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'widUnprepare' // can't unprepare !\n"); dprintf_mciwave(stddeb,"Linux 'widUnprepare' // can't unprepare !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
lpWaveHdr->dwFlags &= ~WHDR_PREPARED; lpWaveHdr->dwFlags &= ~WHDR_PREPARED;
lpWaveHdr->dwFlags &= ~WHDR_INQUEUE; lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
lpWaveHdr->dwFlags |= WHDR_DONE; lpWaveHdr->dwFlags |= WHDR_DONE;
WInDev[index].lpQueueHdr = NULL; WInDev[wDevID].lpQueueHdr = NULL;
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"Linux 'widUnprepare' // all headers unprepared !\n"); "Linux 'widUnprepare' // all headers unprepared !\n");
return MMSYSERR_NOERROR; return MMSYSERR_NOERROR;
@ -1423,31 +1409,30 @@ static DWORD widUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/ */
static DWORD widStart(WORD wDevID) static DWORD widStart(WORD wDevID)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
int count = 1; int count = 1;
LPWAVEHDR lpWIHdr; LPWAVEHDR lpWIHdr;
dprintf_mciwave(stddeb,"widStart(%u);\n", wDevID); dprintf_mciwave(stddeb,"widStart(%u);\n", wDevID);
if (WInDev[index].unixdev == 0) { if (WInDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb, "Linux 'widStart' // can't start recording !\n"); dprintf_mciwave(stddeb, "Linux 'widStart' // can't start recording !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
if (WInDev[index].lpQueueHdr == NULL || if (WInDev[wDevID].lpQueueHdr == NULL ||
WInDev[index].lpQueueHdr->lpData == NULL) { WInDev[wDevID].lpQueueHdr->lpData == NULL) {
dprintf_mciwave(stddeb,"Linux 'widStart' // never been prepared !\n"); dprintf_mciwave(stddeb,"Linux 'widStart' // never been prepared !\n");
return WAVERR_UNPREPARED; return WAVERR_UNPREPARED;
} }
lpWIHdr = WInDev[index].lpQueueHdr; lpWIHdr = WInDev[wDevID].lpQueueHdr;
while(lpWIHdr != NULL) { while(lpWIHdr != NULL) {
lpWIHdr->dwBufferLength &= 0xFFFF; lpWIHdr->dwBufferLength &= 0xFFFF;
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"widStart // recording buf#%u=%p size=%lu \n", "widStart // recording buf#%u=%p size=%lu \n",
count, lpWIHdr->lpData, lpWIHdr->dwBufferLength); count, lpWIHdr->lpData, lpWIHdr->dwBufferLength);
fflush(stddeb); fflush(stddeb);
read (WInDev[index].unixdev, read (WInDev[wDevID].unixdev,
PTR_SEG_TO_LIN(lpWIHdr->lpData), PTR_SEG_TO_LIN(lpWIHdr->lpData),
lpWIHdr->dwBufferLength); lpWIHdr->dwBufferLength);
lpWIHdr->dwBytesRecorded = lpWIHdr->dwBufferLength; lpWIHdr->dwBytesRecorded = lpWIHdr->dwBufferLength;
WInDev[index].dwTotalRecorded += lpWIHdr->dwBytesRecorded; WInDev[wDevID].dwTotalRecorded += lpWIHdr->dwBytesRecorded;
lpWIHdr->dwFlags &= ~WHDR_INQUEUE; lpWIHdr->dwFlags &= ~WHDR_INQUEUE;
lpWIHdr->dwFlags |= WHDR_DONE; lpWIHdr->dwFlags |= WHDR_DONE;
if (WAVE_NotifyClient(wDevID, WIM_DATA, (DWORD)lpWIHdr, 0L) != if (WAVE_NotifyClient(wDevID, WIM_DATA, (DWORD)lpWIHdr, 0L) !=
@ -1468,9 +1453,8 @@ static DWORD widStart(WORD wDevID)
*/ */
static DWORD widStop(WORD wDevID) static DWORD widStop(WORD wDevID)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,"widStop(%u);\n", wDevID); dprintf_mciwave(stddeb,"widStop(%u);\n", wDevID);
if (WInDev[index].unixdev == 0) { if (WInDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'widStop' // can't stop !\n"); dprintf_mciwave(stddeb,"Linux 'widStop' // can't stop !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
@ -1482,9 +1466,8 @@ static DWORD widStop(WORD wDevID)
*/ */
static DWORD widReset(WORD wDevID) static DWORD widReset(WORD wDevID)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,"widReset(%u);\n", wDevID); dprintf_mciwave(stddeb,"widReset(%u);\n", wDevID);
if (WInDev[index].unixdev == 0) { if (WInDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'widReset' // can't reset !\n"); dprintf_mciwave(stddeb,"Linux 'widReset' // can't reset !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
@ -1496,12 +1479,11 @@ static DWORD widReset(WORD wDevID)
*/ */
static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize) static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{ {
int index = MMSYSTEM_DevIDToIndex(wDevID);
int time; int time;
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"widGetPosition(%u, %p, %lu);\n", wDevID, lpTime, uSize); "widGetPosition(%u, %p, %lu);\n", wDevID, lpTime, uSize);
if (WInDev[index].unixdev == 0) { if (WInDev[wDevID].unixdev == 0) {
dprintf_mciwave(stddeb,"Linux 'widGetPosition' // can't get pos !\n"); dprintf_mciwave(stddeb,"Linux 'widGetPosition' // can't get pos !\n");
return MMSYSERR_NOTENABLED; return MMSYSERR_NOTENABLED;
} }
@ -1509,30 +1491,30 @@ static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
dprintf_mciwave(stddeb,"widGetPosition // wType=%04X !\n", dprintf_mciwave(stddeb,"widGetPosition // wType=%04X !\n",
lpTime->wType); lpTime->wType);
dprintf_mciwave(stddeb,"widGetPosition // wBitsPerSample=%u\n", dprintf_mciwave(stddeb,"widGetPosition // wBitsPerSample=%u\n",
WInDev[index].Format.wBitsPerSample); WInDev[wDevID].Format.wBitsPerSample);
dprintf_mciwave(stddeb,"widGetPosition // nSamplesPerSec=%lu\n", dprintf_mciwave(stddeb,"widGetPosition // nSamplesPerSec=%lu\n",
WInDev[index].Format.wf.nSamplesPerSec); WInDev[wDevID].Format.wf.nSamplesPerSec);
dprintf_mciwave(stddeb,"widGetPosition // nChannels=%u\n", dprintf_mciwave(stddeb,"widGetPosition // nChannels=%u\n",
WInDev[index].Format.wf.nChannels); WInDev[wDevID].Format.wf.nChannels);
dprintf_mciwave(stddeb,"widGetPosition // nAvgBytesPerSec=%lu\n", dprintf_mciwave(stddeb,"widGetPosition // nAvgBytesPerSec=%lu\n",
WInDev[index].Format.wf.nAvgBytesPerSec); WInDev[wDevID].Format.wf.nAvgBytesPerSec);
fflush(stddeb); fflush(stddeb);
switch(lpTime->wType) { switch(lpTime->wType) {
case TIME_BYTES: case TIME_BYTES:
lpTime->u.cb = WInDev[index].dwTotalRecorded; lpTime->u.cb = WInDev[wDevID].dwTotalRecorded;
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"widGetPosition // TIME_BYTES=%lu\n", lpTime->u.cb); "widGetPosition // TIME_BYTES=%lu\n", lpTime->u.cb);
break; break;
case TIME_SAMPLES: case TIME_SAMPLES:
lpTime->u.sample = WInDev[index].dwTotalRecorded * 8 / lpTime->u.sample = WInDev[wDevID].dwTotalRecorded * 8 /
WInDev[index].Format.wBitsPerSample; WInDev[wDevID].Format.wBitsPerSample;
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"widGetPosition // TIME_SAMPLES=%lu\n", "widGetPosition // TIME_SAMPLES=%lu\n",
lpTime->u.sample); lpTime->u.sample);
break; break;
case TIME_SMPTE: case TIME_SMPTE:
time = WInDev[index].dwTotalRecorded / time = WInDev[wDevID].dwTotalRecorded /
(WInDev[index].Format.wf.nAvgBytesPerSec / 1000); (WInDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
lpTime->u.smpte.hour = time / 108000; lpTime->u.smpte.hour = time / 108000;
time -= lpTime->u.smpte.hour * 108000; time -= lpTime->u.smpte.hour * 108000;
lpTime->u.smpte.min = time / 1800; lpTime->u.smpte.min = time / 1800;
@ -1549,8 +1531,8 @@ static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
dprintf_mciwave(stddeb,"widGetPosition() format not supported ! use TIME_MS !\n"); dprintf_mciwave(stddeb,"widGetPosition() format not supported ! use TIME_MS !\n");
lpTime->wType = TIME_MS; lpTime->wType = TIME_MS;
case TIME_MS: case TIME_MS:
lpTime->u.ms = WInDev[index].dwTotalRecorded / lpTime->u.ms = WInDev[wDevID].dwTotalRecorded /
(WInDev[index].Format.wf.nAvgBytesPerSec / 1000); (WInDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
dprintf_mciwave(stddeb, dprintf_mciwave(stddeb,
"widGetPosition // TIME_MS=%lu\n", lpTime->u.ms); "widGetPosition // TIME_MS=%lu\n", lpTime->u.ms);
break; break;

View File

@ -98,8 +98,7 @@ BOOL32 MMSYSTEM_DevIDValid(UINT16 wDevID) {
int MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg, int MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg,
WORD cbHeapSize, LPSTR lpCmdLine) WORD cbHeapSize, LPSTR lpCmdLine)
{ {
/* isn't WEP the Windows Exit Procedure ? */ fprintf(stderr, "STUB: Unloading MMSystem DLL ... hInst=%04X \n", hInstance);
printf("MMSYSTEM DLL INIT ... hInst=%04X \n", hInstance);
return(TRUE); return(TRUE);
} }
@ -108,22 +107,12 @@ int MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg,
*/ */
BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags) BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
{ {
BOOL16 bRet = FALSE;
HMMIO16 hmmio; HMMIO16 hmmio;
MMCKINFO mmckInfo;
MMCKINFO ckMainRIFF; MMCKINFO ckMainRIFF;
HLOCAL16 hFormat;
PCMWAVEFORMAT pcmWaveFormat;
int count;
int bufsize;
HLOCAL16 hDesc;
LPWAVEOPENDESC lpWaveDesc;
HLOCAL16 hWaveHdr;
LPWAVEHDR lpWaveHdr;
LPWAVEHDR lp16WaveHdr;
HLOCAL16 hData;
DWORD dwRet;
char str[128]; char str[128];
LPSTR ptr; LPSTR ptr;
dprintf_mmsys(stddeb, "sndPlaySound // SoundName='%s' uFlags=%04X !\n", dprintf_mmsys(stddeb, "sndPlaySound // SoundName='%s' uFlags=%04X !\n",
lpszSoundName, uFlags); lpszSoundName, uFlags);
if (lpszSoundName == NULL) { if (lpszSoundName == NULL) {
@ -138,33 +127,42 @@ BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
return FALSE; return FALSE;
} }
if (hmmio == 0) { if (hmmio == 0)
{
dprintf_mmsys(stddeb, "sndPlaySound // searching in SystemSound List !\n"); dprintf_mmsys(stddeb, "sndPlaySound // searching in SystemSound List !\n");
GetProfileString32A("Sounds", (LPSTR)lpszSoundName, "", str, sizeof(str)); GetProfileString32A("Sounds", (LPSTR)lpszSoundName, "", str, sizeof(str));
if (strlen(str) == 0) return FALSE; if (strlen(str) == 0) return FALSE;
if ( (ptr = (LPSTR)strchr(str, ',')) != NULL) *ptr = '\0'; if ( (ptr = (LPSTR)strchr(str, ',')) != NULL) *ptr = '\0';
hmmio = mmioOpen(str, NULL, MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE); hmmio = mmioOpen(str, NULL, MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
if (hmmio == 0) { if (hmmio == 0)
{
dprintf_mmsys(stddeb, "sndPlaySound // can't find SystemSound='%s' !\n", str); dprintf_mmsys(stddeb, "sndPlaySound // can't find SystemSound='%s' !\n", str);
return FALSE; return FALSE;
} }
} }
if (mmioDescend(hmmio, &ckMainRIFF, NULL, 0) != 0) {
ErrSND: if (hmmio != 0) mmioClose(hmmio, 0); if (mmioDescend(hmmio, &ckMainRIFF, NULL, 0) == 0)
return FALSE; {
}
dprintf_mmsys(stddeb, "sndPlaySound // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n", dprintf_mmsys(stddeb, "sndPlaySound // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
(LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType, (LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType, ckMainRIFF.cksize);
ckMainRIFF.cksize);
if ((ckMainRIFF.ckid != FOURCC_RIFF) || if ((ckMainRIFF.ckid == FOURCC_RIFF) &&
(ckMainRIFF.fccType != mmioFOURCC('W', 'A', 'V', 'E'))) goto ErrSND; (ckMainRIFF.fccType == mmioFOURCC('W', 'A', 'V', 'E')))
{
MMCKINFO mmckInfo;
mmckInfo.ckid = mmioFOURCC('f', 'm', 't', ' '); mmckInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) goto ErrSND;
if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) == 0)
{
PCMWAVEFORMAT pcmWaveFormat;
dprintf_mmsys(stddeb, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n", dprintf_mmsys(stddeb, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType, (LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType, mmckInfo.cksize);
mmckInfo.cksize);
if (mmioRead(hmmio, (HPSTR) &pcmWaveFormat, if (mmioRead(hmmio, (HPSTR) &pcmWaveFormat,
(long) sizeof(PCMWAVEFORMAT)) != (long) sizeof(PCMWAVEFORMAT)) goto ErrSND; (long) sizeof(PCMWAVEFORMAT)) == (long) sizeof(PCMWAVEFORMAT))
{
dprintf_mmsys(stddeb, "sndPlaySound // wFormatTag=%04X !\n", pcmWaveFormat.wf.wFormatTag); dprintf_mmsys(stddeb, "sndPlaySound // wFormatTag=%04X !\n", pcmWaveFormat.wf.wFormatTag);
dprintf_mmsys(stddeb, "sndPlaySound // nChannels=%d \n", pcmWaveFormat.wf.nChannels); dprintf_mmsys(stddeb, "sndPlaySound // nChannels=%d \n", pcmWaveFormat.wf.nChannels);
@ -174,28 +172,34 @@ ErrSND: if (hmmio != 0) mmioClose(hmmio, 0);
dprintf_mmsys(stddeb, "sndPlaySound // wBitsPerSample=%u !\n", pcmWaveFormat.wBitsPerSample); dprintf_mmsys(stddeb, "sndPlaySound // wBitsPerSample=%u !\n", pcmWaveFormat.wBitsPerSample);
mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a'); mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) goto ErrSND; if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) == 0)
dprintf_mmsys(stddeb, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n", {
(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType, LPWAVEFORMAT lpFormat = (LPWAVEFORMAT) SEGPTR_ALLOC(sizeof(PCMWAVEFORMAT));
mmckInfo.cksize); LPWAVEOPENDESC lpWaveDesc = (LPWAVEOPENDESC) SEGPTR_ALLOC(sizeof(WAVEOPENDESC));
hDesc = USER_HEAP_ALLOC(sizeof(WAVEOPENDESC)); DWORD dwRet;
lpWaveDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hDesc);
dprintf_mmsys(stddeb, "sndPlaySound // Chunk Found \
ckid=%.4s fccType=%.4s cksize=%08lX \n", (LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType, mmckInfo.cksize);
pcmWaveFormat.wf.nAvgBytesPerSec = pcmWaveFormat.wf.nSamplesPerSec *
pcmWaveFormat.wf.nBlockAlign;
memcpy(lpFormat, &pcmWaveFormat, sizeof(PCMWAVEFORMAT));
lpWaveDesc->hWave = 0; lpWaveDesc->hWave = 0;
pcmWaveFormat.wf.nAvgBytesPerSec = lpWaveDesc->lpFormat = (LPWAVEFORMAT) SEGPTR_GET(lpFormat);
pcmWaveFormat.wf.nSamplesPerSec * pcmWaveFormat.wf.nBlockAlign;
hFormat = USER_HEAP_ALLOC(sizeof(PCMWAVEFORMAT)); dwRet = wodMessage( MMSYSTEM_FirstDevID(),
lpWaveDesc->lpFormat = (LPWAVEFORMAT) USER_HEAP_LIN_ADDR(hFormat); WODM_OPEN, 0, (DWORD)SEGPTR_GET(lpWaveDesc), CALLBACK_NULL);
memcpy(lpWaveDesc->lpFormat, &pcmWaveFormat, sizeof(PCMWAVEFORMAT)); SEGPTR_FREE(lpFormat);
lpWaveDesc = (LPWAVEOPENDESC) USER_HEAP_SEG_ADDR(hDesc); SEGPTR_FREE(lpWaveDesc);
dwRet = wodMessage(0, WODM_OPEN, 0, (DWORD)lpWaveDesc, CALLBACK_NULL);
if (dwRet != MMSYSERR_NOERROR) { if (dwRet == MMSYSERR_NOERROR)
dprintf_mmsys(stddeb, "sndPlaySound // can't open WaveOut device !\n"); {
goto ErrSND; LPWAVEHDR lpWaveHdr = (LPWAVEHDR) SEGPTR_ALLOC(sizeof(WAVEHDR));
} SEGPTR spWaveHdr = SEGPTR_GET(lpWaveHdr);
USER_HEAP_FREE(hFormat); HGLOBAL16 hData;
hWaveHdr = USER_HEAP_ALLOC(sizeof(WAVEHDR)); INT32 count, bufsize;
lpWaveHdr = (LPWAVEHDR) USER_HEAP_LIN_ADDR(hWaveHdr);
lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
bufsize = 64000; bufsize = 64000;
hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize); hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData); lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData);
@ -203,30 +207,42 @@ ErrSND: if (hmmio != 0) mmioClose(hmmio, 0);
lpWaveHdr->dwUser = 0L; lpWaveHdr->dwUser = 0L;
lpWaveHdr->dwFlags = 0L; lpWaveHdr->dwFlags = 0L;
lpWaveHdr->dwLoops = 0L; lpWaveHdr->dwLoops = 0L;
dwRet = wodMessage(0, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
if (dwRet != MMSYSERR_NOERROR) { dwRet = wodMessage( MMSYSTEM_FirstDevID(),
dprintf_mmsys(stddeb, "sndPlaySound // can't prepare WaveOut device !\n"); WODM_PREPARE, 0, (DWORD)spWaveHdr, sizeof(WAVEHDR));
GlobalUnlock16(hData); if (dwRet == MMSYSERR_NOERROR)
GlobalFree16(hData); {
USER_HEAP_FREE(hDesc); while( TRUE )
USER_HEAP_FREE(hWaveHdr); {
goto ErrSND;
}
while(TRUE) {
count = mmioRead(hmmio, PTR_SEG_TO_LIN(lpWaveHdr->lpData), bufsize); count = mmioRead(hmmio, PTR_SEG_TO_LIN(lpWaveHdr->lpData), bufsize);
if (count < 1) break; if (count < 1) break;
lpWaveHdr->dwBufferLength = count; lpWaveHdr->dwBufferLength = count;
/* lpWaveHdr->dwBytesRecorded = count; */ /* lpWaveHdr->dwBytesRecorded = count; */
wodMessage(0, WODM_WRITE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR)); wodMessage( MMSYSTEM_FirstDevID(), WODM_WRITE,
0, (DWORD)spWaveHdr, sizeof(WAVEHDR));
} }
wodMessage(0, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR)); wodMessage( MMSYSTEM_FirstDevID(),
wodMessage(0, WODM_CLOSE, 0, 0L, 0L); WODM_UNPREPARE, 0, (DWORD)spWaveHdr, sizeof(WAVEHDR));
wodMessage( MMSYSTEM_FirstDevID(),
WODM_CLOSE, 0, 0L, 0L);
bRet = TRUE;
}
else dprintf_mmsys(stddeb, "sndPlaySound // can't prepare WaveOut device !\n");
GlobalUnlock16(hData); GlobalUnlock16(hData);
GlobalFree16(hData); GlobalFree16(hData);
USER_HEAP_FREE(hDesc);
USER_HEAP_FREE(hWaveHdr); SEGPTR_FREE(lpWaveHdr);
}
}
}
}
}
}
if (hmmio != 0) mmioClose(hmmio, 0); if (hmmio != 0) mmioClose(hmmio, 0);
return TRUE; return bRet;
} }
/************************************************************************** /**************************************************************************
@ -1407,7 +1423,7 @@ UINT16 waveOutGetNumDevs()
{ {
UINT16 count = 0; UINT16 count = 0;
dprintf_mmsys(stddeb, "waveOutGetNumDevs\n"); dprintf_mmsys(stddeb, "waveOutGetNumDevs\n");
count += wodMessage(0, WODM_GETNUMDEVS, 0L, 0L, 0L); count += wodMessage( MMSYSTEM_FirstDevID(), WODM_GETNUMDEVS, 0L, 0L, 0L);
dprintf_mmsys(stddeb, "waveOutGetNumDevs return %u \n", count); dprintf_mmsys(stddeb, "waveOutGetNumDevs return %u \n", count);
return count; return count;
} }
@ -1552,7 +1568,7 @@ UINT16 waveOutClose(HWAVEOUT16 hWaveOut)
dprintf_mmsys(stddeb, "waveOutClose(%04X)\n", hWaveOut); dprintf_mmsys(stddeb, "waveOutClose(%04X)\n", hWaveOut);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_CLOSE, lpDesc->dwInstance, 0L, 0L); return wodMessage( MMSYSTEM_FirstDevID(), WODM_CLOSE, lpDesc->dwInstance, 0L, 0L);
} }
/************************************************************************** /**************************************************************************
@ -1566,7 +1582,7 @@ UINT16 waveOutPrepareHeader(HWAVEOUT16 hWaveOut,
hWaveOut, lpWaveOutHdr, uSize); hWaveOut, lpWaveOutHdr, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_PREPARE, lpDesc->dwInstance, return wodMessage( MMSYSTEM_FirstDevID(), WODM_PREPARE, lpDesc->dwInstance,
(DWORD)lpWaveOutHdr, uSize); (DWORD)lpWaveOutHdr, uSize);
} }
@ -1581,7 +1597,7 @@ UINT16 waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
hWaveOut, lpWaveOutHdr, uSize); hWaveOut, lpWaveOutHdr, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_UNPREPARE, lpDesc->dwInstance, return wodMessage( MMSYSTEM_FirstDevID(), WODM_UNPREPARE, lpDesc->dwInstance,
(DWORD)lpWaveOutHdr, uSize); (DWORD)lpWaveOutHdr, uSize);
} }
@ -1594,7 +1610,7 @@ UINT16 waveOutWrite(HWAVEOUT16 hWaveOut, WAVEHDR * lpWaveOutHdr, UINT16 uSize)
dprintf_mmsys(stddeb, "waveOutWrite(%04X, %p, %u);\n", hWaveOut, lpWaveOutHdr, uSize); dprintf_mmsys(stddeb, "waveOutWrite(%04X, %p, %u);\n", hWaveOut, lpWaveOutHdr, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_WRITE, lpDesc->dwInstance, return wodMessage( MMSYSTEM_FirstDevID(), WODM_WRITE, lpDesc->dwInstance,
(DWORD)lpWaveOutHdr, uSize); (DWORD)lpWaveOutHdr, uSize);
} }
@ -1607,7 +1623,7 @@ UINT16 waveOutPause(HWAVEOUT16 hWaveOut)
dprintf_mmsys(stddeb, "waveOutPause(%04X)\n", hWaveOut); dprintf_mmsys(stddeb, "waveOutPause(%04X)\n", hWaveOut);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_PAUSE, lpDesc->dwInstance, 0L, 0L); return wodMessage( MMSYSTEM_FirstDevID(), WODM_PAUSE, lpDesc->dwInstance, 0L, 0L);
} }
/************************************************************************** /**************************************************************************
@ -1619,7 +1635,7 @@ UINT16 waveOutRestart(HWAVEOUT16 hWaveOut)
dprintf_mmsys(stddeb, "waveOutRestart(%04X)\n", hWaveOut); dprintf_mmsys(stddeb, "waveOutRestart(%04X)\n", hWaveOut);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_RESTART, lpDesc->dwInstance, 0L, 0L); return wodMessage( MMSYSTEM_FirstDevID(), WODM_RESTART, lpDesc->dwInstance, 0L, 0L);
} }
/************************************************************************** /**************************************************************************
@ -1631,7 +1647,7 @@ UINT16 waveOutReset(HWAVEOUT16 hWaveOut)
dprintf_mmsys(stddeb, "waveOutReset(%04X)\n", hWaveOut); dprintf_mmsys(stddeb, "waveOutReset(%04X)\n", hWaveOut);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_RESET, lpDesc->dwInstance, 0L, 0L); return wodMessage( MMSYSTEM_FirstDevID(), WODM_RESET, lpDesc->dwInstance, 0L, 0L);
} }
/************************************************************************** /**************************************************************************
@ -1643,7 +1659,7 @@ UINT16 waveOutGetPosition(HWAVEOUT16 hWaveOut, MMTIME * lpTime, UINT16 uSize)
dprintf_mmsys(stddeb, "waveOutGetPosition(%04X, %p, %u);\n", hWaveOut, lpTime, uSize); dprintf_mmsys(stddeb, "waveOutGetPosition(%04X, %p, %u);\n", hWaveOut, lpTime, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_GETPOS, lpDesc->dwInstance, return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPOS, lpDesc->dwInstance,
(DWORD)lpTime, (DWORD)uSize); (DWORD)lpTime, (DWORD)uSize);
} }
@ -1656,7 +1672,7 @@ UINT16 waveOutGetPitch(HWAVEOUT16 hWaveOut, DWORD * lpdwPitch)
dprintf_mmsys(stddeb, "waveOutGetPitch(%04X, %p);\n", hWaveOut, lpdwPitch); dprintf_mmsys(stddeb, "waveOutGetPitch(%04X, %p);\n", hWaveOut, lpdwPitch);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_GETPITCH, lpDesc->dwInstance, return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPITCH, lpDesc->dwInstance,
(DWORD)lpdwPitch, 0L); (DWORD)lpdwPitch, 0L);
} }
@ -1669,7 +1685,7 @@ UINT16 waveOutSetPitch(HWAVEOUT16 hWaveOut, DWORD dwPitch)
dprintf_mmsys(stddeb, "waveOutSetPitch(%04X, %08lX);\n", hWaveOut, dwPitch); dprintf_mmsys(stddeb, "waveOutSetPitch(%04X, %08lX);\n", hWaveOut, dwPitch);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_SETPITCH, lpDesc->dwInstance, (DWORD)dwPitch, 0L); return wodMessage( MMSYSTEM_FirstDevID(), WODM_SETPITCH, lpDesc->dwInstance, (DWORD)dwPitch, 0L);
} }
/************************************************************************** /**************************************************************************
@ -1699,7 +1715,7 @@ UINT16 waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD * lpdwRate)
dprintf_mmsys(stddeb, "waveOutGetPlaybackRate(%04X, %p);\n", hWaveOut, lpdwRate); dprintf_mmsys(stddeb, "waveOutGetPlaybackRate(%04X, %p);\n", hWaveOut, lpdwRate);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_GETPLAYBACKRATE, lpDesc->dwInstance, return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPLAYBACKRATE, lpDesc->dwInstance,
(DWORD)lpdwRate, 0L); (DWORD)lpdwRate, 0L);
} }
@ -1712,7 +1728,7 @@ UINT16 waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD dwRate)
dprintf_mmsys(stddeb, "waveOutSetPlaybackRate(%04X, %08lX);\n", hWaveOut, dwRate); dprintf_mmsys(stddeb, "waveOutSetPlaybackRate(%04X, %08lX);\n", hWaveOut, dwRate);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_SETPLAYBACKRATE, return wodMessage( MMSYSTEM_FirstDevID(), WODM_SETPLAYBACKRATE,
lpDesc->dwInstance, (DWORD)dwRate, 0L); lpDesc->dwInstance, (DWORD)dwRate, 0L);
} }
@ -1752,7 +1768,7 @@ DWORD waveOutMessage(HWAVEOUT16 hWaveOut, UINT16 uMessage,
hWaveOut, uMessage, dwParam1, dwParam2); hWaveOut, uMessage, dwParam1, dwParam2);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, uMessage, lpDesc->dwInstance, dwParam1, dwParam2); return wodMessage( MMSYSTEM_FirstDevID(), uMessage, lpDesc->dwInstance, dwParam1, dwParam2);
} }
/************************************************************************** /**************************************************************************

View File

@ -6,6 +6,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/Xutil.h> #include <X11/Xutil.h>
#include "gdi.h" #include "gdi.h"
@ -28,29 +29,6 @@ GC BITMAP_monoGC = 0, BITMAP_colorGC = 0;
extern void CLIPPING_UpdateGCRegion( DC * dc ); /* objects/clipping.c */ extern void CLIPPING_UpdateGCRegion( DC * dc ); /* objects/clipping.c */
/***********************************************************************
* BITMAP_BmpToImage
*
* Create an XImage pointing to the bitmap data.
*/
static XImage *BITMAP_BmpToImage( BITMAP16 * bmp, LPVOID bmpData )
{
extern void _XInitImageFuncPtrs( XImage* );
XImage * image;
image = XCreateImage( display, DefaultVisualOfScreen(screen),
bmp->bmBitsPixel, ZPixmap, 0, bmpData,
bmp->bmWidth, bmp->bmHeight, 16, bmp->bmWidthBytes );
if (!image) return 0;
image->byte_order = MSBFirst;
image->bitmap_bit_order = MSBFirst;
image->bitmap_unit = 16;
_XInitImageFuncPtrs(image);
return image;
}
/*********************************************************************** /***********************************************************************
* CreateBitmap16 (GDI.48) * CreateBitmap16 (GDI.48)
*/ */
@ -172,8 +150,10 @@ LONG GetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPVOID buffer )
LONG GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer ) LONG GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
{ {
BITMAPOBJ * bmp; BITMAPOBJ * bmp;
LONG height; LONG height,widthbytes;
XImage * image; XImage * image;
LPBYTE tmpbuffer,tbuf;
int h,w,pad;
/* KLUDGE! */ /* KLUDGE! */
if (count < 0) { if (count < 0) {
@ -191,12 +171,111 @@ LONG GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
1 << bmp->bitmap.bmBitsPixel, buffer, height ); 1 << bmp->bitmap.bmBitsPixel, buffer, height );
if (!height) return 0; if (!height) return 0;
if (!(image = BITMAP_BmpToImage( &bmp->bitmap, buffer ))) return 0; switch (bmp->bitmap.bmBitsPixel) {
case 1:
if (!(bmp->bitmap.bmWidth & 15))
pad = 0;
else
pad = ((16 - (bmp->bitmap.bmWidth & 15)) + 7) / 8;
break;
case 4:
if (!(bmp->bitmap.bmWidth & 3))
pad = 0;
else
pad = ((4 - (bmp->bitmap.bmWidth & 3)) + 1) / 2;
break;
case 8:
pad = (2 - (bmp->bitmap.bmWidth & 1)) & 1;
break;
case 15:
case 16:
pad = 0; /* we have 16bit alignment already */
break;
case 24:
pad = (bmp->bitmap.bmWidth*3) & 1;
break;
default:
fprintf(stderr,"GetBitMapBits32: unknown depth %d, please report.\n",
bmp->bitmap.bmBitsPixel
);
return 0;
}
widthbytes = DIB_GetImageWidthBytesX11(bmp->bitmap.bmWidth,bmp->bitmap.bmBitsPixel);
tmpbuffer = (LPBYTE)xmalloc(widthbytes*height);
image = XCreateImage( display, DefaultVisualOfScreen(screen),
bmp->bitmap.bmBitsPixel, ZPixmap, 0, tmpbuffer,
bmp->bitmap.bmWidth,height,32,widthbytes
);
CallTo32_LargeStack( (int(*)())XGetSubImage, 11, CallTo32_LargeStack( (int(*)())XGetSubImage, 11,
display, bmp->pixmap, 0, 0, bmp->bitmap.bmWidth, display, bmp->pixmap, 0, 0, bmp->bitmap.bmWidth,
height, AllPlanes, ZPixmap, image, 0, 0 ); height, AllPlanes, ZPixmap, image, 0, 0 );
image->data = NULL;
XDestroyImage( image ); /* copy XImage to 16 bit padded image buffer with real bitsperpixel */
tbuf = buffer;
switch (bmp->bitmap.bmBitsPixel)
{
case 1:
for (h=0;h<height;h++)
{
*tbuf = 0;
for (w=0;w<bmp->bitmap.bmWidth;w++)
{
*tbuf |= XGetPixel(image,w,h)<<(7-(w&7));
if ((w&7) == 7) *(++tbuf) = 0;
}
tbuf += pad;
}
break;
case 4:
for (h=0;h<height;h++)
{
for (w=0;w<bmp->bitmap.bmWidth;w++)
{
if (!(w & 1)) *tbuf = XGetPixel( image, w, h) << 4;
else *tbuf++ |= XGetPixel( image, w, h) & 0x0f;
}
tbuf += pad;
}
break;
case 8:
for (h=0;h<height;h++)
{
for (w=0;w<bmp->bitmap.bmWidth;w++)
*tbuf++ = XGetPixel(image,w,h);
tbuf += pad;
}
break;
case 15:
case 16:
for (h=0;h<height;h++)
{
for (w=0;w<bmp->bitmap.bmWidth;w++)
{
long pixel = XGetPixel(image,w,h);
*tbuf++ = pixel & 0xff;
*tbuf++ = (pixel>>8) & 0xff;
}
}
break;
case 24:
for (h=0;h<height;h++)
{
for (w=0;w<bmp->bitmap.bmWidth;w++)
{
long pixel = XGetPixel(image,w,h);
*tbuf++ = pixel & 0xff;
*tbuf++ = (pixel>> 8) & 0xff;
*tbuf++ = (pixel>>16) & 0xff;
}
tbuf += pad;
}
}
XDestroyImage( image ); /* frees tbuffer too */
return height * bmp->bitmap.bmWidthBytes; return height * bmp->bitmap.bmWidthBytes;
} }
@ -218,6 +297,8 @@ LONG SetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPCVOID buffer )
BITMAPOBJ * bmp; BITMAPOBJ * bmp;
LONG height; LONG height;
XImage * image; XImage * image;
LPBYTE sbuf,tmpbuffer;
int w,h,pad,widthbytes;
/* KLUDGE! */ /* KLUDGE! */
if (count < 0) { if (count < 0) {
@ -236,12 +317,107 @@ LONG SetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPCVOID buffer )
if (height > bmp->bitmap.bmHeight) height = bmp->bitmap.bmHeight; if (height > bmp->bitmap.bmHeight) height = bmp->bitmap.bmHeight;
if (!height) return 0; if (!height) return 0;
if (!(image = BITMAP_BmpToImage( &bmp->bitmap, (LPVOID)buffer ))) return 0; switch (bmp->bitmap.bmBitsPixel) {
case 1:
if (!(bmp->bitmap.bmWidth & 15))
pad = 0;
else
pad = ((16 - (bmp->bitmap.bmWidth & 15)) + 7) / 8;
break;
case 4:
if (!(bmp->bitmap.bmWidth & 3))
pad = 0;
else
pad = ((4 - (bmp->bitmap.bmWidth & 3)) + 1) / 2;
break;
case 8:
pad = (2 - (bmp->bitmap.bmWidth & 1)) & 1;
break;
case 15:
case 16:
pad = 0; /* we have 16bit alignment already */
break;
case 24:
pad = (bmp->bitmap.bmWidth*3) & 1;
break;
default:
fprintf(stderr,"SetBitMapBits32: unknown depth %d, please report.\n",
bmp->bitmap.bmBitsPixel
);
return 0;
}
sbuf = (LPBYTE)buffer;
widthbytes = DIB_GetImageWidthBytesX11(bmp->bitmap.bmWidth,bmp->bitmap.bmBitsPixel);
tmpbuffer = (LPBYTE)xmalloc(widthbytes*height);
image = XCreateImage( display, DefaultVisualOfScreen(screen),
bmp->bitmap.bmBitsPixel, ZPixmap, 0, tmpbuffer,
bmp->bitmap.bmWidth,height,32,widthbytes
);
/* copy 16 bit padded image buffer with real bitsperpixel to XImage */
sbuf = (LPBYTE)buffer;
switch (bmp->bitmap.bmBitsPixel)
{
case 1:
for (h=0;h<height;h++)
{
for (w=0;w<bmp->bitmap.bmWidth;w++)
{
XPutPixel(image,w,h,(sbuf[0]>>(7-(w&7))) & 1);
if ((w&7) == 7)
sbuf++;
}
sbuf += pad;
}
break;
case 4:
for (h=0;h<height;h++)
{
for (w=0;w<bmp->bitmap.bmWidth;w++)
{
if (!(w & 1)) XPutPixel( image, w, h, *sbuf >> 4 );
else XPutPixel( image, w, h, *sbuf++ & 0xf );
}
sbuf += pad;
}
break;
case 8:
for (h=0;h<height;h++)
{
for (w=0;w<bmp->bitmap.bmWidth;w++)
XPutPixel(image,w,h,*sbuf++);
sbuf += pad;
}
break;
case 15:
case 16:
for (h=0;h<height;h++)
{
for (w=0;w<bmp->bitmap.bmWidth;w++)
{
XPutPixel(image,w,h,sbuf[1]*256+sbuf[0]);
sbuf+=2;
}
}
break;
case 24:
for (h=0;h<height;h++)
{
for (w=0;w<bmp->bitmap.bmWidth;w++)
{
XPutPixel(image,w,h,(sbuf[2]<<16)+(sbuf[1]<<8)+sbuf[0]);
sbuf += 3;
}
sbuf += pad;
}
break;
}
CallTo32_LargeStack( XPutImage, 10, CallTo32_LargeStack( XPutImage, 10,
display, bmp->pixmap, BITMAP_GC(bmp), image, 0, 0, display, bmp->pixmap, BITMAP_GC(bmp), image, 0, 0,
0, 0, bmp->bitmap.bmWidth, height ); 0, 0, bmp->bitmap.bmWidth, height );
image->data = NULL; XDestroyImage( image ); /* frees tmpbuffer too */
XDestroyImage( image );
return height * bmp->bitmap.bmWidthBytes; return height * bmp->bitmap.bmWidthBytes;
} }

View File

@ -821,6 +821,11 @@ static BOOL32 CURSORICON_SetCursor( HCURSOR16 hCursor )
/* Create a pixmap and transfer all the bits to it */ /* Create a pixmap and transfer all the bits to it */
/* NOTE: Following hack works, but only because XFree depth
* 1 images really use 1 bit/pixel (and so the same layout
* as the Windows cursor data). Perhaps use a more generic
* algorithm here.
*/
pixmapAll = XCreatePixmap( display, rootWindow, pixmapAll = XCreatePixmap( display, rootWindow,
ptr->nWidth, ptr->nHeight * 2, 1 ); ptr->nWidth, ptr->nHeight * 2, 1 );
image = XCreateImage( display, DefaultVisualOfScreen(screen), image = XCreateImage( display, DefaultVisualOfScreen(screen),

View File

@ -800,7 +800,7 @@ INT32 GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
BITMAPOBJ * bmp; BITMAPOBJ * bmp;
PALETTEENTRY * palEntry; PALETTEENTRY * palEntry;
PALETTEOBJ * palette; PALETTEOBJ * palette;
XImage * bmpImage, * dibImage; XImage * bmpImage;
int i, x, y; int i, x, y;
if (!lines) return 0; if (!lines) return 0;
@ -864,7 +864,7 @@ INT32 GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
switch( info->bmiHeader.biBitCount ) switch( info->bmiHeader.biBitCount )
{ {
case 8: case 8:
/* pad up to 32 bit (FIXME: not 16? ) */
pad += (4 - (info->bmiHeader.biWidth & 3)) & 3; pad += (4 - (info->bmiHeader.biWidth & 3)) & 3;
for( y = yend - 1; (int)y >= (int)startscan; y-- ) for( y = yend - 1; (int)y >= (int)startscan; y-- )
{ {
@ -873,33 +873,72 @@ INT32 GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
bbits += pad; bbits += pad;
} }
break; break;
case 1:
/* add more bpp-specific shortcuts here */ pad += ((32 - (info->bmiHeader.biWidth & 31)) / 8) & 3;
default:
dibImage = XCreateImage(display, DefaultVisualOfScreen( screen ),
info->bmiHeader.biBitCount, ZPixmap, 0, bits,
info->bmiHeader.biWidth, info->bmiHeader.biHeight,
32, DIB_GetImageWidthBytesX11(info->bmiHeader.biWidth,
info->bmiHeader.biBitCount ) );
if( dibImage )
{
extern void _XInitImageFuncPtrs( XImage* );
dibImage->byte_order = MSBFirst;
dibImage->bitmap_bit_order = MSBFirst;
dibImage->bitmap_unit = 16;
_XInitImageFuncPtrs( dibImage );
for( y = yend - 1; (int)y >= (int)startscan; y-- ) for( y = yend - 1; (int)y >= (int)startscan; y-- )
for (x = 0; x < xend; x++) {
XPutPixel( dibImage, x, yend - y + 1, *bbits = 0;
XGetPixel( bmpImage, x, y )); for( x = 0; x < xend; x++ ) {
dibImage->data = NULL;
XDestroyImage( dibImage ); *bbits |= XGetPixel( bmpImage, x, y)<<(7-(x&7));
if ((x&7)==7) {
bbits++;
*bbits=0;
} }
} }
bbits += pad;
}
break;
case 4:
pad += ((8 - (info->bmiHeader.biWidth & 7)) / 2) & 3;
for( y = yend - 1; (int)y >= (int)startscan; y-- )
{
*bbits = 0;
for( x = 0; x < xend; x++ ) {
*bbits |= XGetPixel( bmpImage, x, y)<<(4*(1-(x&1)));
if ((x&1)==1) {
bbits++;
*bbits=0;
}
}
bbits += pad;
}
break;
case 15:
case 16:
pad += (4 - ((info->bmiHeader.biWidth*2) & 3)) & 3;
for( y = yend - 1; (int)y >= (int)startscan; y-- )
{
*bbits = 0;
for( x = 0; x < xend; x++ ) {
unsigned long pixel=XGetPixel( bmpImage, x, y);
*bbits++ = pixel & 0xff;
*bbits++ = (pixel >> 8) & 0xff;
}
bbits += pad;
}
break;
case 24:
pad += (4 - ((info->bmiHeader.biWidth*3) & 3)) & 3;
for( y = yend - 1; (int)y >= (int)startscan; y-- )
{
*bbits = 0;
for( x = 0; x < xend; x++ ) {
unsigned long pixel=XGetPixel( bmpImage, x, y);
*bbits++ = (pixel >>16) & 0xff;
*bbits++ = (pixel >> 8) & 0xff;
*bbits++ = pixel & 0xff;
}
bbits += pad;
}
break;
default:
fprintf(stderr,"GetDIBits*: unsupported depth %d\n",
info->bmiHeader.biBitCount
);
break;
}
XDestroyImage( bmpImage ); XDestroyImage( bmpImage );

View File

@ -728,6 +728,18 @@ void PlayMetaFileRecord16( HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
SelectClipRgn32(hdc, *(ht->objectHandle + *(mr->rdParam))); SelectClipRgn32(hdc, *(ht->objectHandle + *(mr->rdParam)));
break; break;
case META_DIBCREATEPATTERNBRUSH:
/* *(mr->rdParam) may be BS_PATTERN or BS_DIBPATTERN: but there's no difference */
dprintf_metafile(stddeb,"META_DIBCREATEPATTERNBRUSH: %d\n",*(mr->rdParam));
s1 = mr->rdSize * 2 - sizeof(METARECORD) - 2;
hndl = GlobalAlloc16(GMEM_MOVEABLE, s1);
ptr = GlobalLock16(hndl);
memcpy(ptr, mr->rdParam + 2, s1);
GlobalUnlock16(hndl);
MF_AddHandle(ht, nHandles,CreateDIBPatternBrush16(hndl, *(mr->rdParam + 1)));
GlobalFree16(hndl);
break;
#define META_UNIMP(x) case x: fprintf(stderr,"PlayMetaFileRecord:record type "#x" not implemented.\n");break; #define META_UNIMP(x) case x: fprintf(stderr,"PlayMetaFileRecord:record type "#x" not implemented.\n");break;
META_UNIMP(META_SETTEXTCHAREXTRA) META_UNIMP(META_SETTEXTCHAREXTRA)
META_UNIMP(META_SETTEXTJUSTIFICATION) META_UNIMP(META_SETTEXTJUSTIFICATION)
@ -738,7 +750,6 @@ void PlayMetaFileRecord16( HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
META_UNIMP(META_SETPALENTRIES) META_UNIMP(META_SETPALENTRIES)
META_UNIMP(META_RESIZEPALETTE) META_UNIMP(META_RESIZEPALETTE)
META_UNIMP(META_DIBBITBLT) META_UNIMP(META_DIBBITBLT)
META_UNIMP(META_DIBCREATEPATTERNBRUSH)
META_UNIMP(META_EXTFLOODFILL) META_UNIMP(META_EXTFLOODFILL)
META_UNIMP(META_RESETDC) META_UNIMP(META_RESETDC)
META_UNIMP(META_STARTDOC) META_UNIMP(META_STARTDOC)

View File

@ -63,8 +63,8 @@ THDB *THREAD_Create( PDB32 *pdb, DWORD stack_size,
/* Set a guard page at the bottom of the stack */ /* Set a guard page at the bottom of the stack */
VirtualProtect( thdb->stack_base, 1, PAGE_EXECUTE_READWRITE | PAGE_GUARD, VirtualProtect( thdb->stack_base, 1, PAGE_EXECUTE_READWRITE | PAGE_GUARD,
&old_prot ); &old_prot );
thdb->teb.stack_top = (char *)thdb->stack_base + stack_size; thdb->teb.stack_top = (char *)thdb->stack_base + stack_size - 1;
thdb->teb.stack_low = thdb->teb.stack_top; thdb->teb.stack_low = thdb->stack_base;
thdb->exit_stack = thdb->teb.stack_top; thdb->exit_stack = thdb->teb.stack_top;
/* Allocate the TEB selector (%fs register) */ /* Allocate the TEB selector (%fs register) */

View File

@ -5,7 +5,7 @@
*/ */
#include <stdio.h> #include <stdio.h>
#include <malloc.h> #include <stdlib.h>
#include "windows.h" #include "windows.h"
#include "winerror.h" #include "winerror.h"
#include "winnls.h" #include "winnls.h"

View File

@ -5,7 +5,7 @@
*/ */
#include <stdio.h> #include <stdio.h>
#include <malloc.h> #include <stdlib.h>
#include "windows.h" #include "windows.h"
#include "winerror.h" #include "winerror.h"
#include "wincon.h" #include "wincon.h"

View File

@ -7,7 +7,7 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <malloc.h> #include <stdlib.h>
#include "windows.h" #include "windows.h"
#include "winerror.h" #include "winerror.h"
#include "handle32.h" #include "handle32.h"

View File

@ -7,12 +7,14 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/times.h>
#include "windows.h" #include "windows.h"
#include "winerror.h" #include "winerror.h"
#include "heap.h" #include "heap.h"
#include "thread.h" #include "thread.h"
#include "handle32.h" #include "handle32.h"
#include "pe_image.h" #include "pe_image.h"
#include "file.h"
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
@ -312,6 +314,7 @@ BOOL32 ResetEvent (HANDLE32 h)
fprintf(stderr,"ResetEvent(%d) stub\n",h); fprintf(stderr,"ResetEvent(%d) stub\n",h);
return 0; return 0;
} }
/*********************************************************************** /***********************************************************************
* WaitForSingleObject (KERNEL32.561) * WaitForSingleObject (KERNEL32.561)
*/ */
@ -320,6 +323,21 @@ DWORD WaitForSingleObject(HANDLE32 h, DWORD timeout)
fprintf(stderr,"WaitForSingleObject(%d,%ld) stub\n",h,timeout); fprintf(stderr,"WaitForSingleObject(%d,%ld) stub\n",h,timeout);
return 0; return 0;
} }
/***********************************************************************
* WaitForSingleObject (USER32.399)
*/
DWORD MsgWaitForMultipleObjects(
DWORD nCount,HANDLE32 *pHandles,BOOL32 fWaitAll,DWORD dwMilliseconds,
DWORD dwWakeMask
) {
int i;
fprintf(stderr,"MsgWaitForMultipleObjects(%ld,[",nCount);
for (i=0;i<nCount;i++)
fprintf(stderr,"%ld,",(DWORD)pHandles[i]);
fprintf(stderr,"],%d,%ld,0x%08lx)\n",fWaitAll,dwMilliseconds,dwWakeMask);
return 0;
}
/*********************************************************************** /***********************************************************************
* DuplicateHandle (KERNEL32.78) * DuplicateHandle (KERNEL32.78)
*/ */
@ -425,3 +443,28 @@ CreateProcess32A(
); );
return TRUE; return TRUE;
} }
BOOL32
ContinueDebugEvent(DWORD pid,DWORD tid,DWORD contstatus) {
fprintf(stderr,"ContinueDebugEvent(%ld,%ld,%ld), stub\n",pid,tid,contstatus);
return TRUE;
}
/*********************************************************************
* GetProcessTimes [KERNEL32.262]
*
* FIXME: implement this better ...
*/
BOOL32
GetProcessTimes(
HANDLE32 hprocess,LPFILETIME lpCreationTime,LPFILETIME lpExitTime,
LPFILETIME lpKernelTime, LPFILETIME lpUserTime
) {
struct tms tms;
times(&tms);
DOSFS_UnixTimeToFileTime(tms.tms_utime,lpUserTime,0);
DOSFS_UnixTimeToFileTime(tms.tms_stime,lpKernelTime,0);
return TRUE;
}

View File

@ -234,22 +234,22 @@ static BOOL32 DCE_GetVisRect( WND *wndPtr, BOOL32 clientArea, RECT16 *lprect )
* removing from the given region the rectangle of each window offset * removing from the given region the rectangle of each window offset
* by a given amount. The new region is returned, and the original one * by a given amount. The new region is returned, and the original one
* is destroyed. Used to implement DCX_CLIPSIBLINGS and * is destroyed. Used to implement DCX_CLIPSIBLINGS and
* DCX_CLIPCHILDREN styles. * DCX_CLIPCHILDREN styles. Now it skips managed windows
* because we have no idea about decoration size anyway.
*/ */
static HRGN32 DCE_ClipWindows( WND *pWndStart, WND *pWndEnd, static HRGN32 DCE_ClipWindows( WND *pWndStart, WND *pWndEnd,
HRGN32 hrgn, int xoffset, int yoffset ) HRGN32 hrgn, int xoffset, int yoffset )
{ {
HRGN32 hrgnNew; HRGN32 hrgnNew;
if (!pWndStart) return hrgn; if ( pWndStart == NULL ) return hrgn;
if (!(hrgnNew = CreateRectRgn32( 0, 0, 0, 0 ))) if ( (hrgnNew = CreateRectRgn32( 0, 0, 0, 0 )) )
{ {
DeleteObject32( hrgn );
return 0;
}
for (; pWndStart != pWndEnd; pWndStart = pWndStart->next) for (; pWndStart != pWndEnd; pWndStart = pWndStart->next)
{ {
if (!(pWndStart->dwStyle & WS_VISIBLE)) continue; if ( !(pWndStart->dwStyle & WS_VISIBLE) ||
(pWndStart->flags & WIN_MANAGED) ) continue;
SetRectRgn32( hrgnNew, pWndStart->rectWindow.left + xoffset, SetRectRgn32( hrgnNew, pWndStart->rectWindow.left + xoffset,
pWndStart->rectWindow.top + yoffset, pWndStart->rectWindow.top + yoffset,
pWndStart->rectWindow.right + xoffset, pWndStart->rectWindow.right + xoffset,
@ -257,6 +257,8 @@ static HRGN32 DCE_ClipWindows( WND *pWndStart, WND *pWndEnd,
if (!CombineRgn32( hrgn, hrgn, hrgnNew, RGN_DIFF )) break; if (!CombineRgn32( hrgn, hrgn, hrgnNew, RGN_DIFF )) break;
} }
DeleteObject32( hrgnNew ); DeleteObject32( hrgnNew );
} else pWndEnd = NULL;
if (pWndStart != pWndEnd) /* something went wrong */ if (pWndStart != pWndEnd) /* something went wrong */
{ {
DeleteObject32( hrgn ); DeleteObject32( hrgn );
@ -281,9 +283,6 @@ HRGN32 DCE_GetVisRgn( HWND32 hwnd, WORD flags )
WND *wndPtr = WIN_FindWndPtr( hwnd ); WND *wndPtr = WIN_FindWndPtr( hwnd );
/* Get visible rectangle and create a region with it. /* Get visible rectangle and create a region with it.
* do we really need to calculate vis rgns for X windows?
* - yes, to clip child windows but we should skip
* siblings in this case.
*/ */
if (!wndPtr || !DCE_GetVisRect( wndPtr, !(flags & DCX_WINDOW), &rect )) if (!wndPtr || !DCE_GetVisRect( wndPtr, !(flags & DCX_WINDOW), &rect ))

View File

@ -412,7 +412,7 @@ LRESULT DefWindowProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam,
case WM_SETTEXT: case WM_SETTEXT:
DEFWND_SetText( wndPtr, (LPSTR)PTR_SEG_TO_LIN(lParam) ); DEFWND_SetText( wndPtr, (LPSTR)PTR_SEG_TO_LIN(lParam) );
NC_HandleNCPaint( hwnd , (HRGN32)1 ); /* Repaint caption */ if( wndPtr->dwStyle & WS_CAPTION ) NC_HandleNCPaint( hwnd , (HRGN32)1 );
break; break;
default: default:

View File

@ -1565,11 +1565,12 @@ static BOOL32 DIALOG_DlgDirSelect( HWND32 hwnd, LPSTR str, INT32 len,
* *
* Helper function for DlgDirList* * Helper function for DlgDirList*
*/ */
static INT32 DIALOG_DlgDirList( HWND32 hDlg, LPCSTR spec, INT32 idLBox, static INT32 DIALOG_DlgDirList( HWND32 hDlg, LPSTR spec, INT32 idLBox,
INT32 idStatic, UINT32 attrib, BOOL32 combo ) INT32 idStatic, UINT32 attrib, BOOL32 combo )
{ {
int drive; int drive;
HWND32 hwnd; HWND32 hwnd;
LPSTR orig_spec = spec;
#define SENDMSG(msg,wparam,lparam) \ #define SENDMSG(msg,wparam,lparam) \
((attrib & DDL_POSTMSGS) ? PostMessage32A( hwnd, msg, wparam, lparam ) \ ((attrib & DDL_POSTMSGS) ? PostMessage32A( hwnd, msg, wparam, lparam ) \
@ -1586,41 +1587,42 @@ static INT32 DIALOG_DlgDirList( HWND32 hDlg, LPCSTR spec, INT32 idLBox,
} }
else drive = DRIVE_GetCurrentDrive(); else drive = DRIVE_GetCurrentDrive();
if (idLBox && ((hwnd = GetDlgItem32( hDlg, idLBox )) != 0))
{
/* If the path exists and is a directory, chdir to it */ /* If the path exists and is a directory, chdir to it */
if (!spec || !spec[0] || DRIVE_Chdir( drive, spec )) spec = "*.*"; if (!spec || !spec[0] || DRIVE_Chdir( drive, spec )) spec = "*.*";
else else
{ {
const char *p, *p2; char *p, *p2;
p = spec; p = spec;
if ((p2 = strrchr( p, '\\' ))) p = p2 + 1; if ((p2 = strrchr( p, '\\' ))) p = p2;
if ((p2 = strrchr( p, '/' ))) p = p2 + 1; if ((p2 = strrchr( p, '/' ))) p = p2;
if (p != spec) if (p != spec)
{ {
BOOL32 ret = FALSE; char sep = *p;
char *dir = HeapAlloc( SystemHeap, 0, p - spec ); *p = 0;
if (dir) if (!DRIVE_Chdir( drive, spec ))
{ {
lstrcpyn32A( dir, spec, p - spec ); *p = sep; /* Restore the original spec */
ret = DRIVE_Chdir( drive, dir ); return FALSE;
HeapFree( SystemHeap, 0, dir );
} }
if (!ret) return FALSE; spec = p + 1;
spec = p;
} }
} }
dprintf_dialog( stddeb, "ListBoxDirectory: path=%c:\\%s mask=%s\n", dprintf_dialog( stddeb, "ListBoxDirectory: path=%c:\\%s mask=%s\n",
'A' + drive, DRIVE_GetDosCwd(drive), spec ); 'A' + drive, DRIVE_GetDosCwd(drive), spec );
if (idLBox && ((hwnd = GetDlgItem32( hDlg, idLBox )) != 0))
{
SENDMSG( combo ? CB_RESETCONTENT32 : LB_RESETCONTENT32, 0, 0 ); SENDMSG( combo ? CB_RESETCONTENT32 : LB_RESETCONTENT32, 0, 0 );
if ((attrib & DDL_DIRECTORY) && !(attrib & DDL_EXCLUSIVE)) if (attrib & DDL_DIRECTORY)
{
if (!(attrib & DDL_EXCLUSIVE))
{ {
if (SENDMSG( combo ? CB_DIR32 : LB_DIR32, if (SENDMSG( combo ? CB_DIR32 : LB_DIR32,
attrib & ~(DDL_DIRECTORY | DDL_DRIVES), attrib & ~(DDL_DIRECTORY | DDL_DRIVES),
(LPARAM)spec ) == LB_ERR) (LPARAM)spec ) == LB_ERR)
return FALSE; return FALSE;
}
if (SENDMSG( combo ? CB_DIR32 : LB_DIR32, if (SENDMSG( combo ? CB_DIR32 : LB_DIR32,
(attrib & (DDL_DIRECTORY | DDL_DRIVES)) | DDL_EXCLUSIVE, (attrib & (DDL_DIRECTORY | DDL_DRIVES)) | DDL_EXCLUSIVE,
(LPARAM)"*.*" ) == LB_ERR) (LPARAM)"*.*" ) == LB_ERR)
@ -1645,11 +1647,40 @@ static INT32 DIALOG_DlgDirList( HWND32 hDlg, LPCSTR spec, INT32 idLBox,
/* Can't use PostMessage() here, because the string is on the stack */ /* Can't use PostMessage() here, because the string is on the stack */
SetDlgItemText32A( hDlg, idStatic, temp ); SetDlgItemText32A( hDlg, idStatic, temp );
} }
if (orig_spec && (spec != orig_spec))
{
/* Update the original file spec */
char *p = spec;
while ((*orig_spec++ = *p++));
}
return TRUE; return TRUE;
#undef SENDMSG #undef SENDMSG
} }
/**********************************************************************
* DIALOG_DlgDirListW
*
* Helper function for DlgDirList*32W
*/
static INT32 DIALOG_DlgDirListW( HWND32 hDlg, LPWSTR spec, INT32 idLBox,
INT32 idStatic, UINT32 attrib, BOOL32 combo )
{
if (spec)
{
LPSTR specA = HEAP_strdupWtoA( GetProcessHeap(), 0, spec );
INT32 ret = DIALOG_DlgDirList( hDlg, specA, idLBox, idStatic,
attrib, combo );
lstrcpyAtoW( spec, specA );
HeapFree( GetProcessHeap(), 0, specA );
return ret;
}
return DIALOG_DlgDirList( hDlg, NULL, idLBox, idStatic, attrib, combo );
}
/********************************************************************** /**********************************************************************
* DlgDirSelect (USER.99) * DlgDirSelect (USER.99)
*/ */
@ -1725,7 +1756,7 @@ BOOL32 DlgDirSelectComboBoxEx32W( HWND32 hwnd, LPWSTR str, INT32 len, INT32 id)
/********************************************************************** /**********************************************************************
* DlgDirList16 (USER.100) * DlgDirList16 (USER.100)
*/ */
INT16 DlgDirList16( HWND16 hDlg, LPCSTR spec, INT16 idLBox, INT16 idStatic, INT16 DlgDirList16( HWND16 hDlg, LPSTR spec, INT16 idLBox, INT16 idStatic,
UINT16 attrib ) UINT16 attrib )
{ {
return DIALOG_DlgDirList( hDlg, spec, idLBox, idStatic, attrib, FALSE ); return DIALOG_DlgDirList( hDlg, spec, idLBox, idStatic, attrib, FALSE );
@ -1735,7 +1766,7 @@ INT16 DlgDirList16( HWND16 hDlg, LPCSTR spec, INT16 idLBox, INT16 idStatic,
/********************************************************************** /**********************************************************************
* DlgDirList32A (USER32.142) * DlgDirList32A (USER32.142)
*/ */
INT32 DlgDirList32A( HWND32 hDlg, LPCSTR spec, INT32 idLBox, INT32 idStatic, INT32 DlgDirList32A( HWND32 hDlg, LPSTR spec, INT32 idLBox, INT32 idStatic,
UINT32 attrib ) UINT32 attrib )
{ {
return DIALOG_DlgDirList( hDlg, spec, idLBox, idStatic, attrib, FALSE ); return DIALOG_DlgDirList( hDlg, spec, idLBox, idStatic, attrib, FALSE );
@ -1745,21 +1776,17 @@ INT32 DlgDirList32A( HWND32 hDlg, LPCSTR spec, INT32 idLBox, INT32 idStatic,
/********************************************************************** /**********************************************************************
* DlgDirList32W (USER32.145) * DlgDirList32W (USER32.145)
*/ */
INT32 DlgDirList32W( HWND32 hDlg, LPCWSTR spec, INT32 idLBox, INT32 idStatic, INT32 DlgDirList32W( HWND32 hDlg, LPWSTR spec, INT32 idLBox, INT32 idStatic,
UINT32 attrib ) UINT32 attrib )
{ {
INT32 ret; return DIALOG_DlgDirListW( hDlg, spec, idLBox, idStatic, attrib, FALSE );
LPSTR specA = HEAP_strdupWtoA( GetProcessHeap(), 0, spec );
ret = DIALOG_DlgDirList( hDlg, specA, idLBox, idStatic, attrib, FALSE );
HeapFree( GetProcessHeap(), 0, specA );
return ret;
} }
/********************************************************************** /**********************************************************************
* DlgDirListComboBox16 (USER.195) * DlgDirListComboBox16 (USER.195)
*/ */
INT16 DlgDirListComboBox16( HWND16 hDlg, LPCSTR spec, INT16 idCBox, INT16 DlgDirListComboBox16( HWND16 hDlg, LPSTR spec, INT16 idCBox,
INT16 idStatic, UINT16 attrib ) INT16 idStatic, UINT16 attrib )
{ {
return DIALOG_DlgDirList( hDlg, spec, idCBox, idStatic, attrib, TRUE ); return DIALOG_DlgDirList( hDlg, spec, idCBox, idStatic, attrib, TRUE );
@ -1769,7 +1796,7 @@ INT16 DlgDirListComboBox16( HWND16 hDlg, LPCSTR spec, INT16 idCBox,
/********************************************************************** /**********************************************************************
* DlgDirListComboBox32A (USER32.143) * DlgDirListComboBox32A (USER32.143)
*/ */
INT32 DlgDirListComboBox32A( HWND32 hDlg, LPCSTR spec, INT32 idCBox, INT32 DlgDirListComboBox32A( HWND32 hDlg, LPSTR spec, INT32 idCBox,
INT32 idStatic, UINT32 attrib ) INT32 idStatic, UINT32 attrib )
{ {
return DIALOG_DlgDirList( hDlg, spec, idCBox, idStatic, attrib, TRUE ); return DIALOG_DlgDirList( hDlg, spec, idCBox, idStatic, attrib, TRUE );
@ -1779,12 +1806,8 @@ INT32 DlgDirListComboBox32A( HWND32 hDlg, LPCSTR spec, INT32 idCBox,
/********************************************************************** /**********************************************************************
* DlgDirListComboBox32W (USER32.144) * DlgDirListComboBox32W (USER32.144)
*/ */
INT32 DlgDirListComboBox32W( HWND32 hDlg, LPCWSTR spec, INT32 idCBox, INT32 DlgDirListComboBox32W( HWND32 hDlg, LPWSTR spec, INT32 idCBox,
INT32 idStatic, UINT32 attrib ) INT32 idStatic, UINT32 attrib )
{ {
INT32 ret; return DIALOG_DlgDirListW( hDlg, spec, idCBox, idStatic, attrib, TRUE );
LPSTR specA = HEAP_strdupWtoA( GetProcessHeap(), 0, spec );
ret = DIALOG_DlgDirList( hDlg, specA, idCBox, idStatic, attrib, FALSE );
HeapFree( GetProcessHeap(), 0, specA );
return ret;
} }

View File

@ -82,11 +82,11 @@ static const char * const event_names[] =
/* Event handlers */ /* Event handlers */
static void EVENT_Key( XKeyEvent *event ); static void EVENT_Key( XKeyEvent *event );
static void EVENT_ButtonPress( XButtonEvent *event ); static void EVENT_ButtonPress( WND *pWnd, XButtonEvent *event );
static void EVENT_ButtonRelease( XButtonEvent *event ); static void EVENT_ButtonRelease( WND *pWnd, XButtonEvent *event );
static void EVENT_MotionNotify( XMotionEvent *event ); static void EVENT_MotionNotify( WND *pWnd, XMotionEvent *event );
static void EVENT_FocusIn( HWND32 hwnd, XFocusChangeEvent *event ); static void EVENT_FocusIn( WND *pWnd, XFocusChangeEvent *event );
static void EVENT_FocusOut( HWND32 hwnd, XFocusChangeEvent *event ); static void EVENT_FocusOut( WND *pWnd, XFocusChangeEvent *event );
static void EVENT_Expose( WND *pWnd, XExposeEvent *event ); static void EVENT_Expose( WND *pWnd, XExposeEvent *event );
static void EVENT_GraphicsExpose( WND *pWnd, XGraphicsExposeEvent *event ); static void EVENT_GraphicsExpose( WND *pWnd, XGraphicsExposeEvent *event );
static void EVENT_ConfigureNotify( HWND32 hwnd, XConfigureEvent *event ); static void EVENT_ConfigureNotify( HWND32 hwnd, XConfigureEvent *event );
@ -129,12 +129,12 @@ void EVENT_ProcessEvent( XEvent *event )
case ButtonPress: case ButtonPress:
if (InputEnabled) if (InputEnabled)
EVENT_ButtonPress( (XButtonEvent*)event ); EVENT_ButtonPress( pWnd, (XButtonEvent*)event );
break; break;
case ButtonRelease: case ButtonRelease:
if (InputEnabled) if (InputEnabled)
EVENT_ButtonRelease( (XButtonEvent*)event ); EVENT_ButtonRelease( pWnd, (XButtonEvent*)event );
break; break;
case MotionNotify: case MotionNotify:
@ -150,16 +150,16 @@ void EVENT_ProcessEvent( XEvent *event )
{ {
while (XCheckTypedWindowEvent(display,((XAnyEvent *)event)->window, while (XCheckTypedWindowEvent(display,((XAnyEvent *)event)->window,
MotionNotify, event)); MotionNotify, event));
EVENT_MotionNotify( (XMotionEvent*)event ); EVENT_MotionNotify( pWnd, (XMotionEvent*)event );
} }
break; break;
case FocusIn: case FocusIn:
EVENT_FocusIn( pWnd->hwndSelf, (XFocusChangeEvent*)event ); EVENT_FocusIn( pWnd, (XFocusChangeEvent*)event );
break; break;
case FocusOut: case FocusOut:
EVENT_FocusOut( pWnd->hwndSelf, (XFocusChangeEvent*)event ); EVENT_FocusOut( pWnd, (XFocusChangeEvent*)event );
break; break;
case Expose: case Expose:
@ -380,6 +380,108 @@ void EVENT_Synchronize()
} }
} }
/***********************************************************************
* EVENT_QueryZOrder
*
* Try to synchronize internal z-order with the window manager's.
*/
static BOOL32 __check_query_condition( WND** pWndA, WND** pWndB )
{
/* return TRUE if we have at least two managed windows */
for( *pWndB = NULL; *pWndA; *pWndA = (*pWndA)->next )
if( (*pWndA)->flags & WIN_MANAGED &&
(*pWndA)->dwStyle & WS_VISIBLE ) break;
if( *pWndA )
for( *pWndB = (*pWndA)->next; *pWndB; *pWndB = (*pWndB)->next )
if( (*pWndB)->flags & WIN_MANAGED &&
(*pWndB)->dwStyle & WS_VISIBLE ) break;
return ((*pWndB) != NULL);
}
static Window __get_common_ancestor( Window A, Window B,
Window** children, unsigned* total )
{
/* find the real root window */
Window root, *childrenB;
unsigned totalB;
do
{
if( *children ) XFree( *children );
XQueryTree( display, A, &root, &A, children, total );
XQueryTree( display, B, &root, &B, &childrenB, &totalB );
if( childrenB ) XFree( childrenB );
} while( A != B && A && B );
return ( A && B ) ? A : 0 ;
}
static Window __get_top_decoration( Window w, Window ancestor )
{
Window* children, root, prev = w, parent = w;
unsigned total;
do
{
w = parent;
XQueryTree( display, w, &root, &parent, &children, &total );
if( children ) XFree( children );
} while( parent && parent != ancestor );
dprintf_event( stddeb, "\t%08x -> %08x\n", (unsigned)prev, (unsigned)w );
return ( parent ) ? w : 0 ;
}
static unsigned __td_lookup( Window w, Window* list, unsigned max )
{
unsigned i;
for( i = 0; i < max; i++ ) if( list[i] == w ) break;
return i;
}
static BOOL32 EVENT_QueryZOrder( WND* pWndCheck )
{
BOOL32 bRet = FALSE;
HWND32 hwndInsertAfter = HWND_TOP;
WND* pWnd, *pWndZ = WIN_GetDesktop()->child;
Window w, parent, *children = NULL;
unsigned total, check, pos, best;
if( !__check_query_condition(&pWndZ, &pWnd) ) return TRUE;
parent = __get_common_ancestor( pWndZ->window, pWnd->window,
&children, &total );
if( parent )
{
w = __get_top_decoration( pWndCheck->window, parent );
if( w != children[total - 1] )
{
check = __td_lookup( w, children, total );
best = total;
for( pWnd = pWndZ; pWnd; pWnd = pWnd->next )
{
if( pWnd != pWndCheck )
{
if( !(pWnd->flags & WIN_MANAGED) ||
!(w = __get_top_decoration( pWnd->window, parent )) )
continue;
pos = __td_lookup( w, children, total );
if( pos < best && pos > check )
{
best = pos;
hwndInsertAfter = pWnd->hwndSelf;
}
if( check - best == 1 ) break;
}
}
WIN_UnlinkWindow( pWndCheck->hwndSelf );
WIN_LinkWindow( pWndCheck->hwndSelf, hwndInsertAfter);
}
}
if( children ) XFree( children );
return bRet;
}
/*********************************************************************** /***********************************************************************
* EVENT_XStateToKeyState * EVENT_XStateToKeyState
@ -455,11 +557,11 @@ static void EVENT_Key( XKeyEvent *event )
/*********************************************************************** /***********************************************************************
* EVENT_MotionNotify * EVENT_MotionNotify
*/ */
static void EVENT_MotionNotify( XMotionEvent *event ) static void EVENT_MotionNotify( WND *pWnd, XMotionEvent *event )
{ {
hardware_event( WM_MOUSEMOVE, EVENT_XStateToKeyState( event->state ), 0L, hardware_event( WM_MOUSEMOVE, EVENT_XStateToKeyState( event->state ), 0L,
event->x_root - desktopX, event->y_root - desktopY, event->x_root - desktopX, event->y_root - desktopY,
event->time - MSG_WineStartTicks, 0 ); event->time - MSG_WineStartTicks, (DWORD)pWnd->hwndSelf );
} }
@ -486,7 +588,7 @@ void EVENT_DummyMotionNotify(void)
/*********************************************************************** /***********************************************************************
* EVENT_ButtonPress * EVENT_ButtonPress
*/ */
static void EVENT_ButtonPress( XButtonEvent *event ) static void EVENT_ButtonPress( WND *pWnd, XButtonEvent *event )
{ {
static WORD messages[NB_BUTTONS] = static WORD messages[NB_BUTTONS] =
{ WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN }; { WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN };
@ -499,14 +601,14 @@ static void EVENT_ButtonPress( XButtonEvent *event )
hardware_event( messages[buttonNum], hardware_event( messages[buttonNum],
EVENT_XStateToKeyState( event->state ), 0L, EVENT_XStateToKeyState( event->state ), 0L,
event->x_root - desktopX, event->y_root - desktopY, event->x_root - desktopX, event->y_root - desktopY,
event->time - MSG_WineStartTicks, 0 ); event->time - MSG_WineStartTicks, (DWORD)pWnd->hwndSelf );
} }
/*********************************************************************** /***********************************************************************
* EVENT_ButtonRelease * EVENT_ButtonRelease
*/ */
static void EVENT_ButtonRelease( XButtonEvent *event ) static void EVENT_ButtonRelease( WND *pWnd, XButtonEvent *event )
{ {
static const WORD messages[NB_BUTTONS] = static const WORD messages[NB_BUTTONS] =
{ WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP }; { WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP };
@ -518,20 +620,27 @@ static void EVENT_ButtonRelease( XButtonEvent *event )
hardware_event( messages[buttonNum], hardware_event( messages[buttonNum],
EVENT_XStateToKeyState( event->state ), 0L, EVENT_XStateToKeyState( event->state ), 0L,
event->x_root - desktopX, event->y_root - desktopY, event->x_root - desktopX, event->y_root - desktopY,
event->time - MSG_WineStartTicks, 0 ); event->time - MSG_WineStartTicks, (DWORD)pWnd->hwndSelf );
} }
/********************************************************************** /**********************************************************************
* EVENT_FocusIn * EVENT_FocusIn
*/ */
static void EVENT_FocusIn( HWND32 hwnd, XFocusChangeEvent *event ) static void EVENT_FocusIn( WND *pWnd, XFocusChangeEvent *event )
{ {
if (event->detail == NotifyPointer) return; if (Options.managed) EVENT_QueryZOrder( pWnd );
if (hwnd != GetActiveWindow32()) WINPOS_ChangeActiveWindow( hwnd, FALSE );
if (event->detail != NotifyPointer)
{
HWND32 hwnd = pWnd->hwndSelf;
if (hwnd != GetActiveWindow32())
WINPOS_ChangeActiveWindow( hwnd, FALSE );
if ((hwnd != GetFocus32()) && !IsChild32( hwnd, GetFocus32())) if ((hwnd != GetFocus32()) && !IsChild32( hwnd, GetFocus32()))
SetFocus32( hwnd ); SetFocus32( hwnd );
} }
}
/********************************************************************** /**********************************************************************
@ -539,13 +648,18 @@ static void EVENT_FocusIn( HWND32 hwnd, XFocusChangeEvent *event )
* *
* Note: only top-level override-redirect windows get FocusOut events. * Note: only top-level override-redirect windows get FocusOut events.
*/ */
static void EVENT_FocusOut( HWND32 hwnd, XFocusChangeEvent *event ) static void EVENT_FocusOut( WND *pWnd, XFocusChangeEvent *event )
{ {
if (event->detail == NotifyPointer) return; if (event->detail != NotifyPointer)
if (hwnd == GetActiveWindow32()) WINPOS_ChangeActiveWindow( 0, FALSE ); {
HWND32 hwnd = pWnd->hwndSelf;
if (hwnd == GetActiveWindow32())
WINPOS_ChangeActiveWindow( 0, FALSE );
if ((hwnd == GetFocus32()) || IsChild32( hwnd, GetFocus32())) if ((hwnd == GetFocus32()) || IsChild32( hwnd, GetFocus32()))
SetFocus32( 0 ); SetFocus32( 0 );
} }
}
/********************************************************************** /**********************************************************************
* EVENT_CheckFocus * EVENT_CheckFocus
@ -582,16 +696,14 @@ static void EVENT_ConfigureNotify( HWND32 hwnd, XConfigureEvent *event )
} }
else else
{ {
WND *wndPtr; WND *wndPtr = WIN_FindWndPtr( hwnd );
WINDOWPOS16 *winpos; WINDOWPOS16 *winpos;
RECT16 newWindowRect, newClientRect; RECT16 newWindowRect, newClientRect;
HRGN32 hrgnOldPos, hrgnNewPos; HRGN32 hrgnOldPos, hrgnNewPos;
Window above = event->above;
if (!(wndPtr = WIN_FindWndPtr( hwnd )) || if (!wndPtr || !(wndPtr->flags & WIN_MANAGED) ||
!(wndPtr->flags & WIN_MANAGED) ) !(winpos = SEGPTR_NEW(WINDOWPOS16))) return;
return;
if (!(winpos = SEGPTR_NEW(WINDOWPOS16))) return;
/* Fill WINDOWPOS struct */ /* Fill WINDOWPOS struct */
winpos->flags = SWP_NOACTIVATE | SWP_NOZORDER; winpos->flags = SWP_NOACTIVATE | SWP_NOZORDER;
@ -630,12 +742,17 @@ static void EVENT_ConfigureNotify( HWND32 hwnd, XConfigureEvent *event )
wndPtr->rectWindow = newWindowRect; wndPtr->rectWindow = newWindowRect;
wndPtr->rectClient = newClientRect; wndPtr->rectClient = newClientRect;
SendMessage16( hwnd, WM_WINDOWPOSCHANGED, 0, (LPARAM)SEGPTR_GET(winpos)); SendMessage16( hwnd, WM_WINDOWPOSCHANGED, 0, (LPARAM)SEGPTR_GET(winpos));
SEGPTR_FREE(winpos); SEGPTR_FREE(winpos);
/* full window drag leaves unrepainted garbage without this */ if( IsWindow32( hwnd ) )
PAINT_RedrawWindow( 0, NULL, hrgnOldPos, RDW_INVALIDATE | if( above == None ) /* absolute bottom */
RDW_ALLCHILDREN | RDW_ERASE | RDW_ERASENOW, {
RDW_C_USEHRGN ); WIN_UnlinkWindow( hwnd );
WIN_LinkWindow( hwnd, HWND_BOTTOM);
}
else EVENT_QueryZOrder( wndPtr ); /* try to outsmart window manager */
DeleteObject32(hrgnOldPos); DeleteObject32(hrgnOldPos);
DeleteObject32(hrgnNewPos); DeleteObject32(hrgnNewPos);
} }

View File

@ -609,7 +609,7 @@ static LONG MDI_ChildActivate( WND *clientPtr, HWND16 hWndChild )
* *
* iTotal returns number of children available for tiling or cascading * iTotal returns number of children available for tiling or cascading
*/ */
static MDIWCL* MDI_BuildWCL(WND* clientWnd, INT16* iTotal) static MDIWCL* MDI_BuildWCL(WND* clientWnd, UINT16* iTotal)
{ {
MDIWCL *listTop,*listNext; MDIWCL *listTop,*listNext;
WND *childWnd; WND *childWnd;
@ -694,7 +694,8 @@ static HBITMAP16 CreateMDIMenuBitmap(void)
static LONG MDICascade(WND* clientWnd, MDICLIENTINFO *ci) static LONG MDICascade(WND* clientWnd, MDICLIENTINFO *ci)
{ {
MDIWCL *listTop,*listPrev; MDIWCL *listTop,*listPrev;
INT16 delta = 0,iToPosition = 0, n = 0; INT16 delta = 0, n = 0;
UINT16 iToPosition = 0;
POINT16 pos[2]; POINT16 pos[2];
if (ci->hwndChildMaximized) if (ci->hwndChildMaximized)
@ -744,7 +745,7 @@ static LONG MDITile(WND* wndClient, MDICLIENTINFO *ci,WORD wParam)
int rows, columns; int rows, columns;
int r, c; int r, c;
int i; int i;
INT16 iToPosition = 0; UINT16 iToPosition = 0;
if (ci->hwndChildMaximized) if (ci->hwndChildMaximized)
ShowWindow16(ci->hwndChildMaximized, SW_NORMAL); ShowWindow16(ci->hwndChildMaximized, SW_NORMAL);

View File

@ -23,6 +23,7 @@
#include "dde.h" #include "dde.h"
#include "queue.h" #include "queue.h"
#include "winproc.h" #include "winproc.h"
#include "options.h"
#include "stddebug.h" #include "stddebug.h"
/* #define DEBUG_MSG */ /* #define DEBUG_MSG */
#include "debug.h" #include "debug.h"
@ -59,8 +60,8 @@ BOOL32 MSG_CheckFilter(WORD uMsg, DWORD filter)
* to the user, left in the queue, or skipped entirely (in this case * to the user, left in the queue, or skipped entirely (in this case
* HIWORD contains hit test code). * HIWORD contains hit test code).
*/ */
static DWORD MSG_TranslateMouseMsg( HWND16 hWndScope, DWORD filter, static DWORD MSG_TranslateMouseMsg( HWND16 hTopWnd, DWORD filter,
MSG16 *msg, BOOL32 remove ) MSG16 *msg, BOOL32 remove, WND* pWndScope )
{ {
static DWORD dblclk_time_limit = 0; static DWORD dblclk_time_limit = 0;
static UINT16 clk_message = 0; static UINT16 clk_message = 0;
@ -86,10 +87,10 @@ static DWORD MSG_TranslateMouseMsg( HWND16 hWndScope, DWORD filter,
hWnd = GetCapture16(); hWnd = GetCapture16();
if( !hWnd ) if( !hWnd )
{ {
sendSC = 1; ht = hittest = WINPOS_WindowFromPoint( pWndScope, msg->pt, &pWnd );
ht = hittest = WINPOS_WindowFromPoint( WIN_GetDesktop(), msg->pt, &pWnd );
if( !pWnd ) pWnd = WIN_GetDesktop(); if( !pWnd ) pWnd = WIN_GetDesktop();
hWnd = pWnd->hwndSelf; hWnd = pWnd->hwndSelf;
sendSC = 1;
} }
else else
{ {
@ -111,8 +112,8 @@ static DWORD MSG_TranslateMouseMsg( HWND16 hWndScope, DWORD filter,
/* check if hWnd is within hWndScope */ /* check if hWnd is within hWndScope */
if( hWndScope && hWnd != hWndScope ) if( hTopWnd && hWnd != hTopWnd )
if( !IsChild16(hWndScope, hWnd) ) return SYSQ_MSG_CONTINUE; if( !IsChild16(hTopWnd, hWnd) ) return SYSQ_MSG_CONTINUE;
if( mouseClick ) if( mouseClick )
{ {
@ -229,7 +230,7 @@ static DWORD MSG_TranslateMouseMsg( HWND16 hWndScope, DWORD filter,
* *
* Translate an keyboard hardware event into a real message. * Translate an keyboard hardware event into a real message.
*/ */
static DWORD MSG_TranslateKbdMsg( HWND16 hWndScope, DWORD filter, static DWORD MSG_TranslateKbdMsg( HWND16 hTopWnd, DWORD filter,
MSG16 *msg, BOOL32 remove ) MSG16 *msg, BOOL32 remove )
{ {
WORD message = msg->message; WORD message = msg->message;
@ -260,8 +261,8 @@ static DWORD MSG_TranslateKbdMsg( HWND16 hWndScope, DWORD filter,
return SYSQ_MSG_ABANDON; return SYSQ_MSG_ABANDON;
} }
if (hWndScope && hWnd != hWndScope) if (hTopWnd && hWnd != hTopWnd)
if (!IsChild16(hWndScope, hWnd)) return SYSQ_MSG_CONTINUE; if (!IsChild16(hTopWnd, hWnd)) return SYSQ_MSG_CONTINUE;
if (!MSG_CheckFilter(message, filter)) return SYSQ_MSG_CONTINUE; if (!MSG_CheckFilter(message, filter)) return SYSQ_MSG_CONTINUE;
msg->hwnd = hWnd; msg->hwnd = hWnd;
@ -424,7 +425,11 @@ static BOOL32 MSG_PeekHardwareMsg( MSG16 *msg, HWND16 hwnd, DWORD filter,
if ((msg->message >= WM_MOUSEFIRST) && (msg->message <= WM_MOUSELAST)) if ((msg->message >= WM_MOUSEFIRST) && (msg->message <= WM_MOUSELAST))
{ {
status = MSG_TranslateMouseMsg(hwnd, filter, msg, remove); HWND32 hWndScope = (HWND32)sysMsgQueue->messages[pos].extraInfo;
status = MSG_TranslateMouseMsg(hwnd, filter, msg, remove,
(Options.managed && IsWindow32(hWndScope) )
? WIN_FindWndPtr(hWndScope) : WIN_GetDesktop() );
kbd_msg = 0; kbd_msg = 0;
} }
else if ((msg->message >= WM_KEYFIRST) && (msg->message <= WM_KEYLAST)) else if ((msg->message >= WM_KEYFIRST) && (msg->message <= WM_KEYLAST))

View File

@ -121,7 +121,7 @@ BOOL16 AdjustWindowRectEx16( LPRECT16 rect, DWORD style,
if (!(style & (WS_POPUP | WS_CHILD))) /* Overlapped window */ if (!(style & (WS_POPUP | WS_CHILD))) /* Overlapped window */
style |= WS_CAPTION; style |= WS_CAPTION;
style &= (WS_DLGFRAME | WS_BORDER | WS_THICKFRAME); style &= (WS_DLGFRAME | WS_BORDER | WS_THICKFRAME | WS_CHILD);
exStyle &= WS_EX_DLGMODALFRAME; exStyle &= WS_EX_DLGMODALFRAME;
if (exStyle & WS_EX_DLGMODALFRAME) style &= ~WS_THICKFRAME; if (exStyle & WS_EX_DLGMODALFRAME) style &= ~WS_THICKFRAME;
@ -277,8 +277,7 @@ static void NC_GetInsideRect( HWND32 hwnd, RECT32 *rect )
rect->right = wndPtr->rectWindow.right - wndPtr->rectWindow.left; rect->right = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
rect->bottom = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top; rect->bottom = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
if (wndPtr->dwStyle & WS_ICONIC) return; /* No border to remove */ if ((wndPtr->dwStyle & WS_ICONIC) || (wndPtr->flags & WIN_MANAGED)) return;
if (wndPtr->flags & WIN_MANAGED) return;
/* Remove frame from rectangle */ /* Remove frame from rectangle */
if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))

View File

@ -22,6 +22,7 @@
WORD USER_HeapSel = 0; WORD USER_HeapSel = 0;
extern BOOL32 MENU_SwitchTPWndTo(HTASK16); extern BOOL32 MENU_SwitchTPWndTo(HTASK16);
extern void QUEUE_FlushMessages(HQUEUE16);
/*********************************************************************** /***********************************************************************
* GetFreeSystemResources (USER.284) * GetFreeSystemResources (USER.284)

View File

@ -281,12 +281,12 @@ INT16 WINPOS_WindowFromPoint( WND* wndScope, POINT16 pt, WND **ppWnd )
{ {
WND *wndPtr; WND *wndPtr;
INT16 hittest = HTERROR; INT16 hittest = HTERROR;
INT16 x, y; POINT16 xy = pt;
*ppWnd = NULL; *ppWnd = NULL;
x = pt.x;
y = pt.y;
wndPtr = wndScope->child; wndPtr = wndScope->child;
MapWindowPoints16( GetDesktopWindow16(), wndScope->hwndSelf, &xy, 1 );
for (;;) for (;;)
{ {
while (wndPtr) while (wndPtr)
@ -298,10 +298,10 @@ INT16 WINPOS_WindowFromPoint( WND* wndScope, POINT16 pt, WND **ppWnd )
if ((wndPtr->dwStyle & WS_VISIBLE) && if ((wndPtr->dwStyle & WS_VISIBLE) &&
(!(wndPtr->dwStyle & WS_DISABLED) || (!(wndPtr->dwStyle & WS_DISABLED) ||
((wndPtr->dwStyle & (WS_POPUP | WS_CHILD)) != WS_CHILD)) && ((wndPtr->dwStyle & (WS_POPUP | WS_CHILD)) != WS_CHILD)) &&
(x >= wndPtr->rectWindow.left) && (xy.x >= wndPtr->rectWindow.left) &&
(x < wndPtr->rectWindow.right) && (xy.x < wndPtr->rectWindow.right) &&
(y >= wndPtr->rectWindow.top) && (xy.y >= wndPtr->rectWindow.top) &&
(y < wndPtr->rectWindow.bottom)) (xy.y < wndPtr->rectWindow.bottom))
{ {
*ppWnd = wndPtr; /* Got a suitable window */ *ppWnd = wndPtr; /* Got a suitable window */
@ -310,45 +310,35 @@ INT16 WINPOS_WindowFromPoint( WND* wndScope, POINT16 pt, WND **ppWnd )
if (wndPtr->dwStyle & WS_DISABLED) return HTERROR; if (wndPtr->dwStyle & WS_DISABLED) return HTERROR;
/* If point is not in client area, ignore the children */ /* If point is not in client area, ignore the children */
if ((x < wndPtr->rectClient.left) || if ((xy.x < wndPtr->rectClient.left) ||
(x >= wndPtr->rectClient.right) || (xy.x >= wndPtr->rectClient.right) ||
(y < wndPtr->rectClient.top) || (xy.y < wndPtr->rectClient.top) ||
(y >= wndPtr->rectClient.bottom)) break; (xy.y >= wndPtr->rectClient.bottom)) break;
x -= wndPtr->rectClient.left; xy.x -= wndPtr->rectClient.left;
y -= wndPtr->rectClient.top; xy.y -= wndPtr->rectClient.top;
wndPtr = wndPtr->child; wndPtr = wndPtr->child;
} }
else wndPtr = wndPtr->next; else wndPtr = wndPtr->next;
} }
/* If nothing found, return the scope window */ /* If nothing found, try the scope window */
if (!*ppWnd) if (!*ppWnd) *ppWnd = wndScope;
{
*ppWnd = wndScope;
if( pt.x >= (wndScope->rectClient.left - wndScope->rectWindow.left) &&
pt.x >= (wndScope->rectClient.top - wndScope->rectWindow.top ) &&
pt.x <= (wndScope->rectClient.right - wndScope->rectWindow.left) &&
pt.x <= (wndScope->rectClient.bottom - wndScope->rectWindow.top ) )
return HTCLIENT;
if( pt.x < 0 || pt.y < 0 ||
pt.x > (wndScope->rectWindow.right - wndScope->rectWindow.left) ||
pt.y > (wndScope->rectWindow.bottom - wndScope->rectWindow.top ) )
return HTNOWHERE;
return HTCAPTION; /* doesn't matter in this case */
}
/* Send the WM_NCHITTEST message (only if to the same task) */ /* Send the WM_NCHITTEST message (only if to the same task) */
if ((*ppWnd)->hmemTaskQ != GetTaskQueue(0)) return HTCLIENT; if ((*ppWnd)->hmemTaskQ == GetTaskQueue(0))
hittest = (INT16)SendMessage16( (*ppWnd)->hwndSelf, WM_NCHITTEST, 0, {
MAKELONG( pt.x, pt.y ) ); hittest = (INT16)SendMessage16( (*ppWnd)->hwndSelf, WM_NCHITTEST,
0, MAKELONG( pt.x, pt.y ) );
if (hittest != HTTRANSPARENT) return hittest; /* Found the window */ if (hittest != HTTRANSPARENT) return hittest; /* Found the window */
}
else return HTCLIENT;
/* If no children found in last search, make point relative to parent */ /* If no children found in last search, make point relative to parent */
if (!wndPtr) if (!wndPtr)
{ {
x += (*ppWnd)->rectClient.left; xy.x += (*ppWnd)->rectClient.left;
y += (*ppWnd)->rectClient.top; xy.y += (*ppWnd)->rectClient.top;
} }
/* Restart the search from the next sibling */ /* Restart the search from the next sibling */

View File

@ -7,7 +7,6 @@
#include <stdio.h> #include <stdio.h>
#include "windows.h" #include "windows.h"
#include "callback.h"
#include "heap.h" #include "heap.h"
#include "selectors.h" #include "selectors.h"
#include "stackframe.h" #include "stackframe.h"
@ -95,16 +94,20 @@ static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, HWND32 hwnd,
UINT32 msg, WPARAM32 wParam, UINT32 msg, WPARAM32 wParam,
LPARAM lParam ); LPARAM lParam );
#ifndef WINELIB
extern void CallFrom16_long_wwwll(void); extern void CallFrom16_long_wwwll(void);
extern void CallFrom32_stdcall_5(void); extern void CallFrom32_stdcall_5(void);
#else
static void CallFrom16_long_wwwll(void) {}
static void CallFrom32_stdcall_5(void) {}
#endif /* WINELIB */
static HANDLE32 WinProcHeap; static HANDLE32 WinProcHeap;
static LRESULT WINPROC_CallWndProc16( WNDPROC16 proc, HWND16 hwnd, UINT16 msg,
WPARAM16 wParam, LPARAM lParam );
static LRESULT WINPROC_CallWndProc32( WNDPROC32 proc, HWND32 hwnd, UINT32 msg,
WPARAM32 wParam, LPARAM lParam );
static WINPROC_CALLWNDPROC16 WINPROC_CallWndProc16Ptr = WINPROC_CallWndProc16;
static WINPROC_CALLWNDPROC32 WINPROC_CallWndProc32Ptr = WINPROC_CallWndProc32;
/********************************************************************** /**********************************************************************
* WINPROC_Init * WINPROC_Init
*/ */
@ -120,6 +123,48 @@ BOOL32 WINPROC_Init(void)
} }
/**********************************************************************
* WINPROC_CallWndProc16
*
* Call a 16-bit WndProc.
*/
static LRESULT WINPROC_CallWndProc16( WNDPROC16 proc, HWND16 hwnd, UINT16 msg,
WPARAM16 wParam, LPARAM lParam )
{
return proc( hwnd, msg, wParam, lParam );
}
/**********************************************************************
* WINPROC_CallWndProc32
*
* Call a 32-bit WndProc.
*/
static LRESULT WINPROC_CallWndProc32( WNDPROC32 proc, HWND32 hwnd, UINT32 msg,
WPARAM32 wParam, LPARAM lParam )
{
return proc( hwnd, msg, wParam, lParam );
}
/**********************************************************************
* WINPROC_SetCallWndProc16
*/
void WINPROC_SetCallWndProc16( WINPROC_CALLWNDPROC16 proc )
{
WINPROC_CallWndProc16Ptr = proc;
}
/**********************************************************************
* WINPROC_SetCallWndProc32
*/
void WINPROC_SetCallWndProc32( WINPROC_CALLWNDPROC32 proc )
{
WINPROC_CallWndProc32Ptr = proc;
}
/********************************************************************** /**********************************************************************
* WINPROC_GetPtr * WINPROC_GetPtr
* *
@ -1676,7 +1721,7 @@ static LRESULT WINPROC_CallProc32ATo32W( WNDPROC32 func, HWND32 hwnd,
LRESULT result; LRESULT result;
if (WINPROC_MapMsg32ATo32W( msg, wParam, &lParam ) == -1) return 0; if (WINPROC_MapMsg32ATo32W( msg, wParam, &lParam ) == -1) return 0;
result = CallWndProc32( func, hwnd, msg, wParam, lParam ); result = WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
WINPROC_UnmapMsg32ATo32W( msg, wParam, lParam ); WINPROC_UnmapMsg32ATo32W( msg, wParam, lParam );
return result; return result;
} }
@ -1694,7 +1739,7 @@ static LRESULT WINPROC_CallProc32WTo32A( WNDPROC32 func, HWND32 hwnd,
LRESULT result; LRESULT result;
if (WINPROC_MapMsg32WTo32A( msg, wParam, &lParam ) == -1) return 0; if (WINPROC_MapMsg32WTo32A( msg, wParam, &lParam ) == -1) return 0;
result = CallWndProc32( func, hwnd, msg, wParam, lParam ); result = WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
WINPROC_UnmapMsg32WTo32A( msg, wParam, lParam ); WINPROC_UnmapMsg32WTo32A( msg, wParam, lParam );
return result; return result;
} }
@ -1715,7 +1760,7 @@ LRESULT WINPROC_CallProc16To32A( HWND16 hwnd, UINT16 msg,
if (WINPROC_MapMsg16To32A( msg, wParam, &msg32, &wParam32, &lParam ) == -1) if (WINPROC_MapMsg16To32A( msg, wParam, &msg32, &wParam32, &lParam ) == -1)
return 0; return 0;
result = CallWndProc32( func, hwnd, msg32, wParam32, lParam ); result = WINPROC_CallWndProc32Ptr( func, hwnd, msg32, wParam32, lParam );
WINPROC_UnmapMsg16To32A( msg32, wParam32, lParam ); WINPROC_UnmapMsg16To32A( msg32, wParam32, lParam );
return result; return result;
} }
@ -1736,7 +1781,7 @@ LRESULT WINPROC_CallProc16To32W( HWND16 hwnd, UINT16 msg,
if (WINPROC_MapMsg16To32W( msg, wParam, &msg32, &wParam32, &lParam ) == -1) if (WINPROC_MapMsg16To32W( msg, wParam, &msg32, &wParam32, &lParam ) == -1)
return 0; return 0;
result = CallWndProc32( func, hwnd, msg32, wParam32, lParam ); result = WINPROC_CallWndProc32Ptr( func, hwnd, msg32, wParam32, lParam );
WINPROC_UnmapMsg16To32W( msg32, wParam32, lParam ); WINPROC_UnmapMsg16To32W( msg32, wParam32, lParam );
return result; return result;
} }
@ -1761,7 +1806,8 @@ static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, HWND32 hwnd,
&msg16, &mp16.wParam, &mp16.lParam ) == -1) &msg16, &mp16.wParam, &mp16.lParam ) == -1)
return 0; return 0;
if (wndPtr) CURRENT_DS = wndPtr->hInstance; if (wndPtr) CURRENT_DS = wndPtr->hInstance;
mp16.lResult = CallWndProc16( func, hwnd, msg16, mp16.wParam, mp16.lParam ); mp16.lResult = WINPROC_CallWndProc16Ptr( func, hwnd, msg16,
mp16.wParam, mp16.lParam );
CURRENT_DS = ds; CURRENT_DS = ds;
WINPROC_UnmapMsg32ATo16( msg, wParam, lParam, &mp16 ); WINPROC_UnmapMsg32ATo16( msg, wParam, lParam, &mp16 );
return mp16.lResult; return mp16.lResult;
@ -1786,7 +1832,8 @@ static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, HWND32 hwnd,
if (WINPROC_MapMsg32WTo16( msg, wParam, &msg16, &mp16.wParam, &mp16.lParam ) == -1) if (WINPROC_MapMsg32WTo16( msg, wParam, &msg16, &mp16.wParam, &mp16.lParam ) == -1)
return 0; return 0;
if (wndPtr) CURRENT_DS = wndPtr->hInstance; if (wndPtr) CURRENT_DS = wndPtr->hInstance;
mp16.lResult = CallWndProc16( func, hwnd, msg16, mp16.wParam, mp16.lParam ); mp16.lResult = WINPROC_CallWndProc16Ptr( func, hwnd, msg16,
mp16.wParam, mp16.lParam );
CURRENT_DS = ds; CURRENT_DS = ds;
WINPROC_UnmapMsg32WTo16( msg, wParam, lParam, &mp16 ); WINPROC_UnmapMsg32WTo16( msg, wParam, lParam, &mp16 );
return mp16.lResult; return mp16.lResult;
@ -1808,14 +1855,14 @@ LRESULT CallWindowProc16( WNDPROC16 func, HWND16 hwnd, UINT16 msg,
{ {
wndPtr = WIN_FindWndPtr( hwnd ); wndPtr = WIN_FindWndPtr( hwnd );
if (wndPtr) CURRENT_DS = wndPtr->hInstance; if (wndPtr) CURRENT_DS = wndPtr->hInstance;
result = CallWndProc16( (FARPROC16)func, hwnd, msg, wParam, lParam ); result = WINPROC_CallWndProc16Ptr( func, hwnd, msg, wParam, lParam );
CURRENT_DS = ds; CURRENT_DS = ds;
return result; return result;
} }
#if testing #if testing
wndPtr = WIN_FindWndPtr( hwnd ); wndPtr = WIN_FindWndPtr( hwnd );
if (wndPtr) CURRENT_DS = wndPtr->hInstance; if (wndPtr) CURRENT_DS = wndPtr->hInstance;
result = CallWndProc16( WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_16), result = WINPROC_CallWndProc16Ptr( WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_16),
hwnd, msg, wParam, lParam ); hwnd, msg, wParam, lParam );
CURRENT_DS = ds; CURRENT_DS = ds;
return result; return result;
@ -1827,24 +1874,7 @@ LRESULT CallWindowProc16( WNDPROC16 func, HWND16 hwnd, UINT16 msg,
if (!proc->thunk.t_from32.proc) return 0; if (!proc->thunk.t_from32.proc) return 0;
wndPtr = WIN_FindWndPtr( hwnd ); wndPtr = WIN_FindWndPtr( hwnd );
if (wndPtr) CURRENT_DS = wndPtr->hInstance; if (wndPtr) CURRENT_DS = wndPtr->hInstance;
#ifndef WINELIB result = WINPROC_CallWndProc16Ptr( proc->thunk.t_from32.proc,
if ((msg == WM_CREATE) || (msg == WM_NCCREATE))
{
CREATESTRUCT16 *cs = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
/* Build the CREATESTRUCT on the 16-bit stack. */
/* This is really ugly, but some programs (notably the */
/* "Undocumented Windows" examples) want it that way. */
result = CallWndProcNCCREATE16( proc->thunk.t_from32.proc,
cs->dwExStyle, cs->lpszClass, cs->lpszName, cs->style,
cs->x, cs->y, cs->cx, cs->cy, cs->hwndParent, cs->hMenu,
cs->hInstance, (LONG)cs->lpCreateParams, hwnd, msg, wParam,
MAKELONG( IF1632_Saved16_sp-sizeof(CREATESTRUCT16),
IF1632_Saved16_ss ) );
CURRENT_DS = ds;
return result;
}
#endif
result = CallWndProc16( proc->thunk.t_from32.proc,
hwnd, msg, wParam, lParam ); hwnd, msg, wParam, lParam );
CURRENT_DS = ds; CURRENT_DS = ds;
return result; return result;
@ -1872,11 +1902,12 @@ LRESULT CallWindowProc32A( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
{ {
WINDOWPROC *proc = WINPROC_GetPtr( (WNDPROC16)func ); WINDOWPROC *proc = WINPROC_GetPtr( (WNDPROC16)func );
if (!proc) return CallWndProc32( func, hwnd, msg, wParam, lParam ); if (!proc) return WINPROC_CallWndProc32Ptr( func, hwnd, msg,
wParam, lParam );
#if testing #if testing
func = WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_32A ); func = WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_32A );
return CallWndProc32( func, hwnd, msg, wParam, lParam ); return WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
#endif #endif
switch(proc->type) switch(proc->type)
@ -1887,7 +1918,7 @@ LRESULT CallWindowProc32A( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
hwnd, msg, wParam, lParam ); hwnd, msg, wParam, lParam );
case WIN_PROC_32A: case WIN_PROC_32A:
if (!proc->thunk.t_from16.proc) return 0; if (!proc->thunk.t_from16.proc) return 0;
return CallWndProc32( proc->thunk.t_from16.proc, return WINPROC_CallWndProc32Ptr( proc->thunk.t_from16.proc,
hwnd, msg, wParam, lParam ); hwnd, msg, wParam, lParam );
case WIN_PROC_32W: case WIN_PROC_32W:
if (!proc->thunk.t_from16.proc) return 0; if (!proc->thunk.t_from16.proc) return 0;
@ -1908,11 +1939,12 @@ LRESULT CallWindowProc32W( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
{ {
WINDOWPROC *proc = WINPROC_GetPtr( (WNDPROC16)func ); WINDOWPROC *proc = WINPROC_GetPtr( (WNDPROC16)func );
if (!proc) return CallWndProc32( func, hwnd, msg, wParam, lParam ); if (!proc) return WINPROC_CallWndProc32Ptr( func, hwnd, msg,
wParam, lParam );
#if testing #if testing
func = WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_32W ); func = WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_32W );
return CallWndProc32( func, hwnd, msg, wParam, lParam ); return WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
#endif #endif
switch(proc->type) switch(proc->type)
@ -1927,7 +1959,7 @@ LRESULT CallWindowProc32W( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
hwnd, msg, wParam, lParam ); hwnd, msg, wParam, lParam );
case WIN_PROC_32W: case WIN_PROC_32W:
if (!proc->thunk.t_from16.proc) return 0; if (!proc->thunk.t_from16.proc) return 0;
return CallWndProc32( proc->thunk.t_from16.proc, return WINPROC_CallWndProc32Ptr( proc->thunk.t_from16.proc,
hwnd, msg, wParam, lParam ); hwnd, msg, wParam, lParam );
default: default:
fprintf( stderr, "CallWindowProc32W: invalid proc %p\n", proc ); fprintf( stderr, "CallWindowProc32W: invalid proc %p\n", proc );