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:
parent
a0b2b1d0f6
commit
e658d82093
18
ANNOUNCE
18
ANNOUNCE
|
@ -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
|
||||
features. Most applications still do not work correctly.
|
||||
|
||||
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
|
||||
forget to include a ChangeLog entry.
|
||||
|
||||
WHAT'S NEW with Wine-971116: (see ChangeLog for details)
|
||||
- Emulator and library unification.
|
||||
- New About dialog.
|
||||
- Menus improvements.
|
||||
WHAT'S NEW with Wine-971130: (see ChangeLog for details)
|
||||
- Better Win32s support.
|
||||
- Lots of new Win32 functions.
|
||||
- DIB handling improvements.
|
||||
- Lots of bug fixes.
|
||||
|
||||
See the README file in the distribution for installation instructions.
|
||||
|
@ -17,10 +17,10 @@ Because of lags created by using mirror, this message may reach you before
|
|||
the release is available at the ftp sites. The sources will be available
|
||||
from the following locations:
|
||||
|
||||
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-971116.tar.gz
|
||||
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-971116.tar.gz
|
||||
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-971116.tar.gz
|
||||
ftp://ftp.progsoc.uts.edu.au/pub/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-971130.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-971130.tar.gz
|
||||
|
||||
It should also be available from any site that mirrors tsx-11 or sunsite.
|
||||
|
||||
|
|
6
AUTHORS
6
AUTHORS
|
@ -11,6 +11,7 @@ Martin Ayotte,
|
|||
Peter Bajusz,
|
||||
Georg Beyerle,
|
||||
Ross Biro,
|
||||
Martin Boehme,
|
||||
Uwe Bonnes,
|
||||
Erik Bos,
|
||||
Fons Botman,
|
||||
|
@ -18,12 +19,14 @@ John Brezak,
|
|||
Andrew Bulhak,
|
||||
John Burton,
|
||||
Niels de Carpentier,
|
||||
Gordon Chaffee,
|
||||
Jimen Ching,
|
||||
David A. Cuthbert,
|
||||
Huw D. M. Davies,
|
||||
Roman Dolejsi,
|
||||
Frans van Dorsselaer,
|
||||
Chris Faherty,
|
||||
Carsten Fallesen,
|
||||
Paul Falstad,
|
||||
David Faure,
|
||||
Claus Fischer,
|
||||
|
@ -71,6 +74,7 @@ Steffen Moeller,
|
|||
Andreas Mohr,
|
||||
Philippe De Muyter,
|
||||
Itai Nahshon,
|
||||
Kristian Nielsen,
|
||||
Henrik Olsen,
|
||||
Michael Patra,
|
||||
Dimitrie O. Paun,
|
||||
|
@ -114,11 +118,13 @@ Ronan Waide,
|
|||
Eric Warnke,
|
||||
Manfred Weichel,
|
||||
Morten Welinder,
|
||||
Len White,
|
||||
Lawson Whitney,
|
||||
Jan Willamowius,
|
||||
Carl Williams,
|
||||
Karl Guenter Wuensch,
|
||||
Eric Youngdale,
|
||||
James Youngman,
|
||||
Nikita V. Youshchenko,
|
||||
Mikolaj Zalewski,
|
||||
and John Zero.
|
||||
|
|
10
BUGS
10
BUGS
|
@ -9,10 +9,6 @@ As of Nov 1997 -
|
|||
|
||||
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.
|
||||
|
||||
* No thread/process scheduling support in Win32 code.
|
||||
|
@ -38,9 +34,11 @@ Miscellaneous:
|
|||
|
||||
* 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
|
||||
(doesn't reflect the fact that bits are packed and 16-bit aligned).
|
||||
|
|
133
ChangeLog
133
ChangeLog
|
@ -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>
|
||||
|
||||
|
@ -78,7 +209,7 @@ Fri Nov 7 19:44:26 1997 Olaf Flebbe <o.flebbe@science-computing.de>
|
|||
* [loader/resource.c] [user32.spec]
|
||||
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]
|
||||
(GetDiskFreeSpace32A): Cap at 2GB.
|
||||
|
|
10
Makefile.in
10
Makefile.in
|
@ -37,6 +37,7 @@ LIBSUBDIRS = \
|
|||
msdos \
|
||||
multimedia \
|
||||
objects \
|
||||
ole \
|
||||
resources \
|
||||
scheduler \
|
||||
win32 \
|
||||
|
@ -79,6 +80,7 @@ LIBOBJS = \
|
|||
msdos/msdos.o \
|
||||
multimedia/multimedia.o \
|
||||
objects/objects.o \
|
||||
ole/ole.o \
|
||||
resources/resources.o \
|
||||
scheduler/scheduler.o \
|
||||
win32/win32.o \
|
||||
|
@ -98,18 +100,18 @@ install:: install_$(MAIN_TARGET)
|
|||
|
||||
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)
|
||||
nm -n wine | grep -v _compiled >wine.sym
|
||||
|
||||
libwine.a: $(LIBSUBDIRS) dummy
|
||||
libwine.a: $(LIBOBJS)
|
||||
$(RM) $@
|
||||
$(AR) $@ $(LIBOBJS)
|
||||
$(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)
|
||||
|
||||
install_emu: dummy
|
||||
|
|
|
@ -2521,9 +2521,11 @@ miscemu/Makefile
|
|||
msdos/Makefile
|
||||
multimedia/Makefile
|
||||
objects/Makefile
|
||||
ole/Makefile
|
||||
programs/Makefile
|
||||
programs/progman/Makefile
|
||||
programs/winhelp/Makefile
|
||||
programs/winver/Makefile
|
||||
rc/Makefile
|
||||
resources/Makefile
|
||||
scheduler/Makefile
|
||||
|
@ -2643,9 +2645,11 @@ miscemu/Makefile
|
|||
msdos/Makefile
|
||||
multimedia/Makefile
|
||||
objects/Makefile
|
||||
ole/Makefile
|
||||
programs/Makefile
|
||||
programs/progman/Makefile
|
||||
programs/winhelp/Makefile
|
||||
programs/winver/Makefile
|
||||
rc/Makefile
|
||||
resources/Makefile
|
||||
scheduler/Makefile
|
||||
|
|
|
@ -146,9 +146,11 @@ miscemu/Makefile
|
|||
msdos/Makefile
|
||||
multimedia/Makefile
|
||||
objects/Makefile
|
||||
ole/Makefile
|
||||
programs/Makefile
|
||||
programs/progman/Makefile
|
||||
programs/winhelp/Makefile
|
||||
programs/winver/Makefile
|
||||
rc/Makefile
|
||||
resources/Makefile
|
||||
scheduler/Makefile
|
||||
|
|
|
@ -363,6 +363,9 @@ static void CBPaintButton(LPHEADCOMBO lphc, HDC16 hdc)
|
|||
UINT32 x, y;
|
||||
BOOL32 bBool;
|
||||
|
||||
if( lphc->wState & CBF_NOREDRAW )
|
||||
return;
|
||||
|
||||
hPrevBrush = (HBRUSH32)SelectObject32(hdc, sysColorObjects.hbrushBtnFace);
|
||||
CONV_RECT16TO32( &lphc->RectButton, &r );
|
||||
|
||||
|
@ -401,6 +404,9 @@ static void CBPaintText(LPHEADCOMBO lphc, HDC16 hdc)
|
|||
INT32 id, size = 0;
|
||||
LPSTR pText = NULL;
|
||||
|
||||
if( lphc->wState & CBF_NOREDRAW )
|
||||
return;
|
||||
|
||||
/* follow Windows combobox that sends a bunch of text
|
||||
* inquiries to its listbox while processing WM_PAINT. */
|
||||
|
||||
|
@ -508,7 +514,7 @@ static LRESULT COMBO_Paint(LPHEADCOMBO lphc, HDC16 hParamDC)
|
|||
|
||||
hDC = (hParamDC) ? hParamDC
|
||||
: BeginPaint16( lphc->self->hwndSelf, &ps);
|
||||
if( hDC && !(lphc->self->flags & WIN_NO_REDRAW) )
|
||||
if( hDC && !(lphc->wState & CBF_NOREDRAW) )
|
||||
{
|
||||
HBRUSH32 hPrevBrush, hBkgBrush;
|
||||
|
||||
|
@ -673,11 +679,14 @@ static void CBDropDown( LPHEADCOMBO lphc )
|
|||
|
||||
SetWindowPos32( lphc->hWndLBox, HWND_TOP, rect.left, rect.top,
|
||||
rect.right - rect.left, rect.bottom - rect.top,
|
||||
SWP_NOACTIVATE | SWP_NOSIZE );
|
||||
if( pRect )
|
||||
RedrawWindow16( lphc->self->hwndSelf, pRect, 0, RDW_INVALIDATE |
|
||||
SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOREDRAW);
|
||||
if( !(lphc->wState & CBF_NOREDRAW) )
|
||||
{
|
||||
if( pRect )
|
||||
RedrawWindow16( lphc->self->hwndSelf, pRect, 0, RDW_INVALIDATE |
|
||||
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;
|
||||
}
|
||||
|
||||
if( bButton )
|
||||
if( bButton && !(lphc->wState & CBF_NOREDRAW) )
|
||||
RedrawWindow16( hWnd, &rect, 0, RDW_INVALIDATE |
|
||||
RDW_ERASE | RDW_UPDATENOW | RDW_NOCHILDREN );
|
||||
CB_NOTIFY( lphc, CBN_CLOSEUP );
|
||||
|
@ -1036,7 +1045,7 @@ static void CBResetPos( LPHEADCOMBO lphc, LPRECT16 lbRect, BOOL32 bRedraw )
|
|||
lphc->RectEdit.bottom - lphc->RectEdit.top,
|
||||
SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW );
|
||||
lphc->wState &= ~CBF_NORESIZE;
|
||||
if( bRedraw )
|
||||
if( bRedraw && !(lphc->wState & CBF_NOREDRAW) )
|
||||
RedrawWindow32( lphc->self->hwndSelf, NULL, 0,
|
||||
RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW );
|
||||
}
|
||||
|
@ -1336,6 +1345,11 @@ LRESULT WINAPI ComboWndProc( HWND32 hwnd, UINT32 message,
|
|||
return TRUE;
|
||||
|
||||
case WM_SETREDRAW:
|
||||
if( wParam )
|
||||
lphc->wState &= ~CBF_NOREDRAW;
|
||||
else
|
||||
lphc->wState |= CBF_NOREDRAW;
|
||||
|
||||
if( lphc->wState & CBF_EDIT )
|
||||
SendMessage32A( lphc->hWndEdit, message, wParam, lParam );
|
||||
SendMessage32A( lphc->hWndLBox, message, wParam, lParam );
|
||||
|
|
108
controls/edit.c
108
controls/edit.c
|
@ -84,6 +84,8 @@ typedef struct
|
|||
INT32 left_margin; /* in pixels */
|
||||
INT32 right_margin; /* in pixels */
|
||||
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;
|
||||
EDITWORDBREAKPROC32A word_break_proc32A;
|
||||
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_index = 0;
|
||||
LINEDEF *line_def = es->first_line_def;
|
||||
INT32 low, high;
|
||||
while ((line > 0) && line_def->next) {
|
||||
line_index += line_def->length;
|
||||
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);
|
||||
if (es->font)
|
||||
old_font = SelectObject32(dc, es->font);
|
||||
/* FIXME: inefficient algorithm */
|
||||
for (index = line_index + 1 ; index < line_index + line_def->net_length ; index++)
|
||||
if (LOWORD(GetTabbedTextExtent32A(dc, es->text + line_index,
|
||||
index - line_index, es->tabs_count, es->tabs)) >= x)
|
||||
break;
|
||||
low = line_index + 1;
|
||||
high = line_index + line_def->net_length + 1;
|
||||
while (low < high - 1)
|
||||
{
|
||||
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)
|
||||
*after_wrap = ((index == line_index + line_def->net_length) &&
|
||||
(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;
|
||||
dy = (es->y_offset - nyoff) * es->line_height;
|
||||
if (dx || dy) {
|
||||
if (!(wnd->flags & WIN_NO_REDRAW)) {
|
||||
RECT32 rc1;
|
||||
RECT32 rc;
|
||||
GetClientRect32(wnd->hwndSelf, &rc1);
|
||||
IntersectRect32(&rc, &rc1, &es->format_rect);
|
||||
ScrollWindowEx32(wnd->hwndSelf, -dx, dy,
|
||||
NULL, &rc, (HRGN32)NULL, NULL, SW_INVALIDATE);
|
||||
}
|
||||
RECT32 rc1;
|
||||
RECT32 rc;
|
||||
GetClientRect32(wnd->hwndSelf, &rc1);
|
||||
IntersectRect32(&rc, &rc1, &es->format_rect);
|
||||
ScrollWindowEx32(wnd->hwndSelf, -dx, dy,
|
||||
NULL, &rc, (HRGN32)NULL, NULL, SW_INVALIDATE);
|
||||
es->y_offset = nyoff;
|
||||
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);
|
||||
|
||||
/* 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_UPDATE;
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -2569,8 +2573,7 @@ static void EDIT_EM_SetHandle16(WND *wnd, EDITSTATE *es, HLOCAL16 hloc)
|
|||
es->flags &= ~EF_MODIFIED;
|
||||
es->flags &= ~EF_UPDATE;
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -2612,16 +2615,16 @@ static void EDIT_EM_SetMargins(WND *wnd, EDITSTATE *es, INT32 action, INT32 left
|
|||
* FIXME: do some GetABCCharWidth, or so
|
||||
* This is just preliminary
|
||||
*/
|
||||
es->left_margin = es->right_margin = es->char_width;
|
||||
es->left_margin = es->right_margin = es->char_width/4;
|
||||
} else
|
||||
es->left_margin = es->right_margin = es->char_width;
|
||||
return;
|
||||
es->left_margin = es->right_margin = es->char_width/4;
|
||||
} else {
|
||||
if (action & EC_LEFTMARGIN)
|
||||
es->left_margin = left;
|
||||
if (action & EC_RIGHTMARGIN)
|
||||
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;
|
||||
else
|
||||
es->flags &= ~EF_AFTER_WRAP;
|
||||
if (!(wnd->flags & WIN_NO_REDRAW)) {
|
||||
if (es->flags & EF_FOCUSED) {
|
||||
LRESULT pos = EDIT_EM_PosFromChar(wnd, es, end, after_wrap);
|
||||
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);
|
||||
if (es->flags & EF_FOCUSED) {
|
||||
LRESULT pos = EDIT_EM_PosFromChar(wnd, es, end, after_wrap);
|
||||
SetCaretPos32(SLOWORD(pos), SHIWORD(pos));
|
||||
}
|
||||
/* 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);
|
||||
EDIT_EM_SetSel(wnd, es, (keys & MK_SHIFT) ? es->selection_start : e, e, after_wrap);
|
||||
EDIT_EM_ScrollCaret(wnd, es);
|
||||
es->region_posx = es->region_posx = 0;
|
||||
SetTimer32(wnd->hwndSelf, 0, 100, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
@ -3508,6 +3524,7 @@ static LRESULT EDIT_WM_MouseMove(WND *wnd, EDITSTATE *es, DWORD keys, INT32 x, I
|
|||
{
|
||||
INT32 e;
|
||||
BOOL32 after_wrap;
|
||||
INT32 prex, prey;
|
||||
|
||||
if (GetCapture32() != wnd->hwndSelf)
|
||||
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
|
||||
* area. Maybe reset the timer ?
|
||||
*/
|
||||
prex = x; prey = 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);
|
||||
EDIT_EM_SetSel(wnd, es, es->selection_start, e, after_wrap);
|
||||
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);
|
||||
if (es->style & ES_MULTILINE)
|
||||
EDIT_BuildLineDefs_ML(wnd, es);
|
||||
if (redraw && !(wnd->flags & WIN_NO_REDRAW))
|
||||
if (redraw)
|
||||
InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
|
||||
if (es->flags & EF_FOCUSED) {
|
||||
LRESULT pos;
|
||||
|
@ -3701,6 +3721,7 @@ static void EDIT_WM_SetText(WND *wnd, EDITSTATE *es, LPCSTR text)
|
|||
if (text) {
|
||||
dprintf_edit(stddeb, "\t'%s'\n", text);
|
||||
EDIT_EM_ReplaceSel(wnd, es, FALSE, text);
|
||||
es->x_offset = 0;
|
||||
}
|
||||
es->flags |= EF_MODIFIED;
|
||||
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)
|
||||
{
|
||||
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);
|
||||
*/
|
||||
}
|
||||
|
|
|
@ -118,13 +118,11 @@ SW_SetText(STATUSWINDOWINFO *self, HWND32 hwnd, WPARAM32 wParam, LPARAM lParam)
|
|||
part_num = ((INT32) wParam) & 0x00ff;
|
||||
style = ((INT32) wParam) & 0xff00;
|
||||
|
||||
if (part_num >= 255)
|
||||
return FALSE;
|
||||
|
||||
if ((self->simple) || (part_num==255))
|
||||
if ((self->simple) || (self->parts==NULL) || (part_num==255))
|
||||
part = &self->part0;
|
||||
else
|
||||
part = &self->parts[part_num];
|
||||
if (!part) return FALSE;
|
||||
part->style = style;
|
||||
if (style == SBT_OWNERDRAW) {
|
||||
part->text = text;
|
||||
|
|
|
@ -347,19 +347,18 @@ void DEBUG_AddModuleBreakpoints(void)
|
|||
|
||||
if (pModule->flags & NE_FFLAGS_WIN32) /* PE module */
|
||||
{
|
||||
PE_MODULE *pe = pModule->pe_module;
|
||||
PE_MODREF *pem;
|
||||
if (!pCurrentProcess) continue;
|
||||
pem = pCurrentProcess->modref_list;
|
||||
while (pem)
|
||||
{
|
||||
if (pem->pe_module == pe) break;
|
||||
if (pem->module == pModule->module32) break;
|
||||
pem = pem->next;
|
||||
}
|
||||
if (!pem) continue;
|
||||
addr.seg = 0;
|
||||
addr.off = pem->load_addr +
|
||||
(DWORD)pe->pe_header->OptionalHeader.AddressOfEntryPoint;
|
||||
addr.off = (DWORD)RVA_PTR( pem->module,
|
||||
OptionalHeader.AddressOfEntryPoint );
|
||||
fprintf( stderr, "Win32 task '%s': ", entry.szModule );
|
||||
DEBUG_AddBreakpoint( &addr );
|
||||
}
|
||||
|
|
|
@ -418,13 +418,10 @@ DEBUG_EvalExpr(struct expr * exp)
|
|||
exp->un.rgister.result = DEBUG_GetRegister(exp->un.rgister.reg);
|
||||
rtn.off = (unsigned int) &exp->un.rgister.result;
|
||||
if( exp->un.rgister.reg == REG_EIP )
|
||||
{
|
||||
rtn.seg = CS_reg(&DEBUG_context);
|
||||
}
|
||||
else
|
||||
{
|
||||
rtn.seg = DS_reg(&DEBUG_context);
|
||||
}
|
||||
DBG_FIX_ADDR_SEG( &rtn, 0 );
|
||||
break;
|
||||
case EXPR_TYPE_BINOP:
|
||||
exp1 = DEBUG_EvalExpr(exp->un.binop.exp1);
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
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;
|
||||
char buffer[256];
|
||||
int i, j;
|
||||
IMAGE_SECTION_HEADER *pe_seg;
|
||||
IMAGE_EXPORT_DIRECTORY *exports;
|
||||
IMAGE_DATA_DIRECTORY *debug_dir;
|
||||
DWORD load_addr;
|
||||
WORD *ordinals;
|
||||
void **functions;
|
||||
const char **names;
|
||||
|
||||
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;
|
||||
load_addr = pem->load_addr;
|
||||
exports = pem->pe_export;
|
||||
|
||||
addr.seg = 0;
|
||||
|
@ -814,22 +813,24 @@ static void DEBUG_LoadEntryPoints32( PE_MODULE *pe, const char *name )
|
|||
|
||||
/* Add start of DLL */
|
||||
|
||||
addr.off = load_addr;
|
||||
addr.off = hModule;
|
||||
DEBUG_AddSymbol( name, &addr, NULL, SYM_WIN32 | SYM_FUNC );
|
||||
|
||||
/* Add entry point */
|
||||
|
||||
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 );
|
||||
|
||||
/* 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 );
|
||||
addr.off = RVA( pe->pe_seg[i].VirtualAddress );
|
||||
sprintf( buffer, "%s.%s", name, pe_seg->Name );
|
||||
addr.off = RVA(pe_seg->VirtualAddress );
|
||||
DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
|
||||
pe_seg++;
|
||||
}
|
||||
|
||||
/* 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_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)
|
||||
DEBUG_RegisterDebugInfo( pe, load_addr, name,
|
||||
DEBUG_RegisterDebugInfo( hModule, name,
|
||||
debug_dir->VirtualAddress, debug_dir->Size );
|
||||
#undef RVA
|
||||
}
|
||||
|
@ -884,10 +885,7 @@ void DEBUG_LoadEntryPoints(void)
|
|||
fprintf( stderr, " %s", entry.szModule );
|
||||
|
||||
if (pModule->flags & NE_FFLAGS_WIN32) /* PE module */
|
||||
{
|
||||
if (pModule->flags & NE_FFLAGS_BUILTIN) continue;
|
||||
DEBUG_LoadEntryPoints32( pModule->pe_module, entry.szModule );
|
||||
}
|
||||
DEBUG_LoadEntryPoints32( pModule->module32, entry.szModule );
|
||||
else /* NE module */
|
||||
DEBUG_LoadEntryPoints16( entry.hModule, pModule, entry.szModule );
|
||||
}
|
||||
|
|
|
@ -509,8 +509,8 @@ struct deferred_debug_info
|
|||
char * module_name;
|
||||
char * dbg_info;
|
||||
int dbg_size;
|
||||
HMODULE32 module;
|
||||
LPIMAGE_DEBUG_DIRECTORY dbgdir;
|
||||
struct pe_data * pe;
|
||||
LPIMAGE_SECTION_HEADER sectp;
|
||||
int nsect;
|
||||
short int dbg_index;
|
||||
|
@ -881,8 +881,8 @@ DEBUG_InitCVDataTypes()
|
|||
* We don't fully process it here for performance reasons.
|
||||
*/
|
||||
int
|
||||
DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
|
||||
const char *module_name, u_long v_addr, u_long size)
|
||||
DEBUG_RegisterDebugInfo( HMODULE32 hModule, const char *module_name,
|
||||
u_long v_addr, u_long size)
|
||||
{
|
||||
int has_codeview = FALSE;
|
||||
int rtn = FALSE;
|
||||
|
@ -891,7 +891,7 @@ DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
|
|||
struct deferred_debug_info * deefer;
|
||||
|
||||
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++ )
|
||||
{
|
||||
switch(dbgptr->Type)
|
||||
|
@ -904,7 +904,7 @@ DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
|
|||
}
|
||||
|
||||
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++ )
|
||||
{
|
||||
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.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
deefer = (struct deferred_debug_info *) xmalloc(sizeof(*deefer));
|
||||
deefer->pe = pe;
|
||||
|
||||
deefer->dbg_info = NULL;
|
||||
deefer->dbg_size = 0;
|
||||
deefer->module = hModule;
|
||||
deefer->load_addr = (char *)hModule;
|
||||
deefer->dbg_info = NULL;
|
||||
deefer->dbg_size = 0;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
deefer->dbg_size = dbgptr->SizeOfData;
|
||||
deefer->dbg_info = (char *)(pe->mappeddll+dbgptr->PointerToRawData);
|
||||
deefer->load_addr = (char *) load_addr;
|
||||
deefer->dbg_info = (char *)(hModule + dbgptr->PointerToRawData);
|
||||
deefer->dbgdir = dbgptr;
|
||||
deefer->next = dbglist;
|
||||
deefer->loaded = FALSE;
|
||||
deefer->dbg_index = DEBUG_next_index;
|
||||
deefer->module_name = xstrdup(module_name);
|
||||
|
||||
deefer->sectp = pe->pe_seg;
|
||||
deefer->nsect = pe->pe_header->FileHeader.NumberOfSections;
|
||||
deefer->sectp = PE_SECTIONS(hModule);
|
||||
deefer->nsect = PE_HEADER(hModule)->FileHeader.NumberOfSections;
|
||||
|
||||
dbglist = deefer;
|
||||
break;
|
||||
|
@ -985,7 +984,7 @@ DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name)
|
|||
struct deferred_debug_info * 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
|
||||
|
@ -2401,19 +2400,9 @@ void DEBUG_InfoShare(void)
|
|||
fprintf(stderr,"Address\t\tModule\tName\n");
|
||||
|
||||
for(deefer = dbglist; deefer; deefer = deefer->next)
|
||||
{
|
||||
if( deefer->pe == NULL )
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
{
|
||||
fprintf(stderr,"0x%8.8x\t(%s)\t%s\n", (unsigned int) deefer->load_addr,
|
||||
deefer->module ? "Win32" : "ELF", deefer->module_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -161,7 +161,7 @@ int DIR_Init(void)
|
|||
dprintf_dosfs( stddeb, "TempDir = %s\nCwd = %c:\\%s\n",
|
||||
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 );
|
||||
strcpy( env_p, "TEMP=" );
|
||||
|
@ -171,6 +171,10 @@ int DIR_Init(void)
|
|||
strcpy( env_p, "windir=" );
|
||||
strcpy( env_p + 7, DIR_WindowsDosDir );
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
|
14
files/file.c
14
files/file.c
|
@ -146,7 +146,8 @@ void FILE_SetDosError(void)
|
|||
{
|
||||
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)
|
||||
{
|
||||
case EAGAIN:
|
||||
|
@ -179,6 +180,12 @@ void FILE_SetDosError(void)
|
|||
case EEXIST:
|
||||
DOS_ERROR( ER_FileExists, EC_Exists, SA_Abort, EL_Disk );
|
||||
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:
|
||||
perror( "int21: unknown errno" );
|
||||
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];
|
||||
|
||||
if (!(drive & ~TF_FORCEDRIVE)) /* drive 0 means current default drive */
|
||||
drive |= DRIVE_GetCurrentDrive();
|
||||
|
||||
if ((drive & TF_FORCEDRIVE) &&
|
||||
!DRIVE_IsValid( toupper(drive & ~TF_FORCEDRIVE) - 'A' ))
|
||||
{
|
||||
|
@ -1185,7 +1195,7 @@ BOOL32 WINAPI DeleteFile32A( LPCSTR path )
|
|||
BOOL32 WINAPI DeleteFile32W( LPCWSTR path )
|
||||
{
|
||||
LPSTR xpath = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
|
||||
BOOL32 ret = RemoveDirectory32A( xpath );
|
||||
BOOL32 ret = DeleteFile32A( xpath );
|
||||
HeapFree( GetProcessHeap(), 0, xpath );
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -92,6 +92,7 @@ INT32 WINAPI Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
|
|||
LPSTR x=PTR_SEG_TO_LIN(segout);
|
||||
lstrcpy32A(lpvOutData,x);
|
||||
SEGPTR_FREE(x);
|
||||
break;
|
||||
}
|
||||
case ENABLEPAIRKERNING: {
|
||||
LPINT16 enab = (LPINT16)PTR_SEG_TO_LIN(segout);
|
||||
|
@ -99,6 +100,7 @@ INT32 WINAPI Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
|
|||
*(LPINT32)lpvOutData = *enab;
|
||||
SEGPTR_FREE(enab);
|
||||
SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
|
||||
break;
|
||||
}
|
||||
case GETFACENAME: {
|
||||
LPSTR x = (LPSTR)PTR_SEG_TO_LIN(segout);
|
||||
|
|
|
@ -975,6 +975,7 @@ static void BITBLT_GetDstArea(DC *dc, Pixmap pixmap, GC gc, RECT32 *visRectDst)
|
|||
XPutPixel( image, x, y,
|
||||
COLOR_PixelToPalette[XGetPixel( image, x, y )]);
|
||||
XPutImage( display, pixmap, gc, image, 0, 0, 0, 0, width, height );
|
||||
XDestroyImage( image );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,9 @@ DLLS = \
|
|||
ole2prox.spec \
|
||||
ole32.spec \
|
||||
olecli.spec \
|
||||
olecli32.spec \
|
||||
olesvr.spec \
|
||||
olesvr32.spec \
|
||||
shell.spec \
|
||||
shell32.spec \
|
||||
sound.spec \
|
||||
|
@ -43,7 +45,9 @@ DLLS = \
|
|||
user32.spec \
|
||||
ver.spec \
|
||||
version.spec \
|
||||
w32skrnl.spec \
|
||||
w32sys.spec \
|
||||
win32s16.spec \
|
||||
win87em.spec \
|
||||
winaspi.spec \
|
||||
wing.spec \
|
||||
|
|
|
@ -87,8 +87,8 @@ type win32
|
|||
0083 stub LogonUserW
|
||||
0084 stub LookupAccountNameA
|
||||
0085 stub LookupAccountNameW
|
||||
0086 stub LookupAccountSidA
|
||||
0087 stub LookupAccountSidW
|
||||
0086 stdcall LookupAccountSidA(ptr ptr ptr ptr ptr ptr ptr) LookupAccountSid32A
|
||||
0087 stdcall LookupAccountSidW(ptr ptr ptr ptr ptr ptr ptr) LookupAccountSid32W
|
||||
0088 stub LookupPrivilegeDisplayNameA
|
||||
0089 stub LookupPrivilegeDisplayNameW
|
||||
0090 stub LookupPrivilegeNameA
|
||||
|
|
280
if1632/builtin.c
280
if1632/builtin.c
|
@ -16,6 +16,7 @@
|
|||
#include "neexe.h"
|
||||
#include "stackframe.h"
|
||||
#include "user.h"
|
||||
#include "process.h"
|
||||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
@ -101,6 +102,7 @@ extern const DLL_DESCRIPTOR DDEML_Descriptor;
|
|||
extern const DLL_DESCRIPTOR LZEXPAND_Descriptor;
|
||||
extern const DLL_DESCRIPTOR VER_Descriptor;
|
||||
extern const DLL_DESCRIPTOR W32SYS_Descriptor;
|
||||
extern const DLL_DESCRIPTOR WIN32S16_Descriptor;
|
||||
extern const DLL_DESCRIPTOR WING_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 COMDLG32_Descriptor;
|
||||
extern const DLL_DESCRIPTOR CRTDLL_Descriptor;
|
||||
extern const DLL_DESCRIPTOR OLE32_Descriptor;
|
||||
extern const DLL_DESCRIPTOR GDI32_Descriptor;
|
||||
extern const DLL_DESCRIPTOR KERNEL32_Descriptor;
|
||||
extern const DLL_DESCRIPTOR LZ32_Descriptor;
|
||||
extern const DLL_DESCRIPTOR MPR_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 USER32_Descriptor;
|
||||
extern const DLL_DESCRIPTOR VERSION_Descriptor;
|
||||
extern const DLL_DESCRIPTOR W32SKRNL_Descriptor;
|
||||
extern const DLL_DESCRIPTOR WINMM_Descriptor;
|
||||
extern const DLL_DESCRIPTOR WINSPOOL_Descriptor;
|
||||
extern const DLL_DESCRIPTOR WSOCK32_Descriptor;
|
||||
|
@ -156,6 +161,7 @@ static BUILTIN_DLL BuiltinDLLs[] =
|
|||
{ &LZEXPAND_Descriptor, NULL, 0 },
|
||||
{ &VER_Descriptor, NULL, 0 },
|
||||
{ &W32SYS_Descriptor, NULL, 0 },
|
||||
{ &WIN32S16_Descriptor, NULL, 0 },
|
||||
{ &WING_Descriptor, NULL, 0 },
|
||||
{ &WINASPI_Descriptor, NULL, 0 },
|
||||
/* Win32 DLLs */
|
||||
|
@ -163,15 +169,18 @@ static BUILTIN_DLL BuiltinDLLs[] =
|
|||
{ &COMCTL32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED },
|
||||
{ &COMDLG32_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 },
|
||||
{ &KERNEL32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_ALWAYS_USED },
|
||||
{ &KERNEL32_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 },
|
||||
{ &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 },
|
||||
{ &USER32_Descriptor, NULL, DLL_FLAG_WIN32 },
|
||||
{ &VERSION_Descriptor, NULL, DLL_FLAG_WIN32 },
|
||||
{ &W32SKRNL_Descriptor, NULL, DLL_FLAG_WIN32 },
|
||||
{ &WINMM_Descriptor, NULL, DLL_FLAG_WIN32 },
|
||||
{ &WINSPOOL_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 */
|
||||
#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
|
||||
|
@ -279,20 +248,179 @@ static HMODULE16 BUILTIN_DoLoadModule16( const WIN16_DESCRIPTOR *descr )
|
|||
* Load a built-in Win32 module. Helper function for BUILTIN_LoadModule
|
||||
* and BUILTIN_Init.
|
||||
*/
|
||||
static HMODULE16 BUILTIN_DoLoadModule32( BUILTIN_DLL *table )
|
||||
static HMODULE32 BUILTIN_DoLoadModule32( BUILTIN_DLL *dll )
|
||||
{
|
||||
extern void RELAY_CallFrom32();
|
||||
|
||||
HMODULE16 hModule;
|
||||
NE_MODULE *pModule;
|
||||
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 );
|
||||
pModule = (NE_MODULE *)GlobalLock16( hModule );
|
||||
pModule->pe_module = (PE_MODULE *)table;
|
||||
pModule->flags = NE_FFLAGS_SINGLEDATA | NE_FFLAGS_BUILTIN |
|
||||
NE_FFLAGS_LIBMODULE | NE_FFLAGS_WIN32;
|
||||
if (debugging_relay) BUILTIN_BuildDebugEntryPoints( table );
|
||||
return hModule;
|
||||
NE_FFLAGS_LIBMODULE | NE_FFLAGS_WIN32;
|
||||
pModule->module32 = (HMODULE32)addr;
|
||||
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 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;
|
||||
char dllname[16], *p;
|
||||
|
@ -484,56 +612,14 @@ FARPROC32 BUILTIN_GetEntryPoint32( char *buffer, void *relay, DWORD *typemask )
|
|||
/* Now find the function */
|
||||
|
||||
ordinal = ((DWORD)relay-(DWORD)dll->dbg_funcs) / sizeof(DEBUG_ENTRY_POINT);
|
||||
ordinal += descr->base;
|
||||
for (i = 0; i < descr->nb_names; i++)
|
||||
if (descr->ordinals[i] == ordinal) break;
|
||||
assert( i < descr->nb_names );
|
||||
|
||||
sprintf( buffer, "%s.%d: %s", descr->name, ordinal, descr->names[i] );
|
||||
*typemask = descr->argtypes[ordinal - descr->base];
|
||||
return (FARPROC32)descr->functions[ordinal - descr->base];
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* 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];
|
||||
sprintf( buffer, "%s.%d: %s", descr->name, ordinal + descr->base,
|
||||
descr->names[i] );
|
||||
*typemask = descr->argtypes[ordinal];
|
||||
return (FARPROC32)descr->functions[ordinal];
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ type win32
|
|||
33 stub __threadhandle
|
||||
34 stub __threadid
|
||||
35 stub __toascii
|
||||
36 stub _abnormal_termination
|
||||
36 cdecl _abnormal_termination() CRTDLL__abnormal_termination
|
||||
37 stub _access
|
||||
38 extern _acmdln_dll CRTDLL_acmdln_dll
|
||||
39 stub _aexit_rtn_dll
|
||||
|
@ -260,7 +260,7 @@ type win32
|
|||
256 stub _read
|
||||
257 stub _rmdir
|
||||
258 stub _rmtmp
|
||||
259 stub _rotl
|
||||
259 cdecl _rotl (long long) CRTDLL__rotl
|
||||
260 stub _rotr
|
||||
261 stub _scalb
|
||||
262 stub _searchenv
|
||||
|
@ -280,7 +280,7 @@ type win32
|
|||
276 stub _spawnve
|
||||
277 stub _spawnvp
|
||||
278 stub _spawnvpe
|
||||
279 stub _splitpath
|
||||
279 cdecl _splitpath (ptr ptr ptr ptr ptr) CRTDLL__splitpath
|
||||
280 cdecl _stat (ptr ptr) CRTDLL__stat
|
||||
281 stub _statusfp
|
||||
282 cdecl _strcmpi(ptr ptr) CRTDLL__strcmpi
|
||||
|
|
|
@ -385,7 +385,7 @@ file gdi.exe
|
|||
613 pascal16 EnumFontFamiliesEx(word ptr segptr long long) THUNK_EnumFontFamiliesEx16
|
||||
614 stub AddLpkToGDI
|
||||
615 stub GetCharacterPlacement
|
||||
616 stub GetFontLanguageInfo
|
||||
616 pascal GetFontLanguageInfo(word) GetFontLanguageInfo16
|
||||
650 stub BuildInverseTableDIB
|
||||
701 stub GDITHKCONNECTIONDATALS
|
||||
702 stub FT_GDIFTHKTHKCONNECTIONDATA
|
||||
|
|
|
@ -173,7 +173,7 @@ type win32
|
|||
166 stub GetCurrentObject
|
||||
167 stdcall GetCurrentPositionEx(long ptr) GetCurrentPositionEx32
|
||||
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
|
||||
171 stdcall GetDeviceCaps(long long) GetDeviceCaps32
|
||||
172 stub GetDeviceGammaRamp
|
||||
|
@ -186,7 +186,7 @@ type win32
|
|||
179 stub GetEnhMetaFilePaletteEntries
|
||||
180 stub GetEnhMetaFileW
|
||||
181 stub GetFontData
|
||||
182 stub GetFontLanguageInfo
|
||||
182 stdcall GetFontLanguageInfo(long) GetFontLanguageInfo32
|
||||
183 stub GetFontResourceInfo
|
||||
184 stub GetFontResourceInfoW
|
||||
185 stub GetGlyphOutline
|
||||
|
@ -315,7 +315,7 @@ type win32
|
|||
308 stdcall SetBrushOrgEx(long long long ptr) SetBrushOrgEx
|
||||
309 stub SetColorAdjustment
|
||||
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
|
||||
313 stdcall SetDIBitsToDevice(long long long long long long long long long
|
||||
ptr ptr long) SetDIBitsToDevice32
|
||||
|
@ -389,7 +389,7 @@ type win32
|
|||
378 stub GdiWinWatchGetClipList
|
||||
379 stub GdiWinWatchOpen
|
||||
380 stub GetGlyphOutlineWow
|
||||
381 stub GetTextCharsetInfo
|
||||
381 stdcall GetTextCharsetInfo(long ptr long) GetTextCharsetInfo
|
||||
382 stdcall TranslateCharsetInfo(ptr ptr long) TranslateCharSetInfo
|
||||
383 stub UpdateICMRegKeyA
|
||||
384 stub UpdateICMRegKeyW
|
||||
|
|
|
@ -30,7 +30,7 @@ file krnl386.exe
|
|||
26 pascal16 GlobalFreeAll(word) GlobalFreeAll
|
||||
27 pascal16 GetModuleName(word ptr word) GetModuleName
|
||||
28 stub GlobalMasterHandle
|
||||
29 pascal16 Yield() Yield
|
||||
29 pascal16 Yield() Yield16
|
||||
30 pascal16 WaitEvent(word) WaitEvent
|
||||
31 pascal16 PostEvent(word) PostEvent
|
||||
32 pascal16 SetPriority(word s_word) SetPriority
|
||||
|
@ -91,7 +91,7 @@ file krnl386.exe
|
|||
91 register InitTask() InitTask
|
||||
92 pascal GetTempDrive(word) WIN16_GetTempDrive
|
||||
93 pascal16 GetCodeHandle(segptr) GetCodeHandle
|
||||
94 stub DefineHandleTable
|
||||
94 pascal16 DefineHandleTable(word) DefineHandleTable16
|
||||
95 pascal16 LoadLibrary(str) LoadLibrary16
|
||||
96 pascal16 FreeLibrary(word) FreeLibrary16
|
||||
97 pascal16 GetTempFileName(word str word ptr) GetTempFileName16
|
||||
|
@ -103,7 +103,7 @@ file krnl386.exe
|
|||
103 register NetBIOSCall() NetBIOSCall
|
||||
104 stub GetCodeInfo
|
||||
105 pascal16 GetExeVersion() GetExeVersion
|
||||
106 pascal SetSwapAreaSize(word) SetSwapAreaSize
|
||||
106 pascal SetSwapAreaSize(word) SetSwapAreaSize16
|
||||
107 pascal16 SetErrorMode(word) SetErrorMode16
|
||||
108 pascal16 SwitchStackTo(word word word) SwitchStackTo
|
||||
109 register SwitchStackBack(word word word) SwitchStackBack
|
||||
|
@ -232,6 +232,7 @@ file krnl386.exe
|
|||
233 stub RegUnloadKey
|
||||
234 stub RegSaveKey
|
||||
235 stub InvalidateNlsCache
|
||||
236 stub GetProductName
|
||||
237 stub KERNEL_237
|
||||
262 stub KERNEL_262
|
||||
263 stub KERNEL_263
|
||||
|
@ -280,6 +281,7 @@ file krnl386.exe
|
|||
359 pascal KERNEL_359(long) _KERNEL_359
|
||||
360 stub OpenFileEx
|
||||
#361 PIGLET_361
|
||||
365 stub KERNEL_365
|
||||
403 pascal16 FarSetOwner(word word) FarSetOwner
|
||||
404 pascal16 FarGetOwner(word) FarGetOwner
|
||||
406 stub WritePrivateProfileStruct
|
||||
|
@ -312,6 +314,7 @@ file krnl386.exe
|
|||
471 stub KERNEL_471
|
||||
472 register KERNEL_472() _KERNEL_472
|
||||
473 stub KERNEL_473
|
||||
475 stub KERNEL_475
|
||||
482 stub KERNEL_482
|
||||
485 stub KERNEL_485
|
||||
491 stub RegisterServiceProcess
|
||||
|
@ -327,11 +330,21 @@ file krnl386.exe
|
|||
518 stub CallProcEx32W
|
||||
519 stub KERNEL_519
|
||||
522 stub KERNEL_522
|
||||
523 stub KERNEL_523
|
||||
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
|
||||
601 stub KERNEL_601
|
||||
604 stub KERNEL_604
|
||||
605 stub KERNEL_605
|
||||
606 stub KERNEL_606
|
||||
607 stub KERNEL_607
|
||||
608 stub KERNEL_608
|
||||
611 stub KERNEL_611
|
||||
612 stub KERNEL_612
|
||||
613 stub KERNEL_613
|
||||
614 stub KERNEL_614
|
||||
|
@ -339,6 +352,6 @@ file krnl386.exe
|
|||
621 stub KERNEL_621
|
||||
627 stub IsBadFlatReadWritePtr
|
||||
630 stub KERNEL_630
|
||||
631 pascal FUNC004(word word long) FUNC004 # shell hook
|
||||
651 stub KERNEL_651
|
||||
631 pascal FUNC004(word word long) FUNC004 #C16ThkSl01?
|
||||
651 stub KERNEL_651 #ThunkConnect16?
|
||||
700 pascal KERNEL_700() stub_KERNEL_700
|
||||
|
|
|
@ -160,7 +160,7 @@ type win32
|
|||
169 stub CreateNamedPipeW
|
||||
170 stub CreatePipe
|
||||
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
|
||||
174 stdcall CreateSemaphoreA(ptr long long str) CreateSemaphore32A
|
||||
175 stdcall CreateSemaphoreW(ptr long long wstr) CreateSemaphore32W
|
||||
|
@ -176,7 +176,7 @@ type win32
|
|||
185 stdcall DeleteCriticalSection(ptr) DeleteCriticalSection
|
||||
186 stdcall DeleteFileA(str) DeleteFile32A
|
||||
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
|
||||
190 stub DisconnectNamedPipe
|
||||
191 stdcall DosDateTimeToFileTime(long long ptr) DosDateTimeToFileTime
|
||||
|
@ -250,7 +250,7 @@ type win32
|
|||
259 stdcall FlushConsoleInputBuffer(long) FlushConsoleInputBuffer
|
||||
260 stdcall FlushFileBuffers(long) FlushFileBuffers
|
||||
261 stub FlushInstructionCache
|
||||
262 stub FlushViewOfFile
|
||||
262 stdcall FlushViewOfFile(ptr long) FlushViewOfFile
|
||||
263 stub FoldStringA
|
||||
264 stub FoldStringW
|
||||
265 stdcall FormatMessageA(long ptr long long ptr long ptr) FormatMessage32A
|
||||
|
@ -362,7 +362,7 @@ type win32
|
|||
371 stub GetPrivateProfileStructW
|
||||
372 stdcall GetProcAddress(long str) GetProcAddress32
|
||||
373 stdcall GetProcessAffinityMask(long ptr ptr) GetProcessAffinityMask
|
||||
374 stub GetProcessFlags
|
||||
374 stdcall GetProcessFlags(long) GetProcessFlags
|
||||
375 stdcall GetProcessHeap() GetProcessHeap
|
||||
376 stub GetProcessHeaps
|
||||
377 stub GetProcessShutdownParameters
|
||||
|
@ -531,7 +531,7 @@ type win32
|
|||
540 stdcall OpenFileMappingW(long long wstr) OpenFileMapping32W
|
||||
541 stdcall OpenMutexA(long long str) OpenMutex32A
|
||||
542 stdcall OpenMutexW(long long wstr) OpenMutex32W
|
||||
543 stub OpenProcess
|
||||
543 stdcall OpenProcess(long long long) OpenProcess32
|
||||
544 stub OpenProfileUserMapping
|
||||
545 stdcall OpenSemaphoreA(long long str) OpenSemaphore32A
|
||||
546 stdcall OpenSemaphoreW(long long wstr) OpenSemaphore32W
|
||||
|
@ -553,7 +553,7 @@ type win32
|
|||
562 stub QueryNumberOfEventLogRecords
|
||||
563 stub QueryOldestEventLogRecord
|
||||
564 stdcall QueryPerformanceCounter(ptr) QueryPerformanceCounter
|
||||
565 stub QueryPerformanceFrequency
|
||||
565 stdcall QueryPerformanceFrequency(ptr) QueryPerformanceFrequency
|
||||
566 stub QueueUserAPC
|
||||
567 register RaiseException() EXC_RaiseException
|
||||
568 stdcall ReadConsoleA(long ptr long ptr ptr) ReadConsole32A
|
||||
|
@ -843,3 +843,56 @@ type win32
|
|||
853 stub VirtualBufferExceptionHandler
|
||||
854 stub WriteConsoleInputVDMA
|
||||
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
|
||||
|
|
|
@ -58,7 +58,7 @@ type win32
|
|||
0077 stub WNetGetNetworkInformationW
|
||||
0078 stub WNetGetProviderNameA
|
||||
0079 stub WNetGetProviderNameW
|
||||
0080 stub WNetGetResourceInformationA
|
||||
0080 stdcall WNetGetResourceInformationA(ptr ptr ptr ptr) WNetGetResourceInformation32A
|
||||
0081 stub WNetGetResourceInformationW
|
||||
0082 stub WNetGetResourceParentA
|
||||
0083 stub WNetGetResourceParentW
|
||||
|
@ -70,7 +70,7 @@ type win32
|
|||
0089 stub WNetLogoffW
|
||||
0090 stub WNetLogonA
|
||||
0091 stub WNetLogonW
|
||||
0092 stub WNetOpenEnumA
|
||||
0092 stdcall WNetOpenEnumA(long long ptr ptr) WNetOpenEnum32A
|
||||
0093 stub WNetOpenEnumW
|
||||
0094 stub WNetRemoveCachedPassword
|
||||
0095 stub WNetRestoreConnectionA
|
||||
|
|
|
@ -951,3 +951,23 @@ type win32
|
|||
948 stub wcstol
|
||||
949 cdecl wcstombs(ptr ptr long) CRTDLL_wcstombs
|
||||
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
|
||||
|
|
|
@ -38,7 +38,7 @@ type win32
|
|||
35 stub CoQueryReleaseObject
|
||||
36 stub CoRegisterClassObject
|
||||
37 stub CoRegisterMallocSpy
|
||||
38 stub CoRegisterMessageFilter
|
||||
38 stdcall CoRegisterMessageFilter(ptr ptr) CoRegisterMessageFilter
|
||||
39 stub CoReleaseMarshalData
|
||||
40 stub CoRevokeClassObject
|
||||
41 stub CoRevokeMallocSpy
|
||||
|
|
|
@ -40,9 +40,9 @@ type win16
|
|||
38 stub OLECREATEFROMFILE
|
||||
39 stub OLECREATELINKFROMFILE
|
||||
40 stub OLERELEASE
|
||||
41 pascal OleRegisterClientDoc(ptr ptr long ptr) OleRegisterClientDoc
|
||||
42 pascal OleRevokeClientDoc(long) OleRevokeClientDoc
|
||||
43 pascal OleRenameClientDoc(long ptr) OleRenameClientDoc
|
||||
41 pascal OleRegisterClientDoc(ptr ptr long ptr) OleRegisterClientDoc16
|
||||
42 pascal OleRevokeClientDoc(long) OleRevokeClientDoc16
|
||||
43 pascal OleRenameClientDoc(long ptr) OleRenameClientDoc16
|
||||
44 stub OLEREVERTCLIENTDOC
|
||||
45 stub OLESAVEDCLIENTDOC
|
||||
46 stub OLERENAME
|
||||
|
|
|
@ -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
|
|
@ -2,12 +2,12 @@ name olesvr
|
|||
type win16
|
||||
|
||||
#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
|
||||
4 pascal OleBlockServer(long) OleBlockServer
|
||||
5 pascal OleUnblockServer(long ptr) OleUnblockServer
|
||||
6 pascal OleRegisterServerDoc(long str ptr ptr) OleRegisterServerDoc
|
||||
7 pascal OleRevokeServerDoc(long) OleRevokeServerDoc
|
||||
4 pascal OleBlockServer(long) OleBlockServer16
|
||||
5 pascal OleUnblockServer(long ptr) OleUnblockServer16
|
||||
6 pascal OleRegisterServerDoc(long str ptr ptr) OleRegisterServerDoc16
|
||||
7 pascal OleRevokeServerDoc(long) OleRevokeServerDoc16
|
||||
8 stub OLERENAMESERVERDOC
|
||||
9 stub OLEREVERTSERVERDOC
|
||||
10 stub OLESAVEDSERVERDOC
|
||||
|
|
|
@ -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
|
|
@ -17,7 +17,7 @@ type win16
|
|||
22 pascal16 ShellAbout(word ptr ptr word) ShellAbout16
|
||||
33 pascal16 AboutDlgProc(word word word long) AboutDlgProc16
|
||||
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
|
||||
38 pascal FindEnvironmentString(ptr) FindEnvironmentString
|
||||
39 pascal16 InternalExtractIcon(word ptr s_word word) InternalExtractIcon
|
||||
|
|
|
@ -7,51 +7,182 @@ type win32
|
|||
|
||||
2 stub SHELL32_2
|
||||
3 stub CheckEscapesA
|
||||
4 stub SHELL32_4
|
||||
5 stub SHELL32_5
|
||||
6 stub CheckEscapesW
|
||||
7 stdcall CommandLineToArgvW(ptr ptr) CommandLineToArgvW
|
||||
8 stub Control_FillCache_RunDLL
|
||||
12 stdcall Control_RunDLL(long long long long) Control_RunDLL
|
||||
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
|
||||
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
|
||||
34 stub SHELL32_34
|
||||
35 stub SHELL32_35
|
||||
34 stdcall SHELL32_34(str) SHELL32_34
|
||||
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
|
||||
39 stub SHELL32_39
|
||||
40 stub SHELL32_40
|
||||
41 stdcall DragAcceptFiles(long long) DragAcceptFiles
|
||||
42 stub DragFinish
|
||||
43 stub SHELL32_43
|
||||
44 stub DragQueryFile
|
||||
45 stdcall SHELL32_45(str) SHELL32_45
|
||||
46 stub SHELL32_46
|
||||
47 stub SHELL32_47
|
||||
48 stub SHELL32_48
|
||||
49 stub SHELL32_49
|
||||
50 stub DragQueryFileA
|
||||
51 stub SHELL32_51
|
||||
52 stdcall SHELL32_52(str) SHELL32_52
|
||||
53 stub DragQueryFileAorW
|
||||
54 stub DragQueryFileW
|
||||
55 stub SHELL32_55
|
||||
56 stub SHELL32_56
|
||||
57 stub SHELL32_57
|
||||
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
|
||||
64 stub SHELL32_64
|
||||
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
|
||||
77 stdcall SHELL32_77(long long long) SHELL32_77
|
||||
78 stub SHELL32_78
|
||||
79 stdcall SHELL32_79(str ptr) SHELL32_79
|
||||
80 stub DuplicateIcon
|
||||
81 stub SHELL32_81
|
||||
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
|
||||
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
|
||||
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
|
||||
136 stub SHELL32_136
|
||||
137 stub SHELL32_137
|
||||
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
|
||||
149 stub SHELL32_149
|
||||
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
|
||||
157 stub SHELL32_157
|
||||
158 stub SHELL32_158
|
||||
159 stub SHELL32_159
|
||||
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
|
||||
183 cdecl SHELL32_183(long long long long long long) SHELL32_183
|
||||
184 stub SHELL32_184
|
||||
185 stub SHELL32_185
|
||||
186 stdcall FindExecutableA(ptr ptr ptr) FindExecutable32A
|
||||
|
@ -63,11 +194,19 @@ type win32
|
|||
192 stub PrintersGetCommand_RunDLL
|
||||
193 stub RealShellExecuteA
|
||||
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
|
||||
204 stub RealShellExecuteW
|
||||
205 stub RegenerateUserEnvironment
|
||||
206 stub SHAddToRecentDocs
|
||||
207 stub SHAppBarMessage
|
||||
207 stdcall SHAppBarMessage(long ptr) SHAppBarMessage32
|
||||
208 stub SHBrowseForFolder
|
||||
209 stub SHBrowseForFolderA
|
||||
210 stub SHChangeNotify
|
||||
|
@ -76,7 +215,7 @@ type win32
|
|||
213 stub SHFormatDrive
|
||||
214 stub SHFreeNameMappings
|
||||
215 stub SHGetDataFromIDListA
|
||||
216 stub SHGetDesktopFolder
|
||||
216 stdcall SHGetDesktopFolder(ptr) SHGetDesktopFolder
|
||||
217 stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfo32A
|
||||
218 stdcall SHGetFileInfoA(ptr long ptr long long) SHGetFileInfo32A
|
||||
219 stub SHGetInstanceExplorer
|
||||
|
@ -113,6 +252,10 @@ type win32
|
|||
250 stub Shell_NotifyIconA
|
||||
251 stub Shl1632_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
|
||||
1030 stub FindExeDlgProc # proper ordinal unknown
|
||||
1043 stub RegisterShellHook # proper ordinal unknown
|
||||
|
|
|
@ -52,7 +52,7 @@ file user.exe
|
|||
48 pascal16 IsChild(word word) IsChild16
|
||||
49 pascal16 IsWindowVisible(word) IsWindowVisible16
|
||||
50 pascal16 FindWindow(segstr str) FindWindow16
|
||||
#51 BEAR51
|
||||
51 stub BEAR51 # IsTwoByteCharPrefix
|
||||
52 pascal16 AnyPopup() AnyPopup16
|
||||
53 pascal16 DestroyWindow(word) DestroyWindow16
|
||||
54 pascal16 EnumWindows(segptr long) THUNK_EnumWindows16
|
||||
|
@ -87,6 +87,7 @@ file user.exe
|
|||
83 pascal16 FrameRect(word ptr word) FrameRect16
|
||||
84 pascal16 DrawIcon(word s_word s_word word) DrawIcon16
|
||||
85 pascal16 DrawText(word str s_word ptr word) DrawText16
|
||||
86 stub BEAR86 # IconSize
|
||||
87 pascal16 DialogBox(word segstr word segptr) DialogBox16
|
||||
88 pascal16 EndDialog(word s_word) EndDialog16
|
||||
89 pascal16 CreateDialog(word segstr word segptr) CreateDialog16
|
||||
|
@ -217,7 +218,7 @@ file user.exe
|
|||
213 pascal16 BuildCommDCB(ptr ptr) BuildCommDCB16
|
||||
214 pascal EscapeCommFunction(word word) EscapeCommFunction16
|
||||
215 pascal16 FlushComm(word word) FlushComm
|
||||
#216 USERSEEUSERDO
|
||||
216 stub USERSEEUSERDO
|
||||
217 pascal16 LookupMenuHandle(word s_word) LookupMenuHandle
|
||||
218 pascal16 DialogBoxIndirect(word word word segptr) DialogBoxIndirect16
|
||||
219 pascal16 CreateDialogIndirect(word ptr word segptr) CreateDialogIndirect16
|
||||
|
@ -431,6 +432,7 @@ file user.exe
|
|||
492 pascal16 USER_492() stub_USER_492
|
||||
496 pascal16 USER_496() stub_USER_496
|
||||
499 pascal16 WNetErrorText(word ptr word) WNetErrorText
|
||||
500 stub FARCALLNETDRIVER # Undocumented Windows
|
||||
501 pascal16 WNetOpenJob(ptr ptr word ptr) WNetOpenJob
|
||||
502 pascal16 WNetCloseJob(word ptr ptr) WNetCloseJob
|
||||
503 pascal16 WNetAbortJob(ptr word) WNetAbortJob
|
||||
|
@ -534,3 +536,4 @@ file user.exe
|
|||
920 pascal16 USER_920() stub_USER_920
|
||||
922 pascal16 USER_922() stub_USER_922
|
||||
923 pascal16 USER_923() stub_USER_923
|
||||
924 stub UsrMpr_ThunkData16
|
||||
|
|
|
@ -12,7 +12,7 @@ type win32
|
|||
9 stdcall BeginDeferWindowPos(long) BeginDeferWindowPos32
|
||||
10 stdcall BeginPaint(long ptr) BeginPaint32
|
||||
11 stdcall BringWindowToTop(long) BringWindowToTop32
|
||||
12 stub BroadcastSystemMessage
|
||||
12 stdcall BroadcastSystemMessage(long ptr long long long) BroadcastSystemMessage
|
||||
13 stub CalcChildScroll
|
||||
14 stub CallMsgFilter
|
||||
15 stdcall CallMsgFilterA(ptr long) CallMsgFilter32A
|
||||
|
@ -285,7 +285,7 @@ type win32
|
|||
280 stub GetProcessWindowStation
|
||||
281 stdcall GetPropA(long ptr) GetProp32A
|
||||
282 stdcall GetPropW(long ptr) GetProp32W
|
||||
283 stub GetQueueStatus
|
||||
283 stdcall GetQueueStatus(long) GetQueueStatus32
|
||||
284 stdcall GetScrollInfo(long long ptr) GetScrollInfo32
|
||||
285 stdcall GetScrollPos(long long) GetScrollPos32
|
||||
286 stdcall GetScrollRange(long long ptr ptr) GetScrollRange32
|
||||
|
@ -381,7 +381,7 @@ type win32
|
|||
376 stdcall LoadStringW(long long ptr long) LoadString32W
|
||||
377 stub LockWindowStation
|
||||
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
|
||||
381 stub MBToWCSEx
|
||||
382 stdcall MapDialogRect(long ptr) MapDialogRect32
|
||||
|
@ -435,7 +435,7 @@ type win32
|
|||
430 stdcall RegisterClassW(ptr) RegisterClass32W
|
||||
431 stdcall RegisterClipboardFormatA(str) RegisterClipboardFormat32A
|
||||
432 stdcall RegisterClipboardFormatW(wstr) RegisterClipboardFormat32W
|
||||
433 stub RegisterHotKey
|
||||
433 stdcall RegisterHotKey(long long long long) RegisterHotKey
|
||||
434 stub RegisterLogonProcess
|
||||
435 stub RegisterSystemThread
|
||||
436 stub RegisterTasklist
|
||||
|
@ -506,7 +506,7 @@ type win32
|
|||
501 stdcall SetScrollInfo(long long ptr long) SetScrollInfo32
|
||||
502 stdcall SetScrollPos(long long long long) SetScrollPos32
|
||||
503 stdcall SetScrollRange(long long long long long) SetScrollRange32
|
||||
504 stub SetShellWindow
|
||||
504 stdcall SetShellWindow(long) SetShellWindow32
|
||||
505 stdcall SetSysColors(long ptr ptr) SetSysColors32
|
||||
506 stub SetSysColorsTemp
|
||||
507 stub SetSystemCursor
|
||||
|
@ -567,7 +567,7 @@ type win32
|
|||
562 stub UnpackDDElParam
|
||||
563 stdcall UnregisterClassA(str long) UnregisterClass32A
|
||||
564 stdcall UnregisterClassW(wstr long) UnregisterClass32W
|
||||
565 stub UnregisterHotKey
|
||||
565 stdcall UnregisterHotKey(long long) UnregisterHotKey
|
||||
566 stub UpdatePerUserSystemParameters
|
||||
567 stdcall UpdateWindow(long) UpdateWindow32
|
||||
568 stub UserClientDllInitialize
|
||||
|
@ -602,6 +602,10 @@ type win32
|
|||
596 stub RegisterServicesProcess
|
||||
597 stub SetWindowRgn
|
||||
598 stub ToUnicodeEx
|
||||
599 stub DrawCaptionTempA
|
||||
599 stdcall DrawCaptionTempA(long long ptr long long str long) DrawCaptionTemp32A
|
||||
600 stub RegisterNetworkCapabilities
|
||||
601 stub WNDPROC_CALLBACK
|
||||
602 stub DrawCaptionTempW
|
||||
603 stub IsHungAppWindow
|
||||
604 stub ChangeDisplaySettingsA
|
||||
605 stub ChangeDisplaySettingsW
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -74,7 +74,7 @@ type win32
|
|||
171 stub EnumPrintProcessorsW
|
||||
172 stub EnumPrinterDriversA
|
||||
173 stub EnumPrinterDriversW
|
||||
174 stub EnumPrintersA
|
||||
174 stdcall EnumPrintersA(long ptr long ptr long ptr ptr) EnumPrinters32A
|
||||
175 stub EnumPrintersW
|
||||
176 stub ExtDeviceMode
|
||||
177 stub FindClosePrinterChangeNotification
|
||||
|
|
|
@ -78,7 +78,7 @@ type win16
|
|||
158 register INT_Int3aHandler(word) BUILTIN_DefaultIntHandler
|
||||
159 register INT_Int3bHandler(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
|
||||
163 register INT_Int3fHandler(word) BUILTIN_DefaultIntHandler
|
||||
164 register INT_Int40Handler(word) BUILTIN_DefaultIntHandler
|
||||
|
|
128
include/aspi.h
128
include/aspi.h
|
@ -56,92 +56,92 @@ struct SRB_HaInquiry16 {
|
|||
typedef struct SRB_HaInquiry16 SRB_HaInquiry16;
|
||||
|
||||
struct SRB_ExecSCSICmd16 {
|
||||
BYTE SRB_Cmd; // ASPI command code (W)
|
||||
BYTE SRB_Status; // ASPI command status byte (R)
|
||||
BYTE SRB_HaId; // ASPI host adapter number (W)
|
||||
BYTE SRB_Flags; // ASPI request flags (W)
|
||||
DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0 (-)
|
||||
BYTE SRB_Target; // Target's SCSI ID (W)
|
||||
BYTE SRB_Lun; // Target's LUN number (W)
|
||||
DWORD SRB_BufLen; // Data Allocation LengthPG (W/R)
|
||||
BYTE SRB_SenseLen; // Sense Allocation Length (W)
|
||||
SEGPTR SRB_BufPointer; // Data Buffer Pointer (W)
|
||||
DWORD SRB_Rsvd1; // Reserved, MUST = 0 (-/W)
|
||||
BYTE SRB_CDBLen; // CDB Length = 6 (W)
|
||||
BYTE SRB_HaStat; // Host Adapter Status (R)
|
||||
BYTE SRB_TargStat; // Target Status (R)
|
||||
FARPROC16 SRB_PostProc; // Post routine (W)
|
||||
BYTE SRB_Rsvd2[34]; // Reserved, MUST = 0
|
||||
BYTE CDBByte[0]; // SCSI CBD - variable length (W)
|
||||
BYTE SRB_Cmd; /* ASPI command code (W) */
|
||||
BYTE SRB_Status; /* ASPI command status byte (R) */
|
||||
BYTE SRB_HaId; /* ASPI host adapter number (W) */
|
||||
BYTE SRB_Flags; /* ASPI request flags (W) */
|
||||
DWORD SRB_Hdr_Rsvd; /* Reserved, MUST = 0 (-) */
|
||||
BYTE SRB_Target; /* Target's SCSI ID (W) */
|
||||
BYTE SRB_Lun; /* Target's LUN number (W) */
|
||||
DWORD SRB_BufLen; /* Data Allocation LengthPG (W/R)*/
|
||||
BYTE SRB_SenseLen; /* Sense Allocation Length (W) */
|
||||
SEGPTR SRB_BufPointer; /* Data Buffer Pointer (W) */
|
||||
DWORD SRB_Rsvd1; /* Reserved, MUST = 0 (-/W)*/
|
||||
BYTE SRB_CDBLen; /* CDB Length = 6 (W) */
|
||||
BYTE SRB_HaStat; /* Host Adapter Status (R) */
|
||||
BYTE SRB_TargStat; /* Target Status (R) */
|
||||
FARPROC16 SRB_PostProc; /* Post routine (W) */
|
||||
BYTE SRB_Rsvd2[34]; /* Reserved, MUST = 0 */
|
||||
BYTE CDBByte[0]; /* SCSI CBD - variable length (W) */
|
||||
/* variable example for 6 byte cbd
|
||||
* BYTE CDBByte[6]; // SCSI CDB (W)
|
||||
* BYTE SenseArea6[SENSE_LEN]; // Request Sense buffer (R)
|
||||
* BYTE CDBByte[6]; * SCSI CDB (W) *
|
||||
* BYTE SenseArea6[SENSE_LEN]; * Request Sense buffer (R) *
|
||||
*/
|
||||
} WINE_PACKED ;
|
||||
|
||||
typedef struct SRB_ExecSCSICmd16 SRB_ExecSCSICmd16;
|
||||
|
||||
struct SRB_ExecSCSICmd32 {
|
||||
BYTE SRB_Cmd; // ASPI command code = SC_EXEC_SCSI_CMD
|
||||
BYTE SRB_Status; // ASPI command status byte
|
||||
BYTE SRB_HaId; // ASPI host adapter number
|
||||
BYTE SRB_Flags; // ASPI request flags
|
||||
DWORD SRB_Hdr_Rsvd; // Reserved
|
||||
BYTE SRB_Target; // Target's SCSI ID
|
||||
BYTE SRB_Lun; // Target's LUN number
|
||||
WORD SRB_Rsvd1; // Reserved for Alignment
|
||||
DWORD SRB_BufLen; // Data Allocation Length
|
||||
BYTE *SRB_BufPointer; // Data Buffer Point
|
||||
BYTE SRB_SenseLen; // Sense Allocation Length
|
||||
BYTE SRB_CDBLen; // CDB Length
|
||||
BYTE SRB_HaStat; // Host Adapter Status
|
||||
BYTE SRB_TargStat; // Target Status
|
||||
void (*SRB_PostProc)(); // Post routine
|
||||
void *SRB_Rsvd2; // Reserved
|
||||
BYTE SRB_Rsvd3[16]; // Reserved for expansion
|
||||
BYTE CDBByte[16]; // SCSI CDB
|
||||
BYTE SenseArea[0]; // Request sense buffer - var length
|
||||
BYTE SRB_Cmd; /* ASPI command code = SC_EXEC_SCSI_CMD */
|
||||
BYTE SRB_Status; /* ASPI command status byte */
|
||||
BYTE SRB_HaId; /* ASPI host adapter number */
|
||||
BYTE SRB_Flags; /* ASPI request flags */
|
||||
DWORD SRB_Hdr_Rsvd; /* Reserved */
|
||||
BYTE SRB_Target; /* Target's SCSI ID */
|
||||
BYTE SRB_Lun; /* Target's LUN number */
|
||||
WORD SRB_Rsvd1; /* Reserved for Alignment */
|
||||
DWORD SRB_BufLen; /* Data Allocation Length */
|
||||
BYTE *SRB_BufPointer; /* Data Buffer Point */
|
||||
BYTE SRB_SenseLen; /* Sense Allocation Length */
|
||||
BYTE SRB_CDBLen; /* CDB Length */
|
||||
BYTE SRB_HaStat; /* Host Adapter Status */
|
||||
BYTE SRB_TargStat; /* Target Status */
|
||||
void (*SRB_PostProc)(); /* Post routine */
|
||||
void *SRB_Rsvd2; /* Reserved */
|
||||
BYTE SRB_Rsvd3[16]; /* Reserved for expansion */
|
||||
BYTE CDBByte[16]; /* SCSI CDB */
|
||||
BYTE SenseArea[0]; /* Request sense buffer - var length */
|
||||
};
|
||||
|
||||
typedef struct SRB_ExecSCSICmd32 SRB_ExecSCSICmd32;
|
||||
|
||||
struct SRB_Abort16 {
|
||||
BYTE SRB_Cmd; // ASPI command code = SC_ABORT_SRB
|
||||
BYTE SRB_Status; // ASPI command status byte
|
||||
BYTE SRB_HaId; // ASPI host adapter number
|
||||
BYTE SRB_Flags; // ASPI request flags
|
||||
DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0
|
||||
LPSRB16 SRB_ToAbort; // Pointer to SRB to abort
|
||||
BYTE SRB_Cmd; /* ASPI command code = SC_ABORT_SRB */
|
||||
BYTE SRB_Status; /* ASPI command status byte */
|
||||
BYTE SRB_HaId; /* ASPI host adapter number */
|
||||
BYTE SRB_Flags; /* ASPI request flags */
|
||||
DWORD SRB_Hdr_Rsvd; /* Reserved, MUST = 0 */
|
||||
LPSRB16 SRB_ToAbort; /* Pointer to SRB to abort */
|
||||
} WINE_PACKED;
|
||||
|
||||
typedef struct SRB_Abort16 SRB_Abort16;
|
||||
|
||||
struct SRB_BusDeviceReset16 {
|
||||
BYTE SRB_Cmd; // ASPI command code = SC_RESET_DEV
|
||||
BYTE SRB_Status; // ASPI command status byte
|
||||
BYTE SRB_HaId; // ASPI host adapter number
|
||||
BYTE SRB_Flags; // ASPI request flags
|
||||
DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0
|
||||
BYTE SRB_Target; // Target's SCSI ID
|
||||
BYTE SRB_Lun; // Target's LUN number
|
||||
BYTE SRB_ResetRsvd1[14]; // Reserved, MUST = 0
|
||||
BYTE SRB_HaStat; // Host Adapter Status
|
||||
BYTE SRB_TargStat; // Target Status
|
||||
SEGPTR SRB_PostProc; // Post routine
|
||||
BYTE SRB_ResetRsvd2[34]; // Reserved, MUST = 0
|
||||
BYTE SRB_Cmd; /* ASPI command code = SC_RESET_DEV */
|
||||
BYTE SRB_Status; /* ASPI command status byte */
|
||||
BYTE SRB_HaId; /* ASPI host adapter number */
|
||||
BYTE SRB_Flags; /* ASPI request flags */
|
||||
DWORD SRB_Hdr_Rsvd; /* Reserved, MUST = 0 */
|
||||
BYTE SRB_Target; /* Target's SCSI ID */
|
||||
BYTE SRB_Lun; /* Target's LUN number */
|
||||
BYTE SRB_ResetRsvd1[14]; /* Reserved, MUST = 0 */
|
||||
BYTE SRB_HaStat; /* Host Adapter Status */
|
||||
BYTE SRB_TargStat; /* Target Status */
|
||||
SEGPTR SRB_PostProc; /* Post routine */
|
||||
BYTE SRB_ResetRsvd2[34]; /* Reserved, MUST = 0 */
|
||||
} WINE_PACKED;
|
||||
|
||||
typedef struct SRB_BusDeviceReset16 SRB_BusDeviceReset16;
|
||||
|
||||
struct SRB_GDEVBlock16 {
|
||||
BYTE SRB_Cmd; // ASPI command code = SC_GET_DEV_TYPE
|
||||
BYTE SRB_Status; // ASPI command status byte
|
||||
BYTE SRB_HaId; // ASPI host adapter number
|
||||
BYTE SRB_Flags; // ASPI request flags
|
||||
DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0
|
||||
BYTE SRB_Target; // Target's SCSI ID
|
||||
BYTE SRB_Lun; // Target's LUN number
|
||||
BYTE SRB_DeviceType; // Target's peripheral device type
|
||||
BYTE SRB_Cmd; /* ASPI command code = SC_GET_DEV_TYPE */
|
||||
BYTE SRB_Status; /* ASPI command status byte */
|
||||
BYTE SRB_HaId; /* ASPI host adapter number */
|
||||
BYTE SRB_Flags; /* ASPI request flags */
|
||||
DWORD SRB_Hdr_Rsvd; /* Reserved, MUST = 0 */
|
||||
BYTE SRB_Target; /* Target's SCSI ID */
|
||||
BYTE SRB_Lun; /* Target's LUN number */
|
||||
BYTE SRB_DeviceType; /* Target's peripheral device type */
|
||||
} WINE_PACKED;
|
||||
|
||||
typedef struct SRB_GDEVBlock16 SRB_GDEVBlock16;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#define CBF_EDIT 0x0040
|
||||
#define CBF_NORESIZE 0x0080
|
||||
#define CBF_NOTIFY 0x0100
|
||||
#define CBF_NOREDRAW 0x0200
|
||||
#define CBF_EUI 0x8000
|
||||
|
||||
/* Combo state struct */
|
||||
|
|
|
@ -11,20 +11,6 @@ extern "C" {
|
|||
|
||||
#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_OVERWRITEPROMPT 0x00000002
|
||||
#define OFN_HIDEREADONLY 0x00000004
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#if !defined(COMPOBJ_H)
|
||||
#define COMPOBJ_H
|
||||
|
||||
#include "ole.h"
|
||||
|
||||
struct tagGUID
|
||||
{
|
||||
DWORD Data1;
|
||||
|
@ -10,9 +12,24 @@ struct tagGUID
|
|||
};
|
||||
|
||||
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 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
|
||||
|
|
|
@ -266,8 +266,8 @@ extern int DEBUG_GetCurrentFrame(struct name_hash ** name,
|
|||
extern int DEBUG_ReadExecutableDbgInfo(void);
|
||||
|
||||
/* debugger/msc.c */
|
||||
extern int DEBUG_RegisterDebugInfo(struct pe_data *pe, int, const char *,
|
||||
unsigned long, unsigned long);
|
||||
extern int DEBUG_RegisterDebugInfo( HMODULE32, const char *,
|
||||
unsigned long, unsigned long);
|
||||
extern int DEBUG_ProcessDeferredDebug(void);
|
||||
extern int DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name);
|
||||
extern void DEBUG_InfoShare(void);
|
||||
|
|
|
@ -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*/
|
|
@ -46,7 +46,7 @@ typedef struct
|
|||
WORD min_swap_area; /* 3c Min. swap area size */
|
||||
WORD expected_version; /* 3e Expected Windows version */
|
||||
/* 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 */
|
||||
WORD self_loading_sel; /* 46 Selector used for self-loading apps. */
|
||||
} NE_MODULE;
|
||||
|
@ -107,8 +107,8 @@ typedef struct resource_nameinfo_s NE_NAMEINFO;
|
|||
(((OFSTRUCT *)((char*)(pModule) + (pModule)->fileinfo))->szPathName)
|
||||
|
||||
#define NE_WIN32_MODULE(pModule) \
|
||||
((struct pe_data *)(((pModule)->flags & NE_FFLAGS_WIN32) ? \
|
||||
((NE_WIN32_EXTRAINFO *)((pModule) + 1))->pe_module : 0))
|
||||
((((pModule)->flags & NE_FFLAGS_WIN32) ? \
|
||||
((NE_WIN32_EXTRAINFO *)((pModule) + 1))->module32 : 0))
|
||||
|
||||
/* module.c */
|
||||
extern NE_MODULE *MODULE_GetPtr( HMODULE32 hModule );
|
||||
|
@ -133,11 +133,10 @@ extern FARPROC16 WIN32_GetProcAddress16( HMODULE32 hmodule, LPSTR name );
|
|||
|
||||
/* builtin.c */
|
||||
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 FARPROC32 BUILTIN_GetEntryPoint32( char *buffer, void *relay,
|
||||
DWORD *typemask );
|
||||
extern FARPROC32 BUILTIN_GetProcAddress32(NE_MODULE *pModule, LPCSTR function);
|
||||
extern BOOL32 BUILTIN_ParseDLLOptions( const char *str );
|
||||
extern void BUILTIN_PrintDLLs(void);
|
||||
|
||||
|
|
|
@ -17,14 +17,14 @@ extern "C" {
|
|||
|
||||
typedef struct {
|
||||
BYTE Value[6];
|
||||
} SID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
|
||||
} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
|
||||
|
||||
typedef struct _SID {
|
||||
BYTE Revision;
|
||||
BYTE SubAuthorityCount;
|
||||
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
|
||||
DWORD SubAuthority[1]; /* more than one */
|
||||
} SID,*LPSID;
|
||||
} SID,*PSID,*LPSID;
|
||||
|
||||
#define SID_REVISION (1) /* Current revision */
|
||||
#define SID_MAX_SUB_AUTHORITIES (15) /* current max subauths */
|
||||
|
@ -121,7 +121,18 @@ typedef struct {
|
|||
LPSID Group;
|
||||
LPACL Sacl;
|
||||
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)
|
||||
* If they are zero terminated, Length does not include the terminating 0.
|
||||
|
|
|
@ -7,8 +7,9 @@
|
|||
|
||||
#include "windows.h"
|
||||
|
||||
typedef LPVOID LPUNKNOWN;
|
||||
typedef LPCSTR OLE_LPCSTR;
|
||||
typedef LPSTR LPOLESTR;
|
||||
typedef LPCSTR LPCOLESTR;
|
||||
|
||||
/* object types */
|
||||
#define OT_LINK 1
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
|
||||
typedef LONG HRESULT;
|
||||
|
||||
typedef LPVOID LPMESSAGEFILTER;
|
||||
|
||||
#define S_OK 0
|
||||
#define S_FALSE 1
|
||||
|
||||
|
|
|
@ -6,22 +6,12 @@
|
|||
#include "winnt.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
|
||||
* all section are calculated here, relocations etc.
|
||||
*/
|
||||
struct pe_modref {
|
||||
struct pe_modref *next;
|
||||
PE_MODULE *pe_module;
|
||||
unsigned long int load_addr;
|
||||
HMODULE32 module;
|
||||
LPIMAGE_IMPORT_DESCRIPTOR pe_import;
|
||||
LPIMAGE_EXPORT_DIRECTORY pe_export;
|
||||
LPIMAGE_RESOURCE_DIRECTORY pe_resource;
|
||||
|
@ -35,7 +25,7 @@ struct pe_modref {
|
|||
typedef struct pe_modref PE_MODREF;
|
||||
|
||||
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 BOOL32 PE_EnumResourceTypes32A(HMODULE32,ENUMRESTYPEPROC32A,LONG);
|
||||
extern BOOL32 PE_EnumResourceTypes32W(HMODULE32,ENUMRESTYPEPROC32W,LONG);
|
||||
|
@ -51,4 +41,6 @@ extern HGLOBAL32 PE_LoadResource32(HINSTANCE32,HRSRC32);
|
|||
struct _PDB32; /* forward definition */
|
||||
extern void PE_InitializeDLLs(struct _PDB32*,DWORD,LPVOID);
|
||||
|
||||
extern LPIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(LPIMAGE_RESOURCE_DIRECTORY,LPCWSTR,DWORD);
|
||||
|
||||
#endif /* __WINE_PE_IMAGE_H */
|
||||
|
|
|
@ -145,6 +145,17 @@ typedef struct _IMAGE_NT_HEADERS {
|
|||
IMAGE_OPTIONAL_HEADER OptionalHeader;
|
||||
} 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 */
|
||||
|
||||
#define IMAGE_SIZEOF_SHORT_NAME 8
|
||||
|
|
|
@ -50,6 +50,17 @@ typedef struct tagSHFILEINFO32W {
|
|||
|
||||
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_DISPLAYNAME 0x000000200 /* get display name */
|
||||
#define SHGFI_TYPENAME 0x000000400 /* get type name */
|
||||
|
|
|
@ -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*/
|
|
@ -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 */
|
|
@ -1 +1 @@
|
|||
#define WINE_RELEASE_INFO "Wine release 971116"
|
||||
#define WINE_RELEASE_INFO "Wine release 971130"
|
||||
|
|
|
@ -97,7 +97,7 @@ typedef struct
|
|||
#define WIN_NEEDS_NCPAINT 0x0004 /* WM_NCPAINT must be sent to window */
|
||||
#define WIN_RESTORE_MAX 0x0008 /* Maximize when restoring */
|
||||
#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_NCACTIVATED 0x0080 /* last WM_NCACTIVATE was positive */
|
||||
#define WIN_MANAGED 0x0100 /* Window managed by the X wm */
|
||||
|
|
|
@ -1973,6 +1973,15 @@ typedef struct
|
|||
DECL_WINELIB_TYPE(ACCEL);
|
||||
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. */
|
||||
#define DI_MASK 1
|
||||
|
@ -5461,7 +5470,6 @@ VOID WINAPI SetPriority(HTASK16,INT16);
|
|||
FARPROC16 WINAPI SetResourceHandler(HINSTANCE16,SEGPTR,FARPROC16);
|
||||
WORD WINAPI SetSelectorBase(WORD,DWORD);
|
||||
WORD WINAPI SetSelectorLimit(WORD,DWORD);
|
||||
LONG WINAPI SetSwapAreaSize(WORD);
|
||||
HQUEUE16 WINAPI SetTaskQueue(HTASK16,HQUEUE16);
|
||||
FARPROC16 WINAPI SetTaskSignalProc(HTASK16,FARPROC16);
|
||||
DWORD WINAPI SetViewportExt(HDC16,INT16,INT16);
|
||||
|
@ -5478,7 +5486,6 @@ BOOL16 WINAPI WaitEvent(HTASK16);
|
|||
INT16 WINAPI WriteComm(INT16,LPSTR,INT16);
|
||||
VOID WINAPI WriteOutProfiles(VOID);
|
||||
VOID WINAPI hmemcpy(LPVOID,LPCVOID,LONG);
|
||||
VOID WINAPI Yield(void);
|
||||
|
||||
|
||||
/* 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 DefWindowProc32W(HWND32,UINT32,WPARAM32,LPARAM);
|
||||
#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 DeleteAtom32(ATOM);
|
||||
#define DeleteAtom WINELIB_NAME(DeleteAtom)
|
||||
|
@ -6357,6 +6367,10 @@ HICON16 WINAPI ExtractIcon16(HINSTANCE16,LPCSTR,UINT16);
|
|||
HICON32 WINAPI ExtractIcon32A(HINSTANCE32,LPCSTR,UINT32);
|
||||
HICON32 WINAPI ExtractIcon32W(HINSTANCE32,LPCWSTR,UINT32);
|
||||
#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*,
|
||||
LPCSTR,UINT16,const INT16*);
|
||||
BOOL32 WINAPI ExtTextOut32A(HDC32,INT32,INT32,UINT32,const RECT32*,
|
||||
|
@ -7173,6 +7187,12 @@ HGLOBAL16 WINAPI LockSegment16(HGLOBAL16);
|
|||
BOOL16 WINAPI LockWindowUpdate16(HWND16);
|
||||
BOOL32 WINAPI LockWindowUpdate32(HWND32);
|
||||
#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);
|
||||
BOOL32 WINAPI LPtoDP32(HDC32,LPPOINT32,INT32);
|
||||
#define LPtoDP WINELIB_NAME(LPtoDP)
|
||||
|
@ -7620,6 +7640,9 @@ DWORD WINAPI SetSoundNoise32(DWORD,DWORD);
|
|||
INT16 WINAPI SetStretchBltMode16(HDC16,INT16);
|
||||
INT32 WINAPI SetStretchBltMode32(HDC32,INT32);
|
||||
#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*);
|
||||
BOOL32 WINAPI SetSysColors32(INT32,const INT32*,const COLORREF*);
|
||||
#define SetSysColors WINELIB_NAME(SetSysColors)
|
||||
|
@ -7861,6 +7884,9 @@ BOOL16 WINAPI WriteProfileString16(LPCSTR,LPCSTR,LPCSTR);
|
|||
BOOL32 WINAPI WriteProfileString32A(LPCSTR,LPCSTR,LPCSTR);
|
||||
BOOL32 WINAPI WriteProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR);
|
||||
#define WriteProfileString WINELIB_NAME_AW(WriteProfileString)
|
||||
VOID WINAPI Yield16(void);
|
||||
#define Yield32()
|
||||
#define Yield WINELIB_NAME(Yield)
|
||||
SEGPTR WINAPI lstrcat16(SEGPTR,LPCSTR);
|
||||
LPSTR WINAPI lstrcat32A(LPSTR,LPCSTR);
|
||||
LPWSTR WINAPI lstrcat32W(LPWSTR,LPCWSTR);
|
||||
|
|
|
@ -38,5 +38,6 @@ extern int WIN32_LastError;
|
|||
#define ERROR_IO_DEVICE 1117
|
||||
#define ERROR_POSSIBLE_DEADLOCK 1131
|
||||
#define ERROR_BAD_DEVICE 1200
|
||||
#define ERROR_NO_NETWORK 1222
|
||||
|
||||
#endif /* __WINE_WINERROR_H */
|
||||
|
|
|
@ -145,7 +145,7 @@ typedef void* SEGPTR;
|
|||
|
||||
/* 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(HBITMAP);
|
||||
DECLARE_HANDLE(HBRUSH);
|
||||
|
|
|
@ -4,9 +4,8 @@
|
|||
#include "windows.h"
|
||||
#include "xmalloc.h"
|
||||
|
||||
/* Stubs needed for linking with Winelib */
|
||||
/* Stub needed for linking with Winelib */
|
||||
/* FIXME: this should not be necessary */
|
||||
FARPROC32 BUILTIN_GetProcAddress32( void *mod, LPCSTR func ) { return 0; }
|
||||
HMODULE32 BUILTIN_LoadModule( LPCSTR name, BOOL32 force ) { return 0; }
|
||||
|
||||
|
||||
|
|
|
@ -53,18 +53,16 @@ HMODULE16
|
|||
MODULE_HANDLEtoHMODULE16(HANDLE32 handle) {
|
||||
NE_MODULE *pModule;
|
||||
|
||||
if (HIWORD(handle)) {
|
||||
/* this is a HMODULE32 aka pe->mappeddll */
|
||||
if (HIWORD(handle))
|
||||
{
|
||||
/* this is a HMODULE32 */
|
||||
|
||||
/* walk the list looking for the correct startaddress */
|
||||
pModule = (NE_MODULE *)GlobalLock16( hFirstModule );
|
||||
while (pModule) {
|
||||
if ( ((pModule->flags&(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32))==NE_FFLAGS_WIN32) &&
|
||||
pModule->pe_module &&
|
||||
((HMODULE32)pModule->pe_module->mappeddll == handle)
|
||||
)
|
||||
return pModule->self;
|
||||
pModule=(NE_MODULE*)GlobalLock16(pModule->next);
|
||||
while (pModule)
|
||||
{
|
||||
if (pModule->module32 == handle) return pModule->self;
|
||||
pModule = (NE_MODULE*)GlobalLock16(pModule->next);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -89,10 +87,7 @@ MODULE_HANDLEtoHMODULE32(HANDLE32 handle) {
|
|||
if (!pModule)
|
||||
return 0;
|
||||
|
||||
if ( ((pModule->flags&(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32))==NE_FFLAGS_WIN32) &&
|
||||
pModule->pe_module
|
||||
)
|
||||
return (HMODULE32)pModule->pe_module->mappeddll;
|
||||
if (pModule->module32) return pModule->module32;
|
||||
return handle;
|
||||
}
|
||||
}
|
||||
|
@ -127,7 +122,7 @@ void MODULE_DumpModule( HMODULE32 hModule )
|
|||
pModule->os_flags, pModule->min_swap_area,
|
||||
pModule->expected_version );
|
||||
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 */
|
||||
|
||||
|
@ -557,7 +552,7 @@ static HMODULE32 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
|
|||
pModule = (NE_MODULE *)GlobalLock16( hModule );
|
||||
memcpy( pModule, &ne_header, sizeof(ne_header) );
|
||||
pModule->count = 0;
|
||||
pModule->pe_module = NULL;
|
||||
pModule->module32 = 0;
|
||||
pModule->self = hModule;
|
||||
pModule->self_loading_sel = 0;
|
||||
pData = (BYTE *)(pModule + 1);
|
||||
|
@ -1139,7 +1134,7 @@ BOOL16 MODULE_FreeModule( HMODULE32 hModule, TDB* pTaskContext )
|
|||
*/
|
||||
HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
|
||||
{
|
||||
HMODULE16 hModule;
|
||||
HMODULE32 hModule;
|
||||
HINSTANCE16 hInstance, hPrevInstance;
|
||||
NE_MODULE *pModule;
|
||||
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 */
|
||||
{
|
||||
/* 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)
|
||||
{
|
||||
|
@ -1169,7 +1165,7 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
|
|||
if ((hModule = BUILTIN_LoadModule( name, TRUE )))
|
||||
{
|
||||
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 */
|
||||
}
|
||||
|
@ -1254,7 +1250,7 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
|
|||
(LPSTR)PTR_SEG_TO_LIN( params->cmdLine ),
|
||||
showcmd );
|
||||
|
||||
if( hTask && TASK_GetNextTask(hTask)) Yield();
|
||||
if( hTask && TASK_GetNextTask(hTask)) Yield16();
|
||||
}
|
||||
|
||||
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)
|
||||
*/
|
||||
|
@ -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)
|
||||
*/
|
||||
|
@ -1773,15 +1791,14 @@ FARPROC32 WINAPI GetProcAddress32( HMODULE32 hModule, LPCSTR function )
|
|||
dprintf_win32(stddeb,"GetProcAddress32(%08lx,%p)\n",(DWORD)hModule,function);
|
||||
if (!(pModule = MODULE_GetPtr( hModule )))
|
||||
return (FARPROC32)0;
|
||||
if (pModule->flags & NE_FFLAGS_BUILTIN)
|
||||
return BUILTIN_GetProcAddress32( pModule, function );
|
||||
if (!pModule->pe_module) {
|
||||
fprintf(stderr,"Oops, Module 0x%08lx has got no pe_module?\n",
|
||||
if (!pModule->module32)
|
||||
{
|
||||
fprintf(stderr,"Oops, Module 0x%08lx has got no module32?\n",
|
||||
(DWORD)MODULE_HANDLEtoHMODULE32(hModule)
|
||||
);
|
||||
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 )))
|
||||
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;
|
||||
if (pModule->flags & NE_FFLAGS_BUILTIN)
|
||||
return (LPIMAGE_NT_HEADERS)0;
|
||||
return pModule->pe_module->pe_header;
|
||||
return PE_HEADER(pModule->module32);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -40,13 +40,20 @@ static void PE_InitDLL(PE_MODREF* modref, DWORD type, LPVOID lpReserved);
|
|||
/* convert PE image VirtualAddress to Real Address */
|
||||
#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;
|
||||
int i, j;
|
||||
u_short *ordinal;
|
||||
u_long *function,*functions;
|
||||
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);
|
||||
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);
|
||||
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++)
|
||||
{
|
||||
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 */
|
||||
for (j = 0; j < pe_exports->NumberOfNames; j++)
|
||||
if (ordinal[j] == i)
|
||||
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" );
|
||||
}
|
||||
}
|
||||
|
@ -79,7 +89,7 @@ void dump_exports(IMAGE_EXPORT_DIRECTORY * pe_exports, unsigned int load_addr)
|
|||
* If it is a ordinal:
|
||||
* - 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;
|
||||
unsigned load_addr;
|
||||
|
@ -89,34 +99,47 @@ FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
|
|||
int i;
|
||||
PDB32 *process=(PDB32*)GetCurrentProcessId();
|
||||
PE_MODREF *pem;
|
||||
u_long rva_start, rva_end, addr;
|
||||
char * forward;
|
||||
|
||||
pem = process->modref_list;
|
||||
while (pem && (pem->pe_module != pe))
|
||||
while (pem && (pem->module != hModule))
|
||||
pem=pem->next;
|
||||
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;
|
||||
}
|
||||
load_addr = pem->load_addr;
|
||||
exports = pem->pe_export;
|
||||
load_addr = hModule;
|
||||
exports = pem->pe_export;
|
||||
|
||||
if (HIWORD(funcName))
|
||||
dprintf_win32(stddeb,"PE_FindExportedFunction(%s)\n",funcName);
|
||||
else
|
||||
dprintf_win32(stddeb,"PE_FindExportedFunction(%d)\n",(int)funcName);
|
||||
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;
|
||||
}
|
||||
ordinal = (u_short*) RVA(exports->AddressOfNameOrdinals);
|
||||
function= (u_long*) RVA(exports->AddressOfFunctions);
|
||||
name = (u_char **) RVA(exports->AddressOfNames);
|
||||
forward = NULL;
|
||||
rva_start = PE_HEADER(hModule)->OptionalHeader
|
||||
.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
|
||||
rva_end = rva_start + PE_HEADER(hModule)->OptionalHeader
|
||||
.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
|
||||
|
||||
if (HIWORD(funcName)) {
|
||||
for(i=0; i<exports->NumberOfNames; i++) {
|
||||
ename=(char*)RVA(*name);
|
||||
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++;
|
||||
name++;
|
||||
}
|
||||
|
@ -126,7 +149,19 @@ FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
|
|||
LOWORD(funcName));
|
||||
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;
|
||||
}
|
||||
|
@ -134,10 +169,9 @@ FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
|
|||
void
|
||||
fixup_imports (PDB32 *process,PE_MODREF *pem)
|
||||
{
|
||||
PE_MODULE *pe = pem->pe_module;
|
||||
IMAGE_IMPORT_DESCRIPTOR *pe_imp;
|
||||
int fixup_failed = 0;
|
||||
unsigned int load_addr = pem->load_addr;
|
||||
unsigned int load_addr = pem->module;
|
||||
int i;
|
||||
char *modname;
|
||||
|
||||
|
@ -176,7 +210,7 @@ fixup_imports (PDB32 *process,PE_MODREF *pem)
|
|||
char *p, buffer[256];
|
||||
|
||||
/* 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, '\\')))
|
||||
p = buffer;
|
||||
strcpy (p + 1, name);
|
||||
|
@ -189,7 +223,7 @@ fixup_imports (PDB32 *process,PE_MODREF *pem)
|
|||
res = MODULE_HANDLEtoHMODULE32(res);
|
||||
xpem = pem->next;
|
||||
while (xpem) {
|
||||
if (xpem->pe_module->mappeddll == res)
|
||||
if (xpem->module == res)
|
||||
break;
|
||||
xpem = xpem->next;
|
||||
}
|
||||
|
@ -297,37 +331,36 @@ fixup_imports (PDB32 *process,PE_MODREF *pem)
|
|||
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, " Name VSz Vaddr SzRaw Fileadr *Reloc *Lineum #Reloc #Linum Char\n");
|
||||
for(i=0; i< pe->pe_header->FileHeader.NumberOfSections; i++)
|
||||
dprintf_win32(stddeb, "Dump of segment table\n");
|
||||
dprintf_win32(stddeb, " Name VSz Vaddr SzRaw Fileadr *Reloc *Lineum #Reloc #Linum Char\n");
|
||||
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",
|
||||
pe->pe_seg[i].Name,
|
||||
pe->pe_seg[i].Misc.VirtualSize,
|
||||
pe->pe_seg[i].VirtualAddress,
|
||||
pe->pe_seg[i].SizeOfRawData,
|
||||
pe->pe_seg[i].PointerToRawData,
|
||||
pe->pe_seg[i].PointerToRelocations,
|
||||
pe->pe_seg[i].PointerToLinenumbers,
|
||||
pe->pe_seg[i].NumberOfRelocations,
|
||||
pe->pe_seg[i].NumberOfLinenumbers,
|
||||
pe->pe_seg[i].Characteristics);
|
||||
vma_size = MAX(vma_size,
|
||||
pe->pe_seg[i].VirtualAddress +
|
||||
pe->pe_seg[i].SizeOfRawData);
|
||||
dprintf_win32(stddeb, "%8s: %4.4lx %8.8lx %8.8lx %8.8lx %8.8lx %8.8lx %4.4x %4.4x %8.8lx\n",
|
||||
pe_seg->Name,
|
||||
pe_seg->Misc.VirtualSize,
|
||||
pe_seg->VirtualAddress,
|
||||
pe_seg->SizeOfRawData,
|
||||
pe_seg->PointerToRawData,
|
||||
pe_seg->PointerToRelocations,
|
||||
pe_seg->PointerToLinenumbers,
|
||||
pe_seg->NumberOfRelocations,
|
||||
pe_seg->NumberOfLinenumbers,
|
||||
pe_seg->Characteristics);
|
||||
vma_size = MAX(vma_size, pe_seg->VirtualAddress+pe_seg->SizeOfRawData);
|
||||
pe_seg++;
|
||||
}
|
||||
return vma_size;
|
||||
}
|
||||
|
||||
static void do_relocations(PE_MODREF *pem)
|
||||
{
|
||||
int delta = pem->load_addr - pem->pe_module->pe_header->OptionalHeader.ImageBase;
|
||||
|
||||
unsigned int load_addr= pem->load_addr;
|
||||
int delta = pem->module - PE_HEADER(pem->module)->OptionalHeader.ImageBase;
|
||||
unsigned int load_addr= pem->module;
|
||||
IMAGE_BASE_RELOCATION *r = pem->pe_reloc;
|
||||
int hdelta = (delta >> 16) & 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
|
||||
* 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;
|
||||
HANDLE32 mapping;
|
||||
|
||||
|
@ -411,7 +443,7 @@ static PE_MODULE *PE_LoadImage( HFILE32 hFile )
|
|||
{
|
||||
fprintf( stderr, "PE_LoadImage: CreateFileMapping error %ld\n",
|
||||
GetLastError() );
|
||||
return NULL;
|
||||
return 0;
|
||||
}
|
||||
hModule = (HMODULE32)MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 );
|
||||
CloseHandle( mapping );
|
||||
|
@ -419,126 +451,128 @@ static PE_MODULE *PE_LoadImage( HFILE32 hFile )
|
|||
{
|
||||
fprintf( stderr, "PE_LoadImage: MapViewOfFile error %ld\n",
|
||||
GetLastError() );
|
||||
return NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* build PE header */
|
||||
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)
|
||||
if (PE_HEADER(hModule)->Signature != IMAGE_NT_SIGNATURE)
|
||||
{
|
||||
fprintf(stderr,"image doesn't have PE signature, but 0x%08lx\n",
|
||||
pe->pe_header->Signature );
|
||||
free(pe);
|
||||
return NULL;
|
||||
PE_HEADER(hModule)->Signature );
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (pe->pe_header->FileHeader.Machine != IMAGE_FILE_MACHINE_I386) {
|
||||
fprintf(stderr,"trying to load PE image for unsupported architecture (");
|
||||
switch (pe->pe_header->FileHeader.Machine) {
|
||||
case IMAGE_FILE_MACHINE_UNKNOWN:
|
||||
fprintf(stderr,"Unknown");break;
|
||||
case IMAGE_FILE_MACHINE_I860:
|
||||
fprintf(stderr,"I860");break;
|
||||
case IMAGE_FILE_MACHINE_R3000:
|
||||
fprintf(stderr,"R3000");break;
|
||||
case IMAGE_FILE_MACHINE_R4000:
|
||||
fprintf(stderr,"R4000");break;
|
||||
case IMAGE_FILE_MACHINE_R10000:
|
||||
fprintf(stderr,"R10000");break;
|
||||
case IMAGE_FILE_MACHINE_ALPHA:
|
||||
fprintf(stderr,"Alpha");break;
|
||||
case IMAGE_FILE_MACHINE_POWERPC:
|
||||
fprintf(stderr,"PowerPC");break;
|
||||
default:
|
||||
fprintf(stderr,"Unknown-%04x",pe->pe_header->FileHeader.Machine);break;
|
||||
}
|
||||
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));
|
||||
if (PE_HEADER(hModule)->FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
|
||||
{
|
||||
fprintf(stderr,"trying to load PE image for unsupported architecture (");
|
||||
switch (PE_HEADER(hModule)->FileHeader.Machine)
|
||||
{
|
||||
case IMAGE_FILE_MACHINE_UNKNOWN: fprintf(stderr,"Unknown"); break;
|
||||
case IMAGE_FILE_MACHINE_I860: fprintf(stderr,"I860"); break;
|
||||
case IMAGE_FILE_MACHINE_R3000: fprintf(stderr,"R3000"); break;
|
||||
case IMAGE_FILE_MACHINE_R4000: fprintf(stderr,"R4000"); break;
|
||||
case IMAGE_FILE_MACHINE_R10000: fprintf(stderr,"R10000"); break;
|
||||
case IMAGE_FILE_MACHINE_ALPHA: fprintf(stderr,"Alpha"); break;
|
||||
case IMAGE_FILE_MACHINE_POWERPC: fprintf(stderr,"PowerPC"); break;
|
||||
default: fprintf(stderr,"Unknown-%04x",
|
||||
PE_HEADER(hModule)->FileHeader.Machine); break;
|
||||
}
|
||||
fprintf(stderr,")\n");
|
||||
goto error;
|
||||
}
|
||||
return hModule;
|
||||
|
||||
/* FIXME: the (16-...) is a *horrible* hack to make COMDLG32.DLL load OK. The
|
||||
* problem needs to be fixed properly at some stage.
|
||||
*/
|
||||
return pe;
|
||||
error:
|
||||
UnmapViewOfFile( (LPVOID)hModule );
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* This maps a loaded PE dll into the address space of the specified process.
|
||||
*/
|
||||
void
|
||||
PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
|
||||
static HMODULE32 PE_MapImage( HMODULE32 hModule, PDB32 *process,
|
||||
OFSTRUCT *ofs, DWORD flags )
|
||||
{
|
||||
PE_MODREF *pem;
|
||||
int i, result;
|
||||
int load_addr;
|
||||
DWORD load_addr;
|
||||
IMAGE_DATA_DIRECTORY dir;
|
||||
char *modname;
|
||||
int vma_size;
|
||||
|
||||
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));
|
||||
pem = (PE_MODREF*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
|
||||
sizeof(*pem));
|
||||
/* NOTE: fixup_imports takes care of the correct order */
|
||||
pem->next = process->modref_list;
|
||||
process->modref_list = pem;
|
||||
|
||||
pem->pe_module = pe;
|
||||
if (!(pe->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL)) {
|
||||
if (!(nt_header->FileHeader.Characteristics & IMAGE_FILE_DLL))
|
||||
{
|
||||
if (process->exe_modref)
|
||||
fprintf(stderr,"overwriting old exe_modref... arrgh\n");
|
||||
process->exe_modref = pem;
|
||||
}
|
||||
|
||||
load_addr = pe->pe_header->OptionalHeader.ImageBase;
|
||||
dprintf_win32(stddeb, "Load addr is %x\n",load_addr);
|
||||
vma_size = calc_vma_size(pe);
|
||||
load_addr = (int) VirtualAlloc( (void*)load_addr, vma_size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
|
||||
pem->load_addr = load_addr;
|
||||
load_addr = nt_header->OptionalHeader.ImageBase;
|
||||
vma_size = calc_vma_size( hModule );
|
||||
dprintf_win32(stddeb, "Load addr is %lx\n",load_addr);
|
||||
load_addr = (DWORD)VirtualAlloc( (void*)load_addr, vma_size,
|
||||
MEM_RESERVE | MEM_COMMIT,
|
||||
PAGE_EXECUTE_READWRITE );
|
||||
pem->module = (HMODULE32)load_addr;
|
||||
|
||||
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 */
|
||||
/* FIXME: this should be done by mmap(..MAP_PRIVATE|MAP_FIXED..)
|
||||
* but it is not possible for (at least) Linux needs
|
||||
* a page-aligned offset.
|
||||
*/
|
||||
if(!(pe->pe_seg[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA))
|
||||
memcpy((char*)RVA(pe->pe_seg[i].VirtualAddress),
|
||||
(char*)(pe->mappeddll+pe->pe_seg[i].PointerToRawData),
|
||||
pe->pe_seg[i].SizeOfRawData
|
||||
if(!(pe_seg->Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA))
|
||||
memcpy((char*)RVA(pe_seg->VirtualAddress),
|
||||
(char*)(hModule + pe_seg->PointerToRawData),
|
||||
pe_seg->SizeOfRawData
|
||||
);
|
||||
|
||||
result = RVA (pe->pe_seg[i].VirtualAddress);
|
||||
result = RVA (pe_seg->VirtualAddress);
|
||||
#if 1
|
||||
/* 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,
|
||||
pe->pe_seg[i].Misc.VirtualSize ?
|
||||
pe->pe_seg[i].Misc.VirtualSize :
|
||||
pe->pe_seg[i].SizeOfRawData);
|
||||
pe_seg->Misc.VirtualSize ?
|
||||
pe_seg->Misc.VirtualSize :
|
||||
pe_seg->SizeOfRawData);
|
||||
#endif
|
||||
|
||||
if(strcmp(pe->pe_seg[i].Name, ".idata") == 0)
|
||||
if(strcmp(pe_seg->Name, ".idata") == 0)
|
||||
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;
|
||||
|
||||
if(strcmp(pe->pe_seg[i].Name, ".rsrc") == 0)
|
||||
if(strcmp(pe_seg->Name, ".rsrc") == 0)
|
||||
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;
|
||||
}
|
||||
|
||||
/* There is word that the actual loader does not care about the
|
||||
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(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);
|
||||
}
|
||||
|
||||
dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
|
||||
dir=nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
|
||||
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);
|
||||
}
|
||||
|
||||
dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
|
||||
dir=nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
|
||||
if(dir.Size)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
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");
|
||||
|
||||
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");
|
||||
|
||||
|
||||
|
||||
dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
|
||||
dir=nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
|
||||
if(dir.Size)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
if(pe->pe_header->OptionalHeader.DataDirectory
|
||||
if(nt_header->OptionalHeader.DataDirectory
|
||||
[IMAGE_DIRECTORY_ENTRY_COPYRIGHT].Size)
|
||||
dprintf_win32(stdnimp,"Copyright string ignored\n");
|
||||
|
||||
if(pe->pe_header->OptionalHeader.DataDirectory
|
||||
if(nt_header->OptionalHeader.DataDirectory
|
||||
[IMAGE_DIRECTORY_ENTRY_GLOBALPTR].Size)
|
||||
dprintf_win32(stdnimp,"Global Pointer (MIPS) ignored\n");
|
||||
|
||||
if(pe->pe_header->OptionalHeader.DataDirectory
|
||||
if(nt_header->OptionalHeader.DataDirectory
|
||||
[IMAGE_DIRECTORY_ENTRY_TLS].Size)
|
||||
fprintf(stdnimp,"Thread local storage ignored\n");
|
||||
|
||||
if(pe->pe_header->OptionalHeader.DataDirectory
|
||||
if(nt_header->OptionalHeader.DataDirectory
|
||||
[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].Size)
|
||||
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)
|
||||
dprintf_win32(stdnimp,"Bound Import directory ignored\n");
|
||||
|
||||
if(pe->pe_header->OptionalHeader.DataDirectory
|
||||
if(nt_header->OptionalHeader.DataDirectory
|
||||
[IMAGE_DIRECTORY_ENTRY_IAT].Size)
|
||||
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");
|
||||
if(pe->pe_header->OptionalHeader.DataDirectory[14].Size)
|
||||
if(nt_header->OptionalHeader.DataDirectory[14].Size)
|
||||
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");
|
||||
|
||||
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_export)
|
||||
|
@ -625,6 +659,11 @@ PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
|
|||
if ((s=strchr(modname,'.')))
|
||||
*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);
|
||||
|
@ -647,8 +686,7 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
|
|||
/* check if this module is already mapped */
|
||||
pem = ((PDB32*)GetCurrentProcessId())->modref_list;
|
||||
while (pem) {
|
||||
if (pem->pe_module->mappeddll == hModule)
|
||||
return hModule;
|
||||
if (pem->module == hModule) return hModule;
|
||||
pem = pem->next;
|
||||
}
|
||||
pModule = MODULE_GetPtr(hModule);
|
||||
|
@ -656,14 +694,14 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
|
|||
|
||||
/* try to load builtin, enabled modules first */
|
||||
if ((hModule = BUILTIN_LoadModule( name, FALSE )))
|
||||
return hModule;
|
||||
return MODULE_HANDLEtoHMODULE32( hModule );
|
||||
|
||||
/* try to open the specified file */
|
||||
if (HFILE_ERROR32==(hFile=OpenFile32(name,&ofs,OF_READ))) {
|
||||
/* Now try the built-in even if disabled */
|
||||
if ((hModule = BUILTIN_LoadModule( name, TRUE ))) {
|
||||
fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name );
|
||||
return hModule;
|
||||
return MODULE_HANDLEtoHMODULE32( hModule );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -673,14 +711,15 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
|
|||
}
|
||||
pModule = (NE_MODULE *)GlobalLock16( hModule );
|
||||
pModule->flags = NE_FFLAGS_WIN32;
|
||||
pModule->pe_module = PE_LoadImage( hFile );
|
||||
pModule->module32 = PE_LoadImage( hFile );
|
||||
CloseHandle( hFile );
|
||||
if (!pModule->pe_module)
|
||||
return 21;
|
||||
if (pModule->module32 < 32) return 21;
|
||||
}
|
||||
/* recurse */
|
||||
PE_MapImage(pModule->pe_module,(PDB32*)GetCurrentProcessId(),&ofs,flags);
|
||||
return pModule->pe_module->mappeddll;
|
||||
pModule->module32 = PE_MapImage( pModule->module32,
|
||||
(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 )
|
||||
{
|
||||
HMODULE16 hModule;
|
||||
HMODULE16 hModule16;
|
||||
HMODULE32 hModule32;
|
||||
HINSTANCE16 hInstance;
|
||||
NE_MODULE *pModule;
|
||||
|
||||
if ((hModule = MODULE_CreateDummyModule( ofs )) < 32) return hModule;
|
||||
pModule = (NE_MODULE *)GlobalLock16( hModule );
|
||||
if ((hModule16 = MODULE_CreateDummyModule( ofs )) < 32) return hModule16;
|
||||
pModule = (NE_MODULE *)GlobalLock16( hModule16 );
|
||||
pModule->flags = NE_FFLAGS_WIN32;
|
||||
|
||||
pModule->pe_module = PE_LoadImage( hFile );
|
||||
pModule->module32 = hModule32 = PE_LoadImage( hFile );
|
||||
CloseHandle( hFile );
|
||||
if (!pModule->pe_module)
|
||||
return 21;
|
||||
if (hModule32 < 32) return 21;
|
||||
|
||||
hInstance = MODULE_CreateInstance( hModule, params );
|
||||
if (!(pModule->pe_module->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL))
|
||||
hInstance = MODULE_CreateInstance( hModule16, params );
|
||||
if (!(PE_HEADER(hModule32)->FileHeader.Characteristics & IMAGE_FILE_DLL))
|
||||
{
|
||||
TASK_CreateTask( hModule, hInstance, 0,
|
||||
TASK_CreateTask( hModule16, hInstance, 0,
|
||||
params->hEnvironment,
|
||||
(LPSTR)PTR_SEG_TO_LIN( params->cmdLine ),
|
||||
*((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;
|
||||
}
|
||||
|
||||
|
@ -729,9 +769,6 @@ int PE_UnloadImage( HMODULE32 hModule )
|
|||
*/
|
||||
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)
|
||||
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? */
|
||||
if ( (pe->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL) &&
|
||||
(pe->pe_header->OptionalHeader.AddressOfEntryPoint)
|
||||
if ((PE_HEADER(pem->module)->FileHeader.Characteristics & IMAGE_FILE_DLL) &&
|
||||
(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",
|
||||
entry, pe->mappeddll, type, lpReserved );
|
||||
entry( pe->mappeddll, type, lpReserved );
|
||||
entry, pem->module, type, lpReserved );
|
||||
entry( pem->module, type, lpReserved );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -788,12 +826,12 @@ void PE_InitTls(PDB32 *pdb)
|
|||
|
||||
pem = pdb->modref_list;
|
||||
while (pem) {
|
||||
peh = pem->pe_module->pe_header;
|
||||
peh = PE_HEADER(pem->module);
|
||||
if (!peh->OptionalHeader.DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress) {
|
||||
pem = pem->next;
|
||||
continue;
|
||||
}
|
||||
pdir = (LPVOID)(pem->load_addr + peh->OptionalHeader.
|
||||
pdir = (LPVOID)(pem->module + peh->OptionalHeader.
|
||||
DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress);
|
||||
index = TlsAlloc();
|
||||
datasize= pdir->EndAddressOfRawData-pdir->StartAddressOfRawData;
|
||||
|
@ -816,7 +854,7 @@ BOOL32 WINAPI DisableThreadLibraryCalls(HMODULE32 hModule)
|
|||
PE_MODREF *pem = process->modref_list;
|
||||
|
||||
while (pem) {
|
||||
if (pem->pe_module->mappeddll == hModule)
|
||||
if (pem->module == hModule)
|
||||
pem->flags|=PE_MODREF_NO_DLL_CALLS;
|
||||
pem = pem->next;
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ HMODULE32toPE_MODREF(HMODULE32 hmod) {
|
|||
if (!hmod) return NULL;
|
||||
if (!(pModule = MODULE_GetPtr( hmod ))) return 0;
|
||||
pem = pdb->modref_list;
|
||||
while (pem && pem->pe_module->mappeddll != hmod)
|
||||
while (pem && pem->module != hmod)
|
||||
pem=pem->next;
|
||||
return pem;
|
||||
}
|
||||
|
@ -141,7 +141,7 @@ HANDLE32 PE_LoadResource32( HINSTANCE32 hModule, HANDLE32 hRsrc )
|
|||
return 0;
|
||||
if (!hRsrc)
|
||||
return 0;
|
||||
return (HANDLE32) (pem->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
|
||||
return (HANDLE32) (pem->module + ((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -45,19 +45,27 @@ HRSRC16 WINAPI FindResource16( HMODULE16 hModule, SEGPTR name, SEGPTR type )
|
|||
NE_MODULE *pModule;
|
||||
|
||||
hModule = MODULE_HANDLEtoHMODULE16( hModule );
|
||||
dprintf_resource(stddeb, "FindResource16: module=%04x type=", hModule );
|
||||
PrintId( type );
|
||||
dprintf_resource(stddeb, "FindResource16: module=%04x", hModule );
|
||||
|
||||
if (HIWORD(name)) /* Check for '#xxx' name */
|
||||
{
|
||||
char *ptr = PTR_SEG_TO_LIN( name );
|
||||
if (ptr[0] == '#') {
|
||||
if (ptr[0] == '#')
|
||||
if (!(name = (SEGPTR)atoi( ptr + 1 ))) return 0;
|
||||
}
|
||||
}
|
||||
|
||||
dprintf_resource( stddeb, " 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" );
|
||||
|
||||
if ((pModule = MODULE_GetPtr( hModule )))
|
||||
|
@ -547,7 +555,7 @@ INT16 WINAPI LoadString16( HINSTANCE16 instance, UINT16 resource_id,
|
|||
* LoadString32W (USER32.375)
|
||||
*/
|
||||
INT32 WINAPI LoadString32W( HINSTANCE32 instance, UINT32 resource_id,
|
||||
LPWSTR buffer, int buflen )
|
||||
LPWSTR buffer, INT32 buflen )
|
||||
{
|
||||
HGLOBAL32 hmem;
|
||||
HRSRC32 hrsrc;
|
||||
|
@ -599,16 +607,20 @@ INT32 WINAPI LoadString32W( HINSTANCE32 instance, UINT32 resource_id,
|
|||
* LoadString32A (USER32.374)
|
||||
*/
|
||||
INT32 WINAPI LoadString32A( HINSTANCE32 instance, UINT32 resource_id,
|
||||
LPSTR buffer,int buflen )
|
||||
LPSTR buffer, INT32 buflen )
|
||||
{
|
||||
INT32 retval;
|
||||
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);
|
||||
|
||||
if (buffer2)
|
||||
{
|
||||
lstrcpynWtoA( buffer, buffer2, buflen );
|
||||
if (retval) {
|
||||
lstrcpynWtoA( buffer, buffer2, buflen );
|
||||
retval = lstrlen32A( buffer );
|
||||
}
|
||||
HeapFree( GetProcessHeap(), 0, buffer2 );
|
||||
}
|
||||
return retval;
|
||||
|
@ -640,7 +652,7 @@ INT32 WINAPI LoadString32A( HINSTANCE32 instance, UINT32 resource_id,
|
|||
* LoadMessage32A (internal)
|
||||
*/
|
||||
INT32 LoadMessage32A( HINSTANCE32 instance, UINT32 id, WORD lang,
|
||||
LPSTR buffer, int buflen )
|
||||
LPSTR buffer, INT32 buflen )
|
||||
{
|
||||
HGLOBAL32 hmem;
|
||||
HRSRC32 hrsrc;
|
||||
|
@ -708,15 +720,19 @@ INT32 LoadMessage32A( HINSTANCE32 instance, UINT32 id, WORD lang,
|
|||
* LoadMessage32W (internal)
|
||||
*/
|
||||
INT32 LoadMessage32W( HINSTANCE32 instance, UINT32 id, WORD lang,
|
||||
LPWSTR buffer, int buflen )
|
||||
LPWSTR buffer, INT32 buflen )
|
||||
{
|
||||
INT32 retval;
|
||||
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);
|
||||
if (buffer)
|
||||
{
|
||||
lstrcpynAtoW( buffer, buffer2, buflen );
|
||||
if (retval) {
|
||||
lstrcpynAtoW( buffer, buffer2, buflen );
|
||||
retval = lstrlen32W( buffer );
|
||||
}
|
||||
HeapFree( GetProcessHeap(), 0, buffer2 );
|
||||
}
|
||||
return retval;
|
||||
|
|
|
@ -340,18 +340,17 @@ static void TASK_CallToStart(void)
|
|||
SEGTABLEENTRY *pSegTable = NE_SEG_TABLE( pModule );
|
||||
|
||||
IF1632_Saved16_ss_sp = pTask->ss_sp;
|
||||
SET_FS( pCurrentThread->teb_sel );
|
||||
if (pModule->flags & NE_FFLAGS_WIN32)
|
||||
{
|
||||
/* FIXME: all this is an ugly hack */
|
||||
|
||||
extern void InitTask( CONTEXT *context );
|
||||
|
||||
FARPROC32 entry = (FARPROC32)(pCurrentProcess->exe_modref->load_addr +
|
||||
pCurrentProcess->exe_modref->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint);
|
||||
FARPROC32 entry = (FARPROC32)RVA_PTR( pCurrentProcess->exe_modref->module, OptionalHeader.AddressOfEntryPoint );
|
||||
|
||||
InitTask( NULL );
|
||||
InitApp( pTask->hModule );
|
||||
SET_FS( pCurrentThread->teb_sel );
|
||||
PE_InitializeDLLs( pCurrentProcess, DLL_PROCESS_ATTACH, (LPVOID)-1 );
|
||||
dprintf_relay( stddeb, "CallTo32(entryproc=%p)\n", entry );
|
||||
exit_code = entry();
|
||||
|
@ -526,7 +525,8 @@ HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
|
|||
pCurrentProcess->exe_modref->load_addr +
|
||||
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 */
|
||||
pCurrentThread = pTask->thdb;
|
||||
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 );
|
||||
if (pCurTask) pCurTask->hYieldTo = 0;
|
||||
|
@ -1021,16 +1021,24 @@ void WINAPI Yield(void)
|
|||
*/
|
||||
FARPROC16 WINAPI MakeProcInstance16( FARPROC16 func, HANDLE16 hInstance )
|
||||
{
|
||||
BYTE *thunk;
|
||||
BYTE *thunk,*lfunc;
|
||||
SEGPTR thunkaddr;
|
||||
|
||||
if (__winelib) return func; /* func can be called directly in Winelib */
|
||||
thunkaddr = TASK_AllocThunk( hCurrentTask );
|
||||
if (!thunkaddr) return (FARPROC16)0;
|
||||
thunk = PTR_SEG_TO_LIN( thunkaddr );
|
||||
lfunc = PTR_SEG_TO_LIN( func );
|
||||
|
||||
dprintf_task( stddeb, "MakeProcInstance(%08lx,%04x): got thunk %08lx\n",
|
||||
(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++ = (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)
|
||||
*/
|
||||
|
|
|
@ -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 );
|
||||
return MAKELONG( size, 0xffff );
|
||||
|
|
|
@ -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)
|
||||
*/
|
||||
|
|
|
@ -10,7 +10,6 @@ C_SRCS = \
|
|||
callback.c \
|
||||
comm.c \
|
||||
commdlg.c \
|
||||
compobj.c \
|
||||
crtdll.c \
|
||||
cpu.c \
|
||||
ddeml.c \
|
||||
|
@ -22,15 +21,11 @@ C_SRCS = \
|
|||
mpr.c \
|
||||
network.c \
|
||||
ntdll.c \
|
||||
ole2.c \
|
||||
ole2disp.c \
|
||||
ole2nls.c \
|
||||
olecli.c \
|
||||
olesvr.c \
|
||||
port.c \
|
||||
printdrv.c \
|
||||
registry.c \
|
||||
shell.c \
|
||||
shellord.c \
|
||||
sound.c \
|
||||
spy.c \
|
||||
stress.c \
|
||||
|
@ -39,6 +34,8 @@ C_SRCS = \
|
|||
tweak.c \
|
||||
ver.c \
|
||||
version.c \
|
||||
w32scomb.c \
|
||||
w32skrnl.c \
|
||||
w32sys.c \
|
||||
winsock.c \
|
||||
winsock_dns.c \
|
||||
|
|
|
@ -124,6 +124,7 @@ BOOL16 WINAPI GetOpenFileName16( SEGPTR ofn )
|
|||
}
|
||||
|
||||
hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
|
||||
/* FIXME: doesn't handle win32 format correctly yet */
|
||||
hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
|
||||
lpofn->hwndOwner,
|
||||
(DLGPROC16)MODULE_GetWndProcEntry16("FileOpenDlgProc"),
|
||||
|
|
|
@ -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)
|
||||
*/
|
||||
|
@ -582,6 +592,19 @@ INT32 __cdecl CRTDLL_getc( FILE *stream )
|
|||
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)
|
||||
*/
|
||||
|
@ -1429,6 +1452,66 @@ LPSTR __cdecl CRTDLL__fullpath(LPSTR buf, LPCSTR name, INT32 size)
|
|||
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)
|
||||
*/
|
||||
|
|
|
@ -168,7 +168,7 @@ HFILE32 WINAPI LZInit32( HFILE32 hfSrc )
|
|||
_llseek32(hfSrc,0,SEEK_SET);
|
||||
return ret?ret:hfSrc;
|
||||
}
|
||||
lzstates = HeapReAlloc( GetProcessHeap(), 0, lzstates,
|
||||
lzstates = HeapReAlloc( SystemHeap, 0, lzstates,
|
||||
(++nroflzstates)*sizeof(struct lzstate) );
|
||||
lzs = lzstates+(nroflzstates-1);
|
||||
|
||||
|
@ -618,7 +618,7 @@ void WINAPI LZClose32( HFILE32 fd )
|
|||
memmove(lzstates+i,lzstates+i+1,
|
||||
sizeof(struct lzstate)*(nroflzstates-i-1));
|
||||
nroflzstates--;
|
||||
lzstates = HeapReAlloc( GetProcessHeap(), 0, lzstates,
|
||||
lzstates = HeapReAlloc( SystemHeap, 0, lzstates,
|
||||
sizeof(struct lzstate)*nroflzstates );
|
||||
}
|
||||
|
||||
|
|
|
@ -118,7 +118,7 @@ static XrmOptionDescRec optionsTable[] =
|
|||
#define NB_OPTIONS (sizeof(optionsTable) / sizeof(optionsTable[0]))
|
||||
|
||||
#define USAGE \
|
||||
"Usage: %s [options] program_name [arguments]\n" \
|
||||
"Usage: %s [options] \"program_name [arguments]\"\n" \
|
||||
"\n" \
|
||||
"Options:\n" \
|
||||
" -backingstore Turn on backing store\n" \
|
||||
|
@ -613,7 +613,7 @@ void WINAPI MessageBeep16( UINT16 i )
|
|||
*/
|
||||
BOOL32 WINAPI MessageBeep32( UINT32 i )
|
||||
{
|
||||
XBell( display, 100 );
|
||||
XBell( display, 0 );
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -624,7 +624,7 @@ BOOL32 WINAPI MessageBeep32( UINT32 i )
|
|||
BOOL32 WINAPI Beep( DWORD dwFreq, DWORD dwDur )
|
||||
{
|
||||
/* dwFreq and dwDur are ignored by Win95 */
|
||||
XBell(display, 100);
|
||||
XBell(display, 0);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#include "windows.h"
|
||||
#include "winerror.h"
|
||||
#include "drive.h"
|
||||
|
||||
#define WN_SUCCESS 0x0000
|
||||
|
@ -29,8 +30,10 @@
|
|||
#define WN_ALREADY_CONNECTED 0x0034
|
||||
#define WN_DEVICE_ERROR 0x0035
|
||||
#define WN_CONNECTION_CLOSED 0x0036
|
||||
#define WN_NO_NETWORK ERROR_NO_NETWORK
|
||||
|
||||
typedef LPSTR LPNETRESOURCE;
|
||||
|
||||
typedef LPVOID LPNETRESOURCE16;
|
||||
|
||||
/**************************************************************************
|
||||
* WNetErrorText [USER.499]
|
||||
|
@ -170,8 +173,12 @@ int WINAPI WNetGetConnection16(LPSTR lpLocalName,
|
|||
case DRIVE_FIXED:
|
||||
return WN_NOT_CONNECTED;
|
||||
case DRIVE_REMOTE:
|
||||
path = DRIVE_GetDosCwd(drive);
|
||||
if (strlen(path) + 1 > *cbRemoteName) return WN_MORE_DATA;
|
||||
path = DRIVE_GetLabel(drive);
|
||||
if (strlen(path) + 1 > *cbRemoteName)
|
||||
{
|
||||
*cbRemoteName = strlen(path) + 1;
|
||||
return WN_MORE_DATA;
|
||||
}
|
||||
strcpy( lpRemoteName, path );
|
||||
*cbRemoteName = strlen(lpRemoteName) + 1;
|
||||
return WN_SUCCESS;
|
||||
|
@ -194,7 +201,7 @@ int WINAPI WNetGetCaps(WORD capability)
|
|||
int WINAPI WNetDeviceMode(HWND16 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",
|
||||
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",
|
||||
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",
|
||||
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",
|
||||
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)
|
||||
{
|
||||
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",
|
||||
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",
|
||||
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",
|
||||
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",
|
||||
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",
|
||||
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",
|
||||
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",
|
||||
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",
|
||||
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",
|
||||
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)
|
||||
{
|
||||
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",
|
||||
hEnum, cRequ, lpCount, lpBuf);
|
||||
return WN_NET_ERROR;
|
||||
return WN_NO_NETWORK;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* WNetOpenEnum [USER.???]
|
||||
*/
|
||||
UINT16 WINAPI WNetOpenEnum(DWORD dwScope, DWORD dwType,
|
||||
LPNETRESOURCE lpNet, HANDLE16 *lphEnum)
|
||||
UINT16 WINAPI WNetOpenEnum16(DWORD dwScope, DWORD dwType,
|
||||
LPNETRESOURCE16 lpNet, HANDLE16 *lphEnum)
|
||||
{
|
||||
printf("EMPTY STUB !!! WNetOpenEnum(%08lX, %08lX, %p, %p);\n",
|
||||
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)
|
||||
{
|
||||
UINT16 x;
|
||||
|
@ -410,3 +430,13 @@ WNetGetConnection32A(LPCSTR localname,LPSTR remotename,LPDWORD buflen)
|
|||
*buflen = x;
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -89,3 +89,12 @@ LONG WINAPI DocumentProperties32A(HWND32 hWnd,HANDLE32 hPrinter,
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#include "winerror.h"
|
||||
#include "file.h"
|
||||
#include "heap.h"
|
||||
#include "string32.h"
|
||||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
#include "xmalloc.h"
|
||||
|
@ -78,9 +77,25 @@ static KEYSTRUCT *key_dyn_data=NULL;
|
|||
/* what valuetypes do we need to convert? */
|
||||
#define UNICONVMASK ((1<<REG_SZ)|(1<<REG_MULTI_SZ)|(1<<REG_EXPAND_SZ))
|
||||
|
||||
#define strdupA2W(x) STRING32_DupAnsiToUni(x)
|
||||
#define strdupW(x) STRING32_strdupW(x)
|
||||
#define strchrW(a,c) STRING32_lstrchrW(a,c)
|
||||
extern LPWSTR __cdecl CRTDLL_wcschr(LPWSTR a,WCHAR 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 {
|
||||
LPKEYSTRUCT lpkey;
|
||||
|
@ -1454,7 +1469,7 @@ __w31_dumptree( unsigned short idx,
|
|||
idx=dir->sibling_idx;
|
||||
continue;
|
||||
}
|
||||
name=STRING32_DupAnsiToUni(tail);
|
||||
name=strdupA2W(tail);
|
||||
|
||||
xlpkey=_find_or_add_key(lpkey,name);
|
||||
|
||||
|
@ -1464,7 +1479,7 @@ __w31_dumptree( unsigned short idx,
|
|||
val=(struct _w31_valent*)&tab[dir->value_idx];
|
||||
memcpy(tail,&txt[val->string_off],val->length);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
400
misc/shell.c
400
misc/shell.c
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
* Shell Library Functions
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
@ -17,8 +18,12 @@
|
|||
#include "win.h"
|
||||
#include "graphics.h"
|
||||
#include "cursoricon.h"
|
||||
#include "interfaces.h"
|
||||
#include "sysmetrics.h"
|
||||
#include "shlobj.h"
|
||||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
#include "debugstr.h"
|
||||
#include "winreg.h"
|
||||
|
||||
static const char * const SHELL_People[] =
|
||||
|
@ -29,6 +34,7 @@ static const char * const SHELL_People[] =
|
|||
"Peter Bajusz",
|
||||
"Georg Beyerle",
|
||||
"Ross Biro",
|
||||
"Martin Boehme",
|
||||
"Uwe Bonnes",
|
||||
"Erik Bos",
|
||||
"Fons Botman",
|
||||
|
@ -36,12 +42,14 @@ static const char * const SHELL_People[] =
|
|||
"Andrew Bulhak",
|
||||
"John Burton",
|
||||
"Niels de Carpentier",
|
||||
"Gordon Chaffee",
|
||||
"Jimen Ching",
|
||||
"David A. Cuthbert",
|
||||
"Huw D. M. Davies",
|
||||
"Roman Dolejsi",
|
||||
"Frans van Dorsselaer",
|
||||
"Chris Faherty",
|
||||
"Carsten Fallesen",
|
||||
"Paul Falstad",
|
||||
"David Faure",
|
||||
"Claus Fischer",
|
||||
|
@ -89,6 +97,7 @@ static const char * const SHELL_People[] =
|
|||
"Andreas Mohr",
|
||||
"Philippe De Muyter",
|
||||
"Itai Nahshon",
|
||||
"Kristian Nielsen",
|
||||
"Henrik Olsen",
|
||||
"Michael Patra",
|
||||
"Dimitrie O. Paun",
|
||||
|
@ -132,12 +141,14 @@ static const char * const SHELL_People[] =
|
|||
"Eric Warnke",
|
||||
"Manfred Weichel",
|
||||
"Morten Welinder",
|
||||
"Len White",
|
||||
"Lawson Whitney",
|
||||
"Jan Willamowius",
|
||||
"Carl Williams",
|
||||
"Karl Guenter Wuensch",
|
||||
"Eric Youngdale",
|
||||
"James Youngman",
|
||||
"Nikita V. Youshchenko",
|
||||
"Mikolaj Zalewski",
|
||||
"John Zero",
|
||||
NULL
|
||||
|
@ -746,48 +757,52 @@ BOOL32 WINAPI ShellAbout32W( HWND32 hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff,
|
|||
|
||||
/*************************************************************************
|
||||
* 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_OS2_HEADER ne_header;
|
||||
int size;
|
||||
char magic[4];
|
||||
int size;
|
||||
|
||||
*retptr = NULL;
|
||||
_llseek32( hFile, 0, SEEK_SET );
|
||||
if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
|
||||
(mz_header.e_magic != IMAGE_DOS_SIGNATURE)) return (BYTE*)-1;
|
||||
if ( (_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
|
||||
(mz_header.e_magic != IMAGE_DOS_SIGNATURE)
|
||||
)
|
||||
return 0;
|
||||
|
||||
_llseek32( hFile, mz_header.e_lfanew, SEEK_SET );
|
||||
if (_lread32( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
|
||||
return NULL;
|
||||
if (_lread32( hFile, magic, sizeof(magic) ) != sizeof(magic))
|
||||
return 0;
|
||||
_llseek32( hFile, mz_header.e_lfanew, SEEK_SET);
|
||||
|
||||
if (ne_header.ne_magic == IMAGE_NT_SIGNATURE)
|
||||
{ fprintf(stdnimp,"Win32s FIXME: file %s line %i\n", __FILE__, __LINE__ );
|
||||
return NULL; }
|
||||
if (*(DWORD*)magic == IMAGE_NT_SIGNATURE)
|
||||
return IMAGE_NT_SIGNATURE;
|
||||
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* RetPtr = NULL;
|
||||
BYTE* pData;
|
||||
LPBYTE pData;
|
||||
OFSTRUCT ofs;
|
||||
DWORD sig;
|
||||
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);
|
||||
|
||||
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);
|
||||
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;
|
||||
UINT16 iconDirCount = 0;
|
||||
UINT16 iconCount = 0;
|
||||
NE_TYPEINFO* pTInfo = (NE_TYPEINFO*)(pData + 2);
|
||||
NE_NAMEINFO* pIconStorage = NULL;
|
||||
NE_NAMEINFO* pIconDir = NULL;
|
||||
|
@ -980,30 +997,181 @@ HGLOBAL16 WINAPI InternalExtractIcon(HINSTANCE16 hInstance,
|
|||
if( lpiID ) HeapFree( GetProcessHeap(), 0, lpiID);
|
||||
else HeapFree( GetProcessHeap(), 0, pData);
|
||||
}
|
||||
_lclose32( hFile );
|
||||
|
||||
/* return array with icon handles */
|
||||
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 hRet;
|
||||
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* ExtractIcon16 (SHELL.34)
|
||||
*/
|
||||
HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
|
||||
UINT16 nIconIndex )
|
||||
UINT16 nIconIndex )
|
||||
{
|
||||
HGLOBAL16 handle = InternalExtractIcon(hInstance,lpszExeFileName,nIconIndex, 1);
|
||||
|
||||
if( handle )
|
||||
{
|
||||
HICON16* ptr = (HICON16*)GlobalLock16(handle);
|
||||
HICON16 hIcon = *ptr;
|
||||
|
||||
GlobalFree16(handle);
|
||||
return hIcon;
|
||||
}
|
||||
return 0;
|
||||
return ExtractIcon32A( hInstance, lpszExeFileName, nIconIndex );
|
||||
}
|
||||
|
||||
|
||||
|
@ -1011,10 +1179,32 @@ HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
|
|||
* ExtractIcon32A (SHELL32.133)
|
||||
*/
|
||||
HICON32 WINAPI ExtractIcon32A( HINSTANCE32 hInstance, LPCSTR lpszExeFileName,
|
||||
UINT32 nIconIndex )
|
||||
UINT32 nIconIndex )
|
||||
{
|
||||
/* FIXME */
|
||||
return ExtractIcon16( hInstance, lpszExeFileName, nIconIndex );
|
||||
HGLOBAL16 handle = InternalExtractIcon(hInstance,lpszExeFileName,nIconIndex, 1);
|
||||
|
||||
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
|
||||
* executable) and patch parameters if needed.
|
||||
*/
|
||||
HICON16 WINAPI ExtractAssociatedIcon(HINSTANCE16 hInst,LPSTR lpIconPath,
|
||||
LPWORD lpiIcon)
|
||||
HICON16 WINAPI ExtractAssociatedIcon16(HINSTANCE16 hInst,LPSTR lpIconPath,
|
||||
LPWORD lpiIcon)
|
||||
{
|
||||
HICON16 hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
|
||||
|
||||
if( hIcon < 2 )
|
||||
{
|
||||
{
|
||||
|
||||
if( hIcon == 1 ) /* no icons found in given file */
|
||||
{
|
||||
{
|
||||
char tempPath[0x80];
|
||||
UINT16 uRet = FindExecutable16(lpIconPath,NULL,tempPath);
|
||||
|
||||
if( uRet > 32 && tempPath[0] )
|
||||
{
|
||||
{
|
||||
strcpy(lpIconPath,tempPath);
|
||||
hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
|
||||
hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
|
||||
|
||||
if( hIcon > 2 ) return hIcon;
|
||||
}
|
||||
}
|
||||
else hIcon = 0;
|
||||
}
|
||||
|
||||
if( hIcon == 1 )
|
||||
*lpiIcon = 2; /* MSDOS icon - we found .exe but no icons in it */
|
||||
else
|
||||
*lpiIcon = 6; /* generic icon - found nothing */
|
||||
}
|
||||
|
||||
GetModuleFileName16(hInst, lpIconPath, 0x80);
|
||||
if( hIcon == 1 )
|
||||
*lpiIcon = 2; /* MSDOS icon - we found .exe but no icons in it */
|
||||
else
|
||||
*lpiIcon = 6; /* generic icon - found nothing */
|
||||
|
||||
GetModuleFileName16(hInst, lpIconPath, 0x80);
|
||||
hIcon = LoadIcon16( hInst, MAKEINTRESOURCE(*lpiIcon));
|
||||
}
|
||||
}
|
||||
|
||||
return hIcon;
|
||||
}
|
||||
|
@ -1066,30 +1256,30 @@ HICON16 WINAPI ExtractAssociatedIcon(HINSTANCE16 hInst,LPSTR lpIconPath,
|
|||
*/
|
||||
LPSTR SHELL_FindString(LPSTR lpEnv, LPCSTR entry)
|
||||
{
|
||||
UINT16 l = strlen(entry);
|
||||
for( ; *lpEnv ; lpEnv+=strlen(lpEnv)+1 )
|
||||
{
|
||||
if( lstrncmpi32A(lpEnv, entry, l) ) continue;
|
||||
|
||||
if( !*(lpEnv+l) )
|
||||
return (lpEnv + l); /* empty entry */
|
||||
else if ( *(lpEnv+l)== '=' )
|
||||
return (lpEnv + l + 1);
|
||||
}
|
||||
return NULL;
|
||||
UINT16 l = strlen(entry);
|
||||
for( ; *lpEnv ; lpEnv+=strlen(lpEnv)+1 )
|
||||
{
|
||||
if( lstrncmpi32A(lpEnv, entry, l) ) continue;
|
||||
|
||||
if( !*(lpEnv+l) )
|
||||
return (lpEnv + l); /* empty entry */
|
||||
else if ( *(lpEnv+l)== '=' )
|
||||
return (lpEnv + l + 1);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SEGPTR WINAPI FindEnvironmentString(LPSTR str)
|
||||
{
|
||||
SEGPTR spEnv = GetDOSEnvironment();
|
||||
LPSTR lpEnv = (LPSTR)PTR_SEG_TO_LIN(spEnv);
|
||||
|
||||
LPSTR lpString = (spEnv)?SHELL_FindString(lpEnv, str):NULL;
|
||||
SEGPTR spEnv = GetDOSEnvironment();
|
||||
LPSTR lpEnv = (LPSTR)PTR_SEG_TO_LIN(spEnv);
|
||||
|
||||
if( lpString ) /* offset should be small enough */
|
||||
return spEnv + (lpString - lpEnv);
|
||||
LPSTR lpString = (spEnv)?SHELL_FindString(lpEnv, str):NULL;
|
||||
|
||||
return (SEGPTR)NULL;
|
||||
if( lpString ) /* offset should be small enough */
|
||||
return spEnv + (lpString - lpEnv);
|
||||
|
||||
return (SEGPTR)NULL;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
|
@ -1249,6 +1439,30 @@ DWORD WINAPI SHGetFileInfo32A(LPCSTR path,DWORD dwFileAttributes,
|
|||
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]
|
||||
*/
|
||||
|
@ -1329,9 +1543,7 @@ void WINAPI FreeIconList( DWORD dw )
|
|||
*/
|
||||
|
||||
/* This is the wrong place, but where is the right one? */
|
||||
typedef UINT32 REFCLSID32;
|
||||
typedef UINT32 REFIID32;
|
||||
typedef UINT32 HRESULT32;
|
||||
#if 0
|
||||
#define E_OUTOFMEMORY 0x8007000EL
|
||||
|
||||
HRESULT32 WINAPI SHELL32_DllGetClassObject (REFCLSID32 clsid,
|
||||
|
@ -1346,3 +1558,9 @@ HRESULT32 WINAPI SHELL32_DllGetClassObject (REFCLSID32 clsid,
|
|||
|
||||
return hres;
|
||||
}
|
||||
#endif
|
||||
|
||||
DWORD WINAPI SHGetDesktopFolder(LPSHELLFOLDER *shellfolder) {
|
||||
*shellfolder = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -117,8 +117,14 @@ static VERSION VERSION_GetVersion(void)
|
|||
if (!pCurrentProcess) /* at startuptime probably */
|
||||
return defaultVersion;
|
||||
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 ? */
|
||||
peheader = pCurrentProcess->exe_modref->pe_module->pe_header;
|
||||
}
|
||||
peheader = PE_HEADER(pCurrentProcess->exe_modref->module);
|
||||
if (peheader->OptionalHeader.MajorSubsystemVersion == 4)
|
||||
/* FIXME: NT4 has the same majorversion; add a check here for it. */
|
||||
return WIN95;
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -149,6 +149,7 @@ static INT32 WPRINTF_ParseFormatW( LPCWSTR format, WPRINTF_FORMAT *res )
|
|||
}
|
||||
if (*p == 'l') { res->flags |= WPRINTF_LONG; p++; }
|
||||
else if (*p == 'h') { res->flags |= WPRINTF_SHORT; p++; }
|
||||
else if (*p == 'w') { res->flags |= WPRINTF_WIDE; p++; }
|
||||
switch((CHAR)*p)
|
||||
{
|
||||
case 'c':
|
||||
|
@ -162,10 +163,10 @@ static INT32 WPRINTF_ParseFormatW( LPCWSTR format, WPRINTF_FORMAT *res )
|
|||
res->type = WPR_SIGNED;
|
||||
break;
|
||||
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;
|
||||
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;
|
||||
case 'u':
|
||||
res->type = WPR_UNSIGNED;
|
||||
|
|
|
@ -114,7 +114,7 @@ int main( int argc, char *argv[] )
|
|||
|
||||
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" );
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ C_SRCS = \
|
|||
int26.c \
|
||||
int2a.c \
|
||||
int2f.c \
|
||||
int3d.c \
|
||||
int4b.c \
|
||||
int5c.c \
|
||||
interrupts.c \
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
|
@ -1258,9 +1258,10 @@ void WINAPI GetClipCursor32( RECT32 *rect )
|
|||
*
|
||||
* FIXME: exact parameter sizes
|
||||
*/
|
||||
UINT16 WINAPI LookupIconIdFromDirectoryEx16( CURSORICONDIR *dir, BOOL16 bIcon,
|
||||
INT16 WINAPI LookupIconIdFromDirectoryEx16( LPBYTE xdir, BOOL16 bIcon,
|
||||
INT16 width, INT16 height, UINT16 cFlag )
|
||||
{
|
||||
CURSORICONDIR *dir = (CURSORICONDIR*)xdir;
|
||||
UINT16 retVal = 0;
|
||||
if( dir && !dir->idReserved && (dir->idType & 3) )
|
||||
{
|
||||
|
@ -1285,31 +1286,41 @@ UINT16 WINAPI LookupIconIdFromDirectoryEx16( CURSORICONDIR *dir, BOOL16 bIcon,
|
|||
/**********************************************************************
|
||||
* LookupIconIdFromDirectoryEx32 (USER32.379)
|
||||
*/
|
||||
INT32 WINAPI LookupIconIdFromDirectoryEx32( CURSORICONDIR *dir, BOOL32 bIcon,
|
||||
INT32 WINAPI LookupIconIdFromDirectoryEx32( LPBYTE dir, BOOL32 bIcon,
|
||||
INT32 width, INT32 height, UINT32 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,
|
||||
bIcon ? SYSMETRICS_CXICON : SYSMETRICS_CXCURSOR,
|
||||
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)
|
||||
*/
|
||||
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",
|
||||
hResource, lpDir ? lpDir->idCount : 0);
|
||||
hResource, lpDir ? ((CURSORICONDIR*)lpDir)->idCount : 0);
|
||||
|
||||
switch(resType)
|
||||
{
|
||||
|
|
380
objects/dib.c
380
objects/dib.c
|
@ -27,7 +27,7 @@ typedef struct
|
|||
{
|
||||
DC *dc;
|
||||
LPCVOID bits;
|
||||
DWORD lines;
|
||||
int lines;
|
||||
DWORD infoWidth;
|
||||
WORD depth;
|
||||
WORD infoBpp;
|
||||
|
@ -145,7 +145,7 @@ int DIB_BitmapInfoSize( BITMAPINFO * info, WORD coloruse )
|
|||
* Return 1 for INFOHEADER, 0 for COREHEADER, -1 for error.
|
||||
*/
|
||||
static int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, DWORD *width,
|
||||
DWORD *height, WORD *bpp )
|
||||
int *height, WORD *bpp )
|
||||
{
|
||||
if (header->biSize == sizeof(BITMAPINFOHEADER))
|
||||
{
|
||||
|
@ -235,50 +235,66 @@ static int *DIB_BuildColorMap( DC *dc, WORD coloruse, WORD depth,
|
|||
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
|
||||
*
|
||||
* 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,
|
||||
int *colors, XImage *bmpImage )
|
||||
{
|
||||
DWORD i, x;
|
||||
BYTE pix;
|
||||
const BYTE *bits = srcbits;
|
||||
int h;
|
||||
|
||||
/* 32 bit aligned */
|
||||
DWORD linebytes = ((srcwidth + 31) & ~31) / 8;
|
||||
|
||||
while (lines--)
|
||||
{
|
||||
for (i = dstwidth/8, x = 0; (i > 0); i--)
|
||||
{
|
||||
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] );
|
||||
if (lines > 0) {
|
||||
for (h = lines-1; h >=0; h--) {
|
||||
DIB_SetImageBits_1_Line(dstwidth, colors, bmpImage, h, srcbits);
|
||||
srcbits += linebytes;
|
||||
}
|
||||
pix = *bits;
|
||||
switch(dstwidth & 7)
|
||||
{
|
||||
case 7: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
|
||||
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] );
|
||||
} else {
|
||||
for (h = 0; h < lines; h++) {
|
||||
DIB_SetImageBits_1_Line(dstwidth, colors, bmpImage, h, srcbits);
|
||||
srcbits += linebytes;
|
||||
}
|
||||
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.
|
||||
*/
|
||||
static void DIB_SetImageBits_4( DWORD lines, const BYTE *srcbits,
|
||||
static void DIB_SetImageBits_4( int lines, const BYTE *srcbits,
|
||||
DWORD srcwidth, DWORD dstwidth,
|
||||
int *colors, XImage *bmpImage )
|
||||
{
|
||||
DWORD i, x;
|
||||
int h;
|
||||
const BYTE *bits = srcbits;
|
||||
|
||||
/* 32 bit aligned */
|
||||
DWORD linebytes = ((srcwidth+7)&~7)/2;
|
||||
|
||||
while (lines--)
|
||||
{
|
||||
for (i = dstwidth/2, x = 0; i > 0; i--)
|
||||
{
|
||||
BYTE pix = *bits++;
|
||||
XPutPixel( bmpImage, x++, lines, colors[pix >> 4] );
|
||||
XPutPixel( bmpImage, x++, lines, colors[pix & 0x0f] );
|
||||
if (lines > 0) {
|
||||
for (h = lines-1; h >= 0; 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;
|
||||
}
|
||||
} 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.
|
||||
*/
|
||||
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 )
|
||||
{
|
||||
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.
|
||||
*/
|
||||
static void DIB_SetImageBits_8( DWORD lines, const BYTE *srcbits,
|
||||
DWORD srcwidth, DWORD dstwidth,
|
||||
static void DIB_SetImageBits_8( int lines, const BYTE *srcbits,
|
||||
DWORD srcwidth, DWORD dstwidth,
|
||||
int *colors, XImage *bmpImage )
|
||||
{
|
||||
DWORD x;
|
||||
int h;
|
||||
const BYTE *bits = srcbits;
|
||||
|
||||
/* align to 32 bit */
|
||||
DWORD linebytes = (srcwidth + 3) & ~3;
|
||||
|
||||
while (lines--)
|
||||
{
|
||||
for (x = 0; x < dstwidth; x++)
|
||||
XPutPixel( bmpImage, x, lines, colors[*bits++] );
|
||||
srcbits += linebytes;
|
||||
bits = srcbits;
|
||||
if (lines > 0) {
|
||||
for (h = lines - 1; h >= 0; h--) {
|
||||
for (x = 0; x < dstwidth; x++, bits++) {
|
||||
XPutPixel( bmpImage, x, h, colors[*bits] );
|
||||
}
|
||||
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 */
|
||||
};
|
||||
|
||||
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 )
|
||||
{
|
||||
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
|
||||
*
|
||||
* 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,
|
||||
DC *dc, XImage *bmpImage )
|
||||
{
|
||||
DWORD x;
|
||||
const BYTE *bits = srcbits;
|
||||
int h;
|
||||
|
||||
/* align to 32 bit */
|
||||
DWORD linebytes = (srcwidth * 3 + 3) & ~3;
|
||||
|
||||
/* "bits" order is reversed for some reason */
|
||||
|
||||
while (lines--)
|
||||
{
|
||||
for (x = 0; x < dstwidth; x++, bits += 3)
|
||||
XPutPixel( bmpImage, x, lines,
|
||||
COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])) );
|
||||
if (lines > 0) {
|
||||
for (h = lines - 1; h >= 0; 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);
|
||||
}
|
||||
} 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;
|
||||
XImage *bmpImage;
|
||||
DWORD compression = 0;
|
||||
int lines;
|
||||
|
||||
if (descr->info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
|
||||
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);
|
||||
|
||||
/* 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)
|
||||
{
|
||||
|
@ -657,10 +792,19 @@ static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
|
|||
else DIB_SetImageBits_8( descr->lines, descr->bits, descr->infoWidth,
|
||||
descr->width, colorMapping, bmpImage );
|
||||
break;
|
||||
case 15:
|
||||
case 16:
|
||||
DIB_SetImageBits_16( descr->lines, descr->bits, descr->infoWidth,
|
||||
descr->width, descr->dc, bmpImage);
|
||||
break;
|
||||
case 24:
|
||||
DIB_SetImageBits_24( descr->lines, descr->bits, descr->infoWidth,
|
||||
descr->width, descr->dc, bmpImage );
|
||||
break;
|
||||
case 32:
|
||||
DIB_SetImageBits_32( descr->lines, descr->bits, descr->infoWidth,
|
||||
descr->width, descr->dc, bmpImage);
|
||||
break;
|
||||
default:
|
||||
fprintf( stderr, "Invalid depth %d for SetDIBits!\n", descr->infoBpp );
|
||||
break;
|
||||
|
@ -670,7 +814,7 @@ static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
|
|||
descr->xSrc, descr->ySrc, descr->xDest, descr->yDest,
|
||||
descr->width, descr->height );
|
||||
XDestroyImage( bmpImage );
|
||||
return descr->lines;
|
||||
return lines;
|
||||
}
|
||||
|
||||
|
||||
|
@ -732,7 +876,7 @@ INT32 WINAPI SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
|
|||
{
|
||||
DIB_SETIMAGEBITS_DESCR descr;
|
||||
BITMAPOBJ * bmp;
|
||||
DWORD height;
|
||||
int height, tmpheight;
|
||||
INT32 result;
|
||||
|
||||
/* Check parameters */
|
||||
|
@ -755,6 +899,8 @@ INT32 WINAPI SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
|
|||
GDI_HEAP_UNLOCK( hdc );
|
||||
return 0;
|
||||
}
|
||||
tmpheight = height;
|
||||
if (height < 0) height = -height;
|
||||
if (!lines || (startscan >= height))
|
||||
{
|
||||
GDI_HEAP_UNLOCK( hbitmap );
|
||||
|
@ -764,7 +910,7 @@ INT32 WINAPI SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
|
|||
if (startscan + lines > height) lines = height - startscan;
|
||||
|
||||
descr.bits = bits;
|
||||
descr.lines = lines;
|
||||
descr.lines = tmpheight >= 0 ? lines : -lines;
|
||||
descr.depth = bmp->bitmap.bmBitsPixel;
|
||||
descr.info = info;
|
||||
descr.coloruse = coloruse;
|
||||
|
@ -807,7 +953,8 @@ INT32 WINAPI SetDIBitsToDevice32(HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
|
|||
{
|
||||
DIB_SETIMAGEBITS_DESCR descr;
|
||||
DC * dc;
|
||||
DWORD width, height;
|
||||
DWORD width;
|
||||
int height, tmpheight;
|
||||
|
||||
/* Check parameters */
|
||||
|
||||
|
@ -820,6 +967,8 @@ INT32 WINAPI SetDIBitsToDevice32(HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
|
|||
if (DIB_GetBitmapInfo( &info->bmiHeader, &width,
|
||||
&height, &descr.infoBpp ) == -1)
|
||||
return 0;
|
||||
tmpheight = height;
|
||||
if (height < 0) height = -height;
|
||||
if (!lines || (startscan >= height)) return 0;
|
||||
if (startscan + lines > height) lines = height - 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.bits = bits;
|
||||
descr.lines = lines;
|
||||
descr.lines = tmpheight >= 0 ? lines : -lines;
|
||||
descr.infoWidth = width;
|
||||
descr.depth = dc->w.bitsPerPixel;
|
||||
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 );
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* 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)
|
||||
|
@ -1018,6 +1252,18 @@ INT32 WINAPI GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
|
|||
bbits += pad;
|
||||
}
|
||||
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:
|
||||
fprintf(stderr,"GetDIBits*: unsupported depth %d\n",
|
||||
info->bmiHeader.biBitCount
|
||||
|
@ -1069,10 +1315,12 @@ HBITMAP32 WINAPI CreateDIBitmap32( HDC32 hdc, const BITMAPINFOHEADER *header,
|
|||
{
|
||||
HBITMAP32 handle;
|
||||
BOOL32 fColor;
|
||||
DWORD width, height;
|
||||
DWORD width;
|
||||
int height;
|
||||
WORD bpp;
|
||||
|
||||
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. */
|
||||
/* We create a monochrome bitmap only if it has exactly 2 */
|
||||
|
|
|
@ -1189,3 +1189,21 @@ BOOL32 WINAPI TranslateCharSetInfo(LPDWORD lpSrc,LPCHARSETINFO lpCs,DWORD dwFlag
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
@ -648,3 +648,15 @@ INT16 WINAPI GetTextCharset16(HDC16 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;
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
/* At the moment, these are only empty stubs.
|
||||
*/
|
||||
#define INITGUID
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -15,6 +16,8 @@
|
|||
#include "stddebug.h"
|
||||
#include "debug.h"
|
||||
#include "compobj.h"
|
||||
#include "interfaces.h"
|
||||
#include "shlobj.h"
|
||||
|
||||
DWORD currentMalloc=0;
|
||||
|
||||
|
@ -159,7 +162,7 @@ OLESTATUS WINAPI StringFromCLSID(const CLSID *id, LPSTR idstr)
|
|||
char *s;
|
||||
int i;
|
||||
|
||||
sprintf(idstr, "{%08lx-%04x-%04x-%2x%2x-",
|
||||
sprintf(idstr, "{%08lx-%04x-%04x-%02x%02x-",
|
||||
id->Data1, id->Data2, id->Data3,
|
||||
id->Data4[0], id->Data4[1]);
|
||||
s = &idstr[25];
|
|
@ -46,3 +46,16 @@ HRESULT WINAPI OleFlushClipboard()
|
|||
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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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
Loading…
Reference in New Issue