Getting strings with VerQueryValue32W was broken. Complete
reconstruction of the function.
This commit is contained in:
parent
fe4038ab3c
commit
c81a9ed826
116
misc/ver.c
116
misc/ver.c
|
@ -1346,32 +1346,32 @@ DWORD WINAPI VerQueryValue16(SEGPTR segblock,LPCSTR subblock,SEGPTR *buffer,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD WINAPI VerQueryValue32A(LPVOID vblock,LPCSTR subblock,
|
DWORD WINAPI VER_VerQueryValueA(LPVOID,LPCSTR, LPVOID *,UINT32 *, BOOL32 *);
|
||||||
LPVOID *vbuffer,UINT32 *buflen)
|
|
||||||
|
DWORD WINAPI VER_VerQueryValueW(LPVOID vblock,LPCWSTR subblock,
|
||||||
|
LPVOID *vbuffer,UINT32 *buflen, BOOL32 * bIsString)
|
||||||
{
|
{
|
||||||
BYTE *b,*block=(LPBYTE)vblock,**buffer=(LPBYTE*)vbuffer;
|
BYTE *b,*block=(LPBYTE)vblock,**buffer=(LPBYTE*)vbuffer;
|
||||||
LPSTR s;
|
|
||||||
|
|
||||||
TRACE(ver,"(%p,%s,%p,%d)\n",
|
TRACE(ver,"(%p,%s,%p,%d)\n",
|
||||||
block,subblock,buffer,*buflen
|
block,debugstr_w(subblock),buffer,*buflen
|
||||||
);
|
);
|
||||||
|
|
||||||
s=(char*)xmalloc(strlen("VS_VERSION_INFO\\")+strlen(subblock)+1);
|
|
||||||
strcpy(s,"VS_VERSION_INFO\\");strcat(s,subblock);
|
|
||||||
|
|
||||||
/* check for UNICODE version */
|
/* check for UNICODE version */
|
||||||
if ( (*(DWORD*)(block+0x14) != VS_FFI_SIGNATURE) &&
|
if ( (*(DWORD*)(block+0x14) != VS_FFI_SIGNATURE) &&
|
||||||
(*(DWORD*)(block+0x28) == VS_FFI_SIGNATURE)
|
(*(DWORD*)(block+0x28) == VS_FFI_SIGNATURE)
|
||||||
) {
|
) {
|
||||||
LPWSTR wstr;
|
|
||||||
LPSTR xs;
|
|
||||||
struct dbW *db;
|
struct dbW *db;
|
||||||
|
LPWSTR s;
|
||||||
|
LPWSTR vs_version_info = HEAP_strdupAtoW (GetProcessHeap(),0,"VS_VERSION_INFO\\");
|
||||||
|
s=(LPWSTR)xmalloc(2*lstrlen32W(vs_version_info)+2*lstrlen32W(subblock)+2);
|
||||||
|
lstrcpy32W(s,vs_version_info);
|
||||||
|
lstrcat32W(s,subblock);
|
||||||
|
|
||||||
wstr = HEAP_strdupAtoW(GetProcessHeap(),0,s);
|
|
||||||
b=_find_dataW(block,wstr,*(WORD*)block);
|
b=_find_dataW(block,s,*(WORD*)block);
|
||||||
HeapFree(GetProcessHeap(),0,wstr);
|
|
||||||
if (!b) {
|
if (!b) {
|
||||||
WARN(ver,"key %s not found in versionresource.\n",s);
|
WARN(ver,"key %s not found in versionresource.\n",debugstr_w(s));
|
||||||
*buflen=0;
|
*buflen=0;
|
||||||
free (s);
|
free (s);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1380,16 +1380,62 @@ DWORD WINAPI VerQueryValue32A(LPVOID vblock,LPCSTR subblock,
|
||||||
*buflen = db->datalen;
|
*buflen = db->datalen;
|
||||||
b = b+DATA_OFFSET_W(db);
|
b = b+DATA_OFFSET_W(db);
|
||||||
if (db->btext) {
|
if (db->btext) {
|
||||||
xs = HEAP_strdupWtoA(GetProcessHeap(),0,(WCHAR*)b);
|
TRACE(ver,"%s->%s\n",debugstr_w(subblock), debugstr_w((LPWSTR)b));
|
||||||
TRACE(ver,"->%s\n",xs);
|
if (bIsString) *bIsString = TRUE;
|
||||||
HeapFree(GetProcessHeap(),0,xs);
|
|
||||||
|
|
||||||
/* This is a leak. */
|
|
||||||
b = HEAP_strdupWtoA(GetProcessHeap(),0,(WCHAR*)b);
|
|
||||||
} else
|
} else
|
||||||
TRACE(ver,"->%p\n",b);
|
TRACE(ver,"%s->%p\n",debugstr_w(subblock),b);
|
||||||
|
free (s);
|
||||||
|
*buffer = b;
|
||||||
|
} else {
|
||||||
|
BOOL32 bMyIsString = FALSE, ret;
|
||||||
|
LPSTR subblock_a;
|
||||||
|
|
||||||
|
if (!bIsString) return FALSE;
|
||||||
|
|
||||||
|
subblock_a = HEAP_strdupWtoA (GetProcessHeap(),0,subblock);
|
||||||
|
ret = VER_VerQueryValueA( vblock, subblock_a, vbuffer, buflen, &bMyIsString);
|
||||||
|
free (subblock_a);
|
||||||
|
|
||||||
|
if (bMyIsString)
|
||||||
|
{ /* This is a leak. */
|
||||||
|
*buffer = (LPBYTE) HEAP_strdupAtoW(GetProcessHeap(),0,*buffer);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
DWORD WINAPI VER_VerQueryValueA(LPVOID vblock,LPCSTR subblock,
|
||||||
|
LPVOID *vbuffer,UINT32 *buflen, BOOL32 * bIsString)
|
||||||
|
{ BYTE *b,*block=(LPBYTE)vblock,**buffer=(LPBYTE*)vbuffer;
|
||||||
|
|
||||||
|
TRACE(ver,"(%p,%s,%p,%d)\n",
|
||||||
|
block,subblock,buffer,*buflen
|
||||||
|
);
|
||||||
|
|
||||||
|
/* check for UNICODE version */
|
||||||
|
if ( (*(DWORD*)(block+0x14) != VS_FFI_SIGNATURE) &&
|
||||||
|
(*(DWORD*)(block+0x28) == VS_FFI_SIGNATURE)
|
||||||
|
) {
|
||||||
|
BOOL32 bMyIsString = FALSE, ret;
|
||||||
|
LPWSTR subblock_w;
|
||||||
|
|
||||||
|
if (!bIsString) return FALSE;
|
||||||
|
|
||||||
|
subblock_w = HEAP_strdupAtoW (GetProcessHeap(),0,subblock);
|
||||||
|
ret = VER_VerQueryValueW( vblock, subblock_w, vbuffer, buflen, &bMyIsString);
|
||||||
|
free (subblock_w);
|
||||||
|
|
||||||
|
if (bMyIsString)
|
||||||
|
{ /* This is a leak. */
|
||||||
|
*buffer = (LPBYTE)HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR) *buffer);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
struct dbA *db;
|
struct dbA *db;
|
||||||
|
LPSTR s;
|
||||||
|
s=(char*)xmalloc(strlen("VS_VERSION_INFO\\")+strlen(subblock)+1);
|
||||||
|
strcpy(s,"VS_VERSION_INFO\\");strcat(s,subblock);
|
||||||
|
|
||||||
b=_find_dataA(block,s,*(WORD*)block);
|
b=_find_dataA(block,s,*(WORD*)block);
|
||||||
if (!b) {
|
if (!b) {
|
||||||
WARN(ver,"key %s not found in versionresource.\n",subblock);
|
WARN(ver,"key %s not found in versionresource.\n",subblock);
|
||||||
|
@ -1402,25 +1448,23 @@ DWORD WINAPI VerQueryValue32A(LPVOID vblock,LPCSTR subblock,
|
||||||
b = b+DATA_OFFSET_A(db);
|
b = b+DATA_OFFSET_A(db);
|
||||||
|
|
||||||
/* the string is only printable, if it is below \\StringFileInfo*/
|
/* the string is only printable, if it is below \\StringFileInfo*/
|
||||||
if (!lstrncmpi32A("VS_VERSION_INFO\\StringFileInfo\\",s,strlen("VS_VERSION_INFO\\StringFileInfo\\")))
|
if (!lstrncmpi32A("VS_VERSION_INFO\\StringFileInfo\\",s,strlen("VS_VERSION_INFO\\StringFileInfo\\"))) {
|
||||||
TRACE(ver," -> %s=%s\n",subblock,b);
|
TRACE(ver,"%s->%s\n",subblock,b);
|
||||||
else
|
if (bIsString) *bIsString = TRUE;
|
||||||
TRACE(ver," -> %s=%p\n",subblock,b);
|
} else
|
||||||
|
TRACE(ver,"%s->%p\n",subblock,b);
|
||||||
|
free(s);
|
||||||
|
*buffer = b;
|
||||||
}
|
}
|
||||||
*buffer = b;
|
return TRUE;
|
||||||
free(s);
|
|
||||||
return 1;
|
}
|
||||||
|
DWORD WINAPI VerQueryValue32A(LPVOID vblock,LPCSTR subblock,
|
||||||
|
LPVOID *vbuffer,UINT32 *buflen)
|
||||||
|
{ return VER_VerQueryValueA(vblock,subblock, vbuffer,buflen, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD WINAPI VerQueryValue32W(LPVOID vblock,LPCWSTR subblock,LPVOID *vbuffer,
|
DWORD WINAPI VerQueryValue32W(LPVOID vblock,LPCWSTR subblock,LPVOID *vbuffer,
|
||||||
UINT32 *buflen)
|
UINT32 *buflen)
|
||||||
{
|
{ return VER_VerQueryValueW(vblock,subblock, vbuffer,buflen, NULL);
|
||||||
LPSTR sb;
|
|
||||||
DWORD ret;
|
|
||||||
|
|
||||||
sb = HEAP_strdupWtoA( GetProcessHeap(), 0, subblock );
|
|
||||||
ret = VerQueryValue32A(vblock,sb,vbuffer,buflen);
|
|
||||||
HeapFree( GetProcessHeap(), 0, sb );
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
/* 20 GETFILEVERSIONINFORAW */
|
|
||||||
|
|
Loading…
Reference in New Issue