Alexandre Julliard : version: Improve detection of builtin libraries.
Alexandre Julliard
julliard at winehq.org
Wed Feb 17 10:12:03 CST 2010
Module: wine
Branch: master
Commit: 2b1ff0100668df2c1e65cdc6693149168c1b75c5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2b1ff0100668df2c1e65cdc6693149168c1b75c5
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Feb 17 09:41:20 2010 +0100
version: Improve detection of builtin libraries.
---
dlls/version/info.c | 26 +++++++++-----------------
dlls/version/resource.c | 4 ++++
2 files changed, 13 insertions(+), 17 deletions(-)
diff --git a/dlls/version/info.c b/dlls/version/info.c
index 8db40bc..e7f7077 100644
--- a/dlls/version/info.c
+++ b/dlls/version/info.c
@@ -238,7 +238,7 @@ typedef struct
*/
DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
{
- DWORD len, offset, magic = 0;
+ DWORD len, offset, magic = 1;
HFILE lzfd;
HMODULE hModule;
OFSTRUCT ofs;
@@ -263,7 +263,8 @@ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
magic = find_version_resource( lzfd, &len, &offset );
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),
MAKEINTRESOURCEW(VS_FILE_INFO) );
@@ -274,11 +275,6 @@ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
}
FreeLibrary( hModule );
}
- else
- {
- SetLastError( ofs.nErrCode );
- return 0;
- }
switch (magic)
{
@@ -306,7 +302,7 @@ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
return (len * 2) + 4;
default:
- SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
+ SetLastError( lzfd == HFILE_ERROR ? ofs.nErrCode : ERROR_RESOURCE_DATA_NOT_FOUND );
return 0;
}
}
@@ -340,7 +336,7 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
DWORD datasize, LPVOID data )
{
static const char signature[4] = "FE2X";
- DWORD len, offset, magic = 0;
+ DWORD len, offset, magic = 1;
HFILE lzfd;
OFSTRUCT ofs;
HMODULE hModule;
@@ -357,14 +353,15 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
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 */ );
len = LZRead( lzfd, data, min( len, datasize ) );
}
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),
MAKEINTRESOURCEW(VS_FILE_INFO) );
@@ -378,11 +375,6 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
}
FreeLibrary( hModule );
}
- else
- {
- SetLastError( ofs.nErrCode );
- return FALSE;
- }
switch (magic)
{
@@ -407,7 +399,7 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
return TRUE;
default:
- SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
+ SetLastError( lzfd == HFILE_ERROR ? ofs.nErrCode : ERROR_RESOURCE_DATA_NOT_FOUND );
return FALSE;
}
}
diff --git a/dlls/version/resource.c b/dlls/version/resource.c
index 9af07fe..68cda3f 100644
--- a/dlls/version/resource.c
+++ b/dlls/version/resource.c
@@ -101,7 +101,11 @@ static int read_xx_header( HFILE lzfd )
if ( sizeof(mzh) != LZRead( lzfd, (LPSTR)&mzh, sizeof(mzh) ) )
return 0;
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;
+ }
LZSeek( lzfd, mzh.e_lfanew, SEEK_SET );
if ( 2 != LZRead( lzfd, magic, 2 ) )
More information about the wine-cvs
mailing list