Release 950901

Thu Aug 31 17:19:57 1995  Alexandre Julliard  <julliard@sunsite.unc.edu>

	* [Configure]
	Added compile-time option for IPC.

	* [configure.in]
	Added command-line options for language, IPC and malloc
	debugging.

	* [controls/menu.c]
	WM_MENUSELECT was sometimes sent to the wrong window.

	* [debugger/break.c]
	For the 'next' command, only step over instruction that require
	it. This allows 'next' to do the right thing with jmp and ret
	instructions.

	* [ipc/*.c] [memory/atom.c] [memory/global.c]
	IPC can now be configured out at compile-time.

	* [loader/task.c]
	Bug fix in TASK_Reschedule() that could cause a task to be deleted
	twice.

	* [miscemu/dosmem.c] (New file)
	Partial emulation of the BIOS data segment.

	* [miscemu/instr.c]
	Trap attempts to access selector 0x40 and remap the access to
	segment __0040H.

	* [tools/build.c]
	Fixed bug in CallTo32_LargeStack() that caused problems when
	compiling Wine with the -fomit-frame-pointer option.

	* [windows/message.c]
	Fixed bug in hardware event handling that could cause some events
	to get ignored.

Sat Aug 26 13:12:59 IST 1995 Michael Veksler <mveksler@vnet.ibm.com>

	* [ipc/README] [ipc/dde.tex]
	LaTeX documentation for the ipc and DDE stuff.

Wed Aug 23 22:01:23 GMT 1995 Michael Veksler <mveksler@vnet.ibm.com>

	* [ipc/Imakefile] [ipc/wine_test_stub.c]
	Fixed IPC testing. Now it can be compiled with "make tests"

Wed Aug 23 21:04:14 1995  Fons Botman  <botman@wab-tis.rabobank.nl>

	* [if1632/kernel.spec] [include/windows.h] [misc/main.c]
	Added GetWinDebugInfo/SetWinDebugInfo stub for player.exe

Sun Aug  20 13:49:42 1995  Marcus Meissner  <msmeissn@faui01.informatik.uni-erlangen.de>

	* [miscemu/int21.c]
	Misc fix to int21,ah=40 (write) to match _lwrite().
	AX=0x440A (check if handle is remote) added.

	* [multimedia/mmsystem.c]
	Moved mciSendString to mcistring.c.

	* [multimedia/mcistring.c]
	New file, string interface for MCI (not complete, not thoroughly
	tested).

	* [multimedia/audio.c]
	IOCTL prints errors; one paranoid check disabled.

	* [misc/file.c]
	Misc operator precedence fixes.

	* [if1632/gdi.spec] [objects/bitblt.c]
	Stub for FastWindowFrame (parameters not correct).

Sat Aug 19 01:31:23 1995  Graham Menhennitt <gfm@werple.mira.net.au>

	* [loader/ne_image.c]
	Preliminary support for iterated segments.

Sat Aug 19 00:43:04 1995  Andrew Taylor  (andrew@riscan.com)

	* [windows/mapping.c]
	In function MAPPING_FixIsotropic(), VportExt[XY] is multiplied by
 	the absolute value of (ydim / xdim) or (xdim / ydim).

Thu Aug 15 23:00:16  Gregory Trubetskoy  <grisha@mira.com>

	* [objects/oembitmap.c]
	Added some includes for Windows 95.

	* [include/sysmetrics.h]
	Added some sysmetrics for Windows 95.

	* [include/bitmaps/*95]
	New files: obm_close_95, obm_closed_95, obm_reduce_95, obm_reduced_95
	obm_zoom_95, obm_zoomd_95 - these are some pixmaps for Windows 95.

Thu Aug 10 12:00:00 1995  Jan Willamowius  (jan@janhh.shnet.org)

	* [misc/shell.c] [rc/sysres*.rc]
	The caption of the ShellAbout dialog box is language specific and
 	should be defined in the resources.
diff --git a/loader/Makefile.in b/loader/Makefile.in
index f250120..bf3e4cf 100644
--- a/loader/Makefile.in
+++ b/loader/Makefile.in
@@ -28,7 +28,7 @@
 	mv tmp_make Makefile
 
 clean:
-	rm -f *.o \#*\# *~ tmp_make
+	rm -f *.o \#*\# *~ *.bak tmp_make
 
 distclean: clean
 	rm -f Makefile
diff --git a/loader/main.c b/loader/main.c
index 384e3f3..9bb0185 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -66,6 +66,9 @@
       /* Initialize interrupt vectors */
     if (!INT_Init()) return 0;
 
+      /* Initialize DOS memory */
+    if (!DOSMEM_Init()) return 0;
+
       /* Initialize signal handling */
     init_wine_signals();
 
diff --git a/loader/module.c b/loader/module.c
index 45891b3..f518e6c 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -39,7 +39,6 @@
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegTable;
     struct dll_table_s *table;
-    char *dosmem;
     int i;
 
       /* Create the built-in modules */
@@ -82,47 +81,10 @@
         hFirstModule = hModule;
     }
 
