version: Fix the VerQueryValueA/W() prototypes.

Francois Gouget fgouget at free.fr
Thu May 31 06:59:05 CDT 2007


---

In the current PSDK versions the first parameter to VerQueryValueA/W() 
is const, although they do write to the 'empty' part of that buffer.

 dlls/version/info.c |   36 +++++++++++++++++++++---------------
 include/winver.h    |    4 ++--
 2 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/dlls/version/info.c b/dlls/version/info.c
index 40dfcec..9c24668 100644
--- a/dlls/version/info.c
+++ b/dlls/version/info.c
@@ -206,7 +206,7 @@ typedef struct
 } VS_VERSION_INFO_STRUCT32;
 
 #define VersionInfoIs16( ver ) \
-    ( ((VS_VERSION_INFO_STRUCT16 *)ver)->szKey[0] >= ' ' )
+    ( ((const VS_VERSION_INFO_STRUCT16 *)ver)->szKey[0] >= ' ' )
 
 #define DWORD_ALIGN( base, ptr ) \
     ( (LPBYTE)(base) + ((((LPBYTE)(ptr) - (LPBYTE)(base)) + 3) & ~3) )
@@ -217,10 +217,10 @@ typedef struct
     DWORD_ALIGN( (ver), (ver)->szKey + strlenW((ver)->szKey) + 1 )
 
 #define VersionInfo16_Children( ver )  \
