Commit 2b1ff010 authored by Alexandre Julliard's avatar Alexandre Julliard

version: Improve detection of builtin libraries.

parent 716358c5
...@@ -238,7 +238,7 @@ typedef struct ...@@ -238,7 +238,7 @@ typedef struct
*/ */
DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle ) DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
{ {
DWORD len, offset, magic = 0; DWORD len, offset, magic = 1;
HFILE lzfd; HFILE lzfd;
HMODULE hModule; HMODULE hModule;
OFSTRUCT ofs; OFSTRUCT ofs;
...@@ -263,7 +263,8 @@ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle ) ...@@ -263,7 +263,8 @@ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
magic = find_version_resource( lzfd, &len, &offset ); magic = find_version_resource( lzfd, &len, &offset );
LZClose( lzfd ); LZClose( lzfd );
} }
else if ((hModule = LoadLibraryExW( filename, 0, LOAD_LIBRARY_AS_DATAFILE )))
if ((magic == 1) && (hModule = LoadLibraryExW( filename, 0, LOAD_LIBRARY_AS_DATAFILE )))
{ {
HRSRC hRsrc = FindResourceW( hModule, MAKEINTRESOURCEW(VS_VERSION_INFO), HRSRC hRsrc = FindResourceW( hModule, MAKEINTRESOURCEW(VS_VERSION_INFO),
MAKEINTRESOURCEW(VS_FILE_INFO) ); MAKEINTRESOURCEW(VS_FILE_INFO) );
...@@ -274,11 +275,6 @@ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle ) ...@@ -274,11 +275,6 @@ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
} }
FreeLibrary( hModule ); FreeLibrary( hModule );
} }
else
{
SetLastError( ofs.nErrCode );
return 0;
}
switch (magic) switch (magic)
{ {
...@@ -306,7 +302,7 @@ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle ) ...@@ -306,7 +302,7 @@ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
return (len * 2) + 4; return (len * 2) + 4;
default: default:
SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); SetLastError( lzfd == HFILE_ERROR ? ofs.nErrCode : ERROR_RESOURCE_DATA_NOT_FOUND );
return 0; return 0;
} }
} }
...@@ -340,7 +336,7 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle, ...@@ -340,7 +336,7 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
DWORD datasize, LPVOID data ) DWORD datasize, LPVOID data )
{ {
static const char signature[4] = "FE2X"; static const char signature[4] = "FE2X";
DWORD len, offset, magic = 0; DWORD len, offset, magic = 1;
HFILE lzfd; HFILE lzfd;
OFSTRUCT ofs; OFSTRUCT ofs;
HMODULE hModule; HMODULE hModule;
...@@ -357,14 +353,15 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle, ...@@ -357,14 +353,15 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
if ((lzfd = LZOpenFileW( (LPWSTR)filename, &ofs, OF_READ )) != HFILE_ERROR) if ((lzfd = LZOpenFileW( (LPWSTR)filename, &ofs, OF_READ )) != HFILE_ERROR)
{ {
if ((magic = find_version_resource( lzfd, &len, &offset ))) if ((magic = find_version_resource( lzfd, &len, &offset )) > 1)
{ {
LZSeek( lzfd, offset, 0 /* SEEK_SET */ ); LZSeek( lzfd, offset, 0 /* SEEK_SET */ );
len = LZRead( lzfd, data, min( len, datasize ) ); len = LZRead( lzfd, data, min( len, datasize ) );
} }
LZClose( lzfd ); LZClose( lzfd );
} }
else if ((hModule = LoadLibraryExW( filename, 0, LOAD_LIBRARY_AS_DATAFILE )))
if ((magic == 1) && (hModule = LoadLibraryExW( filename, 0, LOAD_LIBRARY_AS_DATAFILE )))
{ {
HRSRC hRsrc = FindResourceW( hModule, MAKEINTRESOURCEW(VS_VERSION_INFO), HRSRC hRsrc = FindResourceW( hModule, MAKEINTRESOURCEW(VS_VERSION_INFO),
MAKEINTRESOURCEW(VS_FILE_INFO) ); MAKEINTRESOURCEW(VS_FILE_INFO) );
...@@ -378,11 +375,6 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle, ...@@ -378,11 +375,6 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
} }
FreeLibrary( hModule ); FreeLibrary( hModule );
} }
else
{
SetLastError( ofs.nErrCode );
return FALSE;
}
switch (magic) switch (magic)
{ {
...@@ -407,7 +399,7 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle, ...@@ -407,7 +399,7 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
return TRUE; return TRUE;
default: default:
SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); SetLastError( lzfd == HFILE_ERROR ? ofs.nErrCode : ERROR_RESOURCE_DATA_NOT_FOUND );
return FALSE; return FALSE;
} }
} }
......
...@@ -101,7 +101,11 @@ static int read_xx_header( HFILE lzfd ) ...@@ -101,7 +101,11 @@ static int read_xx_header( HFILE lzfd )
if ( sizeof(mzh) != LZRead( lzfd, (LPSTR)&mzh, sizeof(mzh) ) ) if ( sizeof(mzh) != LZRead( lzfd, (LPSTR)&mzh, sizeof(mzh) ) )
return 0; return 0;
if ( mzh.e_magic != IMAGE_DOS_SIGNATURE ) if ( mzh.e_magic != IMAGE_DOS_SIGNATURE )
{
if (!memcmp( &mzh, "\177ELF", 4 )) return 1; /* ELF */
if (*(UINT *)&mzh == 0xfeedface || *(UINT *)&mzh == 0xcefaedfe) return 1; /* Mach-O */
return 0; return 0;
}
LZSeek( lzfd, mzh.e_lfanew, SEEK_SET ); LZSeek( lzfd, mzh.e_lfanew, SEEK_SET );
if ( 2 != LZRead( lzfd, magic, 2 ) ) if ( 2 != LZRead( lzfd, magic, 2 ) )
......
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