Release 971101
Thu Oct 30 21:52:23 1997 Martin Boehme <boehme@informatik.mu-luebeck.de>
* [windows/nonclient.c]
Changed NC_TrackSysMenu to give the same behaviour as MS-Windows,
i.e. system menu already appears when mouse button is depressed.
Changed NC_HandleNCLButtonDblClk so that double clicks on scroll
bar arrows are handled the same way as single clicks.
* [windows/winpos.c]
Fixed SetWindowPos32 to clear WIN_NO_REDRAW when SWP_SHOWWINDOW is
set; this is the way MS-Windows behaves.
Thu Oct 30 21:08:57 1997 Morten Welinder <terra@diku.dk>
* [controls/status.c]
In SW_SetText, fix condition, I hope.
* [controls/menu.c]
(GetMenuState32): Don't mask return value. Print more debug info.
(MENU_MenuBarCalcSize): Be more careful when printing debug
information.
(MENU_SetItemData): Empty strings are separators.
* [graphics/x11drv/text.c]
Don't prototype CLIPPING_IntersectClipRect.
* [include/dc.h]
Prototype CLIPPING_IntersectClipRect.
* [objects/font.c]
Remove non-portable (and faulty) smartness in FONT_TextMetric*to*.
In CreateFont32W and CreateFont16, handle null font name.
* [objects/text.c]
(TEXT_NextLine): Fix end-of-line bug.
* [if1632/shell32.spec]
Activate existing implementation of ExtractIconA.
* [misc/shell.c]
For Control_RunDLL, add types for parameters.
Thu Oct 30 14:54:11 1997 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [controls/static.c] [include/windows.h] [misc/spy.c]
Added some win32 defines to static controls, basic SS_BITMAP style
handling implemented. [please add more, I am lacking knowledge and
time]
* [controls/status.c]
part_num 255 seems to indicate whole statusline (win95 cdplayer.exe)
* [if1632/thunk.c] [tools/build.c]
Support lret and 0x66 lret calls for CallTo16_regs
(needed for KERNEL32_45)
Fixed KERNEL32_45, QT_Thunk (should work now).
* [if1632/relay.c][if1632/builtin.c][tools/build.c][if1632/*32.spec]
Added string dumping to relay debugging for win32 apifuncs.
* [misc/ver.c]
Fixed and cleaned up VerQueryValue*.
* [multimedia/*.c][include/mmsystem.h][if1632/mmsystem.spec]
[if1632/winmm.spec]
Win32 support for lowlevel multimedia functions.
Added some mixer* lowlevel functions.
Some small fixes in the audio lowlevel queue handling, code
reformatting/cleanups.
* [debugger/hash.c]
Don't show difference between 16bit symbols if they are in
different segments.
* [objects/cursoricon.c]
Added GetIconInfo (partial) and CreateIconIndirect.
* [windows/mdi.c]
Fixed some "bad class" problems and crashes in MDICreateChild,
which happen in Win32 (jwp32.exe).
Wed Oct 29 00:57:27 1997 Bruce Milner <Bruce.Milner@genetics.utah.edu>
* [if1632/winaspi.spec] [misc/aspi.c] [include/aspi.c]
[documentation/aspi] [include/callback.h]
Added support for 16 bit ASPI calls to linux generic SCSI.
The support is not complete, but appears to run my Mustek
scanner from within ipplus.exe.
Mon Oct 27 00:59:41 1997 Alex Korobka <alex@trantor.pharm.sunysb.edu>
* [windows/dce.c]
DC reuse framework.
Sun Oct 26 18:41:21 1997 Huw D M Davies <h.davies1@physics.oxford.ac.uk>
* [graphics/x11drv/xfont.c]
Substituted fonts are removed from the alias table. References to
the old name are also updated.
* [controls/combo.c]
LB_SELECTSTRING32 not CB_SELECTSTRING32 should be sent to
ComboLBox.
Sun Oct 26 14:25:00 1997 Nikita V. Youshchenko <yoush@cs.msu.su>
* [include/drive.h] [files/drive.c] [msdos/int21.c]
Partially implemented DOS drive mapping (int21 AX=440F).
Sat Oct 25 13:03:29 1997 Alexandre Julliard <julliard@lrc.epfl.ch>
* [debugger/debug.l]
Support '.' in identifiers. Use "x . y" to access structure
fields.
* [debugger/hash.c] [loader/pe_image.c]
Load entry points of Win32 modules only when entering the
debugger.
* [debugger/break.c]
New function DEBUG_AddModuleBreakpoint() to set a breakpoint at
the start of every module.
* [files/file.c]
FILE_mmap() can now fake mmap() for unaligned offsets or broken
filesystems.
* [include/callback.h] [misc/callback.c] [if1632/thunk.c]
Use a table of callbacks instead of macros to differentiate
between emulator and Winelib.
* [loader/task.c]
Initialize current directory from cwd, not from module path.
* [tools/build.c]
Read CallTo16 prototypes directly from thunk.c source file.
* [windows/winproc.c] [windows/mdi.c]
Added translation for WM_MDIACTIVATE and WM_MDIGETACTIVE.
Fri Oct 24 21:41:25 1997 Uwe Bonnes <bon@elektron.ikp.tu-darmstadt.de>
* [files/drive.c]
Allow arguments like "a" for the drive related apis.
* [memory/global.c]
Keep the calculation for dwMemoryLoad in range.
* [misc/crtdll.c]
Make CRTDLL_getcwd use GetCurrentDirectory32A and alloc
its memory if requested.
Implemented CRTDLL_rename and CRTDLL_stat needed for
lcc-win32:wedit.exe.
Implemented CRTDLL__fullpath.
* [misc/comm.c]
High speed modes for the 16-bit mode Comm functions.
* [misc/cpu.c]
As applications may treat lpMaximumApplicationAddress as long,
use a valid long number.
* [misc/main.c]
In SystemParametersInfo16 ignore SPI_GETHIGHCONTRAST too.
* [misc/ole2nls.c]
Implement LCMAP_UPPERCASE for LCMapString32.
* [misc/wsprintf]
Made WPRINTF_ParseFormatA understand %ws.
* [win32/file.c]
Ignore FILE_ATTRIBUTE_NORMAL.
Stub for ReadFileEx.
Fri Oct 24 15:36:02 1997 Doug Ridgway <ridgway@routh.ucsd.edu>
* [memory/local.c]
Local heap exhaustion message now prints which builtin heap filled.
Fri Oct 24 00:46:34 1997 Huw D M Davies <h.davies1@physics.oxford.ac.uk>
* [windows/dialog.c]
Reversed CreateFont16/32W typo.
Thu Oct 23 23:44:20 1997 Kristian Nielsen <kristian.nielsen@risoe.dk>
* [if1632/user.spec]
Fixed argument list for ChangeClipboardChain.
* [windows/mdi.c]
Pass correct hInstance to CreateWindow16() in MDICreateChild().
Mon Oct 20 11:51:24 1997 Carsten Fallesen <cf@it.dtu.dk>
* [objects/metafile.c]
Added support for META_SETTEXTCHAREXTRA.
* [objects/region.c]
Fixed crash in XPolygonRegion if there is only one point in
in the region.
* [if1632/gdi32.spec][include/gdi.h][include/windows.h]
[objects/gdiobj.c]
Completed OBJ_XXX defines in gdi.h, removed OBJ_XXX in gdiobj.c
and included gdi.h instead. Implemented GetObjectType32().
Thu Oct 16 17:21:32 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
* [documentation/wine.texinfo]
Fixed WIN32 and Makefiles entries of Reference manual node, that
made makeinfo dump core.
Mon Oct 13 17:15:57 1997 Robert Wilhelm <robert@physiol.med.tu-muenchen.de>
* [if1632/crtdll.spec]
Added missing math functions y0(), y1(), y2(), floor(), frexp(),
ldexp(), modf().
diff --git a/debugger/hash.c b/debugger/hash.c
index 610785f..dc81bd6 100644
--- a/debugger/hash.c
+++ b/debugger/hash.c
@@ -12,6 +12,7 @@
#include <sys/types.h>
#include <neexe.h>
#include "module.h"
+#include "process.h"
#include "selectors.h"
#include "debugger.h"
#include "toolhelp.h"
@@ -264,8 +265,7 @@
c++;
if( (strcmp(c, "callfrom16.s") == 0)
|| (strcmp(c, "callto16.s") == 0)
- || (strcmp(c, "callfrom32.s") == 0)
- || (strcmp(c, "callto32.s") == 0) )
+ || (strcmp(c, "call32.s") == 0) )
{
new->flags |= SYM_TRAMPOLINE;
}
@@ -676,9 +676,13 @@
{
if (addr->off == nearest->addr.off)
sprintf( name_buffer, "%s%s", nearest->name, arglist);
- else
- sprintf( name_buffer, "%s+0x%lx%s", nearest->name,
- addr->off - nearest->addr.off, arglist);
+ else {
+ if (addr->seg && (nearest->addr.seg!=addr->seg))
+ return NULL;
+ else
+ sprintf( name_buffer, "%s+0x%lx%s", nearest->name,
+ addr->off - nearest->addr.off, arglist);
+ }
}
return name_buffer;
}
@@ -734,6 +738,132 @@
/***********************************************************************
+ * DEBUG_LoadEntryPoints16
+ *
+ * Load the entry points of a Win16 module into the hash table.
+ */
+static void DEBUG_LoadEntryPoints16( HMODULE16 hModule, NE_MODULE *pModule,
+ const char *name )
+{
+ DBG_ADDR addr;
+ char buffer[256];
+ FARPROC16 address;
+
+ /* First search the resident names */
+
+ unsigned char *cpnt = (unsigned char *)pModule + pModule->name_table;
+ while (*cpnt)
+ {
+ cpnt += *cpnt + 1 + sizeof(WORD);
+ sprintf( buffer, "%s.%.*s", name, *cpnt, cpnt + 1 );
+ if ((address = MODULE_GetEntryPoint( hModule,
+ *(WORD *)(cpnt + *cpnt + 1) )))
+ {
+ addr.seg = HIWORD(address);
+ addr.off = LOWORD(address);
+ addr.type = NULL;
+ DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
+ }
+ }
+
+ /* Now search the non-resident names table */
+
+ if (!pModule->nrname_handle) return; /* No non-resident table */
+ cpnt = (char *)GlobalLock16( pModule->nrname_handle );
+ while (*cpnt)
+ {
+ cpnt += *cpnt + 1 + sizeof(WORD);
+ sprintf( buffer, "%s.%.*s", name, *cpnt, cpnt + 1 );
+ if ((address = MODULE_GetEntryPoint( hModule,
+ *(WORD *)(cpnt + *cpnt + 1) )))
+ {
+ addr.seg = HIWORD(address);
+ addr.off = LOWORD(address);
+ addr.type = NULL;
+ DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
+ }
+ }
+}
+
+
+/***********************************************************************
+ * DEBUG_LoadEntryPoints32
+ *
+ * Load the entry points of a Win32 module into the hash table.
+ */
+static void DEBUG_LoadEntryPoints32( PE_MODULE *pe, const char *name )
+{
+#define RVA(x) (load_addr+(DWORD)(x))
+
+ DBG_ADDR addr;
+ char buffer[256];
+ int i, j;
+ IMAGE_EXPORT_DIRECTORY *exports;
+ 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;
+ if (!pem) return;
+ load_addr = pem->load_addr;
+ exports = pem->pe_export;
+
+ addr.seg = 0;
+ addr.type = NULL;
+
+ /* Add start of DLL */
+
+ addr.off = load_addr;
+ 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 );
+ DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
+
+ /* Add start of sections */
+
+ for (i = 0; i < pe->pe_header->FileHeader.NumberOfSections; i++)
+ {
+ sprintf( buffer, "%s.%s", name, pe->pe_seg[i].Name );
+ addr.off = RVA( pe->pe_seg[i].VirtualAddress );
+ DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
+ }
+
+ /* Add exported functions */
+
+ if (!exports) return;
+ ordinals = (WORD *)RVA( exports->AddressOfNameOrdinals );
+ names = (const char **)RVA( exports->AddressOfNames );
+ functions = (void **)RVA( exports->AddressOfFunctions );
+
+ for (i = 0; i < exports->NumberOfNames; i++)
+ {
+ if (!names[i]) continue;
+ sprintf( buffer, "%s.%s", name, (char *)RVA(names[i]) );
+ addr.off = RVA( functions[ordinals[i]] );
+ DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
+ }
+
+ for (i = 0; i < exports->NumberOfFunctions; i++)
+ {
+ if (!functions[i]) continue;
+ /* Check if we already added it with a name */
+ for (j = 0; j < exports->NumberOfNames; j++)
+ if ((ordinals[j] == i) && names[j]) break;
+ if (j < exports->NumberOfNames) continue;
+ sprintf( buffer, "%s.%ld", name, i + exports->Base );
+ addr.off = (DWORD)RVA( functions[i] );
+ DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
+ }
+#undef RVA
+}
+
+
+/***********************************************************************
* DEBUG_LoadEntryPoints
*
* Load the entry points of all the modules into the hash table.
@@ -742,58 +872,24 @@
{
MODULEENTRY entry;
NE_MODULE *pModule;
- DBG_ADDR addr;
- char buffer[256];
- unsigned char *cpnt, *name;
- FARPROC16 address;
BOOL32 ok;
for (ok = ModuleFirst(&entry); ok; ok = ModuleNext(&entry))
{
if (!(pModule = MODULE_GetPtr( entry.hModule ))) continue;
- if (pModule->flags & NE_FFLAGS_WIN32) continue;
+ fprintf( stderr, " %s", entry.szModule );
- name = (unsigned char *)pModule + pModule->name_table;
-
- fprintf( stderr, " %.*s",*name, name + 1 );
-
- /* First search the resident names */
-
- cpnt = (unsigned char *)pModule + pModule->name_table;
- while (*cpnt)
+ if (pModule->flags & NE_FFLAGS_WIN32) /* PE module */
{
- cpnt += *cpnt + 1 + sizeof(WORD);
- sprintf( buffer, "%.*s_%.*s", *name, name + 1, *cpnt, cpnt + 1 );
- if ((address = MODULE_GetEntryPoint( entry.hModule,
- *(WORD *)(cpnt + *cpnt + 1) )))
- {
- addr.seg = HIWORD(address);
- addr.off = LOWORD(address);
- addr.type = NULL;
- DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
- }
+ if (pModule->flags & NE_FFLAGS_BUILTIN) continue;
+ DEBUG_LoadEntryPoints32( pModule->pe_module, entry.szModule );
}
-
- /* Now search the non-resident names table */
-
- if (!pModule->nrname_handle) continue; /* No non-resident table */
- cpnt = (char *)GlobalLock16( pModule->nrname_handle );
- while (*cpnt)
- {
- cpnt += *cpnt + 1 + sizeof(WORD);
- sprintf( buffer, "%.*s_%.*s", *name, name + 1, *cpnt, cpnt + 1 );
- if ((address = MODULE_GetEntryPoint( entry.hModule,
- *(WORD *)(cpnt + *cpnt + 1) )))
- {
- addr.seg = HIWORD(address);
- addr.off = LOWORD(address);
- addr.type = NULL;
- DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32);
- }
- }
+ else /* NE module */
+ DEBUG_LoadEntryPoints16( entry.hModule, pModule, entry.szModule );
}
}
+
void
DEBUG_AddLineNumber( struct name_hash * func, int line_num,
unsigned long offset )