-    (VS_VERSION_INFO_STRUCT16 *)( VersionInfo16_Value( ver ) + \
+    (const VS_VERSION_INFO_STRUCT16 *)( VersionInfo16_Value( ver ) + \
                            ( ( (ver)->wValueLength + 3 ) & ~3 ) )
 #define VersionInfo32_Children( ver )  \
-    (VS_VERSION_INFO_STRUCT32 *)( VersionInfo32_Value( ver ) + \
+    (const VS_VERSION_INFO_STRUCT32 *)( VersionInfo32_Value( ver ) + \
                            ( ( (ver)->wValueLength * \
                                ((ver)->wType? 2 : 1) + 3 ) & ~3 ) )
 
@@ -632,10 +632,10 @@ BOOL WINAPI GetFileVersionInfoA( LPCSTR filename, DWORD handle,
 /***********************************************************************
  *           VersionInfo16_FindChild             [internal]
  */
-static VS_VERSION_INFO_STRUCT16 *VersionInfo16_FindChild( VS_VERSION_INFO_STRUCT16 *info,
+static const VS_VERSION_INFO_STRUCT16 *VersionInfo16_FindChild( const VS_VERSION_INFO_STRUCT16 *info,
                                             LPCSTR szKey, UINT cbKey )
 {
-    VS_VERSION_INFO_STRUCT16 *child = VersionInfo16_Children( info );
+    const VS_VERSION_INFO_STRUCT16 *child = VersionInfo16_Children( info );
 
     while ((char *)child < (char *)info + info->wLength )
     {
@@ -652,10 +652,10 @@ static VS_VERSION_INFO_STRUCT16 *VersionInfo16_FindChild( VS_VERSION_INFO_STRUCT
 /***********************************************************************
  *           VersionInfo32_FindChild             [internal]
  */
-static VS_VERSION_INFO_STRUCT32 *VersionInfo32_FindChild( VS_VERSION_INFO_STRUCT32 *info,
+static const VS_VERSION_INFO_STRUCT32 *VersionInfo32_FindChild( const VS_VERSION_INFO_STRUCT32 *info,
                                             LPCWSTR szKey, UINT cbKey )
 {
-    VS_VERSION_INFO_STRUCT32 *child = VersionInfo32_Children( info );
+    const VS_VERSION_INFO_STRUCT32 *child = VersionInfo32_Children( info );
 
     while ((char *)child < (char *)info + info->wLength )
     {
@@ -673,7 +673,7 @@ static VS_VERSION_INFO_STRUCT32 *VersionInfo32_FindChild( VS_VERSION_INFO_STRUCT
  *
  *    Gets a value from a 16-bit NE resource
  */
-static BOOL WINAPI VersionInfo16_QueryValue( VS_VERSION_INFO_STRUCT16 *info, LPCSTR lpSubBlock,
+static BOOL WINAPI VersionInfo16_QueryValue( const VS_VERSION_INFO_STRUCT16 *info, LPCSTR lpSubBlock,
                                LPVOID *lplpBuffer, UINT *puLen )
 {
     while ( *lpSubBlock )
@@ -717,7 +717,7 @@ static BOOL WINAPI VersionInfo16_QueryValue( VS_VERSION_INFO_STRUCT16 *info, LPC
  *
  *    Gets a value from a 32-bit PE resource
  */
-static BOOL WINAPI VersionInfo32_QueryValue( VS_VERSION_INFO_STRUCT32 *info, LPCWSTR lpSubBlock,
+static BOOL WINAPI VersionInfo32_QueryValue( const VS_VERSION_INFO_STRUCT32 *info, LPCWSTR lpSubBlock,
                                LPVOID *lplpBuffer, UINT *puLen )
 {
     TRACE("lpSubBlock : (%s)\n", debugstr_w(lpSubBlock));
@@ -761,12 +761,12 @@ static BOOL WINAPI VersionInfo32_QueryValue( VS_VERSION_INFO_STRUCT32 *info, LPC
 /***********************************************************************
  *           VerQueryValueA              [VERSION.@]
  */
-BOOL WINAPI VerQueryValueA( LPVOID pBlock, LPCSTR lpSubBlock,
+BOOL WINAPI VerQueryValueA( LPCVOID pBlock, LPCSTR lpSubBlock,
                                LPVOID *lplpBuffer, UINT *puLen )
 {
     static const char rootA[] = "\\";
     static const char varfileinfoA[] = "\\VarFileInfo\\Translation";
-    VS_VERSION_INFO_STRUCT16 *info = (VS_VERSION_INFO_STRUCT16 *)pBlock;
+    const VS_VERSION_INFO_STRUCT16 *info = (const VS_VERSION_INFO_STRUCT16 *)pBlock;
 
     TRACE("(%p,%s,%p,%p)\n",
                 pBlock, debugstr_a(lpSubBlock), lplpBuffer, puLen );
@@ -791,8 +791,11 @@ BOOL WINAPI VerQueryValueA( LPVOID pBlock, LPCSTR lpSubBlock,
 
         if (ret && strcasecmp( lpSubBlock, rootA ) && strcasecmp( lpSubBlock, varfileinfoA ))
         {
+            /* Set lpBuffer so it points to the 'empty' area where we store
+             * the converted strings
+             */
             LPSTR lpBufferA = (LPSTR)pBlock + info->wLength + 4;
-            DWORD pos = (LPSTR)*lplpBuffer - (LPSTR)pBlock;
+            DWORD pos = (LPCSTR)*lplpBuffer - (LPCSTR)pBlock;
 
             len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)*lplpBuffer, -1,
                                       lpBufferA + pos, info->wLength - pos, NULL, NULL);
@@ -808,14 +811,14 @@ BOOL WINAPI VerQueryValueA( LPVOID pBlock, LPCSTR lpSubBlock,
 /***********************************************************************
  *           VerQueryValueW              [VERSION.@]
  */
-BOOL WINAPI VerQueryValueW( LPVOID pBlock, LPCWSTR lpSubBlock,
+BOOL WINAPI VerQueryValueW( LPCVOID pBlock, LPCWSTR lpSubBlock,
                                LPVOID *lplpBuffer, UINT *puLen )
 {
     static const WCHAR rootW[] = { '\\', 0 };
     static const WCHAR varfileinfoW[] = { '\\','V','a','r','F','i','l','e','I','n','f','o',
                                           '\\','T','r','a','n','s','l','a','t','i','o','n', 0 };
 
-    VS_VERSION_INFO_STRUCT32 *info = (VS_VERSION_INFO_STRUCT32 *)pBlock;
+    const VS_VERSION_INFO_STRUCT32 *info = (const VS_VERSION_INFO_STRUCT32 *)pBlock;
 
     TRACE("(%p,%s,%p,%p)\n",
                 pBlock, debugstr_w(lpSubBlock), lplpBuffer, puLen );
@@ -840,8 +843,11 @@ BOOL WINAPI VerQueryValueW( LPVOID pBlock, LPCWSTR lpSubBlock,
 
         if (ret && strcmpiW( lpSubBlock, rootW ) && strcmpiW( lpSubBlock, varfileinfoW ))
         {
+            /* Set lpBuffer so it points to the 'empty' area where we store
+             * the converted strings
+             */
             LPWSTR lpBufferW = (LPWSTR)((LPSTR)pBlock + info->wLength);
-            DWORD pos = (LPSTR)*lplpBuffer - (LPSTR)pBlock;
+            DWORD pos = (LPCSTR)*lplpBuffer - (LPCSTR)pBlock;
             DWORD max = (info->wLength - sizeof(VS_FIXEDFILEINFO)) * 4 - info->wLength;
 
             len = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)*lplpBuffer, -1,
diff --git a/include/winver.h b/include/winver.h
index ff4233a..c38ad38 100644
--- a/include/winver.h
+++ b/include/winver.h
@@ -159,8 +159,8 @@ DWORD       WINAPI VerInstallFileW(UINT,LPWSTR,LPWSTR,LPWSTR,LPWSTR,LPWSTR,LPWST
 DWORD       WINAPI VerLanguageNameA(UINT,LPSTR,UINT);
 DWORD       WINAPI VerLanguageNameW(UINT,LPWSTR,UINT);
 #define     VerLanguageName WINELIB_NAME_AW(VerLanguageName)
-BOOL        WINAPI VerQueryValueA(LPVOID,LPCSTR,LPVOID*,UINT*);
-BOOL        WINAPI VerQueryValueW(LPVOID,LPCWSTR,LPVOID*,UINT*);
+BOOL        WINAPI VerQueryValueA(LPCVOID,LPCSTR,LPVOID*,UINT*);
+BOOL        WINAPI VerQueryValueW(LPCVOID,LPCWSTR,LPVOID*,UINT*);
 #define     VerQueryValue WINELIB_NAME_AW(VerQueryValue)
 DWORD       WINAPI GetFileVersionInfoSizeA(LPCSTR,LPDWORD);
 DWORD       WINAPI GetFileVersionInfoSizeW(LPCWSTR,LPDWORD);
-- 
1.4.4.4




More information about the wine-patches mailing list