From 8ff37b8f319b66ea68394f9e64e6c47e7345914e Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 6 Jun 2001 20:24:12 +0000 Subject: [PATCH] Set low-order bit of module handle for LOAD_LIBRARY_AS_DATAFILE. Cleaned up a few HMODULE/HMODULE16 mismatches. --- include/module.h | 4 +-- loader/module.c | 58 ++++++++++++++++++++++++++------------------ loader/pe_resource.c | 37 +++++++++++++++++++++------- scheduler/process.c | 20 ++++++--------- 4 files changed, 71 insertions(+), 48 deletions(-) diff --git a/include/module.h b/include/module.h index ed899877319..3dcf97ef1e5 100644 --- a/include/module.h +++ b/include/module.h @@ -171,7 +171,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( LPCSTR filename, HMODULE module32 ); +extern HMODULE16 MODULE_CreateDummyModule( LPCSTR filename, HMODULE module32 ); extern FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE hmodule, LPCSTR name ); extern SEGPTR WINAPI HasGPHandler16( SEGPTR address ); extern void MODULE_WalkModref( DWORD id ); @@ -255,7 +255,7 @@ extern int BUILTIN32_dlclose( void *handle ); #define USIG_PROCESS_LOADED 0x0600 /* scheduler/process.c */ -extern void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule ); +extern void PROCESS_CallUserSignalProc( UINT uCode, HMODULE16 hModule ); extern BOOL PROCESS_Create( HANDLE hFile, LPCSTR filename, LPSTR cmd_line, LPCSTR env, LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa, BOOL inherit, DWORD flags, diff --git a/loader/module.c b/loader/module.c index 68d0cbeff5b..279f6a1dcf6 100644 --- a/loader/module.c +++ b/loader/module.c @@ -334,9 +334,9 @@ BOOL WINAPI DisableThreadLibraryCalls( HMODULE hModule ) * * Create a dummy NE module for Win32 or Winelib. */ -HMODULE MODULE_CreateDummyModule( LPCSTR filename, HMODULE module32 ) +HMODULE16 MODULE_CreateDummyModule( LPCSTR filename, HMODULE module32 ) { - HMODULE hModule; + HMODULE16 hModule; NE_MODULE *pModule; SEGTABLEENTRY *pSegment; char *pStr,*s; @@ -366,7 +366,7 @@ HMODULE MODULE_CreateDummyModule( LPCSTR filename, HMODULE module32 ) 8; hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size ); - if (!hModule) return (HMODULE)11; /* invalid exe */ + if (!hModule) return (HMODULE16)11; /* invalid exe */ FarSetOwner16( hModule, hModule ); pModule = (NE_MODULE *)GlobalLock16( hModule ); @@ -819,7 +819,7 @@ HINSTANCE16 WINAPI WinExec16( LPCSTR lpCmdLine, UINT16 nCmdShow ) { DWORD count; ReleaseThunkLock( &count ); - ret = WinExec( lpCmdLine, nCmdShow ); + ret = LOWORD( WinExec( lpCmdLine, nCmdShow ) ); RestoreThunkLock( count ); } return ret; @@ -850,15 +850,15 @@ HINSTANCE WINAPI WinExec( LPCSTR lpCmdLine, UINT nCmdShow ) if (Callout.WaitForInputIdle && Callout.WaitForInputIdle( info.hProcess, 30000 ) == 0xFFFFFFFF) WARN("WaitForInputIdle failed: Error %ld\n", GetLastError() ); - hInstance = 33; + hInstance = (HINSTANCE)33; /* Close off the handles */ CloseHandle( info.hThread ); CloseHandle( info.hProcess ); } - else if ((hInstance = GetLastError()) >= 32) + else if ((hInstance = (HINSTANCE)GetLastError()) >= (HINSTANCE)32) { FIXME("Strange error set by CreateProcess: %d\n", hInstance ); - hInstance = 11; + hInstance = (HINSTANCE)11; } HeapFree( GetProcessHeap(), 0, cmdline ); return hInstance; @@ -877,15 +877,15 @@ HINSTANCE WINAPI LoadModule( LPCSTR name, LPVOID paramBlock ) char filename[MAX_PATH]; BYTE len; - if (!name) return ERROR_FILE_NOT_FOUND; + if (!name) return (HINSTANCE)ERROR_FILE_NOT_FOUND; if (!SearchPathA( NULL, name, ".exe", sizeof(filename), filename, NULL ) && !SearchPathA( NULL, name, NULL, sizeof(filename), filename, NULL )) - return GetLastError(); + return (HINSTANCE)GetLastError(); len = (BYTE)params->lpCmdLine[0]; if (!(cmdline = HeapAlloc( GetProcessHeap(), 0, strlen(filename) + len + 2 ))) - return ERROR_NOT_ENOUGH_MEMORY; + return (HINSTANCE)ERROR_NOT_ENOUGH_MEMORY; strcpy( cmdline, filename ); p = cmdline + strlen(cmdline); @@ -908,15 +908,15 @@ HINSTANCE WINAPI LoadModule( LPCSTR name, LPVOID paramBlock ) if (Callout.WaitForInputIdle && Callout.WaitForInputIdle( info.hProcess, 30000 ) == 0xFFFFFFFF ) WARN("WaitForInputIdle failed: Error %ld\n", GetLastError() ); - hInstance = 33; + hInstance = (HINSTANCE)33; /* Close off the handles */ CloseHandle( info.hThread ); CloseHandle( info.hProcess ); } - else if ((hInstance = GetLastError()) >= 32) + else if ((hInstance = (HINSTANCE)GetLastError()) >= (HINSTANCE)32) { FIXME("Strange error set by CreateProcess: %d\n", hInstance ); - hInstance = 11; + hInstance = (HINSTANCE)11; } HeapFree( GetProcessHeap(), 0, cmdline ); @@ -1268,7 +1268,7 @@ HMODULE WINAPI LoadLibraryExA(LPCSTR libname, HANDLE hfile, DWORD flags) hmod = PE_LoadImage( hFile, filename, flags ); CloseHandle( hFile ); } - if (hmod) return hmod; + if (hmod) return (HMODULE)((ULONG_PTR)hmod + 1); } flags |= DONT_RESOLVE_DLL_REFERENCES; /* Just in case */ /* Fallback to normal behaviour */ @@ -1537,14 +1537,24 @@ BOOL WINAPI FreeLibrary(HINSTANCE hLibModule) BOOL retv = FALSE; WINE_MODREF *wm; + if (!hLibModule) + { + SetLastError( ERROR_INVALID_HANDLE ); + return FALSE; + } + + if ((ULONG_PTR)hLibModule & 1) + { + /* this is a LOAD_LIBRARY_AS_DATAFILE module */ + char *ptr = (char *)hLibModule - 1; + UnmapViewOfFile( ptr ); + return TRUE; + } + RtlAcquirePebLock(); free_lib_count++; - wm = MODULE32_LookupHMODULE( hLibModule ); - if ( !wm || !hLibModule ) - SetLastError( ERROR_INVALID_HANDLE ); - else - retv = MODULE_FreeLibrary( wm ); + if ((wm = MODULE32_LookupHMODULE( hLibModule ))) retv = MODULE_FreeLibrary( wm ); free_lib_count--; RtlReleasePebLock(); @@ -1627,9 +1637,9 @@ VOID WINAPI FreeLibraryAndExitThread(HINSTANCE hLibModule, DWORD dwExitCode) * * FIXME: rough guesswork, don't know what "Private" means */ -HINSTANCE WINAPI PrivateLoadLibrary(LPCSTR libname) +HINSTANCE16 WINAPI PrivateLoadLibrary(LPCSTR libname) { - return (HINSTANCE)LoadLibrary16(libname); + return LoadLibrary16(libname); } @@ -1639,9 +1649,9 @@ HINSTANCE WINAPI PrivateLoadLibrary(LPCSTR libname) * * FIXME: rough guesswork, don't know what "Private" means */ -void WINAPI PrivateFreeLibrary(HINSTANCE handle) +void WINAPI PrivateFreeLibrary(HINSTANCE16 handle) { - FreeLibrary16((HINSTANCE16)handle); + FreeLibrary16(handle); } @@ -1660,7 +1670,7 @@ FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE hModule, LPCSTR name ) WARN("hModule is Win32 handle (%08x)\n", hModule ); return (FARPROC16)0; } - return GetProcAddress16( hModule, name ); + return GetProcAddress16( LOWORD(hModule), name ); } /*********************************************************************** diff --git a/loader/pe_resource.c b/loader/pe_resource.c index 976e8ba606b..cf5835038c3 100644 --- a/loader/pe_resource.c +++ b/loader/pe_resource.c @@ -26,6 +26,27 @@ DEFAULT_DEBUG_CHANNEL(resource); + +/********************************************************************** + * get_module_base + * + * Get the base address of a module + */ +static const void *get_module_base( HMODULE hmod ) +{ + if (!hmod) hmod = GetModuleHandleA( NULL ); + else if (!HIWORD(hmod)) + { + FIXME("Enumeration of 16-bit resources is not supported\n"); + SetLastError(ERROR_INVALID_HANDLE); + return NULL; + } + + /* clear low order bit in case of LOAD_LIBRARY_AS_DATAFILE module */ + return (void *)((ULONG_PTR)hmod & ~1); +} + + /********************************************************************** * get_resdir * @@ -35,17 +56,14 @@ static const IMAGE_RESOURCE_DIRECTORY* get_resdir( HMODULE hmod ) { const IMAGE_DATA_DIRECTORY *dir; const IMAGE_RESOURCE_DIRECTORY *ret = NULL; + const void *base = get_module_base( hmod ); - if (!hmod) hmod = GetModuleHandleA( NULL ); - else if (!HIWORD(hmod)) + if (base) { - FIXME("Enumeration of 16-bit resources is not supported\n"); - SetLastError(ERROR_INVALID_HANDLE); - return NULL; + dir = &PE_HEADER(base)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE]; + if (dir->Size && dir->VirtualAddress) + ret = (IMAGE_RESOURCE_DIRECTORY *)((char *)base + dir->VirtualAddress); } - dir = &PE_HEADER(hmod)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE]; - if (dir->Size && dir->VirtualAddress) - ret = (IMAGE_RESOURCE_DIRECTORY *)((char *)hmod + dir->VirtualAddress); return ret; } @@ -254,8 +272,9 @@ HRSRC PE_FindResourceW( HMODULE hmod, LPCWSTR name, LPCWSTR type ) */ HGLOBAL PE_LoadResource( HMODULE hmod, HRSRC hRsrc ) { + const void *base = get_module_base( hmod ); if (!hRsrc) return 0; - return (HANDLE)(hmod + ((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData); + return (HANDLE)((char *)base + ((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData); } diff --git a/scheduler/process.c b/scheduler/process.c index 74e2f3e5d38..3f8b12f9b5a 100644 --- a/scheduler/process.c +++ b/scheduler/process.c @@ -180,12 +180,14 @@ extern BOOL MAIN_MainInit(void); * USIG_FLAGS_FAULT * The signal is being sent due to a fault. */ -void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule ) +void PROCESS_CallUserSignalProc( UINT uCode, HMODULE16 hModule ) { DWORD flags = current_process.flags; DWORD startup_flags = current_startupinfo.dwFlags; DWORD dwFlags = 0; + if (!Callout.UserSignalProc) return; + /* Determine dwFlags */ if ( !(flags & PDB32_WIN16_PROC) ) dwFlags |= USIG_FLAGS_WIN32; @@ -205,20 +207,12 @@ void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule ) dwFlags |= USIG_FLAGS_FEEDBACK; } - /* Convert module handle to 16-bit */ - - if ( HIWORD( hModule ) ) - hModule = MapHModuleLS( hModule ); - /* Call USER signal proc */ - if ( Callout.UserSignalProc ) - { - if ( uCode == USIG_THREAD_INIT || uCode == USIG_THREAD_EXIT ) - Callout.UserSignalProc( uCode, GetCurrentThreadId(), dwFlags, hModule ); - else - Callout.UserSignalProc( uCode, GetCurrentProcessId(), dwFlags, hModule ); - } + if ( uCode == USIG_THREAD_INIT || uCode == USIG_THREAD_EXIT ) + Callout.UserSignalProc( uCode, GetCurrentThreadId(), dwFlags, hModule ); + else + Callout.UserSignalProc( uCode, GetCurrentProcessId(), dwFlags, hModule ); }