forked from Mirrors/wine-wine
Moved implementation of GetFileVersionInfoSize from ascii to unicode,
fixed failing, crashing test cases.oldstable
parent
f35d1caeef
commit
1ce19853c1
|
@ -31,6 +31,7 @@
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winreg.h"
|
#include "winreg.h"
|
||||||
#include "winver.h"
|
#include "winver.h"
|
||||||
|
#include "winternl.h"
|
||||||
#include "wine/winuser16.h"
|
#include "wine/winuser16.h"
|
||||||
#include "wine/unicode.h"
|
#include "wine/unicode.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
|
@ -287,7 +288,7 @@ void ConvertVersionInfo32To16( VS_VERSION_INFO_STRUCT32 *info32,
|
||||||
* in the case if file exists, but VERSION_INFO not found.
|
* in the case if file exists, but VERSION_INFO not found.
|
||||||
* FIXME: handle is not used.
|
* FIXME: handle is not used.
|
||||||
*/
|
*/
|
||||||
static DWORD VERSION_GetFileVersionInfo_PE( LPCSTR filename, LPDWORD handle,
|
static DWORD VERSION_GetFileVersionInfo_PE( LPCWSTR filename, LPDWORD handle,
|
||||||
DWORD datasize, LPVOID data )
|
DWORD datasize, LPVOID data )
|
||||||
{
|
{
|
||||||
VS_FIXEDFILEINFO *vffi;
|
VS_FIXEDFILEINFO *vffi;
|
||||||
|
@ -297,16 +298,16 @@ static DWORD VERSION_GetFileVersionInfo_PE( LPCSTR filename, LPDWORD handle,
|
||||||
HRSRC hRsrc;
|
HRSRC hRsrc;
|
||||||
HGLOBAL hMem;
|
HGLOBAL hMem;
|
||||||
|
|
||||||
TRACE("(%s,%p)\n", debugstr_a(filename), handle );
|
TRACE("(%s,%p)\n", debugstr_w(filename), handle );
|
||||||
|
|
||||||
hModule = GetModuleHandleA(filename);
|
hModule = GetModuleHandleW(filename);
|
||||||
if(!hModule)
|
if(!hModule)
|
||||||
hModule = LoadLibraryExA(filename, 0, LOAD_LIBRARY_AS_DATAFILE);
|
hModule = LoadLibraryExW(filename, 0, LOAD_LIBRARY_AS_DATAFILE);
|
||||||
else
|
else
|
||||||
hModule = LoadLibraryExA(filename, 0, 0);
|
hModule = LoadLibraryExW(filename, 0, 0);
|
||||||
if(!hModule)
|
if(!hModule)
|
||||||
{
|
{
|
||||||
WARN("Could not load %s\n", debugstr_a(filename));
|
WARN("Could not load %s\n", debugstr_w(filename));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
hRsrc = FindResourceW(hModule,
|
hRsrc = FindResourceW(hModule,
|
||||||
|
@ -314,7 +315,7 @@ static DWORD VERSION_GetFileVersionInfo_PE( LPCSTR filename, LPDWORD handle,
|
||||||
MAKEINTRESOURCEW(VS_FILE_INFO));
|
MAKEINTRESOURCEW(VS_FILE_INFO));
|
||||||
if(!hRsrc)
|
if(!hRsrc)
|
||||||
{
|
{
|
||||||
WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_a(filename));
|
WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_w(filename));
|
||||||
FreeLibrary(hModule);
|
FreeLibrary(hModule);
|
||||||
return 0xFFFFFFFF;
|
return 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
|
@ -322,7 +323,7 @@ static DWORD VERSION_GetFileVersionInfo_PE( LPCSTR filename, LPDWORD handle,
|
||||||
hMem = LoadResource(hModule, hRsrc);
|
hMem = LoadResource(hModule, hRsrc);
|
||||||
if(!hMem)
|
if(!hMem)
|
||||||
{
|
{
|
||||||
WARN("Could not load VS_VERSION_INFO from %s\n", debugstr_a(filename));
|
WARN("Could not load VS_VERSION_INFO from %s\n", debugstr_w(filename));
|
||||||
FreeLibrary(hModule);
|
FreeLibrary(hModule);
|
||||||
return 0xFFFFFFFF;
|
return 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
|
@ -434,44 +435,72 @@ END:
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GetFileVersionInfoSizeA [VERSION.@]
|
* GetFileVersionInfoSizeW [VERSION.@]
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI GetFileVersionInfoSizeA( LPCSTR filename, LPDWORD handle )
|
DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
|
||||||
{
|
{
|
||||||
|
DWORD ret, offset, len = (filename && strlenW(filename)) ? strlenW(filename) + 1: MAX_PATH;
|
||||||
|
DWORD nSize = len;
|
||||||
|
LPSTR filenameA = NULL;
|
||||||
|
LPWSTR filenameW;
|
||||||
VS_FIXEDFILEINFO *vffi;
|
VS_FIXEDFILEINFO *vffi;
|
||||||
DWORD len, ret, offset;
|
|
||||||
BYTE buf[144];
|
BYTE buf[144];
|
||||||
|
|
||||||
TRACE("(%s,%p)\n", debugstr_a(filename), handle );
|
TRACE("(%s,%p)\n", debugstr_w(filename), handle );
|
||||||
|
|
||||||
len = VERSION_GetFileVersionInfo_PE(filename, handle, 0, NULL);
|
filenameW = HeapAlloc( GetProcessHeap(), 0, sizeof(WCHAR) * len );
|
||||||
|
if (filename && strlenW(filename))
|
||||||
|
strcpyW(filenameW, filename);
|
||||||
|
else {
|
||||||
|
nSize = GetModuleFileNameW(NULL, filenameW, nSize);
|
||||||
|
if((nSize +1) >= len)
|
||||||
|
FIXME("buffer may be too small\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
len = VERSION_GetFileVersionInfo_PE(filenameW, handle, 0, NULL);
|
||||||
|
/* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */
|
||||||
|
if(len == 0xFFFFFFFF)
|
||||||
|
{
|
||||||
|
if ( handle ) *handle = 0L;
|
||||||
|
SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
|
||||||
|
len = 0;
|
||||||
|
goto End;
|
||||||
|
}
|
||||||
|
if(len) {
|
||||||
|
if ( handle ) *handle = 0L;
|
||||||
|
goto End;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: handle not set correctly after this point
|
||||||
|
*/
|
||||||
|
|
||||||
|
len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL );
|
||||||
|
filenameA = HeapAlloc( GetProcessHeap(), 0, len );
|
||||||
|
WideCharToMultiByte( CP_ACP, 0, filename, -1, filenameA, len, NULL, NULL );
|
||||||
|
|
||||||
|
len = VERSION_GetFileVersionInfo_16(filenameA, handle, 0, NULL);
|
||||||
/* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */
|
/* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */
|
||||||
if(len == 0xFFFFFFFF)
|
if(len == 0xFFFFFFFF)
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
|
SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
|
||||||
return 0;
|
len = 0;
|
||||||
|
goto End;
|
||||||
}
|
}
|
||||||
if(len) return len;
|
if(len) goto End;
|
||||||
len = VERSION_GetFileVersionInfo_16(filename, handle, 0, NULL);
|
|
||||||
/* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */
|
|
||||||
if(len == 0xFFFFFFFF)
|
|
||||||
{
|
|
||||||
SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(len) return len;
|
|
||||||
|
|
||||||
len = GetFileResourceSize16( filename,
|
/* FIXME: last error not handled after this point
|
||||||
|
*/
|
||||||
|
len = GetFileResourceSize16( filenameA,
|
||||||
MAKEINTRESOURCEA(VS_FILE_INFO),
|
MAKEINTRESOURCEA(VS_FILE_INFO),
|
||||||
MAKEINTRESOURCEA(VS_VERSION_INFO),
|
MAKEINTRESOURCEA(VS_VERSION_INFO),
|
||||||
&offset );
|
&offset );
|
||||||
if (!len) return 0;
|
if (!len) goto End;
|
||||||
|
|
||||||
ret = GetFileResource16( filename,
|
ret = GetFileResource16( filenameA,
|
||||||
MAKEINTRESOURCEA(VS_FILE_INFO),
|
MAKEINTRESOURCEA(VS_FILE_INFO),
|
||||||
MAKEINTRESOURCEA(VS_VERSION_INFO),
|
MAKEINTRESOURCEA(VS_VERSION_INFO),
|
||||||
offset, sizeof( buf ), buf );
|
offset, sizeof( buf ), buf );
|
||||||
if (!ret) return 0;
|
if (!ret) goto End;
|
||||||
|
|
||||||
if ( handle ) *handle = offset;
|
if ( handle ) *handle = offset;
|
||||||
|
|
||||||
|
@ -484,7 +513,8 @@ DWORD WINAPI GetFileVersionInfoSizeA( LPCSTR filename, LPDWORD handle )
|
||||||
{
|
{
|
||||||
WARN("vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n",
|
WARN("vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n",
|
||||||
vffi->dwSignature, VS_FFI_SIGNATURE );
|
vffi->dwSignature, VS_FFI_SIGNATURE );
|
||||||
return 0;
|
len = 0;
|
||||||
|
goto End;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ((VS_VERSION_INFO_STRUCT16 *)buf)->wLength < len )
|
if ( ((VS_VERSION_INFO_STRUCT16 *)buf)->wLength < len )
|
||||||
|
@ -492,21 +522,24 @@ DWORD WINAPI GetFileVersionInfoSizeA( LPCSTR filename, LPDWORD handle )
|
||||||
|
|
||||||
if ( TRACE_ON(ver) )
|
if ( TRACE_ON(ver) )
|
||||||
print_vffi_debug( vffi );
|
print_vffi_debug( vffi );
|
||||||
|
End:
|
||||||
|
HeapFree( GetProcessHeap(), 0, filenameW);
|
||||||
|
if (filenameA)
|
||||||
|
HeapFree( GetProcessHeap(), 0, filenameA);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GetFileVersionInfoSizeW [VERSION.@]
|
* GetFileVersionInfoSizeA [VERSION.@]
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
|
DWORD WINAPI GetFileVersionInfoSizeA( LPCSTR filename, LPDWORD handle )
|
||||||
{
|
{ UNICODE_STRING filenameW;
|
||||||
DWORD ret, len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL );
|
DWORD retval;
|
||||||
LPSTR fn = HeapAlloc( GetProcessHeap(), 0, len );
|
if(filename) RtlCreateUnicodeStringFromAsciiz(&filenameW, filename);
|
||||||
WideCharToMultiByte( CP_ACP, 0, filename, -1, fn, len, NULL, NULL );
|
else filenameW.Buffer = NULL;
|
||||||
ret = GetFileVersionInfoSizeA( fn, handle );
|
retval = GetFileVersionInfoSizeW(filenameW.Buffer, handle);
|
||||||
HeapFree( GetProcessHeap(), 0, fn );
|
RtlFreeUnicodeString(&filenameW);
|
||||||
return ret;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -514,14 +547,17 @@ DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI GetFileVersionInfoA( LPCSTR filename, DWORD handle,
|
BOOL WINAPI GetFileVersionInfoA( LPCSTR filename, DWORD handle,
|
||||||
DWORD datasize, LPVOID data )
|
DWORD datasize, LPVOID data )
|
||||||
{
|
{ UNICODE_STRING filenameW;
|
||||||
DWORD len;
|
DWORD len;
|
||||||
|
|
||||||
TRACE("(%s,%ld,size=%ld,data=%p)\n",
|
TRACE("(%s,%ld,size=%ld,data=%p)\n",
|
||||||
debugstr_a(filename), handle, datasize, data );
|
debugstr_a(filename), handle, datasize, data );
|
||||||
|
|
||||||
len = VERSION_GetFileVersionInfo_PE(filename, &handle, datasize, data);
|
if(filename) RtlCreateUnicodeStringFromAsciiz(&filenameW, filename);
|
||||||
|
else filenameW.Buffer = NULL;
|
||||||
|
len = VERSION_GetFileVersionInfo_PE(filenameW.Buffer, &handle, datasize, data);
|
||||||
/* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */
|
/* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */
|
||||||
|
RtlFreeUnicodeString(&filenameW);
|
||||||
if(len == 0xFFFFFFFF) return FALSE;
|
if(len == 0xFFFFFFFF) return FALSE;
|
||||||
if(len)
|
if(len)
|
||||||
goto DO_CONVERT;
|
goto DO_CONVERT;
|
||||||
|
@ -563,7 +599,7 @@ BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
|
||||||
TRACE("(%s,%ld,size=%ld,data=%p)\n",
|
TRACE("(%s,%ld,size=%ld,data=%p)\n",
|
||||||
debugstr_w(filename), handle, datasize, data );
|
debugstr_w(filename), handle, datasize, data );
|
||||||
|
|
||||||
if(VERSION_GetFileVersionInfo_PE(fn, &handle, datasize, data))
|
if(VERSION_GetFileVersionInfo_PE(filename, &handle, datasize, data))
|
||||||
goto END;
|
goto END;
|
||||||
if(VERSION_GetFileVersionInfo_16(fn, &handle, datasize, data))
|
if(VERSION_GetFileVersionInfo_16(fn, &handle, datasize, data))
|
||||||
goto END;
|
goto END;
|
||||||
|
|
Loading…
Reference in New Issue