-      /* Initialize some KERNEL exported values */
+    /* Initialize KERNEL.178 (__WINFLAGS) with the correct flags value */
 
-    if (!(hModule = GetModuleHandle( "KERNEL" ))) return TRUE;
+    MODULE_SetEntryPoint( GetModuleHandle( "KERNEL" ), 178, GetWinFlags() );
 
-      /* KERNEL.178: __WINFLAGS */
-    MODULE_SetEntryPoint( hModule, 178, GetWinFlags() );
-
-    /* Allocate 7 64k segments for 0000, A000, B000, C000, D000, E000, F000. */
-
-    dosmem = malloc( 0x70000 );
-
-    MODULE_SetEntryPoint( hModule, 183,  /* KERNEL.183: __0000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, dosmem,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 193,  /* KERNEL.193: __0040H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, dosmem + 0x400,
-                                  0x100, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 174,  /* KERNEL.174: __A000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, dosmem + 0x10000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 181,  /* KERNEL.181: __B000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, dosmem + 0x20000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 182,  /* KERNEL.182: __B800H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, dosmem + 0x28000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 195,  /* KERNEL.195: __C000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, dosmem + 0x30000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 179,  /* KERNEL.179: __D000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, dosmem + 0x40000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 190,  /* KERNEL.190: __E000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, dosmem + 0x50000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 173,  /* KERNEL.173: __ROMBIOS */
-                          GLOBAL_CreateBlock( GMEM_FIXED, dosmem + 0x60000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 194,  /* KERNEL.194: __F000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, dosmem + 0x60000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
     return TRUE;
 }
 
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 2a4e9ea..1450c0a 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -39,6 +39,8 @@
     int fd;
     struct relocation_entry_s *rep, *reloc_entries;
     BYTE *func_name;
+    int size;
+    char* mem;
 
     char buffer[100];
     int ordinal, additive;
@@ -51,23 +53,37 @@
 
     if (!pSeg->filepos) return TRUE;  /* No file image, just return */
 	
-	if (pSeg->flags & NE_SEGFLAGS_ITERATED)
-	{
-		fprintf(stderr, "Sorry, iterated segments are not supported\n"
-			"Please report that %*.*s, segment %d is such a segment\n",
-			*((BYTE*)pModule + pModule->name_table), 
-			*((BYTE*)pModule + pModule->name_table), 
-			(char *)pModule + pModule->name_table + 1,
-			segnum
-		);
-		exit(1);
-	}
-
     fd = MODULE_OpenFile( hModule );
     dprintf_module( stddeb, "Loading segment %d, selector=%04x\n",
                     segnum, pSeg->selector );
     lseek( fd, pSeg->filepos << pModule->alignment, SEEK_SET );
-    read( fd, GlobalLock( pSeg->selector ), pSeg->size ? pSeg->size : 0x10000);
+    size = pSeg->size ? pSeg->size : 0x10000;
+    mem = GlobalLock(pSeg->selector);
+    if (!(pSeg->flags & NE_SEGFLAGS_ITERATED))
+      read(fd, mem, size);
+    else {
+      /*
+	 The following bit of code for "iterated segments" was written without
+	 any documentation on the format of these segments. It seems to work,
+	 but may be missing something. If you have any doco please either send
+	 it to me or fix the code yourself. gfm@werple.mira.net.au
+      */
+      char* buff = malloc(size);
+      char* curr = buff;
+      read(fd, buff, size);
+      while(curr < buff + size) {
+	unsigned int rept = *((short*) curr)++;
+	unsigned int len = *((short*) curr)++;
+	for(; rept > 0; rept--) {
+	  char* bytes = curr;
+	  unsigned int byte;
+	  for(byte = 0; byte < len; byte++)
+	    *mem++ = *bytes++;
+	}
+	curr += len;
+      }
+      free(buff);
+    }
 
     if (!(pSeg->flags & NE_SEGFLAGS_RELOC_DATA))
         return TRUE;  /* No relocation data, we are done */
diff --git a/loader/signal.c b/loader/signal.c
index 82d9651..d943bc5 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -80,19 +80,21 @@
 	   it aligned  */
 	segv_act.sa_restorer = 
 	    (void (*)()) (((unsigned int)(cstack) + sizeof(cstack) - 4) & ~3);
-	usr2_act.sa_restorer= segv_act.sa_restorer;
-	usr2_act.sa_handler = (__sighandler_t) stop_wait;
 	/* Point to the top of the stack, minus 4 just in case, and make
 	   it aligned  */
 	wine_sigaction(SIGSEGV, &segv_act, NULL);
 	wine_sigaction(SIGILL, &segv_act, NULL);
 	wine_sigaction(SIGFPE, &segv_act, NULL);
-	wine_sigaction(SIGUSR2, &usr2_act, NULL);
 #ifdef SIGBUS
 	wine_sigaction(SIGBUS, &segv_act, NULL);
 #endif
 	wine_sigaction(SIGTRAP, &segv_act, NULL); /* For breakpoints */
-#endif
+#ifdef CONFIG_IPC
+	usr2_act.sa_restorer= segv_act.sa_restorer;
+	usr2_act.sa_handler = (__sighandler_t) stop_wait;
+	wine_sigaction(SIGUSR2, &usr2_act, NULL);
+#endif  /* CONFIG_IPC */
+#endif  /* linux */
 #if defined(__NetBSD__) || defined(__FreeBSD__)
         sigset_t sig_mask;
         struct sigaltstack ss;
@@ -134,6 +136,7 @@
                 perror("sigaction: SIGTRAP");
                 exit(1);
         }
+#ifdef CONFIG_IPC
         usr2_act.sa_handler = (void (*)) stop_wait; /* For breakpoints */
 	usr2_act.sa_flags = SA_ONSTACK;
         usr2_act.sa_mask = sig_mask;
@@ -141,7 +144,8 @@
                 perror("sigaction: SIGUSR2");
                 exit(1);
         }
