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:
parent
889f74244d
commit
84c70f55b5
18
ANNOUNCE
18
ANNOUNCE
|
@ -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
118
ChangeLog
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
#include <stdlib.h>
|
||||
#include "xmalloc.h"
|
||||
#include "windows.h"
|
||||
#include "debugger.h"
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
#include <limits.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <malloc.h>
|
||||
|
||||
#include "win.h"
|
||||
#include "pe_image.h"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ) \
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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__ */
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 =
|
||||
|
|
305
memory/local.c
305
memory/local.c
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
|
||||
|
||||
|
|
19
misc/lstr.c
19
misc/lstr.c
|
@ -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) {
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -296,6 +296,7 @@ void INT_Int31Handler( CONTEXT *context )
|
|||
SET_CFLAG(context);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
SET_CFLAG(context);
|
||||
break;
|
||||
|
|
479
msdos/int21.c
479
msdos/int21.c
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
236
objects/bitmap.c
236
objects/bitmap.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) */
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
#include <stdlib.h>
|
||||
#include "windows.h"
|
||||
#include "winerror.h"
|
||||
#include "winnls.h"
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
#include <stdlib.h>
|
||||
#include "windows.h"
|
||||
#include "winerror.h"
|
||||
#include "wincon.h"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 ))
|
||||
|
|
|
@ -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:
|
||||
|
|
119
windows/dialog.c
119
windows/dialog.c
|
@ -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 );
|
||||
}
|
||||
|
|
189
windows/event.c
189
windows/event.c
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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 ))
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
WORD USER_HeapSel = 0;
|
||||
|
||||
extern BOOL32 MENU_SwitchTPWndTo(HTASK16);
|
||||
extern void QUEUE_FlushMessages(HQUEUE16);
|
||||
|
||||
/***********************************************************************
|
||||
* GetFreeSystemResources (USER.284)
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue