wine-wine/debugger
Alexandre Julliard f90efa9cf0 Release 980614
Sun Jun 15 10:30:35 1998  Andreas Mohr <100.30936@germany.net>

	* [files/dos_fs.c] [files/file.c] [if1632/wprocs.spec]
	  [misc/aspi.c]
	Added support for scanners that need Adaptec's ASPI2DOS.

	* [graphics/env.c] [misc/printerdrv.c] [graphics/win16drv/init.c]
	  [if1632/gdi.spec] [include/gdi.h]
	Enhanced printer support (especially Win95):
	Drv[GS]etPrinterData, [GS]etEnvironment; added AbortProc handling.

	* [misc/tapi32.c] [relay32/tapi32.spec]
	Added some stubs.

	* [configure.in] [graphics/fontengine.c] [include/windows.h]
	  [misc/comm.c] [misc/w32skrnl.c] [misc/win32s16.c]
	Made Wine compile on HP-UX (just for fun ;)

	* [controls/menu.c] [include/windows.h]
	Complete rewrite of EnableMenuItem32.
	Free Agent 32 still doesn't work :(

	* [misc/version.c] [if1632/kernel.spec] [include/winbase.h]
	Implemented GetVersionEx16.

	* [misc/network.c] [if1632/user.spec]
	Fixed arguments of WNetGetPropertyText.

	* [misc/version.c] [relay32/comctl32.spec] [relay32/oleaut32.spec]
	Implemented COMCTL32_DllGetVersion, OaBuildVersion.

	* [win32/file.c]
	Fixed UNC handling of CreateFile32.

Sat Jun 13 22:35:12 1998  Douglas Ridgway  <ridgway@winehq.com>

	* [Makefile.in] [Make.rules.in]
	Added pattern for CVS merge files to 'make clean'

	* [ole/olecli.c] [windows/scroll.c] [windows/grahics.c]
	Add some DC handle unlocking. (When hdc's are always unlocked,
	they can be made moveable.)

	* [documentation/wine.texinfo] 
	Started a Wine Design chapter with discussion of 
	graphics driver model.

Sat Jun 13 11:19:25 1998  David Luyer <luyer@ucs.uwa.edu.au>

	* [misc/main.c] [relay32/relay386.c]
	Added new option -debugmsg +relay=.... or -debugmsg -relay=...

Fri Jun 12 22:56:09 1998  Marcus Meissner <marcus@jet.franken.de>

	* [relay32/snoop.c][relay32/builtin.c][loader/pe_image.c]
	Added inter win32 dll snooping. Use -debugmsg +snoop.
	Number of arguments and string references are autodetected.
	Some small bugfixes in the PE loader.

	* [misc/system.c]
	Disabled SystemTimers. They do not work with the current
	%fs handling in the 32->16 relaycode. (helps labview)

	* [msdos/dpmi.c][msdos/int2f.c][files/drive.c]
	Added a monoton linear increasing memory allocator for DPMI (required
	for LabView, HAFAS, ...)
	mscdex handling in emulated realmode interrupts (for mcicda.drv)
	allocate logical drives only once. (helps Myst)

	* [files/profile.c]
	Handle ^Z as space. Found on CDROMS (helps Myst Installer).

	* [multimedia/mmio.c]
	mmio* partially updated to win32. No funny additions.

	* [windows/driver.c]
	Added win32 driver handling (will be used for win32 multimedia/
	msvideo drivers).

	* [win32/device.c]
	Added device handling (K32OBJ_DEVICE_IOCTL). Implemented 
	VTDAPI.5 (used by win95' WINMM.timeGetTime())

Fri Jun 12 18:01:18 1998 Rein Klazes <rklazes@casema.net>

	* [ole/compobj.c relay32/ole32.spec]
	Add a stub for CoLockObjectExternal32.

	* [objects/clipping.c]
	Fix in IntersectClipRect(), when there is no initial clipping
	region.

	* [graphics/x11drv/graphics.c]
	Corrected several "one-off" errors for the Ellipse, Rectangle
	and RoundRectangle (especially small ones) draw routines. 
	Arc and friends still have to be done.

Fri Jun 12 06:23:19 1998  Matthew Becker <mbecker@glasscity.net>

	* [misc/ntdll.c]
	Fixed some of the parameter counts.

	* [misc/registry.c]
	General cleanup, documentation.
	Standard keys are allowed to be 'closed' and succeed.

	* [misc/shell.c]
	Check for correct return values from Reg* functions.

	* [win32/newfns.c]
	Added stubs for OpenDesktopA, SetThreadDesktop, and
	SetUserObjectInformationA.

Wed Jun 10  20:28:08 1998  James Juran  <jrj120@psu.edu>

	* [debugger/break.c]
	Fixed bug introduced in 980503 that broke the -debug command 
	line option for PE executable files.

	* [configure.in] [include/acconfig.h] [include/debugtools.h]
	  [documentation/debug-msgs]
	Added 'configure' options to compile out debugging messages.
	Use --disable-debug to disable all debugging messages, and
	--disable-trace to just disable TRACE messages.  This results
	in a stripped executable that is 15-20% smaller.  This option
	is very much untested--don't expect it to work.

	* [documentation/debug-msgs] [documentation/debugging]
	Minor updates.

	* [*/*.c]
	Fixed some compile warnings.  This also includes the
	compile_warnings_trivial patch from WineHQ.

Tue Jun 10 22:00:18 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>

	* [windows/sysmetrics.c][include/sysmetrics.h]
	Fixed some Win95 values.

	* [windows/nonclient.c][include/windows.h]
	Fixed some Win95 drawing bugs.
	Added extended window style flags (WS_EX_xxx).

	* [misc/printdrv.c][relay32/winspool.spec]
	Added stubs for DeletePrinterDriver32A, DeleteMonitor32A
	and DeletePort32A.

	* [windows/mdi.c][include/windows.h][relay32/user32.spec]
	Added stubs for CascadeWindows and TileWindows.

	* [controls/toolbar.c][include/toolbar.h]
	Fixed a few bugs and implemented new features.

	* [misc/shellord.c][relay32/shell32.spec]
	Added stubs for SHELL32_60, SHELL32_61 and SHELL32_184.

	* [controls/comctl32undoc.c][relay32/comctl32.spec]
	New file comctl32undoc.c. Contains undocumented functions
	of COMCTL32.DLL. These functions are needed to run EXPLORER.EXE
	IEXPLORE.EXE and TASKMAN.EXE.

	* [controls/status.c]
	Added text alignment.

Tue Jun  8 22:00:00 1998  Bertho Stultiens <bertho@akhphd.au.dk>

	* [programs/*/Makefile.in]
	Changed the rules to use wrc as resource compiler but
	passing the source through gcc first for macro expansion.

	* [programs/*/*.rc]
	Added #include "windows.h" for the resource compiler in the
	appropriate files.

	* [tools/wrc/wrc.[ch]] [tools/wrc/writeres.c]
	Added commandline option -A for autoregister code.
	Corrected the underscore problem by checking the proper define
	from config.h.

Sun Jun  7 22:09:29 1998  Pascal Cuoq <pcuoq@ens-lyon.fr>

	* [ole/ole2nls.c] [memory/string.c]
	Improved LCMapString32A, and changed CompareString32A,
	lstrcmp, lstrcmpi to use it.

Sat Jun  6 19:00:50 1998  Martin Strömberg <ams@ludd.luth.se>

	* [include/winnt.h]
	Added typedefs for security and tokens.

Sat Jun  6 12:26:31 1998  Morten Welinder  <terra@diku.dk>

	* [objects/text.c]
	Use debugstr_an in DrawText16.

	* [loader/resource.c]
	Use debugres_w in FindResourceEx32W.  Avoid crashing during
	debug when wm is NULL.

	* [if1632/relay.c]
	In RELAY_DebugCallTo16, send output to the right place and
	avoid side effects in macro arguments.

Wed Jun  3 20:56:03 1998  Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>

	* [controls/scroll.c] [windows/nonclient.c]
	Fix several off by one errors in scrollbar painting.

Tue Jun  2 23:58:59 1998  Insomnia (Stea Greene) <insomnia@core.binghamton.edu>

	* [graphics/dsound.c]
	Rewrote mixer code to handle panning and volume for 16->16, 16->8,
	8->16, and 8->8 bit mixes.  Conforms to DirectX's "logarithmic
	hearing scale" as specified in M$VC docs.  Still does not handle
	mixing of different frequencies (I am still working on that). 
	Tested 16->16 extensively with StarCraft.  Other mixing combinations
	untested but should work fine.  Still kind of a work in progress,
	so be warned.

Tue Jun  2 03:31:33 1998  Alexander V. Lukyanov <lav@long.yar.ru>

	* [tools/wrc/utils.c]
	dup_basename: fix to strip directory.

Mon Jun  1 20:00:00 1998  Juergen Schmied <juergen.schmied@metronet.de>

	* [include/windows.h] [objects/cursoricon.c] [relay32/user32.spec]
	Added stubs LoadCursorFromFileW and LoadCursorFromFileA.
1998-06-14 15:24:15 +00:00
..
Makefile.in Release 980329 1998-03-29 19:44:57 +00:00
README Release 970120 1997-01-20 19:43:45 +00:00
TODO Release 970120 1997-01-20 19:43:45 +00:00
break.c Release 980614 1998-06-14 15:24:15 +00:00
db_disasm.c Release 980601 1998-06-01 10:44:35 +00:00
dbg.y Release 980601 1998-06-01 10:44:35 +00:00
dbgmain.c Release 980517 1998-05-17 17:13:43 +00:00
debug.l Release 971101 1997-11-01 19:08:16 +00:00
display.c Release 970305 1997-03-05 08:22:35 +00:00
editline.c Release 960717 1996-07-17 20:02:21 +00:00
expr.c Release 971130 1997-11-30 17:45:40 +00:00
expr.h Release 970112 1997-01-12 18:32:19 +00:00
hash.c Release 980517 1998-05-17 17:13:43 +00:00
info.c Release 971221 1997-12-21 19:17:50 +00:00
memory.c Release 980614 1998-06-14 15:24:15 +00:00
msc.c Release 971130 1997-11-30 17:45:40 +00:00
registers.c Release 980503 1998-05-03 19:01:20 +00:00
source.c Release 980503 1998-05-03 19:01:20 +00:00
stabs.c Release 980614 1998-06-14 15:24:15 +00:00
stack.c Release 980503 1998-05-03 19:01:20 +00:00
types.c Release 971101 1997-11-01 19:08:16 +00:00

README

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

	This is the core of the Wine debugger.  The reverse assember
was stolen from Mach more or less intact.  It turns out that there are
two variables that are set differently if you are reverse assembling
16 bit code, and on the whole it seems to work.

NEWS:

	The internal debugger has *tons* more capability than it did before.
I have enclosed some examples that show usage at the end of this file.
New features include:

	1) Ability of debugger to read debug information from wine executable
*and* from Win32 executables.  Local variable and line number information is
also read and processed.

	2) The internal debugger is capable of 'stepping' to the next
line number, just like gdb.  Examples of the commands are:

	step
	stepi
	si
	step 3
	si 5
	next
	nexti
	cont 4
	finish

All of these should be exactly like how gdb does things.

	3) The internal debugger now has a sense of what source file and line
number a given PC is at.  New commands to support this are just like gdb,
and include:

	list
	dir
	show dir

there are a variety of formats of arguments for the list command.  All
permutations supported by gdb should also be supported.

	4) The internal debugger knows about datatypes of various objects,
for both Win32 *and* the debugging information in the wine executable itself.
I have enclosed an example of how this works at the end.

	5) There are more ways the 'b' command can be used to set breakpoints.
Examples are:

	b *0x8190000
	b 1100
	b Usage
	b

I don't think this covers all of the permutations that gdb accepts (this should
be cleaned up someday so that all possibilities are acceptable).

	6)  The 'print' and 'x' commands should behave more or less exactly
as they do under gdb.  The difference is that the way the data is presented
will be slightly different, but the content should be fundamentally the same.

	7) The internal debugger now supports conditional breakpoints, and
automatic display expressions.  An example is at the end of this file.  The
syntax and usage should be identical to that of gdb.

	8) Type casts can be made from within the debugger, but they currently
don't work with typedef'ed types.  They only work with builtin types and
named structures unions, etc.  The problem is that internally we don't always
record the typedefed names of structures, so we have no guarantee that we
would know what each type is.  This can be fixed, of course -  it just takes
more memory.  Note that in some cases, typedefed structures could be cast
using '(struct typedfname)' instead of '(typedfname)'.   Technically this
isn't quite correct, but if and when the rest of this stuff gets fixed,
this would need to get corrected too.

NOTES:

	If it weren't for the fact that gdb doesn't grok the Win32 debug
information, you could just use gdb.  The internal debugger should be able
to read and use debugging information for both Win32 and also for the
Wine executable, making it possible to debug the combination of the two
together as if it were one large (very large) entity.

LIMITATIONS AND DIFFERENCES FROM GDB:

	You cannot set a breakpoint by file and line number as you can
with gdb.  Adding support for this wouldn't be all that tough, I guess, but
it would be a nuisance.   You can set a breakpoint given a function and
line number, however.  An example would be 'b main:2993'.  It turns out
that the way the internal data structures are arranged it is a whole lot
easier to do things in this way than it would be to try and get the
source:line type of breakpoint working, but it would probably be worth it
to try.

	Getting stack traces through Wine itself can be a bit tricky.
This is because by default the thing is built with optimization
enabled, and as a result sometimes functions don't get frames, and
lots of variables are optimized into registers.  You can turn off
optimization for a few key source files if it will help you.

	Memory consumption is getting to be a real problem.  I think 32Mb is
no longer sufficient to debug wine - 48 or 64 is probably a whole lot better.
Unfortunately I cannot shut down X to save memory :-).

*************************************************************************
EXAMPLES:

	Here is an example of how I tracked down a bug in Wine.  The program
is something that just maps and dumps the contents of a Win32 executable.
It was dying for some reason.

Start the first time through.

bash$ ls -l dumpexe.exe 
-rw-rw-r--   1 eric     devel      168448 Jan  4 13:51 dumpexe.exe
bash$ ./wine -debug './dumpexe.exe -symbol ./dumpexe.exe'
Warning: invalid dir 'e:\test' in path, deleting it.
Win32 task 'W32SXXXX': Breakpoint 1 at 0x081a3450
Loading symbols from ELF file ./wine...
Loading symbols from ELF file /usr/X11R6/lib/libXpm.so.4.6...
Loading symbols from ELF file /usr/X11R6/lib/libSM.so.6.0...
Loading symbols from ELF file /usr/X11R6/lib/libICE.so.6.0...
Loading symbols from ELF file /usr/X11R6/lib/libXext.so.6.0...
Loading symbols from ELF file /usr/X11R6/lib/libX11.so.6.0...
Loading symbols from ELF file /lib/libm.so.5.0.5...
Loading symbols from ELF file /lib/libc.so.5.2.18...
Loading symbols from ELF file /lib/ld-linux.so.1...
Loading symbols from Win32 file ./dumpexe.exe...
Stopped on breakpoint 1 at 0x081a3450 (_mainCRTStartup)
In 32 bit mode.
*** Invalid address 0x414c5ff8 (KERNEL32_NULL_THUNK_DATA+0x3930ee6c)
0x081a3450 (_mainCRTStartup):  movl	%fs:0,%eax
Wine-dbg>b DumpFile
Breakpoint 2 at 0x081a0078 (DumpFile+0x9 [dumpexe.c:2723])
Wine-dbg>c
Dump File: ./dumpexe.exe
Stopped on breakpoint 2 at 0x081a0078 (DumpFile+0x9 [dumpexe.c:2723])
Enter path to file dumpexe.c: ../de
2723		HANDLE			  hFile = NULL;
0x081a0078 (DumpFile+0x9 [dumpexe.c:2723]):  movl	$0x0,0xfffffff4(%ebp)
Wine-dbg>list
2723		HANDLE			  hFile = NULL;
2724		HANDLE			  hMap  = NULL;
2725		PSTR			  lpMap = NULL;
2726		DWORD			  dwFileSize     = 0;
2727		DWORD			  dwFileSizeHigh = 0;
2728	
2729		PIMAGE_DOS_HEADER	  lpImageDOS  = NULL;
2730		PIMAGE_FILE_HEADER	  lpImageFile = NULL;
2731		PIMAGE_NT_HEADERS	  lpImageNT   = NULL;
2732	
2733		/*
Wine-dbg>n 10
2747		dwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
0x081a00ea (DumpFile+0x7b [dumpexe.c:2747]):  leal	0xfffffff0(%ebp),%eax
Wine-dbg>n
2749		    && (GetLastError() != NO_ERROR) )
0x081a00fb (DumpFile+0x8c [dumpexe.c:2749]):  cmpl	$-1,0xffffffe8(%ebp)
Wine-dbg>x/d dwFileSize
x/d dwFileSize
 168448
Wine-dbg>n
2758					 PAGE_READONLY, 0, 0, (LPSTR) NULL);
0x081a0124 (DumpFile+0xb5 [dumpexe.c:2758]):  pushl	$0x0
Wine-dbg>list 2750
list 2750
2750		{
2751			Fatal("Cannot get size of file %s", lpFileName);
2752		}
2753		
2754		/*
2755		 * map the file
2756		 */
2757		hMap = CreateFileMapping(hFile, (LPSECURITY_ATTRIBUTES) NULL,
2758					 PAGE_READONLY, 0, 0, (LPSTR) NULL);
2759		if( hMap == NULL )
2760		{
Wine-dbg>n
2759		if( hMap == NULL )
0x081a013b (DumpFile+0xcc [dumpexe.c:2759]):  cmpl	$0,0xfffffffc(%ebp)
Wine-dbg>x hMap
 08e48c30
Wine-dbg>n
2767		lpMap = (LPSTR) MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
0x081a0156 (DumpFile+0xe7 [dumpexe.c:2767]):  pushl	$0x0
Wine-dbg>n
2768		if( lpMap == NULL )
0x081a016b (DumpFile+0xfc [dumpexe.c:2768]):  cmpl	$0,0xffffffe0(%ebp)
Wine-dbg>print lpMap
0x414c5f40
Wine-dbg>x lpMap
 40007000
Wine-dbg> x/10x 0x40007000
 x/10x 0x40007000
0x40007000 (KERNEL32_NULL_THUNK_DATA+0x37e4fe74): *** Invalid address 0x40007000 (KERNEL32_NULL_THUNK_DATA+0x37e4fe74)
Wine-dbg>quit
$

*******************************************************************
The first time through, we find that MapViewOfFile isn't mapping the file
correctly into the virtual address space.  Try running again, and step into
MapViewOfFile to figure out what went wrong.
*******************************************************************


bash$ ./wine -debug './dumpexe.exe -symbol ./dumpexe.exe'
Warning: invalid dir 'e:\test' in path, deleting it.
Win32 task 'W32SXXXX': Breakpoint 1 at 0x081a3450
Loading symbols from ELF file ./wine...
Loading symbols from ELF file /usr/X11R6/lib/libXpm.so.4.6...
Loading symbols from ELF file /usr/X11R6/lib/libSM.so.6.0...
Loading symbols from ELF file /usr/X11R6/lib/libICE.so.6.0...
Loading symbols from ELF file /usr/X11R6/lib/libXext.so.6.0...
Loading symbols from ELF file /usr/X11R6/lib/libX11.so.6.0...
Loading symbols from ELF file /lib/libm.so.5.0.5...
Loading symbols from ELF file /lib/libc.so.5.2.18...
Loading symbols from ELF file /lib/ld-linux.so.1...
Loading symbols from Win32 file ./dumpexe.exe...
Stopped on breakpoint 1 at 0x081a3450 (_mainCRTStartup)
In 32 bit mode.
*** Invalid address 0x414c5ff8 (KERNEL32_NULL_THUNK_DATA+0x3930ee6c)
0x081a3450 (_mainCRTStartup):  movl	%fs:0,%eax
Wine-dbg>b DumpFile:2767
Breakpoint 2 at 0x081a0156 (DumpFile+0xe7 [dumpexe.c:2767])
Wine-dbg>c
Dump File: ./dumpexe.exe
Stopped on breakpoint 2 at 0x081a0156 (DumpFile+0xe7 [dumpexe.c:2767])
Enter path to file dumpexe.c: ../de
2767		lpMap = (LPSTR) MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
0x081a0156 (DumpFile+0xe7 [dumpexe.c:2767]):  pushl	$0x0
Wine-dbg>step
390	0385 stdcall MapViewOfFile(long long long long long) MapViewOfFile
0x080d793c (KERNEL32_385 [kernel32.spec:390]):  pushl	%ebp
Wine-dbg>step
223	    if (!debugging_relay) return;
0x080c83dc (RELAY_DebugCallFrom32+0xc [relay.c:223]):  cmpw	$0,0x644a
Wine-dbg>
244	}
0x080c848e (RELAY_DebugCallFrom32+0xbe [relay.c:244]):  leal	0xfffffff4(%ebp),%esp
Wine-dbg>
103	    return MapViewOfFileEx(handle,access,offhi,offlo,size,0);
0x080911a4 (MapViewOfFile+0x14 [file.c:103]):  pushl	$0x0
Wine-dbg>
113	    FILEMAP_OBJECT *fmap = (FILEMAP_OBJECT*)handle;
0x080911cf (MapViewOfFileEx+0xf [file.c:113]):  movl	0x8(%ebp),%esi
Wine-dbg>n
115	    if (!size) size = fmap->size;
0x080911d2 (MapViewOfFileEx+0x12 [file.c:115]):  testl	%ebx,%ebx
Wine-dbg>list
list
115	    if (!size) size = fmap->size;
116	    if (!size) size = 1;
117	    return mmap ((caddr_t)st, size, fmap->prot, 
118	                 MAP_ANON|MAP_PRIVATE, 
119			 FILE_GetUnixHandle(fmap->hfile),
120			 offlo);
121	}
122	
123	/***********************************************************************
124	 *           UnmapViewOfFile                  (KERNEL32.385)
125	 */
Wine-dbg>x size
 00000000
Wine-dbg>n
116	    if (!size) size = 1;
0x080911d9 (MapViewOfFileEx+0x19 [file.c:116]):  testl	%ebx,%ebx
Wine-dbg>x size
 00000000
Wine-dbg>n
117	    return mmap ((caddr_t)st, size, fmap->prot, 
0x080911e2 (MapViewOfFileEx+0x22 [file.c:117]):  pushl	%eax
Wine-dbg>x size
 00000000
Wine-dbg>info local
MapViewOfFileEx:handle == 0x08e48c90
MapViewOfFileEx:access == 0x00000004
MapViewOfFileEx:offhi == 0x00000000
MapViewOfFileEx:offlo == 0x00000000
MapViewOfFileEx:size == 0x00000000
MapViewOfFileEx:st == 0x00000000
MapViewOfFileEx:offlo optimized into register $eax 
MapViewOfFileEx:size optimized into register $ebx 
MapViewOfFileEx:st optimized into register $edi 
MapViewOfFileEx:fmap optimized into register $esi 
Wine-dbg>print $ebx
0x0001
Wine-dbg>bt
bt
Backtrace:
=>0 0x080911e2 (MapViewOfFileEx+0x22 [file.c:117])
  1 0x080911b0 (MapViewOfFile+0x20(handle=0x8e48c90, access=0x4, offhi=0x0, offlo=0x0, size=0x0) [file.c:104])
  2 0x08104ab5 (CallFrom32_stdcall_5+0x25 [callfrom32.s])
  3 0x081a0168 (DumpFile+0xf9(lpFileName=0x414c61ed) [dumpexe.c:2767])
  4 0x081a0c35 (main+0x410(argc=0x3, argv=0x414c61cc) [dumpexe.c:3078])
  5 0x081a3514 (_mainCRTStartup+0xc4)
  6 0x0810549f (Code_Start+0x13 [callto32.s])
  7 0x0802fdac (TASK_CallToStart+0x8c [task.c:373])

Wine-dbg>

*******************************************************************
Notice that you can step through the thunks into our own transfer
routines.   You will notice that the source line displays as something
like:

390	0385 stdcall MapViewOfFile(long long long long long) MapViewOfFile

This is just the source line from the spec file that caused the transfer
routine to be generated.  From this you can step again, and you step
into the relay logging code - keep stepping and you eventually step into
the actual function that does the dirty work.

	At this point an examination of the source to the Win32 program
and an examination of the source to win32/file.s showed where the problem
was.  When you specify 0 for the size of the object in CreateFileMapping,
it is supposed to use the entire size of the file as the size of the
object.  Instead we were just blindly copying the number over.

*******************************************************************

Wine-dbg>b main
Breakpoint 1 at 0x080108c0 (main [dbgmain.c:213])
Wine-dbg>print breakpoints[1]
{addr={type=0x08043000, seg=0, off=134285504}, addrlen=' ', opcode='U', enabled=1, skipcount=0, in_use=1}

Wine-dbg> print breakpoints[1].enabled
1
Wine-dbg>set breakpoints[0].enabled = 0
Wine-dbg>print breakpoints[0].enabled
0

Wine-dbg>print type_hash_table[1]->type
STRUCT

Wine-dbg>print type_hash_table[1]
0x08072020
Wine-dbg>print *type_hash_table[1]
print *type_hash_table[1]
{type=STRUCT, next=0x00000000, name="LOGPALETTE", un={basic={basic_type=8, output_format="<22>V<08>M", basic_size=-128, b_signed=0}, bitfield={bitoff=8, nbits=0, basetype=0x081d56c0}, pointer={pointsto=0x00000008}, funct={rettype=0x00000008}, array={start=8, end=136140480, basictype=0x08043e80}, structure={size=8, members=0x081d56c0}, enumeration={members=0x00000008}}}
Wine-dbg>

*******************************************************************

	This example shows how you can print out various data structures.
Note that enumerated types are displayed in the symbolic form, and strings
are displayed in the expected manner.

	You can use the set command to set more or less anything.  Note
however that you cannot use enumerated types on the RHS of the expression.

*******************************************************************


Wine-dbg>list
2986            if( argc <= 1 )
2987            {
2988                    Usage(argv[0]);
2989            }
2990
2991            for( i = 1; i < argc; i++ )
2992            {
2993                    if( strncmp(argv[i], "-dos", sizeof("-dos") - 1) == 0 )
2994                    {
2995                            DmpCtrl.bDumpDOSHeader = TRUE;
2996                    }
Wine-dbg>b 2993
Breakpoint 3 at 0x081a8861 (main+0x3c [dumpexe.c:2993])
Wine-dbg>condition 3 i == 2
Wine-dbg>c
Stopped on breakpoint 3 at 0x081a8861 (main+0x3c [dumpexe.c:2993])
2993                    if( strncmp(argv[i], "-dos", sizeof("-dos") - 1) == 0 )
0x081a8861 (main+0x3c [dumpexe.c:2993]):  pushl $0x4
Wine-dbg>print i
2
Wine-dbg>print argv[i]
"./dumpexe.exe"

*******************************************************************

	This example shows how to use conditional breakpoints.
	Here is another one that demonstrates another cool feature
	conditional breakpoints that involve a function call:

		condition 3 strcmp(argv[i], "./dumpexe.exe") == 0

*******************************************************************


Wine-dbg>list
2986            if( argc <= 1 )
2987            {
2988                    Usage(argv[0]);
2989            }
2990
2991            for( i = 1; i < argc; i++ )
2992            {
2993                    if( strncmp(argv[i], "-dos", sizeof("-dos") - 1) == 0 )
2994                    {
2995                            DmpCtrl.bDumpDOSHeader = TRUE;
2996                    }
Wine-dbg>b 2993
Breakpoint 3 at 0x081a8861 (main+0x3c [dumpexe.c:2993])
Wine-dbg>condition 3 strcmp(argv[i], "./dumpexe.exe") == 0
Wine-dbg>info break
Breakpoints:
1: y 0x081ab450 (_mainCRTStartup)
2: y 0x081a882e (main+0x9 [dumpexe.c:2986])
3: y 0x081a8861 (main+0x3c [dumpexe.c:2993])
                stop when  ( strcmp(( argv[i] ), "./dumpexe.exe") == 0 )
Wine-dbg>c
Stopped on breakpoint 3 at 0x081a8861 (main+0x3c [dumpexe.c:2993])
2993                    if( strncmp(argv[i], "-dos", sizeof("-dos") - 1) == 0 )
0x081a8861 (main+0x3c [dumpexe.c:2993]):  pushl $0x4
Wine-dbg>print i
2
Wine-dbg>print argv[i]  
"./dumpexe.exe"
Wine-dbg>