-#endif
+#endif  /* CONFIG_IPC */
+#endif  /* __FreeBSD__ || __NetBSD__ */
 }
 
 #endif /* ifndef WINELIB */
diff --git a/loader/task.c b/loader/task.c
index 7350965..b2180f4 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -528,7 +528,7 @@
 /***********************************************************************
  *           TASK_DeleteTask
  */
-void TASK_DeleteTask( HTASK hTask )
+static void TASK_DeleteTask( HTASK hTask )
 {
     TDB *pTask;
 
@@ -600,11 +600,16 @@
     TDB *pOldTask = NULL, *pNewTask;
     HTASK hTask = 0;
 
+#ifdef CONFIG_IPC
     dde_reschedule();
+#endif
       /* First check if there's a task to kill */
 
     if (hTaskToKill && (hTaskToKill != hCurrentTask))
+    {
         TASK_DeleteTask( hTaskToKill );
+        hTaskToKill = 0;
+    }
 
       /* If current task is locked, simply return */
 
diff --git a/loader/wine.c b/loader/wine.c
deleted file mode 100644
index b88f985..0000000
--- a/loader/wine.c
+++ /dev/null
@@ -1,756 +0,0 @@
-static char RCSId[] = "$Id: wine.c,v 1.2 1993/07/04 04:04:21 root Exp root $";
-static char Copyright[] = "Copyright  Robert J. Amstadt, 1993";
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#ifdef linux
-#include <linux/unistd.h>
-#include <linux/head.h>
-#include <linux/ldt.h>
-#include <linux/segment.h>
-#endif
-#include <string.h>
-#include <errno.h>
-#include "neexe.h"
-#include "segmem.h"
-#include "prototypes.h"
-#include "dlls.h"
-#include "wine.h"
-#include "windows.h"
-#include "wineopts.h"
-#include "arch.h"
-#include "options.h"
-
-/* #define DEBUG_FIXUP */
-
-extern int CallToInit16(unsigned long csip, unsigned long sssp, 
-			unsigned short ds);
-extern void CallTo32();
-
-char * GetModuleName(struct w_files * wpnt, int index, char *buffer);
-extern unsigned char ran_out;
-extern char WindowsPath[256];
-char *WIN_ProgramName;
-
-unsigned short WIN_StackSize;
-unsigned short WIN_HeapSize;
-
-struct  w_files * wine_files = NULL;
-
-int WineForceFail = 0;
-
-char **Argv;
-int Argc;
-struct mz_header_s *CurrentMZHeader;
-struct ne_header_s *CurrentNEHeader;
-int CurrentNEFile;
-HINSTANCE hSysRes;
-
-static char *DLL_Extensions[] = { "dll", "exe", NULL };
-static char *EXE_Extensions[] = { "exe", NULL };
-static char *WinePath = NULL;
-
-FILE *SpyFp = NULL;
-
-/**********************************************************************
- *					myerror
- */
-void
-myerror(const char *s)
-{
-    if (s == NULL)
-	perror("wine");
-    else
-	fprintf(stderr, "wine: %s\n", s);
-
-    exit(1);
-}
-
-/**********************************************************************
- *					GetFilenameFromInstance
- */
-char *
-GetFilenameFromInstance(unsigned short instance)
-{
-    register struct w_files *w = wine_files;
-
-    while (w && w->hinstance != instance)
-	w = w->next;
-    
-    if (w)
-	return w->filename;
-    else
-	return NULL;
-}
-
-struct w_files *
-GetFileInfo(unsigned short instance)
-{
-    register struct w_files *w = wine_files;
-
-    while (w && w->hinstance != instance)
-	w = w->next;
-    
-    return w;
-}
-
-#ifndef WINELIB
-/**********************************************************************
- *
- * Load MZ Header
- */
-void load_mz_header(int fd, struct mz_header_s *mz_header)
-{
-    if (read(fd, mz_header, sizeof(struct mz_header_s)) !=
-	sizeof(struct mz_header_s))
-    {
-	myerror("Unable to read MZ header from file");
-    }
-}
-
-void load_ne_header (int fd, struct ne_header_s *ne_header)
-{
-    if (read(fd, ne_header, sizeof(struct ne_header_s)) 
-	!= sizeof(struct ne_header_s))
-    {
-	myerror("Unable to read NE header from file");
-    }
-}
-#endif
-
-/**********************************************************************
- *					LoadImage
- * Load one NE format executable into memory
- */
-HINSTANCE LoadImage(char *modulename, int filetype, int change_dir)
-{
-    unsigned int read_size;
-    int i;
-    struct w_files * wpnt, *wpnt1;
-    unsigned int status;
-    char buffer[256];
-    char *fullname;
-
-    /*
-     * search file
-     */
-    fullname = FindFile(buffer, sizeof(buffer), modulename, 
-			(filetype == EXE ? EXE_Extensions : DLL_Extensions), 
-			WindowsPath);
-    if (fullname == NULL)
-    {
-    	fprintf(stderr, "LoadImage: I can't find %s.dll | %s.exe !\n",
-		modulename, modulename);
-	return (HINSTANCE) NULL;
-    }
-
-    fullname = GetDosFileName(fullname);
-    WIN_ProgramName = strdup(fullname);
-    
-    fprintf(stderr,"LoadImage: loading %s (%s)\n           [%s]\n", 
-	    modulename, buffer, WIN_ProgramName);
-
-    if (change_dir && fullname)
-    {
-	char dirname[256];
-	char *p;
-
-	strcpy(dirname, fullname);
-	p = strrchr(dirname, '\\');
-	*p = '\0';
-
-	DOS_SetDefaultDrive(dirname[0] - 'A');
-	DOS_ChangeDir(dirname[0] - 'A', dirname + 2);
-    }
-
-    /* First allocate a spot to store the info we collect, and add it to
-     * our linked list.
-     */
-
-    wpnt = (struct w_files *) malloc(sizeof(struct w_files));
-    if(wine_files == NULL)
-      wine_files = wpnt;
-    else {
-      wpnt1 = wine_files;
-      while(wpnt1->next) wpnt1 =  wpnt1->next;
-      wpnt1->next  = wpnt;
-    };
-    wpnt->next = NULL;
-
-    /*
-     * Open file for reading.
-     */
-    wpnt->fd = open(buffer, O_RDONLY);
-    if (wpnt->fd < 0)
-    {
-	myerror(NULL);
-    }
-    /*
-     * Establish header pointers.
-     */
-    wpnt->filename = strdup(buffer);
-    wpnt->name = NULL;
-    if(modulename)  wpnt->name = strdup(modulename);
-
-    wpnt->mz_header = (struct mz_header_s *) malloc(sizeof(struct mz_header_s));;
-    status = lseek(wpnt->fd, 0, SEEK_SET);
-    load_mz_header (wpnt->fd, wpnt->mz_header);
-    if (wpnt->mz_header->must_be_0x40 != 0x40)
-	myerror("This is not a Windows program");
-    
-    wpnt->ne_header = (struct ne_header_s *) malloc(sizeof(struct ne_header_s));
-    status = lseek(wpnt->fd, wpnt->mz_header->ne_offset, SEEK_SET);
-    load_ne_header (wpnt->fd, wpnt->ne_header);
-    if (wpnt->ne_header->header_type[0] != 'N' || 
-	wpnt->ne_header->header_type[1] != 'E')
-      myerror("This is not a Windows program");
-
-    if(wine_files ==  wpnt){
-      CurrentMZHeader = wpnt->mz_header;
-      CurrentNEHeader = wpnt->ne_header;
-      CurrentNEFile   = wpnt->fd;
-      
-      WIN_StackSize = wpnt->ne_header->stack_length;
-      WIN_HeapSize = wpnt->ne_header->local_heap_length;
-    };
-
-    /*
-     * Create segment selectors.
-     */
-#ifndef WINELIB
-    status = lseek(wpnt->fd, wpnt->mz_header->ne_offset + 
-		   wpnt->ne_header->segment_tab_offset,
-		   SEEK_SET);
-    read_size  = wpnt->ne_header->n_segment_tab *
-	         sizeof(struct ne_segment_table_entry_s);
-    wpnt->seg_table = (struct ne_segment_table_entry_s *) malloc(read_size);
-    if (read(wpnt->fd, wpnt->seg_table, read_size) != read_size)
-	myerror("Unable to read segment table header from file");
-    wpnt->selector_table = CreateSelectors(wpnt);
-    wpnt->hinstance 
-	= wpnt->
-	    selector_table[wpnt->ne_header->auto_data_seg-1].selector;
-
-    /* Get the lookup  table.  This is used for looking up the addresses
-       of functions that are exported */
-
-    read_size  = wpnt->ne_header->entry_tab_length;
-    wpnt->lookup_table = (char *) malloc(read_size);
-    lseek(wpnt->fd, wpnt->mz_header->ne_offset + 
-	  wpnt->ne_header->entry_tab_offset, SEEK_SET);
-    if (read(wpnt->fd, wpnt->lookup_table, read_size) != read_size)
-	myerror("Unable to read lookup table header from file");
-
-    /* Get the iname table.  This is used for looking up the names
-       of functions that are exported */
-
-    status = lseek(wpnt->fd, wpnt->ne_header->nrname_tab_offset,  SEEK_SET);
-    read_size  = wpnt->ne_header->nrname_tab_length;
-    wpnt->nrname_table = (char *) malloc(read_size);
-    if (read(wpnt->fd, wpnt->nrname_table, read_size) != read_size)
-	myerror("Unable to read nrname table header from file");
-
-    status = lseek(wpnt->fd, wpnt->mz_header->ne_offset + 
-		   wpnt->ne_header->rname_tab_offset,  SEEK_SET);
-    read_size  = wpnt->ne_header->moduleref_tab_offset - 
-	    wpnt->ne_header->rname_tab_offset;
-    wpnt->rname_table = (char *) malloc(read_size);
-    if (read(wpnt->fd, wpnt->rname_table, read_size) != read_size)
-	myerror("Unable to read rname table header from file");
-
-    /* Now get the module name */
-
-    wpnt->name  = (char*) malloc(*wpnt->rname_table + 1);
-    memcpy(wpnt->name, wpnt->rname_table+1, *wpnt->rname_table);
-    wpnt->name[*wpnt->rname_table] =  0;
-#endif
-    /*
-     * Now load any DLLs that  this module refers to.
-     */
-    for(i=0; i<wpnt->ne_header->n_mod_ref_tab; i++){
-      char buff[14];
-      char buff2[256];
-      int  fd, j;
-      GetModuleName(wpnt, i + 1, buff);
-      
-#ifndef WINELIB
-      if(FindDLLTable(buff)) continue;  /* This module already loaded */
-#endif
-
-      LoadImage(buff, DLL, 0);
-/*
-      fprintf(stderr,"Unable to load:%s\n",  buff);
-*/
-    }
-return(wpnt->hinstance);
-}
-
-
-/**********************************************************************
- *					main
- */
-_WinMain(int argc, char **argv)
-{
-	int segment;
-	char *p;
-	char *sysresname;
-	char filename[100];
-	char syspath[256];
-	char exe_path[256];
-#ifdef WINESTAT
-	char * cp;
-#endif
-	struct w_files * wpnt;
-	int cs_reg, ds_reg, ss_reg, ip_reg, sp_reg;
-	int i;
-	int rv;
-
-	Argc = argc - 1;
-	Argv = argv + 1;
-	
-	WinePath = malloc(1024);
-	
-	getcwd(WinePath, 512);
-	
-	if ((p = getenv("WINEPATH")) != NULL) { 
-		strcat(WinePath, ";");
-		strcat(WinePath, p);
-	}
-	
-	if ((hInstMain = LoadImage(Argv[0], EXE, 1)) == (HINSTANCE) NULL ) {
-		fprintf(stderr, "wine: can't find %s!.\n", Argv[0]);
-		exit(1);
-	}
-
-	GetPrivateProfileString("wine", "SystemResources", "sysres.dll", 
-				filename, sizeof(filename), WINE_INI);
-
-	hSysRes = LoadImage(filename, DLL);
-	if (hSysRes == (HINSTANCE)NULL)
-		fprintf(stderr, "wine: can't find %s!\n", filename);
- 	else
- 	    printf("System Resources Loaded // hSysRes='%04X'\n", hSysRes);
-	
-    /*
-     * Fixup references.
-     */
-    wpnt = wine_files;
-    for(wpnt = wine_files; wpnt; wpnt = wpnt->next)
-    {
-	for (segment = 0; segment < wpnt->ne_header->n_segment_tab; segment++)
-	{
-	    if (FixupSegment(wpnt, segment) < 0)
-	    {
-		myerror("fixup failed.");
-	    }
-	}
-    }
-
-#ifdef WINESTAT
-    cp = strrchr(argv[0], '/');
-    if(!cp) cp = argv[0];
-	else cp++;
-    if(strcmp(cp,"winestat") == 0) {
-	    winestat();
-	    exit(0);
-    };
-#endif
-
-    /*
-     * Initialize signal handling.
-     */
-    init_wine_signals();
-
-    /*
-     * Fixup stack and jump to start.
-     */
-    ds_reg = (wine_files->
-	      selector_table[wine_files->ne_header->auto_data_seg-1].selector);
-    cs_reg = wine_files->selector_table[wine_files->ne_header->cs-1].selector;
-    ip_reg = wine_files->ne_header->ip;
-    ss_reg = wine_files->selector_table[wine_files->ne_header->ss-1].selector;
-    sp_reg = wine_files->ne_header->sp;
-
-    if (Options.debug) wine_debug(0, NULL);
-
-    rv = CallToInit16(cs_reg << 16 | ip_reg, ss_reg << 16 | sp_reg, ds_reg);
-    printf ("rv = %x\n", rv);
-}
-
-void InitializeLoadedDLLs()
-{
-    struct w_files * wpnt;
-    int cs_reg, ds_reg, ip_reg;
-    int rv;
-
-    fprintf(stderr, "Initializing DLLs\n");
-
-    /*
-     * Initialize libraries
-     */
-    wpnt = wine_files;
-    for(wpnt = wine_files; wpnt; wpnt = wpnt->next)
-    {
-	/* 
-	 * Is this a library? 
-	 */
-	if (wpnt->ne_header->format_flags & 0x8000)
-	{
-	    if (!(wpnt->ne_header->format_flags & 0x0001))
-	    {
-		/* Not SINGLEDATA */
-		fprintf(stderr, "Library is not marked SINGLEDATA\n");
-		exit(1);
-	    }
-
-	    ds_reg = wpnt->selector_table[wpnt->
-					  ne_header->auto_data_seg-1].selector;
-	    cs_reg = wpnt->selector_table[wpnt->ne_header->cs-1].selector;
-	    ip_reg = wpnt->ne_header->ip;
-
-	    fprintf(stderr, "Initializing %s, cs:ip %04x:%04x, ds %04x\n", 
-		    wpnt->name, cs_reg, ip_reg, ds_reg);
-
-	    rv = CallTo16(cs_reg << 16 | ip_reg, ds_reg);
-	    printf ("rv = %x\n", rv);
-	}
-    }
-}
-
-
-/**********************************************************************
- *					GetImportedName
- */
-char *
-GetImportedName(int fd, struct mz_header_s *mz_header, 
-		struct ne_header_s *ne_header, int name_offset, char *buffer)
-{
-    char *p;
-    int length;
-    int status;
-    int i;
-    
-    status = lseek(fd, mz_header->ne_offset + ne_header->iname_tab_offset +
-		   name_offset, SEEK_SET);
-    length = 0;
-    read(fd, &length, 1);  /* Get the length byte */
-    length = CONV_CHAR_TO_LONG (length);
-    read(fd, buffer, length);
-    buffer[length] = 0;
-    return buffer;
-}
-
-/**********************************************************************
- *					GetModuleName
- */
-char *
-GetModuleName(struct w_files * wpnt, int index, char *buffer)
-{
-    int fd = wpnt->fd;
-    struct mz_header_s *mz_header = wpnt->mz_header; 
-    struct ne_header_s *ne_header = wpnt->ne_header;
-    char *p;
-    int length;
-    WORD name_offset, status;
-    int i;
-    
-    status = lseek(fd, mz_header->ne_offset + ne_header->moduleref_tab_offset +
-		   2*(index - 1), SEEK_SET);
-    name_offset = 0;
-    read(fd, &name_offset, 2);
-    name_offset = CONV_SHORT (name_offset);
-    status = lseek(fd, mz_header->ne_offset + ne_header->iname_tab_offset +
-		   name_offset, SEEK_SET);
-    length = 0;
-    read(fd, &length, 1);  /* Get the length byte */
-    length = CONV_CHAR_TO_LONG (length);
-    read(fd, buffer, length);
-    buffer[length] = 0;
-
-    /* Module names  are always upper case */
-    for(i=0; i<length; i++)
-	    if(buffer[i] >= 'a' && buffer[i] <= 'z')  buffer[i] &= ~0x20;
-
-    return buffer;
-}
-
-
-#ifndef WINELIB
-/**********************************************************************
- *					FixupSegment
- */
-int
-FixupSegment(struct w_files * wpnt, int segment_num)
-{
-    int fd =  wpnt->fd;
-    struct mz_header_s * mz_header = wpnt->mz_header;
-    struct ne_header_s *ne_header =  wpnt->ne_header;
-    struct ne_segment_table_entry_s *seg_table = wpnt->seg_table;
-    struct segment_descriptor_s *selector_table = wpnt->selector_table;
-    struct relocation_entry_s *rep, *rep1;
-    struct ne_segment_table_entry_s *seg;
-    struct segment_descriptor_s *sel;
-    struct dll_table_entry_s *dll_table;
-    int status;
-    unsigned short *sp;
-    unsigned int selector, address;
-    unsigned int next_addr;
-    int ordinal;
-    char dll_name[257];
-    char func_name[257];
-    int i, n_entries;
-    int additive;
-
-    seg = &seg_table[segment_num];
-    sel = &selector_table[segment_num];
-
-#ifdef DEBUG_FIXUP
-    printf("Segment fixups for %s, segment %d, selector %x\n", 
-	   wpnt->name, segment_num, (int) sel->base_addr >> 16);
-#endif
-
-    if ((seg->seg_data_offset == 0) ||
-	!(seg->seg_flags & NE_SEGFLAGS_RELOC_DATA))
-	return 0;
-
-    /*
-     * Go through the relocation table on entry at a time.
-     */
-    i = seg->seg_data_length;
-    if (i == 0)
-	i = 0x10000;
-
-    status = lseek(fd, seg->seg_data_offset * 
-		       (1 << ne_header->align_shift_count) + i, SEEK_SET);
-    n_entries = 0;
-    read(fd, &n_entries, sizeof(short int));
-    rep = (struct relocation_entry_s *)
-	  malloc(n_entries * sizeof(struct relocation_entry_s));
-
-    if (read(fd,rep, n_entries * sizeof(struct relocation_entry_s)) !=
-        n_entries * sizeof(struct relocation_entry_s))
-    {
-	myerror("Unable to read relocation information");
-    }
-    
-    rep1 = rep;
-
-    for (i = 0; i < n_entries; i++, rep++)
-    {
-	/*
-	 * Get the target address corresponding to this entry.
-	 */
-	additive = 0;
-	
-	switch (rep->relocation_type)
-	{
-	  case NE_RELTYPE_ORDINALADD:
-	    additive = 1;
-	    
-	  case NE_RELTYPE_ORDINAL:
-	    if (GetModuleName(wpnt, rep->target1,
-			      dll_name) == NULL)
-	    {
-	      fprintf(stderr, "NE_RELTYPE_ORDINAL failed");
-		return -1;
-	    }
-	    
-	    ordinal = rep->target2;
-
-  	    status = GetEntryDLLOrdinal(dll_name, ordinal, &selector,
-					&address);
-	    if (status)
-	    {
-		char s[80];
-		
-		sprintf(s, "Bad DLL name '%s.%d'", dll_name, ordinal);
-		myerror(s);
-		return -1;
-	    }
-
-#ifdef DEBUG_FIXUP
-	    printf("%d: %s.%d: %04.4x:%04.4x\n", i + 1, dll_name, ordinal,
-		   selector, address);
-#endif
-	    break;
-	    
-	  case NE_RELTYPE_NAMEADD:
-	    additive = 1;
-	    
-	  case NE_RELTYPE_NAME:
-	    if (GetModuleName(wpnt, rep->target1, dll_name)
-		== NULL)
-	    {
-	      fprintf(stderr,"NE_RELTYPE_NAME failed");
-		return -1;
-	    }
-
-	    if (GetImportedName(fd, mz_header, ne_header, 
-				rep->target2, func_name) == NULL)
-	    {
-	      fprintf(stderr,"getimportedname failed");
-		return -1;
-	    }
-
-  	    status = GetEntryDLLName(dll_name, func_name, &selector, 
-					   &address);
-	    if (status)
-	    {
-		char s[80];
-		
-		sprintf(s, "Bad DLL name '%s (%s)'", dll_name,func_name);
-		myerror(s);
-		return -1;
-	    }
-
-#ifdef DEBUG_FIXUP
-	    printf("%d: %s %s.%d: %04.4x:%04.4x\n", i + 1, func_name,
-		   dll_name, ordinal, selector, address);
-#endif
-	    break;
-	    
-	  case NE_RELTYPE_INTERNAL:
-    	  case NE_RELTYPE_INT1:
-	    if (rep->target1 == 0x00ff)
-	    {
-		address  = GetEntryPointFromOrdinal(wpnt, rep->target2);
-		selector = (address >> 16) & 0xffff;
-		address &= 0xffff;
-	    }
-	    else
-	    {
-		selector = selector_table[rep->target1-1].selector;
-		address  = rep->target2;
-	    }
-	    
-#ifdef DEBUG_FIXUP
-	    printf("%d: %04.4x:%04.4x\n", i + 1, selector, address);
-#endif
-	    break;
-
-	  case 7:
-	    /* Relocation type 7:
-	     *
-	     *    These appear to be used as fixups for the Windows
-	     * floating point emulator.  Let's just ignore them and
-	     * try to use the hardware floating point.  Linux should
-	     * successfully emulate the coprocessor if it doesn't
-	     * exist.
-	     */
-#ifdef DEBUG_FIXUP
-	    printf("%d: ADDR TYPE %d,  TYPE %d,  OFFSET %04.4x,  ",
-		   i + 1, rep->address_type, rep->relocation_type, 
-		   rep->offset);
-	    printf("TARGET %04.4x %04.4x\n", rep->target1, rep->target2);
-#endif
-	    continue;
-	    
-	  default:
-	    fprintf(stderr,"%d: ADDR TYPE %d,  TYPE %d,  OFFSET %04.4x,  ",
-		   i + 1, rep->address_type, rep->relocation_type, 
-		   rep->offset);
-	    fprintf(stderr,"TARGET %04.4x %04.4x\n", 
-		    rep->target1, rep->target2);
-	    free(rep1);
-	    return -1;
-	}
-
-	/*
-	 * Stuff the right size result in.
-	 */
-	sp = (unsigned short *) ((char *) sel->base_addr + rep->offset);
-	if (additive)
-	{
-	    if (FindDLLTable(dll_name) == NULL)
-		additive = 2;
-
-	    fprintf(stderr,"%d: ADDR TYPE %d,  TYPE %d,  OFFSET %04.4x,  ",
-		   i + 1, rep->address_type, rep->relocation_type, 
-		   rep->offset);
-	    fprintf(stderr,"TARGET %04.4x %04.4x\n", 
-		    rep->target1, rep->target2);
-	    fprintf(stderr, "    Additive = %d\n", additive);
-	}
-	
-	switch (rep->address_type)
-	{
-	  case NE_RADDR_OFFSET16:
-	    do {
-#ifdef DEBUG_FIXUP
-		printf("    %04.4x:%04.4x:%04.4x OFFSET16\n",
-		       (unsigned long) sp >> 16, (int) sp & 0xFFFF, *sp);
-#endif
-		next_addr = *sp;
-		*sp = (unsigned short) address;
-		if (additive == 2)
-		    *sp += next_addr;
-		sp = (unsigned short *) ((char *) sel->base_addr + next_addr);
-	    } 
-	    while (next_addr != 0xffff && !additive);
-
-	    break;
-	    
-	  case NE_RADDR_POINTER32:
-	    do {
-#ifdef DEBUG_FIXUP
-		printf("    %04.4x:%04.4x:%04.4x POINTER32\n",
-		       (unsigned long) sp >> 16, (int) sp & 0xFFFF, *sp);
-#endif
-		next_addr = *sp;
-		*sp     = (unsigned short) address;
-		if (additive == 2)
-		    *sp += next_addr;
-		*(sp+1) = (unsigned short) selector;
-		sp = (unsigned short *) ((char *) sel->base_addr + next_addr);
-	    } 
-	    while (next_addr != 0xffff && !additive);
-
-	    break;
-	    
-	  case NE_RADDR_SELECTOR:
-	    do {
-#ifdef DEBUG_FIXUP
-		printf("    %04.4x:%04.4x:%04.4x SELECTOR\n",
-		       (unsigned long) sp >> 16, (int) sp & 0xFFFF, *sp);
-#endif
-		next_addr = *sp;
-		*sp     = (unsigned short) selector;
-		sp = (unsigned short *) ((char *) sel->base_addr + next_addr);
-		if (rep->relocation_type == NE_RELTYPE_INT1) 
-		    break;
-	    } 
-	    while (next_addr != 0xffff && !additive);
-
-	    break;
-	    
-	  default:
-	    printf("%d: ADDR TYPE %d,  TYPE %d,  OFFSET %04.4x,  ",
-		   i + 1, rep->address_type, rep->relocation_type, 
-		   rep->offset);
-	    printf("TARGET %04.4x %04.4x\n", rep->target1, rep->target2);
-	    free(rep1);
-	    return -1;
-	}
-    }
-
-    free(rep1);
-    return 0;
-}
-
-/**********************************************************************
- *					GetProcAddress
- */
-FARPROC GetProcAddress(HINSTANCE hinstance, char *proc_name)
-{
-    if ((int) proc_name & 0xffff0000)
-	printf("GetProcAddress: %#04x, '%s'\n", hinstance, proc_name);
-    else
-	printf("GetProcAddress: %#04x, %d\n", hinstance, (int) proc_name);
-
-    return NULL;
-}
-#endif