Set low-order bit of module handle for LOAD_LIBRARY_AS_DATAFILE.
Cleaned up a few HMODULE/HMODULE16 mismatches.
diff --git a/loader/module.c b/loader/module.c
index 68d0cbe..279f6a1 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -334,9 +334,9 @@
*
* 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 @@
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 @@
{
DWORD count;
ReleaseThunkLock( &count );
- ret = WinExec( lpCmdLine, nCmdShow );
+ ret = LOWORD( WinExec( lpCmdLine, nCmdShow ) );
RestoreThunkLock( count );
}
return ret;
@@ -850,15 +850,15 @@
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 @@
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 @@
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 @@
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 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 @@
*
* 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 @@
*
* 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 @@
WARN("hModule is Win32 handle (%08x)\n", hModule );
return (FARPROC16)0;
}
- return GetProcAddress16( hModule, name );
+ return GetProcAddress16( LOWORD(hModule), name );
}
/***********************************************************************