Moved implementation of GetFileVersionInfoSize from ascii to unicode,

fixed failing, crashing test cases.
oldstable
Stefan Leichter 2004-04-05 22:51:37 +00:00 committed by Alexandre Julliard
parent f35d1caeef
commit 1ce19853c1
1 changed files with 77 additions and 41 deletions

View File

@ -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;