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
features. Most applications still do not work correctly.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry.
WHAT'S NEW with Wine-970415: (see ChangeLog for details)
- Edit control improvements.
- Some files moved around.
WHAT'S NEW with Wine-970509: (see ChangeLog for details)
- Better local heap implementation.
- Improvements to -managed mode.
- Lots of bug fixes.
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
from the following locations:
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970415.tar.gz
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970415.tar.gz
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970415.tar.gz
ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-970415.tar.gz
ftp://ftp.progsoc.uts.edu.au/pub/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-970509.tar.gz
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970509.tar.gz
ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-970509.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.

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>

View File

@ -111,7 +111,7 @@ wine wine.sym: $(COMMONSUBDIRS) $(EMUSUBDIRS) dummy
install_wine: dummy
$(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
$(RM) $@
@ -139,7 +139,7 @@ depend: dummy
done
etags:
etags `find . -name '*.[chS]' -print`
etags `find . -name '*.[chS]' -print | grep -v dbgmain`
clean:
for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done

View File

@ -395,26 +395,26 @@ static void CBPaintButton(LPHEADCOMBO lphc, HDC16 hdc)
*/
static void CBPaintText(LPHEADCOMBO lphc, HDC16 hdc)
{
INT32 id, size;
INT32 id, size = 0;
LPSTR pText = NULL;
/* 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;
SendMessage32A( lphc->hWndLBox, LB_GETTEXT32, (WPARAM32)id, (LPARAM)pText );
pText[size] = '\0'; /* just in case */
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 );
pText[size] = '\0'; /* just in case */
} else return;
}
if( lphc->wState & CBF_EDIT )
{
if( CB_HASSTRINGS(lphc) )
SetWindowText32A( lphc->hWndEdit, (pText) ? pText : "" );
if( lphc->wState & CBF_FOCUSED )
if( CB_HASSTRINGS(lphc) ) SetWindowText32A( lphc->hWndEdit, pText );
if( lphc->wState & CBF_FOCUSED )
SendMessage32A( lphc->hWndEdit, EM_SETSEL32, 0, (LPARAM)(-1));
}
else /* paint text field ourselves */
@ -478,8 +478,9 @@ static void CBPaintText(LPHEADCOMBO lphc, HDC16 hdc)
else
{
ExtTextOut32A( hDC, rect.left + 1, rect.top + 1,
ETO_OPAQUE | ETO_CLIPPED, &rect, pText, size, NULL );
if( lphc->wState & CBF_FOCUSED && !(lphc->wState & CBF_DROPPED) )
ETO_OPAQUE | ETO_CLIPPED, &rect,
(pText) ? pText : "" , size, NULL );
if(lphc->wState & CBF_FOCUSED && !(lphc->wState & CBF_DROPPED))
DrawFocusRect32( hDC, &rect );
}
@ -957,7 +958,7 @@ static LRESULT COMBO_GetText( LPHEADCOMBO lphc, UINT32 N, LPSTR lpText)
/* get it from the listbox */
idx = SendMessage32A( lphc->hWndLBox, LB_GETCURSEL32, 0, 0 );
if( idx >= 0 )
if( idx != LB_ERR )
{
LPSTR lpBuffer;
INT32 length = SendMessage32A( lphc->hWndLBox, LB_GETTEXTLEN32,

View File

@ -2365,7 +2365,7 @@ UINT16 GetMenuItemID16( HMENU16 hMenu, INT16 nPos )
LPPOPUPMENU menu;
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;
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
* the wine.sym file.
*/
fprintf(stderr,"Loading symbols: ");
if( DEBUG_ReadExecutableDbgInfo() == FALSE )
{
PROFILE_GetWineIniString( "wine", "SymbolTableFile", "wine.sym",
@ -447,6 +448,7 @@ static void DEBUG_Main( int signal )
DEBUG_ProcessDeferredDebug();
DEBUG_LoadEntryPoints();
fprintf(stderr,"\n");
}
#if 0

View File

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

View File

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

View File

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

View File

@ -1110,8 +1110,9 @@ DEBUG_ProcessElfObject(char * filename, unsigned int load_offset)
/*
* 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
@ -1359,7 +1360,7 @@ DEBUG_ReadExecutableDbgInfo(void)
/*
* 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;

View File

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

View File

@ -17,7 +17,6 @@
#include <limits.h>
#include <string.h>
#include <unistd.h>
#include <malloc.h>
#include "win.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 )
{
info->dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE;
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))
info->dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
@ -1168,6 +1169,9 @@ LPVOID FILE_mmap( FILE_OBJECT *file, LPVOID start,
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
flags |= MAP_ANON;
#else

View File

@ -39,7 +39,7 @@ BOOL32 WIN16DRV_GetTextExtentPoint( DC *dc, LPCSTR str, INT32 count,
NULL, str,
-count, physDev->segptrFontInfo, lpDrawMode,
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;
}

View File

@ -395,8 +395,8 @@ static INT32 WIN16DRV_Escape( DC *dc, INT32 nEscape, INT32 cbInput,
case 0x100:
{
LPEXTTEXTDATA textData = PTR_SEG_TO_LIN(lpInData);
printf("Got in data 0x%x textData 0x%x\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("Got in data 0x%lx textData 0x%p\n",lpInData, textData);
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->lpindata,PTR_SEG_TO_LIN(textData->lpindata),
textData->lpFont,PTR_SEG_TO_LIN(textData->lpFont),
@ -450,7 +450,7 @@ int
ExtractPQ(HPQ hPQ)
{
struct hpq *queue, *prev, *current, *currentPrev;
int key, tag = -1;
int key = 0, tag = -1;
currentPrev = prev = NULL;
queue = current = hpqueue;
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);
nRet = MessageBox16(NULL, lpMsg, "Printing Error", MB_OKCANCEL);
nRet = MessageBox16(0, lpMsg, "Printing Error", MB_OKCANCEL);
return nRet;
}

View File

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

View File

@ -73,8 +73,8 @@ type win16
74 pascal16 OpenFile(ptr ptr word) OpenFile16
75 stub OpenPathName
76 stub DeletePathName
#77 RESERVED1
#78 RESERVED2
77 stub KERNEL_77 #RESERVED1
78 stub KERNEL_78 #RESERVED2
#79 RESERVED3
#80 RESERVED4
81 pascal16 _lclose(word) _lclose16
@ -205,6 +205,12 @@ type win16
205 stub CVWBreak
206 pascal16 AllocSelectorArray(word) AllocSelectorArray
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
217 pascal RegOpenKey(long ptr ptr) RegOpenKey16
218 pascal RegCreateKey(long ptr ptr) RegCreateKey16
@ -217,14 +223,17 @@ type win16
225 pascal RegQueryValueEx(long ptr ptr ptr ptr ptr) RegQueryValueEx16
226 pascal RegSetValueEx(long ptr long long ptr long) RegSetValueEx16
227 pascal RegFlushKey(long) RegFlushKey
#228 K228
#229 K229
228 stub K228
229 stub K229
230 stub GlobalSmartPageLock
231 stub GlobalSmartPageUnlock
232 stub RegLoadKey
233 stub RegUnloadKey
234 stub RegSaveKey
235 stub InvalidateNlsCache
237 stub KERNEL_237
262 stub KERNEL_262
263 stub KERNEL_263
310 pascal16 LocalHandleDelta(word) LocalHandleDelta
311 stub GetSetKernelDosProc
314 stub DebugDefineSegment
@ -237,7 +246,7 @@ type win16
324 stub LogError
325 stub LogParamError
326 return IsRomFile 2 0
#327 K327
327 stub KERNEL_327
328 stub _DebugOutput
#329 K329
#332 stub THHOOK
@ -264,6 +273,9 @@ type win16
354 pascal GetAppCompatFlags(word) GetAppCompatFlags16
355 pascal16 GetWinDebugInfo(ptr word) GetWinDebugInfo
356 pascal16 SetWinDebugInfo(ptr) SetWinDebugInfo
357 stub KERNEL_357
358 stub KERNEL_358
359 stub KERNEL_359
360 stub OpenFileEx
#361 PIGLET_361
403 pascal16 FarSetOwner(word word) FarSetOwner
@ -282,14 +294,48 @@ type win16
420 pascal GetFileAttributes(ptr) GetFileAttributes16
421 pascal16 SetFileAttributes(ptr long) SetFileAttributes16
422 pascal16 GetDiskFreeSpace(ptr ptr ptr ptr ptr) GetDiskFreeSpace16
431 stub KERNEL_431
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
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
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
515 stub GetProcAddress32W
515 pascal GetProcAddress32W(long ptr) GetProcAddress32
516 stub GetVDMPointer32W
517 stub CallProc32W
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
630 stub KERNEL_630
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
0260 stub GetProcessHeaps
0261 stub GetProcessShutdownParameters
0262 stub GetProcessTimes
0262 stdcall GetProcessTimes(long ptr ptr ptr ptr) GetProcessTimes
0263 stub GetProcessWorkingSetSize
0264 stdcall GetProfileIntA(ptr ptr long) GetProfileInt32A
0265 stdcall GetProfileIntW(ptr ptr long) GetProfileInt32W
@ -685,3 +685,4 @@ base 1
0679 stdcall MapLS(ptr) MapLS
0680 stdcall UnMapLS(long) UnMapLS
0681 stub OpenVxDHandle
0682 stub FT_Exit12

View File

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

View File

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

View File

@ -9,9 +9,11 @@
#include "heap.h"
#include "hook.h"
#include "module.h"
#include "winproc.h"
#include "stackframe.h"
#include "except.h"
#include "stddebug.h"
#include "debug.h"
#include "except.h"
typedef void (*RELAY)();
@ -37,6 +39,21 @@ typedef struct tagTHUNK
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
*/
@ -72,7 +89,7 @@ static THUNK *THUNK_Find( FARPROC32 func )
/***********************************************************************
* THUNK_Free
*/
void THUNK_Free( THUNK *thunk )
static void THUNK_Free( THUNK *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)
*/

View File

@ -403,7 +403,7 @@ base 1
0396 stdcall ModifyMenuA(long long long long ptr) ModifyMenu32A
0397 stdcall ModifyMenuW(long long long long ptr) ModifyMenu32W
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
0401 stdcall OemToCharA(ptr ptr) OemToChar32A
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 */
/* by the build program to generate the file if1632/callto16.S */
/* func parameters */
extern WORD CallTo16_word_ ( FARPROC16 );
#ifndef WINELIB
extern void CallTo16_regs_ ( const CONTEXT *context );
extern WORD CallTo16_word_ ( FARPROC16 );
extern WORD CallTo16_word_w ( FARPROC16, WORD );
extern WORD CallTo16_word_ww ( FARPROC16, WORD, WORD );
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 )
#define CallWindowsExitProc( 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 ) \
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 */
@ -81,8 +70,6 @@ extern LONG CallTo32_5( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD );
CallTo32_0( func )
#define CallDLLEntryProc32( 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 ) \
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 )
#define CallWindowsExitProc( 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 ) \
(*func)( lpch, ichCurrent, cch, code )
#define CallWordBreakProc32A( func, lpch, ichCurrent, cch, code ) \

View File

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

View File

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

View File

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

View File

@ -17,6 +17,10 @@ void SIGNAL_MaskAsyncEvents( BOOL32 mask )
/* 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, ...)
{
va_list arglist;

View File

@ -451,7 +451,7 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
((fastload && ((offset) >= fastload_offset) && \
((offset)+(size) <= fastload_offset+fastload_length)) ? \
(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)))
_llseek32( hFile, 0, SEEK_SET );
@ -509,10 +509,11 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
fastload_offset, fastload_length );
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)
{
HeapFree( SystemHeap, 0, fastload );
fprintf(stderr, "Error reading fast-load area !\n");
fastload = NULL;
}
}
@ -536,12 +537,12 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
int i;
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),
buffer ))
{
HeapFree( SystemHeap, 0, buffer );
HeapFree( SystemHeap, 0, fastload );
if (fastload) HeapFree( SystemHeap, 0, fastload );
GlobalFree16( hModule );
return (HMODULE16)11; /* invalid exe */
}
@ -555,7 +556,7 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
}
else
{
HeapFree( SystemHeap, 0, fastload );
if (fastload) HeapFree( SystemHeap, 0, fastload );
GlobalFree16( hModule );
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)
{
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,
pData )) return (HMODULE16)11; /* invalid exe */
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 */
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,
pData ))
{
HeapFree( SystemHeap, 0, fastload );
if (fastload) HeapFree( SystemHeap, 0, fastload );
GlobalFree16( hModule );
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)
{
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),
pData ))
{
HeapFree( SystemHeap, 0, fastload );
if (fastload) HeapFree( SystemHeap, 0, fastload );
GlobalFree16( hModule );
return (HMODULE16)11; /* invalid exe */
}
@ -605,11 +606,11 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
/* Get the imported names table */
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,
pData ))
{
HeapFree( SystemHeap, 0, fastload );
if (fastload) HeapFree( SystemHeap, 0, fastload );
GlobalFree16( hModule );
return (HMODULE16)11; /* invalid exe */
}
@ -618,11 +619,11 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
/* Get the entry table */
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,
pData ))
{
HeapFree( SystemHeap, 0, fastload );
if (fastload) HeapFree( SystemHeap, 0, fastload );
GlobalFree16( hModule );
return (HMODULE16)11; /* invalid exe */
}
@ -631,7 +632,7 @@ static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
/* Free the fast-load area */
#undef READ
HeapFree( SystemHeap, 0, fastload );
if (fastload) HeapFree( SystemHeap, 0, fastload );
/* 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)
*/
@ -1459,8 +1471,9 @@ HINSTANCE32 WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
cmdline = (char *)GlobalLock16( cmdLineHandle );
lstrcpyn32A(filename, lpCmdLine, sizeof(filename) - 4 /* for extension */);
for (p = filename; *p && (*p != ' ') && (*p != '\t'); p++);
if (*p) lstrcpyn32A( cmdline, p + 1, 128 );
else cmdline[0] = '\0';
if (*p) lstrcpyn32A( cmdline + 1, p + 1, 127 );
else cmdline[1] = '\0';
cmdline[0] = strlen( cmdline + 1 ) + 1;
*p = '\0';
/* Now load the executable file */
@ -1603,6 +1616,10 @@ FARPROC32 GetProcAddress32( HMODULE32 hModule, LPCSTR function )
#ifndef WINELIB
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 );
if (!(pModule = MODULE_GetPtr( hModule )))
return (FARPROC32)0;
@ -1616,6 +1633,26 @@ FARPROC32 GetProcAddress32( HMODULE32 hModule, LPCSTR function )
#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)

