Commit a33f318f authored by Alexandre Julliard's avatar Alexandre Julliard

Avoid depending on MODULE_GetBinaryType in load_library_as_datafile.

parent 2d139562
...@@ -489,6 +489,7 @@ static BOOL load_library_as_datafile( LPCWSTR name, HMODULE* hmod) ...@@ -489,6 +489,7 @@ static BOOL load_library_as_datafile( LPCWSTR name, HMODULE* hmod)
WCHAR filenameW[MAX_PATH]; WCHAR filenameW[MAX_PATH];
HANDLE hFile = INVALID_HANDLE_VALUE; HANDLE hFile = INVALID_HANDLE_VALUE;
HANDLE mapping; HANDLE mapping;
HMODULE module;
*hmod = 0; *hmod = 0;
...@@ -499,23 +500,23 @@ static BOOL load_library_as_datafile( LPCWSTR name, HMODULE* hmod) ...@@ -499,23 +500,23 @@ static BOOL load_library_as_datafile( LPCWSTR name, HMODULE* hmod)
NULL, OPEN_EXISTING, 0, 0 ); NULL, OPEN_EXISTING, 0, 0 );
} }
if (hFile == INVALID_HANDLE_VALUE) return FALSE; if (hFile == INVALID_HANDLE_VALUE) return FALSE;
switch (MODULE_GetBinaryType( hFile ))
{ mapping = CreateFileMappingW( hFile, NULL, PAGE_READONLY, 0, 0, NULL );
case BINARY_PE_EXE:
case BINARY_PE_DLL:
mapping = CreateFileMappingW( hFile, NULL, PAGE_READONLY, 0, 0, NULL );
if (mapping)
{
*hmod = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 );
CloseHandle( mapping );
}
break;
default:
break;
}
CloseHandle( hFile ); CloseHandle( hFile );
if (!mapping) return FALSE;
module = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 );
CloseHandle( mapping );
if (!module) return FALSE;
return *hmod != 0; /* make sure it's a valid PE file */
if (!RtlImageNtHeader(module))
{
UnmapViewOfFile( module );
return FALSE;
}
*hmod = (HMODULE)((char *)module + 1); /* set low bit of handle to indicate datafile module */
return TRUE;
} }
/****************************************************************** /******************************************************************
...@@ -548,7 +549,7 @@ HMODULE WINAPI LoadLibraryExA(LPCSTR libname, HANDLE hfile, DWORD flags) ...@@ -548,7 +549,7 @@ HMODULE WINAPI LoadLibraryExA(LPCSTR libname, HANDLE hfile, DWORD flags)
if (load_library_as_datafile( wstr.Buffer, &hModule)) if (load_library_as_datafile( wstr.Buffer, &hModule))
{ {
RtlFreeUnicodeString( &wstr ); RtlFreeUnicodeString( &wstr );
return (HMODULE)((ULONG_PTR)hModule + 1); return hModule;
} }
flags |= DONT_RESOLVE_DLL_REFERENCES; /* Just in case */ flags |= DONT_RESOLVE_DLL_REFERENCES; /* Just in case */
/* Fallback to normal behaviour */ /* Fallback to normal behaviour */
...@@ -585,8 +586,7 @@ HMODULE WINAPI LoadLibraryExW(LPCWSTR libnameW, HANDLE hfile, DWORD flags) ...@@ -585,8 +586,7 @@ HMODULE WINAPI LoadLibraryExW(LPCWSTR libnameW, HANDLE hfile, DWORD flags)
/* The method in load_library_as_datafile allows searching for the /* The method in load_library_as_datafile allows searching for the
* 'native' libraries only * 'native' libraries only
*/ */
if (load_library_as_datafile(libnameW, &hModule)) if (load_library_as_datafile(libnameW, &hModule)) return hModule;
return (HMODULE)((ULONG_PTR)hModule + 1);
flags |= DONT_RESOLVE_DLL_REFERENCES; /* Just in case */ flags |= DONT_RESOLVE_DLL_REFERENCES; /* Just in case */
/* Fallback to normal behaviour */ /* Fallback to normal behaviour */
} }
......
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