Release 971130

Sat Nov 29 12:35:26 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [if1632/builtin.c]
	Build a complete PE header for builtin Win32 modules.

	* [loader/pe_image.c] [loader/module.c]
	HMODULE32 now points to the loading address of the module. There
	is no longer a separate PE_MODULE structure.

Fri Nov 28 11:21:47 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [ole/*][configure.in][Makefile.in][include/interfaces.h]
	  [if1632/olesvr32.spec][if1632/olecli32.spec]
	New directory, moved OLE stuff there.
	new .spec files for olecli32,olesvr32, some stubs added.

	* [misc/shell.c]
	Added support for extracting icons from PE dlls.

	* [misc/shellord.c][if1632/shell32.spec]
	Added a huge heap of ordinal only exported shell functions
	(will work only in Win95).

	* [loader/task.c]
	Hack to make MakeProcInstance16 work in all cases (mplayer.exe).

	* [win32/string32.c][include/string32.h]
	Obsolete, removed.

	* [windows/keyboard.c]
	Added *RegisterHotkey.

	* [objects/font.c][objects/text.c]
	Added GetFontLanguageInfo, GetTextCharsetInfo.

Wed Nov 26 18:10:40 1997  Uwe Bonnes  <bon@elektron.ikp.physik.tu-darmstadt.de>

	* [misc/network.c]
	In WNetGetConnection16 return the Drive label and not the DOS-Cwd.
	Makes Wordview 6 start on a network connected machine.

	* [controls/status.c]
	Catch a Null pointer in SW_SetText.

	* [files/dos_fs.c]
 	Add NT5 functions GetLongPathName32.

	* [files/file.c]
	Make GetTempFileName16 accept drive 0 (Current Drive) too.
	Handle more errors and be more verbose in FILE_SetDosError, fix
	an error in DeleteFile32W

	* [memory/virtual.c]
	Implement FlushViewOfFile.

	* [misc/crtdll]
	Implement _rotl and splitpath and add a stub for 
	_abnormal_termination.

	* [misc/printdrv.c]
	Stub for EnumPrinters32A.

	* [win32/newfns]
	Add Stub for QueryPerformanceFrequency, change return value
	for QueryPerformanceCounter.
 	Add stub for DeviceIoControl.

Tue Nov 25 15:55:01 1997 Martin Boehme <boehme@informatik.mu-luebeck.de>

	* [controls/combo.c] [controls/edit.c] [windows/defwnd.c]
	  [windows/winpos.c] [windows/win.c]
	Removed WIN_NO_REDRAW flag.

Tue Nov 25 13:20:35 1997  Douglas Ridgway <ridgway@taiga.v-wave.com>

	* [graphics/x11drv/bitblt.c]
	Fixed memory leak in BITBLT_GetDstArea.

Sun Nov 23 14:05:23 1997  Andreas Mohr <100.30936@germany.net>

	* [files/directory.c]
	Export windows system directory to environment.

	* [if1632/Makefile.in] [if1632/builtin.c] [if1632/w32skrnl.spec]
	  [if1632/win32s16.spec] [misc/w32scomb.c] [misc/w32skrnl.c]
	Added Win32s DLLs W32SKRNL and WIN32S16.

	* [if1632/kernel32.spec] [loader/module.c]
	Added misc functions for Win32s.

	* [if1632/kernel.spec] [loader/task.c]
	Added DefineHandleTable().

	* [scheduler/process.c]
	Fixed SetEnvironmentVariable32A() to avoid heap corruption.

Sat Nov 22 14:11:42 1997  Kristian Nielsen  <kristian.nielsen@risoe.dk>

	* [windows/painting.c]
	Fix leak in BeginPaint16() for CS_PARENTDC windows where the
	update region was not properly released.

Thu Nov 20 03:55:29 1997  Gordon Chaffee <chaffee@CS.Berkeley.EDU>

	* [loader/pe_image.c]
	Implemented forwarded DLL functions.

	* [objects/dib.c]
	Added support for 16- and 32-bit mode DIBs.
	Support negative bitmap heights.

	* [win32/process.c]
	Added stub for CreateProcess32W.

	* [win32/security.c] [include/ntdll.h]
	Added stubs for LookupAccountSid32A/W.

	* [scheduler/process.c]
	Use the size specified in the PE header for the process heap.

Mon Nov 17 00:53:35 1997  Len White <phreak@cgocable.net>

	* [msdos/int3d.c]
	New file. Stubs for int3d.

Sun Nov 16 12:30:00 PST 1997  Jason Schonberg  <schon@mti.sgi.com>

	* [include/aspi.h]
	Changed comment style from C++ to C.
This commit is contained in:
Alexandre Julliard 1997-11-30 17:45:40 +00:00
parent a0b2b1d0f6
commit e658d82093
124 changed files with 3787 additions and 1055 deletions

View File

@ -1,14 +1,14 @@
This is release 971116 of Wine, the MS Windows emulator. This is still a This is release 971130 of Wine, the MS Windows emulator. This is still a
developer's only release. There are many bugs and many unimplemented API developer's only release. There are many bugs and many unimplemented API
features. Most applications still do not work correctly. features. Most applications still do not work correctly.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry. forget to include a ChangeLog entry.
WHAT'S NEW with Wine-971116: (see ChangeLog for details) WHAT'S NEW with Wine-971130: (see ChangeLog for details)
- Emulator and library unification. - Better Win32s support.
- New About dialog. - Lots of new Win32 functions.
- Menus improvements. - DIB handling improvements.
- Lots of bug fixes. - Lots of bug fixes.
See the README file in the distribution for installation instructions. See the README file in the distribution for installation instructions.
@ -17,10 +17,10 @@ Because of lags created by using mirror, this message may reach you before
the release is available at the ftp sites. The sources will be available the release is available at the ftp sites. The sources will be available
from the following locations: from the following locations:
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-971116.tar.gz ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-971130.tar.gz
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-971116.tar.gz ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-971130.tar.gz
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-971116.tar.gz ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-971130.tar.gz
ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-971116.tar.gz ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-971130.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite. It should also be available from any site that mirrors tsx-11 or sunsite.

View File

@ -11,6 +11,7 @@ Martin Ayotte,
Peter Bajusz, Peter Bajusz,
Georg Beyerle, Georg Beyerle,
Ross Biro, Ross Biro,
Martin Boehme,
Uwe Bonnes, Uwe Bonnes,
Erik Bos, Erik Bos,
Fons Botman, Fons Botman,
@ -18,12 +19,14 @@ John Brezak,
Andrew Bulhak, Andrew Bulhak,
John Burton, John Burton,
Niels de Carpentier, Niels de Carpentier,
Gordon Chaffee,
Jimen Ching, Jimen Ching,
David A. Cuthbert, David A. Cuthbert,
Huw D. M. Davies, Huw D. M. Davies,
Roman Dolejsi, Roman Dolejsi,
Frans van Dorsselaer, Frans van Dorsselaer,
Chris Faherty, Chris Faherty,
Carsten Fallesen,
Paul Falstad, Paul Falstad,
David Faure, David Faure,
Claus Fischer, Claus Fischer,
@ -71,6 +74,7 @@ Steffen Moeller,
Andreas Mohr, Andreas Mohr,
Philippe De Muyter, Philippe De Muyter,
Itai Nahshon, Itai Nahshon,
Kristian Nielsen,
Henrik Olsen, Henrik Olsen,
Michael Patra, Michael Patra,
Dimitrie O. Paun, Dimitrie O. Paun,
@ -114,11 +118,13 @@ Ronan Waide,
Eric Warnke, Eric Warnke,
Manfred Weichel, Manfred Weichel,
Morten Welinder, Morten Welinder,
Len White,
Lawson Whitney, Lawson Whitney,
Jan Willamowius, Jan Willamowius,
Carl Williams, Carl Williams,
Karl Guenter Wuensch, Karl Guenter Wuensch,
Eric Youngdale, Eric Youngdale,
James Youngman, James Youngman,
Nikita V. Youshchenko,
Mikolaj Zalewski, Mikolaj Zalewski,
and John Zero. and John Zero.

10
BUGS
View File

@ -9,10 +9,6 @@ As of Nov 1997 -
General: General:
* We need to do InsertMenuItem32[AW] and then code most of the other
inserting function in terms of this. Without this, we cannot support
all the new extended menus. Not hard, but slightly big.
* TrueType, .FON rasterizer. * TrueType, .FON rasterizer.
* No thread/process scheduling support in Win32 code. * No thread/process scheduling support in Win32 code.
@ -38,9 +34,11 @@ Miscellaneous:
* Invisible controls in BCW dialogs. * Invisible controls in BCW dialogs.
* MIRC is unable to show 'Options' dialog. * mIRC 'commands' menu stays on top and will not refresh.
* Tab switching in MIRC 'Setup' dialog leaks memory. * mIRC is unable to show 'Options' dialog.
* Tab switching in mIRC 'Setup' dialog leaks memory.
* nBytesWidth in CURSORICONINFO is bogus for some bpp * nBytesWidth in CURSORICONINFO is bogus for some bpp
(doesn't reflect the fact that bits are packed and 16-bit aligned). (doesn't reflect the fact that bits are packed and 16-bit aligned).

133
ChangeLog
View File

@ -1,3 +1,134 @@
----------------------------------------------------------------------
Sat Nov 29 12:35:26 1997 Alexandre Julliard <julliard@lrc.epfl.ch>
* [if1632/builtin.c]
Build a complete PE header for builtin Win32 modules.
* [loader/pe_image.c] [loader/module.c]
HMODULE32 now points to the loading address of the module. There
is no longer a separate PE_MODULE structure.
Fri Nov 28 11:21:47 1997 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [ole/*][configure.in][Makefile.in][include/interfaces.h]
[if1632/olesvr32.spec][if1632/olecli32.spec]
New directory, moved OLE stuff there.
new .spec files for olecli32,olesvr32, some stubs added.
* [misc/shell.c]
Added support for extracting icons from PE dlls.
* [misc/shellord.c][if1632/shell32.spec]
Added a huge heap of ordinal only exported shell functions
(will work only in Win95).
* [loader/task.c]
Hack to make MakeProcInstance16 work in all cases (mplayer.exe).
* [win32/string32.c][include/string32.h]
Obsolete, removed.
* [windows/keyboard.c]
Added *RegisterHotkey.
* [objects/font.c][objects/text.c]
Added GetFontLanguageInfo, GetTextCharsetInfo.
Wed Nov 26 18:10:40 1997 Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
* [misc/network.c]
In WNetGetConnection16 return the Drive label and not the DOS-Cwd.
Makes Wordview 6 start on a network connected machine.
* [controls/status.c]
Catch a Null pointer in SW_SetText.
* [files/dos_fs.c]
Add NT5 functions GetLongPathName32.
* [files/file.c]
Make GetTempFileName16 accept drive 0 (Current Drive) too.
Handle more errors and be more verbose in FILE_SetDosError, fix
an error in DeleteFile32W
* [memory/virtual.c]
Implement FlushViewOfFile.
* [misc/crtdll]
Implement _rotl and splitpath and add a stub for
_abnormal_termination.
* [misc/printdrv.c]
Stub for EnumPrinters32A.
* [win32/newfns]
Add Stub for QueryPerformanceFrequency, change return value
for QueryPerformanceCounter.
Add stub for DeviceIoControl.
Tue Nov 25 15:55:01 1997 Martin Boehme <boehme@informatik.mu-luebeck.de>
* [controls/combo.c] [controls/edit.c] [windows/defwnd.c]
[windows/winpos.c] [windows/win.c]
Removed WIN_NO_REDRAW flag.
Tue Nov 25 13:20:35 1997 Douglas Ridgway <ridgway@taiga.v-wave.com>
* [graphics/x11drv/bitblt.c]
Fixed memory leak in BITBLT_GetDstArea.
Sun Nov 23 14:05:23 1997 Andreas Mohr <100.30936@germany.net>
* [files/directory.c]
Export windows system directory to environment.
* [if1632/Makefile.in] [if1632/builtin.c] [if1632/w32skrnl.spec]
[if1632/win32s16.spec] [misc/w32scomb.c] [misc/w32skrnl.c]
Added Win32s DLLs W32SKRNL and WIN32S16.
* [if1632/kernel32.spec] [loader/module.c]
Added misc functions for Win32s.
* [if1632/kernel.spec] [loader/task.c]
Added DefineHandleTable().
* [scheduler/process.c]
Fixed SetEnvironmentVariable32A() to avoid heap corruption.
Sat Nov 22 14:11:42 1997 Kristian Nielsen <kristian.nielsen@risoe.dk>
* [windows/painting.c]
Fix leak in BeginPaint16() for CS_PARENTDC windows where the
update region was not properly released.
Thu Nov 20 03:55:29 1997 Gordon Chaffee <chaffee@CS.Berkeley.EDU>
* [loader/pe_image.c]
Implemented forwarded DLL functions.
* [objects/dib.c]
Added support for 16- and 32-bit mode DIBs.
Support negative bitmap heights.
* [win32/process.c]
Added stub for CreateProcess32W.
* [win32/security.c] [include/ntdll.h]
Added stubs for LookupAccountSid32A/W.
* [scheduler/process.c]
Use the size specified in the PE header for the process heap.
Mon Nov 17 00:53:35 1997 Len White <phreak@cgocable.net>
* [msdos/int3d.c]
New file. Stubs for int3d.
Sun Nov 16 12:30:00 PST 1997 Jason Schonberg <schon@mti.sgi.com>
* [include/aspi.h]
Changed comment style from C++ to C.
---------------------------------------------------------------------- ----------------------------------------------------------------------
Sun Nov 16 07:42:44 1997 Alex Korobka <alex@trantor.pharm.sunysb.edu> Sun Nov 16 07:42:44 1997 Alex Korobka <alex@trantor.pharm.sunysb.edu>
@ -78,7 +209,7 @@ Fri Nov 7 19:44:26 1997 Olaf Flebbe <o.flebbe@science-computing.de>
* [loader/resource.c] [user32.spec] * [loader/resource.c] [user32.spec]
Stubs for CopyAcceleratorTable, Destroy AcceleratorTable. Stubs for CopyAcceleratorTable, Destroy AcceleratorTable.
Thu Nov 6 22:37:04 1997 Morten Welinder <welinder@rentec.com> Thu Nov 6 22:37:04 1997 Morten Welinder <terra@diku.dk>
* [files/drive.c] * [files/drive.c]
(GetDiskFreeSpace32A): Cap at 2GB. (GetDiskFreeSpace32A): Cap at 2GB.

View File

@ -37,6 +37,7 @@ LIBSUBDIRS = \
msdos \ msdos \
multimedia \ multimedia \
objects \ objects \
ole \
resources \ resources \
scheduler \ scheduler \
win32 \ win32 \
@ -79,6 +80,7 @@ LIBOBJS = \
msdos/msdos.o \ msdos/msdos.o \
multimedia/multimedia.o \ multimedia/multimedia.o \
objects/objects.o \ objects/objects.o \
ole/ole.o \
resources/resources.o \ resources/resources.o \
scheduler/scheduler.o \ scheduler/scheduler.o \
win32/win32.o \ win32/win32.o \
@ -98,18 +100,18 @@ install:: install_$(MAIN_TARGET)
emu: wine emu: wine
lib: $(LIB_TARGET) lib: $(LIBSUBDIRS) $(LIB_TARGET)
wine wine.sym: $(LIB_TARGET) $(EMUSUBDIRS) dummy wine wine.sym: $(LIBSUBDIRS) $(LIB_TARGET) $(EMUSUBDIRS) dummy
$(CC) -o wine $(EMUOBJS) $(LIB_TARGET) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS) $(CC) -o wine $(EMUOBJS) $(LIB_TARGET) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
nm -n wine | grep -v _compiled >wine.sym nm -n wine | grep -v _compiled >wine.sym
libwine.a: $(LIBSUBDIRS) dummy libwine.a: $(LIBOBJS)
$(RM) $@ $(RM) $@
$(AR) $@ $(LIBOBJS) $(AR) $@ $(LIBOBJS)
$(RANLIB) $@ $(RANLIB) $@
libwine.so.1.0: $(LIBSUBDIRS) dummy libwine.so.1.0: $(LIBOBJS)
$(CC) -shared -Wl,-soname,libwine.so -o$@ $(LIBOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS) $(CC) -shared -Wl,-soname,libwine.so -o$@ $(LIBOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
install_emu: dummy install_emu: dummy

4
configure vendored
View File

@ -2521,9 +2521,11 @@ miscemu/Makefile
msdos/Makefile msdos/Makefile
multimedia/Makefile multimedia/Makefile
objects/Makefile objects/Makefile
ole/Makefile
programs/Makefile programs/Makefile
programs/progman/Makefile programs/progman/Makefile
programs/winhelp/Makefile programs/winhelp/Makefile
programs/winver/Makefile
rc/Makefile rc/Makefile
resources/Makefile resources/Makefile
scheduler/Makefile scheduler/Makefile
@ -2643,9 +2645,11 @@ miscemu/Makefile
msdos/Makefile msdos/Makefile
multimedia/Makefile multimedia/Makefile
objects/Makefile objects/Makefile
ole/Makefile
programs/Makefile programs/Makefile
programs/progman/Makefile programs/progman/Makefile
programs/winhelp/Makefile programs/winhelp/Makefile
programs/winver/Makefile
rc/Makefile rc/Makefile
resources/Makefile resources/Makefile
scheduler/Makefile scheduler/Makefile

View File

@ -146,9 +146,11 @@ miscemu/Makefile
msdos/Makefile msdos/Makefile
multimedia/Makefile multimedia/Makefile
objects/Makefile objects/Makefile
ole/Makefile
programs/Makefile programs/Makefile
programs/progman/Makefile programs/progman/Makefile
programs/winhelp/Makefile programs/winhelp/Makefile
programs/winver/Makefile
rc/Makefile rc/Makefile
resources/Makefile resources/Makefile
scheduler/Makefile scheduler/Makefile

View File

@ -363,6 +363,9 @@ static void CBPaintButton(LPHEADCOMBO lphc, HDC16 hdc)
UINT32 x, y; UINT32 x, y;
BOOL32 bBool; BOOL32 bBool;
if( lphc->wState & CBF_NOREDRAW )
return;
hPrevBrush = (HBRUSH32)SelectObject32(hdc, sysColorObjects.hbrushBtnFace); hPrevBrush = (HBRUSH32)SelectObject32(hdc, sysColorObjects.hbrushBtnFace);
CONV_RECT16TO32( &lphc->RectButton, &r ); CONV_RECT16TO32( &lphc->RectButton, &r );
@ -401,6 +404,9 @@ static void CBPaintText(LPHEADCOMBO lphc, HDC16 hdc)
INT32 id, size = 0; INT32 id, size = 0;
LPSTR pText = NULL; LPSTR pText = NULL;
if( lphc->wState & CBF_NOREDRAW )
return;
/* follow Windows combobox that sends a bunch of text /* follow Windows combobox that sends a bunch of text
* inquiries to its listbox while processing WM_PAINT. */ * inquiries to its listbox while processing WM_PAINT. */
@ -508,7 +514,7 @@ static LRESULT COMBO_Paint(LPHEADCOMBO lphc, HDC16 hParamDC)
hDC = (hParamDC) ? hParamDC hDC = (hParamDC) ? hParamDC
: BeginPaint16( lphc->self->hwndSelf, &ps); : BeginPaint16( lphc->self->hwndSelf, &ps);
if( hDC && !(lphc->self->flags & WIN_NO_REDRAW) ) if( hDC && !(lphc->wState & CBF_NOREDRAW) )
{ {
HBRUSH32 hPrevBrush, hBkgBrush; HBRUSH32 hPrevBrush, hBkgBrush;
@ -673,11 +679,14 @@ static void CBDropDown( LPHEADCOMBO lphc )
SetWindowPos32( lphc->hWndLBox, HWND_TOP, rect.left, rect.top, SetWindowPos32( lphc->hWndLBox, HWND_TOP, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top, rect.right - rect.left, rect.bottom - rect.top,
SWP_NOACTIVATE | SWP_NOSIZE ); SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOREDRAW);
if( pRect ) if( !(lphc->wState & CBF_NOREDRAW) )
RedrawWindow16( lphc->self->hwndSelf, pRect, 0, RDW_INVALIDATE | {
if( pRect )
RedrawWindow16( lphc->self->hwndSelf, pRect, 0, RDW_INVALIDATE |
RDW_ERASE | RDW_UPDATENOW | RDW_NOCHILDREN ); RDW_ERASE | RDW_UPDATENOW | RDW_NOCHILDREN );
ShowWindow32( lphc->hWndLBox, SW_SHOWNA ); ShowWindow32( lphc->hWndLBox, SW_SHOWNA );
}
} }
/*********************************************************************** /***********************************************************************
@ -722,7 +731,7 @@ static void CBRollUp( LPHEADCOMBO lphc, BOOL32 ok, BOOL32 bButton )
bButton = TRUE; bButton = TRUE;
} }
if( bButton ) if( bButton && !(lphc->wState & CBF_NOREDRAW) )
RedrawWindow16( hWnd, &rect, 0, RDW_INVALIDATE | RedrawWindow16( hWnd, &rect, 0, RDW_INVALIDATE |
RDW_ERASE | RDW_UPDATENOW | RDW_NOCHILDREN ); RDW_ERASE | RDW_UPDATENOW | RDW_NOCHILDREN );
CB_NOTIFY( lphc, CBN_CLOSEUP ); CB_NOTIFY( lphc, CBN_CLOSEUP );
@ -1036,7 +1045,7 @@ static void CBResetPos( LPHEADCOMBO lphc, LPRECT16 lbRect, BOOL32 bRedraw )
lphc->RectEdit.bottom - lphc->RectEdit.top, lphc->RectEdit.bottom - lphc->RectEdit.top,
SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW ); SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW );
lphc->wState &= ~CBF_NORESIZE; lphc->wState &= ~CBF_NORESIZE;
if( bRedraw ) if( bRedraw && !(lphc->wState & CBF_NOREDRAW) )
RedrawWindow32( lphc->self->hwndSelf, NULL, 0, RedrawWindow32( lphc->self->hwndSelf, NULL, 0,
RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW ); RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW );
} }
@ -1336,6 +1345,11 @@ LRESULT WINAPI ComboWndProc( HWND32 hwnd, UINT32 message,
return TRUE; return TRUE;
case WM_SETREDRAW: case WM_SETREDRAW:
if( wParam )
lphc->wState &= ~CBF_NOREDRAW;
else
lphc->wState |= CBF_NOREDRAW;
if( lphc->wState & CBF_EDIT ) if( lphc->wState & CBF_EDIT )
SendMessage32A( lphc->hWndEdit, message, wParam, lParam ); SendMessage32A( lphc->hWndEdit, message, wParam, lParam );
SendMessage32A( lphc->hWndLBox, message, wParam, lParam ); SendMessage32A( lphc->hWndLBox, message, wParam, lParam );

View File

@ -84,6 +84,8 @@ typedef struct
INT32 left_margin; /* in pixels */ INT32 left_margin; /* in pixels */
INT32 right_margin; /* in pixels */ INT32 right_margin; /* in pixels */
RECT32 format_rect; RECT32 format_rect;
INT32 region_posx; /* Position of cursor relative to region: */
INT32 region_posy; /* -1: to left, 0: within, 1: to right */
EDITWORDBREAKPROC16 word_break_proc16; EDITWORDBREAKPROC16 word_break_proc16;
EDITWORDBREAKPROC32A word_break_proc32A; EDITWORDBREAKPROC32A word_break_proc32A;
INT32 line_count; /* number of lines */ INT32 line_count; /* number of lines */
@ -1016,6 +1018,7 @@ static INT32 EDIT_CharFromPos(WND *wnd, EDITSTATE *es, INT32 x, INT32 y, LPBOOL3
INT32 line = (y - es->format_rect.top) / es->line_height + es->y_offset; INT32 line = (y - es->format_rect.top) / es->line_height + es->y_offset;
INT32 line_index = 0; INT32 line_index = 0;
LINEDEF *line_def = es->first_line_def; LINEDEF *line_def = es->first_line_def;
INT32 low, high;
while ((line > 0) && line_def->next) { while ((line > 0) && line_def->next) {
line_index += line_def->length; line_index += line_def->length;
line_def = line_def->next; line_def = line_def->next;
@ -1035,11 +1038,16 @@ static INT32 EDIT_CharFromPos(WND *wnd, EDITSTATE *es, INT32 x, INT32 y, LPBOOL3
dc = GetDC32(wnd->hwndSelf); dc = GetDC32(wnd->hwndSelf);
if (es->font) if (es->font)
old_font = SelectObject32(dc, es->font); old_font = SelectObject32(dc, es->font);
/* FIXME: inefficient algorithm */ low = line_index + 1;
for (index = line_index + 1 ; index < line_index + line_def->net_length ; index++) high = line_index + line_def->net_length + 1;
if (LOWORD(GetTabbedTextExtent32A(dc, es->text + line_index, while (low < high - 1)
index - line_index, es->tabs_count, es->tabs)) >= x) {
break; INT32 mid = (low + high) / 2;
if (LOWORD(GetTabbedTextExtent32A(dc, es->text + line_index,mid - line_index, es->tabs_count, es->tabs)) > x) high = mid;
else low = mid;
}
index = low;
if (after_wrap) if (after_wrap)
*after_wrap = ((index == line_index + line_def->net_length) && *after_wrap = ((index == line_index + line_def->net_length) &&
(line_def->ending == END_WRAP)); (line_def->ending == END_WRAP));
@ -2257,14 +2265,12 @@ static BOOL32 EDIT_EM_LineScroll(WND *wnd, EDITSTATE *es, INT32 dx, INT32 dy)
nyoff = es->line_count - 1; nyoff = es->line_count - 1;
dy = (es->y_offset - nyoff) * es->line_height; dy = (es->y_offset - nyoff) * es->line_height;
if (dx || dy) { if (dx || dy) {
if (!(wnd->flags & WIN_NO_REDRAW)) { RECT32 rc1;
RECT32 rc1; RECT32 rc;
RECT32 rc; GetClientRect32(wnd->hwndSelf, &rc1);
GetClientRect32(wnd->hwndSelf, &rc1); IntersectRect32(&rc, &rc1, &es->format_rect);
IntersectRect32(&rc, &rc1, &es->format_rect); ScrollWindowEx32(wnd->hwndSelf, -dx, dy,
ScrollWindowEx32(wnd->hwndSelf, -dx, dy, NULL, &rc, (HRGN32)NULL, NULL, SW_INVALIDATE);
NULL, &rc, (HRGN32)NULL, NULL, SW_INVALIDATE);
}
es->y_offset = nyoff; es->y_offset = nyoff;
es->x_offset += dx; es->x_offset += dx;
} }
@ -2440,8 +2446,7 @@ static void EDIT_EM_ReplaceSel(WND *wnd, EDITSTATE *es, BOOL32 can_undo, LPCSTR
EDIT_EM_ScrollCaret(wnd, es); EDIT_EM_ScrollCaret(wnd, es);
/* FIXME: really inefficient */ /* FIXME: really inefficient */
if (!(wnd->flags & WIN_NO_REDRAW)) InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
} }
@ -2525,8 +2530,7 @@ static void EDIT_EM_SetHandle(WND *wnd, EDITSTATE *es, HLOCAL32 hloc)
es->flags &= ~EF_MODIFIED; es->flags &= ~EF_MODIFIED;
es->flags &= ~EF_UPDATE; es->flags &= ~EF_UPDATE;
EDIT_BuildLineDefs_ML(wnd, es); EDIT_BuildLineDefs_ML(wnd, es);
if (!(wnd->flags & WIN_NO_REDRAW)) InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
EDIT_EM_ScrollCaret(wnd, es); EDIT_EM_ScrollCaret(wnd, es);
} }
@ -2569,8 +2573,7 @@ static void EDIT_EM_SetHandle16(WND *wnd, EDITSTATE *es, HLOCAL16 hloc)
es->flags &= ~EF_MODIFIED; es->flags &= ~EF_MODIFIED;
es->flags &= ~EF_UPDATE; es->flags &= ~EF_UPDATE;
EDIT_BuildLineDefs_ML(wnd, es); EDIT_BuildLineDefs_ML(wnd, es);
if (!(wnd->flags & WIN_NO_REDRAW)) InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
EDIT_EM_ScrollCaret(wnd, es); EDIT_EM_ScrollCaret(wnd, es);
} }
@ -2612,16 +2615,16 @@ static void EDIT_EM_SetMargins(WND *wnd, EDITSTATE *es, INT32 action, INT32 left
* FIXME: do some GetABCCharWidth, or so * FIXME: do some GetABCCharWidth, or so
* This is just preliminary * This is just preliminary
*/ */
es->left_margin = es->right_margin = es->char_width; es->left_margin = es->right_margin = es->char_width/4;
} else } else
es->left_margin = es->right_margin = es->char_width; es->left_margin = es->right_margin = es->char_width/4;
return;
} else { } else {
if (action & EC_LEFTMARGIN) if (action & EC_LEFTMARGIN)
es->left_margin = left; es->left_margin = left;
if (action & EC_RIGHTMARGIN) if (action & EC_RIGHTMARGIN)
es->right_margin = right; es->right_margin = right;
} }
dprintf_edit(stddeb, "EDIT_EM_SetMargins: left=%d, right=%d\n", es->left_margin, es->right_margin);
} }
@ -2678,24 +2681,36 @@ static void EDIT_EM_SetSel(WND *wnd, EDITSTATE *es, UINT32 start, UINT32 end, BO
es->flags |= EF_AFTER_WRAP; es->flags |= EF_AFTER_WRAP;
else else
es->flags &= ~EF_AFTER_WRAP; es->flags &= ~EF_AFTER_WRAP;
if (!(wnd->flags & WIN_NO_REDRAW)) { if (es->flags & EF_FOCUSED) {
if (es->flags & EF_FOCUSED) { LRESULT pos = EDIT_EM_PosFromChar(wnd, es, end, after_wrap);
LRESULT pos = EDIT_EM_PosFromChar(wnd, es, end, after_wrap); SetCaretPos32(SLOWORD(pos), SHIWORD(pos));
SetCaretPos32(SLOWORD(pos), SHIWORD(pos));
}
/* FIXME: little efficiency, could be better */
ORDER_UINT32(start, end);
ORDER_UINT32(start, old_start);
ORDER_UINT32(start, old_end);
ORDER_UINT32(end, old_start);
ORDER_UINT32(end, old_end);
ORDER_UINT32(old_start, old_end);
if (end != old_start) {
EDIT_InvalidateText(wnd, es, start, end);
EDIT_InvalidateText(wnd, es, old_start, old_end);
} else
EDIT_InvalidateText(wnd, es, start, old_end);
} }
/* This is little bit more efficient than before, not sure if it can be improved. FIXME? */
ORDER_UINT32(start, end);
ORDER_UINT32(end, old_end);
ORDER_UINT32(start, old_start);
ORDER_UINT32(old_start, old_end);
if (end != old_start)
{
/*
* One can also do
* ORDER_UINT32(end, old_start);
* EDIT_InvalidateText(wnd, es, start, end);
* EDIT_InvalidateText(wnd, es, old_start, old_end);
* in place of the following if statement.
*/
if (old_start > end )
{
EDIT_InvalidateText(wnd, es, start, end);
EDIT_InvalidateText(wnd, es, old_start, old_end);
}
else
{
EDIT_InvalidateText(wnd, es, start, old_start);
EDIT_InvalidateText(wnd, es, end, old_end);
}
}
else EDIT_InvalidateText(wnd, es, start, old_end);
} }
@ -3479,6 +3494,7 @@ static LRESULT EDIT_WM_LButtonDown(WND *wnd, EDITSTATE *es, DWORD keys, INT32 x,
e = EDIT_CharFromPos(wnd, es, x, y, &after_wrap); e = EDIT_CharFromPos(wnd, es, x, y, &after_wrap);
EDIT_EM_SetSel(wnd, es, (keys & MK_SHIFT) ? es->selection_start : e, e, after_wrap); EDIT_EM_SetSel(wnd, es, (keys & MK_SHIFT) ? es->selection_start : e, e, after_wrap);
EDIT_EM_ScrollCaret(wnd, es); EDIT_EM_ScrollCaret(wnd, es);
es->region_posx = es->region_posx = 0;
SetTimer32(wnd->hwndSelf, 0, 100, NULL); SetTimer32(wnd->hwndSelf, 0, 100, NULL);
return 0; return 0;
} }
@ -3508,6 +3524,7 @@ static LRESULT EDIT_WM_MouseMove(WND *wnd, EDITSTATE *es, DWORD keys, INT32 x, I
{ {
INT32 e; INT32 e;
BOOL32 after_wrap; BOOL32 after_wrap;
INT32 prex, prey;
if (GetCapture32() != wnd->hwndSelf) if (GetCapture32() != wnd->hwndSelf)
return 0; return 0;
@ -3516,7 +3533,10 @@ static LRESULT EDIT_WM_MouseMove(WND *wnd, EDITSTATE *es, DWORD keys, INT32 x, I
* FIXME: gotta do some scrolling if outside client * FIXME: gotta do some scrolling if outside client
* area. Maybe reset the timer ? * area. Maybe reset the timer ?
*/ */
prex = x; prey = y;
EDIT_ConfinePoint(wnd, es, &x, &y); EDIT_ConfinePoint(wnd, es, &x, &y);
es->region_posx = (prex < x) ? -1 : ((prex > x) ? 1 : 0);
es->region_posy = (prey < y) ? -1 : ((prey > y) ? 1 : 0);
e = EDIT_CharFromPos(wnd, es, x, y, &after_wrap); e = EDIT_CharFromPos(wnd, es, x, y, &after_wrap);
EDIT_EM_SetSel(wnd, es, es->selection_start, e, after_wrap); EDIT_EM_SetSel(wnd, es, es->selection_start, e, after_wrap);
return 0; return 0;
@ -3677,7 +3697,7 @@ static void EDIT_WM_SetFont(WND *wnd, EDITSTATE *es, HFONT32 font, BOOL32 redraw
EDIT_EM_SetMargins(wnd, es, EC_USEFONTINFO, 0, 0); EDIT_EM_SetMargins(wnd, es, EC_USEFONTINFO, 0, 0);
if (es->style & ES_MULTILINE) if (es->style & ES_MULTILINE)
EDIT_BuildLineDefs_ML(wnd, es); EDIT_BuildLineDefs_ML(wnd, es);
if (redraw && !(wnd->flags & WIN_NO_REDRAW)) if (redraw)
InvalidateRect32(wnd->hwndSelf, NULL, TRUE); InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
if (es->flags & EF_FOCUSED) { if (es->flags & EF_FOCUSED) {
LRESULT pos; LRESULT pos;
@ -3701,6 +3721,7 @@ static void EDIT_WM_SetText(WND *wnd, EDITSTATE *es, LPCSTR text)
if (text) { if (text) {
dprintf_edit(stddeb, "\t'%s'\n", text); dprintf_edit(stddeb, "\t'%s'\n", text);
EDIT_EM_ReplaceSel(wnd, es, FALSE, text); EDIT_EM_ReplaceSel(wnd, es, FALSE, text);
es->x_offset = 0;
} }
es->flags |= EF_MODIFIED; es->flags |= EF_MODIFIED;
es->flags |= EF_UPDATE; es->flags |= EF_UPDATE;
@ -3749,8 +3770,13 @@ static LRESULT EDIT_WM_SysKeyDown(WND *wnd, EDITSTATE *es, INT32 key, DWORD key_
*/ */
static void EDIT_WM_Timer(WND *wnd, EDITSTATE *es, INT32 id, TIMERPROC32 timer_proc) static void EDIT_WM_Timer(WND *wnd, EDITSTATE *es, INT32 id, TIMERPROC32 timer_proc)
{ {
if (es->region_posx < 0) {
EDIT_MoveBackward(wnd, es, TRUE);
} else if (es->region_posx > 0) {
EDIT_MoveForward(wnd, es, TRUE);
}
/* /*
* FIXME: gotta do some scrolling here, like * FIXME: gotta do some vertical scrolling here, like
* EDIT_EM_LineScroll(wnd, 0, 1); * EDIT_EM_LineScroll(wnd, 0, 1);
*/ */
} }

View File

@ -118,13 +118,11 @@ SW_SetText(STATUSWINDOWINFO *self, HWND32 hwnd, WPARAM32 wParam, LPARAM lParam)
part_num = ((INT32) wParam) & 0x00ff; part_num = ((INT32) wParam) & 0x00ff;
style = ((INT32) wParam) & 0xff00; style = ((INT32) wParam) & 0xff00;
if (part_num >= 255) if ((self->simple) || (self->parts==NULL) || (part_num==255))
return FALSE;
if ((self->simple) || (part_num==255))
part = &self->part0; part = &self->part0;
else else
part = &self->parts[part_num]; part = &self->parts[part_num];
if (!part) return FALSE;
part->style = style; part->style = style;
if (style == SBT_OWNERDRAW) { if (style == SBT_OWNERDRAW) {
part->text = text; part->text = text;

View File

@ -347,19 +347,18 @@ void DEBUG_AddModuleBreakpoints(void)
if (pModule->flags & NE_FFLAGS_WIN32) /* PE module */ if (pModule->flags & NE_FFLAGS_WIN32) /* PE module */
{ {
PE_MODULE *pe = pModule->pe_module;
PE_MODREF *pem; PE_MODREF *pem;
if (!pCurrentProcess) continue; if (!pCurrentProcess) continue;
pem = pCurrentProcess->modref_list; pem = pCurrentProcess->modref_list;
while (pem) while (pem)
{ {
if (pem->pe_module == pe) break; if (pem->module == pModule->module32) break;
pem = pem->next; pem = pem->next;
} }
if (!pem) continue; if (!pem) continue;
addr.seg = 0; addr.seg = 0;
addr.off = pem->load_addr + addr.off = (DWORD)RVA_PTR( pem->module,
(DWORD)pe->pe_header->OptionalHeader.AddressOfEntryPoint; OptionalHeader.AddressOfEntryPoint );
fprintf( stderr, "Win32 task '%s': ", entry.szModule ); fprintf( stderr, "Win32 task '%s': ", entry.szModule );
DEBUG_AddBreakpoint( &addr ); DEBUG_AddBreakpoint( &addr );
} }

View File

@ -418,13 +418,10 @@ DEBUG_EvalExpr(struct expr * exp)
exp->un.rgister.result = DEBUG_GetRegister(exp->un.rgister.reg); exp->un.rgister.result = DEBUG_GetRegister(exp->un.rgister.reg);
rtn.off = (unsigned int) &exp->un.rgister.result; rtn.off = (unsigned int) &exp->un.rgister.result;
if( exp->un.rgister.reg == REG_EIP ) if( exp->un.rgister.reg == REG_EIP )
{
rtn.seg = CS_reg(&DEBUG_context); rtn.seg = CS_reg(&DEBUG_context);
}
else else
{
rtn.seg = DS_reg(&DEBUG_context); rtn.seg = DS_reg(&DEBUG_context);
} DBG_FIX_ADDR_SEG( &rtn, 0 );
break; break;
case EXPR_TYPE_BINOP: case EXPR_TYPE_BINOP:
exp1 = DEBUG_EvalExpr(exp->un.binop.exp1); exp1 = DEBUG_EvalExpr(exp->un.binop.exp1);

View File

@ -789,24 +789,23 @@ static void DEBUG_LoadEntryPoints16( HMODULE16 hModule, NE_MODULE *pModule,
* *
* Load the entry points of a Win32 module into the hash table. * Load the entry points of a Win32 module into the hash table.
*/ */
static void DEBUG_LoadEntryPoints32( PE_MODULE *pe, const char *name ) static void DEBUG_LoadEntryPoints32( HMODULE32 hModule, const char *name )
{ {
#define RVA(x) (load_addr+(DWORD)(x)) #define RVA(x) (hModule+(DWORD)(x))
DBG_ADDR addr; DBG_ADDR addr;
char buffer[256]; char buffer[256];
int i, j; int i, j;
IMAGE_SECTION_HEADER *pe_seg;
IMAGE_EXPORT_DIRECTORY *exports; IMAGE_EXPORT_DIRECTORY *exports;
IMAGE_DATA_DIRECTORY *debug_dir; IMAGE_DATA_DIRECTORY *debug_dir;
DWORD load_addr;
WORD *ordinals; WORD *ordinals;
void **functions; void **functions;
const char **names; const char **names;
PE_MODREF *pem = pCurrentProcess->modref_list; PE_MODREF *pem = pCurrentProcess->modref_list;
while (pem && (pem->pe_module != pe)) pem = pem->next; while (pem && (pem->module != hModule)) pem = pem->next;
if (!pem) return; if (!pem) return;
load_addr = pem->load_addr;
exports = pem->pe_export; exports = pem->pe_export;
addr.seg = 0; addr.seg = 0;
@ -814,22 +813,24 @@ static void DEBUG_LoadEntryPoints32( PE_MODULE *pe, const char *name )
/* Add start of DLL */ /* Add start of DLL */
addr.off = load_addr; addr.off = hModule;
DEBUG_AddSymbol( name, &addr, NULL, SYM_WIN32 | SYM_FUNC ); DEBUG_AddSymbol( name, &addr, NULL, SYM_WIN32 | SYM_FUNC );
/* Add entry point */ /* Add entry point */
sprintf( buffer, "%s.EntryPoint", name ); sprintf( buffer, "%s.EntryPoint", name );
addr.off = RVA( pe->pe_header->OptionalHeader.AddressOfEntryPoint ); addr.off = (DWORD)RVA_PTR( hModule, OptionalHeader.AddressOfEntryPoint );
DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC ); DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
/* Add start of sections */ /* Add start of sections */
for (i = 0; i < pe->pe_header->FileHeader.NumberOfSections; i++) pe_seg = PE_SECTIONS(hModule);
for (i = 0; i < PE_HEADER(hModule)->FileHeader.NumberOfSections; i++)
{ {
sprintf( buffer, "%s.%s", name, pe->pe_seg[i].Name ); sprintf( buffer, "%s.%s", name, pe_seg->Name );
addr.off = RVA( pe->pe_seg[i].VirtualAddress ); addr.off = RVA(pe_seg->VirtualAddress );
DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC ); DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
pe_seg++;
} }
/* Add exported functions */ /* Add exported functions */
@ -859,9 +860,9 @@ static void DEBUG_LoadEntryPoints32( PE_MODULE *pe, const char *name )
DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC ); DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
} }
debug_dir = &pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG]; debug_dir = &PE_HEADER(hModule)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];
if (debug_dir->Size) if (debug_dir->Size)
DEBUG_RegisterDebugInfo( pe, load_addr, name, DEBUG_RegisterDebugInfo( hModule, name,
debug_dir->VirtualAddress, debug_dir->Size ); debug_dir->VirtualAddress, debug_dir->Size );
#undef RVA #undef RVA
} }
@ -884,10 +885,7 @@ void DEBUG_LoadEntryPoints(void)
fprintf( stderr, " %s", entry.szModule ); fprintf( stderr, " %s", entry.szModule );
if (pModule->flags & NE_FFLAGS_WIN32) /* PE module */ if (pModule->flags & NE_FFLAGS_WIN32) /* PE module */
{ DEBUG_LoadEntryPoints32( pModule->module32, entry.szModule );
if (pModule->flags & NE_FFLAGS_BUILTIN) continue;
DEBUG_LoadEntryPoints32( pModule->pe_module, entry.szModule );
}
else /* NE module */ else /* NE module */
DEBUG_LoadEntryPoints16( entry.hModule, pModule, entry.szModule ); DEBUG_LoadEntryPoints16( entry.hModule, pModule, entry.szModule );
} }

View File

@ -509,8 +509,8 @@ struct deferred_debug_info
char * module_name; char * module_name;
char * dbg_info; char * dbg_info;
int dbg_size; int dbg_size;
HMODULE32 module;
LPIMAGE_DEBUG_DIRECTORY dbgdir; LPIMAGE_DEBUG_DIRECTORY dbgdir;
struct pe_data * pe;
LPIMAGE_SECTION_HEADER sectp; LPIMAGE_SECTION_HEADER sectp;
int nsect; int nsect;
short int dbg_index; short int dbg_index;
@ -881,8 +881,8 @@ DEBUG_InitCVDataTypes()
* We don't fully process it here for performance reasons. * We don't fully process it here for performance reasons.
*/ */
int int
DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr, DEBUG_RegisterDebugInfo( HMODULE32 hModule, const char *module_name,
const char *module_name, u_long v_addr, u_long size) u_long v_addr, u_long size)
{ {
int has_codeview = FALSE; int has_codeview = FALSE;
int rtn = FALSE; int rtn = FALSE;
@ -891,7 +891,7 @@ DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
struct deferred_debug_info * deefer; struct deferred_debug_info * deefer;
orig_size = size; orig_size = size;
dbgptr = (LPIMAGE_DEBUG_DIRECTORY) (load_addr + v_addr); dbgptr = (LPIMAGE_DEBUG_DIRECTORY) (hModule + v_addr);
for(; size >= sizeof(*dbgptr); size -= sizeof(*dbgptr), dbgptr++ ) for(; size >= sizeof(*dbgptr); size -= sizeof(*dbgptr), dbgptr++ )
{ {
switch(dbgptr->Type) switch(dbgptr->Type)
@ -904,7 +904,7 @@ DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
} }
size = orig_size; size = orig_size;
dbgptr = (LPIMAGE_DEBUG_DIRECTORY) (load_addr + v_addr); dbgptr = (LPIMAGE_DEBUG_DIRECTORY) (hModule + v_addr);
for(; size >= sizeof(*dbgptr); size -= sizeof(*dbgptr), dbgptr++ ) for(; size >= sizeof(*dbgptr); size -= sizeof(*dbgptr), dbgptr++ )
{ {
switch(dbgptr->Type) switch(dbgptr->Type)
@ -935,16 +935,16 @@ DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
* it just points to itself, and we can ignore this. * it just points to itself, and we can ignore this.
*/ */
if( (dbgptr->Type == IMAGE_DEBUG_TYPE_MISC) if( (dbgptr->Type == IMAGE_DEBUG_TYPE_MISC)
&& (pe->pe_header->FileHeader.Characteristics & IMAGE_FILE_DEBUG_STRIPPED) == 0 ) && (PE_HEADER(hModule)->FileHeader.Characteristics & IMAGE_FILE_DEBUG_STRIPPED) == 0 )
{ {
break; break;
} }
deefer = (struct deferred_debug_info *) xmalloc(sizeof(*deefer)); deefer = (struct deferred_debug_info *) xmalloc(sizeof(*deefer));
deefer->pe = pe; deefer->module = hModule;
deefer->load_addr = (char *)hModule;
deefer->dbg_info = NULL; deefer->dbg_info = NULL;
deefer->dbg_size = 0; deefer->dbg_size = 0;
/* /*
* Read the important bits. What we do after this depends * Read the important bits. What we do after this depends
@ -952,16 +952,15 @@ DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
* to proceed if we know what we need to do next. * to proceed if we know what we need to do next.
*/ */
deefer->dbg_size = dbgptr->SizeOfData; deefer->dbg_size = dbgptr->SizeOfData;
deefer->dbg_info = (char *)(pe->mappeddll+dbgptr->PointerToRawData); deefer->dbg_info = (char *)(hModule + dbgptr->PointerToRawData);
deefer->load_addr = (char *) load_addr;
deefer->dbgdir = dbgptr; deefer->dbgdir = dbgptr;
deefer->next = dbglist; deefer->next = dbglist;
deefer->loaded = FALSE; deefer->loaded = FALSE;
deefer->dbg_index = DEBUG_next_index; deefer->dbg_index = DEBUG_next_index;
deefer->module_name = xstrdup(module_name); deefer->module_name = xstrdup(module_name);
deefer->sectp = pe->pe_seg; deefer->sectp = PE_SECTIONS(hModule);
deefer->nsect = pe->pe_header->FileHeader.NumberOfSections; deefer->nsect = PE_HEADER(hModule)->FileHeader.NumberOfSections;
dbglist = deefer; dbglist = deefer;
break; break;
@ -985,7 +984,7 @@ DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name)
struct deferred_debug_info * deefer; struct deferred_debug_info * deefer;
deefer = (struct deferred_debug_info *) xmalloc(sizeof(*deefer)); deefer = (struct deferred_debug_info *) xmalloc(sizeof(*deefer));
deefer->pe = NULL; deefer->module = 0;
/* /*
* Read the important bits. What we do after this depends * Read the important bits. What we do after this depends
@ -2401,19 +2400,9 @@ void DEBUG_InfoShare(void)
fprintf(stderr,"Address\t\tModule\tName\n"); fprintf(stderr,"Address\t\tModule\tName\n");
for(deefer = dbglist; deefer; deefer = deefer->next) for(deefer = dbglist; deefer; deefer = deefer->next)
{ {
if( deefer->pe == NULL ) fprintf(stderr,"0x%8.8x\t(%s)\t%s\n", (unsigned int) deefer->load_addr,
{ deefer->module ? "Win32" : "ELF", deefer->module_name);
fprintf(stderr,"0x%8.8x\t(ELF)\t%s\n", }
(unsigned int) deefer->load_addr,
deefer->module_name);
}
else
{
fprintf(stderr,"0x%8.8x\t(Win32)\t%s\n",
(unsigned int) deefer->load_addr,
deefer->module_name);
}
}
} }

View File

@ -161,7 +161,7 @@ int DIR_Init(void)
dprintf_dosfs( stddeb, "TempDir = %s\nCwd = %c:\\%s\n", dprintf_dosfs( stddeb, "TempDir = %s\nCwd = %c:\\%s\n",
DIR_TempDosDir, 'A' + drive, DRIVE_GetDosCwd( drive ) ); DIR_TempDosDir, 'A' + drive, DRIVE_GetDosCwd( drive ) );
/* Put the temp and Windows directories into the environment */ /* Put the temp and Windows and system directories into the environment */
env_p = HEAP_xalloc( SystemHeap, 0, strlen(DIR_TempDosDir) + 6 ); env_p = HEAP_xalloc( SystemHeap, 0, strlen(DIR_TempDosDir) + 6 );
strcpy( env_p, "TEMP=" ); strcpy( env_p, "TEMP=" );
@ -171,6 +171,10 @@ int DIR_Init(void)
strcpy( env_p, "windir=" ); strcpy( env_p, "windir=" );
strcpy( env_p + 7, DIR_WindowsDosDir ); strcpy( env_p + 7, DIR_WindowsDosDir );
putenv( env_p ); putenv( env_p );
env_p = HEAP_xalloc( SystemHeap, 0, strlen(DIR_SystemDosDir) + 11 );
strcpy( env_p, "winsysdir=" );
strcpy( env_p + 10, DIR_SystemDosDir );
putenv( env_p );
return 1; return 1;
} }

View File

@ -797,6 +797,42 @@ DWORD WINAPI GetShortPathName32W( LPCWSTR longpath, LPWSTR shortpath,
} }
/***********************************************************************
* GetLongPathName32A (KERNEL32.xxx)
*/
DWORD WINAPI GetLongPathName32A( LPCSTR shortpath, LPSTR longpath,
DWORD longlen )
{
DOS_FULL_NAME full_name;
/* FIXME: is it correct to always return a fully qualified short path? */
if (!DOSFS_GetFullName( shortpath, TRUE, &full_name )) return 0;
lstrcpyn32A( longpath, full_name.long_name, longlen );
return strlen( full_name.long_name );
}
/***********************************************************************
* GetLongPathName32W (KERNEL32.269)
*/
DWORD WINAPI GetLongPathName32W( LPCWSTR shortpath, LPWSTR longpath,
DWORD longlen )
{
DOS_FULL_NAME full_name;
DWORD ret = 0;
LPSTR shortpathA = HEAP_strdupWtoA( GetProcessHeap(), 0, shortpath );
/* FIXME: is it correct to always return a fully qualified short path? */
if (DOSFS_GetFullName( shortpathA, TRUE, &full_name ))
{
ret = strlen( full_name.short_name );
lstrcpynAtoW( longpath, full_name.long_name, longlen );
}
HeapFree( GetProcessHeap(), 0, shortpathA );
return ret;
}
/*********************************************************************** /***********************************************************************
* DOSFS_DoGetFullPathName * DOSFS_DoGetFullPathName
* *

View File

@ -146,7 +146,8 @@ void FILE_SetDosError(void)
{ {
int save_errno = errno; /* errno gets overwritten by printf */ int save_errno = errno; /* errno gets overwritten by printf */
dprintf_file(stddeb, "FILE_SetDosError: errno = %d\n", errno ); dprintf_file(stddeb, "FILE_SetDosError: errno = %d %s\n", errno,
sys_errlist[errno] );
switch (save_errno) switch (save_errno)
{ {
case EAGAIN: case EAGAIN:
@ -179,6 +180,12 @@ void FILE_SetDosError(void)
case EEXIST: case EEXIST:
DOS_ERROR( ER_FileExists, EC_Exists, SA_Abort, EL_Disk ); DOS_ERROR( ER_FileExists, EC_Exists, SA_Abort, EL_Disk );
break; break;
case EINVAL:
DOS_ERROR( ER_SeekError, EC_NotFound, SA_Ignore, EL_Disk );
break;
case ENOTEMPTY:
DOS_ERROR( ERROR_DIR_NOT_EMPTY, EC_Exists, SA_Ignore, EL_Disk );
break;
default: default:
perror( "int21: unknown errno" ); perror( "int21: unknown errno" );
DOS_ERROR( ER_GeneralFailure, EC_SystemFailure, SA_Abort, EL_Unknown ); DOS_ERROR( ER_GeneralFailure, EC_SystemFailure, SA_Abort, EL_Unknown );
@ -523,6 +530,9 @@ UINT16 WINAPI GetTempFileName16( BYTE drive, LPCSTR prefix, UINT16 unique,
{ {
char temppath[144]; char temppath[144];
if (!(drive & ~TF_FORCEDRIVE)) /* drive 0 means current default drive */
drive |= DRIVE_GetCurrentDrive();
if ((drive & TF_FORCEDRIVE) && if ((drive & TF_FORCEDRIVE) &&
!DRIVE_IsValid( toupper(drive & ~TF_FORCEDRIVE) - 'A' )) !DRIVE_IsValid( toupper(drive & ~TF_FORCEDRIVE) - 'A' ))
{ {
@ -1185,7 +1195,7 @@ BOOL32 WINAPI DeleteFile32A( LPCSTR path )
BOOL32 WINAPI DeleteFile32W( LPCWSTR path ) BOOL32 WINAPI DeleteFile32W( LPCWSTR path )
{ {
LPSTR xpath = HEAP_strdupWtoA( GetProcessHeap(), 0, path ); LPSTR xpath = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
BOOL32 ret = RemoveDirectory32A( xpath ); BOOL32 ret = DeleteFile32A( xpath );
HeapFree( GetProcessHeap(), 0, xpath ); HeapFree( GetProcessHeap(), 0, xpath );
return ret; return ret;
} }

View File

@ -92,6 +92,7 @@ INT32 WINAPI Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
LPSTR x=PTR_SEG_TO_LIN(segout); LPSTR x=PTR_SEG_TO_LIN(segout);
lstrcpy32A(lpvOutData,x); lstrcpy32A(lpvOutData,x);
SEGPTR_FREE(x); SEGPTR_FREE(x);
break;
} }
case ENABLEPAIRKERNING: { case ENABLEPAIRKERNING: {
LPINT16 enab = (LPINT16)PTR_SEG_TO_LIN(segout); LPINT16 enab = (LPINT16)PTR_SEG_TO_LIN(segout);
@ -99,6 +100,7 @@ INT32 WINAPI Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
*(LPINT32)lpvOutData = *enab; *(LPINT32)lpvOutData = *enab;
SEGPTR_FREE(enab); SEGPTR_FREE(enab);
SEGPTR_FREE(PTR_SEG_TO_LIN(segin)); SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
break;
} }
case GETFACENAME: { case GETFACENAME: {
LPSTR x = (LPSTR)PTR_SEG_TO_LIN(segout); LPSTR x = (LPSTR)PTR_SEG_TO_LIN(segout);

View File

@ -975,6 +975,7 @@ static void BITBLT_GetDstArea(DC *dc, Pixmap pixmap, GC gc, RECT32 *visRectDst)
XPutPixel( image, x, y, XPutPixel( image, x, y,
COLOR_PixelToPalette[XGetPixel( image, x, y )]); COLOR_PixelToPalette[XGetPixel( image, x, y )]);
XPutImage( display, pixmap, gc, image, 0, 0, 0, 0, width, height ); XPutImage( display, pixmap, gc, image, 0, 0, 0, 0, width, height );
XDestroyImage( image );
} }
} }

View File

@ -31,7 +31,9 @@ DLLS = \
ole2prox.spec \ ole2prox.spec \
ole32.spec \ ole32.spec \
olecli.spec \ olecli.spec \
olecli32.spec \
olesvr.spec \ olesvr.spec \
olesvr32.spec \
shell.spec \ shell.spec \
shell32.spec \ shell32.spec \
sound.spec \ sound.spec \
@ -43,7 +45,9 @@ DLLS = \
user32.spec \ user32.spec \
ver.spec \ ver.spec \
version.spec \ version.spec \
w32skrnl.spec \
w32sys.spec \ w32sys.spec \
win32s16.spec \
win87em.spec \ win87em.spec \
winaspi.spec \ winaspi.spec \
wing.spec \ wing.spec \

View File

@ -87,8 +87,8 @@ type win32
0083 stub LogonUserW 0083 stub LogonUserW
0084 stub LookupAccountNameA 0084 stub LookupAccountNameA
0085 stub LookupAccountNameW 0085 stub LookupAccountNameW
0086 stub LookupAccountSidA 0086 stdcall LookupAccountSidA(ptr ptr ptr ptr ptr ptr ptr) LookupAccountSid32A
0087 stub LookupAccountSidW 0087 stdcall LookupAccountSidW(ptr ptr ptr ptr ptr ptr ptr) LookupAccountSid32W
0088 stub LookupPrivilegeDisplayNameA 0088 stub LookupPrivilegeDisplayNameA
0089 stub LookupPrivilegeDisplayNameW 0089 stub LookupPrivilegeDisplayNameW
0090 stub LookupPrivilegeNameA 0090 stub LookupPrivilegeNameA

View File

@ -16,6 +16,7 @@
#include "neexe.h" #include "neexe.h"
#include "stackframe.h" #include "stackframe.h"
#include "user.h" #include "user.h"
#include "process.h"
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
@ -101,6 +102,7 @@ extern const DLL_DESCRIPTOR DDEML_Descriptor;
extern const DLL_DESCRIPTOR LZEXPAND_Descriptor; extern const DLL_DESCRIPTOR LZEXPAND_Descriptor;
extern const DLL_DESCRIPTOR VER_Descriptor; extern const DLL_DESCRIPTOR VER_Descriptor;
extern const DLL_DESCRIPTOR W32SYS_Descriptor; extern const DLL_DESCRIPTOR W32SYS_Descriptor;
extern const DLL_DESCRIPTOR WIN32S16_Descriptor;
extern const DLL_DESCRIPTOR WING_Descriptor; extern const DLL_DESCRIPTOR WING_Descriptor;
extern const DLL_DESCRIPTOR WINASPI_Descriptor; extern const DLL_DESCRIPTOR WINASPI_Descriptor;
@ -110,15 +112,18 @@ extern const DLL_DESCRIPTOR ADVAPI32_Descriptor;
extern const DLL_DESCRIPTOR COMCTL32_Descriptor; extern const DLL_DESCRIPTOR COMCTL32_Descriptor;
extern const DLL_DESCRIPTOR COMDLG32_Descriptor; extern const DLL_DESCRIPTOR COMDLG32_Descriptor;
extern const DLL_DESCRIPTOR CRTDLL_Descriptor; extern const DLL_DESCRIPTOR CRTDLL_Descriptor;
extern const DLL_DESCRIPTOR OLE32_Descriptor;
extern const DLL_DESCRIPTOR GDI32_Descriptor; extern const DLL_DESCRIPTOR GDI32_Descriptor;
extern const DLL_DESCRIPTOR KERNEL32_Descriptor; extern const DLL_DESCRIPTOR KERNEL32_Descriptor;
extern const DLL_DESCRIPTOR LZ32_Descriptor; extern const DLL_DESCRIPTOR LZ32_Descriptor;
extern const DLL_DESCRIPTOR MPR_Descriptor; extern const DLL_DESCRIPTOR MPR_Descriptor;
extern const DLL_DESCRIPTOR NTDLL_Descriptor; extern const DLL_DESCRIPTOR NTDLL_Descriptor;
extern const DLL_DESCRIPTOR OLE32_Descriptor;
extern const DLL_DESCRIPTOR OLECLI32_Descriptor;
extern const DLL_DESCRIPTOR OLESVR32_Descriptor;
extern const DLL_DESCRIPTOR SHELL32_Descriptor; extern const DLL_DESCRIPTOR SHELL32_Descriptor;
extern const DLL_DESCRIPTOR USER32_Descriptor; extern const DLL_DESCRIPTOR USER32_Descriptor;
extern const DLL_DESCRIPTOR VERSION_Descriptor; extern const DLL_DESCRIPTOR VERSION_Descriptor;
extern const DLL_DESCRIPTOR W32SKRNL_Descriptor;
extern const DLL_DESCRIPTOR WINMM_Descriptor; extern const DLL_DESCRIPTOR WINMM_Descriptor;
extern const DLL_DESCRIPTOR WINSPOOL_Descriptor; extern const DLL_DESCRIPTOR WINSPOOL_Descriptor;
extern const DLL_DESCRIPTOR WSOCK32_Descriptor; extern const DLL_DESCRIPTOR WSOCK32_Descriptor;
@ -156,6 +161,7 @@ static BUILTIN_DLL BuiltinDLLs[] =
{ &LZEXPAND_Descriptor, NULL, 0 }, { &LZEXPAND_Descriptor, NULL, 0 },
{ &VER_Descriptor, NULL, 0 }, { &VER_Descriptor, NULL, 0 },
{ &W32SYS_Descriptor, NULL, 0 }, { &W32SYS_Descriptor, NULL, 0 },
{ &WIN32S16_Descriptor, NULL, 0 },
{ &WING_Descriptor, NULL, 0 }, { &WING_Descriptor, NULL, 0 },
{ &WINASPI_Descriptor, NULL, 0 }, { &WINASPI_Descriptor, NULL, 0 },
/* Win32 DLLs */ /* Win32 DLLs */
@ -163,15 +169,18 @@ static BUILTIN_DLL BuiltinDLLs[] =
{ &COMCTL32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED }, { &COMCTL32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED },
{ &COMDLG32_Descriptor, NULL, DLL_FLAG_WIN32 }, { &COMDLG32_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &CRTDLL_Descriptor, NULL, DLL_FLAG_WIN32 }, { &CRTDLL_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &OLE32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED },
{ &GDI32_Descriptor, NULL, DLL_FLAG_WIN32 }, { &GDI32_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &KERNEL32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_ALWAYS_USED }, { &KERNEL32_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &LZ32_Descriptor, NULL, DLL_FLAG_WIN32 }, { &LZ32_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &MPR_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED }, { &MPR_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &NTDLL_Descriptor, NULL, DLL_FLAG_WIN32 }, { &NTDLL_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &OLE32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED },
{ &OLECLI32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED },
{ &OLESVR32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED },
{ &SHELL32_Descriptor, NULL, DLL_FLAG_WIN32 }, { &SHELL32_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &USER32_Descriptor, NULL, DLL_FLAG_WIN32 }, { &USER32_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &VERSION_Descriptor, NULL, DLL_FLAG_WIN32 }, { &VERSION_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &W32SKRNL_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &WINMM_Descriptor, NULL, DLL_FLAG_WIN32 }, { &WINMM_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &WINSPOOL_Descriptor, NULL, DLL_FLAG_WIN32 }, { &WINSPOOL_Descriptor, NULL, DLL_FLAG_WIN32 },
{ &WSOCK32_Descriptor, NULL, DLL_FLAG_WIN32 }, { &WSOCK32_Descriptor, NULL, DLL_FLAG_WIN32 },
@ -182,46 +191,6 @@ static BUILTIN_DLL BuiltinDLLs[] =
/* Ordinal number for interrupt 0 handler in WPROCS.DLL */ /* Ordinal number for interrupt 0 handler in WPROCS.DLL */
#define FIRST_INTERRUPT_ORDINAL 100 #define FIRST_INTERRUPT_ORDINAL 100
/***********************************************************************
* BUILTIN_BuildDebugEntryPoints
*
* Build the table of relay-debugging entry points for a Win32 DLL.
*/
static void BUILTIN_BuildDebugEntryPoints( BUILTIN_DLL *dll )
{
int i;
DEBUG_ENTRY_POINT *entry;
extern void RELAY_CallFrom32();
assert( !dll->dbg_funcs );
assert( dll->flags & DLL_FLAG_WIN32 );
dll->dbg_funcs = HeapAlloc( SystemHeap, 0,
dll->descr->win32.nb_funcs * sizeof(DEBUG_ENTRY_POINT) );
entry = dll->dbg_funcs;
for (i = 0; i < dll->descr->win32.nb_funcs; i++, entry++)
{
BYTE args = dll->descr->win32.args[i];
entry->call = 0xe8; /* call */
switch(args)
{
case 0xfe: /* register func */
entry->callfrom32 = (DWORD)dll->descr->win32.functions[i] -
(DWORD)&entry->ret;
entry->ret = 0x90; /* nop */
entry->args = 0;
break;
case 0xff: /* stub */
entry->args = 0xffff;
break;
default: /* normal function (stdcall or cdecl) */
entry->callfrom32 = (DWORD)RELAY_CallFrom32 - (DWORD)&entry->ret;
entry->ret = (args & 0x80) ? 0xc3 : 0xc2; /* ret / ret $n */
entry->args = (args & 0x7f) * sizeof(int);
break;
}
}
}
/*********************************************************************** /***********************************************************************
* BUILTIN_DoLoadModule16 * BUILTIN_DoLoadModule16
@ -279,20 +248,179 @@ static HMODULE16 BUILTIN_DoLoadModule16( const WIN16_DESCRIPTOR *descr )
* Load a built-in Win32 module. Helper function for BUILTIN_LoadModule * Load a built-in Win32 module. Helper function for BUILTIN_LoadModule
* and BUILTIN_Init. * and BUILTIN_Init.
*/ */
static HMODULE16 BUILTIN_DoLoadModule32( BUILTIN_DLL *table ) static HMODULE32 BUILTIN_DoLoadModule32( BUILTIN_DLL *dll )
{ {
extern void RELAY_CallFrom32();
HMODULE16 hModule; HMODULE16 hModule;
NE_MODULE *pModule; NE_MODULE *pModule;
OFSTRUCT ofs; OFSTRUCT ofs;
IMAGE_DATA_DIRECTORY *dir;
IMAGE_DOS_HEADER *dos;
IMAGE_NT_HEADERS *nt;
IMAGE_SECTION_HEADER *sec;
IMAGE_EXPORT_DIRECTORY *exp;
LPVOID *funcs;
LPSTR *names;
DEBUG_ENTRY_POINT *entry;
PE_MODREF *pem;
INT32 i, size;
BYTE *addr;
sprintf( ofs.szPathName, "%s.DLL", table->descr->name ); /* Allocate the module */
size = (sizeof(IMAGE_DOS_HEADER)
+ sizeof(IMAGE_NT_HEADERS)
+ 2 * sizeof(IMAGE_SECTION_HEADER)
+ sizeof(IMAGE_EXPORT_DIRECTORY)
+ dll->descr->win32.nb_funcs * sizeof(LPVOID)
+ dll->descr->win32.nb_names * sizeof(LPSTR));
if (debugging_relay)
size += dll->descr->win32.nb_funcs * sizeof(DEBUG_ENTRY_POINT);
addr = VirtualAlloc( NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
if (!addr) return 0;
dos = (IMAGE_DOS_HEADER *)addr;
nt = (IMAGE_NT_HEADERS *)(dos + 1);
sec = (IMAGE_SECTION_HEADER *)(nt + 1);
exp = (IMAGE_EXPORT_DIRECTORY *)(sec + 2);
funcs = (LPVOID *)(exp + 1);
names = (LPSTR *)(funcs + dll->descr->win32.nb_funcs);
entry = (DEBUG_ENTRY_POINT *)(names + dll->descr->win32.nb_names);
/* Build the DOS and NT headers */
dos->e_magic = IMAGE_DOS_SIGNATURE;
dos->e_lfanew = sizeof(*dos);
nt->Signature = IMAGE_NT_SIGNATURE;
nt->FileHeader.Machine = IMAGE_FILE_MACHINE_I386;
nt->FileHeader.NumberOfSections = 2; /* exports + code */
nt->FileHeader.SizeOfOptionalHeader = sizeof(nt->OptionalHeader);
nt->FileHeader.Characteristics = IMAGE_FILE_DLL;
nt->OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
nt->OptionalHeader.SizeOfCode = 0x1000;
nt->OptionalHeader.SizeOfInitializedData = 0;
nt->OptionalHeader.SizeOfUninitializedData = 0;
nt->OptionalHeader.ImageBase = (DWORD)addr;
nt->OptionalHeader.SectionAlignment = 0x1000;
nt->OptionalHeader.FileAlignment = 0x1000;
nt->OptionalHeader.MajorOperatingSystemVersion = 1;
nt->OptionalHeader.MinorOperatingSystemVersion = 0;
nt->OptionalHeader.MajorSubsystemVersion = 4;
nt->OptionalHeader.MinorSubsystemVersion = 0;
nt->OptionalHeader.SizeOfImage = size;
nt->OptionalHeader.SizeOfHeaders = (BYTE *)exp - addr;
nt->OptionalHeader.NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
/* Build the export directory */
dir = &nt->OptionalHeader.DataDirectory[IMAGE_FILE_EXPORT_DIRECTORY];
dir->VirtualAddress = (BYTE *)exp - addr;
dir->Size = sizeof(*exp)
+ dll->descr->win32.nb_funcs * sizeof(LPVOID)
+ dll->descr->win32.nb_names * sizeof(LPSTR);
/* Build the exports section */
strcpy( sec->Name, ".edata" );
sec->Misc.VirtualSize = dir->Size;
sec->VirtualAddress = (BYTE *)exp - addr;
sec->SizeOfRawData = dir->Size;
sec->PointerToRawData = (BYTE *)exp - addr;
sec->Characteristics = (IMAGE_SCN_CNT_INITIALIZED_DATA |
IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ |
IMAGE_SCN_MEM_WRITE);
/* Build the code section */
sec++;
strcpy( sec->Name, ".code" );
if (debugging_relay)
sec->SizeOfRawData = dll->descr->win32.nb_funcs * sizeof(DEBUG_ENTRY_POINT);
else
sec->SizeOfRawData = 1;
sec->Misc.VirtualSize = sec->SizeOfRawData;
sec->VirtualAddress = (BYTE *)entry - addr;
sec->PointerToRawData = (BYTE *)entry - addr;
sec->Characteristics = (IMAGE_SCN_CNT_INITIALIZED_DATA |
IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ);
/* Build the exports section data */
exp->Name = (BYTE *)dll->descr->name - addr; /*??*/
exp->Base = dll->descr->win32.base;
exp->NumberOfFunctions = dll->descr->win32.nb_funcs;
exp->NumberOfNames = dll->descr->win32.nb_names;
exp->AddressOfFunctions = (LPDWORD *)((BYTE *)funcs - addr);
exp->AddressOfNames = (LPDWORD *)((BYTE *)names - addr);
exp->AddressOfNameOrdinals = (LPWORD *)((BYTE *)dll->descr->win32.ordinals - addr);
/* Build the funcs table */
if (debugging_relay)
{
dll->dbg_funcs = entry;
for (i = 0; i < dll->descr->win32.nb_funcs; i++, funcs++, entry++)
{
BYTE args = dll->descr->win32.args[i];
entry->call = 0xe8; /* call */
switch(args)
{
case 0xfe: /* register func */
entry->callfrom32 = (DWORD)dll->descr->win32.functions[i] -
(DWORD)&entry->ret;
entry->ret = 0x90; /* nop */
entry->args = 0;
*funcs = (LPVOID)((BYTE *)entry - addr);
break;
case 0xff: /* stub or extern */
if (dll->descr->win32.functions[i])
*funcs = (LPVOID)((BYTE *)dll->descr->win32.functions[i]
- addr);
break;
default: /* normal function (stdcall or cdecl) */
entry->callfrom32 = (DWORD)RELAY_CallFrom32 -
(DWORD)&entry->ret;
entry->ret = (args & 0x80) ? 0xc3 : 0xc2; /*ret/ret $n*/
entry->args = (args & 0x7f) * sizeof(int);
*funcs = (LPVOID)((BYTE *)entry - addr);
break;
}
}
}
else
{
for (i = 0; i < dll->descr->win32.nb_funcs; i++, funcs++)
if (dll->descr->win32.functions[i])
*funcs = (LPVOID)((BYTE *)dll->descr->win32.functions[i]
- addr);
}
/* Build the names table */
for (i = 0; i < exp->NumberOfNames; i++, names++)
if (dll->descr->win32.names[i])
*names = (LPSTR)((BYTE *)dll->descr->win32.names[i] - addr);
/* Create a modref */
pem = (PE_MODREF *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(*pem) );
pem->module = (HMODULE32)addr;
pem->pe_export = exp;
pem->next = pCurrentProcess->modref_list;
pCurrentProcess->modref_list = pem;
/* Create a Win16 dummy module */
sprintf( ofs.szPathName, "%s.DLL", dll->descr->name );
hModule = MODULE_CreateDummyModule( &ofs ); hModule = MODULE_CreateDummyModule( &ofs );
pModule = (NE_MODULE *)GlobalLock16( hModule ); pModule = (NE_MODULE *)GlobalLock16( hModule );
pModule->pe_module = (PE_MODULE *)table;
pModule->flags = NE_FFLAGS_SINGLEDATA | NE_FFLAGS_BUILTIN | pModule->flags = NE_FFLAGS_SINGLEDATA | NE_FFLAGS_BUILTIN |
NE_FFLAGS_LIBMODULE | NE_FFLAGS_WIN32; NE_FFLAGS_LIBMODULE | NE_FFLAGS_WIN32;
if (debugging_relay) BUILTIN_BuildDebugEntryPoints( table ); pModule->module32 = (HMODULE32)addr;
return hModule; return pModule->module32;
} }
@ -358,7 +486,7 @@ BOOL32 BUILTIN_Init(void)
* Load a built-in module. If the 'force' parameter is FALSE, we only * Load a built-in module. If the 'force' parameter is FALSE, we only
* load the module if it has not been disabled via the -dll option. * load the module if it has not been disabled via the -dll option.
*/ */
HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL32 force ) HMODULE32 BUILTIN_LoadModule( LPCSTR name, BOOL32 force )
{ {
BUILTIN_DLL *table; BUILTIN_DLL *table;
char dllname[16], *p; char dllname[16], *p;
@ -484,56 +612,14 @@ FARPROC32 BUILTIN_GetEntryPoint32( char *buffer, void *relay, DWORD *typemask )
/* Now find the function */ /* Now find the function */
ordinal = ((DWORD)relay-(DWORD)dll->dbg_funcs) / sizeof(DEBUG_ENTRY_POINT); ordinal = ((DWORD)relay-(DWORD)dll->dbg_funcs) / sizeof(DEBUG_ENTRY_POINT);
ordinal += descr->base;
for (i = 0; i < descr->nb_names; i++) for (i = 0; i < descr->nb_names; i++)
if (descr->ordinals[i] == ordinal) break; if (descr->ordinals[i] == ordinal) break;
assert( i < descr->nb_names ); assert( i < descr->nb_names );
sprintf( buffer, "%s.%d: %s", descr->name, ordinal, descr->names[i] ); sprintf( buffer, "%s.%d: %s", descr->name, ordinal + descr->base,
*typemask = descr->argtypes[ordinal - descr->base]; descr->names[i] );
return (FARPROC32)descr->functions[ordinal - descr->base]; *typemask = descr->argtypes[ordinal];
} return (FARPROC32)descr->functions[ordinal];
/***********************************************************************
* BUILTIN_GetProcAddress32
*
* Implementation of GetProcAddress() for built-in Win32 modules.
* FIXME: this should be unified with the real GetProcAddress32().
*/
FARPROC32 BUILTIN_GetProcAddress32( NE_MODULE *pModule, LPCSTR function )
{
BUILTIN_DLL *dll = (BUILTIN_DLL *)pModule->pe_module;
const WIN32_DESCRIPTOR *info = &dll->descr->win32;
WORD ordinal = 0;
if (!dll) return NULL;
if (HIWORD(function)) /* Find function by name */
{
int i;
dprintf_module( stddeb, "Looking for function %s in %s\n",
function, dll->descr->name );
for (i = 0; i < info->nb_names; i++)
if (!strcmp( function, info->names[i] ))
{
ordinal = info->ordinals[i];
break;
}
if (i >= info->nb_names) return NULL; /* not found */
}
else /* Find function by ordinal */
{
ordinal = LOWORD(function);
dprintf_module( stddeb, "Looking for ordinal %d in %s\n",
ordinal, dll->descr->name );
if ((ordinal < info->base) || (ordinal >= info->base + info->nb_funcs))
return NULL; /* not found */
}
if (dll->dbg_funcs && (dll->dbg_funcs[ordinal-info->base].args != 0xffff))
return (FARPROC32)&dll->dbg_funcs[ordinal - info->base];
return (FARPROC32)info->functions[ordinal - info->base];
} }

View File

@ -37,7 +37,7 @@ type win32
33 stub __threadhandle 33 stub __threadhandle
34 stub __threadid 34 stub __threadid
35 stub __toascii 35 stub __toascii
36 stub _abnormal_termination 36 cdecl _abnormal_termination() CRTDLL__abnormal_termination
37 stub _access 37 stub _access
38 extern _acmdln_dll CRTDLL_acmdln_dll 38 extern _acmdln_dll CRTDLL_acmdln_dll
39 stub _aexit_rtn_dll 39 stub _aexit_rtn_dll
@ -260,7 +260,7 @@ type win32
256 stub _read 256 stub _read
257 stub _rmdir 257 stub _rmdir
258 stub _rmtmp 258 stub _rmtmp
259 stub _rotl 259 cdecl _rotl (long long) CRTDLL__rotl
260 stub _rotr 260 stub _rotr
261 stub _scalb 261 stub _scalb
262 stub _searchenv 262 stub _searchenv
@ -280,7 +280,7 @@ type win32
276 stub _spawnve 276 stub _spawnve
277 stub _spawnvp 277 stub _spawnvp
278 stub _spawnvpe 278 stub _spawnvpe
279 stub _splitpath 279 cdecl _splitpath (ptr ptr ptr ptr ptr) CRTDLL__splitpath
280 cdecl _stat (ptr ptr) CRTDLL__stat 280 cdecl _stat (ptr ptr) CRTDLL__stat
281 stub _statusfp 281 stub _statusfp
282 cdecl _strcmpi(ptr ptr) CRTDLL__strcmpi 282 cdecl _strcmpi(ptr ptr) CRTDLL__strcmpi

View File

@ -385,7 +385,7 @@ file gdi.exe
613 pascal16 EnumFontFamiliesEx(word ptr segptr long long) THUNK_EnumFontFamiliesEx16 613 pascal16 EnumFontFamiliesEx(word ptr segptr long long) THUNK_EnumFontFamiliesEx16
614 stub AddLpkToGDI 614 stub AddLpkToGDI
615 stub GetCharacterPlacement 615 stub GetCharacterPlacement
616 stub GetFontLanguageInfo 616 pascal GetFontLanguageInfo(word) GetFontLanguageInfo16
650 stub BuildInverseTableDIB 650 stub BuildInverseTableDIB
701 stub GDITHKCONNECTIONDATALS 701 stub GDITHKCONNECTIONDATALS
702 stub FT_GDIFTHKTHKCONNECTIONDATA 702 stub FT_GDIFTHKTHKCONNECTIONDATA

View File

@ -173,7 +173,7 @@ type win32
166 stub GetCurrentObject 166 stub GetCurrentObject
167 stdcall GetCurrentPositionEx(long ptr) GetCurrentPositionEx32 167 stdcall GetCurrentPositionEx(long ptr) GetCurrentPositionEx32
168 stdcall GetDCOrgEx(long ptr) GetDCOrgEx 168 stdcall GetDCOrgEx(long ptr) GetDCOrgEx
169 stub GetDIBColorTable 169 stdcall GetDIBColorTable(long long long ptr) GetDIBColorTable32
170 stdcall GetDIBits(long long long long ptr ptr long) GetDIBits32 170 stdcall GetDIBits(long long long long ptr ptr long) GetDIBits32
171 stdcall GetDeviceCaps(long long) GetDeviceCaps32 171 stdcall GetDeviceCaps(long long) GetDeviceCaps32
172 stub GetDeviceGammaRamp 172 stub GetDeviceGammaRamp
@ -186,7 +186,7 @@ type win32
179 stub GetEnhMetaFilePaletteEntries 179 stub GetEnhMetaFilePaletteEntries
180 stub GetEnhMetaFileW 180 stub GetEnhMetaFileW
181 stub GetFontData 181 stub GetFontData
182 stub GetFontLanguageInfo 182 stdcall GetFontLanguageInfo(long) GetFontLanguageInfo32
183 stub GetFontResourceInfo 183 stub GetFontResourceInfo
184 stub GetFontResourceInfoW 184 stub GetFontResourceInfoW
185 stub GetGlyphOutline 185 stub GetGlyphOutline
@ -315,7 +315,7 @@ type win32
308 stdcall SetBrushOrgEx(long long long ptr) SetBrushOrgEx 308 stdcall SetBrushOrgEx(long long long ptr) SetBrushOrgEx
309 stub SetColorAdjustment 309 stub SetColorAdjustment
310 stub SetColorSpace 310 stub SetColorSpace
311 stub SetDIBColorTable 311 stdcall SetDIBColorTable(long long long ptr) SetDIBColorTable32
312 stdcall SetDIBits(long long long long ptr ptr long) SetDIBits32 312 stdcall SetDIBits(long long long long ptr ptr long) SetDIBits32
313 stdcall SetDIBitsToDevice(long long long long long long long long long 313 stdcall SetDIBitsToDevice(long long long long long long long long long
ptr ptr long) SetDIBitsToDevice32 ptr ptr long) SetDIBitsToDevice32
@ -389,7 +389,7 @@ type win32
378 stub GdiWinWatchGetClipList 378 stub GdiWinWatchGetClipList
379 stub GdiWinWatchOpen 379 stub GdiWinWatchOpen
380 stub GetGlyphOutlineWow 380 stub GetGlyphOutlineWow
381 stub GetTextCharsetInfo 381 stdcall GetTextCharsetInfo(long ptr long) GetTextCharsetInfo
382 stdcall TranslateCharsetInfo(ptr ptr long) TranslateCharSetInfo 382 stdcall TranslateCharsetInfo(ptr ptr long) TranslateCharSetInfo
383 stub UpdateICMRegKeyA 383 stub UpdateICMRegKeyA
384 stub UpdateICMRegKeyW 384 stub UpdateICMRegKeyW

View File

@ -30,7 +30,7 @@ file krnl386.exe
26 pascal16 GlobalFreeAll(word) GlobalFreeAll 26 pascal16 GlobalFreeAll(word) GlobalFreeAll
27 pascal16 GetModuleName(word ptr word) GetModuleName 27 pascal16 GetModuleName(word ptr word) GetModuleName
28 stub GlobalMasterHandle 28 stub GlobalMasterHandle
29 pascal16 Yield() Yield 29 pascal16 Yield() Yield16
30 pascal16 WaitEvent(word) WaitEvent 30 pascal16 WaitEvent(word) WaitEvent
31 pascal16 PostEvent(word) PostEvent 31 pascal16 PostEvent(word) PostEvent
32 pascal16 SetPriority(word s_word) SetPriority 32 pascal16 SetPriority(word s_word) SetPriority
@ -91,7 +91,7 @@ file krnl386.exe
91 register InitTask() InitTask 91 register InitTask() InitTask
92 pascal GetTempDrive(word) WIN16_GetTempDrive 92 pascal GetTempDrive(word) WIN16_GetTempDrive
93 pascal16 GetCodeHandle(segptr) GetCodeHandle 93 pascal16 GetCodeHandle(segptr) GetCodeHandle
94 stub DefineHandleTable 94 pascal16 DefineHandleTable(word) DefineHandleTable16
95 pascal16 LoadLibrary(str) LoadLibrary16 95 pascal16 LoadLibrary(str) LoadLibrary16
96 pascal16 FreeLibrary(word) FreeLibrary16 96 pascal16 FreeLibrary(word) FreeLibrary16
97 pascal16 GetTempFileName(word str word ptr) GetTempFileName16 97 pascal16 GetTempFileName(word str word ptr) GetTempFileName16
@ -103,7 +103,7 @@ file krnl386.exe
103 register NetBIOSCall() NetBIOSCall 103 register NetBIOSCall() NetBIOSCall
104 stub GetCodeInfo 104 stub GetCodeInfo
105 pascal16 GetExeVersion() GetExeVersion 105 pascal16 GetExeVersion() GetExeVersion
106 pascal SetSwapAreaSize(word) SetSwapAreaSize 106 pascal SetSwapAreaSize(word) SetSwapAreaSize16
107 pascal16 SetErrorMode(word) SetErrorMode16 107 pascal16 SetErrorMode(word) SetErrorMode16
108 pascal16 SwitchStackTo(word word word) SwitchStackTo 108 pascal16 SwitchStackTo(word word word) SwitchStackTo
109 register SwitchStackBack(word word word) SwitchStackBack 109 register SwitchStackBack(word word word) SwitchStackBack
@ -232,6 +232,7 @@ file krnl386.exe
233 stub RegUnloadKey 233 stub RegUnloadKey
234 stub RegSaveKey 234 stub RegSaveKey
235 stub InvalidateNlsCache 235 stub InvalidateNlsCache
236 stub GetProductName
237 stub KERNEL_237 237 stub KERNEL_237
262 stub KERNEL_262 262 stub KERNEL_262
263 stub KERNEL_263 263 stub KERNEL_263
@ -280,6 +281,7 @@ file krnl386.exe
359 pascal KERNEL_359(long) _KERNEL_359 359 pascal KERNEL_359(long) _KERNEL_359
360 stub OpenFileEx 360 stub OpenFileEx
#361 PIGLET_361 #361 PIGLET_361
365 stub KERNEL_365
403 pascal16 FarSetOwner(word word) FarSetOwner 403 pascal16 FarSetOwner(word word) FarSetOwner
404 pascal16 FarGetOwner(word) FarGetOwner 404 pascal16 FarGetOwner(word) FarGetOwner
406 stub WritePrivateProfileStruct 406 stub WritePrivateProfileStruct
@ -312,6 +314,7 @@ file krnl386.exe
471 stub KERNEL_471 471 stub KERNEL_471
472 register KERNEL_472() _KERNEL_472 472 register KERNEL_472() _KERNEL_472
473 stub KERNEL_473 473 stub KERNEL_473
475 stub KERNEL_475
482 stub KERNEL_482 482 stub KERNEL_482
485 stub KERNEL_485 485 stub KERNEL_485
491 stub RegisterServiceProcess 491 stub RegisterServiceProcess
@ -327,11 +330,21 @@ file krnl386.exe
518 stub CallProcEx32W 518 stub CallProcEx32W
519 stub KERNEL_519 519 stub KERNEL_519
522 stub KERNEL_522 522 stub KERNEL_522
523 stub KERNEL_523
525 stub KERNEL_525 525 stub KERNEL_525
531 stub KERNEL_531
532 stub KERNEL_532
540 stub KERNEL_540
541 stub KERNEL_541
544 stub KERNEL_544
600 stub KERNEL_600 600 stub KERNEL_600
601 stub KERNEL_601 601 stub KERNEL_601
604 stub KERNEL_604 604 stub KERNEL_604
605 stub KERNEL_605 605 stub KERNEL_605
606 stub KERNEL_606
607 stub KERNEL_607
608 stub KERNEL_608
611 stub KERNEL_611
612 stub KERNEL_612 612 stub KERNEL_612
613 stub KERNEL_613 613 stub KERNEL_613
614 stub KERNEL_614 614 stub KERNEL_614
@ -339,6 +352,6 @@ file krnl386.exe
621 stub KERNEL_621 621 stub KERNEL_621
627 stub IsBadFlatReadWritePtr 627 stub IsBadFlatReadWritePtr
630 stub KERNEL_630 630 stub KERNEL_630
631 pascal FUNC004(word word long) FUNC004 # shell hook 631 pascal FUNC004(word word long) FUNC004 #C16ThkSl01?
651 stub KERNEL_651 651 stub KERNEL_651 #ThunkConnect16?
700 pascal KERNEL_700() stub_KERNEL_700 700 pascal KERNEL_700() stub_KERNEL_700

View File

@ -160,7 +160,7 @@ type win32
169 stub CreateNamedPipeW 169 stub CreateNamedPipeW
170 stub CreatePipe 170 stub CreatePipe
171 stdcall CreateProcessA(str str ptr ptr long long ptr str ptr ptr) CreateProcess32A 171 stdcall CreateProcessA(str str ptr ptr long long ptr str ptr ptr) CreateProcess32A
172 stub CreateProcessW 172 stdcall CreateProcessW(wstr wstr ptr ptr long long ptr wstr ptr ptr) CreateProcess32W
173 stub CreateRemoteThread 173 stub CreateRemoteThread
174 stdcall CreateSemaphoreA(ptr long long str) CreateSemaphore32A 174 stdcall CreateSemaphoreA(ptr long long str) CreateSemaphore32A
175 stdcall CreateSemaphoreW(ptr long long wstr) CreateSemaphore32W 175 stdcall CreateSemaphoreW(ptr long long wstr) CreateSemaphore32W
@ -176,7 +176,7 @@ type win32
185 stdcall DeleteCriticalSection(ptr) DeleteCriticalSection 185 stdcall DeleteCriticalSection(ptr) DeleteCriticalSection
186 stdcall DeleteFileA(str) DeleteFile32A 186 stdcall DeleteFileA(str) DeleteFile32A
187 stdcall DeleteFileW(wstr) DeleteFile32W 187 stdcall DeleteFileW(wstr) DeleteFile32W
188 stub DeviceIoControl 188 stdcall DeviceIoControl(long long ptr long ptr long ptr ptr) DeviceIoControl
189 stdcall DisableThreadLibraryCalls(long) DisableThreadLibraryCalls 189 stdcall DisableThreadLibraryCalls(long) DisableThreadLibraryCalls
190 stub DisconnectNamedPipe 190 stub DisconnectNamedPipe
191 stdcall DosDateTimeToFileTime(long long ptr) DosDateTimeToFileTime 191 stdcall DosDateTimeToFileTime(long long ptr) DosDateTimeToFileTime
@ -250,7 +250,7 @@ type win32
259 stdcall FlushConsoleInputBuffer(long) FlushConsoleInputBuffer 259 stdcall FlushConsoleInputBuffer(long) FlushConsoleInputBuffer
260 stdcall FlushFileBuffers(long) FlushFileBuffers 260 stdcall FlushFileBuffers(long) FlushFileBuffers
261 stub FlushInstructionCache 261 stub FlushInstructionCache
262 stub FlushViewOfFile 262 stdcall FlushViewOfFile(ptr long) FlushViewOfFile
263 stub FoldStringA 263 stub FoldStringA
264 stub FoldStringW 264 stub FoldStringW
265 stdcall FormatMessageA(long ptr long long ptr long ptr) FormatMessage32A 265 stdcall FormatMessageA(long ptr long long ptr long ptr) FormatMessage32A
@ -362,7 +362,7 @@ type win32
371 stub GetPrivateProfileStructW 371 stub GetPrivateProfileStructW
372 stdcall GetProcAddress(long str) GetProcAddress32 372 stdcall GetProcAddress(long str) GetProcAddress32
373 stdcall GetProcessAffinityMask(long ptr ptr) GetProcessAffinityMask 373 stdcall GetProcessAffinityMask(long ptr ptr) GetProcessAffinityMask
374 stub GetProcessFlags 374 stdcall GetProcessFlags(long) GetProcessFlags
375 stdcall GetProcessHeap() GetProcessHeap 375 stdcall GetProcessHeap() GetProcessHeap
376 stub GetProcessHeaps 376 stub GetProcessHeaps
377 stub GetProcessShutdownParameters 377 stub GetProcessShutdownParameters
@ -531,7 +531,7 @@ type win32
540 stdcall OpenFileMappingW(long long wstr) OpenFileMapping32W 540 stdcall OpenFileMappingW(long long wstr) OpenFileMapping32W
541 stdcall OpenMutexA(long long str) OpenMutex32A 541 stdcall OpenMutexA(long long str) OpenMutex32A
542 stdcall OpenMutexW(long long wstr) OpenMutex32W 542 stdcall OpenMutexW(long long wstr) OpenMutex32W
543 stub OpenProcess 543 stdcall OpenProcess(long long long) OpenProcess32
544 stub OpenProfileUserMapping 544 stub OpenProfileUserMapping
545 stdcall OpenSemaphoreA(long long str) OpenSemaphore32A 545 stdcall OpenSemaphoreA(long long str) OpenSemaphore32A
546 stdcall OpenSemaphoreW(long long wstr) OpenSemaphore32W 546 stdcall OpenSemaphoreW(long long wstr) OpenSemaphore32W
@ -553,7 +553,7 @@ type win32
562 stub QueryNumberOfEventLogRecords 562 stub QueryNumberOfEventLogRecords
563 stub QueryOldestEventLogRecord 563 stub QueryOldestEventLogRecord
564 stdcall QueryPerformanceCounter(ptr) QueryPerformanceCounter 564 stdcall QueryPerformanceCounter(ptr) QueryPerformanceCounter
565 stub QueryPerformanceFrequency 565 stdcall QueryPerformanceFrequency(ptr) QueryPerformanceFrequency
566 stub QueueUserAPC 566 stub QueueUserAPC
567 register RaiseException() EXC_RaiseException 567 register RaiseException() EXC_RaiseException
568 stdcall ReadConsoleA(long ptr long ptr ptr) ReadConsole32A 568 stdcall ReadConsoleA(long ptr long ptr ptr) ReadConsole32A
@ -843,3 +843,56 @@ type win32
853 stub VirtualBufferExceptionHandler 853 stub VirtualBufferExceptionHandler
854 stub WriteConsoleInputVDMA 854 stub WriteConsoleInputVDMA
855 stub WriteConsoleInputVDMW 855 stub WriteConsoleInputVDMW
# NT 4.0 additions
856 stub CancelIo
857 stub CancelWaitableTimer
858 stub CopyFileExA
859 stub CopyFileExW
860 stub CreateFiber
861 stub CreateWaitableTimerA
862 stub CreateWaitableTimerW
863 stub DeleteFiber
864 stub DuplicateConsoleHandle
865 stub FindFirstFileExA
866 stub FindFirstFileExW
867 stub GetConsoleInputExeNameA
868 stub GetConsoleInputExeNameW
869 stub GetConsoleKeyboardLayoutNameA
870 stub GetConsoleKeyboardLayoutNameW
871 stub GetDiskFreeSpaceExA
873 stub GetDiskFreeSpaceExW
874 stub GetFileAttributesExA
875 stub GetFileAttributesExW
876 stub GetProcessPriorityBoost
877 stub GetThreadPriorityBoost
878 stub InterlockedCompareExchange
879 stub InterlockedExchangeAdd
880 stub IsProcessorFeaturePresent
881 stub OpenWaitableTimerA
882 stub OpenWaitableTimerW
883 stub ReadConsoleInputExA
884 stub ReadConsoleInputExW
885 stub ReadDirectoryChangesW
886 stub ReadFileScatter
887 stub SetConsoleIcon
888 stub SetConsoleInputExeNameA
889 stub SetConsoleInputExeNameW
890 stub SetProcessAffinityMask
891 stub SetProcessPriorityBoost
892 stub SetThreadIdealProcessor
893 stub SetThreadPriorityBoost
894 stub SetWaitableTimer
895 stub SignalObjectAndWait
896 stub SwitchToFiber
897 stub SwitchToThread
898 stub TryEnterCriticalSection
899 stub VirtualAllocEx
900 stub VirtualFreeEx
901 stub WriteFileGather
1346 stdcall PrivateLoadLibrary(str) PrivateLoadLibrary
1545 stdcall PrivateFreeLibrary(long) PrivateFreeLibrary
#1599 wrong ordinal (249 in Win32s's W32SCOMB.DLL) !
1599 stdcall Get16DLLAddress(long str) Get16DLLAddress

View File

@ -58,7 +58,7 @@ type win32
0077 stub WNetGetNetworkInformationW 0077 stub WNetGetNetworkInformationW
0078 stub WNetGetProviderNameA 0078 stub WNetGetProviderNameA
0079 stub WNetGetProviderNameW 0079 stub WNetGetProviderNameW
0080 stub WNetGetResourceInformationA 0080 stdcall WNetGetResourceInformationA(ptr ptr ptr ptr) WNetGetResourceInformation32A
0081 stub WNetGetResourceInformationW 0081 stub WNetGetResourceInformationW
0082 stub WNetGetResourceParentA 0082 stub WNetGetResourceParentA
0083 stub WNetGetResourceParentW 0083 stub WNetGetResourceParentW
@ -70,7 +70,7 @@ type win32
0089 stub WNetLogoffW 0089 stub WNetLogoffW
0090 stub WNetLogonA 0090 stub WNetLogonA
0091 stub WNetLogonW 0091 stub WNetLogonW
0092 stub WNetOpenEnumA 0092 stdcall WNetOpenEnumA(long long ptr ptr) WNetOpenEnum32A
0093 stub WNetOpenEnumW 0093 stub WNetOpenEnumW
0094 stub WNetRemoveCachedPassword 0094 stub WNetRemoveCachedPassword
0095 stub WNetRestoreConnectionA 0095 stub WNetRestoreConnectionA

View File

@ -951,3 +951,23 @@ type win32
948 stub wcstol 948 stub wcstol
949 cdecl wcstombs(ptr ptr long) CRTDLL_wcstombs 949 cdecl wcstombs(ptr ptr long) CRTDLL_wcstombs
950 stub wcstoul 950 stub wcstoul
# NT 4 additions
951 stub NtAddAtom
952 stub NtDeleteAtom
953 stub NtFindAtom
954 stub NtQueryFullAttributesFile
955 stub NtQueueApcThread
956 stub NtReadFileScatter
957 stub NtSignalAndWaitForSingleObject
958 stub NtWriteFileGather
959 stub NtYieldExecution
960 stub RtlAddAtomToAtomTable
961 stub RtlAllocateHandle
962 stub RtlCreateAtomTable
963 stub RtlDeleteAtomFromAtomTable
964 stub RtlFreeHandle
965 stub RtlInitializeHandleTable
966 stub RtlIsValidHandle
967 stub RtlLookupAtomInAtomTable
968 stub RtlQueryAtomInAtomTable

View File

@ -38,7 +38,7 @@ type win32
35 stub CoQueryReleaseObject 35 stub CoQueryReleaseObject
36 stub CoRegisterClassObject 36 stub CoRegisterClassObject
37 stub CoRegisterMallocSpy 37 stub CoRegisterMallocSpy
38 stub CoRegisterMessageFilter 38 stdcall CoRegisterMessageFilter(ptr ptr) CoRegisterMessageFilter
39 stub CoReleaseMarshalData 39 stub CoReleaseMarshalData
40 stub CoRevokeClassObject 40 stub CoRevokeClassObject
41 stub CoRevokeMallocSpy 41 stub CoRevokeMallocSpy

View File

@ -40,9 +40,9 @@ type win16
38 stub OLECREATEFROMFILE 38 stub OLECREATEFROMFILE
39 stub OLECREATELINKFROMFILE 39 stub OLECREATELINKFROMFILE
40 stub OLERELEASE 40 stub OLERELEASE
41 pascal OleRegisterClientDoc(ptr ptr long ptr) OleRegisterClientDoc 41 pascal OleRegisterClientDoc(ptr ptr long ptr) OleRegisterClientDoc16
42 pascal OleRevokeClientDoc(long) OleRevokeClientDoc 42 pascal OleRevokeClientDoc(long) OleRevokeClientDoc16
43 pascal OleRenameClientDoc(long ptr) OleRenameClientDoc 43 pascal OleRenameClientDoc(long ptr) OleRenameClientDoc16
44 stub OLEREVERTCLIENTDOC 44 stub OLEREVERTCLIENTDOC
45 stub OLESAVEDCLIENTDOC 45 stub OLESAVEDCLIENTDOC
46 stub OLERENAME 46 stub OLERENAME

59
if1632/olecli32.spec Normal file
View File

@ -0,0 +1,59 @@
name olecli32
type win32
1 stub WEP
2 stub OleDelete
3 stub OleSaveToStream
4 stub OleLoadFromStream
6 stub OleClone
7 stub OleCopyFromLink
8 stub OleEqual
9 stdcall OleQueryLinkFromClip(str long long) OleQueryLinkFromClip32
10 stdcall OleQueryCreateFromClip(str long long) OleQueryCreateFromClip32
11 stdcall OleCreateLinkFromClip(str long ptr str long long) OleCreateLinkFromClip32
12 stdcall OleCreateFromClip(str ptr long str ptr long long) OleCreateFromClip32
13 stub OleCopyToClipboard
14 stdcall OleQueryType(ptr ptr) OleQueryType32
15 stdcall OleSetHostNames(ptr str str) OleSetHostNames32
16 stub OleSetTargetDevice
17 stub OleSetBounds
18 stub OleQueryBounds
19 stub OleDraw
20 stub OleQueryOpen
21 stub OleActivate
22 stub OleUpdate
23 stub OleReconnect
24 stub OleGetLinkUpdateOptions
25 stub OleSetLinkUpdateOptions
26 stub OleEnumFormats
27 stub OleClose
28 stub OleGetData
29 stub OleSetData
30 stub OleQueryProtocol
31 stub OleQueryOutOfDate
32 stub OleObjectConvert
33 stub OleCreateFromTemplate
34 stub OleCreate
35 stub OleQueryReleaseStatus
36 stub OleQueryReleaseError
37 stub OleQueryReleaseMethod
38 stub OleCreateFromFile
39 stub OleCreateLinkFromFile
40 stub OleRelease
41 stdcall OleRegisterClientDoc(str str long ptr) OleRegisterClientDoc32
42 stdcall OleRevokeClientDoc(long) OleRevokeClientDoc32
43 stdcall OleRenameClientDoc(long str) OleRenameClientDoc32
44 stub OleRevertClientDoc
45 stub OleSavedClientDoc
46 stub OleRename
47 stub OleEnumObjects
48 stub OleQueryName
49 stub OleSetColorScheme
50 stub OleRequestData
54 stub OleLockServer
55 stub OleUnlockServer
56 stub OleQuerySize
57 stub OleExecute
58 stub OleCreateInvisible
59 stub OleQueryClientVersion
60 stub OleIsDcMeta

View File

@ -2,12 +2,12 @@ name olesvr
type win16 type win16
#1 WEP #1 WEP
2 pascal OleRegisterServer(str ptr ptr word word) OleRegisterServer 2 pascal OleRegisterServer(str ptr ptr word word) OleRegisterServer16
3 pascal OleRevokeServer(long) OleRevokeServer 3 pascal OleRevokeServer(long) OleRevokeServer
4 pascal OleBlockServer(long) OleBlockServer 4 pascal OleBlockServer(long) OleBlockServer16
5 pascal OleUnblockServer(long ptr) OleUnblockServer 5 pascal OleUnblockServer(long ptr) OleUnblockServer16
6 pascal OleRegisterServerDoc(long str ptr ptr) OleRegisterServerDoc 6 pascal OleRegisterServerDoc(long str ptr ptr) OleRegisterServerDoc16
7 pascal OleRevokeServerDoc(long) OleRevokeServerDoc 7 pascal OleRevokeServerDoc(long) OleRevokeServerDoc16
8 stub OLERENAMESERVERDOC 8 stub OLERENAMESERVERDOC
9 stub OLEREVERTSERVERDOC 9 stub OLEREVERTSERVERDOC
10 stub OLESAVEDSERVERDOC 10 stub OLESAVEDSERVERDOC

15
if1632/olesvr32.spec Normal file
View File

@ -0,0 +1,15 @@
name olesvr32
type win32
1 stub WEP
2 stdcall OleRegisterServer(str ptr ptr long long) OleRegisterServer32
3 stub OleRevokeServer
4 stdcall OleBlockServer(long) OleBlockServer32
5 stdcall OleUnblockServer(long ptr) OleUnblockServer32
6 stdcall OleRegisterServerDoc(ptr str ptr ptr) OleRegisterServerDoc32
7 stdcall OleRevokeServerDoc(long) OleRevokeServerDoc32
8 stdcall OleRenameServerDoc(long str) OleRenameServerDoc32
9 stub OleRevertServerDoc
10 stub OleSavedServerDoc
11 stub OleRevokeObject
12 stub OleQueryServerVersion

View File

@ -17,7 +17,7 @@ type win16
22 pascal16 ShellAbout(word ptr ptr word) ShellAbout16 22 pascal16 ShellAbout(word ptr ptr word) ShellAbout16
33 pascal16 AboutDlgProc(word word word long) AboutDlgProc16 33 pascal16 AboutDlgProc(word word word long) AboutDlgProc16
34 pascal16 ExtractIcon(word str s_word) ExtractIcon16 34 pascal16 ExtractIcon(word str s_word) ExtractIcon16
36 pascal16 ExtractAssociatedIcon(word ptr ptr) ExtractAssociatedIcon 36 pascal16 ExtractAssociatedIcon(word ptr ptr) ExtractAssociatedIcon16
37 pascal DoEnvironmentSubst(ptr word) DoEnvironmentSubst 37 pascal DoEnvironmentSubst(ptr word) DoEnvironmentSubst
38 pascal FindEnvironmentString(ptr) FindEnvironmentString 38 pascal FindEnvironmentString(ptr) FindEnvironmentString
39 pascal16 InternalExtractIcon(word ptr s_word word) InternalExtractIcon 39 pascal16 InternalExtractIcon(word ptr s_word word) InternalExtractIcon

View File

@ -7,51 +7,182 @@ type win32
2 stub SHELL32_2 2 stub SHELL32_2
3 stub CheckEscapesA 3 stub CheckEscapesA
4 stub SHELL32_4
5 stub SHELL32_5
6 stub CheckEscapesW 6 stub CheckEscapesW
7 stdcall CommandLineToArgvW(ptr ptr) CommandLineToArgvW 7 stdcall CommandLineToArgvW(ptr ptr) CommandLineToArgvW
8 stub Control_FillCache_RunDLL 8 stub Control_FillCache_RunDLL
12 stdcall Control_RunDLL(long long long long) Control_RunDLL 12 stdcall Control_RunDLL(long long long long) Control_RunDLL
14 stdcall DllGetClassObject(long long ptr) SHELL32_DllGetClassObject 14 stdcall DllGetClassObject(long long ptr) SHELL32_DllGetClassObject
15 stub SHELL32_15
16 stdcall SHELL32_16(ptr) SHELL32_16
17 stub SHELL32_17
18 stdcall SHELL32_18(ptr) SHELL32_18
19 stub SHELL32_19
20 stub SHELL32_20
21 stub SHELL32_21
22 stub DoEnvironmentSubstA 22 stub DoEnvironmentSubstA
23 stub SHELL32_23
24 stub SHELL32_24
25 stdcall SHELL32_25(ptr ptr) SHELL32_25
26 stub SHELL32_26
27 stub SHELL32_27
28 stub SHELL32_28
29 stdcall SHELL32_29(str) SHELL32_29
30 stub SHELL32_30
31 stub SHELL32_31
32 stdcall SHELL32_32(str) SHELL32_32
33 stub SHELL32_33 33 stub SHELL32_33
34 stub SHELL32_34 34 stdcall SHELL32_34(str) SHELL32_34
35 stub SHELL32_35 35 stdcall SHELL32_35(str) SHELL32_35
36 stdcall SHELL32_36(str str) SHELL32_36
37 stdcall SHELL32_37(ptr str str) SHELL32_37
38 stub DoEnvironmentSubstW 38 stub DoEnvironmentSubstW
39 stub SHELL32_39
40 stub SHELL32_40
41 stdcall DragAcceptFiles(long long) DragAcceptFiles 41 stdcall DragAcceptFiles(long long) DragAcceptFiles
42 stub DragFinish 42 stub DragFinish
43 stub SHELL32_43
44 stub DragQueryFile 44 stub DragQueryFile
45 stdcall SHELL32_45(str) SHELL32_45
46 stub SHELL32_46 46 stub SHELL32_46
47 stub SHELL32_47 47 stub SHELL32_47
48 stub SHELL32_48 48 stub SHELL32_48
49 stub SHELL32_49 49 stub SHELL32_49
50 stub DragQueryFileA 50 stub DragQueryFileA
51 stub SHELL32_51
52 stdcall SHELL32_52(str) SHELL32_52
53 stub DragQueryFileAorW 53 stub DragQueryFileAorW
54 stub DragQueryFileW 54 stub DragQueryFileW
55 stub SHELL32_55
56 stub SHELL32_56 56 stub SHELL32_56
57 stub SHELL32_57 57 stub SHELL32_57
58 stub SHELL32_58 58 stub SHELL32_58
62 stub SHELL32_62 59 stub SHELL32_59
60 stub SHELL32_60
61 stub SHELL32_61
62 stdcall SHELL32_62(long long long long) SHELL32_62
63 stub SHELL32_63 63 stub SHELL32_63
64 stub SHELL32_64 64 stub SHELL32_64
65 stub SHELL32_65 65 stub SHELL32_65
66 stub SHELL32_66
67 stub SHELL32_67
68 stub SHELL32_68
69 stub SHELL32_69
70 stub SHELL32_70
71 stdcall SHELL32_71(ptr ptr) SHELL32_71
72 stdcall SHELL32_72(ptr ptr long) SHELL32_72
73 stub SHELL32_73
74 stub SHELL32_74
75 stub SHELL32_75
76 stub DragQueryPoint 76 stub DragQueryPoint
77 stdcall SHELL32_77(long long long) SHELL32_77
78 stub SHELL32_78
79 stdcall SHELL32_79(str ptr) SHELL32_79
80 stub DuplicateIcon 80 stub DuplicateIcon
81 stub SHELL32_81
82 stub ExtractAssociatedIconA 82 stub ExtractAssociatedIconA
83 stub SHELL32_83
84 stub SHELL32_84
85 stub SHELL32_85
86 stub SHELL32_86
87 stub SHELL32_87
88 stub SHELL32_88
89 stub SHELL32_89
90 stub SHELL32_90
91 stub SHELL32_91
92 stub SHELL32_92
93 stub SHELL32_93
94 stub SHELL32_94
95 stub SHELL32_95
96 stub SHELL32_96
97 stub SHELL32_97
98 stub SHELL32_98
99 stub SHELL32_99
100 stdcall SHELL32_100(long) SHELL32_100
101 stub ExtractAssociatedIconExA 101 stub ExtractAssociatedIconExA
102 stdcall SHELL32_102(ptr ptr long ptr ptr) SHELL32_102
103 stub SHELL32_103
104 stub SHELL32_104
105 stub SHELL32_105
106 stub SHELL32_106
107 stub SHELL32_107
108 stub SHELL32_108
109 stub SHELL32_109
110 stub SHELL32_110
111 stub SHELL32_111
112 stub SHELL32_112
113 stub SHELL32_113
114 stub SHELL32_114
115 stub SHELL32_115
116 stub SHELL32_116
117 stub SHELL32_117
118 stub SHELL32_118
119 stdcall SHELL32_119(ptr) SHELL32_119
120 stub SHELL32_120
121 stub SHELL32_121
122 stub SHELL32_122
123 stub SHELL32_123
124 stub ExtractAssociatedIconExW 124 stub ExtractAssociatedIconExW
125 stub ExtractAssociatedIconW 125 stub ExtractAssociatedIconW
133 stdcall ExtractIconA(long ptr long) ExtractIcon32A 126 stub SHELL32_126
127 stub SHELL32_127
128 stdcall DllGetClassObject(long long ptr) SHELL32_DllGetClassObject
129 stub SHELL32_129
130 stub SHELL32_130
131 stub SHELL32_131
132 stub SHELL32_132
133 stdcall ExtractIconA(long str long) ExtractIcon32A
134 stub SHELL32_134
135 stub ExtractIconEx 135 stub ExtractIconEx
136 stub SHELL32_136
137 stub SHELL32_137
138 stub ExtractIconExA 138 stub ExtractIconExA
139 stub SHELL32_139
140 stub SHELL32_140
141 stub SHELL32_141
142 stub SHELL32_142
143 stub SHELL32_143
144 stub SHELL32_144
145 stub SHELL32_145
146 stub SHELL32_146
147 stub SHELL32_147
148 stub ExtractIconResInfoA 148 stub ExtractIconResInfoA
149 stub SHELL32_149
150 stub ExtractIconResInfoW 150 stub ExtractIconResInfoW
151 stub SHELL32_151
152 stdcall SHELL32_152(ptr) SHELL32_152
153 stub SHELL32_153
154 stub SHELL32_154
155 stdcall SHELL32_155(ptr) SHELL32_155
156 stub SHELL32_156 156 stub SHELL32_156
157 stub SHELL32_157 157 stub SHELL32_157
158 stub SHELL32_158 158 stub SHELL32_158
159 stub SHELL32_159 159 stub SHELL32_159
160 stub SHELL32_160 160 stub SHELL32_160
180 stub ExtractIconW 161 stub SHELL32_161
162 stub SHELL32_162
163 stub SHELL32_163
164 stub SHELL32_164
165 stdcall SHELL32_165(long long) SHELL32_165
166 stub SHELL32_166
167 stub SHELL32_167
168 stub SHELL32_168
169 stub SHELL32_169
170 stub SHELL32_170
171 stub SHELL32_171
172 stub SHELL32_172
173 stub SHELL32_173
174 stub SHELL32_174
175 stdcall SHELL32_175(long long long long) SHELL32_175
176 stub SHELL32_176
177 stub SHELL32_177
178 stub SHELL32_178
179 stub SHELL32_179
180 stdcall ExtractIconW(long wstr long) ExtractIcon32W
181 stdcall SHELL32_181(long long) SHELL32_181
182 stub ExtractVersionResource16W 182 stub ExtractVersionResource16W
183 cdecl SHELL32_183(long long long long long long) SHELL32_183
184 stub SHELL32_184 184 stub SHELL32_184
185 stub SHELL32_185 185 stub SHELL32_185
186 stdcall FindExecutableA(ptr ptr ptr) FindExecutable32A 186 stdcall FindExecutableA(ptr ptr ptr) FindExecutable32A
@ -63,11 +194,19 @@ type win32
192 stub PrintersGetCommand_RunDLL 192 stub PrintersGetCommand_RunDLL
193 stub RealShellExecuteA 193 stub RealShellExecuteA
194 stub RealShellExecuteExA 194 stub RealShellExecuteExA
195 stdcall SHELL32_195(ptr) SHELL32_195
196 stdcall SHELL32_196(long) SHELL32_196
197 stub SHELL32_197
198 stub SHELL32_198
199 stub SHELL32_199
200 stub SHELL32_200
201 stub SHELL32_201
202 stub SHELL32_202
203 stub RealShellExecuteExW 203 stub RealShellExecuteExW
204 stub RealShellExecuteW 204 stub RealShellExecuteW
205 stub RegenerateUserEnvironment 205 stub RegenerateUserEnvironment
206 stub SHAddToRecentDocs 206 stub SHAddToRecentDocs
207 stub SHAppBarMessage 207 stdcall SHAppBarMessage(long ptr) SHAppBarMessage32
208 stub SHBrowseForFolder 208 stub SHBrowseForFolder
209 stub SHBrowseForFolderA 209 stub SHBrowseForFolderA
210 stub SHChangeNotify 210 stub SHChangeNotify
@ -76,7 +215,7 @@ type win32
213 stub SHFormatDrive 213 stub SHFormatDrive
214 stub SHFreeNameMappings 214 stub SHFreeNameMappings
215 stub SHGetDataFromIDListA 215 stub SHGetDataFromIDListA
216 stub SHGetDesktopFolder 216 stdcall SHGetDesktopFolder(ptr) SHGetDesktopFolder
217 stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfo32A 217 stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfo32A
218 stdcall SHGetFileInfoA(ptr long ptr long long) SHGetFileInfo32A 218 stdcall SHGetFileInfoA(ptr long ptr long long) SHGetFileInfo32A
219 stub SHGetInstanceExplorer 219 stub SHGetInstanceExplorer
@ -113,6 +252,10 @@ type win32
250 stub Shell_NotifyIconA 250 stub Shell_NotifyIconA
251 stub Shl1632_ThunkData32 251 stub Shl1632_ThunkData32
252 stub Shl3216_ThunkData32 252 stub Shl3216_ThunkData32
505 stub SHELL32_505
507 stub SHELL32_507
510 stub SHELL32_510
511 stub SHELL32_511
1025 stub ExtractIconExW # proper ordinal unknown 1025 stub ExtractIconExW # proper ordinal unknown
1030 stub FindExeDlgProc # proper ordinal unknown 1030 stub FindExeDlgProc # proper ordinal unknown
1043 stub RegisterShellHook # proper ordinal unknown 1043 stub RegisterShellHook # proper ordinal unknown

View File

@ -52,7 +52,7 @@ file user.exe
48 pascal16 IsChild(word word) IsChild16 48 pascal16 IsChild(word word) IsChild16
49 pascal16 IsWindowVisible(word) IsWindowVisible16 49 pascal16 IsWindowVisible(word) IsWindowVisible16
50 pascal16 FindWindow(segstr str) FindWindow16 50 pascal16 FindWindow(segstr str) FindWindow16
#51 BEAR51 51 stub BEAR51 # IsTwoByteCharPrefix
52 pascal16 AnyPopup() AnyPopup16 52 pascal16 AnyPopup() AnyPopup16
53 pascal16 DestroyWindow(word) DestroyWindow16 53 pascal16 DestroyWindow(word) DestroyWindow16
54 pascal16 EnumWindows(segptr long) THUNK_EnumWindows16 54 pascal16 EnumWindows(segptr long) THUNK_EnumWindows16
@ -87,6 +87,7 @@ file user.exe
83 pascal16 FrameRect(word ptr word) FrameRect16 83 pascal16 FrameRect(word ptr word) FrameRect16
84 pascal16 DrawIcon(word s_word s_word word) DrawIcon16 84 pascal16 DrawIcon(word s_word s_word word) DrawIcon16
85 pascal16 DrawText(word str s_word ptr word) DrawText16 85 pascal16 DrawText(word str s_word ptr word) DrawText16
86 stub BEAR86 # IconSize
87 pascal16 DialogBox(word segstr word segptr) DialogBox16 87 pascal16 DialogBox(word segstr word segptr) DialogBox16
88 pascal16 EndDialog(word s_word) EndDialog16 88 pascal16 EndDialog(word s_word) EndDialog16
89 pascal16 CreateDialog(word segstr word segptr) CreateDialog16 89 pascal16 CreateDialog(word segstr word segptr) CreateDialog16
@ -217,7 +218,7 @@ file user.exe
213 pascal16 BuildCommDCB(ptr ptr) BuildCommDCB16 213 pascal16 BuildCommDCB(ptr ptr) BuildCommDCB16
214 pascal EscapeCommFunction(word word) EscapeCommFunction16 214 pascal EscapeCommFunction(word word) EscapeCommFunction16
215 pascal16 FlushComm(word word) FlushComm 215 pascal16 FlushComm(word word) FlushComm
#216 USERSEEUSERDO 216 stub USERSEEUSERDO
217 pascal16 LookupMenuHandle(word s_word) LookupMenuHandle 217 pascal16 LookupMenuHandle(word s_word) LookupMenuHandle
218 pascal16 DialogBoxIndirect(word word word segptr) DialogBoxIndirect16 218 pascal16 DialogBoxIndirect(word word word segptr) DialogBoxIndirect16
219 pascal16 CreateDialogIndirect(word ptr word segptr) CreateDialogIndirect16 219 pascal16 CreateDialogIndirect(word ptr word segptr) CreateDialogIndirect16
@ -431,6 +432,7 @@ file user.exe
492 pascal16 USER_492() stub_USER_492 492 pascal16 USER_492() stub_USER_492
496 pascal16 USER_496() stub_USER_496 496 pascal16 USER_496() stub_USER_496
499 pascal16 WNetErrorText(word ptr word) WNetErrorText 499 pascal16 WNetErrorText(word ptr word) WNetErrorText
500 stub FARCALLNETDRIVER # Undocumented Windows
501 pascal16 WNetOpenJob(ptr ptr word ptr) WNetOpenJob 501 pascal16 WNetOpenJob(ptr ptr word ptr) WNetOpenJob
502 pascal16 WNetCloseJob(word ptr ptr) WNetCloseJob 502 pascal16 WNetCloseJob(word ptr ptr) WNetCloseJob
503 pascal16 WNetAbortJob(ptr word) WNetAbortJob 503 pascal16 WNetAbortJob(ptr word) WNetAbortJob
@ -534,3 +536,4 @@ file user.exe
920 pascal16 USER_920() stub_USER_920 920 pascal16 USER_920() stub_USER_920
922 pascal16 USER_922() stub_USER_922 922 pascal16 USER_922() stub_USER_922
923 pascal16 USER_923() stub_USER_923 923 pascal16 USER_923() stub_USER_923
924 stub UsrMpr_ThunkData16

View File

@ -12,7 +12,7 @@ type win32
9 stdcall BeginDeferWindowPos(long) BeginDeferWindowPos32 9 stdcall BeginDeferWindowPos(long) BeginDeferWindowPos32
10 stdcall BeginPaint(long ptr) BeginPaint32 10 stdcall BeginPaint(long ptr) BeginPaint32
11 stdcall BringWindowToTop(long) BringWindowToTop32 11 stdcall BringWindowToTop(long) BringWindowToTop32
12 stub BroadcastSystemMessage 12 stdcall BroadcastSystemMessage(long ptr long long long) BroadcastSystemMessage
13 stub CalcChildScroll 13 stub CalcChildScroll
14 stub CallMsgFilter 14 stub CallMsgFilter
15 stdcall CallMsgFilterA(ptr long) CallMsgFilter32A 15 stdcall CallMsgFilterA(ptr long) CallMsgFilter32A
@ -285,7 +285,7 @@ type win32
280 stub GetProcessWindowStation 280 stub GetProcessWindowStation
281 stdcall GetPropA(long ptr) GetProp32A 281 stdcall GetPropA(long ptr) GetProp32A
282 stdcall GetPropW(long ptr) GetProp32W 282 stdcall GetPropW(long ptr) GetProp32W
283 stub GetQueueStatus 283 stdcall GetQueueStatus(long) GetQueueStatus32
284 stdcall GetScrollInfo(long long ptr) GetScrollInfo32 284 stdcall GetScrollInfo(long long ptr) GetScrollInfo32
285 stdcall GetScrollPos(long long) GetScrollPos32 285 stdcall GetScrollPos(long long) GetScrollPos32
286 stdcall GetScrollRange(long long ptr ptr) GetScrollRange32 286 stdcall GetScrollRange(long long ptr ptr) GetScrollRange32
@ -381,7 +381,7 @@ type win32
376 stdcall LoadStringW(long long ptr long) LoadString32W 376 stdcall LoadStringW(long long ptr long) LoadString32W
377 stub LockWindowStation 377 stub LockWindowStation
378 stdcall LockWindowUpdate(long) LockWindowUpdate32 378 stdcall LockWindowUpdate(long) LockWindowUpdate32
379 stdcall LookupIconIdFromDirectory(ptr long) LookupIconIdFromDirectory 379 stdcall LookupIconIdFromDirectory(ptr long) LookupIconIdFromDirectory32
380 stdcall LookupIconIdFromDirectoryEx(ptr long long long long) LookupIconIdFromDirectoryEx32 380 stdcall LookupIconIdFromDirectoryEx(ptr long long long long) LookupIconIdFromDirectoryEx32
381 stub MBToWCSEx 381 stub MBToWCSEx
382 stdcall MapDialogRect(long ptr) MapDialogRect32 382 stdcall MapDialogRect(long ptr) MapDialogRect32
@ -435,7 +435,7 @@ type win32
430 stdcall RegisterClassW(ptr) RegisterClass32W 430 stdcall RegisterClassW(ptr) RegisterClass32W
431 stdcall RegisterClipboardFormatA(str) RegisterClipboardFormat32A 431 stdcall RegisterClipboardFormatA(str) RegisterClipboardFormat32A
432 stdcall RegisterClipboardFormatW(wstr) RegisterClipboardFormat32W 432 stdcall RegisterClipboardFormatW(wstr) RegisterClipboardFormat32W
433 stub RegisterHotKey 433 stdcall RegisterHotKey(long long long long) RegisterHotKey
434 stub RegisterLogonProcess 434 stub RegisterLogonProcess
435 stub RegisterSystemThread 435 stub RegisterSystemThread
436 stub RegisterTasklist 436 stub RegisterTasklist
@ -506,7 +506,7 @@ type win32
501 stdcall SetScrollInfo(long long ptr long) SetScrollInfo32 501 stdcall SetScrollInfo(long long ptr long) SetScrollInfo32
502 stdcall SetScrollPos(long long long long) SetScrollPos32 502 stdcall SetScrollPos(long long long long) SetScrollPos32
503 stdcall SetScrollRange(long long long long long) SetScrollRange32 503 stdcall SetScrollRange(long long long long long) SetScrollRange32
504 stub SetShellWindow 504 stdcall SetShellWindow(long) SetShellWindow32
505 stdcall SetSysColors(long ptr ptr) SetSysColors32 505 stdcall SetSysColors(long ptr ptr) SetSysColors32
506 stub SetSysColorsTemp 506 stub SetSysColorsTemp
507 stub SetSystemCursor 507 stub SetSystemCursor
@ -567,7 +567,7 @@ type win32
562 stub UnpackDDElParam 562 stub UnpackDDElParam
563 stdcall UnregisterClassA(str long) UnregisterClass32A 563 stdcall UnregisterClassA(str long) UnregisterClass32A
564 stdcall UnregisterClassW(wstr long) UnregisterClass32W 564 stdcall UnregisterClassW(wstr long) UnregisterClass32W
565 stub UnregisterHotKey 565 stdcall UnregisterHotKey(long long) UnregisterHotKey
566 stub UpdatePerUserSystemParameters 566 stub UpdatePerUserSystemParameters
567 stdcall UpdateWindow(long) UpdateWindow32 567 stdcall UpdateWindow(long) UpdateWindow32
568 stub UserClientDllInitialize 568 stub UserClientDllInitialize
@ -602,6 +602,10 @@ type win32
596 stub RegisterServicesProcess 596 stub RegisterServicesProcess
597 stub SetWindowRgn 597 stub SetWindowRgn
598 stub ToUnicodeEx 598 stub ToUnicodeEx
599 stub DrawCaptionTempA 599 stdcall DrawCaptionTempA(long long ptr long long str long) DrawCaptionTemp32A
600 stub RegisterNetworkCapabilities 600 stub RegisterNetworkCapabilities
601 stub WNDPROC_CALLBACK 601 stub WNDPROC_CALLBACK
602 stub DrawCaptionTempW
603 stub IsHungAppWindow
604 stub ChangeDisplaySettingsA
605 stub ChangeDisplaySettingsW

139
if1632/w32skrnl.spec Normal file
View File

@ -0,0 +1,139 @@
name w32skrnl
type win32
1 stub _kSetEnvironmentVariable@8
2 stub _SzFromImte@4
3 stdcall GetCurrentTask32() GetCurrentTask
4 stub _DebugPrintf
5 stub _NtCloseSection@8
6 stub _AllocKernelHeap@8
7 stub _SelToFlat
8 stub _kGetExeVersion@4
9 stub _ResizeKernelHeap@12
10 stub _DbgBackTo32
11 stub _kGethInstance@0
12 stub SelOffsetToLinear
13 stub DebugPrintf
14 stdcall _kGetWin32sDirectory@0() GetWin32sDirectory
15 stub _sprintf
16 stub _KIsDBCSLeadByte@4
17 stub W32S_BackTo32
18 stub _KGetDbgFlags32
19 stub SelToFlat
20 stub _FreeKernelHeap@4
21 stub WIN32SYSDLL
#22
23 stub _KSilentException@4
24 stub _NtCreateSection@28
#25 stub _W32sError32@12
26 stub _NtOpenSection@12
27 stub _NtDupSection@4
28 stub _GetSelModName@20
29 stub _FGetDscr@8
30 stdcall _RtlNtStatusToDosError@4(long) RtlNtStatusToDosError #FIXME: not sure
31 stub _NtFlushVirtualMemory@16
32 stub _snprintf
33 stub _NtUnmapViewOfSection@8
#34-149
153 stub _PvAllocVirtMem@16
154 stub SetVirtMemProcess
155 stub _FFreeVirtMem@12
156 stub _FSetVirtProtect@16
157 stub _QueryVirtMem@8
158 stub _FLockVirtMem@8
159 stub _FUnlockVirtMem@8
#160-170
171 stub _HHeapCreateHeap@12
#172
173 stub _FHeapDestroy@4
174 stub _PvAllocHeapMem@12
175 stub _PvResizeHeapMem@16
176 stub _FFreeHeapMem@8
#177-196
197 stub _PpdbGetProcess@0
198 stub _ErcGetError@0
199 stub _SetError@4
#200-223
224 stub _CbSearchPath@24
225 stub _CbSearchBinPath@16
#226-230
231 stub _FFindEnvVar@8
#232-251
252 stub _SzFileFromImte@4
253 stub _ImteFromFileSz@4
254 stub _ImteFromSz@4
255 stub _FGetProcAddr@12
256 stub _KLoadLibrary@8
257 stub _KFreeLibrary@4
#258-271
272 stub _lmaUserBase
#273-325
326 stub _KrnOutputDebugString@4
#327-359
360 stub _RtlRaiseException
361 stub _RtlUnwind
362 stub _RtlUnwind4
#363-401
402 stub _DfhCreateFile@12
403 stub _FCloseFile@4
404 stub _CbWriteFile@12
405 stub _LfoSetFilePos@12
406 stub _CbReadFile@12
#407-499
500 stub _SelOffsetToLinear@4
501 stub _ImteFromHModule@4
502 stub _HModuleFromImte@4
503 stub _ExitPEApp
#504 stdcall _GetThunkBuff@0() _GetThunkBuff
505 stub _Dos3Call@0
506 stub _GetPEInstanceData@0
507 stub _GetThreadTask@4
508 stub _BaseAddrFromImte@4
509 stub _GetTaskId@12
510 stub _KGetProcessDebugPort@4
511 stub _W32S_BackTo32
512 stub _KReadProcessMemory32@20
513 stub _KWriteProcessMemory32@20
514 stub _KGetThreadContext32@8
515 stub _KSetThreadContext32@8
516 stub _KQueryPerformanceCounter@8
#517
518 stub _KGetExitCodeThread32@8
519 stub _KGetExitCodeProcess32@8
520 stub _KGetTaskPpdb32@4
521 stub _KGetThreadPtdb32@4
#522-599
600 stub _GetCurProcFIOData@0
601 stub _KUseObject32@4
602 stub _KUnuseObject32@4
603 stub _KErcGetError32@0
604 stub _KCreateProcessHeap@4
605 stub _KGetSystemInfo@8
606 stub _KGlobalMemStat@4
607 stub _GetHandleFromAddr@4
608 stub _TlsNullSlot@4
609 stub _FWorkingSetSize@8

58
if1632/win32s16.spec Normal file
View File

@ -0,0 +1,58 @@
name win32s16
type win16
1 stub WEP
2 stub BOOTTASK
3 stub CREATEPROCESS
4 stub WAITFORDEBUGEVENT
5 pascal CONTINUEDEBUGEVENT(long long long) ContinueDebugEvent
6 pascal READPROCESSMEMORY(long ptr ptr long ptr) ReadProcessMemory
7 stub WRITEPROCESSMEMORY
8 stub GETTHREADCONTEXT
9 stub SETTHREADCONTEXT
10 pascal GETLASTERROR() GetLastError
11 pascal CLOSEHANDLE(long) CloseHandle
12 stub ALLOCCLBKTO32BDLL
13 pascal GETEXITCODETHREAD(long ptr) GetExitCodeThread
14 stub GETEXITCODEPROCESS
15 stub OPENPROCESS
16 stub OPENTHREAD
17 stub GETTHREADSELECTORENTRY
18 pascal VIRTUALQUERYEX(long ptr ptr long) VirtualQueryEx
19 pascal VIRTUALPROTECTEX(long ptr long long ptr) VirtualProtectEx
20 stub KGETTASKPPDB
21 stub KGETTHREADPTDB
22 stub FREECALLBACK
23 stub RELEASECSALIAS
24 stub EXCHANGEPFN32INSTUB
25 stub SELCBCS
26 stub DESTROYPEHEADER
27 stub SELCBDS
28 stub GETCSALIAS
29 stub SELFLATCODE
30 stub HUNITOANSIDBCS
31 stub ALLOCUTPROC32
32 stub FLATDATA
33 stub CODEDATA
34 stub MYGLOBALFREE
35 stub FREE32BDLLCBENTRIES
36 stub SETFS
37 stub PELOADRESOURCEHANDLER
38 stub CHECKDEBUG
39 stub REMOVEH32FROMWIN32S
40 stub RMEMCPY
41 stub INITRESLOADER
42 stub FREESELECTOROFFSET
43 stub STACKLINEARTOSEGMENTED
44 stub GETMODULEFILENAME32S
45 stub FAPILOG16
46 stub ALLOCCALLBACK
47 stub LINEARTOHUGESELECTOROFFSET
48 stub UTSELECTOROFFSETTOLINEAR
49 stub UTLINEARTOSELECTOROFFSET
50 stub SELFOREIGNTIB
51 stub MYGLOBALREALLOC
52 stub CREATEPEHEADER
53 stub FINDGLOBALHANDLE
#54-289 exist, but function names blanked out

View File

@ -74,7 +74,7 @@ type win32
171 stub EnumPrintProcessorsW 171 stub EnumPrintProcessorsW
172 stub EnumPrinterDriversA 172 stub EnumPrinterDriversA
173 stub EnumPrinterDriversW 173 stub EnumPrinterDriversW
174 stub EnumPrintersA 174 stdcall EnumPrintersA(long ptr long ptr long ptr ptr) EnumPrinters32A
175 stub EnumPrintersW 175 stub EnumPrintersW
176 stub ExtDeviceMode 176 stub ExtDeviceMode
177 stub FindClosePrinterChangeNotification 177 stub FindClosePrinterChangeNotification

View File

@ -78,7 +78,7 @@ type win16
158 register INT_Int3aHandler(word) BUILTIN_DefaultIntHandler 158 register INT_Int3aHandler(word) BUILTIN_DefaultIntHandler
159 register INT_Int3bHandler(word) BUILTIN_DefaultIntHandler 159 register INT_Int3bHandler(word) BUILTIN_DefaultIntHandler
160 register INT_Int3cHandler(word) BUILTIN_DefaultIntHandler 160 register INT_Int3cHandler(word) BUILTIN_DefaultIntHandler
161 register INT_Int3dHandler(word) BUILTIN_DefaultIntHandler 161 register INT_Int3dHandler(word) INT_Int3dHandler
162 register INT_Int3eHandler(word) BUILTIN_DefaultIntHandler 162 register INT_Int3eHandler(word) BUILTIN_DefaultIntHandler
163 register INT_Int3fHandler(word) BUILTIN_DefaultIntHandler 163 register INT_Int3fHandler(word) BUILTIN_DefaultIntHandler
164 register INT_Int40Handler(word) BUILTIN_DefaultIntHandler 164 register INT_Int40Handler(word) BUILTIN_DefaultIntHandler

View File

@ -56,92 +56,92 @@ struct SRB_HaInquiry16 {
typedef struct SRB_HaInquiry16 SRB_HaInquiry16; typedef struct SRB_HaInquiry16 SRB_HaInquiry16;
struct SRB_ExecSCSICmd16 { struct SRB_ExecSCSICmd16 {
BYTE SRB_Cmd; // ASPI command code (W) BYTE SRB_Cmd; /* ASPI command code (W) */
BYTE SRB_Status; // ASPI command status byte (R) BYTE SRB_Status; /* ASPI command status byte (R) */
BYTE SRB_HaId; // ASPI host adapter number (W) BYTE SRB_HaId; /* ASPI host adapter number (W) */
BYTE SRB_Flags; // ASPI request flags (W) BYTE SRB_Flags; /* ASPI request flags (W) */
DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0 (-) DWORD SRB_Hdr_Rsvd; /* Reserved, MUST = 0 (-) */
BYTE SRB_Target; // Target's SCSI ID (W) BYTE SRB_Target; /* Target's SCSI ID (W) */
BYTE SRB_Lun; // Target's LUN number (W) BYTE SRB_Lun; /* Target's LUN number (W) */
DWORD SRB_BufLen; // Data Allocation LengthPG (W/R) DWORD SRB_BufLen; /* Data Allocation LengthPG (W/R)*/
BYTE SRB_SenseLen; // Sense Allocation Length (W) BYTE SRB_SenseLen; /* Sense Allocation Length (W) */
SEGPTR SRB_BufPointer; // Data Buffer Pointer (W) SEGPTR SRB_BufPointer; /* Data Buffer Pointer (W) */
DWORD SRB_Rsvd1; // Reserved, MUST = 0 (-/W) DWORD SRB_Rsvd1; /* Reserved, MUST = 0 (-/W)*/
BYTE SRB_CDBLen; // CDB Length = 6 (W) BYTE SRB_CDBLen; /* CDB Length = 6 (W) */
BYTE SRB_HaStat; // Host Adapter Status (R) BYTE SRB_HaStat; /* Host Adapter Status (R) */
BYTE SRB_TargStat; // Target Status (R) BYTE SRB_TargStat; /* Target Status (R) */
FARPROC16 SRB_PostProc; // Post routine (W) FARPROC16 SRB_PostProc; /* Post routine (W) */
BYTE SRB_Rsvd2[34]; // Reserved, MUST = 0 BYTE SRB_Rsvd2[34]; /* Reserved, MUST = 0 */
BYTE CDBByte[0]; // SCSI CBD - variable length (W) BYTE CDBByte[0]; /* SCSI CBD - variable length (W) */
/* variable example for 6 byte cbd /* variable example for 6 byte cbd
* BYTE CDBByte[6]; // SCSI CDB (W) * BYTE CDBByte[6]; * SCSI CDB (W) *
* BYTE SenseArea6[SENSE_LEN]; // Request Sense buffer (R) * BYTE SenseArea6[SENSE_LEN]; * Request Sense buffer (R) *
*/ */
} WINE_PACKED ; } WINE_PACKED ;
typedef struct SRB_ExecSCSICmd16 SRB_ExecSCSICmd16; typedef struct SRB_ExecSCSICmd16 SRB_ExecSCSICmd16;
struct SRB_ExecSCSICmd32 { struct SRB_ExecSCSICmd32 {
BYTE SRB_Cmd; // ASPI command code = SC_EXEC_SCSI_CMD BYTE SRB_Cmd; /* ASPI command code = SC_EXEC_SCSI_CMD */
BYTE SRB_Status; // ASPI command status byte BYTE SRB_Status; /* ASPI command status byte */
BYTE SRB_HaId; // ASPI host adapter number BYTE SRB_HaId; /* ASPI host adapter number */
BYTE SRB_Flags; // ASPI request flags BYTE SRB_Flags; /* ASPI request flags */
DWORD SRB_Hdr_Rsvd; // Reserved DWORD SRB_Hdr_Rsvd; /* Reserved */
BYTE SRB_Target; // Target's SCSI ID BYTE SRB_Target; /* Target's SCSI ID */
BYTE SRB_Lun; // Target's LUN number BYTE SRB_Lun; /* Target's LUN number */
WORD SRB_Rsvd1; // Reserved for Alignment WORD SRB_Rsvd1; /* Reserved for Alignment */
DWORD SRB_BufLen; // Data Allocation Length DWORD SRB_BufLen; /* Data Allocation Length */
BYTE *SRB_BufPointer; // Data Buffer Point BYTE *SRB_BufPointer; /* Data Buffer Point */
BYTE SRB_SenseLen; // Sense Allocation Length BYTE SRB_SenseLen; /* Sense Allocation Length */
BYTE SRB_CDBLen; // CDB Length BYTE SRB_CDBLen; /* CDB Length */
BYTE SRB_HaStat; // Host Adapter Status BYTE SRB_HaStat; /* Host Adapter Status */
BYTE SRB_TargStat; // Target Status BYTE SRB_TargStat; /* Target Status */
void (*SRB_PostProc)(); // Post routine void (*SRB_PostProc)(); /* Post routine */
void *SRB_Rsvd2; // Reserved void *SRB_Rsvd2; /* Reserved */
BYTE SRB_Rsvd3[16]; // Reserved for expansion BYTE SRB_Rsvd3[16]; /* Reserved for expansion */
BYTE CDBByte[16]; // SCSI CDB BYTE CDBByte[16]; /* SCSI CDB */
BYTE SenseArea[0]; // Request sense buffer - var length BYTE SenseArea[0]; /* Request sense buffer - var length */
}; };
typedef struct SRB_ExecSCSICmd32 SRB_ExecSCSICmd32; typedef struct SRB_ExecSCSICmd32 SRB_ExecSCSICmd32;
struct SRB_Abort16 { struct SRB_Abort16 {
BYTE SRB_Cmd; // ASPI command code = SC_ABORT_SRB BYTE SRB_Cmd; /* ASPI command code = SC_ABORT_SRB */
BYTE SRB_Status; // ASPI command status byte BYTE SRB_Status; /* ASPI command status byte */
BYTE SRB_HaId; // ASPI host adapter number BYTE SRB_HaId; /* ASPI host adapter number */
BYTE SRB_Flags; // ASPI request flags BYTE SRB_Flags; /* ASPI request flags */
DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0 DWORD SRB_Hdr_Rsvd; /* Reserved, MUST = 0 */
LPSRB16 SRB_ToAbort; // Pointer to SRB to abort LPSRB16 SRB_ToAbort; /* Pointer to SRB to abort */
} WINE_PACKED; } WINE_PACKED;
typedef struct SRB_Abort16 SRB_Abort16; typedef struct SRB_Abort16 SRB_Abort16;
struct SRB_BusDeviceReset16 { struct SRB_BusDeviceReset16 {
BYTE SRB_Cmd; // ASPI command code = SC_RESET_DEV BYTE SRB_Cmd; /* ASPI command code = SC_RESET_DEV */
BYTE SRB_Status; // ASPI command status byte BYTE SRB_Status; /* ASPI command status byte */
BYTE SRB_HaId; // ASPI host adapter number BYTE SRB_HaId; /* ASPI host adapter number */
BYTE SRB_Flags; // ASPI request flags BYTE SRB_Flags; /* ASPI request flags */
DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0 DWORD SRB_Hdr_Rsvd; /* Reserved, MUST = 0 */
BYTE SRB_Target; // Target's SCSI ID BYTE SRB_Target; /* Target's SCSI ID */
BYTE SRB_Lun; // Target's LUN number BYTE SRB_Lun; /* Target's LUN number */
BYTE SRB_ResetRsvd1[14]; // Reserved, MUST = 0 BYTE SRB_ResetRsvd1[14]; /* Reserved, MUST = 0 */
BYTE SRB_HaStat; // Host Adapter Status BYTE SRB_HaStat; /* Host Adapter Status */
BYTE SRB_TargStat; // Target Status BYTE SRB_TargStat; /* Target Status */
SEGPTR SRB_PostProc; // Post routine SEGPTR SRB_PostProc; /* Post routine */
BYTE SRB_ResetRsvd2[34]; // Reserved, MUST = 0 BYTE SRB_ResetRsvd2[34]; /* Reserved, MUST = 0 */
} WINE_PACKED; } WINE_PACKED;
typedef struct SRB_BusDeviceReset16 SRB_BusDeviceReset16; typedef struct SRB_BusDeviceReset16 SRB_BusDeviceReset16;
struct SRB_GDEVBlock16 { struct SRB_GDEVBlock16 {
BYTE SRB_Cmd; // ASPI command code = SC_GET_DEV_TYPE BYTE SRB_Cmd; /* ASPI command code = SC_GET_DEV_TYPE */
BYTE SRB_Status; // ASPI command status byte BYTE SRB_Status; /* ASPI command status byte */
BYTE SRB_HaId; // ASPI host adapter number BYTE SRB_HaId; /* ASPI host adapter number */
BYTE SRB_Flags; // ASPI request flags BYTE SRB_Flags; /* ASPI request flags */
DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0 DWORD SRB_Hdr_Rsvd; /* Reserved, MUST = 0 */
BYTE SRB_Target; // Target's SCSI ID BYTE SRB_Target; /* Target's SCSI ID */
BYTE SRB_Lun; // Target's LUN number BYTE SRB_Lun; /* Target's LUN number */
BYTE SRB_DeviceType; // Target's peripheral device type BYTE SRB_DeviceType; /* Target's peripheral device type */
} WINE_PACKED; } WINE_PACKED;
typedef struct SRB_GDEVBlock16 SRB_GDEVBlock16; typedef struct SRB_GDEVBlock16 SRB_GDEVBlock16;

View File

@ -19,6 +19,7 @@
#define CBF_EDIT 0x0040 #define CBF_EDIT 0x0040
#define CBF_NORESIZE 0x0080 #define CBF_NORESIZE 0x0080
#define CBF_NOTIFY 0x0100 #define CBF_NOTIFY 0x0100
#define CBF_NOREDRAW 0x0200
#define CBF_EUI 0x8000 #define CBF_EUI 0x8000
/* Combo state struct */ /* Combo state struct */

View File

@ -11,20 +11,6 @@ extern "C" {
#include "wintypes.h" /* needed for CHOOSEFONT structure */ #include "wintypes.h" /* needed for CHOOSEFONT structure */
#define RT_CURSOR MAKEINTRESOURCE(1)
#define RT_BITMAP MAKEINTRESOURCE(2)
#define RT_ICON MAKEINTRESOURCE(3)
#define RT_MENU MAKEINTRESOURCE(4)
#define RT_DIALOG MAKEINTRESOURCE(5)
#define RT_STRING MAKEINTRESOURCE(6)
#define RT_FONTDIR MAKEINTRESOURCE(7)
#define RT_FONT MAKEINTRESOURCE(8)
#define RT_ACCELERATOR MAKEINTRESOURCE(9)
#define RT_RCDATA MAKEINTRESOURCE(10)
#define RT_GROUP_CURSOR MAKEINTRESOURCE(12)
#define RT_GROUP_ICON MAKEINTRESOURCE(14)
#define OFN_READONLY 0x00000001 #define OFN_READONLY 0x00000001
#define OFN_OVERWRITEPROMPT 0x00000002 #define OFN_OVERWRITEPROMPT 0x00000002
#define OFN_HIDEREADONLY 0x00000004 #define OFN_HIDEREADONLY 0x00000004

View File

@ -1,6 +1,8 @@
#if !defined(COMPOBJ_H) #if !defined(COMPOBJ_H)
#define COMPOBJ_H #define COMPOBJ_H
#include "ole.h"
struct tagGUID struct tagGUID
{ {
DWORD Data1; DWORD Data1;
@ -10,9 +12,24 @@ struct tagGUID
}; };
typedef struct tagGUID GUID; typedef struct tagGUID GUID;
typedef struct tagGUID CLSID; typedef struct tagGUID CLSID,*LPCLSID,*REFCLSID;
typedef struct tagGUID IID,*REFIID,*LPIID;
OLESTATUS WINAPI StringFromCLSID(const CLSID *id, LPSTR); OLESTATUS WINAPI StringFromCLSID(const CLSID *id, LPSTR);
OLESTATUS WINAPI CLSIDFromString(const LPCSTR, CLSID *); OLESTATUS WINAPI CLSIDFromString(const LPCSTR, CLSID *);
#ifdef INITGUID
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
const GUID name =\
{ l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
#else
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
extern const GUID name
#endif
#define DEFINE_OLEGUID(name, l, w1, w2) \
DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
#define DEFINE_SHLGUID(name, l, w1, w2) DEFINE_OLEGUID(name,l,w1,w2)
#endif #endif

View File

@ -266,8 +266,8 @@ extern int DEBUG_GetCurrentFrame(struct name_hash ** name,
extern int DEBUG_ReadExecutableDbgInfo(void); extern int DEBUG_ReadExecutableDbgInfo(void);
/* debugger/msc.c */ /* debugger/msc.c */
extern int DEBUG_RegisterDebugInfo(struct pe_data *pe, int, const char *, extern int DEBUG_RegisterDebugInfo( HMODULE32, const char *,
unsigned long, unsigned long); unsigned long, unsigned long);
extern int DEBUG_ProcessDeferredDebug(void); extern int DEBUG_ProcessDeferredDebug(void);
extern int DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name); extern int DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name);
extern void DEBUG_InfoShare(void); extern void DEBUG_InfoShare(void);

45
include/interfaces.h Normal file
View File

@ -0,0 +1,45 @@
#ifndef _WINE_INTERFACES_H
#define _WINE_INTERFACES_H
#include "ole.h"
#include "ole2.h"
#include "compobj.h"
DEFINE_OLEGUID(IID_IUnknown,0,0,0);
DEFINE_OLEGUID(IID_IClassFactory,1,0,0);
DEFINE_OLEGUID(IID_IMalloc,2,0,0);
DEFINE_OLEGUID(IID_IMarshal,3,0,0);
DEFINE_OLEGUID(IID_IStorage,0xb,0,0);
DEFINE_OLEGUID(IID_IStream,0xc,0,0);
DEFINE_OLEGUID(IID_IBindCtx,0xe,0,0);
DEFINE_OLEGUID(IID_IMoniker,0xf,0,0);
DEFINE_OLEGUID(IID_IRunningObject,0x10,0,0);
DEFINE_OLEGUID(IID_IRootStorage,0x12,0,0);
DEFINE_OLEGUID(IID_IMessageFilter,0x16,0,0);
DEFINE_OLEGUID(IID_IStdMarshalInfo,0x18,0,0);
typedef struct tagUNKNOWN *LPUNKNOWN,IUnknown;
typedef struct {
HRESULT (CALLBACK *fnQueryInterface)(LPUNKNOWN this,REFIID refiid,LPVOID *obj);
HRESULT (CALLBACK *fnAddRef)(LPUNKNOWN this);
HRESULT (CALLBACK *fnRelease)(LPUNKNOWN this);
} *LPUNKNOWN_VTABLE;
struct tagUNKNOWN {
LPUNKNOWN_VTABLE lpvtbl;
/* internal stuff. Not needed until we actually implement IUnknown */
};
typedef struct tagCLASSFACTORY *LPCLASSFACTORY,IClassFactory;
typedef struct {
HRESULT (CALLBACK *fnQueryInterface)(LPCLASSFACTORY this,REFIID refiid,LPVOID *obj);
HRESULT (CALLBACK *fnAddRef)(LPCLASSFACTORY this);
HRESULT (CALLBACK *fnRelease)(LPCLASSFACTORY this);
HRESULT (CALLBACK *fnCreateInstance)(LPCLASSFACTORY this,LPUNKNOWN pUnkOuter,REFIID riid,LPVOID * ppvObject);
} *LPCLASSFACTORY_VTABLE;
struct tagCLASSFACTORY {
LPCLASSFACTORY_VTABLE lpvtbl;
/*internal stuff. Not needed until we actually implement IClassFactory*/
};
#endif /*_WINE_INTERFACES_H*/

View File

@ -46,7 +46,7 @@ typedef struct
WORD min_swap_area; /* 3c Min. swap area size */ WORD min_swap_area; /* 3c Min. swap area size */
WORD expected_version; /* 3e Expected Windows version */ WORD expected_version; /* 3e Expected Windows version */
/* From here, these are extra fields not present in normal Windows */ /* From here, these are extra fields not present in normal Windows */
PE_MODULE *pe_module; /* 40 PE module handle for Win32 modules */ HMODULE32 module32; /* 40 PE module handle for Win32 modules */
HMODULE16 self; /* 44 Handle for this module */ HMODULE16 self; /* 44 Handle for this module */
WORD self_loading_sel; /* 46 Selector used for self-loading apps. */ WORD self_loading_sel; /* 46 Selector used for self-loading apps. */
} NE_MODULE; } NE_MODULE;
@ -107,8 +107,8 @@ typedef struct resource_nameinfo_s NE_NAMEINFO;
(((OFSTRUCT *)((char*)(pModule) + (pModule)->fileinfo))->szPathName) (((OFSTRUCT *)((char*)(pModule) + (pModule)->fileinfo))->szPathName)
#define NE_WIN32_MODULE(pModule) \ #define NE_WIN32_MODULE(pModule) \
((struct pe_data *)(((pModule)->flags & NE_FFLAGS_WIN32) ? \ ((((pModule)->flags & NE_FFLAGS_WIN32) ? \
((NE_WIN32_EXTRAINFO *)((pModule) + 1))->pe_module : 0)) ((NE_WIN32_EXTRAINFO *)((pModule) + 1))->module32 : 0))
/* module.c */ /* module.c */
extern NE_MODULE *MODULE_GetPtr( HMODULE32 hModule ); extern NE_MODULE *MODULE_GetPtr( HMODULE32 hModule );
@ -133,11 +133,10 @@ extern FARPROC16 WIN32_GetProcAddress16( HMODULE32 hmodule, LPSTR name );
/* builtin.c */ /* builtin.c */
extern BOOL32 BUILTIN_Init(void); extern BOOL32 BUILTIN_Init(void);
extern HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL32 force ); extern HMODULE32 BUILTIN_LoadModule( LPCSTR name, BOOL32 force );
extern LPCSTR BUILTIN_GetEntryPoint16( WORD cs, WORD ip, WORD *pOrd ); extern LPCSTR BUILTIN_GetEntryPoint16( WORD cs, WORD ip, WORD *pOrd );
extern FARPROC32 BUILTIN_GetEntryPoint32( char *buffer, void *relay, extern FARPROC32 BUILTIN_GetEntryPoint32( char *buffer, void *relay,
DWORD *typemask ); DWORD *typemask );
extern FARPROC32 BUILTIN_GetProcAddress32(NE_MODULE *pModule, LPCSTR function);
extern BOOL32 BUILTIN_ParseDLLOptions( const char *str ); extern BOOL32 BUILTIN_ParseDLLOptions( const char *str );
extern void BUILTIN_PrintDLLs(void); extern void BUILTIN_PrintDLLs(void);

View File

@ -17,14 +17,14 @@ extern "C" {
typedef struct { typedef struct {
BYTE Value[6]; BYTE Value[6];
} SID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY; } SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
typedef struct _SID { typedef struct _SID {
BYTE Revision; BYTE Revision;
BYTE SubAuthorityCount; BYTE SubAuthorityCount;
SID_IDENTIFIER_AUTHORITY IdentifierAuthority; SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
DWORD SubAuthority[1]; /* more than one */ DWORD SubAuthority[1]; /* more than one */
} SID,*LPSID; } SID,*PSID,*LPSID;
#define SID_REVISION (1) /* Current revision */ #define SID_REVISION (1) /* Current revision */
#define SID_MAX_SUB_AUTHORITIES (15) /* current max subauths */ #define SID_MAX_SUB_AUTHORITIES (15) /* current max subauths */
@ -121,7 +121,18 @@ typedef struct {
LPSID Group; LPSID Group;
LPACL Sacl; LPACL Sacl;
LPACL Dacl; LPACL Dacl;
} SECURITY_DESCRIPTOR,*LPSECURITY_DESCRIPTOR; } SECURITY_DESCRIPTOR,*PSECURITY_DESCRIPTOR,*LPSECURITY_DESCRIPTOR;
typedef enum tagSID_NAME_USE {
SidTypeUser = 1,
SidTypeGroup,
SidTypeDomain,
SidTypeAlias,
SidTypeWellKnownGroup,
SidTypeDeletedAccount,
SidTypeInvalid,
SidTypeUnknown
} SID_NAME_USE,*PSID_NAME_USE,*LPSID_NAME_USE;
/* NT lowlevel Strings (handled by Rtl* functions in NTDLL) /* NT lowlevel Strings (handled by Rtl* functions in NTDLL)
* If they are zero terminated, Length does not include the terminating 0. * If they are zero terminated, Length does not include the terminating 0.

View File

@ -7,8 +7,9 @@
#include "windows.h" #include "windows.h"
typedef LPVOID LPUNKNOWN;
typedef LPCSTR OLE_LPCSTR; typedef LPCSTR OLE_LPCSTR;
typedef LPSTR LPOLESTR;
typedef LPCSTR LPCOLESTR;
/* object types */ /* object types */
#define OT_LINK 1 #define OT_LINK 1

View File

@ -7,6 +7,8 @@
typedef LONG HRESULT; typedef LONG HRESULT;
typedef LPVOID LPMESSAGEFILTER;
#define S_OK 0 #define S_OK 0
#define S_FALSE 1 #define S_FALSE 1

View File

@ -6,22 +6,12 @@
#include "winnt.h" #include "winnt.h"
#include "peexe.h" #include "peexe.h"
/* This struct is used for loaded PE .dlls */
struct pe_data {
LPIMAGE_NT_HEADERS pe_header;
LPIMAGE_SECTION_HEADER pe_seg;
HMODULE32 mappeddll;
};
typedef struct pe_data PE_MODULE;
/* modreference used for attached processes /* modreference used for attached processes
* all section are calculated here, relocations etc. * all section are calculated here, relocations etc.
*/ */
struct pe_modref { struct pe_modref {
struct pe_modref *next; struct pe_modref *next;
PE_MODULE *pe_module; HMODULE32 module;
unsigned long int load_addr;
LPIMAGE_IMPORT_DESCRIPTOR pe_import; LPIMAGE_IMPORT_DESCRIPTOR pe_import;
LPIMAGE_EXPORT_DIRECTORY pe_export; LPIMAGE_EXPORT_DIRECTORY pe_export;
LPIMAGE_RESOURCE_DIRECTORY pe_resource; LPIMAGE_RESOURCE_DIRECTORY pe_resource;
@ -35,7 +25,7 @@ struct pe_modref {
typedef struct pe_modref PE_MODREF; typedef struct pe_modref PE_MODREF;
extern int PE_unloadImage(HMODULE32 hModule); extern int PE_unloadImage(HMODULE32 hModule);
extern FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName); extern FARPROC32 PE_FindExportedFunction(HMODULE32 hModule, LPCSTR funcName);
extern void my_wcstombs(char * result, u_short * source, int len); extern void my_wcstombs(char * result, u_short * source, int len);
extern BOOL32 PE_EnumResourceTypes32A(HMODULE32,ENUMRESTYPEPROC32A,LONG); extern BOOL32 PE_EnumResourceTypes32A(HMODULE32,ENUMRESTYPEPROC32A,LONG);
extern BOOL32 PE_EnumResourceTypes32W(HMODULE32,ENUMRESTYPEPROC32W,LONG); extern BOOL32 PE_EnumResourceTypes32W(HMODULE32,ENUMRESTYPEPROC32W,LONG);
@ -51,4 +41,6 @@ extern HGLOBAL32 PE_LoadResource32(HINSTANCE32,HRSRC32);
struct _PDB32; /* forward definition */ struct _PDB32; /* forward definition */
extern void PE_InitializeDLLs(struct _PDB32*,DWORD,LPVOID); extern void PE_InitializeDLLs(struct _PDB32*,DWORD,LPVOID);
extern LPIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(LPIMAGE_RESOURCE_DIRECTORY,LPCWSTR,DWORD);
#endif /* __WINE_PE_IMAGE_H */ #endif /* __WINE_PE_IMAGE_H */

View File

@ -145,6 +145,17 @@ typedef struct _IMAGE_NT_HEADERS {
IMAGE_OPTIONAL_HEADER OptionalHeader; IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS,*LPIMAGE_NT_HEADERS; } IMAGE_NT_HEADERS,*LPIMAGE_NT_HEADERS;
#define PE_HEADER(module) \
((IMAGE_NT_HEADERS*)((LPBYTE)(module) + \
(((IMAGE_DOS_HEADER*)(module))->e_lfanew)))
#define PE_SECTIONS(module) \
((IMAGE_SECTION_HEADER*)((LPBYTE)&PE_HEADER(module)->OptionalHeader + \
PE_HEADER(module)->FileHeader.SizeOfOptionalHeader))
#define RVA_PTR(module,field) ((LPBYTE)(module) + PE_HEADER(module)->field)
/* Section header format */ /* Section header format */
#define IMAGE_SIZEOF_SHORT_NAME 8 #define IMAGE_SIZEOF_SHORT_NAME 8

View File

@ -50,6 +50,17 @@ typedef struct tagSHFILEINFO32W {
DECL_WINELIB_TYPE_AW(SHFILEINFO); DECL_WINELIB_TYPE_AW(SHFILEINFO);
typedef struct _AppBarData {
DWORD cbSize;
HWND32 hWnd;
UINT32 uCallbackMessage;
UINT32 uEdge;
RECT32 rc;
LPARAM lParam;
} APPBARDATA, *PAPPBARDATA;
DECL_WINELIB_TYPE(APPBARDATA);
#define SHGFI_ICON 0x000000100 /* get icon */ #define SHGFI_ICON 0x000000100 /* get icon */
#define SHGFI_DISPLAYNAME 0x000000200 /* get display name */ #define SHGFI_DISPLAYNAME 0x000000200 /* get display name */
#define SHGFI_TYPENAME 0x000000400 /* get type name */ #define SHGFI_TYPENAME 0x000000400 /* get type name */

65
include/shlobj.h Normal file
View File

@ -0,0 +1,65 @@
#ifndef _WINE_SHLOBJ_H
#define _WINE_SHLOBJ_H
#include "ole.h"
#include "ole2.h"
#include "compobj.h"
typedef LPVOID LPBC; /* *IBindCtx really */
typedef LPVOID LPSTRRET,LPENUMIDLIST;
/*
* shell32 classids
*/
DEFINE_SHLGUID(CLSID_ShellDesktop, 0x00021400L, 0, 0);
DEFINE_SHLGUID(CLSID_ShellLink, 0x00021401L, 0, 0);
/*
* shell32 Interface ids
*/
DEFINE_SHLGUID(IID_IContextMenu, 0x000214E4L, 0, 0);
DEFINE_SHLGUID(IID_IShellFolder, 0x000214E6L, 0, 0);
DEFINE_SHLGUID(IID_IShellExtInit, 0x000214E8L, 0, 0);
DEFINE_SHLGUID(IID_IShellPropSheetExt, 0x000214E9L, 0, 0);
DEFINE_SHLGUID(IID_IExtractIcon, 0x000214EBL, 0, 0);
DEFINE_SHLGUID(IID_IShellLink, 0x000214EEL, 0, 0);
DEFINE_SHLGUID(IID_IShellCopyHook, 0x000214EFL, 0, 0);
DEFINE_SHLGUID(IID_IFileViewer, 0x000214F0L, 0, 0);
DEFINE_SHLGUID(IID_IEnumIDList, 0x000214F2L, 0, 0);
DEFINE_SHLGUID(IID_IFileViewerSite, 0x000214F3L, 0, 0);
typedef struct {
WORD cb; /* nr of bytes in this item */
BYTE abID[1];/* first byte in this item */
} SHITEMID,*LPSHITEMID;
typedef struct {
SHITEMID mkid; /* first itemid in list */
} ITEMIDLIST,*LPITEMIDLIST,*LPCITEMIDLIST;
/* The IShellFolder interface ... the basic interface for a lot of stuff */
typedef struct tagSHELLFOLDER *LPSHELLFOLDER,IShellFolder;
typedef struct {
HRESULT (CALLBACK *fnQueryInterface)(LPSHELLFOLDER this,REFIID refiid,LPVOID *obj);
HRESULT (CALLBACK *fnAddRef)(LPSHELLFOLDER this);
HRESULT (CALLBACK *fnRelease)(LPSHELLFOLDER this);
/* IShellFolder methods */
HRESULT (CALLBACK *fnParseDisplayName) (LPSHELLFOLDER this,HWND32 hwndOwner,LPBC pbcReserved,LPOLESTR lpszDisplayName,DWORD * pchEaten,LPITEMIDLIST * ppidl, DWORD *pdwAttributes) ;
HRESULT (CALLBACK *fnEnumObjects)( LPSHELLFOLDER this,HWND32 hwndOwner, DWORD grfFlags, LPENUMIDLIST* ppenumIDList);
HRESULT (CALLBACK *fnBindToObject)(LPSHELLFOLDER this, LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut);
HRESULT (CALLBACK *fnBindToStorage)(LPSHELLFOLDER this, LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvObj);
HRESULT (CALLBACK *fnCompareIDs) (LPSHELLFOLDER this, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
HRESULT (CALLBACK *fnCreateViewObject) (LPSHELLFOLDER this, HWND32 hwndOwner, REFIID riid, LPVOID * ppvOut);
HRESULT (CALLBACK *fnGetAttributesOf) (LPSHELLFOLDER this, UINT32 cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut);
HRESULT (CALLBACK *fnGetUIObjectOf) (LPSHELLFOLDER this, HWND32 hwndOwner, UINT32 cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT32 * prgfInOut, LPVOID * ppvOut);
HRESULT (CALLBACK *fnGetDisplayNameOf) (LPSHELLFOLDER this, LPCITEMIDLIST pidl, DWORD uFlags, LPSTRRET lpName);
HRESULT (CALLBACK *fnSetNameOf) (LPSHELLFOLDER this, HWND32 hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpszName, DWORD uFlags, LPITEMIDLIST * ppidlOut);
} *LPSHELLFOLDER_VTABLE;
struct tagSHELLFOLDER {
LPSHELLFOLDER_VTABLE *lpvtbl;
};
#endif /*_WINE_SHLOBJ_H*/

View File

@ -1,16 +0,0 @@
/*
* Unicode string management
*
* Copyright 1995 Martin von Loewis
*
*/
#ifndef __WINE_STRING32_H
#define __WINE_STRING32_H
#include "wintypes.h"
LPWSTR STRING32_DupAnsiToUni(LPCSTR src);
LPWSTR STRING32_strdupW(LPCWSTR);
#endif /* __WINE_STRING32_H */

View File

@ -1 +1 @@
#define WINE_RELEASE_INFO "Wine release 971116" #define WINE_RELEASE_INFO "Wine release 971130"

View File

@ -97,7 +97,7 @@ typedef struct
#define WIN_NEEDS_NCPAINT 0x0004 /* WM_NCPAINT must be sent to window */ #define WIN_NEEDS_NCPAINT 0x0004 /* WM_NCPAINT must be sent to window */
#define WIN_RESTORE_MAX 0x0008 /* Maximize when restoring */ #define WIN_RESTORE_MAX 0x0008 /* Maximize when restoring */
#define WIN_INTERNAL_PAINT 0x0010 /* Internal WM_PAINT message pending */ #define WIN_INTERNAL_PAINT 0x0010 /* Internal WM_PAINT message pending */
#define WIN_NO_REDRAW 0x0020 /* WM_SETREDRAW called for this window */ /* Used to have WIN_NO_REDRAW 0x0020 here */
#define WIN_NEED_SIZE 0x0040 /* Internal WM_SIZE is needed */ #define WIN_NEED_SIZE 0x0040 /* Internal WM_SIZE is needed */
#define WIN_NCACTIVATED 0x0080 /* last WM_NCACTIVATE was positive */ #define WIN_NCACTIVATED 0x0080 /* last WM_NCACTIVATE was positive */
#define WIN_MANAGED 0x0100 /* Window managed by the X wm */ #define WIN_MANAGED 0x0100 /* Window managed by the X wm */

View File

@ -1973,6 +1973,15 @@ typedef struct
DECL_WINELIB_TYPE(ACCEL); DECL_WINELIB_TYPE(ACCEL);
DECL_WINELIB_TYPE(LPACCEL); DECL_WINELIB_TYPE(LPACCEL);
/* modifiers for RegisterHotKey */
#define MOD_ALT 0x0001
#define MOD_CONTROL 0x0002
#define MOD_SHIFT 0x0004
#define MOD_WIN 0x0008
/* ids for RegisterHotKey */
#define IDHOT_SNAPWINDOW (-1) /* SHIFT-PRINTSCRN */
#define IDHOT_SNAPDESKTOP (-2) /* PRINTSCRN */
/* Flags for DrawIconEx. */ /* Flags for DrawIconEx. */
#define DI_MASK 1 #define DI_MASK 1
@ -5461,7 +5470,6 @@ VOID WINAPI SetPriority(HTASK16,INT16);
FARPROC16 WINAPI SetResourceHandler(HINSTANCE16,SEGPTR,FARPROC16); FARPROC16 WINAPI SetResourceHandler(HINSTANCE16,SEGPTR,FARPROC16);
WORD WINAPI SetSelectorBase(WORD,DWORD); WORD WINAPI SetSelectorBase(WORD,DWORD);
WORD WINAPI SetSelectorLimit(WORD,DWORD); WORD WINAPI SetSelectorLimit(WORD,DWORD);
LONG WINAPI SetSwapAreaSize(WORD);
HQUEUE16 WINAPI SetTaskQueue(HTASK16,HQUEUE16); HQUEUE16 WINAPI SetTaskQueue(HTASK16,HQUEUE16);
FARPROC16 WINAPI SetTaskSignalProc(HTASK16,FARPROC16); FARPROC16 WINAPI SetTaskSignalProc(HTASK16,FARPROC16);
DWORD WINAPI SetViewportExt(HDC16,INT16,INT16); DWORD WINAPI SetViewportExt(HDC16,INT16,INT16);
@ -5478,7 +5486,6 @@ BOOL16 WINAPI WaitEvent(HTASK16);
INT16 WINAPI WriteComm(INT16,LPSTR,INT16); INT16 WINAPI WriteComm(INT16,LPSTR,INT16);
VOID WINAPI WriteOutProfiles(VOID); VOID WINAPI WriteOutProfiles(VOID);
VOID WINAPI hmemcpy(LPVOID,LPCVOID,LONG); VOID WINAPI hmemcpy(LPVOID,LPCVOID,LONG);
VOID WINAPI Yield(void);
/* Declarations for functions that exist only in Win32 */ /* Declarations for functions that exist only in Win32 */
@ -6160,6 +6167,9 @@ LRESULT WINAPI DefWindowProc16(HWND16,UINT16,WPARAM16,LPARAM);
LRESULT WINAPI DefWindowProc32A(HWND32,UINT32,WPARAM32,LPARAM); LRESULT WINAPI DefWindowProc32A(HWND32,UINT32,WPARAM32,LPARAM);
LRESULT WINAPI DefWindowProc32W(HWND32,UINT32,WPARAM32,LPARAM); LRESULT WINAPI DefWindowProc32W(HWND32,UINT32,WPARAM32,LPARAM);
#define DefWindowProc WINELIB_NAME_AW(DefWindowProc) #define DefWindowProc WINELIB_NAME_AW(DefWindowProc)
BOOL16 WINAPI DefineHandleTable16(WORD);
#define DefineHandleTable32(w) ((w),TRUE)
#define DefineHandleTable WINELIB_NAME(DefineHandleTable)
ATOM WINAPI DeleteAtom16(ATOM); ATOM WINAPI DeleteAtom16(ATOM);
ATOM WINAPI DeleteAtom32(ATOM); ATOM WINAPI DeleteAtom32(ATOM);
#define DeleteAtom WINELIB_NAME(DeleteAtom) #define DeleteAtom WINELIB_NAME(DeleteAtom)
@ -6357,6 +6367,10 @@ HICON16 WINAPI ExtractIcon16(HINSTANCE16,LPCSTR,UINT16);
HICON32 WINAPI ExtractIcon32A(HINSTANCE32,LPCSTR,UINT32); HICON32 WINAPI ExtractIcon32A(HINSTANCE32,LPCSTR,UINT32);
HICON32 WINAPI ExtractIcon32W(HINSTANCE32,LPCWSTR,UINT32); HICON32 WINAPI ExtractIcon32W(HINSTANCE32,LPCWSTR,UINT32);
#define ExtractIcon WINELIB_NAME_AW(ExtractIcon) #define ExtractIcon WINELIB_NAME_AW(ExtractIcon)
HICON16 WINAPI ExtractAssociatedIcon16(HINSTANCE16,LPSTR,LPWORD);
HICON32 WINAPI ExtractAssociatedIcon32A(HINSTANCE32,LPSTR,LPWORD);
HICON32 WINAPI ExtractAssociatedIcon32W(HINSTANCE32,LPWSTR,LPWORD);
#define ExtractAssociatedIcon WINELIB_NAME_AW(ExtractAssociatedIcon)
BOOL16 WINAPI ExtTextOut16(HDC16,INT16,INT16,UINT16,const RECT16*, BOOL16 WINAPI ExtTextOut16(HDC16,INT16,INT16,UINT16,const RECT16*,
LPCSTR,UINT16,const INT16*); LPCSTR,UINT16,const INT16*);
BOOL32 WINAPI ExtTextOut32A(HDC32,INT32,INT32,UINT32,const RECT32*, BOOL32 WINAPI ExtTextOut32A(HDC32,INT32,INT32,UINT32,const RECT32*,
@ -7173,6 +7187,12 @@ HGLOBAL16 WINAPI LockSegment16(HGLOBAL16);
BOOL16 WINAPI LockWindowUpdate16(HWND16); BOOL16 WINAPI LockWindowUpdate16(HWND16);
BOOL32 WINAPI LockWindowUpdate32(HWND32); BOOL32 WINAPI LockWindowUpdate32(HWND32);
#define LockWindowUpdate WINELIB_NAME(LockWindowUpdate) #define LockWindowUpdate WINELIB_NAME(LockWindowUpdate)
INT16 WINAPI LookupIconIdFromDirectory16(LPBYTE,BOOL16);
INT32 WINAPI LookupIconIdFromDirectory32(LPBYTE,BOOL32);
#define LookupIconIdFromDirectory WINELIB_NAME(LookupIconIdFromDirectory)
INT16 WINAPI LookupIconIdFromDirectoryEx16(LPBYTE,BOOL16,INT16,INT16,UINT16);
INT32 WINAPI LookupIconIdFromDirectoryEx32(LPBYTE,BOOL32,INT32,INT32,UINT32);
#define LookupIconIdFromDirectoryEx WINELIB_NAME(LookupIconIdFromDirectoryEx)
BOOL16 WINAPI LPtoDP16(HDC16,LPPOINT16,INT16); BOOL16 WINAPI LPtoDP16(HDC16,LPPOINT16,INT16);
BOOL32 WINAPI LPtoDP32(HDC32,LPPOINT32,INT32); BOOL32 WINAPI LPtoDP32(HDC32,LPPOINT32,INT32);
#define LPtoDP WINELIB_NAME(LPtoDP) #define LPtoDP WINELIB_NAME(LPtoDP)
@ -7620,6 +7640,9 @@ DWORD WINAPI SetSoundNoise32(DWORD,DWORD);
INT16 WINAPI SetStretchBltMode16(HDC16,INT16); INT16 WINAPI SetStretchBltMode16(HDC16,INT16);
INT32 WINAPI SetStretchBltMode32(HDC32,INT32); INT32 WINAPI SetStretchBltMode32(HDC32,INT32);
#define SetStretchBltMode WINELIB_NAME(SetStretchBltMode) #define SetStretchBltMode WINELIB_NAME(SetStretchBltMode)
LONG WINAPI SetSwapAreaSize16(WORD);
#define SetSwapAreaSize32(w) (w)
#define SetSwapAreaSize WINELIB_NAME(SetSwapAreaSize)
VOID WINAPI SetSysColors16(INT16,const INT16*,const COLORREF*); VOID WINAPI SetSysColors16(INT16,const INT16*,const COLORREF*);
BOOL32 WINAPI SetSysColors32(INT32,const INT32*,const COLORREF*); BOOL32 WINAPI SetSysColors32(INT32,const INT32*,const COLORREF*);
#define SetSysColors WINELIB_NAME(SetSysColors) #define SetSysColors WINELIB_NAME(SetSysColors)
@ -7861,6 +7884,9 @@ BOOL16 WINAPI WriteProfileString16(LPCSTR,LPCSTR,LPCSTR);
BOOL32 WINAPI WriteProfileString32A(LPCSTR,LPCSTR,LPCSTR); BOOL32 WINAPI WriteProfileString32A(LPCSTR,LPCSTR,LPCSTR);
BOOL32 WINAPI WriteProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR); BOOL32 WINAPI WriteProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR);
#define WriteProfileString WINELIB_NAME_AW(WriteProfileString) #define WriteProfileString WINELIB_NAME_AW(WriteProfileString)
VOID WINAPI Yield16(void);
#define Yield32()
#define Yield WINELIB_NAME(Yield)
SEGPTR WINAPI lstrcat16(SEGPTR,LPCSTR); SEGPTR WINAPI lstrcat16(SEGPTR,LPCSTR);
LPSTR WINAPI lstrcat32A(LPSTR,LPCSTR); LPSTR WINAPI lstrcat32A(LPSTR,LPCSTR);
LPWSTR WINAPI lstrcat32W(LPWSTR,LPCWSTR); LPWSTR WINAPI lstrcat32W(LPWSTR,LPCWSTR);

View File

@ -38,5 +38,6 @@ extern int WIN32_LastError;
#define ERROR_IO_DEVICE 1117 #define ERROR_IO_DEVICE 1117
#define ERROR_POSSIBLE_DEADLOCK 1131 #define ERROR_POSSIBLE_DEADLOCK 1131
#define ERROR_BAD_DEVICE 1200 #define ERROR_BAD_DEVICE 1200
#define ERROR_NO_NETWORK 1222
#endif /* __WINE_WINERROR_H */ #endif /* __WINE_WINERROR_H */

View File

@ -145,7 +145,7 @@ typedef void* SEGPTR;
/* Handle types that exist both in Win16 and Win32. */ /* Handle types that exist both in Win16 and Win32. */
#define DECLARE_HANDLE(a) typedef HANDLE16 a##16; typedef HANDLE32 a##32; #define DECLARE_HANDLE(a) typedef HANDLE16 a##16; typedef HANDLE32 a##32
DECLARE_HANDLE(HACCEL); DECLARE_HANDLE(HACCEL);
DECLARE_HANDLE(HBITMAP); DECLARE_HANDLE(HBITMAP);
DECLARE_HANDLE(HBRUSH); DECLARE_HANDLE(HBRUSH);

View File

@ -4,9 +4,8 @@
#include "windows.h" #include "windows.h"
#include "xmalloc.h" #include "xmalloc.h"
/* Stubs needed for linking with Winelib */ /* Stub needed for linking with Winelib */
/* FIXME: this should not be necessary */ /* FIXME: this should not be necessary */
FARPROC32 BUILTIN_GetProcAddress32( void *mod, LPCSTR func ) { return 0; }
HMODULE32 BUILTIN_LoadModule( LPCSTR name, BOOL32 force ) { return 0; } HMODULE32 BUILTIN_LoadModule( LPCSTR name, BOOL32 force ) { return 0; }

View File

@ -53,18 +53,16 @@ HMODULE16
MODULE_HANDLEtoHMODULE16(HANDLE32 handle) { MODULE_HANDLEtoHMODULE16(HANDLE32 handle) {
NE_MODULE *pModule; NE_MODULE *pModule;
if (HIWORD(handle)) { if (HIWORD(handle))
/* this is a HMODULE32 aka pe->mappeddll */ {
/* this is a HMODULE32 */
/* walk the list looking for the correct startaddress */ /* walk the list looking for the correct startaddress */
pModule = (NE_MODULE *)GlobalLock16( hFirstModule ); pModule = (NE_MODULE *)GlobalLock16( hFirstModule );
while (pModule) { while (pModule)
if ( ((pModule->flags&(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32))==NE_FFLAGS_WIN32) && {
pModule->pe_module && if (pModule->module32 == handle) return pModule->self;
((HMODULE32)pModule->pe_module->mappeddll == handle) pModule = (NE_MODULE*)GlobalLock16(pModule->next);
)
return pModule->self;
pModule=(NE_MODULE*)GlobalLock16(pModule->next);
} }
return 0; return 0;
} }
@ -89,10 +87,7 @@ MODULE_HANDLEtoHMODULE32(HANDLE32 handle) {
if (!pModule) if (!pModule)
return 0; return 0;
if ( ((pModule->flags&(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32))==NE_FFLAGS_WIN32) && if (pModule->module32) return pModule->module32;
pModule->pe_module
)
return (HMODULE32)pModule->pe_module->mappeddll;
return handle; return handle;
} }
} }
@ -127,7 +122,7 @@ void MODULE_DumpModule( HMODULE32 hModule )
pModule->os_flags, pModule->min_swap_area, pModule->os_flags, pModule->min_swap_area,
pModule->expected_version ); pModule->expected_version );
if (pModule->flags & NE_FFLAGS_WIN32) if (pModule->flags & NE_FFLAGS_WIN32)
printf( "PE module=%08x\n", (unsigned int)pModule->pe_module ); printf( "PE module=%08x\n", pModule->module32 );
/* Dump the file info */ /* Dump the file info */
@ -557,7 +552,7 @@ static HMODULE32 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
pModule = (NE_MODULE *)GlobalLock16( hModule ); pModule = (NE_MODULE *)GlobalLock16( hModule );
memcpy( pModule, &ne_header, sizeof(ne_header) ); memcpy( pModule, &ne_header, sizeof(ne_header) );
pModule->count = 0; pModule->count = 0;
pModule->pe_module = NULL; pModule->module32 = 0;
pModule->self = hModule; pModule->self = hModule;
pModule->self_loading_sel = 0; pModule->self_loading_sel = 0;
pData = (BYTE *)(pModule + 1); pData = (BYTE *)(pModule + 1);
@ -1139,7 +1134,7 @@ BOOL16 MODULE_FreeModule( HMODULE32 hModule, TDB* pTaskContext )
*/ */
HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags) HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
{ {
HMODULE16 hModule; HMODULE32 hModule;
HINSTANCE16 hInstance, hPrevInstance; HINSTANCE16 hInstance, hPrevInstance;
NE_MODULE *pModule; NE_MODULE *pModule;
LOADPARAMS *params = (LOADPARAMS *)paramBlock; LOADPARAMS *params = (LOADPARAMS *)paramBlock;
@ -1161,7 +1156,8 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
if (!hModule) /* We have to load the module */ if (!hModule) /* We have to load the module */
{ {
/* Try to load the built-in first if not disabled */ /* Try to load the built-in first if not disabled */
if ((hModule = BUILTIN_LoadModule( name, FALSE ))) return hModule; if ((hModule = BUILTIN_LoadModule( name, FALSE )))
return MODULE_HANDLEtoHMODULE16( hModule );
if ((hFile = OpenFile32( name, &ofs, OF_READ )) == HFILE_ERROR32) if ((hFile = OpenFile32( name, &ofs, OF_READ )) == HFILE_ERROR32)
{ {
@ -1169,7 +1165,7 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
if ((hModule = BUILTIN_LoadModule( name, TRUE ))) if ((hModule = BUILTIN_LoadModule( name, TRUE )))
{ {
fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name ); fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name );
return hModule; return MODULE_HANDLEtoHMODULE16( hModule );
} }
return 2; /* File not found */ return 2; /* File not found */
} }
@ -1254,7 +1250,7 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
(LPSTR)PTR_SEG_TO_LIN( params->cmdLine ), (LPSTR)PTR_SEG_TO_LIN( params->cmdLine ),
showcmd ); showcmd );
if( hTask && TASK_GetNextTask(hTask)) Yield(); if( hTask && TASK_GetNextTask(hTask)) Yield16();
} }
return hInstance; return hInstance;
@ -1507,6 +1503,17 @@ HINSTANCE16 WINAPI LoadLibrary16( LPCSTR libname )
} }
/***********************************************************************
* PrivateLoadLibrary (KERNEL32)
*
* FIXME: rough guesswork, don't know what "Private" means
*/
HMODULE32 WINAPI PrivateLoadLibrary(LPCSTR libname)
{
return LoadLibrary16(libname);
}
/*********************************************************************** /***********************************************************************
* FreeLibrary16 (KERNEL.96) * FreeLibrary16 (KERNEL.96)
*/ */
@ -1517,6 +1524,17 @@ void WINAPI FreeLibrary16( HINSTANCE16 handle )
} }
/***********************************************************************
* PrivateFreeLibrary (KERNEL32)
*
* FIXME: rough guesswork, don't know what "Private" means
*/
void WINAPI PrivateFreeLibrary(HMODULE32 handle)
{
FreeLibrary16(handle);
}
/*********************************************************************** /***********************************************************************
* WinExec16 (KERNEL.166) * WinExec16 (KERNEL.166)
*/ */
@ -1773,15 +1791,14 @@ FARPROC32 WINAPI GetProcAddress32( HMODULE32 hModule, LPCSTR function )
dprintf_win32(stddeb,"GetProcAddress32(%08lx,%p)\n",(DWORD)hModule,function); dprintf_win32(stddeb,"GetProcAddress32(%08lx,%p)\n",(DWORD)hModule,function);
if (!(pModule = MODULE_GetPtr( hModule ))) if (!(pModule = MODULE_GetPtr( hModule )))
return (FARPROC32)0; return (FARPROC32)0;
if (pModule->flags & NE_FFLAGS_BUILTIN) if (!pModule->module32)
return BUILTIN_GetProcAddress32( pModule, function ); {
if (!pModule->pe_module) { fprintf(stderr,"Oops, Module 0x%08lx has got no module32?\n",
fprintf(stderr,"Oops, Module 0x%08lx has got no pe_module?\n",
(DWORD)MODULE_HANDLEtoHMODULE32(hModule) (DWORD)MODULE_HANDLEtoHMODULE32(hModule)
); );
return (FARPROC32)0; return (FARPROC32)0;
} }
return PE_FindExportedFunction( pModule->pe_module, function ); return PE_FindExportedFunction( pModule->module32, function );
} }
/*********************************************************************** /***********************************************************************
@ -1798,11 +1815,9 @@ LPIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE32 hModule)
if (!(pModule = MODULE_GetPtr( hModule ))) if (!(pModule = MODULE_GetPtr( hModule )))
return (LPIMAGE_NT_HEADERS)0; return (LPIMAGE_NT_HEADERS)0;
if (!(pModule->flags & NE_FFLAGS_WIN32) || !pModule->pe_module) if (!(pModule->flags & NE_FFLAGS_WIN32) || !pModule->module32)
return (LPIMAGE_NT_HEADERS)0; return (LPIMAGE_NT_HEADERS)0;
if (pModule->flags & NE_FFLAGS_BUILTIN) return PE_HEADER(pModule->module32);
return (LPIMAGE_NT_HEADERS)0;
return pModule->pe_module->pe_header;
} }

View File

@ -40,13 +40,20 @@ static void PE_InitDLL(PE_MODREF* modref, DWORD type, LPVOID lpReserved);
/* convert PE image VirtualAddress to Real Address */ /* convert PE image VirtualAddress to Real Address */
#define RVA(x) ((unsigned int)load_addr+(unsigned int)(x)) #define RVA(x) ((unsigned int)load_addr+(unsigned int)(x))
void dump_exports(IMAGE_EXPORT_DIRECTORY * pe_exports, unsigned int load_addr) void dump_exports( HMODULE32 hModule )
{ {
char *Module; char *Module;
int i, j; int i, j;
u_short *ordinal; u_short *ordinal;
u_long *function,*functions; u_long *function,*functions;
u_char **name; u_char **name;
unsigned int load_addr = hModule;
DWORD rva_start = PE_HEADER(hModule)->OptionalHeader
.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
DWORD rva_end = rva_start + PE_HEADER(hModule)->OptionalHeader
.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
IMAGE_EXPORT_DIRECTORY *pe_exports = (IMAGE_EXPORT_DIRECTORY*)RVA(rva_start);
Module = (char*)RVA(pe_exports->Name); Module = (char*)RVA(pe_exports->Name);
dprintf_win32(stddeb,"\n*******EXPORT DATA*******\nModule name is %s, %ld functions, %ld names\n", dprintf_win32(stddeb,"\n*******EXPORT DATA*******\nModule name is %s, %ld functions, %ld names\n",
@ -58,15 +65,18 @@ void dump_exports(IMAGE_EXPORT_DIRECTORY * pe_exports, unsigned int load_addr)
functions=function=(u_long*) RVA(pe_exports->AddressOfFunctions); functions=function=(u_long*) RVA(pe_exports->AddressOfFunctions);
name=(u_char**) RVA(pe_exports->AddressOfNames); name=(u_char**) RVA(pe_exports->AddressOfNames);
dprintf_win32(stddeb," Ord Virt Addr Name\n" ); dprintf_win32(stddeb," Ord RVA Addr Name\n" );
for (i=0;i<pe_exports->NumberOfFunctions;i++, function++) for (i=0;i<pe_exports->NumberOfFunctions;i++, function++)
{ {
if (!*function) continue; /* No such function */ if (!*function) continue; /* No such function */
dprintf_win32( stddeb,"%4ld %08lx", i + pe_exports->Base, *function ); dprintf_win32( stddeb,"%4ld %08lx %08x",
i + pe_exports->Base, *function, RVA(*function) );
/* Check if we have a name for it */ /* Check if we have a name for it */
for (j = 0; j < pe_exports->NumberOfNames; j++) for (j = 0; j < pe_exports->NumberOfNames; j++)
if (ordinal[j] == i) if (ordinal[j] == i)
dprintf_win32( stddeb, " %s", (char*)RVA(name[j]) ); dprintf_win32( stddeb, " %s", (char*)RVA(name[j]) );
if ((*function >= rva_start) && (*function <= rva_end))
dprintf_win32(stddeb, " (forwarded -> %s)", (char *)RVA(*function));
dprintf_win32( stddeb,"\n" ); dprintf_win32( stddeb,"\n" );
} }
} }
@ -79,7 +89,7 @@ void dump_exports(IMAGE_EXPORT_DIRECTORY * pe_exports, unsigned int load_addr)
* If it is a ordinal: * If it is a ordinal:
* - use ordinal-pe_export->Base as offset into the functionlist * - use ordinal-pe_export->Base as offset into the functionlist
*/ */
FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName) FARPROC32 PE_FindExportedFunction( HMODULE32 hModule, LPCSTR funcName)
{ {
IMAGE_EXPORT_DIRECTORY *exports; IMAGE_EXPORT_DIRECTORY *exports;
unsigned load_addr; unsigned load_addr;
@ -89,34 +99,47 @@ FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
int i; int i;
PDB32 *process=(PDB32*)GetCurrentProcessId(); PDB32 *process=(PDB32*)GetCurrentProcessId();
PE_MODREF *pem; PE_MODREF *pem;
u_long rva_start, rva_end, addr;
char * forward;
pem = process->modref_list; pem = process->modref_list;
while (pem && (pem->pe_module != pe)) while (pem && (pem->module != hModule))
pem=pem->next; pem=pem->next;
if (!pem) { if (!pem) {
fprintf(stderr,"No MODREF found for PE_MODULE %p in process %p\n",pe,process); fprintf(stderr,"No MODREF found for PE_MODULE %08x in process %p\n",hModule,process);
return NULL; return NULL;
} }
load_addr = pem->load_addr; load_addr = hModule;
exports = pem->pe_export; exports = pem->pe_export;
if (HIWORD(funcName)) if (HIWORD(funcName))
dprintf_win32(stddeb,"PE_FindExportedFunction(%s)\n",funcName); dprintf_win32(stddeb,"PE_FindExportedFunction(%s)\n",funcName);
else else
dprintf_win32(stddeb,"PE_FindExportedFunction(%d)\n",(int)funcName); dprintf_win32(stddeb,"PE_FindExportedFunction(%d)\n",(int)funcName);
if (!exports) { if (!exports) {
fprintf(stderr,"Module %p/MODREF %p doesn't have a exports table.\n",pe,pem); fprintf(stderr,"Module %08x/MODREF %p doesn't have a exports table.\n",hModule,pem);
return NULL; return NULL;
} }
ordinal = (u_short*) RVA(exports->AddressOfNameOrdinals); ordinal = (u_short*) RVA(exports->AddressOfNameOrdinals);
function= (u_long*) RVA(exports->AddressOfFunctions); function= (u_long*) RVA(exports->AddressOfFunctions);
name = (u_char **) RVA(exports->AddressOfNames); name = (u_char **) RVA(exports->AddressOfNames);
forward = NULL;
rva_start = PE_HEADER(hModule)->OptionalHeader
.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
rva_end = rva_start + PE_HEADER(hModule)->OptionalHeader
.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
if (HIWORD(funcName)) { if (HIWORD(funcName)) {
for(i=0; i<exports->NumberOfNames; i++) { for(i=0; i<exports->NumberOfNames; i++) {
ename=(char*)RVA(*name); ename=(char*)RVA(*name);
if(!strcmp(ename,funcName)) if(!strcmp(ename,funcName))
return (FARPROC32) RVA(function[*ordinal]); {
addr = function[*ordinal];
if ((addr < rva_start) || (addr >= rva_end))
return (FARPROC32)RVA(addr);
forward = (char *)RVA(addr);
break;
}
ordinal++; ordinal++;
name++; name++;
} }
@ -126,7 +149,19 @@ FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
LOWORD(funcName)); LOWORD(funcName));
return NULL; return NULL;
} }
return (FARPROC32) RVA(function[(int)funcName-exports->Base]); addr = function[(int)funcName-exports->Base];
if ((addr < rva_start) || (addr >= rva_end))
return (FARPROC32)RVA(addr);
forward = (char *)RVA(addr);
}
if (forward)
{
char module[256];
char *end = strchr(forward, '.');
if (!end) return NULL;
strncpy(module, forward, (end - forward));
module[end-forward] = 0;
return GetProcAddress32(MODULE_FindModule(module), end + 1);
} }
return NULL; return NULL;
} }
@ -134,10 +169,9 @@ FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
void void
fixup_imports (PDB32 *process,PE_MODREF *pem) fixup_imports (PDB32 *process,PE_MODREF *pem)
{ {
PE_MODULE *pe = pem->pe_module;
IMAGE_IMPORT_DESCRIPTOR *pe_imp; IMAGE_IMPORT_DESCRIPTOR *pe_imp;
int fixup_failed = 0; int fixup_failed = 0;
unsigned int load_addr = pem->load_addr; unsigned int load_addr = pem->module;
int i; int i;
char *modname; char *modname;
@ -176,7 +210,7 @@ fixup_imports (PDB32 *process,PE_MODREF *pem)
char *p, buffer[256]; char *p, buffer[256];
/* Try with prepending the path of the current module */ /* Try with prepending the path of the current module */
GetModuleFileName32A (pe->mappeddll, buffer, sizeof (buffer)); GetModuleFileName32A( pem->module, buffer, sizeof (buffer));
if (!(p = strrchr (buffer, '\\'))) if (!(p = strrchr (buffer, '\\')))
p = buffer; p = buffer;
strcpy (p + 1, name); strcpy (p + 1, name);
@ -189,7 +223,7 @@ fixup_imports (PDB32 *process,PE_MODREF *pem)
res = MODULE_HANDLEtoHMODULE32(res); res = MODULE_HANDLEtoHMODULE32(res);
xpem = pem->next; xpem = pem->next;
while (xpem) { while (xpem) {
if (xpem->pe_module->mappeddll == res) if (xpem->module == res)
break; break;
xpem = xpem->next; xpem = xpem->next;
} }
@ -297,37 +331,36 @@ fixup_imports (PDB32 *process,PE_MODREF *pem)
if (fixup_failed) exit(1); if (fixup_failed) exit(1);
} }
static int calc_vma_size(struct pe_data *pe) static int calc_vma_size( HMODULE32 hModule )
{ {
int i,vma_size = 0; int i,vma_size = 0;
IMAGE_SECTION_HEADER *pe_seg = PE_SECTIONS(hModule);
dprintf_win32(stddeb, "Dump of segment table\n"); dprintf_win32(stddeb, "Dump of segment table\n");
dprintf_win32(stddeb, " Name VSz Vaddr SzRaw Fileadr *Reloc *Lineum #Reloc #Linum Char\n"); dprintf_win32(stddeb, " Name VSz Vaddr SzRaw Fileadr *Reloc *Lineum #Reloc #Linum Char\n");
for(i=0; i< pe->pe_header->FileHeader.NumberOfSections; i++) for (i = 0; i< PE_HEADER(hModule)->FileHeader.NumberOfSections; i++)
{ {
dprintf_win32(stddeb, "%8s: %4.4lx %8.8lx %8.8lx %8.8lx %8.8lx %8.8lx %4.4x %4.4x %8.8lx\n", dprintf_win32(stddeb, "%8s: %4.4lx %8.8lx %8.8lx %8.8lx %8.8lx %8.8lx %4.4x %4.4x %8.8lx\n",
pe->pe_seg[i].Name, pe_seg->Name,
pe->pe_seg[i].Misc.VirtualSize, pe_seg->Misc.VirtualSize,
pe->pe_seg[i].VirtualAddress, pe_seg->VirtualAddress,
pe->pe_seg[i].SizeOfRawData, pe_seg->SizeOfRawData,
pe->pe_seg[i].PointerToRawData, pe_seg->PointerToRawData,
pe->pe_seg[i].PointerToRelocations, pe_seg->PointerToRelocations,
pe->pe_seg[i].PointerToLinenumbers, pe_seg->PointerToLinenumbers,
pe->pe_seg[i].NumberOfRelocations, pe_seg->NumberOfRelocations,
pe->pe_seg[i].NumberOfLinenumbers, pe_seg->NumberOfLinenumbers,
pe->pe_seg[i].Characteristics); pe_seg->Characteristics);
vma_size = MAX(vma_size, vma_size = MAX(vma_size, pe_seg->VirtualAddress+pe_seg->SizeOfRawData);
pe->pe_seg[i].VirtualAddress + pe_seg++;
pe->pe_seg[i].SizeOfRawData);
} }
return vma_size; return vma_size;
} }
static void do_relocations(PE_MODREF *pem) static void do_relocations(PE_MODREF *pem)
{ {
int delta = pem->load_addr - pem->pe_module->pe_header->OptionalHeader.ImageBase; int delta = pem->module - PE_HEADER(pem->module)->OptionalHeader.ImageBase;
unsigned int load_addr= pem->module;
unsigned int load_addr= pem->load_addr;
IMAGE_BASE_RELOCATION *r = pem->pe_reloc; IMAGE_BASE_RELOCATION *r = pem->pe_reloc;
int hdelta = (delta >> 16) & 0xFFFF; int hdelta = (delta >> 16) & 0xFFFF;
int ldelta = delta & 0xFFFF; int ldelta = delta & 0xFFFF;
@ -398,9 +431,8 @@ static void do_relocations(PE_MODREF *pem)
* BUT we have to map the whole image anyway, for Win32 programs sometimes * BUT we have to map the whole image anyway, for Win32 programs sometimes
* want to access them. (HMODULE32 point to the start of it) * want to access them. (HMODULE32 point to the start of it)
*/ */
static PE_MODULE *PE_LoadImage( HFILE32 hFile ) static HMODULE32 PE_LoadImage( HFILE32 hFile )
{ {
struct pe_data *pe;
HMODULE32 hModule; HMODULE32 hModule;
HANDLE32 mapping; HANDLE32 mapping;
@ -411,7 +443,7 @@ static PE_MODULE *PE_LoadImage( HFILE32 hFile )
{ {
fprintf( stderr, "PE_LoadImage: CreateFileMapping error %ld\n", fprintf( stderr, "PE_LoadImage: CreateFileMapping error %ld\n",
GetLastError() ); GetLastError() );
return NULL; return 0;
} }
hModule = (HMODULE32)MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 ); hModule = (HMODULE32)MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 );
CloseHandle( mapping ); CloseHandle( mapping );
@ -419,126 +451,128 @@ static PE_MODULE *PE_LoadImage( HFILE32 hFile )
{ {
fprintf( stderr, "PE_LoadImage: MapViewOfFile error %ld\n", fprintf( stderr, "PE_LoadImage: MapViewOfFile error %ld\n",
GetLastError() ); GetLastError() );
return NULL; return 0;
} }
/* build PE header */ if (PE_HEADER(hModule)->Signature != IMAGE_NT_SIGNATURE)
pe = xmalloc(sizeof(struct pe_data));
pe->mappeddll = hModule;
pe->pe_header = (IMAGE_NT_HEADERS*)(pe->mappeddll+(((IMAGE_DOS_HEADER*)pe->mappeddll)->e_lfanew));
if (pe->pe_header->Signature!=IMAGE_NT_SIGNATURE)
{ {
fprintf(stderr,"image doesn't have PE signature, but 0x%08lx\n", fprintf(stderr,"image doesn't have PE signature, but 0x%08lx\n",
pe->pe_header->Signature ); PE_HEADER(hModule)->Signature );
free(pe); goto error;
return NULL;
} }
if (pe->pe_header->FileHeader.Machine != IMAGE_FILE_MACHINE_I386) { if (PE_HEADER(hModule)->FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
fprintf(stderr,"trying to load PE image for unsupported architecture ("); {
switch (pe->pe_header->FileHeader.Machine) { fprintf(stderr,"trying to load PE image for unsupported architecture (");
case IMAGE_FILE_MACHINE_UNKNOWN: switch (PE_HEADER(hModule)->FileHeader.Machine)
fprintf(stderr,"Unknown");break; {
case IMAGE_FILE_MACHINE_I860: case IMAGE_FILE_MACHINE_UNKNOWN: fprintf(stderr,"Unknown"); break;
fprintf(stderr,"I860");break; case IMAGE_FILE_MACHINE_I860: fprintf(stderr,"I860"); break;
case IMAGE_FILE_MACHINE_R3000: case IMAGE_FILE_MACHINE_R3000: fprintf(stderr,"R3000"); break;
fprintf(stderr,"R3000");break; case IMAGE_FILE_MACHINE_R4000: fprintf(stderr,"R4000"); break;
case IMAGE_FILE_MACHINE_R4000: case IMAGE_FILE_MACHINE_R10000: fprintf(stderr,"R10000"); break;
fprintf(stderr,"R4000");break; case IMAGE_FILE_MACHINE_ALPHA: fprintf(stderr,"Alpha"); break;
case IMAGE_FILE_MACHINE_R10000: case IMAGE_FILE_MACHINE_POWERPC: fprintf(stderr,"PowerPC"); break;
fprintf(stderr,"R10000");break; default: fprintf(stderr,"Unknown-%04x",
case IMAGE_FILE_MACHINE_ALPHA: PE_HEADER(hModule)->FileHeader.Machine); break;
fprintf(stderr,"Alpha");break; }
case IMAGE_FILE_MACHINE_POWERPC: fprintf(stderr,")\n");
fprintf(stderr,"PowerPC");break; goto error;
default: }
fprintf(stderr,"Unknown-%04x",pe->pe_header->FileHeader.Machine);break; return hModule;
}
fprintf(stderr,")\n");
return NULL;
}
pe->pe_seg = (IMAGE_SECTION_HEADER*)(((LPBYTE)(pe->pe_header+1))-
(16 - pe->pe_header->OptionalHeader.NumberOfRvaAndSizes) * sizeof(IMAGE_DATA_DIRECTORY));
/* FIXME: the (16-...) is a *horrible* hack to make COMDLG32.DLL load OK. The error:
* problem needs to be fixed properly at some stage. UnmapViewOfFile( (LPVOID)hModule );
*/ return 0;
return pe;
} }
/********************************************************************** /**********************************************************************
* This maps a loaded PE dll into the address space of the specified process. * This maps a loaded PE dll into the address space of the specified process.
*/ */
void static HMODULE32 PE_MapImage( HMODULE32 hModule, PDB32 *process,
PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) { OFSTRUCT *ofs, DWORD flags )
{
PE_MODREF *pem; PE_MODREF *pem;
int i, result; int i, result;
int load_addr; DWORD load_addr;
IMAGE_DATA_DIRECTORY dir; IMAGE_DATA_DIRECTORY dir;
char *modname; char *modname;
int vma_size; int vma_size;
pem = (PE_MODREF*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*pem)); IMAGE_SECTION_HEADER *pe_seg;
IMAGE_DOS_HEADER *dos_header = (IMAGE_DOS_HEADER *)hModule;
IMAGE_NT_HEADERS *nt_header = PE_HEADER(hModule);
pem = (PE_MODREF*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
sizeof(*pem));
/* NOTE: fixup_imports takes care of the correct order */ /* NOTE: fixup_imports takes care of the correct order */
pem->next = process->modref_list; pem->next = process->modref_list;
process->modref_list = pem; process->modref_list = pem;
pem->pe_module = pe; if (!(nt_header->FileHeader.Characteristics & IMAGE_FILE_DLL))
if (!(pe->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL)) { {
if (process->exe_modref) if (process->exe_modref)
fprintf(stderr,"overwriting old exe_modref... arrgh\n"); fprintf(stderr,"overwriting old exe_modref... arrgh\n");
process->exe_modref = pem; process->exe_modref = pem;
} }
load_addr = pe->pe_header->OptionalHeader.ImageBase; load_addr = nt_header->OptionalHeader.ImageBase;
dprintf_win32(stddeb, "Load addr is %x\n",load_addr); vma_size = calc_vma_size( hModule );
vma_size = calc_vma_size(pe); dprintf_win32(stddeb, "Load addr is %lx\n",load_addr);
load_addr = (int) VirtualAlloc( (void*)load_addr, vma_size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE ); load_addr = (DWORD)VirtualAlloc( (void*)load_addr, vma_size,
pem->load_addr = load_addr; MEM_RESERVE | MEM_COMMIT,
PAGE_EXECUTE_READWRITE );
pem->module = (HMODULE32)load_addr;
dprintf_win32(stddeb, "Load addr is really %lx, range %x\n", dprintf_win32(stddeb, "Load addr is really %lx, range %x\n",
pem->load_addr, vma_size); load_addr, vma_size);
/* Store the NT header at the load addr
* (FIXME: should really use mmap)
*/
*(IMAGE_DOS_HEADER *)load_addr = *dos_header;
*(IMAGE_NT_HEADERS *)(load_addr + dos_header->e_lfanew) = *nt_header;
for(i=0; i < pe->pe_header->FileHeader.NumberOfSections; i++) pe_seg = PE_SECTIONS(hModule);
for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++, pe_seg++)
{ {
/* memcpy only non-BSS segments */ /* memcpy only non-BSS segments */
/* FIXME: this should be done by mmap(..MAP_PRIVATE|MAP_FIXED..) /* FIXME: this should be done by mmap(..MAP_PRIVATE|MAP_FIXED..)
* but it is not possible for (at least) Linux needs * but it is not possible for (at least) Linux needs
* a page-aligned offset. * a page-aligned offset.
*/ */
if(!(pe->pe_seg[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA)) if(!(pe_seg->Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA))
memcpy((char*)RVA(pe->pe_seg[i].VirtualAddress), memcpy((char*)RVA(pe_seg->VirtualAddress),
(char*)(pe->mappeddll+pe->pe_seg[i].PointerToRawData), (char*)(hModule + pe_seg->PointerToRawData),
pe->pe_seg[i].SizeOfRawData pe_seg->SizeOfRawData
); );
result = RVA (pe->pe_seg[i].VirtualAddress); result = RVA (pe_seg->VirtualAddress);
#if 1 #if 1
/* not needed, memory is zero */ /* not needed, memory is zero */
if(strcmp(pe->pe_seg[i].Name, ".bss") == 0) if(strcmp(pe_seg->Name, ".bss") == 0)
memset((void *)result, 0, memset((void *)result, 0,
pe->pe_seg[i].Misc.VirtualSize ? pe_seg->Misc.VirtualSize ?
pe->pe_seg[i].Misc.VirtualSize : pe_seg->Misc.VirtualSize :
pe->pe_seg[i].SizeOfRawData); pe_seg->SizeOfRawData);
#endif #endif
if(strcmp(pe->pe_seg[i].Name, ".idata") == 0) if(strcmp(pe_seg->Name, ".idata") == 0)
pem->pe_import = (LPIMAGE_IMPORT_DESCRIPTOR) result; pem->pe_import = (LPIMAGE_IMPORT_DESCRIPTOR) result;
if(strcmp(pe->pe_seg[i].Name, ".edata") == 0) if(strcmp(pe_seg->Name, ".edata") == 0)
pem->pe_export = (LPIMAGE_EXPORT_DIRECTORY) result; pem->pe_export = (LPIMAGE_EXPORT_DIRECTORY) result;
if(strcmp(pe->pe_seg[i].Name, ".rsrc") == 0) if(strcmp(pe_seg->Name, ".rsrc") == 0)
pem->pe_resource = (LPIMAGE_RESOURCE_DIRECTORY) result; pem->pe_resource = (LPIMAGE_RESOURCE_DIRECTORY) result;
if(strcmp(pe->pe_seg[i].Name, ".reloc") == 0) if(strcmp(pe_seg->Name, ".reloc") == 0)
pem->pe_reloc = (LPIMAGE_BASE_RELOCATION) result; pem->pe_reloc = (LPIMAGE_BASE_RELOCATION) result;
} }
/* There is word that the actual loader does not care about the /* There is word that the actual loader does not care about the
section names, and only goes for the DataDirectory */ section names, and only goes for the DataDirectory */
dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; dir=nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
if(dir.Size) if(dir.Size)
{ {
if(pem->pe_export && (int)pem->pe_export!=RVA(dir.VirtualAddress)) if(pem->pe_export && (int)pem->pe_export!=RVA(dir.VirtualAddress))
@ -547,7 +581,7 @@ PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
pem->pe_export = (LPIMAGE_EXPORT_DIRECTORY) RVA(dir.VirtualAddress); pem->pe_export = (LPIMAGE_EXPORT_DIRECTORY) RVA(dir.VirtualAddress);
} }
dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; dir=nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
if(dir.Size) if(dir.Size)
{ {
/* /*
@ -557,7 +591,7 @@ PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
pem->pe_import = (LPIMAGE_IMPORT_DESCRIPTOR) RVA(dir.VirtualAddress); pem->pe_import = (LPIMAGE_IMPORT_DESCRIPTOR) RVA(dir.VirtualAddress);
} }
dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE]; dir=nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
if(dir.Size) if(dir.Size)
{ {
if(pem->pe_resource && (int)pem->pe_resource!=RVA(dir.VirtualAddress)) if(pem->pe_resource && (int)pem->pe_resource!=RVA(dir.VirtualAddress))
@ -565,15 +599,15 @@ PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
pem->pe_resource = (LPIMAGE_RESOURCE_DIRECTORY) RVA(dir.VirtualAddress); pem->pe_resource = (LPIMAGE_RESOURCE_DIRECTORY) RVA(dir.VirtualAddress);
} }
if(pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size) if(nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size)
dprintf_win32(stdnimp,"Exception directory ignored\n"); dprintf_win32(stdnimp,"Exception directory ignored\n");
if(pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size) if(nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size)
dprintf_win32(stdnimp,"Security directory ignored\n"); dprintf_win32(stdnimp,"Security directory ignored\n");
dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]; dir=nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
if(dir.Size) if(dir.Size)
{ {
if(pem->pe_reloc && (int)pem->pe_reloc!= RVA(dir.VirtualAddress)) if(pem->pe_reloc && (int)pem->pe_reloc!= RVA(dir.VirtualAddress))
@ -581,38 +615,38 @@ PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
pem->pe_reloc = (void *) RVA(dir.VirtualAddress); pem->pe_reloc = (void *) RVA(dir.VirtualAddress);
} }
if(pe->pe_header->OptionalHeader.DataDirectory if(nt_header->OptionalHeader.DataDirectory
[IMAGE_DIRECTORY_ENTRY_COPYRIGHT].Size) [IMAGE_DIRECTORY_ENTRY_COPYRIGHT].Size)
dprintf_win32(stdnimp,"Copyright string ignored\n"); dprintf_win32(stdnimp,"Copyright string ignored\n");
if(pe->pe_header->OptionalHeader.DataDirectory if(nt_header->OptionalHeader.DataDirectory
[IMAGE_DIRECTORY_ENTRY_GLOBALPTR].Size) [IMAGE_DIRECTORY_ENTRY_GLOBALPTR].Size)
dprintf_win32(stdnimp,"Global Pointer (MIPS) ignored\n"); dprintf_win32(stdnimp,"Global Pointer (MIPS) ignored\n");
if(pe->pe_header->OptionalHeader.DataDirectory if(nt_header->OptionalHeader.DataDirectory
[IMAGE_DIRECTORY_ENTRY_TLS].Size) [IMAGE_DIRECTORY_ENTRY_TLS].Size)
fprintf(stdnimp,"Thread local storage ignored\n"); fprintf(stdnimp,"Thread local storage ignored\n");
if(pe->pe_header->OptionalHeader.DataDirectory if(nt_header->OptionalHeader.DataDirectory
[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].Size) [IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].Size)
dprintf_win32(stdnimp,"Load Configuration directory ignored\n"); dprintf_win32(stdnimp,"Load Configuration directory ignored\n");
if(pe->pe_header->OptionalHeader.DataDirectory if(nt_header->OptionalHeader.DataDirectory
[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size) [IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size)
dprintf_win32(stdnimp,"Bound Import directory ignored\n"); dprintf_win32(stdnimp,"Bound Import directory ignored\n");
if(pe->pe_header->OptionalHeader.DataDirectory if(nt_header->OptionalHeader.DataDirectory
[IMAGE_DIRECTORY_ENTRY_IAT].Size) [IMAGE_DIRECTORY_ENTRY_IAT].Size)
dprintf_win32(stdnimp,"Import Address Table directory ignored\n"); dprintf_win32(stdnimp,"Import Address Table directory ignored\n");
if(pe->pe_header->OptionalHeader.DataDirectory[13].Size) if(nt_header->OptionalHeader.DataDirectory[13].Size)
dprintf_win32(stdnimp,"Unknown directory 13 ignored\n"); dprintf_win32(stdnimp,"Unknown directory 13 ignored\n");
if(pe->pe_header->OptionalHeader.DataDirectory[14].Size) if(nt_header->OptionalHeader.DataDirectory[14].Size)
dprintf_win32(stdnimp,"Unknown directory 14 ignored\n"); dprintf_win32(stdnimp,"Unknown directory 14 ignored\n");
if(pe->pe_header->OptionalHeader.DataDirectory[15].Size) if(nt_header->OptionalHeader.DataDirectory[15].Size)
dprintf_win32(stdnimp,"Unknown directory 15 ignored\n"); dprintf_win32(stdnimp,"Unknown directory 15 ignored\n");
if(pem->pe_reloc) do_relocations(pem); if(pem->pe_reloc) do_relocations(pem);
if(pem->pe_export) dump_exports(pem->pe_export,load_addr); if(pem->pe_export) dump_exports(pem->module);
if(pem->pe_import) fixup_imports(process,pem); if(pem->pe_import) fixup_imports(process,pem);
if (pem->pe_export) if (pem->pe_export)
@ -625,6 +659,11 @@ PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
if ((s=strchr(modname,'.'))) if ((s=strchr(modname,'.')))
*s='\0'; *s='\0';
} }
/* Now that we got everything at the right address,
* we can unmap the previous module */
UnmapViewOfFile( (LPVOID)hModule );
return (HMODULE32)load_addr;
} }
HINSTANCE16 MODULE_CreateInstance(HMODULE16 hModule,LOADPARAMS *params); HINSTANCE16 MODULE_CreateInstance(HMODULE16 hModule,LOADPARAMS *params);
@ -647,8 +686,7 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
/* check if this module is already mapped */ /* check if this module is already mapped */
pem = ((PDB32*)GetCurrentProcessId())->modref_list; pem = ((PDB32*)GetCurrentProcessId())->modref_list;
while (pem) { while (pem) {
if (pem->pe_module->mappeddll == hModule) if (pem->module == hModule) return hModule;
return hModule;
pem = pem->next; pem = pem->next;
} }
pModule = MODULE_GetPtr(hModule); pModule = MODULE_GetPtr(hModule);
@ -656,14 +694,14 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
/* try to load builtin, enabled modules first */ /* try to load builtin, enabled modules first */
if ((hModule = BUILTIN_LoadModule( name, FALSE ))) if ((hModule = BUILTIN_LoadModule( name, FALSE )))
return hModule; return MODULE_HANDLEtoHMODULE32( hModule );
/* try to open the specified file */ /* try to open the specified file */
if (HFILE_ERROR32==(hFile=OpenFile32(name,&ofs,OF_READ))) { if (HFILE_ERROR32==(hFile=OpenFile32(name,&ofs,OF_READ))) {
/* Now try the built-in even if disabled */ /* Now try the built-in even if disabled */
if ((hModule = BUILTIN_LoadModule( name, TRUE ))) { if ((hModule = BUILTIN_LoadModule( name, TRUE ))) {
fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name ); fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name );
return hModule; return MODULE_HANDLEtoHMODULE32( hModule );
} }
return 1; return 1;
} }
@ -673,14 +711,15 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
} }
pModule = (NE_MODULE *)GlobalLock16( hModule ); pModule = (NE_MODULE *)GlobalLock16( hModule );
pModule->flags = NE_FFLAGS_WIN32; pModule->flags = NE_FFLAGS_WIN32;
pModule->pe_module = PE_LoadImage( hFile ); pModule->module32 = PE_LoadImage( hFile );
CloseHandle( hFile ); CloseHandle( hFile );
if (!pModule->pe_module) if (pModule->module32 < 32) return 21;
return 21;
} }
/* recurse */ /* recurse */
PE_MapImage(pModule->pe_module,(PDB32*)GetCurrentProcessId(),&ofs,flags); pModule->module32 = PE_MapImage( pModule->module32,
return pModule->pe_module->mappeddll; (PDB32*)GetCurrentProcessId(),
&ofs,flags);
return pModule->module32;
} }
/***************************************************************************** /*****************************************************************************
@ -690,28 +729,29 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
*/ */
HINSTANCE16 PE_LoadModule( HFILE32 hFile, OFSTRUCT *ofs, LOADPARAMS* params ) HINSTANCE16 PE_LoadModule( HFILE32 hFile, OFSTRUCT *ofs, LOADPARAMS* params )
{ {
HMODULE16 hModule; HMODULE16 hModule16;
HMODULE32 hModule32;
HINSTANCE16 hInstance; HINSTANCE16 hInstance;
NE_MODULE *pModule; NE_MODULE *pModule;
if ((hModule = MODULE_CreateDummyModule( ofs )) < 32) return hModule; if ((hModule16 = MODULE_CreateDummyModule( ofs )) < 32) return hModule16;
pModule = (NE_MODULE *)GlobalLock16( hModule ); pModule = (NE_MODULE *)GlobalLock16( hModule16 );
pModule->flags = NE_FFLAGS_WIN32; pModule->flags = NE_FFLAGS_WIN32;
pModule->pe_module = PE_LoadImage( hFile ); pModule->module32 = hModule32 = PE_LoadImage( hFile );
CloseHandle( hFile ); CloseHandle( hFile );
if (!pModule->pe_module) if (hModule32 < 32) return 21;
return 21;
hInstance = MODULE_CreateInstance( hModule, params ); hInstance = MODULE_CreateInstance( hModule16, params );
if (!(pModule->pe_module->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL)) if (!(PE_HEADER(hModule32)->FileHeader.Characteristics & IMAGE_FILE_DLL))
{ {
TASK_CreateTask( hModule, hInstance, 0, TASK_CreateTask( hModule16, hInstance, 0,
params->hEnvironment, params->hEnvironment,
(LPSTR)PTR_SEG_TO_LIN( params->cmdLine ), (LPSTR)PTR_SEG_TO_LIN( params->cmdLine ),
*((WORD*)PTR_SEG_TO_LIN(params->showCmd) + 1) ); *((WORD*)PTR_SEG_TO_LIN(params->showCmd) + 1) );
} }
PE_MapImage(pModule->pe_module,(PDB32*)GetCurrentProcessId(),ofs,0); pModule->module32 = PE_MapImage( hModule32, (PDB32*)GetCurrentProcessId(),
ofs, 0 );
return hInstance; return hInstance;
} }
@ -729,9 +769,6 @@ int PE_UnloadImage( HMODULE32 hModule )
*/ */
static void PE_InitDLL(PE_MODREF *pem, DWORD type,LPVOID lpReserved) static void PE_InitDLL(PE_MODREF *pem, DWORD type,LPVOID lpReserved)
{ {
PE_MODULE *pe = pem->pe_module;
unsigned int load_addr = pem->load_addr;
if (type==DLL_PROCESS_ATTACH) if (type==DLL_PROCESS_ATTACH)
pem->flags |= PE_MODREF_PROCESS_ATTACHED; pem->flags |= PE_MODREF_PROCESS_ATTACHED;
@ -743,13 +780,14 @@ static void PE_InitDLL(PE_MODREF *pem, DWORD type,LPVOID lpReserved)
*/ */
/* Is this a library? And has it got an entrypoint? */ /* Is this a library? And has it got an entrypoint? */
if ( (pe->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL) && if ((PE_HEADER(pem->module)->FileHeader.Characteristics & IMAGE_FILE_DLL) &&
(pe->pe_header->OptionalHeader.AddressOfEntryPoint) (PE_HEADER(pem->module)->OptionalHeader.AddressOfEntryPoint)
) { ) {
FARPROC32 entry = (FARPROC32)RVA(pe->pe_header->OptionalHeader.AddressOfEntryPoint); FARPROC32 entry = (FARPROC32)RVA_PTR( pem->module,
OptionalHeader.AddressOfEntryPoint );
dprintf_relay( stddeb, "CallTo32(entryproc=%p,module=%d,type=%ld,res=%p)\n", dprintf_relay( stddeb, "CallTo32(entryproc=%p,module=%d,type=%ld,res=%p)\n",
entry, pe->mappeddll, type, lpReserved ); entry, pem->module, type, lpReserved );
entry( pe->mappeddll, type, lpReserved ); entry( pem->module, type, lpReserved );
} }
} }
@ -788,12 +826,12 @@ void PE_InitTls(PDB32 *pdb)
pem = pdb->modref_list; pem = pdb->modref_list;
while (pem) { while (pem) {
peh = pem->pe_module->pe_header; peh = PE_HEADER(pem->module);
if (!peh->OptionalHeader.DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress) { if (!peh->OptionalHeader.DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress) {
pem = pem->next; pem = pem->next;
continue; continue;
} }
pdir = (LPVOID)(pem->load_addr + peh->OptionalHeader. pdir = (LPVOID)(pem->module + peh->OptionalHeader.
DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress); DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress);
index = TlsAlloc(); index = TlsAlloc();
datasize= pdir->EndAddressOfRawData-pdir->StartAddressOfRawData; datasize= pdir->EndAddressOfRawData-pdir->StartAddressOfRawData;
@ -816,7 +854,7 @@ BOOL32 WINAPI DisableThreadLibraryCalls(HMODULE32 hModule)
PE_MODREF *pem = process->modref_list; PE_MODREF *pem = process->modref_list;
while (pem) { while (pem) {
if (pem->pe_module->mappeddll == hModule) if (pem->module == hModule)
pem->flags|=PE_MODREF_NO_DLL_CALLS; pem->flags|=PE_MODREF_NO_DLL_CALLS;
pem = pem->next; pem = pem->next;
} }

View File

@ -41,7 +41,7 @@ HMODULE32toPE_MODREF(HMODULE32 hmod) {
if (!hmod) return NULL; if (!hmod) return NULL;
if (!(pModule = MODULE_GetPtr( hmod ))) return 0; if (!(pModule = MODULE_GetPtr( hmod ))) return 0;
pem = pdb->modref_list; pem = pdb->modref_list;
while (pem && pem->pe_module->mappeddll != hmod) while (pem && pem->module != hmod)
pem=pem->next; pem=pem->next;
return pem; return pem;
} }
@ -141,7 +141,7 @@ HANDLE32 PE_LoadResource32( HINSTANCE32 hModule, HANDLE32 hRsrc )
return 0; return 0;
if (!hRsrc) if (!hRsrc)
return 0; return 0;
return (HANDLE32) (pem->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData); return (HANDLE32) (pem->module + ((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
} }

View File

@ -45,19 +45,27 @@ HRSRC16 WINAPI FindResource16( HMODULE16 hModule, SEGPTR name, SEGPTR type )
NE_MODULE *pModule; NE_MODULE *pModule;
hModule = MODULE_HANDLEtoHMODULE16( hModule ); hModule = MODULE_HANDLEtoHMODULE16( hModule );
dprintf_resource(stddeb, "FindResource16: module=%04x type=", hModule ); dprintf_resource(stddeb, "FindResource16: module=%04x", hModule );
PrintId( type );
if (HIWORD(name)) /* Check for '#xxx' name */ if (HIWORD(name)) /* Check for '#xxx' name */
{ {
char *ptr = PTR_SEG_TO_LIN( name ); char *ptr = PTR_SEG_TO_LIN( name );
if (ptr[0] == '#') { if (ptr[0] == '#')
if (!(name = (SEGPTR)atoi( ptr + 1 ))) return 0; if (!(name = (SEGPTR)atoi( ptr + 1 ))) return 0;
}
} }
dprintf_resource( stddeb, " name=" ); dprintf_resource( stddeb, " name=" );
PrintId( name ); PrintId( name );
if (HIWORD(type)) /* Check for '#xxx' type */
{
char *ptr = PTR_SEG_TO_LIN( type );
if (ptr[0] == '#')
if (!(type = (SEGPTR)atoi( ptr + 1 ))) return 0;
}
dprintf_resource( stddeb, " type=" );
PrintId( type );
dprintf_resource( stddeb, "\n" ); dprintf_resource( stddeb, "\n" );
if ((pModule = MODULE_GetPtr( hModule ))) if ((pModule = MODULE_GetPtr( hModule )))
@ -547,7 +555,7 @@ INT16 WINAPI LoadString16( HINSTANCE16 instance, UINT16 resource_id,
* LoadString32W (USER32.375) * LoadString32W (USER32.375)
*/ */
INT32 WINAPI LoadString32W( HINSTANCE32 instance, UINT32 resource_id, INT32 WINAPI LoadString32W( HINSTANCE32 instance, UINT32 resource_id,
LPWSTR buffer, int buflen ) LPWSTR buffer, INT32 buflen )
{ {
HGLOBAL32 hmem; HGLOBAL32 hmem;
HRSRC32 hrsrc; HRSRC32 hrsrc;
@ -599,16 +607,20 @@ INT32 WINAPI LoadString32W( HINSTANCE32 instance, UINT32 resource_id,
* LoadString32A (USER32.374) * LoadString32A (USER32.374)
*/ */
INT32 WINAPI LoadString32A( HINSTANCE32 instance, UINT32 resource_id, INT32 WINAPI LoadString32A( HINSTANCE32 instance, UINT32 resource_id,
LPSTR buffer,int buflen ) LPSTR buffer, INT32 buflen )
{ {
INT32 retval; INT32 retval;
LPWSTR buffer2 = NULL; LPWSTR buffer2 = NULL;
if (buffer) buffer2 = HeapAlloc( GetProcessHeap(), 0, buflen * 2 ); if (buffer && buflen)
buffer2 = HeapAlloc( GetProcessHeap(), 0, buflen * 2 );
retval = LoadString32W(instance,resource_id,buffer2,buflen); retval = LoadString32W(instance,resource_id,buffer2,buflen);
if (buffer2) if (buffer2)
{ {
lstrcpynWtoA( buffer, buffer2, buflen ); if (retval) {
lstrcpynWtoA( buffer, buffer2, buflen );
retval = lstrlen32A( buffer );
}
HeapFree( GetProcessHeap(), 0, buffer2 ); HeapFree( GetProcessHeap(), 0, buffer2 );
} }
return retval; return retval;
@ -640,7 +652,7 @@ INT32 WINAPI LoadString32A( HINSTANCE32 instance, UINT32 resource_id,
* LoadMessage32A (internal) * LoadMessage32A (internal)
*/ */
INT32 LoadMessage32A( HINSTANCE32 instance, UINT32 id, WORD lang, INT32 LoadMessage32A( HINSTANCE32 instance, UINT32 id, WORD lang,
LPSTR buffer, int buflen ) LPSTR buffer, INT32 buflen )
{ {
HGLOBAL32 hmem; HGLOBAL32 hmem;
HRSRC32 hrsrc; HRSRC32 hrsrc;
@ -708,15 +720,19 @@ INT32 LoadMessage32A( HINSTANCE32 instance, UINT32 id, WORD lang,
* LoadMessage32W (internal) * LoadMessage32W (internal)
*/ */
INT32 LoadMessage32W( HINSTANCE32 instance, UINT32 id, WORD lang, INT32 LoadMessage32W( HINSTANCE32 instance, UINT32 id, WORD lang,
LPWSTR buffer, int buflen ) LPWSTR buffer, INT32 buflen )
{ {
INT32 retval; INT32 retval;
LPSTR buffer2 = NULL; LPSTR buffer2 = NULL;
if (buffer) buffer2 = HeapAlloc( GetProcessHeap(), 0, buflen ); if (buffer && buflen)
buffer2 = HeapAlloc( GetProcessHeap(), 0, buflen );
retval = LoadMessage32A(instance,id,lang,buffer2,buflen); retval = LoadMessage32A(instance,id,lang,buffer2,buflen);
if (buffer) if (buffer)
{ {
lstrcpynAtoW( buffer, buffer2, buflen ); if (retval) {
lstrcpynAtoW( buffer, buffer2, buflen );
retval = lstrlen32W( buffer );
}
HeapFree( GetProcessHeap(), 0, buffer2 ); HeapFree( GetProcessHeap(), 0, buffer2 );
} }
return retval; return retval;

View File

@ -340,18 +340,17 @@ static void TASK_CallToStart(void)
SEGTABLEENTRY *pSegTable = NE_SEG_TABLE( pModule ); SEGTABLEENTRY *pSegTable = NE_SEG_TABLE( pModule );
IF1632_Saved16_ss_sp = pTask->ss_sp; IF1632_Saved16_ss_sp = pTask->ss_sp;
SET_FS( pCurrentThread->teb_sel );
if (pModule->flags & NE_FFLAGS_WIN32) if (pModule->flags & NE_FFLAGS_WIN32)
{ {
/* FIXME: all this is an ugly hack */ /* FIXME: all this is an ugly hack */
extern void InitTask( CONTEXT *context ); extern void InitTask( CONTEXT *context );
FARPROC32 entry = (FARPROC32)(pCurrentProcess->exe_modref->load_addr + FARPROC32 entry = (FARPROC32)RVA_PTR( pCurrentProcess->exe_modref->module, OptionalHeader.AddressOfEntryPoint );
pCurrentProcess->exe_modref->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint);
InitTask( NULL ); InitTask( NULL );
InitApp( pTask->hModule ); InitApp( pTask->hModule );
SET_FS( pCurrentThread->teb_sel );
PE_InitializeDLLs( pCurrentProcess, DLL_PROCESS_ATTACH, (LPVOID)-1 ); PE_InitializeDLLs( pCurrentProcess, DLL_PROCESS_ATTACH, (LPVOID)-1 );
dprintf_relay( stddeb, "CallTo32(entryproc=%p)\n", entry ); dprintf_relay( stddeb, "CallTo32(entryproc=%p)\n", entry );
exit_code = entry(); exit_code = entry();
@ -526,7 +525,8 @@ HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
pCurrentProcess->exe_modref->load_addr + pCurrentProcess->exe_modref->load_addr +
pCurrentProcess->exe_modref->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint); pCurrentProcess->exe_modref->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint);
*/ */
pTask->thdb = THREAD_Create( pdb32, 0, 0 ); pTask->thdb = THREAD_Create( pdb32,
PE_HEADER(pModule->module32)->OptionalHeader.SizeOfStackReserve, 0 );
/* FIXME: should not be done here */ /* FIXME: should not be done here */
pCurrentThread = pTask->thdb; pCurrentThread = pTask->thdb;
PE_InitTls( pdb32 ); PE_InitTls( pdb32 );
@ -1005,9 +1005,9 @@ void WINAPI UserYield(void)
/*********************************************************************** /***********************************************************************
* Yield (KERNEL.29) * Yield16 (KERNEL.29)
*/ */
void WINAPI Yield(void) void WINAPI Yield16(void)
{ {
TDB *pCurTask = (TDB *)GlobalLock16( hCurrentTask ); TDB *pCurTask = (TDB *)GlobalLock16( hCurrentTask );
if (pCurTask) pCurTask->hYieldTo = 0; if (pCurTask) pCurTask->hYieldTo = 0;
@ -1021,16 +1021,24 @@ void WINAPI Yield(void)
*/ */
FARPROC16 WINAPI MakeProcInstance16( FARPROC16 func, HANDLE16 hInstance ) FARPROC16 WINAPI MakeProcInstance16( FARPROC16 func, HANDLE16 hInstance )
{ {
BYTE *thunk; BYTE *thunk,*lfunc;
SEGPTR thunkaddr; SEGPTR thunkaddr;
if (__winelib) return func; /* func can be called directly in Winelib */ if (__winelib) return func; /* func can be called directly in Winelib */
thunkaddr = TASK_AllocThunk( hCurrentTask ); thunkaddr = TASK_AllocThunk( hCurrentTask );
if (!thunkaddr) return (FARPROC16)0; if (!thunkaddr) return (FARPROC16)0;
thunk = PTR_SEG_TO_LIN( thunkaddr ); thunk = PTR_SEG_TO_LIN( thunkaddr );
lfunc = PTR_SEG_TO_LIN( func );
dprintf_task( stddeb, "MakeProcInstance(%08lx,%04x): got thunk %08lx\n", dprintf_task( stddeb, "MakeProcInstance(%08lx,%04x): got thunk %08lx\n",
(DWORD)func, hInstance, (DWORD)thunkaddr ); (DWORD)func, hInstance, (DWORD)thunkaddr );
if (((lfunc[0]==0x8c) && (lfunc[1]==0xd8)) ||
((lfunc[0]==0x1e) && (lfunc[1]==0x58))
) {
fprintf(stderr,"FIXME: MakeProcInstance16 thunk would be useless for %p, overwriting with nop;nop;\n", func );
lfunc[0]=0x90; /* nop */
lfunc[1]=0x90; /* nop */
}
*thunk++ = 0xb8; /* movw instance, %ax */ *thunk++ = 0xb8; /* movw instance, %ax */
*thunk++ = (BYTE)(hInstance & 0xff); *thunk++ = (BYTE)(hInstance & 0xff);
@ -1074,6 +1082,15 @@ HANDLE16 WINAPI GetCodeHandle( FARPROC16 proc )
} }
/**********************************************************************
* DefineHandleTable16 (KERNEL.94)
*/
BOOL16 WINAPI DefineHandleTable16( WORD wOffset )
{
return TRUE; /* FIXME */
}
/*********************************************************************** /***********************************************************************
* SetTaskQueue (KERNEL.34) * SetTaskQueue (KERNEL.34)
*/ */

View File

@ -567,9 +567,9 @@ BOOL16 WINAPI GlobalUnWire16( HGLOBAL16 handle )
/*********************************************************************** /***********************************************************************
* SetSwapAreaSize (KERNEL.106) * SetSwapAreaSize16 (KERNEL.106)
*/ */
LONG WINAPI SetSwapAreaSize( WORD size ) LONG WINAPI SetSwapAreaSize16( WORD size )
{ {
dprintf_global(stdnimp, "STUB: SetSwapAreaSize(%d)\n", size ); dprintf_global(stdnimp, "STUB: SetSwapAreaSize(%d)\n", size );
return MAKELONG( size, 0xffff ); return MAKELONG( size, 0xffff );

View File

@ -1080,6 +1080,28 @@ error:
} }
/***********************************************************************
* FlushViewOfFile (KERNEL32.262)
*/
BOOL32 WINAPI FlushViewOfFile( LPCVOID base, DWORD cbFlush )
{
FILE_VIEW *view;
UINT32 addr = ROUND_ADDR( base );
dprintf_virtual( stddeb, "FlushViewOfFile at %p for %ld bytes\n",
base, cbFlush );
if (!(view = VIRTUAL_FindView( addr )))
{
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
if (!cbFlush) cbFlush = view->size;
if (!msync( addr, cbFlush, MS_SYNC )) return TRUE;
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
/*********************************************************************** /***********************************************************************
* UnmapViewOfFile (KERNEL32.540) * UnmapViewOfFile (KERNEL32.540)
*/ */

View File

@ -10,7 +10,6 @@ C_SRCS = \
callback.c \ callback.c \
comm.c \ comm.c \
commdlg.c \ commdlg.c \
compobj.c \
crtdll.c \ crtdll.c \
cpu.c \ cpu.c \
ddeml.c \ ddeml.c \
@ -22,15 +21,11 @@ C_SRCS = \
mpr.c \ mpr.c \
network.c \ network.c \
ntdll.c \ ntdll.c \
ole2.c \
ole2disp.c \
ole2nls.c \
olecli.c \
olesvr.c \
port.c \ port.c \
printdrv.c \ printdrv.c \
registry.c \ registry.c \
shell.c \ shell.c \
shellord.c \
sound.c \ sound.c \
spy.c \ spy.c \
stress.c \ stress.c \
@ -39,6 +34,8 @@ C_SRCS = \
tweak.c \ tweak.c \
ver.c \ ver.c \
version.c \ version.c \
w32scomb.c \
w32skrnl.c \
w32sys.c \ w32sys.c \
winsock.c \ winsock.c \
winsock_dns.c \ winsock_dns.c \

View File

@ -124,6 +124,7 @@ BOOL16 WINAPI GetOpenFileName16( SEGPTR ofn )
} }
hInst = WIN_GetWindowInstance( lpofn->hwndOwner ); hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
/* FIXME: doesn't handle win32 format correctly yet */
hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format, hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
lpofn->hwndOwner, lpofn->hwndOwner,
(DLGPROC16)MODULE_GetWndProcEntry16("FileOpenDlgProc"), (DLGPROC16)MODULE_GetWndProcEntry16("FileOpenDlgProc"),

View File

@ -474,6 +474,16 @@ void __cdecl CRTDLL_exit(DWORD ret)
} }
/*********************************************************************
* _abnormal_termination (CRTDLL.36 )
*/
INT32 __cdecl CRTDLL__abnormal_termination(void)
{
dprintf_crtdll(stddeb,"CRTDLL__abnormal_termination\n");
return 0;
}
/********************************************************************* /*********************************************************************
* fflush (CRTDLL.365) * fflush (CRTDLL.365)
*/ */
@ -582,6 +592,19 @@ INT32 __cdecl CRTDLL_getc( FILE *stream )
return ret; return ret;
} }
/*********************************************************************
* _rotl (CRTDLL.259)
*/
UINT32 __cdecl CRTDLL__rotl(UINT32 x,INT32 shift)
{
unsigned int ret = (x >> shift)|( x >>((sizeof(x))-shift));
dprintf_crtdll(stddeb,
"CRTDLL_rotl got 0x%08x rot %d ret 0x%08x\n",
x,shift,ret);
return ret;
}
/********************************************************************* /*********************************************************************
* _lrotl (CRTDLL.176) * _lrotl (CRTDLL.176)
*/ */
@ -1429,6 +1452,66 @@ LPSTR __cdecl CRTDLL__fullpath(LPSTR buf, LPCSTR name, INT32 size)
return buf; return buf;
} }
/*********************************************************************
* _splitpath (CRTDLL.279)
*/
VOID __cdecl CRTDLL__splitpath(LPCSTR path, LPSTR drive, LPSTR directory, LPSTR filename, LPSTR extension )
{
/* drive includes :
directory includes leading and trailing (forward and backward slashes)
filename without dot and slashes
extension with leading dot
*/
char * drivechar,*dirchar,*namechar;
dprintf_crtdll(stddeb,"CRTDLL__splitpath got %s\n",path);
drivechar = strchr(path,':');
dirchar = strrchr(path,'/');
namechar = strrchr(path,'\\');
dirchar = MAX(dirchar,namechar);
if (dirchar)
namechar = strrchr(dirchar,'.');
else
namechar = strrchr(path,'.');
if (drive)
{
*drive = NULL;
if (drivechar)
{
strncat(drive,path,drivechar-path+1);
path = drivechar+1;
}
}
if (directory)
{
*directory = NULL;
if (dirchar)
{
strncat(directory,path,dirchar-path+1);
path = dirchar+1;
}
}
if (filename)
{
*filename = NULL;
if (namechar)
{
strncat(filename,path,namechar-path);
if (extension)
{
*extension = NULL;
strcat(extension,namechar);
}
}
}
dprintf_crtdll(stddeb,"CRTDLL__splitpath found %s %s %s %s\n",drive,directory,filename,extension);
}
/********************************************************************* /*********************************************************************
* _getcwd (CRTDLL.120) * _getcwd (CRTDLL.120)
*/ */

View File

@ -168,7 +168,7 @@ HFILE32 WINAPI LZInit32( HFILE32 hfSrc )
_llseek32(hfSrc,0,SEEK_SET); _llseek32(hfSrc,0,SEEK_SET);
return ret?ret:hfSrc; return ret?ret:hfSrc;
} }
lzstates = HeapReAlloc( GetProcessHeap(), 0, lzstates, lzstates = HeapReAlloc( SystemHeap, 0, lzstates,
(++nroflzstates)*sizeof(struct lzstate) ); (++nroflzstates)*sizeof(struct lzstate) );
lzs = lzstates+(nroflzstates-1); lzs = lzstates+(nroflzstates-1);
@ -618,7 +618,7 @@ void WINAPI LZClose32( HFILE32 fd )
memmove(lzstates+i,lzstates+i+1, memmove(lzstates+i,lzstates+i+1,
sizeof(struct lzstate)*(nroflzstates-i-1)); sizeof(struct lzstate)*(nroflzstates-i-1));
nroflzstates--; nroflzstates--;
lzstates = HeapReAlloc( GetProcessHeap(), 0, lzstates, lzstates = HeapReAlloc( SystemHeap, 0, lzstates,
sizeof(struct lzstate)*nroflzstates ); sizeof(struct lzstate)*nroflzstates );
} }

View File

@ -118,7 +118,7 @@ static XrmOptionDescRec optionsTable[] =
#define NB_OPTIONS (sizeof(optionsTable) / sizeof(optionsTable[0])) #define NB_OPTIONS (sizeof(optionsTable) / sizeof(optionsTable[0]))
#define USAGE \ #define USAGE \
"Usage: %s [options] program_name [arguments]\n" \ "Usage: %s [options] \"program_name [arguments]\"\n" \
"\n" \ "\n" \
"Options:\n" \ "Options:\n" \
" -backingstore Turn on backing store\n" \ " -backingstore Turn on backing store\n" \
@ -613,7 +613,7 @@ void WINAPI MessageBeep16( UINT16 i )
*/ */
BOOL32 WINAPI MessageBeep32( UINT32 i ) BOOL32 WINAPI MessageBeep32( UINT32 i )
{ {
XBell( display, 100 ); XBell( display, 0 );
return TRUE; return TRUE;
} }
@ -624,7 +624,7 @@ BOOL32 WINAPI MessageBeep32( UINT32 i )
BOOL32 WINAPI Beep( DWORD dwFreq, DWORD dwDur ) BOOL32 WINAPI Beep( DWORD dwFreq, DWORD dwDur )
{ {
/* dwFreq and dwDur are ignored by Win95 */ /* dwFreq and dwDur are ignored by Win95 */
XBell(display, 100); XBell(display, 0);
return TRUE; return TRUE;
} }

View File

@ -6,6 +6,7 @@
#include <stdio.h> #include <stdio.h>
#include "windows.h" #include "windows.h"
#include "winerror.h"
#include "drive.h" #include "drive.h"
#define WN_SUCCESS 0x0000 #define WN_SUCCESS 0x0000
@ -29,8 +30,10 @@
#define WN_ALREADY_CONNECTED 0x0034 #define WN_ALREADY_CONNECTED 0x0034
#define WN_DEVICE_ERROR 0x0035 #define WN_DEVICE_ERROR 0x0035
#define WN_CONNECTION_CLOSED 0x0036 #define WN_CONNECTION_CLOSED 0x0036
#define WN_NO_NETWORK ERROR_NO_NETWORK
typedef LPSTR LPNETRESOURCE;
typedef LPVOID LPNETRESOURCE16;
/************************************************************************** /**************************************************************************
* WNetErrorText [USER.499] * WNetErrorText [USER.499]
@ -170,8 +173,12 @@ int WINAPI WNetGetConnection16(LPSTR lpLocalName,
case DRIVE_FIXED: case DRIVE_FIXED:
return WN_NOT_CONNECTED; return WN_NOT_CONNECTED;
case DRIVE_REMOTE: case DRIVE_REMOTE:
path = DRIVE_GetDosCwd(drive); path = DRIVE_GetLabel(drive);
if (strlen(path) + 1 > *cbRemoteName) return WN_MORE_DATA; if (strlen(path) + 1 > *cbRemoteName)
{
*cbRemoteName = strlen(path) + 1;
return WN_MORE_DATA;
}
strcpy( lpRemoteName, path ); strcpy( lpRemoteName, path );
*cbRemoteName = strlen(lpRemoteName) + 1; *cbRemoteName = strlen(lpRemoteName) + 1;
return WN_SUCCESS; return WN_SUCCESS;
@ -194,7 +201,7 @@ int WINAPI WNetGetCaps(WORD capability)
int WINAPI WNetDeviceMode(HWND16 hWndOwner) int WINAPI WNetDeviceMode(HWND16 hWndOwner)
{ {
printf("EMPTY STUB !!! WNetDeviceMode(%04x)\n",hWndOwner); printf("EMPTY STUB !!! WNetDeviceMode(%04x)\n",hWndOwner);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -204,7 +211,7 @@ int WINAPI WNetBrowseDialog(HWND16 hParent,WORD nType,LPSTR szPath)
{ {
printf("EMPTY STUB !!! WNetBrowseDialog(%04x,%x,'%s')\n", printf("EMPTY STUB !!! WNetBrowseDialog(%04x,%x,'%s')\n",
hParent,nType,szPath); hParent,nType,szPath);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -214,7 +221,7 @@ UINT16 WINAPI WNetGetUser(LPSTR lpLocalName, LPSTR lpUserName, DWORD *lpSize)
{ {
printf("EMPTY STUB !!! WNetGetUser(%p, %p, %p);\n", printf("EMPTY STUB !!! WNetGetUser(%p, %p, %p);\n",
lpLocalName, lpUserName, lpSize); lpLocalName, lpUserName, lpSize);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -225,7 +232,7 @@ UINT16 WINAPI WNetAddConnection(LPSTR lpNetPath, LPSTR lpPassWord,
{ {
printf("EMPTY STUB !!! WNetAddConnection('%s', %p, '%s');\n", printf("EMPTY STUB !!! WNetAddConnection('%s', %p, '%s');\n",
lpNetPath, lpPassWord, lpLocalName); lpNetPath, lpPassWord, lpLocalName);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
@ -236,7 +243,7 @@ UINT16 WINAPI WNetCancelConnection(LPSTR lpName, BOOL16 bForce)
{ {
printf("EMPTY STUB !!! WNetCancelConnection('%s', %04X);\n", printf("EMPTY STUB !!! WNetCancelConnection('%s', %04X);\n",
lpName, bForce); lpName, bForce);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -245,7 +252,7 @@ UINT16 WINAPI WNetCancelConnection(LPSTR lpName, BOOL16 bForce)
int WINAPI WNetGetError(LPWORD nError) int WINAPI WNetGetError(LPWORD nError)
{ {
printf("EMPTY STUB !!! WNetGetError(%p)\n",nError); printf("EMPTY STUB !!! WNetGetError(%p)\n",nError);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -265,7 +272,7 @@ int WINAPI WNetRestoreConnection(HWND16 hwndOwner,LPSTR lpszDevice)
{ {
printf("EMPTY STUB !!! WNetRestoreConnection(%04x,'%s')\n", printf("EMPTY STUB !!! WNetRestoreConnection(%04x,'%s')\n",
hwndOwner,lpszDevice); hwndOwner,lpszDevice);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -275,7 +282,7 @@ int WINAPI WNetWriteJob(HANDLE16 hJob,void *lpData,LPWORD lpcbData)
{ {
printf("EMPTY STUB !!! WNetWriteJob(%04x,%p,%p)\n", printf("EMPTY STUB !!! WNetWriteJob(%04x,%p,%p)\n",
hJob,lpData,lpcbData); hJob,lpData,lpcbData);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -294,7 +301,7 @@ int WINAPI WNetDisconnectDialog(HWND16 hwndOwner, WORD iType)
{ {
printf("EMPTY STUB !!! WNetDisconnectDialog(%04x,%x)\n", printf("EMPTY STUB !!! WNetDisconnectDialog(%04x,%x)\n",
hwndOwner,iType); hwndOwner,iType);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -314,7 +321,7 @@ int WINAPI WNetViewQueueDialog(HWND16 hwndOwner,LPSTR lpszQueue)
{ {
printf("EMPTY STUB !!! WNetViewQueueDialog(%04x,'%s')\n", printf("EMPTY STUB !!! WNetViewQueueDialog(%04x,'%s')\n",
hwndOwner,lpszQueue); hwndOwner,lpszQueue);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -325,7 +332,7 @@ int WINAPI WNetPropertyDialog(HWND16 hwndParent,WORD iButton,
{ {
printf("EMPTY STUB !!! WNetPropertyDialog(%04x,%x,%x,'%s',%x)\n", printf("EMPTY STUB !!! WNetPropertyDialog(%04x,%x,%x,'%s',%x)\n",
hwndParent,iButton,nPropSel,lpszName,nType); hwndParent,iButton,nPropSel,lpszName,nType);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -335,7 +342,7 @@ int WINAPI WNetGetDirectoryType(LPSTR lpName,void *lpType)
{ {
printf("EMPTY STUB !!! WNetGetDirectoryType('%s',%p)\n", printf("EMPTY STUB !!! WNetGetDirectoryType('%s',%p)\n",
lpName,lpType); lpName,lpType);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -345,7 +352,7 @@ int WINAPI WNetDirectoryNotify(HWND16 hwndOwner,void *lpDir,WORD wOper)
{ {
printf("EMPTY STUB !!! WNetDirectoryNotify(%04x,%p,%x)\n", printf("EMPTY STUB !!! WNetDirectoryNotify(%04x,%p,%x)\n",
hwndOwner,lpDir,wOper); hwndOwner,lpDir,wOper);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -356,7 +363,7 @@ int WINAPI WNetGetPropertyText(HWND16 hwndParent,WORD iButton,WORD nPropSel,
{ {
printf("EMPTY STUB !!! WNetGetPropertyText(%04x,%x,%x,'%s',%x)\n", printf("EMPTY STUB !!! WNetGetPropertyText(%04x,%x,%x,'%s',%x)\n",
hwndParent,iButton,nPropSel,lpszName,nType); hwndParent,iButton,nPropSel,lpszName,nType);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -367,7 +374,7 @@ UINT16 WINAPI WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord,
{ {
printf("EMPTY STUB !!! WNetAddConnection2('%s', %p, '%s', '%s');\n", printf("EMPTY STUB !!! WNetAddConnection2('%s', %p, '%s', '%s');\n",
lpNetPath, lpPassWord, lpLocalName, lpUserName); lpNetPath, lpPassWord, lpLocalName, lpUserName);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -376,7 +383,7 @@ UINT16 WINAPI WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord,
UINT16 WINAPI WNetCloseEnum(HANDLE16 hEnum) UINT16 WINAPI WNetCloseEnum(HANDLE16 hEnum)
{ {
printf("EMPTY STUB !!! WNetCloseEnum(%04x);\n", hEnum); printf("EMPTY STUB !!! WNetCloseEnum(%04x);\n", hEnum);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
@ -387,22 +394,35 @@ UINT16 WINAPI WNetEnumResource(HANDLE16 hEnum, DWORD cRequ,
{ {
printf("EMPTY STUB !!! WNetEnumResource(%04x, %08lX, %p, %p);\n", printf("EMPTY STUB !!! WNetEnumResource(%04x, %08lX, %p, %p);\n",
hEnum, cRequ, lpCount, lpBuf); hEnum, cRequ, lpCount, lpBuf);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/************************************************************************** /**************************************************************************
* WNetOpenEnum [USER.???] * WNetOpenEnum [USER.???]
*/ */
UINT16 WINAPI WNetOpenEnum(DWORD dwScope, DWORD dwType, UINT16 WINAPI WNetOpenEnum16(DWORD dwScope, DWORD dwType,
LPNETRESOURCE lpNet, HANDLE16 *lphEnum) LPNETRESOURCE16 lpNet, HANDLE16 *lphEnum)
{ {
printf("EMPTY STUB !!! WNetOpenEnum(%08lX, %08lX, %p, %p);\n", printf("EMPTY STUB !!! WNetOpenEnum(%08lX, %08lX, %p, %p);\n",
dwScope, dwType, lpNet, lphEnum); dwScope, dwType, lpNet, lphEnum);
return WN_NET_ERROR; return WN_NO_NETWORK;
} }
/**************************************************************************
* WNetOpenEnumA [MPR.92]
*/
UINT32 WINAPI WNetOpenEnum32A(DWORD dwScope, DWORD dwType,
LPNETRESOURCE32A lpNet, HANDLE32 *lphEnum)
{
printf("EMPTY STUB !!! WNetOpenEnumA(%08lX, %08lX, %p, %p);\n",
dwScope, dwType, lpNet, lphEnum);
return WN_NO_NETWORK;
}
DWORD /**************************************************************************
* WNetGetConnectionA [MPR.92]
*/
DWORD WINAPI
WNetGetConnection32A(LPCSTR localname,LPSTR remotename,LPDWORD buflen) WNetGetConnection32A(LPCSTR localname,LPSTR remotename,LPDWORD buflen)
{ {
UINT16 x; UINT16 x;
@ -410,3 +430,13 @@ WNetGetConnection32A(LPCSTR localname,LPSTR remotename,LPDWORD buflen)
*buflen = x; *buflen = x;
return ret; return ret;
} }
DWORD WINAPI
WNetGetResourceInformation32A(
LPNETRESOURCE32A netres,LPVOID buf,LPDWORD buflen,LPSTR systemstr
) {
fprintf(stderr,"WNetGetResourceInformationA(%p,%p,%p,%p),stub!\n",
netres,buf,buflen,systemstr
);
return WN_NO_NETWORK;
}

View File

@ -1,54 +0,0 @@
/*
* OLECLI library
*
* Copyright 1995 Martin von Loewis
*/
/* At the moment, these are only empty stubs.
*/
#include "windows.h"
#include "ole.h"
#include "gdi.h"
#include "stddebug.h"
#include "debug.h"
extern LONG OLE_current_handle;
/***********************************************************************
* OleRegisterClientDoc
*/
OLESTATUS WINAPI OleRegisterClientDoc( LPCSTR classname, LPCSTR docname,
LONG reserved, LHCLIENTDOC *hRet )
{
dprintf_ole(stdnimp,"OleRegisterClientDoc:%s %s\n",classname,docname);
*hRet=++OLE_current_handle;
return OLE_OK;
}
/***********************************************************************
* OleRenameClientDoc
*/
OLESTATUS WINAPI OleRenameClientDoc(LHCLIENTDOC hDoc, LPCSTR newName)
{
dprintf_ole(stdnimp,"OleRenameClientDoc: %ld %s\n",hDoc, newName);
return OLE_OK;
}
/***********************************************************************
* OleRevokeClientDoc
*/
OLESTATUS WINAPI OleRevokeClientDoc(LHCLIENTDOC hServerDoc)
{
dprintf_ole(stdnimp,"OleRevokeClientDoc:%ld\n",hServerDoc);
return OLE_OK;
}
/***********************************************************************
* OleIsDcMeta
*/
BOOL16 WINAPI OleIsDcMeta(HDC16 hdc)
{
dprintf_ole(stddeb,"OleIsDCMeta(%04x)\n",hdc);
return GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC ) != 0;
}

View File

@ -1,78 +0,0 @@
/*
* OLESVR library
*
* Copyright 1995 Martin von Loewis
*/
/* At the moment, these are only empty stubs.
*/
#include "windows.h"
#include "ole.h"
#include "stddebug.h"
#include "debug.h"
LONG OLE_current_handle;
/***********************************************************************
* OleRegisterServer
*/
OLESTATUS WINAPI OleRegisterServer( LPCSTR name, LPOLESERVER serverStruct,
LHSERVER *hRet, HINSTANCE16 hServer,
OLE_SERVER_USE use )
{
dprintf_ole(stdnimp,"OleRegisterServer:%s\n",name);
*hRet=++OLE_current_handle;
/* return OLE_ERROR_MEMORY, OLE_ERROR_PROTECT_ONLY if you want it fail*/
return OLE_OK;
}
/***********************************************************************
* OleBlockServer
*/
OLESTATUS WINAPI OleBlockServer(LHSERVER hServer)
{
fprintf(stdnimp,"OleBlockServer:%ld\n",hServer);
return OLE_OK;
}
/***********************************************************************
* OleUnblockServer
*/
OLESTATUS WINAPI OleUnblockServer(LHSERVER hServer, BOOL16 *block)
{
fprintf(stdnimp,"OleUnblockServer:%ld\n",hServer);
/* no more blocked messages :) */
*block=FALSE;
return OLE_OK;
}
/***********************************************************************
* OleRegisterServerDoc
*/
OLESTATUS WINAPI OleRegisterServerDoc( LHSERVER hServer, LPCSTR docname,
LPOLESERVERDOC document,
LHSERVERDOC *hRet)
{
dprintf_ole(stdnimp,"OleRegisterServerDoc:%ld,%s\n", hServer, docname);
*hRet=++OLE_current_handle;
return OLE_OK;
}
/***********************************************************************
* OleRevokeServerDoc
*/
OLESTATUS WINAPI OleRevokeServerDoc(LHSERVERDOC hServerDoc)
{
dprintf_ole(stdnimp,"OleRevokeServerDoc:%ld\n",hServerDoc);
return OLE_OK;
}
/***********************************************************************
* OleRevokeServer
*/
OLESTATUS WINAPI OleRevokeServer(LHSERVER hServer)
{
dprintf_ole(stdnimp,"OleRevokeServer:%ld\n",hServer);
return OLE_OK;
}

View File

@ -89,3 +89,12 @@ LONG WINAPI DocumentProperties32A(HWND32 hWnd,HANDLE32 hPrinter,
return 1; return 1;
} }
BOOL32 WINAPI EnumPrinters32A(DWORD dwType, LPSTR lpszName,
DWORD dwLevel, LPBYTE lpbPrinters,
DWORD cbBuf, LPDWORD lpdwNeeded,
LPDWORD lpdwReturned)
{
fprintf(stderr,"EnumPrinters32A nearly empty stub\n");
*lpdwReturned=0;
return TRUE;
}

View File

@ -20,7 +20,6 @@
#include "winerror.h" #include "winerror.h"
#include "file.h" #include "file.h"
#include "heap.h" #include "heap.h"
#include "string32.h"
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
#include "xmalloc.h" #include "xmalloc.h"
@ -78,9 +77,25 @@ static KEYSTRUCT *key_dyn_data=NULL;
/* what valuetypes do we need to convert? */ /* what valuetypes do we need to convert? */
#define UNICONVMASK ((1<<REG_SZ)|(1<<REG_MULTI_SZ)|(1<<REG_EXPAND_SZ)) #define UNICONVMASK ((1<<REG_SZ)|(1<<REG_MULTI_SZ)|(1<<REG_EXPAND_SZ))
#define strdupA2W(x) STRING32_DupAnsiToUni(x) extern LPWSTR __cdecl CRTDLL_wcschr(LPWSTR a,WCHAR c);
#define strdupW(x) STRING32_strdupW(x)
#define strchrW(a,c) STRING32_lstrchrW(a,c) static LPWSTR strdupA2W(LPCSTR src)
{
LPWSTR dest=xmalloc(2*strlen(src)+2);
lstrcpyAtoW(dest,src);
return dest;
}
static LPWSTR strdupW(LPCWSTR a) {
LPWSTR b;
int len;
len=sizeof(WCHAR)*(lstrlen32W(a)+1);
b=(LPWSTR)xmalloc(len);
memcpy(b,a,len);
return b;
}
static struct openhandle { static struct openhandle {
LPKEYSTRUCT lpkey; LPKEYSTRUCT lpkey;
@ -1454,7 +1469,7 @@ __w31_dumptree( unsigned short idx,
idx=dir->sibling_idx; idx=dir->sibling_idx;
continue; continue;
} }
name=STRING32_DupAnsiToUni(tail); name=strdupA2W(tail);
xlpkey=_find_or_add_key(lpkey,name); xlpkey=_find_or_add_key(lpkey,name);
@ -1464,7 +1479,7 @@ __w31_dumptree( unsigned short idx,
val=(struct _w31_valent*)&tab[dir->value_idx]; val=(struct _w31_valent*)&tab[dir->value_idx];
memcpy(tail,&txt[val->string_off],val->length); memcpy(tail,&txt[val->string_off],val->length);
tail[val->length]='\0'; tail[val->length]='\0';
value=STRING32_DupAnsiToUni(tail); value=strdupA2W(tail);
_find_or_add_value(xlpkey,NULL,REG_SZ,(LPBYTE)value,lstrlen32W(value)*2+2,lastmodified); _find_or_add_value(xlpkey,NULL,REG_SZ,(LPBYTE)value,lstrlen32W(value)*2+2,lastmodified);
} }
} }

View File

@ -1,6 +1,7 @@
/* /*
* Shell Library Functions * Shell Library Functions
*/ */
#include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -17,8 +18,12 @@
#include "win.h" #include "win.h"
#include "graphics.h" #include "graphics.h"
#include "cursoricon.h" #include "cursoricon.h"
#include "interfaces.h"
#include "sysmetrics.h"
#include "shlobj.h"
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
#include "debugstr.h"
#include "winreg.h" #include "winreg.h"
static const char * const SHELL_People[] = static const char * const SHELL_People[] =
@ -29,6 +34,7 @@ static const char * const SHELL_People[] =
"Peter Bajusz", "Peter Bajusz",
"Georg Beyerle", "Georg Beyerle",
"Ross Biro", "Ross Biro",
"Martin Boehme",
"Uwe Bonnes", "Uwe Bonnes",
"Erik Bos", "Erik Bos",
"Fons Botman", "Fons Botman",
@ -36,12 +42,14 @@ static const char * const SHELL_People[] =
"Andrew Bulhak", "Andrew Bulhak",
"John Burton", "John Burton",
"Niels de Carpentier", "Niels de Carpentier",
"Gordon Chaffee",
"Jimen Ching", "Jimen Ching",
"David A. Cuthbert", "David A. Cuthbert",
"Huw D. M. Davies", "Huw D. M. Davies",
"Roman Dolejsi", "Roman Dolejsi",
"Frans van Dorsselaer", "Frans van Dorsselaer",
"Chris Faherty", "Chris Faherty",
"Carsten Fallesen",
"Paul Falstad", "Paul Falstad",
"David Faure", "David Faure",
"Claus Fischer", "Claus Fischer",
@ -89,6 +97,7 @@ static const char * const SHELL_People[] =
"Andreas Mohr", "Andreas Mohr",
"Philippe De Muyter", "Philippe De Muyter",
"Itai Nahshon", "Itai Nahshon",
"Kristian Nielsen",
"Henrik Olsen", "Henrik Olsen",
"Michael Patra", "Michael Patra",
"Dimitrie O. Paun", "Dimitrie O. Paun",
@ -132,12 +141,14 @@ static const char * const SHELL_People[] =
"Eric Warnke", "Eric Warnke",
"Manfred Weichel", "Manfred Weichel",
"Morten Welinder", "Morten Welinder",
"Len White",
"Lawson Whitney", "Lawson Whitney",
"Jan Willamowius", "Jan Willamowius",
"Carl Williams", "Carl Williams",
"Karl Guenter Wuensch", "Karl Guenter Wuensch",
"Eric Youngdale", "Eric Youngdale",
"James Youngman", "James Youngman",
"Nikita V. Youshchenko",
"Mikolaj Zalewski", "Mikolaj Zalewski",
"John Zero", "John Zero",
NULL NULL
@ -746,48 +757,52 @@ BOOL32 WINAPI ShellAbout32W( HWND32 hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff,
/************************************************************************* /*************************************************************************
* SHELL_GetResourceTable * SHELL_GetResourceTable
*
* FIXME: Implement GetPEResourceTable in w32sys.c and call it here.
*/ */
static BYTE* SHELL_GetResourceTable(HFILE32 hFile) static DWORD SHELL_GetResourceTable(HFILE32 hFile,LPBYTE *retptr)
{ {
BYTE* pTypeInfo = NULL;
IMAGE_DOS_HEADER mz_header; IMAGE_DOS_HEADER mz_header;
IMAGE_OS2_HEADER ne_header; char magic[4];
int size; int size;
*retptr = NULL;
_llseek32( hFile, 0, SEEK_SET ); _llseek32( hFile, 0, SEEK_SET );
if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) || if ( (_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
(mz_header.e_magic != IMAGE_DOS_SIGNATURE)) return (BYTE*)-1; (mz_header.e_magic != IMAGE_DOS_SIGNATURE)
)
return 0;
_llseek32( hFile, mz_header.e_lfanew, SEEK_SET ); _llseek32( hFile, mz_header.e_lfanew, SEEK_SET );
if (_lread32( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header)) if (_lread32( hFile, magic, sizeof(magic) ) != sizeof(magic))
return NULL; return 0;
_llseek32( hFile, mz_header.e_lfanew, SEEK_SET);
if (ne_header.ne_magic == IMAGE_NT_SIGNATURE) if (*(DWORD*)magic == IMAGE_NT_SIGNATURE)
{ fprintf(stdnimp,"Win32s FIXME: file %s line %i\n", __FILE__, __LINE__ ); return IMAGE_NT_SIGNATURE;
return NULL; } if (*(WORD*)magic == IMAGE_OS2_SIGNATURE) {
IMAGE_OS2_HEADER ne_header;
LPBYTE pTypeInfo = NULL;
if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE) return NULL; if (_lread32(hFile,&ne_header,sizeof(ne_header))!=sizeof(ne_header))
return 0;
size = ne_header.rname_tab_offset - ne_header.resource_tab_offset; if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE) return 0;
size = ne_header.rname_tab_offset - ne_header.resource_tab_offset;
if( size > sizeof(NE_TYPEINFO) )
{
pTypeInfo = (BYTE*)HeapAlloc( GetProcessHeap(), 0, size);
if( pTypeInfo ) {
_llseek32(hFile, mz_header.e_lfanew+ne_header.resource_tab_offset, SEEK_SET);
if( _lread32( hFile, (char*)pTypeInfo, size) != size ) {
HeapFree( GetProcessHeap(), 0, pTypeInfo);
pTypeInfo = NULL;
}
}
}
*retptr = pTypeInfo;
} else
*retptr = (LPBYTE)-1;
return IMAGE_OS2_SIGNATURE; /* handles .ICO too */
if( size > sizeof(NE_TYPEINFO) )
{
pTypeInfo = (BYTE*)HeapAlloc( GetProcessHeap(), 0, size);
if( pTypeInfo )
{
_llseek32(hFile, mz_header.e_lfanew+ne_header.resource_tab_offset, SEEK_SET);
if( _lread32( hFile, (char*)pTypeInfo, size) != size )
{
HeapFree( GetProcessHeap(), 0, pTypeInfo);
pTypeInfo = NULL;
}
}
}
/* no resources */
return pTypeInfo;
} }
/************************************************************************* /*************************************************************************
@ -886,11 +901,13 @@ HGLOBAL16 WINAPI InternalExtractIcon(HINSTANCE16 hInstance,
{ {
HGLOBAL16 hRet = 0; HGLOBAL16 hRet = 0;
HGLOBAL16* RetPtr = NULL; HGLOBAL16* RetPtr = NULL;
BYTE* pData; LPBYTE pData;
OFSTRUCT ofs; OFSTRUCT ofs;
DWORD sig;
HFILE32 hFile = OpenFile32( lpszExeFileName, &ofs, OF_READ ); HFILE32 hFile = OpenFile32( lpszExeFileName, &ofs, OF_READ );
UINT16 iconDirCount = 0,iconCount = 0;
dprintf_reg(stddeb, "InternalExtractIcon(%04x, file '%s', start from %d, extract %d\n", dprintf_reg(stddeb,"InternalExtractIcon(%04x,file %s,start %d,extract %d\n",
hInstance, lpszExeFileName, nIconIndex, n); hInstance, lpszExeFileName, nIconIndex, n);
if( hFile == HFILE_ERROR32 || !n ) return 0; if( hFile == HFILE_ERROR32 || !n ) return 0;
@ -898,13 +915,13 @@ HGLOBAL16 WINAPI InternalExtractIcon(HINSTANCE16 hInstance,
hRet = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, sizeof(HICON16)*n); hRet = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, sizeof(HICON16)*n);
RetPtr = (HICON16*)GlobalLock16(hRet); RetPtr = (HICON16*)GlobalLock16(hRet);
*RetPtr = (n == 0xFFFF)? 0: 1; /* error return values */ *RetPtr = (n == 0xFFFF)? 0: 1; /* error return values */
if( (pData = SHELL_GetResourceTable(hFile)) ) sig = SHELL_GetResourceTable(hFile,&pData);
if(sig == IMAGE_OS2_SIGNATURE)
{ {
HICON16 hIcon = 0; HICON16 hIcon = 0;
UINT16 iconDirCount = 0;
UINT16 iconCount = 0;
NE_TYPEINFO* pTInfo = (NE_TYPEINFO*)(pData + 2); NE_TYPEINFO* pTInfo = (NE_TYPEINFO*)(pData + 2);
NE_NAMEINFO* pIconStorage = NULL; NE_NAMEINFO* pIconStorage = NULL;
NE_NAMEINFO* pIconDir = NULL; NE_NAMEINFO* pIconDir = NULL;
@ -980,30 +997,181 @@ HGLOBAL16 WINAPI InternalExtractIcon(HINSTANCE16 hInstance,
if( lpiID ) HeapFree( GetProcessHeap(), 0, lpiID); if( lpiID ) HeapFree( GetProcessHeap(), 0, lpiID);
else HeapFree( GetProcessHeap(), 0, pData); else HeapFree( GetProcessHeap(), 0, pData);
} }
_lclose32( hFile ); if( sig == IMAGE_NT_SIGNATURE)
{
LPBYTE peimage,idata,igdata;
LPIMAGE_DOS_HEADER dheader;
LPIMAGE_NT_HEADERS pe_header;
LPIMAGE_SECTION_HEADER pe_sections;
LPIMAGE_RESOURCE_DIRECTORY rootresdir,iconresdir,icongroupresdir;
LPIMAGE_RESOURCE_DATA_ENTRY idataent,igdataent;
HANDLE32 fmapping;
int i,j;
LPIMAGE_RESOURCE_DIRECTORY_ENTRY xresent;
CURSORICONDIR **cids;
fmapping = CreateFileMapping32A(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL);
if (fmapping == 0) { /* FIXME, INVALID_HANDLE_VALUE? */
fprintf(stderr,"InternalExtractIcon:failed to create filemap.\n");
_lclose32( hFile);
return 0;
}
peimage = MapViewOfFile(fmapping,FILE_MAP_READ,0,0,0);
if (!peimage) {
fprintf(stderr,"InternalExtractIcon:failed to mmap filemap.\n");
CloseHandle(fmapping);
_lclose32( hFile);
return 0;
}
dheader = (LPIMAGE_DOS_HEADER)peimage;
/* it is a pe header, SHELL_GetResourceTable checked that */
pe_header = (LPIMAGE_NT_HEADERS)(peimage+dheader->e_lfanew);
/* probably makes problems with short PE headers... but I haven't seen
* one yet...
*/
pe_sections = (LPIMAGE_SECTION_HEADER)(((char*)pe_header)+sizeof(*pe_header));
rootresdir = NULL;
for (i=0;i<pe_header->FileHeader.NumberOfSections;i++) {
if (pe_sections[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
continue;
/* FIXME: doesn't work when the resources are not in a seperate section */
if (pe_sections[i].VirtualAddress == pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress) {
rootresdir = (LPIMAGE_RESOURCE_DIRECTORY)((char*)peimage+pe_sections[i].PointerToRawData);
break;
}
}
if (!rootresdir) {
fprintf(stderr,"InternalExtractIcon: haven't found section for resource directory.\n");
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
return 0;
}
icongroupresdir = GetResDirEntryW(rootresdir,(LPWSTR)RT_GROUP_ICON,(DWORD)rootresdir);
if (!icongroupresdir) {
fprintf(stderr,"InternalExtractIcon: No Icongroupresourcedirectory!\n");
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
return 0;
}
iconDirCount = icongroupresdir->NumberOfNamedEntries+icongroupresdir->NumberOfIdEntries;
if( nIconIndex == (UINT16)-1 ) {
RetPtr[0] = iconDirCount;
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
return hRet;
}
if (nIconIndex >= iconDirCount) {
fprintf(stderr,"nIconIndex %d is larger than iconDirCount %d\n",
nIconIndex,iconDirCount
);
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
GlobalFree16(hRet);
return 0;
}
cids = (CURSORICONDIR**)HeapAlloc(GetProcessHeap(),0,n*sizeof(CURSORICONDIR*));
/* caller just wanted the number of entries */
xresent = (LPIMAGE_RESOURCE_DIRECTORY_ENTRY)(icongroupresdir+1);
/* assure we don't get too much ... */
if( n > iconDirCount - nIconIndex ) n = iconDirCount - nIconIndex;
/* starting from specified index ... */
xresent = xresent+nIconIndex;
for (i=0;i<n;i++,xresent++) {
CURSORICONDIR *cid;
LPIMAGE_RESOURCE_DIRECTORY resdir;
/* go down this resource entry, name */
resdir = (LPIMAGE_RESOURCE_DIRECTORY)((DWORD)rootresdir+(xresent->u2.s.OffsetToDirectory));
/* default language (0) */
resdir = GetResDirEntryW(resdir,(LPWSTR)0,(DWORD)rootresdir);
igdataent = (LPIMAGE_RESOURCE_DATA_ENTRY)resdir;
/* lookup address in mapped image for virtual address */
igdata = NULL;
for (j=0;j<pe_header->FileHeader.NumberOfSections;j++) {
if (igdataent->OffsetToData < pe_sections[j].VirtualAddress)
continue;
if (igdataent->OffsetToData+igdataent->Size > pe_sections[j].VirtualAddress+pe_sections[j].SizeOfRawData)
continue;
igdata = peimage+(igdataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData);
}
if (!igdata) {
fprintf(stderr,"InternalExtractIcon: no matching real address found for icongroup!\n");
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
return 0;
}
/* found */
cid = (CURSORICONDIR*)igdata;
cids[i] = cid;
fprintf(stderr,"cursoricondir %d: idType %d, idCount %d\n",
i,cid->idType,cid->idCount
);
RetPtr[i] = LookupIconIdFromDirectoryEx32(igdata,TRUE,SYSMETRICS_CXICON,SYSMETRICS_CYICON,0);
fprintf(stderr,"-> best match is %08x\n",RetPtr[i]);
}
iconresdir=GetResDirEntryW(rootresdir,(LPWSTR)RT_ICON,(DWORD)rootresdir);
if (!iconresdir) {
fprintf(stderr,"InternalExtractIcon: No Iconresourcedirectory!\n");
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
return 0;
}
for (i=0;i<n;i++) {
LPIMAGE_RESOURCE_DIRECTORY xresdir;
xresdir = GetResDirEntryW(iconresdir,(LPWSTR)RetPtr[i],(DWORD)rootresdir);
xresdir = GetResDirEntryW(xresdir,(LPWSTR)0,(DWORD)rootresdir);
idataent = (LPIMAGE_RESOURCE_DATA_ENTRY)xresdir;
idata = NULL;
/* map virtual to address in image */
for (j=0;j<pe_header->FileHeader.NumberOfSections;j++) {
if (idataent->OffsetToData < pe_sections[j].VirtualAddress)
continue;
if (idataent->OffsetToData+idataent->Size > pe_sections[j].VirtualAddress+pe_sections[j].SizeOfRawData)
continue;
idata = peimage+(idataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData);
}
if (!idata) {
fprintf(stderr,"InternalExtractIcon: no matching real address found for icondata!\n");
RetPtr[i]=0;
continue;
}
RetPtr[i] = CreateIconFromResourceEx32(idata,idataent->Size,TRUE,0x00030000,SYSMETRICS_CXICON,SYSMETRICS_CYICON,0);
}
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
return hRet;
}
_lclose32( hFile );
/* return array with icon handles */ /* return array with icon handles */
return hRet; return hRet;
} }
/************************************************************************* /*************************************************************************
* ExtractIcon16 (SHELL.34) * ExtractIcon16 (SHELL.34)
*/ */
HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName, HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
UINT16 nIconIndex ) UINT16 nIconIndex )
{ {
HGLOBAL16 handle = InternalExtractIcon(hInstance,lpszExeFileName,nIconIndex, 1); return ExtractIcon32A( hInstance, lpszExeFileName, nIconIndex );
if( handle )
{
HICON16* ptr = (HICON16*)GlobalLock16(handle);
HICON16 hIcon = *ptr;
GlobalFree16(handle);
return hIcon;
}
return 0;
} }
@ -1011,10 +1179,32 @@ HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
* ExtractIcon32A (SHELL32.133) * ExtractIcon32A (SHELL32.133)
*/ */
HICON32 WINAPI ExtractIcon32A( HINSTANCE32 hInstance, LPCSTR lpszExeFileName, HICON32 WINAPI ExtractIcon32A( HINSTANCE32 hInstance, LPCSTR lpszExeFileName,
UINT32 nIconIndex ) UINT32 nIconIndex )
{ {
/* FIXME */ HGLOBAL16 handle = InternalExtractIcon(hInstance,lpszExeFileName,nIconIndex, 1);
return ExtractIcon16( hInstance, lpszExeFileName, nIconIndex );
if( handle )
{
HICON16* ptr = (HICON16*)GlobalLock16(handle);
HICON16 hIcon = *ptr;
GlobalFree16(handle);
return hIcon;
}
return 0;
}
/*************************************************************************
* ExtractIcon32W (SHELL32.180)
*/
HICON32 WINAPI ExtractIcon32W( HINSTANCE32 hInstance, LPCWSTR lpszExeFileName,
UINT32 nIconIndex )
{
LPSTR exefn = HEAP_strdupWtoA(GetProcessHeap(),0,lpszExeFileName);
HICON32 ret = ExtractIcon32A(hInstance,exefn,nIconIndex);
HeapFree(GetProcessHeap(),0,exefn);
return ret;
} }
@ -1024,37 +1214,37 @@ HICON32 WINAPI ExtractIcon32A( HINSTANCE32 hInstance, LPCSTR lpszExeFileName,
* Return icon for given file (either from file itself or from associated * Return icon for given file (either from file itself or from associated
* executable) and patch parameters if needed. * executable) and patch parameters if needed.
*/ */
HICON16 WINAPI ExtractAssociatedIcon(HINSTANCE16 hInst,LPSTR lpIconPath, HICON16 WINAPI ExtractAssociatedIcon16(HINSTANCE16 hInst,LPSTR lpIconPath,
LPWORD lpiIcon) LPWORD lpiIcon)
{ {
HICON16 hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon); HICON16 hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
if( hIcon < 2 ) if( hIcon < 2 )
{ {
if( hIcon == 1 ) /* no icons found in given file */ if( hIcon == 1 ) /* no icons found in given file */
{ {
char tempPath[0x80]; char tempPath[0x80];
UINT16 uRet = FindExecutable16(lpIconPath,NULL,tempPath); UINT16 uRet = FindExecutable16(lpIconPath,NULL,tempPath);
if( uRet > 32 && tempPath[0] ) if( uRet > 32 && tempPath[0] )
{ {
strcpy(lpIconPath,tempPath); strcpy(lpIconPath,tempPath);
hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon); hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
if( hIcon > 2 ) return hIcon; if( hIcon > 2 ) return hIcon;
} }
else hIcon = 0; else hIcon = 0;
} }
if( hIcon == 1 ) if( hIcon == 1 )
*lpiIcon = 2; /* MSDOS icon - we found .exe but no icons in it */ *lpiIcon = 2; /* MSDOS icon - we found .exe but no icons in it */
else else
*lpiIcon = 6; /* generic icon - found nothing */ *lpiIcon = 6; /* generic icon - found nothing */
GetModuleFileName16(hInst, lpIconPath, 0x80); GetModuleFileName16(hInst, lpIconPath, 0x80);
hIcon = LoadIcon16( hInst, MAKEINTRESOURCE(*lpiIcon)); hIcon = LoadIcon16( hInst, MAKEINTRESOURCE(*lpiIcon));
} }
return hIcon; return hIcon;
} }
@ -1066,30 +1256,30 @@ HICON16 WINAPI ExtractAssociatedIcon(HINSTANCE16 hInst,LPSTR lpIconPath,
*/ */
LPSTR SHELL_FindString(LPSTR lpEnv, LPCSTR entry) LPSTR SHELL_FindString(LPSTR lpEnv, LPCSTR entry)
{ {
UINT16 l = strlen(entry); UINT16 l = strlen(entry);
for( ; *lpEnv ; lpEnv+=strlen(lpEnv)+1 ) for( ; *lpEnv ; lpEnv+=strlen(lpEnv)+1 )
{ {
if( lstrncmpi32A(lpEnv, entry, l) ) continue; if( lstrncmpi32A(lpEnv, entry, l) ) continue;
if( !*(lpEnv+l) ) if( !*(lpEnv+l) )
return (lpEnv + l); /* empty entry */ return (lpEnv + l); /* empty entry */
else if ( *(lpEnv+l)== '=' ) else if ( *(lpEnv+l)== '=' )
return (lpEnv + l + 1); return (lpEnv + l + 1);
} }
return NULL; return NULL;
} }
SEGPTR WINAPI FindEnvironmentString(LPSTR str) SEGPTR WINAPI FindEnvironmentString(LPSTR str)
{ {
SEGPTR spEnv = GetDOSEnvironment(); SEGPTR spEnv = GetDOSEnvironment();
LPSTR lpEnv = (LPSTR)PTR_SEG_TO_LIN(spEnv); LPSTR lpEnv = (LPSTR)PTR_SEG_TO_LIN(spEnv);
LPSTR lpString = (spEnv)?SHELL_FindString(lpEnv, str):NULL; LPSTR lpString = (spEnv)?SHELL_FindString(lpEnv, str):NULL;
if( lpString ) /* offset should be small enough */ if( lpString ) /* offset should be small enough */
return spEnv + (lpString - lpEnv); return spEnv + (lpString - lpEnv);
return (SEGPTR)NULL; return (SEGPTR)NULL;
} }
/************************************************************************* /*************************************************************************
@ -1249,6 +1439,30 @@ DWORD WINAPI SHGetFileInfo32A(LPCSTR path,DWORD dwFileAttributes,
return TRUE; return TRUE;
} }
/*************************************************************************
* SHAppBarMessage32 [SHELL32.207]
*/
UINT32 WINAPI SHAppBarMessage32(DWORD msg, PAPPBARDATA data)
{
fprintf(stdnimp,"SHAppBarMessage32(0x%08lx,%p)\n", msg, data);
#if 0
switch (msg) {
case ABM_ACTIVATE:
case ABM_GETAUTOHIDEBAR:
case ABM_GETSTATE:
case ABM_GETTASKBARPOS:
case ABM_NEW:
case ABM_QUERYPOS:
case ABM_REMOVE:
case ABM_SETAUTOHIDEBAR:
case ABM_SETPOS:
case ABM_WINDOWPOSCHANGED:
;
}
#endif
return 0;
}
/************************************************************************* /*************************************************************************
* CommandLineToArgvW [SHELL32.7] * CommandLineToArgvW [SHELL32.7]
*/ */
@ -1329,9 +1543,7 @@ void WINAPI FreeIconList( DWORD dw )
*/ */
/* This is the wrong place, but where is the right one? */ /* This is the wrong place, but where is the right one? */
typedef UINT32 REFCLSID32; #if 0
typedef UINT32 REFIID32;
typedef UINT32 HRESULT32;
#define E_OUTOFMEMORY 0x8007000EL #define E_OUTOFMEMORY 0x8007000EL
HRESULT32 WINAPI SHELL32_DllGetClassObject (REFCLSID32 clsid, HRESULT32 WINAPI SHELL32_DllGetClassObject (REFCLSID32 clsid,
@ -1346,3 +1558,9 @@ HRESULT32 WINAPI SHELL32_DllGetClassObject (REFCLSID32 clsid,
return hres; return hres;
} }
#endif
DWORD WINAPI SHGetDesktopFolder(LPSHELLFOLDER *shellfolder) {
*shellfolder = NULL;
return 0;
}

525
misc/shellord.c Normal file
View File

@ -0,0 +1,525 @@
/*
* Shell Ordinal Functions
*
* These are completely undocumented. The meaning of the functions changes
* between different OS versions (NT uses Unicode strings, 95 uses ASCII
* strings, etc. etc.)
*
* They are just here so that explorer.exe and iexplore.exe can be tested.
*
* Copyright 1997 Marcus Meissner
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include "windows.h"
#include "file.h"
#include "shell.h"
#include "heap.h"
#include "module.h"
#include "neexe.h"
#include "resource.h"
#include "dlgs.h"
#include "win.h"
#include "graphics.h"
#include "cursoricon.h"
#include "interfaces.h"
#include "shlobj.h"
#include "stddebug.h"
#include "debug.h"
#include "winreg.h"
/*************************************************************************
* SHELL32_32 [SHELL32.32]
* append \ if there is none
*/
LPSTR WINAPI SHELL32_32(LPSTR path) {
int len;
len = lstrlen32A(path);
if (len && path[len-1]!='\\') {
path[len+0]='\\';
path[len+1]='\0';
return path+len+1;
} else
return path+len;
}
/*************************************************************************
* SHELL32_34 [SHELL32.34]
* basename(char *fn);
*/
LPSTR WINAPI SHELL32_34(LPSTR fn) {
LPSTR basefn;
basefn = fn;
while (fn[0]) {
if (((fn[0]=='\\') || (fn[0]==':')) && fn[1] && fn[1]!='\\')
basefn = fn+1;
fn++;
}
return basefn;
}
/*************************************************************************
* SHELL32_35 [SHELL32.35]
* bool getpath(char *pathname); truncates passed argument to a valid path
* returns if the string was modified or not.
* "\foo\xx\foo"-> "\foo\xx"
* "\" -> "\"
* "a:\foo" -> "a:\"
*/
DWORD WINAPI SHELL32_35(LPSTR fn) {
LPSTR x,cutplace;
if (!fn[0])
return 0;
x=fn;
cutplace = fn;
while (*x) {
if (*x=='\\') {
cutplace=x++;
continue;
}
if (*x==':') {
x++;
if (*x=='\\')
cutplace=++x;
continue; /* already x++ed */
}
x++;
}
if (!*cutplace)
return 0;
if (cutplace==fn) {
if (fn[0]=='\\') {
if (!fn[1])
return 0;
fn[0]='\0';
return 1;
}
}
*cutplace='\0';
return 1;
}
/*************************************************************************
* SHELL32_37 [SHELL32.37]
* concat_paths(char*target,const char*add);
* concats "target\\add" and writes them to target
*/
LPSTR WINAPI SHELL32_37(LPSTR target,LPSTR x1,LPSTR x2) {
char buf[260];
if (!x2 || !x2[0]) {
lstrcpy32A(target,x1);
return target;
}
lstrcpy32A(buf,x1);
SHELL32_32(buf); /* append \ if not there */
lstrcat32A(buf,x2);
lstrcpy32A(target,buf);
return target;
}
/*************************************************************************
* SHELL32_36 [SHELL32.36]
* concat_paths(char*target,const char*add);
* concats "target\\add" and writes them to target
*/
LPSTR WINAPI SHELL32_36(LPSTR x1,LPSTR x2) {
while (x2[0]=='\\') x2++;
return SHELL32_37(x1,x1,x2);
}
/*************************************************************************
* SHELL32_52 [SHELL32.52]
* look for next arg in string. handle "quoted" strings
* returns pointer to argument *AFTER* the space. Or to the \0.
*/
LPSTR WINAPI SHELL32_52(LPSTR cmdline) {
BOOL32 qflag = FALSE;
while (*cmdline) {
if ((*cmdline==' ') && !qflag)
return cmdline+1;
if (*cmdline=='"')
qflag=!qflag;
cmdline++;
}
return cmdline;
}
/*************************************************************************
* SHELL32_45 [SHELL32.45]
* file_exists(char *fn);
*/
BOOL32 WINAPI SHELL32_45(LPSTR fn) {
if (GetFileAttributes32A(fn)==-1)
return FALSE;
else
return TRUE;
}
/*************************************************************************
* SHELL32_175 [SHELL32.175]
* unknown
*/
void WINAPI SHELL32_175(DWORD x1,DWORD x2,DWORD x3,DWORD x4) {
fprintf(stdnimp,"SHELL32_175(0x%08lx,0x%08lx,0x%08lx,0x%08lx),stub\n",
x1,x2,x3,x4
);
}
/*************************************************************************
* SHELL32_181 [SHELL32.181]
* unknown
*/
void WINAPI SHELL32_181(DWORD x,DWORD y) {
fprintf(stderr,"SHELL32_181(0x%08lx,0x%08lx)\n",x,y);
}
/*************************************************************************
* SHELL32_119 [SHELL32.119]
* unknown
*/
void WINAPI SHELL32_119(LPVOID x) {
fprintf(stderr,"SHELL32_119(%p),stub\n",x);
}
/*************************************************************************
* SHELL32_75 [SHELL32.75]
* unknown
*/
BOOL32 WINAPI SHELL32_75(LPDWORD x,LPDWORD y) {
fprintf(stderr,"SHELL32_75(%p,%p),stub\n",x,y);
return TRUE;
}
DWORD WINAPI
SHELL32_DllGetClassObject(REFCLSID *clsid,REFIID *iid,LPVOID *x) {
char xclsid[50],xiid[50];
StringFromCLSID((LPCLSID)clsid,xclsid);
StringFromCLSID((LPCLSID)iid,xiid);
fprintf(stderr,"SHELL32_DllGetClassObject(%s,%s,%p), STUB\n",xclsid,xiid,x);
return 0;
}
static FARPROC32 _find_moduleproc(LPSTR dllname,HMODULE32 *xhmod,LPSTR name) {
HMODULE32 hmod;
FARPROC32 dllunload,nameproc;
if (xhmod) *xhmod = 0;
if (!lstrcmpi32A(SHELL32_34(dllname),"shell32.dll"))
return (FARPROC32)SHELL32_DllGetClassObject;
hmod = LoadLibraryEx32A(dllname,0,LOAD_WITH_ALTERED_SEARCH_PATH);
if (!hmod)
return NULL;
dllunload = GetProcAddress32(hmod,"DllCanUnloadNow");
if (!dllunload)
if (xhmod) *xhmod = hmod;
nameproc = GetProcAddress32(hmod,name);
if (!nameproc) {
FreeLibrary32(hmod);
return NULL;
}
/* register unloadable dll with unloadproc ... */
return nameproc;
}
static DWORD _get_instance(REFCLSID clsid,LPSTR dllname,
LPVOID unknownouter,REFIID refiid,LPVOID inst
) {
DWORD WINAPI (*dllgetclassob)(REFCLSID,REFIID,LPVOID);
DWORD hres;
LPCLASSFACTORY classfac;
dllgetclassob = (DWORD(*)(REFCLSID,REFIID,LPVOID))_find_moduleproc(dllname,NULL,"DllGetClassObject");
if (!dllgetclassob)
return 0x80070000|GetLastError();
hres = (*dllgetclassob)(clsid,(REFIID)&IID_IClassFactory,&classfac);
if (hres<0)
return hres;
classfac->lpvtbl->fnCreateInstance(classfac,unknownouter,refiid,inst);
classfac->lpvtbl->fnRelease(classfac);
return 0;
}
/*************************************************************************
* SHELL32_102 [SHELL32.102]
* unknown
*/
LRESULT WINAPI SHELL32_102(
LPSTR aclsid,CLSID *clsid,LPUNKNOWN unknownouter,REFIID refiid,LPVOID inst
) {
char buffer[256],xclsid[48],xiid[48],path[260],tmodel[100];
HKEY inprockey;
DWORD pathlen,type,tmodellen;
DWORD hres;
StringFromCLSID(refiid,xiid);
if (clsid)
StringFromCLSID(clsid,xclsid);
else {
if (!aclsid)
return 0x80040154;
strcpy(xclsid,aclsid);
}
fprintf(stderr,"SHELL32_102(%p,%s,%p,%s,%p)\n",
aclsid,xclsid,unknownouter,xiid,inst
);
sprintf(buffer,"CLSID\\%s\\InProcServer32",xclsid);
if (RegOpenKeyEx32A(HKEY_CLASSES_ROOT,buffer,0,0x02000000,&inprockey))
return _get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
pathlen=sizeof(path);
if (RegQueryValue32A(inprockey,NULL,path,&pathlen)) {
RegCloseKey(inprockey);
return _get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
}
fprintf(stderr," -> server dll is %s\n",path);
tmodellen=sizeof(tmodel);
type=REG_SZ;
if (RegQueryValueEx32A(inprockey,"ThreadingModel",NULL,&type,tmodel,&tmodellen)) {
RegCloseKey(inprockey);
return _get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
}
fprintf(stderr," -> threading model is %s\n",tmodel);
hres=_get_instance(clsid,path,unknownouter,refiid,inst);
if (hres<0)
hres=_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
RegCloseKey(inprockey);
return hres;
}
/*************************************************************************
* SHELL32_183 [SHELL32.183]
* Format and output errormessage.
*/
void __cdecl SHELL32_183(HMODULE32 hmod,HWND32 hwnd,DWORD id,DWORD x,DWORD type,LPVOID arglist) {
char buf[100],buf2[100],*buf3;
LPVOID args = &arglist;
if (!LoadString32A(hmod,x,buf,100))
strcpy(buf,"Desktop");
LoadString32A(hmod,id,buf2,100);
/* FIXME: the varargs handling doesn't. */
FormatMessage32A(0x500,buf2,0,0,&buf3,256,&args);
fprintf(stderr,"SHELL32_183(%08lx,%08lx,%08lx(%s),%08lx(%s),%08lx,%p),stub!\n",
(DWORD)hmod,(DWORD)hwnd,id,buf2,x,buf,type,arglist
);
MessageBox32A(hwnd,buf3,buf,id|0x10000);
}
/*************************************************************************
* SHELL32_71 [SHELL32.71]
* returns internal shell values in the passed pointers
*/
BOOL32 WINAPI SHELL32_71(LPDWORD x,LPDWORD y) {
fprintf(stderr,"SHELL32_71(%p,%p),stub!\n",x,y);
return TRUE;
}
/*************************************************************************
* SHELL32_72 [SHELL32.72]
* dunno. something with icons
*/
void WINAPI SHELL32_72(LPSTR x,DWORD y,DWORD z) {
fprintf(stderr,"SHELL32_72(%s,%08lx,%08lx),stub!\n",x,y,z);
}
/*************************************************************************
* SHELL32_100 [SHELL32.100]
* walks through policy table, queries <app> key, <type> value, returns
* queried (DWORD) value.
* {0x00001,Explorer,NoRun}
* {0x00002,Explorer,NoClose}
* {0x00004,Explorer,NoSaveSettings}
* {0x00008,Explorer,NoFileMenu}
* {0x00010,Explorer,NoSetFolders}
* {0x00020,Explorer,NoSetTaskbar}
* {0x00040,Explorer,NoDesktop}
* {0x00080,Explorer,NoFind}
* {0x00100,Explorer,NoDrives}
* {0x00200,Explorer,NoDriveAutoRun}
* {0x00400,Explorer,NoDriveTypeAutoRun}
* {0x00800,Explorer,NoNetHood}
* {0x01000,Explorer,NoStartBanner}
* {0x02000,Explorer,RestrictRun}
* {0x04000,Explorer,NoPrinterTabs}
* {0x08000,Explorer,NoDeletePrinter}
* {0x10000,Explorer,NoAddPrinter}
* {0x20000,Explorer,NoStartMenuSubFolders}
* {0x40000,Explorer,MyDocsOnNet}
* {0x80000,WinOldApp,NoRealMode}
*/
DWORD WINAPI SHELL32_100(DWORD pol) {
HKEY xhkey;
fprintf(stderr,"SHELL32_100(%08lx),stub!\n",pol);
if (RegOpenKey32A(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies",&xhkey))
return 0;
/* FIXME: do nothing for now, just return 0 (== "allowed") */
RegCloseKey(xhkey);
return 0;
}
DWORD WINAPI SHELL32_77(DWORD x,DWORD y,DWORD z) {
fprintf(stderr,"SHELL32_77(%08lx,%08lx,%08lx),stub!\n",x,y,z);
return 0;
}
/*************************************************************************
* SHELL32_79 [SHELL32.79]
* create_directory_and_notify(...)
*/
DWORD WINAPI SHELL32_79(LPCSTR dir,LPVOID xvoid) {
fprintf(stderr,"mkdir %s,%p\n",dir,xvoid);
if (!CreateDirectory32A(dir,xvoid))
return FALSE;
/* SHChangeNotify(8,1,dir,0); */
return TRUE;
}
/*************************************************************************
* SHELL32_165 [SHELL32.165]
* create_path_and_notify(...)
*/
DWORD WINAPI SHELL32_165(DWORD x,LPCSTR path) {
if (SHELL32_79(path,(LPVOID)x))
return 0;
fprintf(stderr,"SHELL32_165(%08lx,%s),stub!\n",x,path);
return 0;
}
/*************************************************************************
* SHELL32_29 [SHELL32.29]
* is_rootdir(const char*path)
*/
BOOL32 WINAPI SHELL32_29(LPCSTR x) {
if (!lstrcmp32A(x+1,":\\")) /* "X:\" */
return 1;
if (!lstrcmp32A(x,"\\")) /* "\" */
return 1;
if (x[0]=='\\' && x[1]=='\\') { /* UNC "\\<xx>\" */
int foundbackslash = 0;
x=x+2;
while (*x) {
if (*x++=='\\')
foundbackslash++;
}
if (foundbackslash<=1) /* max 1 \ more ... */
return 1;
}
return 0;
}
/*************************************************************************
* SHELL32_152 [SHELL32.152]
* itemlist_length
*/
DWORD WINAPI SHELL32_152(LPITEMIDLIST iil) {
LPSHITEMID si;
DWORD len;
si = &(iil->mkid);
len = 2;
while (si->cb) {
len += si->cb;
si = (LPSHITEMID)(((char*)si)+si->cb);
}
return len;
}
/*************************************************************************
* SHELL32_196 [SHELL32.196]
* void *task_alloc(DWORD len), uses SHMalloc allocator
*/
LPVOID WINAPI SHELL32_196(DWORD len) {
return (LPVOID)LocalAlloc32(len,LMEM_ZEROINIT); /* FIXME */
}
/*************************************************************************
* SHELL32_18 [SHELL32.18]
* copy_itemidlist()
*/
LPITEMIDLIST WINAPI SHELL32_18(LPITEMIDLIST iil) {
DWORD len;
LPITEMIDLIST newiil;
len = SHELL32_152(iil);
newiil = (LPITEMIDLIST)SHELL32_196(len);
memcpy(newiil,iil,len);
return newiil;
}
/*************************************************************************
* SHELL32_25 [SHELL32.25]
* merge_itemidlist()
*/
LPITEMIDLIST WINAPI SHELL32_25(LPITEMIDLIST iil1,LPITEMIDLIST iil2) {
DWORD len1,len2;
LPITEMIDLIST newiil;
len1 = SHELL32_152(iil1)-2;
len2 = SHELL32_152(iil2);
newiil = SHELL32_196(len1+len2);
memcpy(newiil,iil1,len1);
memcpy(((char*)newiil)+len1,iil2,len2);
return newiil;
}
/*************************************************************************
* SHELL32_16 [SHELL32.16]
* find_lastitem_in_itemidlist()
*/
LPSHITEMID WINAPI SHELL32_16(LPITEMIDLIST iil) {
LPSHITEMID lastsii,sii;
if (!iil)
return NULL;
sii = &(iil->mkid);
lastsii = sii;
while (sii->cb) {
lastsii = sii;
sii = (LPSHITEMID)(((char*)sii)+sii->cb);
}
return lastsii;
}
/*************************************************************************
* SHELL32_195 [SHELL32.195]
* free_ptr() - frees memory using IMalloc
*/
DWORD WINAPI SHELL32_195(LPVOID x) {
return LocalFree32((HANDLE32)x);
}
/*************************************************************************
* SHELL32_155 [SHELL32.155]
* free_check_ptr - frees memory (if not NULL) allocated by SHMalloc allocator
*/
DWORD WINAPI SHELL32_155(LPVOID x) {
if (!x)
return 0;
return SHELL32_195(x);
}
/*************************************************************************
* SHELL32_62 [SHELL32.62]
*/
DWORD WINAPI SHELL32_62(DWORD x,DWORD y,DWORD z,DWORD a) {
fprintf(stderr,"SHELL32_62(%08lx,%08lx,%08lx,%08lx),stub!\n",x,y,z,a);
return 0xffffffff;
}

View File

@ -117,8 +117,14 @@ static VERSION VERSION_GetVersion(void)
if (!pCurrentProcess) /* at startuptime probably */ if (!pCurrentProcess) /* at startuptime probably */
return defaultVersion; return defaultVersion;
if (!pCurrentProcess->exe_modref) if (!pCurrentProcess->exe_modref)
{
/* HACK: if we have loaded a PE image into this address space,
* we are probably using thunks, so Win95 is our best bet
*/
if (pCurrentProcess->modref_list) return WIN95;
return WIN31; /* FIXME: hmm, look at DDB.version ? */ return WIN31; /* FIXME: hmm, look at DDB.version ? */
peheader = pCurrentProcess->exe_modref->pe_module->pe_header; }
peheader = PE_HEADER(pCurrentProcess->exe_modref->module);
if (peheader->OptionalHeader.MajorSubsystemVersion == 4) if (peheader->OptionalHeader.MajorSubsystemVersion == 4)
/* FIXME: NT4 has the same majorversion; add a check here for it. */ /* FIXME: NT4 has the same majorversion; add a check here for it. */
return WIN95; return WIN95;

22
misc/w32scomb.c Normal file
View File

@ -0,0 +1,22 @@
/*
* W32SCOMB
* DLL for Win32s
*
* Copyright (c) 1997 Andreas Mohr
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "windows.h"
#include "module.h"
/***********************************************************************
* Get16DLLAddress (KERNEL32)
*
* rough guesswork, but seems to work
*/
FARPROC16 Get16DLLAddress(HMODULE32 handle, LPSTR name) {
if (!handle) handle=GetModuleHandle16("WIN32S16");
return (FARPROC16)WIN32_GetProcAddress16(handle, name);
}

30
misc/w32skrnl.c Normal file
View File

@ -0,0 +1,30 @@
/*
* W32SKRNL
* DLL for Win32s
*
* Copyright (c) 1997 Andreas Mohr
*/
#include "windows.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
LPSTR WINAPI GetWin32sDirectory()
{
static char *sysdir;
LPSTR text;
sysdir = getenv("winsysdir");
if (!sysdir) return NULL;
strcat(sysdir, "\\WIN32S");
text = HeapAlloc(GetProcessHeap(), 0, strlen(sysdir)+1);
strcpy(text, sysdir);
return text;
}
/* FIXME */
SEGPTR WINAPI _GetThunkBuff()
{
return (SEGPTR)NULL;
}

View File

@ -149,6 +149,7 @@ static INT32 WPRINTF_ParseFormatW( LPCWSTR format, WPRINTF_FORMAT *res )
} }
if (*p == 'l') { res->flags |= WPRINTF_LONG; p++; } if (*p == 'l') { res->flags |= WPRINTF_LONG; p++; }
else if (*p == 'h') { res->flags |= WPRINTF_SHORT; p++; } else if (*p == 'h') { res->flags |= WPRINTF_SHORT; p++; }
else if (*p == 'w') { res->flags |= WPRINTF_WIDE; p++; }
switch((CHAR)*p) switch((CHAR)*p)
{ {
case 'c': case 'c':
@ -162,10 +163,10 @@ static INT32 WPRINTF_ParseFormatW( LPCWSTR format, WPRINTF_FORMAT *res )
res->type = WPR_SIGNED; res->type = WPR_SIGNED;
break; break;
case 's': case 's':
res->type = (res->flags & WPRINTF_SHORT) ? WPR_STRING : WPR_WSTRING; res->type = ((res->flags & WPRINTF_SHORT) && !(res->flags & WPRINTF_WIDE)) ? WPR_STRING : WPR_WSTRING;
break; break;
case 'S': case 'S':
res->type = (res->flags & WPRINTF_LONG) ? WPR_WSTRING : WPR_STRING; res->type = (res->flags & (WPRINTF_LONG|WPRINTF_WIDE)) ? WPR_WSTRING : WPR_STRING;
break; break;
case 'u': case 'u':
res->type = WPR_UNSIGNED; res->type = WPR_UNSIGNED;

View File

@ -114,7 +114,7 @@ int main( int argc, char *argv[] )
if (Options.debug) DEBUG_AddModuleBreakpoints(); if (Options.debug) DEBUG_AddModuleBreakpoints();
Yield(); /* Start the first task */ Yield16(); /* Start the first task */
fprintf( stderr, "WinMain: Should never happen: returned from Yield()\n" ); fprintf( stderr, "WinMain: Should never happen: returned from Yield()\n" );
return 0; return 0;
} }

View File

@ -19,6 +19,7 @@ C_SRCS = \
int26.c \ int26.c \
int2a.c \ int2a.c \
int2f.c \ int2f.c \
int3d.c \
int4b.c \ int4b.c \
int5c.c \ int5c.c \
interrupts.c \ interrupts.c \

38
msdos/int3d.c Normal file
View File

@ -0,0 +1,38 @@
/*
* DOS interrupt 3d handler.
* Copyright 1997 Len White
*/
#include <stdio.h>
#include <stdlib.h>
#include "msdos.h"
#include "miscemu.h"
#include "stddebug.h"
/* #define DEBUG_INT */
#include "debug.h"
/**********************************************************************
* INT_Int3dHandler
*
* Handler for int 3d (FLOATING POINT EMULATION - STANDALONE FWAIT).
*/
void WINAPI INT_Int3dHandler(CONTEXT *context)
{
switch(AH_reg(context))
{
case 0x00:
break;
case 0x02:
case 0x03:
case 0x04:
case 0x05:
case 0xb:
AH_reg(context) = 0;
break;
default:
INT_BARF( context, 0x3d );
}
}

View File

@ -1258,9 +1258,10 @@ void WINAPI GetClipCursor32( RECT32 *rect )
* *
* FIXME: exact parameter sizes * FIXME: exact parameter sizes
*/ */
UINT16 WINAPI LookupIconIdFromDirectoryEx16( CURSORICONDIR *dir, BOOL16 bIcon, INT16 WINAPI LookupIconIdFromDirectoryEx16( LPBYTE xdir, BOOL16 bIcon,
INT16 width, INT16 height, UINT16 cFlag ) INT16 width, INT16 height, UINT16 cFlag )
{ {
CURSORICONDIR *dir = (CURSORICONDIR*)xdir;
UINT16 retVal = 0; UINT16 retVal = 0;
if( dir && !dir->idReserved && (dir->idType & 3) ) if( dir && !dir->idReserved && (dir->idType & 3) )
{ {
@ -1285,31 +1286,41 @@ UINT16 WINAPI LookupIconIdFromDirectoryEx16( CURSORICONDIR *dir, BOOL16 bIcon,
/********************************************************************** /**********************************************************************
* LookupIconIdFromDirectoryEx32 (USER32.379) * LookupIconIdFromDirectoryEx32 (USER32.379)
*/ */
INT32 WINAPI LookupIconIdFromDirectoryEx32( CURSORICONDIR *dir, BOOL32 bIcon, INT32 WINAPI LookupIconIdFromDirectoryEx32( LPBYTE dir, BOOL32 bIcon,
INT32 width, INT32 height, UINT32 cFlag ) INT32 width, INT32 height, UINT32 cFlag )
{ {
return LookupIconIdFromDirectoryEx16( dir, bIcon, width, height, cFlag ); return LookupIconIdFromDirectoryEx16( dir, bIcon, width, height, cFlag );
} }
/********************************************************************** /**********************************************************************
* LookupIconIdFromDirectory (USER32.378) * LookupIconIdFromDirectory (USER.???)
*/ */
INT32 WINAPI LookupIconIdFromDirectory( CURSORICONDIR *dir, BOOL32 bIcon ) INT16 WINAPI LookupIconIdFromDirectory16( LPBYTE dir, BOOL16 bIcon )
{ {
return LookupIconIdFromDirectoryEx16( dir, bIcon, return LookupIconIdFromDirectoryEx16( dir, bIcon,
bIcon ? SYSMETRICS_CXICON : SYSMETRICS_CXCURSOR, bIcon ? SYSMETRICS_CXICON : SYSMETRICS_CXCURSOR,
bIcon ? SYSMETRICS_CYICON : SYSMETRICS_CYCURSOR, bIcon ? 0 : LR_MONOCHROME ); bIcon ? SYSMETRICS_CYICON : SYSMETRICS_CYCURSOR, bIcon ? 0 : LR_MONOCHROME );
} }
/**********************************************************************
* LookupIconIdFromDirectory (USER32.378)
*/
INT32 WINAPI LookupIconIdFromDirectory32( LPBYTE dir, BOOL32 bIcon )
{
return LookupIconIdFromDirectoryEx32( dir, bIcon,
bIcon ? SYSMETRICS_CXICON : SYSMETRICS_CXCURSOR,
bIcon ? SYSMETRICS_CYICON : SYSMETRICS_CYCURSOR, bIcon ? 0 : LR_MONOCHROME );
}
/********************************************************************** /**********************************************************************
* GetIconID (USER.455) * GetIconID (USER.455)
*/ */
WORD WINAPI GetIconID( HGLOBAL16 hResource, DWORD resType ) WORD WINAPI GetIconID( HGLOBAL16 hResource, DWORD resType )
{ {
CURSORICONDIR *lpDir = (CURSORICONDIR *)GlobalLock16(hResource); LPBYTE lpDir = (LPBYTE)GlobalLock16(hResource);
dprintf_cursor( stddeb, "GetIconID: hRes=%04x, entries=%i\n", dprintf_cursor( stddeb, "GetIconID: hRes=%04x, entries=%i\n",
hResource, lpDir ? lpDir->idCount : 0); hResource, lpDir ? ((CURSORICONDIR*)lpDir)->idCount : 0);
switch(resType) switch(resType)
{ {

View File

@ -27,7 +27,7 @@ typedef struct
{ {
DC *dc; DC *dc;
LPCVOID bits; LPCVOID bits;
DWORD lines; int lines;
DWORD infoWidth; DWORD infoWidth;
WORD depth; WORD depth;
WORD infoBpp; WORD infoBpp;
@ -145,7 +145,7 @@ int DIB_BitmapInfoSize( BITMAPINFO * info, WORD coloruse )
* Return 1 for INFOHEADER, 0 for COREHEADER, -1 for error. * Return 1 for INFOHEADER, 0 for COREHEADER, -1 for error.
*/ */
static int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, DWORD *width, static int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, DWORD *width,
DWORD *height, WORD *bpp ) int *height, WORD *bpp )
{ {
if (header->biSize == sizeof(BITMAPINFOHEADER)) if (header->biSize == sizeof(BITMAPINFOHEADER))
{ {
@ -235,50 +235,66 @@ static int *DIB_BuildColorMap( DC *dc, WORD coloruse, WORD depth,
return colorMapping; return colorMapping;
} }
/***********************************************************************
* DIB_SetImageBits_1_Line
*
* Handles a single line of 1 bit data.
*/
static void DIB_SetImageBits_1_Line(DWORD dstwidth, int *colors,
XImage *bmpImage, int h, const BYTE *bits)
{
BYTE pix;
DWORD i, x;
for (i = dstwidth/8, x = 0; (i > 0); i--)
{
pix = *bits++;
XPutPixel( bmpImage, x++, h, colors[pix >> 7] );
XPutPixel( bmpImage, x++, h, colors[(pix >> 6) & 1] );
XPutPixel( bmpImage, x++, h, colors[(pix >> 5) & 1] );
XPutPixel( bmpImage, x++, h, colors[(pix >> 4) & 1] );
XPutPixel( bmpImage, x++, h, colors[(pix >> 3) & 1] );
XPutPixel( bmpImage, x++, h, colors[(pix >> 2) & 1] );
XPutPixel( bmpImage, x++, h, colors[(pix >> 1) & 1] );
XPutPixel( bmpImage, x++, h, colors[pix & 1] );
}
pix = *bits;
switch(dstwidth & 7)
{
case 7: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1;
case 6: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1;
case 5: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1;
case 4: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1;
case 3: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1;
case 2: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1;
case 1: XPutPixel( bmpImage, x++, h, colors[pix >> 7] );
}
}
/*********************************************************************** /***********************************************************************
* DIB_SetImageBits_1 * DIB_SetImageBits_1
* *
* SetDIBits for a 1-bit deep DIB. * SetDIBits for a 1-bit deep DIB.
*/ */
static void DIB_SetImageBits_1( DWORD lines, const BYTE *srcbits, static void DIB_SetImageBits_1( int lines, const BYTE *srcbits,
DWORD srcwidth, DWORD dstwidth, DWORD srcwidth, DWORD dstwidth,
int *colors, XImage *bmpImage ) int *colors, XImage *bmpImage )
{ {
DWORD i, x; int h;
BYTE pix;
const BYTE *bits = srcbits;
/* 32 bit aligned */ /* 32 bit aligned */
DWORD linebytes = ((srcwidth + 31) & ~31) / 8; DWORD linebytes = ((srcwidth + 31) & ~31) / 8;
while (lines--) if (lines > 0) {
{ for (h = lines-1; h >=0; h--) {
for (i = dstwidth/8, x = 0; (i > 0); i--) DIB_SetImageBits_1_Line(dstwidth, colors, bmpImage, h, srcbits);
{ srcbits += linebytes;
pix = *bits++;
XPutPixel( bmpImage, x++, lines, colors[pix >> 7] );
XPutPixel( bmpImage, x++, lines, colors[(pix >> 6) & 1] );
XPutPixel( bmpImage, x++, lines, colors[(pix >> 5) & 1] );
XPutPixel( bmpImage, x++, lines, colors[(pix >> 4) & 1] );
XPutPixel( bmpImage, x++, lines, colors[(pix >> 3) & 1] );
XPutPixel( bmpImage, x++, lines, colors[(pix >> 2) & 1] );
XPutPixel( bmpImage, x++, lines, colors[(pix >> 1) & 1] );
XPutPixel( bmpImage, x++, lines, colors[pix & 1] );
} }
pix = *bits; } else {
switch(dstwidth & 7) for (h = 0; h < lines; h++) {
{ DIB_SetImageBits_1_Line(dstwidth, colors, bmpImage, h, srcbits);
case 7: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1; srcbits += linebytes;
case 6: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
case 5: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
case 4: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
case 3: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
case 2: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
case 1: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] );
} }
srcbits += linebytes;
bits = srcbits;
} }
} }
@ -288,27 +304,39 @@ static void DIB_SetImageBits_1( DWORD lines, const BYTE *srcbits,
* *
* SetDIBits for a 4-bit deep DIB. * SetDIBits for a 4-bit deep DIB.
*/ */
static void DIB_SetImageBits_4( DWORD lines, const BYTE *srcbits, static void DIB_SetImageBits_4( int lines, const BYTE *srcbits,
DWORD srcwidth, DWORD dstwidth, DWORD srcwidth, DWORD dstwidth,
int *colors, XImage *bmpImage ) int *colors, XImage *bmpImage )
{ {
DWORD i, x; DWORD i, x;
int h;
const BYTE *bits = srcbits; const BYTE *bits = srcbits;
/* 32 bit aligned */ /* 32 bit aligned */
DWORD linebytes = ((srcwidth+7)&~7)/2; DWORD linebytes = ((srcwidth+7)&~7)/2;
while (lines--) if (lines > 0) {
{ for (h = lines-1; h >= 0; h--) {
for (i = dstwidth/2, x = 0; i > 0; i--) for (i = dstwidth/2, x = 0; i > 0; i--) {
{ BYTE pix = *bits++;
BYTE pix = *bits++; XPutPixel( bmpImage, x++, h, colors[pix >> 4] );
XPutPixel( bmpImage, x++, lines, colors[pix >> 4] ); XPutPixel( bmpImage, x++, h, colors[pix & 0x0f] );
XPutPixel( bmpImage, x++, lines, colors[pix & 0x0f] ); }
if (dstwidth & 1) XPutPixel( bmpImage, x, h, colors[*bits >> 4] );
srcbits += linebytes;
bits = srcbits;
}
} else {
for (h = 0; h < lines; h++) {
for (i = dstwidth/2, x = 0; i > 0; i--) {
BYTE pix = *bits++;
XPutPixel( bmpImage, x++, h, colors[pix >> 4] );
XPutPixel( bmpImage, x++, h, colors[pix & 0x0f] );
}
if (dstwidth & 1) XPutPixel( bmpImage, x, h, colors[*bits >> 4] );
srcbits += linebytes;
bits = srcbits;
} }
if (dstwidth & 1) XPutPixel( bmpImage, x, lines, colors[*bits >> 4] );
srcbits += linebytes;
bits = srcbits;
} }
} }
@ -324,7 +352,7 @@ static void DIB_SetImageBits_4( DWORD lines, const BYTE *srcbits,
* *
* SetDIBits for a 4-bit deep compressed DIB. * SetDIBits for a 4-bit deep compressed DIB.
*/ */
static void DIB_SetImageBits_RLE4( DWORD lines, const BYTE *bits, DWORD width, static void DIB_SetImageBits_RLE4( int lines, const BYTE *bits, DWORD width,
DWORD dstwidth, int *colors, XImage *bmpImage ) DWORD dstwidth, int *colors, XImage *bmpImage )
{ {
int x = 0, c, length; int x = 0, c, length;
@ -384,22 +412,32 @@ static void DIB_SetImageBits_RLE4( DWORD lines, const BYTE *bits, DWORD width,
* *
* SetDIBits for an 8-bit deep DIB. * SetDIBits for an 8-bit deep DIB.
*/ */
static void DIB_SetImageBits_8( DWORD lines, const BYTE *srcbits, static void DIB_SetImageBits_8( int lines, const BYTE *srcbits,
DWORD srcwidth, DWORD dstwidth, DWORD srcwidth, DWORD dstwidth,
int *colors, XImage *bmpImage ) int *colors, XImage *bmpImage )
{ {
DWORD x; DWORD x;
int h;
const BYTE *bits = srcbits; const BYTE *bits = srcbits;
/* align to 32 bit */ /* align to 32 bit */
DWORD linebytes = (srcwidth + 3) & ~3; DWORD linebytes = (srcwidth + 3) & ~3;
while (lines--) if (lines > 0) {
{ for (h = lines - 1; h >= 0; h--) {
for (x = 0; x < dstwidth; x++) for (x = 0; x < dstwidth; x++, bits++) {
XPutPixel( bmpImage, x, lines, colors[*bits++] ); XPutPixel( bmpImage, x, h, colors[*bits] );
srcbits += linebytes; }
bits = srcbits; bits = (srcbits += linebytes);
}
} else {
lines = -lines;
for (h = 0; h < lines; h++) {
for (x = 0; x < dstwidth; x++, bits++) {
XPutPixel( bmpImage, x, h, colors[*bits] );
}
bits = (srcbits += linebytes);
}
} }
} }
@ -434,7 +472,7 @@ enum Rle8_EscapeCodes
RleDelta = 2 /* Delta */ RleDelta = 2 /* Delta */
}; };
static void DIB_SetImageBits_RLE8( DWORD lines, const BYTE *bits, DWORD width, static void DIB_SetImageBits_RLE8( int lines, const BYTE *bits, DWORD width,
DWORD dstwidth, int *colors, XImage *bmpImage ) DWORD dstwidth, int *colors, XImage *bmpImage )
{ {
int x; /* X-positon on each line. Increases. */ int x; /* X-positon on each line. Increases. */
@ -582,30 +620,124 @@ static void DIB_SetImageBits_RLE8( DWORD lines, const BYTE *bits, DWORD width,
} }
/***********************************************************************
* DIB_SetImageBits_16
*
* SetDIBits for a 16-bit deep DIB.
*/
static void DIB_SetImageBits_16( int lines, const BYTE *srcbits,
DWORD srcwidth, DWORD dstwidth,
DC *dc, XImage *bmpImage )
{
DWORD x;
LPWORD ptr;
WORD val;
int h;
BYTE r, g, b;
/* align to 32 bit */
DWORD linebytes = (srcwidth * 2 + 3) & ~3;
ptr = (LPWORD) srcbits;
if (lines > 0) {
for (h = lines - 1; h >= 0; h--) {
for (x = 0; x < dstwidth; x++, ptr++) {
val = *ptr;
r = (BYTE) ((val & 0x7c00) >> 7);
g = (BYTE) ((val & 0x03e0) >> 2);
b = (BYTE) ((val & 0x001f) << 3);
XPutPixel( bmpImage, x, h,
COLOR_ToPhysical(dc, RGB(r,g,b)) );
}
ptr = (LPWORD) (srcbits += linebytes);
}
} else {
lines = -lines;
for (h = 0; h < lines; h++) {
for (x = 0; x < dstwidth; x++, ptr++) {
val = *ptr;
r = (BYTE) ((val & 0x7c00) >> 7);
g = (BYTE) ((val & 0x03e0) >> 2);
b = (BYTE) ((val & 0x001f) << 3);
XPutPixel( bmpImage, x, h,
COLOR_ToPhysical(dc, RGB(r,g,b)) );
}
ptr = (LPWORD) (srcbits += linebytes);
}
}
}
/*********************************************************************** /***********************************************************************
* DIB_SetImageBits_24 * DIB_SetImageBits_24
* *
* SetDIBits for a 24-bit deep DIB. * SetDIBits for a 24-bit deep DIB.
*/ */
static void DIB_SetImageBits_24( DWORD lines, const BYTE *srcbits, static void DIB_SetImageBits_24( int lines, const BYTE *srcbits,
DWORD srcwidth, DWORD dstwidth, DWORD srcwidth, DWORD dstwidth,
DC *dc, XImage *bmpImage ) DC *dc, XImage *bmpImage )
{ {
DWORD x; DWORD x;
const BYTE *bits = srcbits; const BYTE *bits = srcbits;
int h;
/* align to 32 bit */ /* align to 32 bit */
DWORD linebytes = (srcwidth * 3 + 3) & ~3; DWORD linebytes = (srcwidth * 3 + 3) & ~3;
/* "bits" order is reversed for some reason */ /* "bits" order is reversed for some reason */
while (lines--) if (lines > 0) {
{ for (h = lines - 1; h >= 0; h--) {
for (x = 0; x < dstwidth; x++, bits += 3) for (x = 0; x < dstwidth; x++, bits += 3) {
XPutPixel( bmpImage, x, lines, XPutPixel( bmpImage, x, h,
COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])) ); COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])));
}
bits = (srcbits += linebytes);
}
} else {
lines = -lines;
for (h = 0; h < lines; h++) {
for (x = 0; x < dstwidth; x++, bits += 3) {
XPutPixel( bmpImage, x, h,
COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])));
}
bits = (srcbits += linebytes);
}
}
}
bits = (srcbits += linebytes);
/***********************************************************************
* DIB_SetImageBits_32
*
* SetDIBits for a 32-bit deep DIB.
*/
static void DIB_SetImageBits_32( int lines, const BYTE *srcbits,
DWORD srcwidth, DWORD dstwidth,
DC *dc, XImage *bmpImage )
{
DWORD x;
const BYTE *bits = srcbits;
int h;
DWORD linebytes = (srcwidth * 4);
if (lines > 0) {
for (h = lines - 1; h >= 0; h--) {
for (x = 0; x < dstwidth; x++, bits += 4) {
XPutPixel( bmpImage, x, h,
COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])));
}
bits = (srcbits += linebytes);
}
} else {
for (h = 0; h < lines; h++) {
for (x = 0; x < dstwidth; x++, bits += 4) {
XPutPixel( bmpImage, x, h,
COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])));
}
bits = (srcbits += linebytes);
}
} }
} }
@ -621,6 +753,7 @@ static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
int *colorMapping; int *colorMapping;
XImage *bmpImage; XImage *bmpImage;
DWORD compression = 0; DWORD compression = 0;
int lines;
if (descr->info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) if (descr->info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
compression = descr->info->bmiHeader.biCompression; compression = descr->info->bmiHeader.biCompression;
@ -635,7 +768,9 @@ static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
if( descr->dc->w.flags & DC_DIRTY ) CLIPPING_UpdateGCRegion(descr->dc); if( descr->dc->w.flags & DC_DIRTY ) CLIPPING_UpdateGCRegion(descr->dc);
/* Transfer the pixels */ /* Transfer the pixels */
XCREATEIMAGE(bmpImage, descr->infoWidth, descr->lines, descr->depth ); lines = descr->lines;
if (lines < 0) lines = -lines;
XCREATEIMAGE(bmpImage, descr->infoWidth, lines, descr->depth );
switch(descr->infoBpp) switch(descr->infoBpp)
{ {
@ -657,10 +792,19 @@ static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
else DIB_SetImageBits_8( descr->lines, descr->bits, descr->infoWidth, else DIB_SetImageBits_8( descr->lines, descr->bits, descr->infoWidth,
descr->width, colorMapping, bmpImage ); descr->width, colorMapping, bmpImage );
break; break;
case 15:
case 16:
DIB_SetImageBits_16( descr->lines, descr->bits, descr->infoWidth,
descr->width, descr->dc, bmpImage);
break;
case 24: case 24:
DIB_SetImageBits_24( descr->lines, descr->bits, descr->infoWidth, DIB_SetImageBits_24( descr->lines, descr->bits, descr->infoWidth,
descr->width, descr->dc, bmpImage ); descr->width, descr->dc, bmpImage );
break; break;
case 32:
DIB_SetImageBits_32( descr->lines, descr->bits, descr->infoWidth,
descr->width, descr->dc, bmpImage);
break;
default: default:
fprintf( stderr, "Invalid depth %d for SetDIBits!\n", descr->infoBpp ); fprintf( stderr, "Invalid depth %d for SetDIBits!\n", descr->infoBpp );
break; break;
@ -670,7 +814,7 @@ static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
descr->xSrc, descr->ySrc, descr->xDest, descr->yDest, descr->xSrc, descr->ySrc, descr->xDest, descr->yDest,
descr->width, descr->height ); descr->width, descr->height );
XDestroyImage( bmpImage ); XDestroyImage( bmpImage );
return descr->lines; return lines;
} }
@ -732,7 +876,7 @@ INT32 WINAPI SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
{ {
DIB_SETIMAGEBITS_DESCR descr; DIB_SETIMAGEBITS_DESCR descr;
BITMAPOBJ * bmp; BITMAPOBJ * bmp;
DWORD height; int height, tmpheight;
INT32 result; INT32 result;
/* Check parameters */ /* Check parameters */
@ -755,6 +899,8 @@ INT32 WINAPI SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
GDI_HEAP_UNLOCK( hdc ); GDI_HEAP_UNLOCK( hdc );
return 0; return 0;
} }
tmpheight = height;
if (height < 0) height = -height;
if (!lines || (startscan >= height)) if (!lines || (startscan >= height))
{ {
GDI_HEAP_UNLOCK( hbitmap ); GDI_HEAP_UNLOCK( hbitmap );
@ -764,7 +910,7 @@ INT32 WINAPI SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
if (startscan + lines > height) lines = height - startscan; if (startscan + lines > height) lines = height - startscan;
descr.bits = bits; descr.bits = bits;
descr.lines = lines; descr.lines = tmpheight >= 0 ? lines : -lines;
descr.depth = bmp->bitmap.bmBitsPixel; descr.depth = bmp->bitmap.bmBitsPixel;
descr.info = info; descr.info = info;
descr.coloruse = coloruse; descr.coloruse = coloruse;
@ -807,7 +953,8 @@ INT32 WINAPI SetDIBitsToDevice32(HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
{ {
DIB_SETIMAGEBITS_DESCR descr; DIB_SETIMAGEBITS_DESCR descr;
DC * dc; DC * dc;
DWORD width, height; DWORD width;
int height, tmpheight;
/* Check parameters */ /* Check parameters */
@ -820,6 +967,8 @@ INT32 WINAPI SetDIBitsToDevice32(HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
if (DIB_GetBitmapInfo( &info->bmiHeader, &width, if (DIB_GetBitmapInfo( &info->bmiHeader, &width,
&height, &descr.infoBpp ) == -1) &height, &descr.infoBpp ) == -1)
return 0; return 0;
tmpheight = height;
if (height < 0) height = -height;
if (!lines || (startscan >= height)) return 0; if (!lines || (startscan >= height)) return 0;
if (startscan + lines > height) lines = height - startscan; if (startscan + lines > height) lines = height - startscan;
if (ySrc < startscan) ySrc = startscan; if (ySrc < startscan) ySrc = startscan;
@ -834,7 +983,7 @@ INT32 WINAPI SetDIBitsToDevice32(HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
descr.dc = dc; descr.dc = dc;
descr.bits = bits; descr.bits = bits;
descr.lines = lines; descr.lines = tmpheight >= 0 ? lines : -lines;
descr.infoWidth = width; descr.infoWidth = width;
descr.depth = dc->w.bitsPerPixel; descr.depth = dc->w.bitsPerPixel;
descr.info = info; descr.info = info;
@ -851,7 +1000,92 @@ INT32 WINAPI SetDIBitsToDevice32(HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
return CALL_LARGE_STACK( DIB_SetImageBits, &descr ); return CALL_LARGE_STACK( DIB_SetImageBits, &descr );
} }
/***********************************************************************
* SetDIBColorTable32 (GDI32.311)
*/
UINT32 WINAPI SetDIBColorTable32( HDC32 hdc, UINT32 startpos, UINT32 entries,
RGBQUAD *colors )
{
DC * dc;
PALETTEENTRY * palEntry;
PALETTEOBJ * palette;
RGBQUAD *end;
dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc)
{
dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
if (!dc) return 0;
}
if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC )))
{
return 0;
}
/* Transfer color info */
if (dc->w.bitsPerPixel <= 8) {
palEntry = palette->logpalette.palPalEntry + startpos;
if (startpos + entries > (1 << dc->w.bitsPerPixel)) {
entries = (1 << dc->w.bitsPerPixel) - startpos;
}
for (end = colors + entries; colors < end; palEntry++, colors++)
{
palEntry->peRed = colors->rgbRed;
palEntry->peGreen = colors->rgbGreen;
palEntry->peBlue = colors->rgbBlue;
}
} else {
entries = 0;
}
GDI_HEAP_UNLOCK( dc->w.hPalette );
return entries;
}
/***********************************************************************
* GetDIBColorTable32 (GDI32.169)
*/
UINT32 WINAPI GetDIBColorTable32( HDC32 hdc, UINT32 startpos, UINT32 entries,
RGBQUAD *colors )
{
DC * dc;
PALETTEENTRY * palEntry;
PALETTEOBJ * palette;
RGBQUAD *end;
dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc)
{
dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
if (!dc) return 0;
}
if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC )))
{
return 0;
}
/* Transfer color info */
if (dc->w.bitsPerPixel <= 8) {
palEntry = palette->logpalette.palPalEntry + startpos;
if (startpos + entries > (1 << dc->w.bitsPerPixel)) {
entries = (1 << dc->w.bitsPerPixel) - startpos;
}
for (end = colors + entries; colors < end; palEntry++, colors++)
{
colors->rgbRed = palEntry->peRed;
colors->rgbGreen = palEntry->peGreen;
colors->rgbBlue = palEntry->peBlue;
colors->rgbReserved = 0;
}
} else {
entries = 0;
}
GDI_HEAP_UNLOCK( dc->w.hPalette );
return entries;
}
/*********************************************************************** /***********************************************************************
* GetDIBits16 (GDI.441) * GetDIBits16 (GDI.441)
@ -1018,6 +1252,18 @@ INT32 WINAPI GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
bbits += pad; bbits += pad;
} }
break; break;
case 32:
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;
}
}
break;
default: default:
fprintf(stderr,"GetDIBits*: unsupported depth %d\n", fprintf(stderr,"GetDIBits*: unsupported depth %d\n",
info->bmiHeader.biBitCount info->bmiHeader.biBitCount
@ -1069,10 +1315,12 @@ HBITMAP32 WINAPI CreateDIBitmap32( HDC32 hdc, const BITMAPINFOHEADER *header,
{ {
HBITMAP32 handle; HBITMAP32 handle;
BOOL32 fColor; BOOL32 fColor;
DWORD width, height; DWORD width;
int height;
WORD bpp; WORD bpp;
if (DIB_GetBitmapInfo( header, &width, &height, &bpp ) == -1) return 0; if (DIB_GetBitmapInfo( header, &width, &height, &bpp ) == -1) return 0;
if (height < 0) height = -height;
/* Check if we should create a monochrome or color bitmap. */ /* Check if we should create a monochrome or color bitmap. */
/* We create a monochrome bitmap only if it has exactly 2 */ /* We create a monochrome bitmap only if it has exactly 2 */

View File

@ -1189,3 +1189,21 @@ BOOL32 WINAPI TranslateCharSetInfo(LPDWORD lpSrc,LPCHARSETINFO lpCs,DWORD dwFlag
return TRUE; return TRUE;
} }
/*************************************************************************
* GetFontLanguageInfo (GDI32.182)
*/
DWORD WINAPI GetFontLanguageInfo32(HDC32 hdc) {
/* return value 0 is correct for most cases anyway */
fprintf(stderr,"GetFontLanguageInfo:stub!\n");
return 0;
}
/*************************************************************************
* GetFontLanguageInfo (GDI.616)
*/
DWORD WINAPI GetFontLanguageInfo16(HDC16 hdc) {
/* return value 0 is correct for most cases anyway */
fprintf(stderr,"GetFontLanguageInfo:stub!\n");
return 0;
}

View File

@ -636,7 +636,7 @@ DWORD WINAPI GetTabbedTextExtent32W( HDC32 hdc, LPCWSTR lpstr, INT32 count,
} }
/*********************************************************************** /***********************************************************************
* GetTextCharset (USER32.226) (USER.612) * GetTextCharset (GDI32.226) (GDI.612)
*/ */
INT32 WINAPI GetTextCharset32(HDC32 hdc) INT32 WINAPI GetTextCharset32(HDC32 hdc)
{ {
@ -648,3 +648,15 @@ INT16 WINAPI GetTextCharset16(HDC16 hdc)
{ {
return GetTextCharset32(hdc); return GetTextCharset32(hdc);
} }
/***********************************************************************
* GetTextCharsetInfo (GDI32.381)
*/
INT32 WINAPI GetTextCharsetInfo(HDC32 hdc,LPCHARSETINFO csi,DWORD flags)
{
fprintf(stdnimp,"GetTextCharsetInfo(0x%x,%p,%08lx), stub!\n",hdc,csi,flags);
csi->ciCharset = DEFAULT_CHARSET;
csi->ciACP = GetACP();
/* ... fill fontstruct too ... */
return DEFAULT_CHARSET;
}

21
ole/Makefile.in Normal file
View File

@ -0,0 +1,21 @@
DEFS = @DLLFLAGS@ -D__WINE__
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = ole
C_SRCS = \
compobj.c \
ole2.c \
ole2disp.c \
ole2nls.c \
olecli.c \
olesvr.c
all: $(MODULE).o
@MAKE_RULES@
### Dependencies:

View File

@ -6,6 +6,7 @@
/* At the moment, these are only empty stubs. /* At the moment, these are only empty stubs.
*/ */
#define INITGUID
#include <ctype.h> #include <ctype.h>
#include <stdlib.h> #include <stdlib.h>
@ -15,6 +16,8 @@
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
#include "compobj.h" #include "compobj.h"
#include "interfaces.h"
#include "shlobj.h"
DWORD currentMalloc=0; DWORD currentMalloc=0;
@ -159,7 +162,7 @@ OLESTATUS WINAPI StringFromCLSID(const CLSID *id, LPSTR idstr)
char *s; char *s;
int i; int i;
sprintf(idstr, "{%08lx-%04x-%04x-%2x%2x-", sprintf(idstr, "{%08lx-%04x-%04x-%02x%02x-",
id->Data1, id->Data2, id->Data3, id->Data1, id->Data2, id->Data3,
id->Data4[0], id->Data4[1]); id->Data4[0], id->Data4[1]);
s = &idstr[25]; s = &idstr[25];

View File

@ -46,3 +46,16 @@ HRESULT WINAPI OleFlushClipboard()
return S_OK; return S_OK;
} }
/***********************************************************************
* CoRegisterMessageFilter [OLE32.38]
*/
HRESULT CoRegisterMessageFilter(
LPMESSAGEFILTER lpMessageFilter, /* Pointer to interface */
LPMESSAGEFILTER *lplpMessageFilter /* Indirect pointer to prior instance if non-NULL */
) {
dprintf_ole(stdnimp,"CoRegisterMessageFilter()\n");
if (lplpMessageFilter) {
*lplpMessageFilter = NULL;
}
return S_OK;
}

151
ole/olecli.c Normal file
View File

@ -0,0 +1,151 @@
/*
* OLECLI library
*
* Copyright 1995 Martin von Loewis
*/
/* At the moment, these are only empty stubs.
*/
#include "windows.h"
#include "ole.h"
#include "gdi.h"
#include "stddebug.h"
#include "debug.h"
extern LONG OLE_current_handle;
/***********************************************************************
* OleRegisterClientDoc
*/
OLESTATUS WINAPI OleRegisterClientDoc16(LPCSTR classname, LPCSTR docname,
LONG reserved, LHCLIENTDOC *hRet )
{
fprintf(stdnimp,"OleRegisterClientDoc:%s %s\n",classname,docname);
*hRet=++OLE_current_handle;
return OLE_OK;
}
/***********************************************************************
* OleRegisterClientDoc
*/
OLESTATUS WINAPI OleRegisterClientDoc32(LPCSTR classname, LPCSTR docname,
LONG reserved, LHCLIENTDOC *hRet )
{
fprintf(stdnimp,"OleRegisterClientDoc:%s %s\n",classname,docname);
*hRet=++OLE_current_handle;
return OLE_OK;
}
/***********************************************************************
* OleRenameClientDoc
*/
OLESTATUS WINAPI OleRenameClientDoc16(LHCLIENTDOC hDoc, LPCSTR newName)
{
fprintf(stdnimp,"OleRenameClientDoc: %ld %s\n",hDoc, newName);
return OLE_OK;
}
/***********************************************************************
* OleRenameClientDoc
*/
OLESTATUS WINAPI OleRenameClientDoc32(LHCLIENTDOC hDoc, LPCSTR newName)
{
fprintf(stdnimp,"OleRenameClientDoc: %ld %s\n",hDoc, newName);
return OLE_OK;
}
/***********************************************************************
* OleRevokeClientDoc
*/
OLESTATUS WINAPI OleRevokeClientDoc16(LHCLIENTDOC hServerDoc)
{
fprintf(stdnimp,"OleRevokeClientDoc:%ld\n",hServerDoc);
return OLE_OK;
}
/***********************************************************************
* OleRevokeClientDoc
*/
OLESTATUS WINAPI OleRevokeClientDoc32(LHCLIENTDOC hServerDoc)
{
fprintf(stdnimp,"OleRevokeClientDoc:%ld\n",hServerDoc);
return OLE_OK;
}
/***********************************************************************
* OleCreateLinkFromClip32
*/
OLESTATUS WINAPI OleCreateLinkFromClip32(
LPCSTR name,LPOLECLIENT olecli,LHCLIENTDOC hclientdoc,LPCSTR xname,
LPOLEOBJECT *lpoleob,OLEOPT_RENDER render,OLECLIPFORMAT clipformat
) {
fprintf(stdnimp,"OleCreateLinkFromClip(%s,%p,%08lx,%s,%p,%d,%ld),stub!\n",
name,olecli,hclientdoc,xname,lpoleob,render,clipformat
);
return OLE_OK;
}
/***********************************************************************
* OleQueryLinkFromClip32
*/
OLESTATUS WINAPI OleQueryLinkFromClip32(LPCSTR name,OLEOPT_RENDER render,OLECLIPFORMAT clipformat) {
fprintf(stdnimp,"OleQueryLinkFromClip(%s,%d,%ld),stub!\n",
name,render,clipformat
);
return OLE_OK;
}
/***********************************************************************
* OleQueryCreateFromClip32
*/
OLESTATUS WINAPI OleQueryCreateFromClip32(LPCSTR name,OLEOPT_RENDER render,OLECLIPFORMAT clipformat) {
fprintf(stdnimp,"OleQueryCreateFromClip(%s,%d,%ld),stub!\n",
name,render,clipformat
);
return OLE_OK;
}
/***********************************************************************
* OleIsDcMeta
*/
BOOL16 WINAPI OleIsDcMeta(HDC16 hdc)
{
dprintf_ole(stddeb,"OleIsDCMeta(%04x)\n",hdc);
return GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC ) != 0;
}
/***********************************************************************
* OleSetHostNames
*/
OLESTATUS WINAPI OleSetHostNames32(LPOLEOBJECT oleob,LPCSTR name1,LPCSTR name2) {
fprintf(stdnimp,"OleSetHostNames(%p,%s,%s),stub\n",oleob,name1,name2);
return OLE_OK;
}
/***********************************************************************
* OleQueryType32
*/
OLESTATUS WINAPI OleQueryType32(LPOLEOBJECT oleob,LONG*xlong) {
fprintf(stdnimp,"OleQueryType(%p,%p),stub!\n",oleob,xlong);
if (!oleob)
return 0x10;
fprintf(stddeb,"Calling OLEOBJECT.QueryType (%p) (%p,%p)\n",
oleob->lpvtbl->QueryType,oleob,xlong
);
return oleob->lpvtbl->QueryType(oleob,xlong);
}
/***********************************************************************
* OleCreateFromClip
*/
OLESTATUS WINAPI OleCreateFromClip32(
LPCSTR name,LPOLECLIENT olecli,LHCLIENTDOC hclientdoc,LPCSTR xname,
LPOLEOBJECT *lpoleob,OLEOPT_RENDER render, OLECLIPFORMAT clipformat
) {
fprintf(stdnimp,"OleCreateLinkFromClip(%s,%p,%08lx,%s,%p,%d,%ld),stub!\n",
name,olecli,hclientdoc,xname,lpoleob,render,clipformat
);
/* clipb type, object kreieren entsprechend etc. */
return OLE_OK;
}

134
ole/olesvr.c Normal file
View File

@ -0,0 +1,134 @@
/*
* OLESVR library
*
* Copyright 1995 Martin von Loewis
*/
/* At the moment, these are only empty stubs.
*/
#include "windows.h"
#include "ole.h"
#include "stddebug.h"
#include "debug.h"
LONG OLE_current_handle;
/***********************************************************************
* OleRegisterServer
*/
OLESTATUS WINAPI OleRegisterServer16( LPCSTR name, LPOLESERVER serverStruct,
LHSERVER *hRet, HINSTANCE16 hServer,
OLE_SERVER_USE use )
{
dprintf_ole(stdnimp,"OleRegisterServer:%s\n",name);
*hRet=++OLE_current_handle;
/* return OLE_ERROR_MEMORY, OLE_ERROR_PROTECT_ONLY if you want it fail*/
return OLE_OK;
}
/***********************************************************************
* OleBlockServer
*/
OLESTATUS WINAPI OleBlockServer16(LHSERVER hServer)
{
fprintf(stdnimp,"OleBlockServer:%ld\n",hServer);
return OLE_OK;
}
/***********************************************************************
* OleBlockServer
*/
OLESTATUS WINAPI OleBlockServer32(LHSERVER hServer)
{
fprintf(stdnimp,"OleBlockServer:%ld\n",hServer);
return OLE_OK;
}
/***********************************************************************
* OleUnblockServer
*/
OLESTATUS WINAPI OleUnblockServer16(LHSERVER hServer, BOOL16 *block)
{
fprintf(stdnimp,"OleUnblockServer:%ld\n",hServer);
/* no more blocked messages :) */
*block=FALSE;
return OLE_OK;
}
/***********************************************************************
* OleUnblockServer
*/
OLESTATUS WINAPI OleUnblockServer32(LHSERVER hServer, BOOL32 *block)
{
fprintf(stdnimp,"OleUnblockServer:%ld\n",hServer);
/* no more blocked messages :) */
*block=FALSE;
return OLE_OK;
}
/***********************************************************************
* OleRegisterServerDoc
*/
OLESTATUS WINAPI OleRegisterServerDoc16( LHSERVER hServer, LPCSTR docname,
LPOLESERVERDOC document,
LHSERVERDOC *hRet)
{
dprintf_ole(stdnimp,"OleRegisterServerDoc:%ld,%s\n", hServer, docname);
*hRet=++OLE_current_handle;
return OLE_OK;
}
/***********************************************************************
* OleRevokeServerDoc
*/
OLESTATUS WINAPI OleRevokeServerDoc16(LHSERVERDOC hServerDoc)
{
dprintf_ole(stdnimp,"OleRevokeServerDoc:%ld\n",hServerDoc);
return OLE_OK;
}
/***********************************************************************
* OleRevokeServerDoc
*/
OLESTATUS WINAPI OleRevokeServerDoc32(LHSERVERDOC hServerDoc)
{
fprintf(stdnimp,"OleRevokeServerDoc:%ld\n",hServerDoc);
return OLE_OK;
}
/***********************************************************************
* OleRevokeServer
*/
OLESTATUS WINAPI OleRevokeServer(LHSERVER hServer)
{
dprintf_ole(stdnimp,"OleRevokeServer:%ld\n",hServer);
return OLE_OK;
}
OLESTATUS WINAPI OleRegisterServer32(LPCSTR svrname,LPOLESERVER olesvr,LHSERVER* hRet,HINSTANCE32 hinst,OLE_SERVER_USE osu) {
fprintf(stderr,"OleRegisterServer(%s,%p,%p,%08x,%d),stub!\n",
svrname,olesvr,hRet,hinst,osu
);
*hRet=++OLE_current_handle;
return OLE_OK;
}
OLESTATUS WINAPI OleRegisterServerDoc32( LHSERVER hServer, LPCSTR docname,
LPOLESERVERDOC document,
LHSERVERDOC *hRet)
{
fprintf(stdnimp,"OleRegisterServerDoc:%ld,%s\n", hServer, docname);
*hRet=++OLE_current_handle;
return OLE_OK;
}
/***********************************************************************
* OleRenameServerDoc32
*
*/
OLESTATUS WINAPI OleRenameServerDoc32(LHSERVERDOC hDoc, LPCSTR newName)
{
fprintf(stderr,"OleRenameServerDoc: %ld %s; stub.\n",hDoc, newName);
return OLE_OK;
}

Some files were not shown because too many files have changed in this diff Show More