View File

@ -151,15 +151,15 @@ HANDLER_DEF(SIGNAL_fault)
HANDLER_PROLOG;
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",
CS_sig(context), EIP_sig(context) );
(unsigned short) CS_sig(context), EIP_sig(context));
}
else
{
if (INSTR_EmulateInstruction( context )) return;
fprintf( stderr, "Segmentation fault in Windows program %x:%lx.\n",
CS_sig(context), EIP_sig(context) );
fprintf( stderr, "Segmentation fault in Windows program %04x:%08lx.\n",
(unsigned short) CS_sig(context), EIP_sig(context) );
}
wine_debug( signal, context );
HANDLER_EPILOG;

View File

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

View File

@ -57,6 +57,18 @@ typedef struct
BYTE lock; /* Lock count */
} 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)
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
*/
@ -632,8 +665,7 @@ static WORD LOCAL_Compact( HANDLE16 ds, WORD minfree, WORD flags )
pEntry = (LOCALHANDLEENTRY *)(ptr + table + sizeof(WORD));
for(count = *(WORD *)(ptr + table); count > 0; count--, pEntry++)
{
if((pEntry->lock == 0) && !(pEntry->flags &
(LMEM_DISCARDED >> 8)))
if((pEntry->lock == 0) && (pEntry->flags != (LMEM_DISCARDED >> 8)))
{
/* OK we can move this one if we want */
dprintf_local(stddeb,
@ -705,14 +737,14 @@ static WORD LOCAL_Compact( HANDLE16 ds, WORD minfree, WORD flags )
pEntry = (LOCALHANDLEENTRY *)(ptr + table + sizeof(WORD));
for(count = *(WORD *)(ptr + table); count > 0; count--, pEntry++)
{
if((pEntry->flags & (LMEM_DISCARDABLE >> 8)) &&
pEntry->lock == 0 && !(pEntry->flags & (LMEM_DISCARDED >> 8)))
{
if(pEntry->addr && pEntry->lock == 0 &&
(pEntry->flags & (LMEM_DISCARDABLE >> 8)))
{
dprintf_local(stddeb, "Discarding handle %04x (block %04x).\n",
(char *)pEntry - ptr, pEntry->addr);
LOCAL_FreeArena(ds, pEntry->addr);
LOCAL_FreeArena(ds, ARENA_HEADER(pEntry->addr));
pEntry->addr = 0;
pEntry->flags |= (LMEM_DISCARDED >> 8);
pEntry->flags = (LMEM_DISCARDED >> 8);
/* Call localnotify proc */
}
}
@ -770,7 +802,7 @@ static HLOCAL16 LOCAL_GetBlock( HANDLE16 ds, WORD size, WORD flags )
LOCAL_PrintHeap(ds);
return 0;
}
size += ARENA_HEADER_SIZE;
size = LALIGN( MAX( size, sizeof(LOCALARENA) ) );
@ -801,8 +833,8 @@ static HLOCAL16 LOCAL_GetBlock( HANDLE16 ds, WORD size, WORD flags )
LOCAL_RemoveFreeBlock( ptr, arena );
LOCAL_ShrinkArena( ds, arena, size );
if (flags & LMEM_ZEROINIT) memset( (char *)pArena + ARENA_HEADER_SIZE, 0,
size - ARENA_HEADER_SIZE );
if (flags & LMEM_ZEROINIT)
memset((char *)pArena + ARENA_HEADER_SIZE, 0, size-ARENA_HEADER_SIZE);
return arena + ARENA_HEADER_SIZE;
}
@ -838,7 +870,10 @@ static BOOL16 LOCAL_NewHTable( HANDLE16 ds )
*(WORD *)(ptr + handle) = pInfo->hdelta;
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;
pInfo->htable = handle;
return TRUE;
@ -886,6 +921,7 @@ static HLOCAL16 LOCAL_GetNewHandleEntry( HANDLE16 ds )
/* Now allocate this entry */
pEntry->lock = 0;
pEntry->flags = 0;
dprintf_local( stddeb, "LOCAL_GetNewHandleEntry(%04x): %04x\n",
ds, ((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->lock = 0xff;
pEntry->flags = 0xff;
/* Now check if all entries in this table are free */
table = *pTable;
@ -965,7 +1001,7 @@ HLOCAL16 LOCAL_Free( HANDLE16 ds, HLOCAL16 handle )
else
{
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",
pEntry->addr );
@ -982,6 +1018,7 @@ HLOCAL16 LOCAL_Free( HANDLE16 ds, HLOCAL16 handle )
* LOCAL_Alloc
*
* Implementation of LocalAlloc().
*
*/
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 );
if(size > 0 && size <= 4) size = 5;
if (flags & LMEM_MOVEABLE)
{
LOCALHANDLEENTRY *plhe;
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 )))
{
fprintf( stderr, "LocalAlloc: couldn't get handle\n");
LOCAL_FreeArena( ds, ARENA_HEADER(hmem) );
if(hmem)
LOCAL_FreeArena( ds, ARENA_HEADER(hmem) );
return 0;
}
ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
plhe = (LOCALHANDLEENTRY *)(ptr + handle);
plhe->addr = hmem;
plhe->flags = (BYTE)(flags >> 8);
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;
}
@ -1025,88 +1083,106 @@ HLOCAL16 LOCAL_ReAlloc( HANDLE16 ds, HLOCAL16 handle, WORD size, WORD flags )
LOCALHEAPINFO *pInfo;
LOCALARENA *pArena, *pNext;
LOCALHANDLEENTRY *pEntry;
WORD arena, newhandle, blockhandle, oldsize;
WORD arena, oldsize;
HLOCAL16 hmem, blockhandle;
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",
handle, size, flags, ds );
if (!(pInfo = LOCAL_GetHeap( ds ))) return 0;
if (HANDLE_FIXED( handle )) blockhandle = handle;
if (HANDLE_FIXED( handle ))
blockhandle = handle;
else
{
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");
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 */
pEntry = (LOCALHANDLEENTRY *) (ptr + handle);
pEntry->flags = (BYTE) (flags >> 8);
pEntry->addr = hl + sizeof(HLOCAL16);
pEntry->flags = 0;
pEntry->lock = 0;
*(HLOCAL16 *)(ptr + hl) = handle;
return handle;
}
if (!(blockhandle = pEntry->addr))
}
if (((blockhandle = pEntry->addr) & 3) != 2)
{
fprintf( stderr, "Local_ReAlloc(%04x,%04x): invalid handle\n",
ds, handle );
return 0;
}
if(*((HLOCAL16 *)(ptr + blockhandle) - 1) != handle) {
fprintf(stderr, "Local_ReAlloc: Back ptr to handle is invalid\n");
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 );
dprintf_local( stddeb, "LocalReAlloc: arena is %04x\n", arena );
pArena = ARENA_PTR( ptr, arena );
if ((flags & LMEM_MODIFY) && (flags & LMEM_DISCARDABLE))
{
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 );
if(size <= 4) size = 5;
oldsize = pArena->next - arena - ARENA_HEADER_SIZE;
nextarena = LALIGN(blockhandle + size);
@ -1114,58 +1190,58 @@ HLOCAL16 LOCAL_ReAlloc( HANDLE16 ds, HLOCAL16 handle, WORD size, WORD flags )
if (nextarena <= pArena->next)
{
if (nextarena < pArena->next - LALIGN(sizeof(LOCALARENA)))
{
dprintf_local( stddeb, "size reduction, making new free block\n");
/* It is worth making a new free block */
LOCAL_AddBlock( ptr, arena, nextarena );
pInfo->items++;
LOCAL_FreeArena( ds, nextarena );
}
dprintf_local( stddeb, "size reduction, making new free block\n");
LOCAL_ShrinkArena(ds, arena, nextarena - arena);
dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", 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 );
if (((pNext->prev & 3) == LOCAL_ARENA_FREE) &&
(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");
/* It is worth making a new free block */
LOCAL_AddBlock( ptr, arena, nextarena );
pInfo->items++;
LOCAL_FreeArena( ds, nextarena );
}
dprintf_local( stddeb, "size increase, making new free block\n");
LOCAL_GrowArenaUpward(ds, arena, nextarena - arena);
dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", handle );
return handle;
}
/* Now we have to allocate a new block, but not if fixed block and no
LMEM_MOVEABLE */
/* Now we have to allocate a new block, but not if (fixed block or locked
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");
return 0; /* FIXME: should we free it here? */
if (HANDLE_FIXED(handle))
{
dprintf_local(stddeb,
"Needed to move fixed block, but LMEM_MOVEABLE not specified.\n");
return 0;
}
else
{
if(((LOCALHANDLEENTRY *)(ptr + handle))->lock != 0)
{
dprintf_local(stddeb,
"Needed to move locked block, but LMEM_MOVEABLE not specified.\n");
return 0;
}
}
}
newhandle = LOCAL_GetBlock( ds, size, flags );
if(HANDLE_MOVEABLE(handle)) size += sizeof(HLOCAL16);
hmem = LOCAL_GetBlock( ds, size, flags );
ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ); /* Reload ptr */
if (!newhandle)
if (!hmem)
{
/* Remove the block from the heap and try again */
LPSTR buffer = HeapAlloc( SystemHeap, 0, oldsize );
if (!buffer) return 0;
memcpy( buffer, ptr + (arena + ARENA_HEADER_SIZE), oldsize );
memcpy( buffer, ptr + arena + ARENA_HEADER_SIZE, oldsize );
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" );
HeapFree( SystemHeap, 0, buffer );
@ -1174,25 +1250,27 @@ HLOCAL16 LOCAL_ReAlloc( HANDLE16 ds, HLOCAL16 handle, WORD size, WORD flags )
size = oldsize;
}
ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ); /* Reload ptr */
memcpy( ptr + newhandle, buffer, oldsize );
memcpy( ptr + hmem, buffer, oldsize );
HeapFree( SystemHeap, 0, buffer );
}
else
{
memcpy( ptr + newhandle, ptr + (arena + ARENA_HEADER_SIZE), oldsize );
memcpy( ptr + hmem, ptr + (arena + ARENA_HEADER_SIZE), oldsize );
LOCAL_FreeArena( ds, arena );
}
if (HANDLE_MOVEABLE( handle ))
{
dprintf_local( stddeb, "LocalReAlloc: fixing handle\n");
pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
pEntry->addr = newhandle;
pEntry->lock = 0;
newhandle = handle;
pEntry->addr = hmem + sizeof(HLOCAL16);
/* Back ptr should still be correct */
if(*(HLOCAL16 *)(ptr + hmem) != handle)
fprintf(stderr, "Local_ReAlloc: back ptr is invalid.\n");
hmem = handle;
}
if (size == oldsize) newhandle = 0; /* Realloc failed */
dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", newhandle );
return newhandle;
if (size == oldsize) hmem = 0; /* Realloc failed */
dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", hmem );
return hmem;
}
@ -1205,6 +1283,7 @@ static HLOCAL16 LOCAL_InternalLock( LPSTR heap, HLOCAL16 handle )
if (HANDLE_MOVEABLE(handle))
{
LOCALHANDLEENTRY *pEntry = (LOCALHANDLEENTRY *)(heap + handle);
if (pEntry->flags == LMEM_DISCARDED) return 0;
if (pEntry->lock < 0xfe) pEntry->lock++;
handle = pEntry->addr;
}
@ -1266,6 +1345,7 @@ WORD LOCAL_Size( HANDLE16 ds, HLOCAL16 handle )
dprintf_local( stddeb, "LocalSize: %04x ds=%04x\n", handle, ds );
if (HANDLE_MOVEABLE( handle )) handle = *(WORD *)(ptr + handle);
if (!handle) return 0;
pArena = ARENA_PTR( ptr, ARENA_HEADER(handle) );
return pArena->next - handle;
}
@ -1477,6 +1557,7 @@ FARPROC16 LocalNotify( FARPROC16 func )
return 0;
}
dprintf_local( stddeb, "LocalNotify(%04x): %08lx\n", ds, (DWORD)func );
fprintf(stdnimp, "LocalNotify(): Half implemented\n");
oldNotify = pInfo->notify;
pInfo->notify = func;
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_WRITE:
case FILE_MAP_WRITE | FILE_MAP_READ:
if (!(mapping->protect & VPROT_WRITE))
{
SetLastError( ERROR_INVALID_PARAMETER );
@ -1028,6 +1029,7 @@ LPVOID MapViewOfFileEx( HANDLE32 handle, DWORD access, DWORD offset_high,
/* fall through */
case FILE_MAP_READ:
case FILE_MAP_COPY:
case FILE_MAP_COPY | FILE_MAP_READ:
if (mapping->protect & VPROT_READ) break;
/* fall through */
default:

View File

@ -9,6 +9,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
@ -135,7 +136,8 @@ void CRTDLL_srand(DWORD seed)
int CRTDLL_fprintf(DWORD *args)
{
/* 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)
{
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)
{
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)
{
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)
{
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)
from = HEAP_strdupA( GetProcessHeap(), 0, (LPSTR)lpSource);
if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) {
/* 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) {
INT32 bufsize;
@ -585,7 +585,9 @@ FormatMessage32A(
sprintfbuf=HeapAlloc(GetProcessHeap(),0,strlen((LPSTR)argliststart[0])+1);
else
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;
while (*x) {
ADD_TO_T(*x++);
@ -697,7 +699,8 @@ FormatMessage32W(
from = HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR)lpSource);
if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) {
/* 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) {
INT32 bufsize;
@ -783,10 +786,14 @@ FormatMessage32W(
xarr[1]=*(argliststart+1);
xarr[2]=*(argliststart+2);
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 {
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;
while (*x) {

View File

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

View File

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

View File

@ -545,7 +545,7 @@ VerInstallFile32A(
}
ret = LZCopy32(hfsrc,hfdst);
_lclose32(hfdst);
if (ret<0) {
if (((long) ret) < 0) {
/* translate LZ errors into VIF_xxx */
switch (ret) {
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.
*/
static int inline sock_error_p(int s)
__inline__ static int sock_error_p(int s)
{
unsigned int optval, optlen;
@ -704,7 +704,7 @@ INT16 WINSOCK_recvfrom(SOCKET16 s, char *buf, INT16 len, INT16 flags,
{
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;
notify_client(pws, WS_FD_READ);

View File

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

View File

@ -227,7 +227,7 @@ static void ioctlGetDeviceInfo( CONTEXT *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));
int drive = DOS_GET_DRIVE( BL_reg(context) );
@ -235,20 +235,21 @@ static void ioctlGenericBlkDevReq( CONTEXT *context )
if (!DRIVE_IsValid(drive))
{
DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
return;
return TRUE;
}
if (CH_reg(context) != 0x08)
{
INT_BARF( context, 0x21 );
return;
return FALSE;
}
switch (CL_reg(context)) {
switch (CL_reg(context))
{
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));
return;
break;
case 0x60: /* get device parameters */
/* used by w4wgrp's winfile */
memset(dataptr, 0, 0x26);
@ -268,9 +269,11 @@ static void ioctlGenericBlkDevReq( CONTEXT *context )
}
CreateBPB(drive, &dataptr[7]);
RESET_CFLAG(context);
return;
break;
case 0x66:/* get disk serial number */
{ char label[12],fsname[9],path[4];
{
char label[12],fsname[9],path[4];
DWORD serial;
strcpy(path,"x:\\");path[0]=drive+'A';
@ -281,14 +284,17 @@ static void ioctlGenericBlkDevReq( CONTEXT *context )
memcpy(dataptr+2,&serial,4);
memcpy(dataptr+6,label ,11);
memcpy(dataptr+17,fsname,8);
return;
}
break;
case 0x6a:
dprintf_int(stddeb,"int21: logical volume %d unlocked.\n",drive);
return;
break;
default:
INT_BARF( context, 0x21 );
}
return FALSE;
}
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);
}
static void INT21_CreateFile( CONTEXT *context )
static BOOL32 INT21_CreateFile( CONTEXT *context )
{
AX_reg(context) = _lcreat16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ), CX_reg(context) );
if (AX_reg(context) == (WORD)HFILE_ERROR16)
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
return (AX_reg(context) == (WORD)HFILE_ERROR16);
}
@ -406,92 +408,108 @@ static void CloseFile( CONTEXT *context )
}
}
void ExtendedOpenCreateFile(CONTEXT *context )
static BOOL32 INT21_ExtendedOpenCreateFile(CONTEXT *context )
{
BYTE action=DL_reg(context);
BOOL32 bExtendedError = FALSE;
BYTE action = DL_reg(context);
/* Shuffle arguments to call OpenExistingFile */
AL_reg(context) = BL_reg(context);
DX_reg(context) = SI_reg(context);
/* BX,CX and DX should be preserved */
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 */
if ((action & 0x07)== 0)
{
if ((action & 0x07) == 0)
{
BX_reg(context) = AX_reg(context);
CloseFile(context);
AX_reg(context) = 0x0050;/*File exists*/
CX_reg(context) = 0;
AX_reg(context) = 0x0050; /*File exists*/
SET_CFLAG(context);
dprintf_int(stddeb, "int21: extended open/create: failed because file exixts \n");
return;
}
if ((action & 0x07)== 2) {
/* Truncate it, but first check if opened for write */
if ((BL_reg(context) & 0x0007)== 0) {
BX_reg(context) = AX_reg(context);
CloseFile(context);
dprintf_int(stddeb, "int21: extended open/create: failed, trunc on ro file");
AX_reg(context) = 0x000C;/*Access code invalid*/
CX_reg(context) = 0;
SET_CFLAG(context);
return;
}
/* Shuffle arguments to call CloseFile */
dprintf_int(stddeb, "int21: extended open/create: Closing before truncate\n");
BX_reg(context) = AX_reg(context);
/* BX and DX should be preserved */
CloseFile(context);
if (EFL_reg(context) & 0x0001) {
dprintf_int(stddeb, "int21: extended open/create: close before trunc failed");
AX_reg(context) = 0x0019;/*Seek Error*/
CX_reg(context) = 0;
SET_CFLAG(context);
}
/* Shuffle arguments to call CreateFile */
dprintf_int(stddeb, "int21: extended open/create: Truncating\n");
AL_reg(context) = BL_reg(context);
/* CX is still the same */
DX_reg(context) = SI_reg(context);
INT21_CreateFile(context);
if (EFL_reg(context) & 0x0001) { /*no file open, flags set */
dprintf_int(stddeb, "int21: extended open/create: trunc failed");
return;
}
CX_reg(context) = 3;
return;
dprintf_int(stddeb, "int21: extended open/create: failed because file exists \n");
}
CX_reg(context) = 1;
return;
}
else if ((action & 0x07) == 2)
{
/* Truncate it, but first check if opened for write */
if ((BL_reg(context) & 0x0007)== 0)
{
BX_reg(context) = AX_reg(context);
CloseFile(context);
dprintf_int(stddeb, "int21: extended open/create: failed, trunc on ro file");
AX_reg(context) = 0x000C; /*Access code invalid*/
SET_CFLAG(context);
}
else
{
/* Shuffle arguments to call CloseFile while
* preserving BX and DX */
dprintf_int(stddeb, "int21: extended open/create: Closing before truncate\n");
BX_reg(context) = AX_reg(context);
CloseFile(context);
if (EFL_reg(context) & 0x0001)
{
dprintf_int(stddeb, "int21: extended open/create: close before trunc failed");
AX_reg(context) = 0x0019; /*Seek Error*/
CX_reg(context) = 0;
SET_CFLAG(context);
}
/* Shuffle arguments to call CreateFile */
dprintf_int(stddeb, "int21: extended open/create: Truncating\n");
AL_reg(context) = BL_reg(context);
/* CX is still the same */
DX_reg(context) = SI_reg(context);
bExtendedError = INT21_CreateFile(context);
if (EFL_reg(context) & 0x0001) /*no file open, flags set */
{
dprintf_int(stddeb, "int21: extended open/create: trunc failed");
return bExtendedError;
}
uReturnCX = 0x3;
}
}
else uReturnCX = 0x1;
CX_reg(context) = uReturnCX;
}
else /* file does not exist */
{
{
RESET_CFLAG(context); /* was set by OpenExistingFile(context) */
if ((action & 0xF0)== 0)
{
CX_reg(context) = 0;
SET_CFLAG(context);
dprintf_int(stddeb, "int21: extended open/create: failed, file dosen't exist\n");
return;
}
/* Shuffle arguments to call CreateFile */
dprintf_int(stddeb, "int21: extended open/create: Creating\n");
AL_reg(context) = BL_reg(context);
/* CX should still be the same */
DX_reg(context) = SI_reg(context);
INT21_CreateFile(context);
if (EFL_reg(context) & 0x0001) { /*no file open, flags set */
dprintf_int(stddeb, "int21: extended open/create: create failed\n");
return;
else
{
/* Shuffle arguments to call CreateFile */
dprintf_int(stddeb, "int21: extended open/create: Creating\n");
AL_reg(context) = BL_reg(context);
/* CX should still be the same */
DX_reg(context) = SI_reg(context);
bExtendedError = INT21_CreateFile(context);
if (EFL_reg(context) & 0x0001) /*no file open, flags set */
{
dprintf_int(stddeb, "int21: extended open/create: create failed\n");
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;
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;
}
else drive = DRIVE_GetCurrentDrive();
if (!DRIVE_Chdir( drive, dirname ))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
return DRIVE_Chdir( drive, dirname );
}
@ -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;
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)
{
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) );
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))
{
DOS_ERROR( ER_InvalidDrive, EC_NotFound, SA_Abort, EL_Disk );
return 0;
return FALSE;
}
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 )
{
BOOL32 bSetDOSExtendedError = FALSE;
dprintf_int( stddeb, "int21: AX=%04x BX=%04x CX=%04x DX=%04x "
"SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n",
AX_reg(context), BX_reg(context), CX_reg(context),
@ -1112,35 +1128,23 @@ void DOS3Call( CONTEXT *context )
break;
case 0x39: /* "MKDIR" - CREATE SUBDIRECTORY */
if (!CreateDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ), NULL))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = (!CreateDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ), NULL));
break;
case 0x3a: /* "RMDIR" - REMOVE SUBDIRECTORY */
if (!RemoveDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) )))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = (!RemoveDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) )));
break;
case 0x3b: /* "CHDIR" - SET CURRENT DIRECTORY */
INT21_ChangeDir(context);
bSetDOSExtendedError = !INT21_ChangeDir(context);
break;
case 0x3c: /* "CREAT" - CREATE OR TRUNCATE FILE */
AX_reg(context) = _lcreat16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ), CX_reg(context) );
if (AX_reg(context) == (WORD)HFILE_ERROR16)
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = (AX_reg(context) == (WORD)HFILE_ERROR16);
break;
case 0x3d: /* "OPEN" - OPEN EXISTING FILE */
@ -1148,11 +1152,7 @@ void DOS3Call( CONTEXT *context )
break;
case 0x3e: /* "CLOSE" - CLOSE FILE */
if ((AX_reg(context) = _lclose16( BX_reg(context) )) != 0)
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = ((AX_reg(context) = _lclose16( BX_reg(context) )) != 0);
break;
case 0x3f: /* "READ" - READ FROM FILE OR DEVICE */
@ -1161,11 +1161,7 @@ void DOS3Call( CONTEXT *context )
PTR_SEG_OFF_TO_SEGPTR( DS_reg(context),
DX_reg(context) ),
CX_reg(context) );
if (result == -1)
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
if (result == -1) bSetDOSExtendedError = TRUE;
else AX_reg(context) = (WORD)result;
}
break;
@ -1176,22 +1172,14 @@ void DOS3Call( CONTEXT *context )
PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ),
CX_reg(context) );
if (result == -1)
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
if (result == -1) bSetDOSExtendedError = TRUE;
else AX_reg(context) = (WORD)result;
}
break;
case 0x41: /* "UNLINK" - DELETE FILE */
if (!DeleteFile32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) )))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = (!DeleteFile32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) )));
break;
case 0x42: /* "LSEEK" - SET CURRENT FILE POSITION */
@ -1199,14 +1187,12 @@ void DOS3Call( CONTEXT *context )
LONG status = _llseek16( BX_reg(context),
MAKELONG(DX_reg(context),CX_reg(context)),
AL_reg(context) );
if (status == -1)
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
break;
}
AX_reg(context) = LOWORD(status);
DX_reg(context) = HIWORD(status);
if (status == -1) bSetDOSExtendedError = TRUE;
else
{
AX_reg(context) = LOWORD(status);
DX_reg(context) = HIWORD(status);
}
}
break;
@ -1217,21 +1203,15 @@ void DOS3Call( CONTEXT *context )
AX_reg(context) = (WORD)GetFileAttributes32A(
PTR_SEG_OFF_TO_LIN(DS_reg(context),
DX_reg(context)));
if (AX_reg(context) == 0xffff)
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
if (AX_reg(context) == 0xffff) bSetDOSExtendedError = TRUE;
else CX_reg(context) = AX_reg(context);
break;
case 0x01:
if (!SetFileAttributes32A( PTR_SEG_OFF_TO_LIN(DS_reg(context),
DX_reg(context)),
CX_reg(context) ))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError =
(!SetFileAttributes32A( PTR_SEG_OFF_TO_LIN(DS_reg(context),
DX_reg(context)),
CX_reg(context) ));
break;
}
break;
@ -1312,8 +1292,9 @@ void DOS3Call( CONTEXT *context )
break;
case 0x0d:
ioctlGenericBlkDevReq(context);
bSetDOSExtendedError = ioctlGenericBlkDevReq(context);
break;
case 0x0e: /* get logical drive mapping */
AL_reg(context) = 0; /* drive has no mapping */
break;
@ -1333,31 +1314,17 @@ void DOS3Call( CONTEXT *context )
break;
case 0x45: /* "DUP" - DUPLICATE FILE HANDLE */
if ((AX_reg(context) = FILE_Dup(BX_reg(context))) == (WORD)HFILE_ERROR16)
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = ((AX_reg(context) = FILE_Dup(BX_reg(context))) == (WORD)HFILE_ERROR16);
break;
case 0x46: /* "DUP2", "FORCEDUP" - FORCE DUPLICATE FILE HANDLE */
if (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 */
bSetDOSExtendedError = (FILE_Dup2( BX_reg(context), CX_reg(context) ) == HFILE_ERROR32);
break;
case 0x47: /* "CWD" - GET CURRENT DIRECTORY */
if (!INT21_GetCurrentDirectory(context))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = !INT21_GetCurrentDirectory(context);
break;
case 0x48: /* ALLOCATE MEMORY */
case 0x49: /* FREE MEMORY */
case 0x4a: /* RESIZE MEMORY BLOCK */
@ -1406,12 +1373,9 @@ void DOS3Call( CONTEXT *context )
break;
case 0x56: /* "RENAME" - RENAME FILE */
if (!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);
}
bSetDOSExtendedError =
(!MoveFile32A( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)),
PTR_SEG_OFF_TO_LIN(ES_reg(context),DI_reg(context))));
break;
case 0x57: /* FILE DATE AND TIME */
@ -1421,10 +1385,7 @@ void DOS3Call( CONTEXT *context )
{
FILETIME filetime;
if (!GetFileTime( BX_reg(context), NULL, NULL, &filetime ))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = TRUE;
else FileTimeToDosDateTime( &filetime, &DX_reg(context),
&CX_reg(context) );
}
@ -1435,11 +1396,8 @@ void DOS3Call( CONTEXT *context )
FILETIME filetime;
DosDateTimeToFileTime( DX_reg(context), CX_reg(context),
&filetime );
if (!SetFileTime( BX_reg(context), NULL, NULL, &filetime ))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError =
(!SetFileTime( BX_reg(context), NULL, NULL, &filetime ));
}
break;
}
@ -1462,27 +1420,20 @@ void DOS3Call( CONTEXT *context )
break;
case 0x5a: /* CREATE TEMPORARY FILE */
if (!INT21_CreateTempFile(context))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = !INT21_CreateTempFile(context);
break;
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)
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = ((AX_reg(context) =
_lcreat_uniq( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)), 0 ))
== (WORD)HFILE_ERROR16);
break;
case 0x5d: /* NETWORK */
case 0x5e:
/* network software not installed */
DOS_ERROR( ER_NoNetwork, EC_NotFound, SA_Abort, EL_Network );
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
bSetDOSExtendedError = TRUE;
break;
case 0x5f: /* NETWORK */
@ -1492,8 +1443,7 @@ void DOS3Call( CONTEXT *context )
if (!DRIVE_Enable( DL_reg(context) ))
{
DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
bSetDOSExtendedError = TRUE;
}
break;
@ -1501,16 +1451,14 @@ void DOS3Call( CONTEXT *context )
if (!DRIVE_Disable( DL_reg(context) ))
{
DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
bSetDOSExtendedError = TRUE;
}
break;
default:
/* network software not installed */
DOS_ERROR( ER_NoNetwork, EC_NotFound, SA_Abort, EL_Network );
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
bSetDOSExtendedError = TRUE;
break;
}
break;
@ -1521,10 +1469,7 @@ void DOS3Call( CONTEXT *context )
SI_reg(context)), 128,
PTR_SEG_OFF_TO_LIN(ES_reg(context),
DI_reg(context)),NULL))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = TRUE;
else AX_reg(context) = 0;
}
break;
@ -1535,6 +1480,7 @@ void DOS3Call( CONTEXT *context )
INT_BARF( context, 0x21 );
SET_CFLAG(context);
break;
case 0x65:{/* GET EXTENDED COUNTRY INFORMATION */
extern WORD WINE_LanguageId;
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 */
SetHandleCount16( BX_reg(context) );
if (DOS_ExtendedError)
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
if (DOS_ExtendedError) bSetDOSExtendedError = TRUE;
break;
case 0x68: /* "FFLUSH" - COMMIT FILE */
case 0x6a: /* COMMIT FILE */
if (!FlushFileBuffers( BX_reg(context) ))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = (!FlushFileBuffers( BX_reg(context) ));
break;
case 0x69: /* DISK SERIAL NUMBER */
switch (AL_reg(context))
{
case 0x00:
if (!INT21_GetDiskSerialNumber(context))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
if (!INT21_GetDiskSerialNumber(context)) bSetDOSExtendedError = TRUE;
else AX_reg(context) = 0;
break;
case 0x01:
if (!INT21_SetDiskSerialNumber(context))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
if (!INT21_SetDiskSerialNumber(context)) bSetDOSExtendedError = TRUE;
else AX_reg(context) = 1;
break;
}
break;
case 0x6C: /* Extended Open/Create*/
ExtendedOpenCreateFile(context);
bSetDOSExtendedError = INT21_ExtendedOpenCreateFile(context);
break;
case 0x71: /* MS-DOS 7 (Windows95) - LONG FILENAME FUNCTIONS */
switch(AL_reg(context))
{
case 0x39: /* Create directory */
if (!CreateDirectory32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ), NULL))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = (!CreateDirectory32A(
PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ), NULL));
break;
case 0x3a: /* Remove directory */
if (!RemoveDirectory32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) )))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = (!RemoveDirectory32A(
PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) )));
break;
case 0x43: /* Get/Set file attributes */
switch (BL_reg(context))
@ -1641,20 +1566,13 @@ void DOS3Call( CONTEXT *context )
CX_reg(context) = (WORD)GetFileAttributes32A(
PTR_SEG_OFF_TO_LIN(DS_reg(context),
DX_reg(context)));
if (CX_reg(context) == 0xffff)
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
if (CX_reg(context) == 0xffff) bSetDOSExtendedError = TRUE;
break;
case 0x01:
if (!SetFileAttributes32A( PTR_SEG_OFF_TO_LIN(DS_reg(context),
DX_reg(context)),
CX_reg(context) ))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = (!SetFileAttributes32A(
PTR_SEG_OFF_TO_LIN(DS_reg(context),
DX_reg(context)),
CX_reg(context) ) );
break;
default:
fprintf( stderr,
@ -1666,14 +1584,9 @@ void DOS3Call( CONTEXT *context )
}
break;
case 0x47: /* Get current directory */
if (!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;
bSetDOSExtendedError = !INT21_GetCurrentDirectory(context);
break;
case 0x4e: /* Find first file */
/* FIXME: use attributes in CX */
if ((AX_reg(context) = FindFirstFile16(
@ -1681,42 +1594,29 @@ void DOS3Call( CONTEXT *context )
(WIN32_FIND_DATA32A *)PTR_SEG_OFF_TO_LIN(ES_reg(context),
DI_reg(context))))
== INVALID_HANDLE_VALUE16)
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = TRUE;
break;
case 0x4f: /* Find next file */
if (!FindNextFile16( BX_reg(context),
(WIN32_FIND_DATA32A *)PTR_SEG_OFF_TO_LIN(ES_reg(context),
DI_reg(context))))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = TRUE;
break;
case 0xa1: /* Find close */
if (!FindClose16( BX_reg(context) ))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = (!FindClose16( BX_reg(context) ));
break;
case 0xa0:
break;
case 0x60:
switch(CL_reg(context))
{
{
case 0x02: /*Get canonical long filename or path */
if (!GetFullPathName32A
( PTR_SEG_OFF_TO_LIN(DS_reg(context),
SI_reg(context)), 128,
PTR_SEG_OFF_TO_LIN(ES_reg(context),
DI_reg(context)),NULL))
{
AX_reg(context) = DOS_ExtendedError;
SET_CFLAG(context);
}
bSetDOSExtendedError = TRUE;
else AX_reg(context) = 0;
break;
default:
@ -1726,13 +1626,23 @@ void DOS3Call( CONTEXT *context )
SET_CFLAG(context);
AL_reg(context) = 0;
break;
}
}
break;
case 0x6c: /* Create or open file */
/* translate Dos 7 action to Dos 6 action */
ExtendedOpenCreateFile(context);
bSetDOSExtendedError = INT21_ExtendedOpenCreateFile(context);
break;
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 0x56: /* Move (rename) file */
default:
@ -1761,7 +1671,15 @@ void DOS3Call( CONTEXT *context )
default:
INT_BARF( context, 0x21 );
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 "
"SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n",
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),
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);
memcpy(lpDesc->lpFormat, lpWaveFormat, sizeof(PCMWAVEFORMAT));
lpDesc = (LPWAVEOPENDESC) USER_HEAP_SEG_ADDR(hDesc);
dwRet = wodMessage(wDevID, WODM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
dwRet = widMessage(wDevID, WIDM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
dwRet = wodMessage(index, WODM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
dwRet = widMessage(index, WIDM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
USER_HEAP_FREE(hFormat);
USER_HEAP_FREE(hDesc);
return 0;
@ -233,9 +233,9 @@ static DWORD WAVE_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpP
mmioClose(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;
dwRet = widMessage(wDevID, WIDM_CLOSE, 0, 0L, 0L);
dwRet = widMessage(index, WIDM_CLOSE, 0, 0L, 0L);
if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
}
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);
memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR));
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) {
count = mmioRead(MCIWavDev[index].hFile,
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; */
dprintf_mciwave(stddeb,"WAVE_mciPlay // before WODM_WRITE lpWaveHdr=%p dwBufferLength=%lu dwBytesRecorded=%lu\n",
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) {
GlobalUnlock16(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);
memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR));
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");
while(TRUE) {
lpWaveHdr->dwBytesRecorded = 0;
dwRet = widMessage(wDevID, WIDM_START, 0, 0L, 0L);
dwRet = widMessage(index, WIDM_START, 0, 0L, 0L);
dprintf_mciwave(stddeb,
"WAVE_mciRecord // after WIDM_START lpWaveHdr=%p dwBytesRecorded=%lu\n",
lpWaveHdr, lpWaveHdr->dwBytesRecorded);
if (lpWaveHdr->dwBytesRecorded == 0) break;
}
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");
if (lpWaveHdr->lpData != NULL) {
GlobalUnlock16(hData);
@ -759,7 +759,6 @@ static DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPS lpCaps, DWORD dwSize)
*/
static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
int audio;
int abuf_size;
int smplrate;
@ -777,7 +776,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
dprintf_mciwave(stddeb,"Linux 'wodOpen' // MAX_WAVOUTDRV reached !\n");
return MMSYSERR_ALLOCATED;
}
WOutDev[index].unixdev = 0;
WOutDev[wDevID].unixdev = 0;
audio = open (SOUND_DEV, O_WRONLY, 0);
if (audio == -1) {
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");
return MMSYSERR_NOTENABLED;
}
WOutDev[index].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
switch(WOutDev[index].wFlags) {
WOutDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
switch(WOutDev[wDevID].wFlags) {
case DCB_NULL:
dprintf_mciwave(stddeb, "Linux 'wodOpen' // CALLBACK_NULL !\n");
break;
@ -806,13 +805,12 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
dprintf_mciwave(stddeb, "Linux 'wodOpen' // CALLBACK_FUNCTION !\n");
break;
}
WOutDev[index].lpQueueHdr = NULL;
WOutDev[index].unixdev = audio;
WOutDev[index].dwTotalPlayed = 0;
WOutDev[index].bufsize = abuf_size;
memcpy(&WOutDev[index].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
/* lpFormat = (LPWAVEFORMAT) PTR_SEG_TO_LIN(lpDesc->lpFormat); */
lpFormat = lpDesc->lpFormat;
WOutDev[wDevID].lpQueueHdr = NULL;
WOutDev[wDevID].unixdev = audio;
WOutDev[wDevID].dwTotalPlayed = 0;
WOutDev[wDevID].bufsize = abuf_size;
memcpy(&WOutDev[wDevID].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
lpFormat = (LPWAVEFORMAT) PTR_SEG_TO_LIN(lpDesc->lpFormat);
if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
dprintf_mciwave(stddeb,"Linux 'wodOpen' // Bad format %04X !\n",
lpFormat->wFormatTag);
@ -822,31 +820,31 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
lpFormat->nSamplesPerSec);
return WAVERR_BADFORMAT;
}
memcpy(&WOutDev[index].Format, lpFormat, sizeof(PCMWAVEFORMAT));
if (WOutDev[index].Format.wf.nChannels == 0) return WAVERR_BADFORMAT;
if (WOutDev[index].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT;
memcpy(&WOutDev[wDevID].Format, lpFormat, sizeof(PCMWAVEFORMAT));
if (WOutDev[wDevID].Format.wf.nChannels == 0) return WAVERR_BADFORMAT;
if (WOutDev[wDevID].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT;
dprintf_mciwave(stddeb,"Linux 'wodOpen' // wBitsPerSample=%u !\n",
WOutDev[index].Format.wBitsPerSample);
if (WOutDev[index].Format.wBitsPerSample == 0) {
WOutDev[index].Format.wBitsPerSample = 8 *
(WOutDev[index].Format.wf.nAvgBytesPerSec /
WOutDev[index].Format.wf.nSamplesPerSec) /
WOutDev[index].Format.wf.nChannels;
WOutDev[wDevID].Format.wBitsPerSample);
if (WOutDev[wDevID].Format.wBitsPerSample == 0) {
WOutDev[wDevID].Format.wBitsPerSample = 8 *
(WOutDev[wDevID].Format.wf.nAvgBytesPerSec /
WOutDev[wDevID].Format.wf.nSamplesPerSec) /
WOutDev[wDevID].Format.wf.nChannels;
}
samplesize = WOutDev[index].Format.wBitsPerSample;
smplrate = WOutDev[index].Format.wf.nSamplesPerSec;
dsp_stereo = (WOutDev[index].Format.wf.nChannels > 1) ? TRUE : FALSE;
samplesize = WOutDev[wDevID].Format.wBitsPerSample;
smplrate = WOutDev[wDevID].Format.wf.nSamplesPerSec;
dsp_stereo = (WOutDev[wDevID].Format.wf.nChannels > 1) ? TRUE : FALSE;
IOCTL(audio, SNDCTL_DSP_SPEED, smplrate);
IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, samplesize);
IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo);
dprintf_mciwave(stddeb,"Linux 'wodOpen' // wBitsPerSample=%u !\n",
WOutDev[index].Format.wBitsPerSample);
WOutDev[wDevID].Format.wBitsPerSample);
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",
WOutDev[index].Format.wf.nSamplesPerSec);
WOutDev[wDevID].Format.wf.nSamplesPerSec);
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) {
dprintf_mciwave(stddeb,"Linux 'wodOpen' // can't notify client !\n");
return MMSYSERR_INVALPARAM;
@ -859,16 +857,15 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
*/
static DWORD wodClose(WORD wDevID)
{
int index = MMSYSTEM_DevIDToIndex(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");
return MMSYSERR_NOTENABLED;
}
close(WOutDev[index].unixdev);
WOutDev[index].unixdev = 0;
WOutDev[index].bufsize = 0;
WOutDev[index].lpQueueHdr = NULL;
close(WOutDev[wDevID].unixdev);
WOutDev[wDevID].unixdev = 0;
WOutDev[wDevID].bufsize = 0;
WOutDev[wDevID].lpQueueHdr = NULL;
if (WAVE_NotifyClient(wDevID, WOM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
dprintf_mciwave(stddeb,"Linux 'wodClose' // can't notify client !\n");
return MMSYSERR_INVALPARAM;
@ -881,11 +878,10 @@ static DWORD wodClose(WORD wDevID)
*/
static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
int count;
LPSTR lpData;
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");
return MMSYSERR_NOTENABLED;
}
@ -897,16 +893,16 @@ static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
dprintf_mciwave(stddeb,
"wodWrite() // dwBufferLength %lu !\n", lpWaveHdr->dwBufferLength);
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);
count = write (WOutDev[index].unixdev, lpData, lpWaveHdr->dwBufferLength);
count = write (WOutDev[wDevID].unixdev, lpData, lpWaveHdr->dwBufferLength);
dprintf_mciwave(stddeb,
"wodWrite() // write returned count %u !\n", count);
if (count != lpWaveHdr->dwBufferLength) {
dprintf_mciwave(stddeb,"Linux 'wodWrite' // error writting !\n");
return MMSYSERR_NOTENABLED;
}
WOutDev[index].dwTotalPlayed += count;
WOutDev[wDevID].dwTotalPlayed += count;
lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
lpWaveHdr->dwFlags |= WHDR_DONE;
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)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,
"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");
return MMSYSERR_NOTENABLED;
}
/* the COOL waveeditor feels much better without this check...
* 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");
return MMSYSERR_NOTENABLED;
}
*/
WOutDev[index].dwTotalPlayed = 0;
WOutDev[index].lpQueueHdr = lpWaveHdr;
WOutDev[wDevID].dwTotalPlayed = 0;
WOutDev[wDevID].lpQueueHdr = lpWaveHdr;
if (lpWaveHdr->dwFlags & WHDR_INQUEUE) return WAVERR_STILLPLAYING;
lpWaveHdr->dwFlags |= WHDR_PREPARED;
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)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,
"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");
return MMSYSERR_NOTENABLED;
}
@ -963,9 +957,8 @@ static DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/
static DWORD wodRestart(WORD wDevID)
{
int index = MMSYSTEM_DevIDToIndex(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");
return MMSYSERR_NOTENABLED;
}
@ -977,9 +970,8 @@ static DWORD wodRestart(WORD wDevID)
*/
static DWORD wodReset(WORD wDevID)
{
int index = MMSYSTEM_DevIDToIndex(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");
return MMSYSERR_NOTENABLED;
}
@ -992,31 +984,30 @@ static DWORD wodReset(WORD wDevID)
*/
static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
int time;
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");
return MMSYSERR_NOTENABLED;
}
if (lpTime == NULL) return MMSYSERR_INVALPARAM;
switch(lpTime->wType) {
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);
break;
case TIME_SAMPLES:
dprintf_mciwave(stddeb,"wodGetPosition // dwTotalPlayed=%lu\n",
WOutDev[index].dwTotalPlayed);
WOutDev[wDevID].dwTotalPlayed);
dprintf_mciwave(stddeb,"wodGetPosition // wBitsPerSample=%u\n",
WOutDev[index].Format.wBitsPerSample);
lpTime->u.sample = WOutDev[index].dwTotalPlayed * 8 /
WOutDev[index].Format.wBitsPerSample;
WOutDev[wDevID].Format.wBitsPerSample);
lpTime->u.sample = WOutDev[wDevID].dwTotalPlayed * 8 /
WOutDev[wDevID].Format.wBitsPerSample;
dprintf_mciwave(stddeb,"wodGetPosition // TIME_SAMPLES=%lu\n", lpTime->u.sample);
break;
case TIME_SMPTE:
time = WOutDev[index].dwTotalPlayed /
(WOutDev[index].Format.wf.nAvgBytesPerSec / 1000);
time = WOutDev[wDevID].dwTotalPlayed /
(WOutDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
lpTime->u.smpte.hour = time / 108000;
time -= lpTime->u.smpte.hour * 108000;
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");
lpTime->wType = TIME_MS;
case TIME_MS:
lpTime->u.ms = WOutDev[index].dwTotalPlayed /
(WOutDev[index].Format.wf.nAvgBytesPerSec / 1000);
lpTime->u.ms = WOutDev[wDevID].dwTotalPlayed /
(WOutDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
dprintf_mciwave(stddeb,"wodGetPosition // TIME_MS=%lu\n", lpTime->u.ms);
break;
}
@ -1218,7 +1209,6 @@ static DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPS lpCaps, DWORD dwSize)
*/
static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
int audio;
int abuf_size;
int smplrate;
@ -1234,7 +1224,7 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
dprintf_mciwave(stddeb,"Linux 'widOpen' // MAX_WAVINDRV reached !\n");
return MMSYSERR_ALLOCATED;
}
WInDev[index].unixdev = 0;
WInDev[wDevID].unixdev = 0;
audio = open (SOUND_DEV, O_RDONLY, 0);
if (audio == -1) {
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");
return MMSYSERR_NOTENABLED;
}
WInDev[index].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
switch(WInDev[index].wFlags) {
WInDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
switch(WInDev[wDevID].wFlags) {
case DCB_NULL:
dprintf_mciwave(stddeb, "Linux 'widOpen' // CALLBACK_NULL !\n");
break;
@ -1263,41 +1253,41 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
dprintf_mciwave(stddeb, "Linux 'widOpen' // CALLBACK_FUNCTION !\n");
break;
}
WInDev[index].lpQueueHdr = NULL;
WInDev[index].unixdev = audio;
WInDev[index].bufsize = abuf_size;
WInDev[index].dwTotalRecorded = 0;
memcpy(&WInDev[index].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
WInDev[wDevID].lpQueueHdr = NULL;
WInDev[wDevID].unixdev = audio;
WInDev[wDevID].bufsize = abuf_size;
WInDev[wDevID].dwTotalRecorded = 0;
memcpy(&WInDev[wDevID].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
lpFormat = lpDesc->lpFormat;
if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
dprintf_mciwave(stddeb,"Linux 'widOpen' // Bad format %04X !\n",
lpFormat->wFormatTag);
return WAVERR_BADFORMAT;
}
memcpy(&WInDev[index].Format, lpFormat, sizeof(PCMWAVEFORMAT));
WInDev[index].Format.wBitsPerSample = 8; /* <-------------- */
if (WInDev[index].Format.wf.nChannels == 0) return WAVERR_BADFORMAT;
if (WInDev[index].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT;
if (WInDev[index].Format.wBitsPerSample == 0) {
WInDev[index].Format.wBitsPerSample = 8 *
(WInDev[index].Format.wf.nAvgBytesPerSec /
WInDev[index].Format.wf.nSamplesPerSec) /
WInDev[index].Format.wf.nChannels;
memcpy(&WInDev[wDevID].Format, lpFormat, sizeof(PCMWAVEFORMAT));
WInDev[wDevID].Format.wBitsPerSample = 8; /* <-------------- */
if (WInDev[wDevID].Format.wf.nChannels == 0) return WAVERR_BADFORMAT;
if (WInDev[wDevID].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT;
if (WInDev[wDevID].Format.wBitsPerSample == 0) {
WInDev[wDevID].Format.wBitsPerSample = 8 *
(WInDev[wDevID].Format.wf.nAvgBytesPerSec /
WInDev[wDevID].Format.wf.nSamplesPerSec) /
WInDev[wDevID].Format.wf.nChannels;
}
samplesize = WInDev[index].Format.wBitsPerSample;
smplrate = WInDev[index].Format.wf.nSamplesPerSec;
dsp_stereo = (WInDev[index].Format.wf.nChannels > 1) ? TRUE : FALSE;
samplesize = WInDev[wDevID].Format.wBitsPerSample;
smplrate = WInDev[wDevID].Format.wf.nSamplesPerSec;
dsp_stereo = (WInDev[wDevID].Format.wf.nChannels > 1) ? TRUE : FALSE;
IOCTL(audio, SNDCTL_DSP_SPEED, smplrate);
IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, samplesize);
IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo);
dprintf_mciwave(stddeb,"Linux 'widOpen' // wBitsPerSample=%u !\n",
WInDev[index].Format.wBitsPerSample);
WInDev[wDevID].Format.wBitsPerSample);
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",
WInDev[index].Format.wf.nChannels);
WInDev[wDevID].Format.wf.nChannels);
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) {
dprintf_mciwave(stddeb,"Linux 'widOpen' // can't notify client !\n");
return MMSYSERR_INVALPARAM;
@ -1310,15 +1300,14 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
*/
static DWORD widClose(WORD wDevID)
{
int index = MMSYSTEM_DevIDToIndex(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");
return MMSYSERR_NOTENABLED;
}
close(WInDev[index].unixdev);
WInDev[index].unixdev = 0;
WInDev[index].bufsize = 0;
close(WInDev[wDevID].unixdev);
WInDev[wDevID].unixdev = 0;
WInDev[wDevID].bufsize = 0;
if (WAVE_NotifyClient(wDevID, WIM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
dprintf_mciwave(stddeb,"Linux 'widClose' // can't notify client !\n");
return MMSYSERR_INVALPARAM;
@ -1331,12 +1320,11 @@ static DWORD widClose(WORD wDevID)
*/
static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
int count = 1;
LPWAVEHDR lpWIHdr;
dprintf_mciwave(stddeb,
"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");
return MMSYSERR_NOTENABLED;
}
@ -1352,14 +1340,14 @@ static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
lpWaveHdr->dwFlags |= WHDR_INQUEUE;
lpWaveHdr->dwFlags &= ~WHDR_DONE;
lpWaveHdr->dwBytesRecorded = 0;
if (WInDev[index].lpQueueHdr == NULL) {
if (WInDev[wDevID].lpQueueHdr == NULL) {
/* begin the queue with a first header ... */
WInDev[index].lpQueueHdr = lpWaveHdr;
WInDev[index].dwTotalRecorded = 0;
WInDev[wDevID].lpQueueHdr = lpWaveHdr;
WInDev[wDevID].dwTotalRecorded = 0;
}
else {
/* added to the queue, except if it's the one just prepared ... */
lpWIHdr = WInDev[index].lpQueueHdr;
lpWIHdr = WInDev[wDevID].lpQueueHdr;
while (lpWIHdr->lpNext != NULL) {
lpWIHdr = lpWIHdr->lpNext;
count++;
@ -1377,14 +1365,13 @@ static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/
static DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,
"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");
return MMSYSERR_NOTENABLED;
}
if (WInDev[index].lpQueueHdr != NULL) {
if (WInDev[wDevID].lpQueueHdr != NULL) {
dprintf_mciwave(stddeb,"Linux 'widPrepare' // already prepare !\n");
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)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,
"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");
return MMSYSERR_NOTENABLED;
}
lpWaveHdr->dwFlags &= ~WHDR_PREPARED;
lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
lpWaveHdr->dwFlags |= WHDR_DONE;
WInDev[index].lpQueueHdr = NULL;
WInDev[wDevID].lpQueueHdr = NULL;
dprintf_mciwave(stddeb,
"Linux 'widUnprepare' // all headers unprepared !\n");
return MMSYSERR_NOERROR;
@ -1423,31 +1409,30 @@ static DWORD widUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*/
static DWORD widStart(WORD wDevID)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
int count = 1;
LPWAVEHDR lpWIHdr;
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");
return MMSYSERR_NOTENABLED;
}
if (WInDev[index].lpQueueHdr == NULL ||
WInDev[index].lpQueueHdr->lpData == NULL) {
if (WInDev[wDevID].lpQueueHdr == NULL ||
WInDev[wDevID].lpQueueHdr->lpData == NULL) {
dprintf_mciwave(stddeb,"Linux 'widStart' // never been prepared !\n");
return WAVERR_UNPREPARED;
}
lpWIHdr = WInDev[index].lpQueueHdr;
lpWIHdr = WInDev[wDevID].lpQueueHdr;
while(lpWIHdr != NULL) {
lpWIHdr->dwBufferLength &= 0xFFFF;
dprintf_mciwave(stddeb,
"widStart // recording buf#%u=%p size=%lu \n",
count, lpWIHdr->lpData, lpWIHdr->dwBufferLength);
fflush(stddeb);
read (WInDev[index].unixdev,
read (WInDev[wDevID].unixdev,
PTR_SEG_TO_LIN(lpWIHdr->lpData),
lpWIHdr->dwBufferLength);
lpWIHdr->dwBytesRecorded = lpWIHdr->dwBufferLength;
WInDev[index].dwTotalRecorded += lpWIHdr->dwBytesRecorded;
WInDev[wDevID].dwTotalRecorded += lpWIHdr->dwBytesRecorded;
lpWIHdr->dwFlags &= ~WHDR_INQUEUE;
lpWIHdr->dwFlags |= WHDR_DONE;
if (WAVE_NotifyClient(wDevID, WIM_DATA, (DWORD)lpWIHdr, 0L) !=
@ -1468,9 +1453,8 @@ static DWORD widStart(WORD wDevID)
*/
static DWORD widStop(WORD wDevID)
{
int index = MMSYSTEM_DevIDToIndex(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");
return MMSYSERR_NOTENABLED;
}
@ -1482,9 +1466,8 @@ static DWORD widStop(WORD wDevID)
*/
static DWORD widReset(WORD wDevID)
{
int index = MMSYSTEM_DevIDToIndex(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");
return MMSYSERR_NOTENABLED;
}
@ -1496,12 +1479,11 @@ static DWORD widReset(WORD wDevID)
*/
static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
int time;
dprintf_mciwave(stddeb,
"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");
return MMSYSERR_NOTENABLED;
}
@ -1509,30 +1491,30 @@ static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
dprintf_mciwave(stddeb,"widGetPosition // wType=%04X !\n",
lpTime->wType);
dprintf_mciwave(stddeb,"widGetPosition // wBitsPerSample=%u\n",
WInDev[index].Format.wBitsPerSample);
WInDev[wDevID].Format.wBitsPerSample);
dprintf_mciwave(stddeb,"widGetPosition // nSamplesPerSec=%lu\n",
WInDev[index].Format.wf.nSamplesPerSec);
WInDev[wDevID].Format.wf.nSamplesPerSec);
dprintf_mciwave(stddeb,"widGetPosition // nChannels=%u\n",
WInDev[index].Format.wf.nChannels);
WInDev[wDevID].Format.wf.nChannels);
dprintf_mciwave(stddeb,"widGetPosition // nAvgBytesPerSec=%lu\n",
WInDev[index].Format.wf.nAvgBytesPerSec);
WInDev[wDevID].Format.wf.nAvgBytesPerSec);
fflush(stddeb);
switch(lpTime->wType) {
case TIME_BYTES:
lpTime->u.cb = WInDev[index].dwTotalRecorded;
lpTime->u.cb = WInDev[wDevID].dwTotalRecorded;
dprintf_mciwave(stddeb,
"widGetPosition // TIME_BYTES=%lu\n", lpTime->u.cb);
break;
case TIME_SAMPLES:
lpTime->u.sample = WInDev[index].dwTotalRecorded * 8 /
WInDev[index].Format.wBitsPerSample;
lpTime->u.sample = WInDev[wDevID].dwTotalRecorded * 8 /
WInDev[wDevID].Format.wBitsPerSample;
dprintf_mciwave(stddeb,
"widGetPosition // TIME_SAMPLES=%lu\n",
lpTime->u.sample);
break;
case TIME_SMPTE:
time = WInDev[index].dwTotalRecorded /
(WInDev[index].Format.wf.nAvgBytesPerSec / 1000);
time = WInDev[wDevID].dwTotalRecorded /
(WInDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
lpTime->u.smpte.hour = time / 108000;
time -= lpTime->u.smpte.hour * 108000;
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");
lpTime->wType = TIME_MS;
case TIME_MS:
lpTime->u.ms = WInDev[index].dwTotalRecorded /
(WInDev[index].Format.wf.nAvgBytesPerSec / 1000);
lpTime->u.ms = WInDev[wDevID].dwTotalRecorded /
(WInDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
dprintf_mciwave(stddeb,
"widGetPosition // TIME_MS=%lu\n", lpTime->u.ms);
break;

View File

@ -98,8 +98,7 @@ BOOL32 MMSYSTEM_DevIDValid(UINT16 wDevID) {
int MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg,
WORD cbHeapSize, LPSTR lpCmdLine)
{
/* isn't WEP the Windows Exit Procedure ? */
printf("MMSYSTEM DLL INIT ... hInst=%04X \n", hInstance);
fprintf(stderr, "STUB: Unloading MMSystem DLL ... hInst=%04X \n", hInstance);
return(TRUE);
}
@ -108,22 +107,12 @@ int MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg,
*/
BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
{
BOOL16 bRet = FALSE;
HMMIO16 hmmio;
MMCKINFO mmckInfo;
MMCKINFO ckMainRIFF;
HLOCAL16 hFormat;
PCMWAVEFORMAT pcmWaveFormat;
int count;
int bufsize;
HLOCAL16 hDesc;
LPWAVEOPENDESC lpWaveDesc;
HLOCAL16 hWaveHdr;
LPWAVEHDR lpWaveHdr;
LPWAVEHDR lp16WaveHdr;
HLOCAL16 hData;
DWORD dwRet;
MMCKINFO ckMainRIFF;
char str[128];
LPSTR ptr;
dprintf_mmsys(stddeb, "sndPlaySound // SoundName='%s' uFlags=%04X !\n",
lpszSoundName, uFlags);
if (lpszSoundName == NULL) {
@ -138,95 +127,122 @@ BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
return FALSE;
}
if (hmmio == 0) {
if (hmmio == 0)
{
dprintf_mmsys(stddeb, "sndPlaySound // searching in SystemSound List !\n");
GetProfileString32A("Sounds", (LPSTR)lpszSoundName, "", str, sizeof(str));
if (strlen(str) == 0) return FALSE;
if ( (ptr = (LPSTR)strchr(str, ',')) != NULL) *ptr = '\0';
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);
return FALSE;
}
}
if (mmioDescend(hmmio, &ckMainRIFF, NULL, 0) == 0)
{
dprintf_mmsys(stddeb, "sndPlaySound // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
(LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType, ckMainRIFF.cksize);
if ((ckMainRIFF.ckid == FOURCC_RIFF) &&
(ckMainRIFF.fccType == mmioFOURCC('W', 'A', 'V', 'E')))
{
MMCKINFO mmckInfo;
mmckInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) == 0)
{
PCMWAVEFORMAT pcmWaveFormat;
dprintf_mmsys(stddeb, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType, mmckInfo.cksize);
if (mmioRead(hmmio, (HPSTR) &pcmWaveFormat,
(long) sizeof(PCMWAVEFORMAT)) == (long) sizeof(PCMWAVEFORMAT))
{
dprintf_mmsys(stddeb, "sndPlaySound // wFormatTag=%04X !\n", pcmWaveFormat.wf.wFormatTag);
dprintf_mmsys(stddeb, "sndPlaySound // nChannels=%d \n", pcmWaveFormat.wf.nChannels);
dprintf_mmsys(stddeb, "sndPlaySound // nSamplesPerSec=%ld\n", pcmWaveFormat.wf.nSamplesPerSec);
dprintf_mmsys(stddeb, "sndPlaySound // nAvgBytesPerSec=%ld\n", pcmWaveFormat.wf.nAvgBytesPerSec);
dprintf_mmsys(stddeb, "sndPlaySound // nBlockAlign=%d \n", pcmWaveFormat.wf.nBlockAlign);
dprintf_mmsys(stddeb, "sndPlaySound // wBitsPerSample=%u !\n", pcmWaveFormat.wBitsPerSample);
mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) == 0)
{
LPWAVEFORMAT lpFormat = (LPWAVEFORMAT) SEGPTR_ALLOC(sizeof(PCMWAVEFORMAT));
LPWAVEOPENDESC lpWaveDesc = (LPWAVEOPENDESC) SEGPTR_ALLOC(sizeof(WAVEOPENDESC));
DWORD dwRet;
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->lpFormat = (LPWAVEFORMAT) SEGPTR_GET(lpFormat);
dwRet = wodMessage( MMSYSTEM_FirstDevID(),
WODM_OPEN, 0, (DWORD)SEGPTR_GET(lpWaveDesc), CALLBACK_NULL);
SEGPTR_FREE(lpFormat);
SEGPTR_FREE(lpWaveDesc);
if (dwRet == MMSYSERR_NOERROR)
{
LPWAVEHDR lpWaveHdr = (LPWAVEHDR) SEGPTR_ALLOC(sizeof(WAVEHDR));
SEGPTR spWaveHdr = SEGPTR_GET(lpWaveHdr);
HGLOBAL16 hData;
INT32 count, bufsize;
bufsize = 64000;
hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData);
lpWaveHdr->dwBufferLength = bufsize;
lpWaveHdr->dwUser = 0L;
lpWaveHdr->dwFlags = 0L;
lpWaveHdr->dwLoops = 0L;
dwRet = wodMessage( MMSYSTEM_FirstDevID(),
WODM_PREPARE, 0, (DWORD)spWaveHdr, sizeof(WAVEHDR));
if (dwRet == MMSYSERR_NOERROR)
{
while( TRUE )
{
count = mmioRead(hmmio, PTR_SEG_TO_LIN(lpWaveHdr->lpData), bufsize);
if (count < 1) break;
lpWaveHdr->dwBufferLength = count;
/* lpWaveHdr->dwBytesRecorded = count; */
wodMessage( MMSYSTEM_FirstDevID(), WODM_WRITE,
0, (DWORD)spWaveHdr, sizeof(WAVEHDR));
}
wodMessage( MMSYSTEM_FirstDevID(),
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);
GlobalFree16(hData);
SEGPTR_FREE(lpWaveHdr);
}
}
}
}
if (mmioDescend(hmmio, &ckMainRIFF, NULL, 0) != 0) {
ErrSND: if (hmmio != 0) mmioClose(hmmio, 0);
return FALSE;
}
dprintf_mmsys(stddeb, "sndPlaySound // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
(LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType,
ckMainRIFF.cksize);
if ((ckMainRIFF.ckid != FOURCC_RIFF) ||
(ckMainRIFF.fccType != mmioFOURCC('W', 'A', 'V', 'E'))) goto ErrSND;
mmckInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) goto ErrSND;
dprintf_mmsys(stddeb, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
mmckInfo.cksize);
if (mmioRead(hmmio, (HPSTR) &pcmWaveFormat,
(long) sizeof(PCMWAVEFORMAT)) != (long) sizeof(PCMWAVEFORMAT)) goto ErrSND;
}
}
dprintf_mmsys(stddeb, "sndPlaySound // wFormatTag=%04X !\n", pcmWaveFormat.wf.wFormatTag);
dprintf_mmsys(stddeb, "sndPlaySound // nChannels=%d \n", pcmWaveFormat.wf.nChannels);
dprintf_mmsys(stddeb, "sndPlaySound // nSamplesPerSec=%ld\n", pcmWaveFormat.wf.nSamplesPerSec);
dprintf_mmsys(stddeb, "sndPlaySound // nAvgBytesPerSec=%ld\n", pcmWaveFormat.wf.nAvgBytesPerSec);
dprintf_mmsys(stddeb, "sndPlaySound // nBlockAlign=%d \n", pcmWaveFormat.wf.nBlockAlign);
dprintf_mmsys(stddeb, "sndPlaySound // wBitsPerSample=%u !\n", pcmWaveFormat.wBitsPerSample);
mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) goto ErrSND;
dprintf_mmsys(stddeb, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
mmckInfo.cksize);
hDesc = USER_HEAP_ALLOC(sizeof(WAVEOPENDESC));
lpWaveDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hDesc);
lpWaveDesc->hWave = 0;
pcmWaveFormat.wf.nAvgBytesPerSec =
pcmWaveFormat.wf.nSamplesPerSec * pcmWaveFormat.wf.nBlockAlign;
hFormat = USER_HEAP_ALLOC(sizeof(PCMWAVEFORMAT));
lpWaveDesc->lpFormat = (LPWAVEFORMAT) USER_HEAP_LIN_ADDR(hFormat);
memcpy(lpWaveDesc->lpFormat, &pcmWaveFormat, sizeof(PCMWAVEFORMAT));
lpWaveDesc = (LPWAVEOPENDESC) USER_HEAP_SEG_ADDR(hDesc);
dwRet = wodMessage(0, WODM_OPEN, 0, (DWORD)lpWaveDesc, CALLBACK_NULL);
if (dwRet != MMSYSERR_NOERROR) {
dprintf_mmsys(stddeb, "sndPlaySound // can't open WaveOut device !\n");
goto ErrSND;
}
USER_HEAP_FREE(hFormat);
hWaveHdr = USER_HEAP_ALLOC(sizeof(WAVEHDR));
lpWaveHdr = (LPWAVEHDR) USER_HEAP_LIN_ADDR(hWaveHdr);
lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
bufsize = 64000;
hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData);
lpWaveHdr->dwBufferLength = bufsize;
lpWaveHdr->dwUser = 0L;
lpWaveHdr->dwFlags = 0L;
lpWaveHdr->dwLoops = 0L;
dwRet = wodMessage(0, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
if (dwRet != MMSYSERR_NOERROR) {
dprintf_mmsys(stddeb, "sndPlaySound // can't prepare WaveOut device !\n");
GlobalUnlock16(hData);
GlobalFree16(hData);
USER_HEAP_FREE(hDesc);
USER_HEAP_FREE(hWaveHdr);
goto ErrSND;
}
while(TRUE) {
count = mmioRead(hmmio, PTR_SEG_TO_LIN(lpWaveHdr->lpData), bufsize);
if (count < 1) break;
lpWaveHdr->dwBufferLength = count;
/* lpWaveHdr->dwBytesRecorded = count; */
wodMessage(0, WODM_WRITE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
}
wodMessage(0, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
wodMessage(0, WODM_CLOSE, 0, 0L, 0L);
GlobalUnlock16(hData);
GlobalFree16(hData);
USER_HEAP_FREE(hDesc);
USER_HEAP_FREE(hWaveHdr);
if (hmmio != 0) mmioClose(hmmio, 0);
return TRUE;
if (hmmio != 0) mmioClose(hmmio, 0);
return bRet;
}
/**************************************************************************
@ -1407,7 +1423,7 @@ UINT16 waveOutGetNumDevs()
{
UINT16 count = 0;
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);
return count;
}
@ -1552,7 +1568,7 @@ UINT16 waveOutClose(HWAVEOUT16 hWaveOut)
dprintf_mmsys(stddeb, "waveOutClose(%04X)\n", hWaveOut);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
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);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_PREPARE, lpDesc->dwInstance,
return wodMessage( MMSYSTEM_FirstDevID(), WODM_PREPARE, lpDesc->dwInstance,
(DWORD)lpWaveOutHdr, uSize);
}
@ -1581,7 +1597,7 @@ UINT16 waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
hWaveOut, lpWaveOutHdr, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_UNPREPARE, lpDesc->dwInstance,
return wodMessage( MMSYSTEM_FirstDevID(), WODM_UNPREPARE, lpDesc->dwInstance,
(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);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_WRITE, lpDesc->dwInstance,
return wodMessage( MMSYSTEM_FirstDevID(), WODM_WRITE, lpDesc->dwInstance,
(DWORD)lpWaveOutHdr, uSize);
}
@ -1607,7 +1623,7 @@ UINT16 waveOutPause(HWAVEOUT16 hWaveOut)
dprintf_mmsys(stddeb, "waveOutPause(%04X)\n", hWaveOut);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
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);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
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);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
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);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
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);
}
@ -1656,7 +1672,7 @@ UINT16 waveOutGetPitch(HWAVEOUT16 hWaveOut, DWORD * lpdwPitch)
dprintf_mmsys(stddeb, "waveOutGetPitch(%04X, %p);\n", hWaveOut, lpdwPitch);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_GETPITCH, lpDesc->dwInstance,
return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPITCH, lpDesc->dwInstance,
(DWORD)lpdwPitch, 0L);
}
@ -1669,7 +1685,7 @@ UINT16 waveOutSetPitch(HWAVEOUT16 hWaveOut, DWORD dwPitch)
dprintf_mmsys(stddeb, "waveOutSetPitch(%04X, %08lX);\n", hWaveOut, dwPitch);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
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);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_GETPLAYBACKRATE, lpDesc->dwInstance,
return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPLAYBACKRATE, lpDesc->dwInstance,
(DWORD)lpdwRate, 0L);
}
@ -1712,7 +1728,7 @@ UINT16 waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD dwRate)
dprintf_mmsys(stddeb, "waveOutSetPlaybackRate(%04X, %08lX);\n", hWaveOut, dwRate);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage(0, WODM_SETPLAYBACKRATE,
return wodMessage( MMSYSTEM_FirstDevID(), WODM_SETPLAYBACKRATE,
lpDesc->dwInstance, (DWORD)dwRate, 0L);
}
@ -1752,7 +1768,7 @@ DWORD waveOutMessage(HWAVEOUT16 hWaveOut, UINT16 uMessage,
hWaveOut, uMessage, dwParam1, dwParam2);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
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 <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include "gdi.h"
@ -28,29 +29,6 @@ GC BITMAP_monoGC = 0, BITMAP_colorGC = 0;
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)
*/
@ -172,8 +150,10 @@ LONG GetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPVOID buffer )
LONG GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
{
BITMAPOBJ * bmp;
LONG height;
LONG height,widthbytes;
XImage * image;
LPBYTE tmpbuffer,tbuf;
int h,w,pad;
/* KLUDGE! */
if (count < 0) {
@ -190,13 +170,112 @@ LONG GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
1 << bmp->bitmap.bmBitsPixel, buffer, height );
if (!height) 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
);
if (!(image = BITMAP_BmpToImage( &bmp->bitmap, buffer ))) return 0;
CallTo32_LargeStack( (int(*)())XGetSubImage, 11,
display, bmp->pixmap, 0, 0, bmp->bitmap.bmWidth,
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;
}
@ -218,6 +297,8 @@ LONG SetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPCVOID buffer )
BITMAPOBJ * bmp;
LONG height;
XImage * image;
LPBYTE sbuf,tmpbuffer;
int w,h,pad,widthbytes;
/* KLUDGE! */
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) 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,
display, bmp->pixmap, BITMAP_GC(bmp), image, 0, 0,
0, 0, bmp->bitmap.bmWidth, height );
image->data = NULL;
XDestroyImage( image );
XDestroyImage( image ); /* frees tmpbuffer too */
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 */
/* 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,
ptr->nWidth, ptr->nHeight * 2, 1 );
image = XCreateImage( display, DefaultVisualOfScreen(screen),

View File

@ -800,7 +800,7 @@ INT32 GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
BITMAPOBJ * bmp;
PALETTEENTRY * palEntry;
PALETTEOBJ * palette;
XImage * bmpImage, * dibImage;
XImage * bmpImage;
int i, x, y;
if (!lines) return 0;
@ -864,7 +864,7 @@ INT32 GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
switch( info->bmiHeader.biBitCount )
{
case 8:
/* pad up to 32 bit (FIXME: not 16? ) */
pad += (4 - (info->bmiHeader.biWidth & 3)) & 3;
for( y = yend - 1; (int)y >= (int)startscan; y-- )
{
@ -873,32 +873,71 @@ INT32 GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
bbits += pad;
}
break;
/* add more bpp-specific shortcuts here */
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 )
case 1:
pad += ((32 - (info->bmiHeader.biWidth & 31)) / 8) & 3;
for( y = yend - 1; (int)y >= (int)startscan; y-- )
{
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 (x = 0; x < xend; x++)
XPutPixel( dibImage, x, yend - y + 1,
XGetPixel( bmpImage, x, y ));
dibImage->data = NULL;
XDestroyImage( dibImage );
*bbits = 0;
for( x = 0; x < xend; x++ ) {
*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 );

View File

@ -728,6 +728,18 @@ void PlayMetaFileRecord16( HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
SelectClipRgn32(hdc, *(ht->objectHandle + *(mr->rdParam)));
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;
META_UNIMP(META_SETTEXTCHAREXTRA)
META_UNIMP(META_SETTEXTJUSTIFICATION)
@ -738,7 +750,6 @@ void PlayMetaFileRecord16( HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
META_UNIMP(META_SETPALENTRIES)
META_UNIMP(META_RESIZEPALETTE)
META_UNIMP(META_DIBBITBLT)
META_UNIMP(META_DIBCREATEPATTERNBRUSH)
META_UNIMP(META_EXTFLOODFILL)
META_UNIMP(META_RESETDC)
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 */
VirtualProtect( thdb->stack_base, 1, PAGE_EXECUTE_READWRITE | PAGE_GUARD,
&old_prot );
thdb->teb.stack_top = (char *)thdb->stack_base + stack_size;
thdb->teb.stack_low = thdb->teb.stack_top;
thdb->teb.stack_top = (char *)thdb->stack_base + stack_size - 1;
thdb->teb.stack_low = thdb->stack_base;
thdb->exit_stack = thdb->teb.stack_top;
/* Allocate the TEB selector (%fs register) */

View File

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

View File

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

View File

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

View File

@ -7,12 +7,14 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/times.h>
#include "windows.h"
#include "winerror.h"
#include "heap.h"
#include "thread.h"
#include "handle32.h"
#include "pe_image.h"
#include "file.h"
#include "stddebug.h"
#include "debug.h"
@ -312,6 +314,7 @@ BOOL32 ResetEvent (HANDLE32 h)
fprintf(stderr,"ResetEvent(%d) stub\n",h);
return 0;
}
/***********************************************************************
* WaitForSingleObject (KERNEL32.561)
*/
@ -320,6 +323,21 @@ DWORD WaitForSingleObject(HANDLE32 h, DWORD timeout)
fprintf(stderr,"WaitForSingleObject(%d,%ld) stub\n",h,timeout);
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)
*/
@ -425,3 +443,28 @@ CreateProcess32A(
);
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,29 +234,31 @@ static BOOL32 DCE_GetVisRect( WND *wndPtr, BOOL32 clientArea, RECT16 *lprect )
* removing from the given region the rectangle of each window offset
* by a given amount. The new region is returned, and the original one
* 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,
HRGN32 hrgn, int xoffset, int yoffset )
{
HRGN32 hrgnNew;
if (!pWndStart) return hrgn;
if (!(hrgnNew = CreateRectRgn32( 0, 0, 0, 0 )))
if ( pWndStart == NULL ) return hrgn;
if ( (hrgnNew = CreateRectRgn32( 0, 0, 0, 0 )) )
{
DeleteObject32( hrgn );
return 0;
}
for (; pWndStart != pWndEnd; pWndStart = pWndStart->next)
{
if (!(pWndStart->dwStyle & WS_VISIBLE)) continue;
SetRectRgn32( hrgnNew, pWndStart->rectWindow.left + xoffset,
pWndStart->rectWindow.top + yoffset,
pWndStart->rectWindow.right + xoffset,
pWndStart->rectWindow.bottom + yoffset );
if (!CombineRgn32( hrgn, hrgn, hrgnNew, RGN_DIFF )) break;
}
DeleteObject32( hrgnNew );
for (; pWndStart != pWndEnd; pWndStart = pWndStart->next)
{
if ( !(pWndStart->dwStyle & WS_VISIBLE) ||
(pWndStart->flags & WIN_MANAGED) ) continue;
SetRectRgn32( hrgnNew, pWndStart->rectWindow.left + xoffset,
pWndStart->rectWindow.top + yoffset,
pWndStart->rectWindow.right + xoffset,
pWndStart->rectWindow.bottom + yoffset );
if (!CombineRgn32( hrgn, hrgn, hrgnNew, RGN_DIFF )) break;
}
DeleteObject32( hrgnNew );
} else pWndEnd = NULL;
if (pWndStart != pWndEnd) /* something went wrong */
{
DeleteObject32( hrgn );
@ -281,9 +283,6 @@ HRGN32 DCE_GetVisRgn( HWND32 hwnd, WORD flags )
WND *wndPtr = WIN_FindWndPtr( hwnd );
/* 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 ))

View File

@ -412,7 +412,7 @@ LRESULT DefWindowProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam,
case WM_SETTEXT:
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;
default:

View File

@ -1565,11 +1565,12 @@ static BOOL32 DIALOG_DlgDirSelect( HWND32 hwnd, LPSTR str, INT32 len,
*
* 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 )
{
int drive;
HWND32 hwnd;
LPSTR orig_spec = spec;
#define SENDMSG(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();
/* If the path exists and is a directory, chdir to it */
if (!spec || !spec[0] || DRIVE_Chdir( drive, spec )) spec = "*.*";
else
{
char *p, *p2;
p = spec;
if ((p2 = strrchr( p, '\\' ))) p = p2;
if ((p2 = strrchr( p, '/' ))) p = p2;
if (p != spec)
{
char sep = *p;
*p = 0;
if (!DRIVE_Chdir( drive, spec ))
{
*p = sep; /* Restore the original spec */
return FALSE;
}
spec = p + 1;
}
}
dprintf_dialog( stddeb, "ListBoxDirectory: path=%c:\\%s mask=%s\n",
'A' + drive, DRIVE_GetDosCwd(drive), spec );
if (idLBox && ((hwnd = GetDlgItem32( hDlg, idLBox )) != 0))
{
/* If the path exists and is a directory, chdir to it */
if (!spec || !spec[0] || DRIVE_Chdir( drive, spec )) spec = "*.*";
else
{
const char *p, *p2;
p = spec;
if ((p2 = strrchr( p, '\\' ))) p = p2 + 1;
if ((p2 = strrchr( p, '/' ))) p = p2 + 1;
if (p != spec)
{
BOOL32 ret = FALSE;
char *dir = HeapAlloc( SystemHeap, 0, p - spec );
if (dir)
{
lstrcpyn32A( dir, spec, p - spec );
ret = DRIVE_Chdir( drive, dir );
HeapFree( SystemHeap, 0, dir );
}
if (!ret) return FALSE;
spec = p;
}
}
dprintf_dialog( stddeb, "ListBoxDirectory: path=%c:\\%s mask=%s\n",
'A' + drive, DRIVE_GetDosCwd(drive), spec );
SENDMSG( combo ? CB_RESETCONTENT32 : LB_RESETCONTENT32, 0, 0 );
if ((attrib & DDL_DIRECTORY) && !(attrib & DDL_EXCLUSIVE))
if (attrib & DDL_DIRECTORY)
{
if (SENDMSG( combo ? CB_DIR32 : LB_DIR32,
attrib & ~(DDL_DIRECTORY | DDL_DRIVES),
(LPARAM)spec ) == LB_ERR)
return FALSE;
if (!(attrib & DDL_EXCLUSIVE))
{
if (SENDMSG( combo ? CB_DIR32 : LB_DIR32,
attrib & ~(DDL_DIRECTORY | DDL_DRIVES),
(LPARAM)spec ) == LB_ERR)
return FALSE;
}
if (SENDMSG( combo ? CB_DIR32 : LB_DIR32,
(attrib & (DDL_DIRECTORY | DDL_DRIVES)) | DDL_EXCLUSIVE,
(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 */
SetDlgItemText32A( hDlg, idStatic, temp );
}
if (orig_spec && (spec != orig_spec))
{
/* Update the original file spec */
char *p = spec;
while ((*orig_spec++ = *p++));
}
return TRUE;
#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)
*/
@ -1725,7 +1756,7 @@ BOOL32 DlgDirSelectComboBoxEx32W( HWND32 hwnd, LPWSTR str, INT32 len, INT32 id)
/**********************************************************************
* 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 )
{
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)
*/
INT32 DlgDirList32A( HWND32 hDlg, LPCSTR spec, INT32 idLBox, INT32 idStatic,
INT32 DlgDirList32A( HWND32 hDlg, LPSTR spec, INT32 idLBox, INT32 idStatic,
UINT32 attrib )
{
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)
*/
INT32 DlgDirList32W( HWND32 hDlg, LPCWSTR spec, INT32 idLBox, INT32 idStatic,
INT32 DlgDirList32W( HWND32 hDlg, LPWSTR spec, INT32 idLBox, INT32 idStatic,
UINT32 attrib )
{
INT32 ret;
LPSTR specA = HEAP_strdupWtoA( GetProcessHeap(), 0, spec );
ret = DIALOG_DlgDirList( hDlg, specA, idLBox, idStatic, attrib, FALSE );
HeapFree( GetProcessHeap(), 0, specA );
return ret;
return DIALOG_DlgDirListW( hDlg, spec, idLBox, idStatic, attrib, FALSE );
}
/**********************************************************************
* DlgDirListComboBox16 (USER.195)
*/
INT16 DlgDirListComboBox16( HWND16 hDlg, LPCSTR spec, INT16 idCBox,
INT16 DlgDirListComboBox16( HWND16 hDlg, LPSTR spec, INT16 idCBox,
INT16 idStatic, UINT16 attrib )
{
return DIALOG_DlgDirList( hDlg, spec, idCBox, idStatic, attrib, TRUE );
@ -1769,7 +1796,7 @@ INT16 DlgDirListComboBox16( HWND16 hDlg, LPCSTR spec, INT16 idCBox,
/**********************************************************************
* DlgDirListComboBox32A (USER32.143)
*/
INT32 DlgDirListComboBox32A( HWND32 hDlg, LPCSTR spec, INT32 idCBox,
INT32 DlgDirListComboBox32A( HWND32 hDlg, LPSTR spec, INT32 idCBox,
INT32 idStatic, UINT32 attrib )
{
return DIALOG_DlgDirList( hDlg, spec, idCBox, idStatic, attrib, TRUE );
@ -1779,12 +1806,8 @@ INT32 DlgDirListComboBox32A( HWND32 hDlg, LPCSTR spec, INT32 idCBox,
/**********************************************************************
* DlgDirListComboBox32W (USER32.144)
*/
INT32 DlgDirListComboBox32W( HWND32 hDlg, LPCWSTR spec, INT32 idCBox,
INT32 DlgDirListComboBox32W( HWND32 hDlg, LPWSTR spec, INT32 idCBox,
INT32 idStatic, UINT32 attrib )
{
INT32 ret;
LPSTR specA = HEAP_strdupWtoA( GetProcessHeap(), 0, spec );
ret = DIALOG_DlgDirList( hDlg, specA, idCBox, idStatic, attrib, FALSE );
HeapFree( GetProcessHeap(), 0, specA );
return ret;
return DIALOG_DlgDirListW( hDlg, spec, idCBox, idStatic, attrib, TRUE );
}

View File

@ -82,11 +82,11 @@ static const char * const event_names[] =
/* Event handlers */
static void EVENT_Key( XKeyEvent *event );
static void EVENT_ButtonPress( XButtonEvent *event );
static void EVENT_ButtonRelease( XButtonEvent *event );
static void EVENT_MotionNotify( XMotionEvent *event );
static void EVENT_FocusIn( HWND32 hwnd, XFocusChangeEvent *event );
static void EVENT_FocusOut( HWND32 hwnd, XFocusChangeEvent *event );
static void EVENT_ButtonPress( WND *pWnd, XButtonEvent *event );
static void EVENT_ButtonRelease( WND *pWnd, XButtonEvent *event );
static void EVENT_MotionNotify( WND *pWnd, XMotionEvent *event );
static void EVENT_FocusIn( WND *pWnd, XFocusChangeEvent *event );
static void EVENT_FocusOut( WND *pWnd, XFocusChangeEvent *event );
static void EVENT_Expose( WND *pWnd, XExposeEvent *event );
static void EVENT_GraphicsExpose( WND *pWnd, XGraphicsExposeEvent *event );
static void EVENT_ConfigureNotify( HWND32 hwnd, XConfigureEvent *event );
@ -129,12 +129,12 @@ void EVENT_ProcessEvent( XEvent *event )
case ButtonPress:
if (InputEnabled)
EVENT_ButtonPress( (XButtonEvent*)event );
EVENT_ButtonPress( pWnd, (XButtonEvent*)event );
break;
case ButtonRelease:
if (InputEnabled)
EVENT_ButtonRelease( (XButtonEvent*)event );
EVENT_ButtonRelease( pWnd, (XButtonEvent*)event );
break;
case MotionNotify:
@ -150,16 +150,16 @@ void EVENT_ProcessEvent( XEvent *event )
{
while (XCheckTypedWindowEvent(display,((XAnyEvent *)event)->window,
MotionNotify, event));
EVENT_MotionNotify( (XMotionEvent*)event );
EVENT_MotionNotify( pWnd, (XMotionEvent*)event );
}
break;
case FocusIn:
EVENT_FocusIn( pWnd->hwndSelf, (XFocusChangeEvent*)event );
EVENT_FocusIn( pWnd, (XFocusChangeEvent*)event );
break;
case FocusOut:
EVENT_FocusOut( pWnd->hwndSelf, (XFocusChangeEvent*)event );
EVENT_FocusOut( pWnd, (XFocusChangeEvent*)event );
break;
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
@ -455,11 +557,11 @@ static void EVENT_Key( XKeyEvent *event )
/***********************************************************************
* 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,
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
*/
static void EVENT_ButtonPress( XButtonEvent *event )
static void EVENT_ButtonPress( WND *pWnd, XButtonEvent *event )
{
static WORD messages[NB_BUTTONS] =
{ WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN };
@ -499,14 +601,14 @@ static void EVENT_ButtonPress( XButtonEvent *event )
hardware_event( messages[buttonNum],
EVENT_XStateToKeyState( event->state ), 0L,
event->x_root - desktopX, event->y_root - desktopY,
event->time - MSG_WineStartTicks, 0 );
event->time - MSG_WineStartTicks, (DWORD)pWnd->hwndSelf );
}
/***********************************************************************
* EVENT_ButtonRelease
*/
static void EVENT_ButtonRelease( XButtonEvent *event )
static void EVENT_ButtonRelease( WND *pWnd, XButtonEvent *event )
{
static const WORD messages[NB_BUTTONS] =
{ WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP };
@ -518,19 +620,26 @@ static void EVENT_ButtonRelease( XButtonEvent *event )
hardware_event( messages[buttonNum],
EVENT_XStateToKeyState( event->state ), 0L,
event->x_root - desktopX, event->y_root - desktopY,
event->time - MSG_WineStartTicks, 0 );
event->time - MSG_WineStartTicks, (DWORD)pWnd->hwndSelf );
}
/**********************************************************************
* EVENT_FocusIn
*/
static void EVENT_FocusIn( HWND32 hwnd, XFocusChangeEvent *event )
static void EVENT_FocusIn( WND *pWnd, XFocusChangeEvent *event )
{
if (event->detail == NotifyPointer) return;
if (hwnd != GetActiveWindow32()) WINPOS_ChangeActiveWindow( hwnd, FALSE );
if ((hwnd != GetFocus32()) && !IsChild32( hwnd, GetFocus32()))
SetFocus32( hwnd );
if (Options.managed) EVENT_QueryZOrder( pWnd );
if (event->detail != NotifyPointer)
{
HWND32 hwnd = pWnd->hwndSelf;
if (hwnd != GetActiveWindow32())
WINPOS_ChangeActiveWindow( hwnd, FALSE );
if ((hwnd != GetFocus32()) && !IsChild32( hwnd, GetFocus32()))
SetFocus32( hwnd );
}
}
@ -539,12 +648,17 @@ static void EVENT_FocusIn( HWND32 hwnd, XFocusChangeEvent *event )
*
* 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 (hwnd == GetActiveWindow32()) WINPOS_ChangeActiveWindow( 0, FALSE );
if ((hwnd == GetFocus32()) || IsChild32( hwnd, GetFocus32()))
SetFocus32( 0 );
if (event->detail != NotifyPointer)
{
HWND32 hwnd = pWnd->hwndSelf;
if (hwnd == GetActiveWindow32())
WINPOS_ChangeActiveWindow( 0, FALSE );
if ((hwnd == GetFocus32()) || IsChild32( hwnd, GetFocus32()))
SetFocus32( 0 );
}
}
/**********************************************************************
@ -582,16 +696,14 @@ static void EVENT_ConfigureNotify( HWND32 hwnd, XConfigureEvent *event )
}
else
{
WND *wndPtr;
WND *wndPtr = WIN_FindWndPtr( hwnd );
WINDOWPOS16 *winpos;
RECT16 newWindowRect, newClientRect;
HRGN32 hrgnOldPos, hrgnNewPos;
Window above = event->above;
if (!(wndPtr = WIN_FindWndPtr( hwnd )) ||
!(wndPtr->flags & WIN_MANAGED) )
return;
if (!(winpos = SEGPTR_NEW(WINDOWPOS16))) return;
if (!wndPtr || !(wndPtr->flags & WIN_MANAGED) ||
!(winpos = SEGPTR_NEW(WINDOWPOS16))) return;
/* Fill WINDOWPOS struct */
winpos->flags = SWP_NOACTIVATE | SWP_NOZORDER;
@ -630,12 +742,17 @@ static void EVENT_ConfigureNotify( HWND32 hwnd, XConfigureEvent *event )
wndPtr->rectWindow = newWindowRect;
wndPtr->rectClient = newClientRect;
SendMessage16( hwnd, WM_WINDOWPOSCHANGED, 0, (LPARAM)SEGPTR_GET(winpos));
SEGPTR_FREE(winpos);
/* full window drag leaves unrepainted garbage without this */
PAINT_RedrawWindow( 0, NULL, hrgnOldPos, RDW_INVALIDATE |
RDW_ALLCHILDREN | RDW_ERASE | RDW_ERASENOW,
RDW_C_USEHRGN );
if( IsWindow32( hwnd ) )
if( above == None ) /* absolute bottom */
{
WIN_UnlinkWindow( hwnd );
WIN_LinkWindow( hwnd, HWND_BOTTOM);
}
else EVENT_QueryZOrder( wndPtr ); /* try to outsmart window manager */
DeleteObject32(hrgnOldPos);
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
*/
static MDIWCL* MDI_BuildWCL(WND* clientWnd, INT16* iTotal)
static MDIWCL* MDI_BuildWCL(WND* clientWnd, UINT16* iTotal)
{
MDIWCL *listTop,*listNext;
WND *childWnd;
@ -693,9 +693,10 @@ static HBITMAP16 CreateMDIMenuBitmap(void)
*/
static LONG MDICascade(WND* clientWnd, MDICLIENTINFO *ci)
{
MDIWCL *listTop,*listPrev;
INT16 delta = 0,iToPosition = 0, n = 0;
POINT16 pos[2];
MDIWCL *listTop,*listPrev;
INT16 delta = 0, n = 0;
UINT16 iToPosition = 0;
POINT16 pos[2];
if (ci->hwndChildMaximized)
ShowWindow16( ci->hwndChildMaximized, SW_NORMAL);
@ -744,7 +745,7 @@ static LONG MDITile(WND* wndClient, MDICLIENTINFO *ci,WORD wParam)
int rows, columns;
int r, c;
int i;
INT16 iToPosition = 0;
UINT16 iToPosition = 0;
if (ci->hwndChildMaximized)
ShowWindow16(ci->hwndChildMaximized, SW_NORMAL);

View File

@ -23,6 +23,7 @@
#include "dde.h"
#include "queue.h"
#include "winproc.h"
#include "options.h"
#include "stddebug.h"
/* #define DEBUG_MSG */
#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
* HIWORD contains hit test code).
*/
static DWORD MSG_TranslateMouseMsg( HWND16 hWndScope, DWORD filter,
MSG16 *msg, BOOL32 remove )
static DWORD MSG_TranslateMouseMsg( HWND16 hTopWnd, DWORD filter,
MSG16 *msg, BOOL32 remove, WND* pWndScope )
{
static DWORD dblclk_time_limit = 0;
static UINT16 clk_message = 0;
@ -86,10 +87,10 @@ static DWORD MSG_TranslateMouseMsg( HWND16 hWndScope, DWORD filter,
hWnd = GetCapture16();
if( !hWnd )
{
sendSC = 1;
ht = hittest = WINPOS_WindowFromPoint( WIN_GetDesktop(), msg->pt, &pWnd );
ht = hittest = WINPOS_WindowFromPoint( pWndScope, msg->pt, &pWnd );
if( !pWnd ) pWnd = WIN_GetDesktop();
hWnd = pWnd->hwndSelf;
sendSC = 1;
}
else
{
@ -111,8 +112,8 @@ static DWORD MSG_TranslateMouseMsg( HWND16 hWndScope, DWORD filter,
/* check if hWnd is within hWndScope */
if( hWndScope && hWnd != hWndScope )
if( !IsChild16(hWndScope, hWnd) ) return SYSQ_MSG_CONTINUE;
if( hTopWnd && hWnd != hTopWnd )
if( !IsChild16(hTopWnd, hWnd) ) return SYSQ_MSG_CONTINUE;
if( mouseClick )
{
@ -229,7 +230,7 @@ static DWORD MSG_TranslateMouseMsg( HWND16 hWndScope, DWORD filter,
*
* 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 )
{
WORD message = msg->message;
@ -260,8 +261,8 @@ static DWORD MSG_TranslateKbdMsg( HWND16 hWndScope, DWORD filter,
return SYSQ_MSG_ABANDON;
}
if (hWndScope && hWnd != hWndScope)
if (!IsChild16(hWndScope, hWnd)) return SYSQ_MSG_CONTINUE;
if (hTopWnd && hWnd != hTopWnd)
if (!IsChild16(hTopWnd, hWnd)) return SYSQ_MSG_CONTINUE;
if (!MSG_CheckFilter(message, filter)) return SYSQ_MSG_CONTINUE;
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))
{
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;
}
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 */
style |= WS_CAPTION;
style &= (WS_DLGFRAME | WS_BORDER | WS_THICKFRAME);
style &= (WS_DLGFRAME | WS_BORDER | WS_THICKFRAME | WS_CHILD);
exStyle &= WS_EX_DLGMODALFRAME;
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->bottom = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
if (wndPtr->dwStyle & WS_ICONIC) return; /* No border to remove */
if (wndPtr->flags & WIN_MANAGED) return;
if ((wndPtr->dwStyle & WS_ICONIC) || (wndPtr->flags & WIN_MANAGED)) return;
/* Remove frame from rectangle */
if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))

View File

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

View File

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

View File

@ -7,7 +7,6 @@
#include <stdio.h>
#include "windows.h"
#include "callback.h"
#include "heap.h"
#include "selectors.h"
#include "stackframe.h"
@ -95,16 +94,20 @@ static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, HWND32 hwnd,
UINT32 msg, WPARAM32 wParam,
LPARAM lParam );
#ifndef WINELIB
extern void CallFrom16_long_wwwll(void);
extern void CallFrom32_stdcall_5(void);
#else
static void CallFrom16_long_wwwll(void) {}
static void CallFrom32_stdcall_5(void) {}
#endif /* WINELIB */
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
*/
@ -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
*
@ -1676,7 +1721,7 @@ static LRESULT WINPROC_CallProc32ATo32W( WNDPROC32 func, HWND32 hwnd,
LRESULT result;
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 );
return result;
}
@ -1694,7 +1739,7 @@ static LRESULT WINPROC_CallProc32WTo32A( WNDPROC32 func, HWND32 hwnd,
LRESULT result;
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 );
return result;
}
@ -1715,7 +1760,7 @@ LRESULT WINPROC_CallProc16To32A( HWND16 hwnd, UINT16 msg,
if (WINPROC_MapMsg16To32A( msg, wParam, &msg32, &wParam32, &lParam ) == -1)
return 0;
result = CallWndProc32( func, hwnd, msg32, wParam32, lParam );
result = WINPROC_CallWndProc32Ptr( func, hwnd, msg32, wParam32, lParam );
WINPROC_UnmapMsg16To32A( msg32, wParam32, lParam );
return result;
}
@ -1736,7 +1781,7 @@ LRESULT WINPROC_CallProc16To32W( HWND16 hwnd, UINT16 msg,
if (WINPROC_MapMsg16To32W( msg, wParam, &msg32, &wParam32, &lParam ) == -1)
return 0;
result = CallWndProc32( func, hwnd, msg32, wParam32, lParam );
result = WINPROC_CallWndProc32Ptr( func, hwnd, msg32, wParam32, lParam );
WINPROC_UnmapMsg16To32W( msg32, wParam32, lParam );
return result;
}
@ -1761,7 +1806,8 @@ static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, HWND32 hwnd,
&msg16, &mp16.wParam, &mp16.lParam ) == -1)
return 0;
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;
WINPROC_UnmapMsg32ATo16( msg, wParam, lParam, &mp16 );
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)
return 0;
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;
WINPROC_UnmapMsg32WTo16( msg, wParam, lParam, &mp16 );
return mp16.lResult;
@ -1808,15 +1855,15 @@ LRESULT CallWindowProc16( WNDPROC16 func, HWND16 hwnd, UINT16 msg,
{
wndPtr = WIN_FindWndPtr( hwnd );
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;
return result;
}
#if testing
wndPtr = WIN_FindWndPtr( hwnd );
if (wndPtr) CURRENT_DS = wndPtr->hInstance;
result = CallWndProc16( WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_16),
hwnd, msg, wParam, lParam );
result = WINPROC_CallWndProc16Ptr( WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_16),
hwnd, msg, wParam, lParam );
CURRENT_DS = ds;
return result;
#endif
@ -1827,25 +1874,8 @@ LRESULT CallWindowProc16( WNDPROC16 func, HWND16 hwnd, UINT16 msg,
if (!proc->thunk.t_from32.proc) return 0;
wndPtr = WIN_FindWndPtr( hwnd );
if (wndPtr) CURRENT_DS = wndPtr->hInstance;
#ifndef WINELIB
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 );
result = WINPROC_CallWndProc16Ptr( proc->thunk.t_from32.proc,
hwnd, msg, wParam, lParam );
CURRENT_DS = ds;
return result;
@ -1872,11 +1902,12 @@ LRESULT CallWindowProc32A( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
{
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
func = WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_32A );
return CallWndProc32( func, hwnd, msg, wParam, lParam );
return WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
#endif
switch(proc->type)
@ -1887,8 +1918,8 @@ LRESULT CallWindowProc32A( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
hwnd, msg, wParam, lParam );
case WIN_PROC_32A:
if (!proc->thunk.t_from16.proc) return 0;
return CallWndProc32( proc->thunk.t_from16.proc,
hwnd, msg, wParam, lParam );
return WINPROC_CallWndProc32Ptr( proc->thunk.t_from16.proc,
hwnd, msg, wParam, lParam );
case WIN_PROC_32W:
if (!proc->thunk.t_from16.proc) return 0;
return WINPROC_CallProc32ATo32W( proc->thunk.t_from16.proc,
@ -1908,11 +1939,12 @@ LRESULT CallWindowProc32W( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
{
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
func = WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_32W );
return CallWndProc32( func, hwnd, msg, wParam, lParam );
return WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
#endif
switch(proc->type)
@ -1927,8 +1959,8 @@ LRESULT CallWindowProc32W( WNDPROC32 func, HWND32 hwnd, UINT32 msg,
hwnd, msg, wParam, lParam );
case WIN_PROC_32W:
if (!proc->thunk.t_from16.proc) return 0;
return CallWndProc32( proc->thunk.t_from16.proc,
hwnd, msg, wParam, lParam );
return WINPROC_CallWndProc32Ptr( proc->thunk.t_from16.proc,
hwnd, msg, wParam, lParam );
default:
fprintf( stderr, "CallWindowProc32W: invalid proc %p\n", proc );
return 0;