Commit e7957d6b authored by Ulrich Weigand's avatar Ulrich Weigand Committed by Alexandre Julliard

Determine expected_version of PE buddies from the SubsystemVersion.

parent ae8342df
......@@ -183,7 +183,7 @@ extern void MODULE_DllThreadDetach( LPVOID lpReserved );
extern WINE_MODREF *MODULE_LoadLibraryExA( LPCSTR libname, HFILE hfile, DWORD flags );
extern BOOL MODULE_FreeLibrary( WINE_MODREF *wm );
extern WINE_MODREF *MODULE_FindModule( LPCSTR path );
extern HMODULE MODULE_CreateDummyModule( const OFSTRUCT *ofs, LPCSTR modName );
extern HMODULE MODULE_CreateDummyModule( const OFSTRUCT *ofs, LPCSTR modName, WORD version );
extern FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE hmodule, LPCSTR name );
extern SEGPTR WINAPI HasGPHandler16( SEGPTR address );
extern void MODULE_WalkModref( DWORD id );
......
......@@ -28,7 +28,7 @@ extern DWORD PE_SizeofResource(HMODULE,HRSRC);
extern struct _wine_modref *PE_LoadLibraryExA(LPCSTR, DWORD, DWORD *);
extern void PE_UnloadLibrary(struct _wine_modref *);
extern HGLOBAL PE_LoadResource(struct _wine_modref *wm,HRSRC);
extern HMODULE PE_LoadImage( HFILE hFile, OFSTRUCT *ofs, LPCSTR *modName );
extern HMODULE PE_LoadImage( HFILE hFile, OFSTRUCT *ofs, LPCSTR *modName, WORD *version );
extern struct _wine_modref *PE_CreateModule( HMODULE hModule, OFSTRUCT *ofs,
DWORD flags, BOOL builtin );
extern BOOL PE_CreateProcess( HFILE hFile, OFSTRUCT *ofs, LPCSTR cmd_line, LPCSTR env,
......
......@@ -469,7 +469,7 @@ BOOL MZ_CreateProcess( HFILE hFile, OFSTRUCT *ofs, LPCSTR cmdline, LPCSTR env,
if ((!env)&&pdb) env = pdb->env_db->environ;
if (alloc) {
if ((hModule = MODULE_CreateDummyModule(ofs, NULL)) < 32) {
if ((hModule = MODULE_CreateDummyModule(ofs, NULL, 0)) < 32) {
SetLastError(hModule);
return FALSE;
}
......
......@@ -304,7 +304,7 @@ HINSTANCE MAIN_WinelibInit( int *argc, char *argv[] )
PROCESS_Current()->exe_modref = wm;
strcpy( ofs.szPathName, wm->modname );
if ((hModule = MODULE_CreateDummyModule( &ofs, NULL )) < 32) return 0;
if ((hModule = MODULE_CreateDummyModule( &ofs, NULL, 0 )) < 32) return 0;
pModule = (NE_MODULE *)GlobalLock16( hModule );
pModule->flags = NE_FFLAGS_WIN32;
pModule->module32 = wm->module;
......
......@@ -333,7 +333,7 @@ BOOL WINAPI DisableThreadLibraryCalls( HMODULE hModule )
*
* Create a dummy NE module for Win32 or Winelib.
*/
HMODULE MODULE_CreateDummyModule( const OFSTRUCT *ofs, LPCSTR modName )
HMODULE MODULE_CreateDummyModule( const OFSTRUCT *ofs, LPCSTR modName, WORD version )
{
HMODULE hModule;
NE_MODULE *pModule;
......@@ -375,7 +375,7 @@ HMODULE MODULE_CreateDummyModule( const OFSTRUCT *ofs, LPCSTR modName )
pModule->nrname_size = 0;
pModule->fileinfo = sizeof(NE_MODULE);
pModule->os_flags = NE_OSFLAGS_WINDOWS;
pModule->expected_version = 0x030a;
pModule->expected_version = version;
pModule->self = hModule;
/* Set loaded file information */
......@@ -1470,7 +1470,7 @@ WINE_MODREF *MODULE_LoadLibraryExA( LPCSTR libname, HFILE hfile, DWORD flags )
break;
}
ERR_(module)("Failed to load module '%s'; error=0x%08lx, \n", libname, err);
WARN_(module)("Failed to load module '%s'; error=0x%08lx, \n", libname, err);
SetLastError(err);
LeaveCriticalSection(&PROCESS_Current()->crit_section);
return NULL;
......
......@@ -1377,17 +1377,15 @@ WORD WINAPI GetExpWinVer16( HMODULE16 hModule )
/*
* For built-in modules, fake the expected version the module should
* have according to the Windows version emulated by Wine
*
* FIXME: Should we really do this for Win32 dummy modules as well?
*/
if ( (pModule->flags & NE_FFLAGS_BUILTIN)
|| (pModule->flags & NE_FFLAGS_WIN32) )
if ( !pModule->expected_version )
{
OSVERSIONINFOA versionInfo;
versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);
if ( GetVersionExA( &versionInfo ) )
return (versionInfo.dwMajorVersion & 0xff) << 8
pModule->expected_version =
(versionInfo.dwMajorVersion & 0xff) << 8
| (versionInfo.dwMinorVersion & 0xff);
}
......
......@@ -459,7 +459,7 @@ static void do_relocations( unsigned int load_addr, IMAGE_BASE_RELOCATION *r )
* BUT we have to map the whole image anyway, for Win32 programs sometimes
* want to access them. (HMODULE32 point to the start of it)
*/
HMODULE PE_LoadImage( HFILE hFile, OFSTRUCT *ofs, LPCSTR *modName )
HMODULE PE_LoadImage( HFILE hFile, OFSTRUCT *ofs, LPCSTR *modName, WORD *version )
{
HMODULE hModule;
HANDLE mapping;
......@@ -663,6 +663,10 @@ HMODULE PE_LoadImage( HFILE hFile, OFSTRUCT *ofs, LPCSTR *modName )
if (dir->Size)
*modName = (LPCSTR)RVA(((PIMAGE_EXPORT_DIRECTORY)RVA(dir->VirtualAddress))->Name);
/* Get expected OS / Subsystem version */
*version = ( (nt->OptionalHeader.MajorSubsystemVersion & 0xff) << 8 )
| (nt->OptionalHeader.MinorSubsystemVersion & 0xff);
/* We don't need the orignal mapping any more */
UnmapViewOfFile( (LPVOID)hModule );
return (HMODULE)load_addr;
......@@ -882,6 +886,7 @@ WINE_MODREF *PE_LoadLibraryExA (LPCSTR name, DWORD flags, DWORD *err)
WINE_MODREF *wm;
char dllname[256], *p;
HFILE hFile;
WORD version = 0;
/* Append .DLL to name if no extension present */
strcpy( dllname, name );
......@@ -892,7 +897,7 @@ WINE_MODREF *PE_LoadLibraryExA (LPCSTR name, DWORD flags, DWORD *err)
hFile = OpenFile( dllname, &ofs, OF_READ | OF_SHARE_DENY_WRITE );
if ( hFile != HFILE_ERROR )
{
hModule32 = PE_LoadImage( hFile, &ofs, &modName );
hModule32 = PE_LoadImage( hFile, &ofs, &modName, &version );
CloseHandle( hFile );
if(!hModule32)
{
......@@ -907,7 +912,7 @@ WINE_MODREF *PE_LoadLibraryExA (LPCSTR name, DWORD flags, DWORD *err)
}
/* Create 16-bit dummy module */
if ((hModule16 = MODULE_CreateDummyModule( &ofs, modName )) < 32)
if ((hModule16 = MODULE_CreateDummyModule( &ofs, modName, version )) < 32)
{
*err = (DWORD)hModule16; /* This should give the correct error */
return NULL;
......@@ -954,12 +959,13 @@ BOOL PE_CreateProcess( HFILE hFile, OFSTRUCT *ofs, LPCSTR cmd_line, LPCSTR env,
LPPROCESS_INFORMATION info )
{
LPCSTR modName = NULL;
WORD version = 0;
HMODULE16 hModule16;
HMODULE hModule32;
NE_MODULE *pModule;
/* Load file */
if ( (hModule32 = PE_LoadImage( hFile, ofs, &modName )) < 32 )
if ( (hModule32 = PE_LoadImage( hFile, ofs, &modName, &version )) < 32 )
{
SetLastError( hModule32 );
return FALSE;
......@@ -973,7 +979,7 @@ BOOL PE_CreateProcess( HFILE hFile, OFSTRUCT *ofs, LPCSTR cmd_line, LPCSTR env,
#endif
/* Create 16-bit dummy module */
if ( (hModule16 = MODULE_CreateDummyModule( ofs, modName )) < 32 )
if ( (hModule16 = MODULE_CreateDummyModule( ofs, modName, version )) < 32 )
{
SetLastError( hModule16 );
return FALSE;
......
......@@ -487,7 +487,7 @@ WINE_MODREF *BUILTIN32_LoadLibraryExA(LPCSTR path, DWORD flags, DWORD *err)
}
/* Create 16-bit dummy module */
if ((hModule16 = MODULE_CreateDummyModule( &ofs, modName )) < 32)
if ((hModule16 = MODULE_CreateDummyModule( &ofs, modName, 0 )) < 32)
{
*err = (DWORD)hModule16;
return NULL; /* FIXME: Should unload the builtin module */
......
......@@ -873,7 +873,7 @@ static int BuildModule16( FILE *outfile, int max_code_offset,
pModule->dlls_to_init = 0;
pModule->nrname_handle = 0;
pModule->min_swap_area = 0;
pModule->expected_version = 0x030a;
pModule->expected_version = 0;
pModule->module32 = 0;
pModule->self = 0;
pModule->self_loading_sel = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment