Moved builtin dll registration to libwine.
Changed process initialization to not load imported dlls too early.

diff --git a/loader/dos/module.c b/loader/dos/module.c
index 3e55afa..015346b 100644
--- a/loader/dos/module.c
+++ b/loader/dos/module.c
@@ -203,7 +203,7 @@
     return TRUE;
 }
 
-BOOL MZ_DoLoadImage( HMODULE module, HANDLE hFile, LPCSTR filename, OverlayBlock *oblk )
+BOOL MZ_DoLoadImage( HANDLE hFile, LPCSTR filename, OverlayBlock *oblk )
 {
   LPDOSTASK lpDosTask = dos_current;
   IMAGE_DOS_HEADER mz_header;
@@ -233,6 +233,12 @@
  if (   !ReadFile(hFile,&mz_header,sizeof(mz_header),&len,NULL)
      || len != sizeof(mz_header) 
      || mz_header.e_magic != IMAGE_DOS_SIGNATURE) {
+  char *p = strrchr( filename, '.' );
+  if (!p || strcasecmp( p, ".com" ))  /* check for .COM extension */
+  {
+      SetLastError(ERROR_BAD_FORMAT);
+      goto load_error;
+  }
   old_com=1; /* assume .COM file */
   image_start=0;
   image_size=GetFileSize(hFile,NULL);
@@ -331,16 +337,33 @@
   return FALSE;
 }
 
-BOOL MZ_LoadImage( HMODULE module, HANDLE hFile, LPCSTR filename )
+BOOL MZ_LoadImage( LPCSTR cmdline )
 {
-  IMAGE_NT_HEADERS *win_hdr = PE_HEADER(module);
+    HFILE hFile;
+    char *name, buffer[MAX_PATH];
+    LPCSTR p = strchr( cmdline, ' ' );
 
-  if (win_hdr) {
-    win_hdr->OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI;
-    win_hdr->OptionalHeader.AddressOfEntryPoint = (LPBYTE)MZ_Launch - (LPBYTE)module;
-  }
+    if (p)
+    {
+        if (!(name = HeapAlloc( GetProcessHeap(), 0, p - cmdline + 1 ))) return FALSE;
+        memcpy( name, cmdline, p - cmdline );
+        name[p - cmdline] = 0;
+    }
+    else name = (char *)cmdline;
 
-  return MZ_DoLoadImage( module, hFile, filename, NULL );
+    if (!SearchPathA( NULL, name, ".exe", sizeof(buffer), buffer, NULL )) goto error;
+    if ((hFile = CreateFileA( buffer, GENERIC_READ, FILE_SHARE_READ,
+                              NULL, OPEN_EXISTING, 0, -1 )) == INVALID_HANDLE_VALUE)
+        goto error;
+    if (!MZ_DoLoadImage( hFile, buffer, NULL ))
+    {
+        CloseHandle( hFile );
+        goto error;
+    }
+    MZ_Launch();
+ error:
+    if (name != cmdline) HeapFree( GetProcessHeap(), 0, name );
+    return FALSE;
 }
 
 BOOL MZ_Exec( CONTEXT86 *context, LPCSTR filename, BYTE func, LPVOID paramblk )
@@ -363,7 +386,7 @@
       PDB16 *psp = (PDB16 *)psp_start;
       psp->saveStack = (DWORD)PTR_SEG_OFF_TO_SEGPTR(context->SegSs, LOWORD(context->Esp));
     }
-    ret = MZ_DoLoadImage( NULL, hFile, filename, NULL );
+    ret = MZ_DoLoadImage( hFile, filename, NULL );
     if (ret) {
       /* MZ_LoadImage created a new PSP and loaded new values into lpDosTask,
        * let's work on the new values now */
@@ -393,7 +416,7 @@
   case 3: /* load overlay */
     {
       OverlayBlock *blk = (OverlayBlock *)paramblk;
-      ret = MZ_DoLoadImage( NULL, hFile, filename, blk );
+      ret = MZ_DoLoadImage( hFile, filename, blk );
     }
     break;
   default:
@@ -589,7 +612,7 @@
 
 #else /* !MZ_SUPPORTED */
 
-BOOL MZ_LoadImage( HMODULE module, HANDLE hFile, LPCSTR filename )
+BOOL MZ_LoadImage( LPCSTR cmdline )
 {
   WARN("DOS executables not supported on this platform\n");
   SetLastError(ERROR_BAD_FORMAT);
diff --git a/loader/module.c b/loader/module.c
index 1585f02..e1978cf 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -532,7 +532,7 @@
  * Note that .COM and .PIF files are only recognized by their
  * file name extension; but Windows does it the same way ...
  */
-BOOL MODULE_GetBinaryType( HANDLE hfile, LPCSTR filename, LPDWORD lpBinaryType )
+static BOOL MODULE_GetBinaryType( HANDLE hfile, LPCSTR filename, LPDWORD lpBinaryType )
 {
     IMAGE_DOS_HEADER mz_header;
     char magic[4], *ptr;
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 1acb814..dfff47c 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -475,6 +475,7 @@
     TRACE_(module)( "loading %s\n", filename );
 
     mapping = CreateFileMappingA( hFile, NULL, SEC_IMAGE, 0, 0, NULL );
+    if (!mapping) return 0;
     base = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 );
     CloseHandle( mapping );
     if (!base) return 0;