Only create the 16-bit dummy module when we need really it.

This commit is contained in:
Alexandre Julliard 2003-05-20 02:32:26 +00:00
parent 69c7164977
commit c7a51eec43
5 changed files with 24 additions and 36 deletions

View file

@ -1272,7 +1272,6 @@ static void MODULE_FlushModrefs(void)
if (wm->dlhandle) wine_dll_unload( wm->dlhandle );
else NtUnmapViewOfSection( GetCurrentProcess(), wm->ldr.BaseAddress );
FreeLibrary16( wm->hDummyMod );
if (cached_modref == wm) cached_modref = NULL;
RtlFreeHeap( ntdll_get_process_heap(), 0, wm->deps );
RtlFreeHeap( ntdll_get_process_heap(), 0, wm );

View file

@ -130,7 +130,6 @@ typedef struct _wine_modref
{
struct _wine_modref *next;
struct _wine_modref *prev;
HMODULE16 hDummyMod; /* Win16 dummy module */
void *dlhandle; /* handle returned by dlopen() */
LDR_MODULE ldr;
@ -184,7 +183,7 @@ enum binary_type
extern NTSTATUS MODULE_DllProcessAttach( WINE_MODREF *wm, LPVOID lpReserved );
extern NTSTATUS MODULE_DllThreadAttach( LPVOID lpReserved );
extern WINE_MODREF *MODULE_FindModule( LPCSTR path );
extern HMODULE16 MODULE_CreateDummyModule( LPCSTR filename, HMODULE module32 );
extern HMODULE16 MODULE_CreateDummyModule( HMODULE module32 );
extern enum binary_type MODULE_GetBinaryType( HANDLE hfile );
extern FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE hmodule, LPCSTR name );
extern SEGPTR WINAPI HasGPHandler16( SEGPTR address );

View file

@ -90,7 +90,7 @@ BOOL WINAPI DisableThreadLibraryCalls( HMODULE hModule )
*
* Create a dummy NE module for Win32 or Winelib.
*/
HMODULE16 MODULE_CreateDummyModule( LPCSTR filename, HMODULE module32 )
HMODULE16 MODULE_CreateDummyModule( HMODULE module32 )
{
HMODULE16 hModule;
NE_MODULE *pModule;
@ -100,8 +100,13 @@ HMODULE16 MODULE_CreateDummyModule( LPCSTR filename, HMODULE module32 )
const char* basename;
OFSTRUCT *ofs;
int of_size, size;
char filename[MAX_PATH];
IMAGE_NT_HEADERS *nt = RtlImageNtHeader( module32 );
if (!nt) return (HMODULE16)11; /* invalid exe */
/* Extract base filename */
GetModuleFileNameA( module32, filename, sizeof(filename) );
basename = strrchr(filename, '\\');
if (!basename) basename = filename;
else basename++;
@ -131,7 +136,7 @@ HMODULE16 MODULE_CreateDummyModule( LPCSTR filename, HMODULE module32 )
pModule->magic = IMAGE_OS2_SIGNATURE;
pModule->count = 1;
pModule->next = 0;
pModule->flags = 0;
pModule->flags = NE_FFLAGS_WIN32;
pModule->dgroup = 0;
pModule->ss = 1;
pModule->cs = 2;
@ -146,15 +151,10 @@ HMODULE16 MODULE_CreateDummyModule( LPCSTR filename, HMODULE module32 )
pModule->module32 = module32;
/* Set version and flags */
if (module32)
{
IMAGE_NT_HEADERS *nt = RtlImageNtHeader( module32 );
pModule->expected_version = ((nt->OptionalHeader.MajorSubsystemVersion & 0xff) << 8 ) |
(nt->OptionalHeader.MinorSubsystemVersion & 0xff);
pModule->flags |= NE_FFLAGS_WIN32;
if (nt->FileHeader.Characteristics & IMAGE_FILE_DLL)
pModule->flags |= NE_FFLAGS_LIBMODULE | NE_FFLAGS_SINGLEDATA;
}
pModule->expected_version = ((nt->OptionalHeader.MajorSubsystemVersion & 0xff) << 8 ) |
(nt->OptionalHeader.MinorSubsystemVersion & 0xff);
if (nt->FileHeader.Characteristics & IMAGE_FILE_DLL)
pModule->flags |= NE_FFLAGS_LIBMODULE | NE_FFLAGS_SINGLEDATA;
/* Set loaded file information */
ofs = (OFSTRUCT *)(pModule + 1);
@ -186,6 +186,7 @@ HMODULE16 MODULE_CreateDummyModule( LPCSTR filename, HMODULE module32 )
(int)pStr - (int)pModule;
NE_RegisterModule( pModule );
LoadLibraryA( filename ); /* increment the ref count of the 32-bit module */
return hModule;
}

View file

@ -1714,7 +1714,9 @@ BOOL16 WINAPI IsRomFile16( HFILE16 unused )
/***************************************************************************
* MapHModuleLS (KERNEL32.@)
*/
HMODULE16 WINAPI MapHModuleLS(HMODULE hmod) {
HMODULE16 WINAPI MapHModuleLS(HMODULE hmod)
{
HMODULE16 ret;
NE_MODULE *pModule;
if (!hmod)
@ -1727,7 +1729,12 @@ HMODULE16 WINAPI MapHModuleLS(HMODULE hmod) {
return pModule->self;
pModule = (NE_MODULE*)GlobalLock16(pModule->next);
}
return 0;
if ((ret = MODULE_CreateDummyModule( hmod )) < 32)
{
SetLastError(ret);
ret = 0;
}
return ret;
}
/***************************************************************************

View file

@ -41,7 +41,7 @@
#include <sys/mman.h>
#endif
#include <string.h>
#include "wine/winbase16.h"
#include "winbase.h"
#include "winerror.h"
#include "snoop.h"
#include "wine/server.h"
@ -183,7 +183,6 @@ WINE_MODREF *PE_CreateModule( HMODULE hModule, LPCSTR filename, DWORD flags,
IMAGE_DATA_DIRECTORY *dir;
IMAGE_EXPORT_DIRECTORY *pe_export = NULL;
WINE_MODREF *wm;
HMODULE16 hModule16;
/* Retrieve DataDirectory entries */
@ -247,29 +246,12 @@ WINE_MODREF *PE_CreateModule( HMODULE hModule, LPCSTR filename, DWORD flags,
dir = nt->OptionalHeader.DataDirectory+15;
if (dir->Size) FIXME("Unknown directory 15 ignored\n" );
/* Create 16-bit dummy module */
if ((hModule16 = MODULE_CreateDummyModule( filename, hModule )) < 32)
{
SetLastError( (DWORD)hModule16 ); /* This should give the correct error */
return NULL;
}
/* Allocate and fill WINE_MODREF */
if (!(wm = MODULE_AllocModRef( hModule, filename )))
{
FreeLibrary16( hModule16 );
return NULL;
}
wm->hDummyMod = hModule16;
if (!(wm = MODULE_AllocModRef( hModule, filename ))) return NULL;
if ( builtin )
{
NE_MODULE *pModule = (NE_MODULE *)GlobalLock16( hModule16 );
pModule->flags |= NE_FFLAGS_BUILTIN;
wm->ldr.Flags |= LDR_WINE_INTERNAL;
}
else if ( flags & DONT_RESOLVE_DLL_REFERENCES )
wm->ldr.Flags |= LDR_DONT_RESOLVE_REFS;