Ignore:
Timestamp:
Oct 24, 2003, 4:47:25 PM (22 years ago)
Author:
sandervl
Message:

Wine resync

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/version/info.c

    r9676 r10296  
    1 /* $Id: info.c,v 1.4 2003-01-15 10:42:34 sandervl Exp $ */
    2 /*
    3  * Implementation of VERSION.DLL - Version Info access (Wine 991212)
    4  *
     1/*
     2 * Implementation of VERSION.DLL - Version Info access
     3 *
    54 * Copyright 1996,1997 Marcus Meissner
    65 * Copyright 1997 David Cuthbert
    76 * Copyright 1999 Ulrich Weigand
    8  */
    9 
     7 *
     8 * This library is free software; you can redistribute it and/or
     9 * modify it under the terms of the GNU Lesser General Public
     10 * License as published by the Free Software Foundation; either
     11 * version 2.1 of the License, or (at your option) any later version.
     12 *
     13 * This library is distributed in the hope that it will be useful,
     14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     16 * Lesser General Public License for more details.
     17 *
     18 * You should have received a copy of the GNU Lesser General Public
     19 * License along with this library; if not, write to the Free Software
     20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     21 *
     22 * TODO
     23 *   o Verify VerQueryValue()
     24 */
     25
     26#include <stdarg.h>
    1027#include <stdlib.h>
    1128#include <string.h>
    1229
     30#include "windef.h"
     31#include "winbase.h"
    1332#include "winreg.h"
    1433#include "winver.h"
    15 #include "wine/winestring.h"
     34#include "wine/winuser16.h"
     35#include "wine/unicode.h"
    1636#include "winerror.h"
    17 #include "heap.h"
    18 #include "crtdll.h"
    19 #include "debugtools.h"
    20 #include <misc.h>
    21 #include <unicode.h>
    22 
    23 DEFAULT_DEBUG_CHANNEL(ver)
     37#include "wine/debug.h"
     38
     39WINE_DEFAULT_DEBUG_CHANNEL(ver);
    2440
    2541
     
    3248 *
    3349 *****************************************************************************/
     50#ifdef DEBUG
    3451static void print_vffi_debug(VS_FIXEDFILEINFO *vffi)
    3552{
     
    5067
    5168        TRACE("(");
    52         DPRINTF(" OS=0x%x.0x%x ",
     69        TRACE(" OS=0x%x.0x%x ",
    5370                HIWORD(vffi->dwFileOS),
    5471                LOWORD(vffi->dwFileOS)
    5572        );
    5673        switch (vffi->dwFileOS&0xFFFF0000) {
    57         case VOS_DOS:DPRINTF("DOS,");break;
    58         case VOS_OS216:DPRINTF("OS/2-16,");break;
    59         case VOS_OS232:DPRINTF("OS/2-32,");break;
    60         case VOS_NT:DPRINTF("NT,");break;
     74        case VOS_DOS:TRACE("DOS,");break;
     75        case VOS_OS216:TRACE("OS/2-16,");break;
     76        case VOS_OS232:TRACE("OS/2-32,");break;
     77        case VOS_NT:TRACE("NT,");break;
    6178        case VOS_UNKNOWN:
    6279        default:
    63                 DPRINTF("UNKNOWN(0x%lx),",vffi->dwFileOS&0xFFFF0000);break;
     80                TRACE("UNKNOWN(0x%lx),",vffi->dwFileOS&0xFFFF0000);break;
    6481        }
    6582        switch (LOWORD(vffi->dwFileOS)) {
    66         case VOS__BASE:DPRINTF("BASE");break;
    67         case VOS__WINDOWS16:DPRINTF("WIN16");break;
    68         case VOS__WINDOWS32:DPRINTF("WIN32");break;
    69         case VOS__PM16:DPRINTF("PM16");break;
    70         case VOS__PM32:DPRINTF("PM32");break;
    71         default:DPRINTF("UNKNOWN(0x%x)",LOWORD(vffi->dwFileOS));break;
     83        case VOS__BASE:TRACE("BASE");break;
     84        case VOS__WINDOWS16:TRACE("WIN16");break;
     85        case VOS__WINDOWS32:TRACE("WIN32");break;
     86        case VOS__PM16:TRACE("PM16");break;
     87        case VOS__PM32:TRACE("PM32");break;
     88        default:TRACE("UNKNOWN(0x%x)",LOWORD(vffi->dwFileOS));break;
    7289        }
    73         DPRINTF(")\n");
     90        TRACE(")\n");
    7491
    7592        switch (vffi->dwFileType) {
     
    85102                default:
    86103                case VFT2_UNKNOWN:
    87                         DPRINTF("UNKNOWN(0x%lx)",vffi->dwFileSubtype);
     104                        TRACE("UNKNOWN(0x%lx)",vffi->dwFileSubtype);
    88105                        break;
    89106                case VFT2_DRV_PRINTER:
    90                         DPRINTF("PRINTER");
     107                        TRACE("PRINTER");
    91108                        break;
    92109                case VFT2_DRV_KEYBOARD:
    93                         DPRINTF("KEYBOARD");
     110                        TRACE("KEYBOARD");
    94111                        break;
    95112                case VFT2_DRV_LANGUAGE:
    96                         DPRINTF("LANGUAGE");
     113                        TRACE("LANGUAGE");
    97114                        break;
    98115                case VFT2_DRV_DISPLAY:
    99                         DPRINTF("DISPLAY");
     116                        TRACE("DISPLAY");
    100117                        break;
    101118                case VFT2_DRV_MOUSE:
    102                         DPRINTF("MOUSE");
     119                        TRACE("MOUSE");
    103120                        break;
    104121                case VFT2_DRV_NETWORK:
    105                         DPRINTF("NETWORK");
     122                        TRACE("NETWORK");
    106123                        break;
    107124                case VFT2_DRV_SYSTEM:
    108                         DPRINTF("SYSTEM");
     125                        TRACE("SYSTEM");
    109126                        break;
    110127                case VFT2_DRV_INSTALLABLE:
    111                         DPRINTF("INSTALLABLE");
     128                        TRACE("INSTALLABLE");
    112129                        break;
    113130                case VFT2_DRV_SOUND:
    114                         DPRINTF("SOUND");
     131                        TRACE("SOUND");
    115132                        break;
    116133                case VFT2_DRV_COMM:
    117                         DPRINTF("COMM");
     134                        TRACE("COMM");
    118135                        break;
    119136                case VFT2_DRV_INPUTMETHOD:
    120                         DPRINTF("INPUTMETHOD");
     137                        TRACE("INPUTMETHOD");
    121138                        break;
    122139                }
     
    126143                switch (vffi->dwFileSubtype) {
    127144                default:
    128                         DPRINTF("UNKNOWN(0x%lx)",vffi->dwFileSubtype);
    129                         break;
    130                 case VFT2_FONT_RASTER:DPRINTF("RASTER");break;
    131                 case VFT2_FONT_VECTOR:DPRINTF("VECTOR");break;
    132                 case VFT2_FONT_TRUETYPE:DPRINTF("TRUETYPE");break;
     145                        TRACE("UNKNOWN(0x%lx)",vffi->dwFileSubtype);
     146                        break;
     147                case VFT2_FONT_RASTER:TRACE("RASTER");break;
     148                case VFT2_FONT_VECTOR:TRACE("VECTOR");break;
     149                case VFT2_FONT_TRUETYPE:TRACE("TRUETYPE");break;
    133150                }
    134151                break;
     
    136153        case VFT_STATIC_LIB:TRACE("filetype=STATIC_LIB");break;
    137154        }
    138         DPRINTF("\n");
     155        TRACE("\n");
    139156        TRACE("  filedata=0x%lx.0x%lx\n",
    140157                    vffi->dwFileDateMS,vffi->dwFileDateLS);
    141158}
    142 
     159#else
     160#define print_vffi_debug(a)
     161#endif
    143162
    144163/***********************************************************************
     
    176195    ( ((VS_VERSION_INFO_STRUCT16 *)ver)->szKey[0] >= ' ' )
    177196
    178 #define DWORD_ALIGN( ptr ) ((LPBYTE)( (((DWORD)(ptr)) + 3) & ~3 ))
     197#define DWORD_ALIGN( base, ptr ) \
     198    ( (LPBYTE)(base) + ((((LPBYTE)(ptr) - (LPBYTE)(base)) + 3) & ~3) )
    179199
    180200#define VersionInfo16_Value( ver )  \
    181     DWORD_ALIGN( (ver)->szKey + lstrlenA((ver)->szKey) + 1 )
     201    DWORD_ALIGN( (ver), (ver)->szKey + strlen((ver)->szKey) + 1 )
    182202#define VersionInfo32_Value( ver )  \
    183     DWORD_ALIGN( (ver)->szKey + lstrlenW((ver)->szKey) + 1 )
     203    DWORD_ALIGN( (ver), (ver)->szKey + strlenW((ver)->szKey) + 1 )
    184204
    185205#define VersionInfo16_Children( ver )  \
     
    196216    (VS_VERSION_INFO_STRUCT32 *)( (LPBYTE)ver + (((ver)->wLength + 3) & ~3) )
    197217
    198 #ifndef __WIN32OS2__
    199218/***********************************************************************
    200219 *           ConvertVersionInfo32To16        [internal]
    201220 */
    202 void ConvertVersionInfo32To16( VS_VERSION_INFO_STRUCT32 *info32, 
     221void ConvertVersionInfo32To16( VS_VERSION_INFO_STRUCT32 *info32,
    203222                               VS_VERSION_INFO_STRUCT16 *info16 )
    204223{
     
    211230    VS_VERSION_INFO_STRUCT16 *child16;
    212231
    213     TRACE("Converting %p to %p\n", info32, info16 );
    214     TRACE("wLength %d, wValueLength %d, bText %d, value %p, child %p\n",
    215                 wLength, wValueLength, bText, lpValue, child32 );
     232    dprintf(("Converting %p to %p\n", info32, info16 ));
     233    dprintf(("wLength %d, wValueLength %d, bText %d, value %p, child %p\n",
     234                wLength, wValueLength, bText, lpValue, child32 ));
    216235
    217236    /* Convert key */
    218     lstrcpyWtoA( info16->szKey, info32->szKey );
    219 
    220     TRACE("Copied key from %p to %p: %s\n", info32->szKey, info16->szKey,
    221                 debugstr_a(info16->szKey) );
     237    WideCharToMultiByte( CP_ACP, 0, info32->szKey, -1, info16->szKey, 0x7fffffff, NULL, NULL );
     238
     239    dprintf(("Copied key from %p to %p: %s\n", info32->szKey, info16->szKey,
     240                debugstr_a(info16->szKey) ));
    222241
    223242    /* Convert value */
     
    225244    {
    226245        info16->wValueLength = 0;
    227         TRACE("No value present\n" );
     246        dprintf(("No value present\n" ));
    228247    }
    229248    else if ( bText )
    230249    {
    231         info16->wValueLength = lstrlenW( (LPCWSTR)lpValue ) + 1;
    232         lstrcpyWtoA( VersionInfo16_Value( info16 ), (LPCWSTR)lpValue );
    233 
    234         TRACE("Copied value from %p to %p: %s\n", lpValue,
    235                     VersionInfo16_Value( info16 ),
     250        info16->wValueLength = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)lpValue, -1, NULL, 0, NULL, NULL );
     251        WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)lpValue, -1,
     252                             VersionInfo16_Value( info16 ), info16->wValueLength, NULL, NULL );
     253
     254        dprintf(("Copied value from %p to %p: %s\n", lpValue,
     255                    VersionInfo16_Value( info16 )),
    236256                    debugstr_a(VersionInfo16_Value( info16 )) );
    237257    }
     
    241261        memmove( VersionInfo16_Value( info16 ), lpValue, wValueLength );
    242262
    243         TRACE("Copied value from %p to %p: %d bytes\n", lpValue,
    244                      VersionInfo16_Value( info16 ), wValueLength );
     263        dprintf(("Copied value from %p to %p: %d bytes\n", lpValue,
     264                     VersionInfo16_Value( info16 ), wValueLength ));
    245265    }
    246266
    247267    /* Convert children */
    248268    child16 = VersionInfo16_Children( info16 );
    249     while ( (DWORD)child32 < (DWORD)info32 + wLength )
     269    while ( (DWORD)child32 < (DWORD)info32 + wLength && child32->wLength != 0 )
    250270    {
    251271        VS_VERSION_INFO_STRUCT32 *nextChild = VersionInfo32_Next( child32 );
     
    260280    info16->wLength = (DWORD)child16 - (DWORD)info16;
    261281
    262     TRACE("Finished, length is %d (%p - %p)\n",
    263                 info16->wLength, info16, child16 );
    264 }
    265 
    266 
    267 /***********************************************************************
    268  *           GetFileVersionInfoSize32A         [VERSION.2]
     282    dprintf(("Finished, length is %d (%p - %p)\n",
     283                info16->wLength, info16, child16 ));
     284}
     285
     286/***********************************************************************
     287 *           VERSION_GetFileVersionInfo_PE             [internal]
     288 *
     289 *    NOTE: returns size of the PE VERSION resource or 0xFFFFFFFF
     290 *    in the case if file exists, but VERSION_INFO not found.
     291 *    FIXME: handle is not used.
     292 */
     293static DWORD VERSION_GetFileVersionInfo_PE( LPCSTR filename, LPDWORD handle,
     294                                    DWORD datasize, LPVOID data )
     295{
     296    VS_FIXEDFILEINFO *vffi;
     297    DWORD len;
     298    BYTE *buf;
     299    HMODULE hModule;
     300    HRSRC hRsrc;
     301    HGLOBAL hMem;
     302
     303    dprintf(("(%s,%p)\n", debugstr_a(filename), handle ));
     304
     305    hModule = GetModuleHandleA(filename);
     306    if(!hModule)
     307        hModule = LoadLibraryExA(filename, 0, LOAD_LIBRARY_AS_DATAFILE);
     308    else
     309        hModule = LoadLibraryExA(filename, 0, 0);
     310    if(!hModule)
     311    {
     312        WARN("Could not load %s\n", debugstr_a(filename));
     313        return 0;
     314    }
     315    hRsrc = FindResourceW(hModule,
     316                          MAKEINTRESOURCEW(VS_VERSION_INFO),
     317                          MAKEINTRESOURCEW(VS_FILE_INFO));
     318    if(!hRsrc)
     319    {
     320        WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_a(filename));
     321        FreeLibrary(hModule);
     322        return 0xFFFFFFFF;
     323    }
     324    len = SizeofResource(hModule, hRsrc);
     325    hMem = LoadResource(hModule, hRsrc);
     326    if(!hMem)
     327    {
     328        WARN("Could not load VS_VERSION_INFO from %s\n", debugstr_a(filename));
     329        FreeLibrary(hModule);
     330        return 0xFFFFFFFF;
     331    }
     332    buf = LockResource(hMem);
     333
     334    vffi = (VS_FIXEDFILEINFO *)VersionInfo32_Value( (VS_VERSION_INFO_STRUCT32 *)buf );
     335
     336    if ( vffi->dwSignature != VS_FFI_SIGNATURE )
     337    {
     338        WARN("vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n",
     339                   vffi->dwSignature, VS_FFI_SIGNATURE );
     340        len = 0xFFFFFFFF;
     341        goto END;
     342    }
     343#ifdef DEBUG
     344    if ( TRACE_ON(ver) )
     345        print_vffi_debug( vffi );
     346#endif
     347    if(data)
     348    {
     349        if(datasize < len)
     350            len = datasize; /* truncate data */
     351        if(len)
     352            memcpy(data, buf, len);
     353        else
     354            len = 0xFFFFFFFF;
     355    }
     356END:
     357    FreeResource(hMem);
     358    FreeLibrary(hModule);
     359
     360    return len;
     361}
     362
     363#ifndef __WIN32OS2__
     364/***********************************************************************
     365 *           VERSION_GetFileVersionInfo_16             [internal]
     366 *
     367 *    NOTE: returns size of the 16-bit VERSION resource or 0xFFFFFFFF
     368 *    in the case if file exists, but VERSION_INFO not found.
     369 *    FIXME: handle is not used.
     370 */
     371static DWORD VERSION_GetFileVersionInfo_16( LPCSTR filename, LPDWORD handle,
     372                                    DWORD datasize, LPVOID data )
     373{
     374    VS_FIXEDFILEINFO *vffi;
     375    DWORD len;
     376    BYTE *buf;
     377    HMODULE16 hModule;
     378    HRSRC16 hRsrc;
     379    HGLOBAL16 hMem;
     380
     381    TRACE("(%s,%p)\n", debugstr_a(filename), handle );
     382
     383    hModule = LoadLibrary16(filename);
     384    if(hModule < 32)
     385    {
     386        WARN("Could not load %s\n", debugstr_a(filename));
     387        return 0;
     388    }
     389    hRsrc = FindResource16(hModule,
     390                          MAKEINTRESOURCEA(VS_VERSION_INFO),
     391                          MAKEINTRESOURCEA(VS_FILE_INFO));
     392    if(!hRsrc)
     393    {
     394        WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_a(filename));
     395        FreeLibrary16(hModule);
     396        return 0xFFFFFFFF;
     397    }
     398    len = SizeofResource16(hModule, hRsrc);
     399    hMem = LoadResource16(hModule, hRsrc);
     400    if(!hMem)
     401    {
     402        WARN("Could not load VS_VERSION_INFO from %s\n", debugstr_a(filename));
     403        FreeLibrary16(hModule);
     404        return 0xFFFFFFFF;
     405    }
     406    buf = LockResource16(hMem);
     407
     408    if(!VersionInfoIs16(buf))
     409        goto END;
     410
     411    vffi = (VS_FIXEDFILEINFO *)VersionInfo16_Value( (VS_VERSION_INFO_STRUCT16 *)buf );
     412
     413    if ( vffi->dwSignature != VS_FFI_SIGNATURE )
     414    {
     415        WARN("vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n",
     416                   vffi->dwSignature, VS_FFI_SIGNATURE );
     417        len = 0xFFFFFFFF;
     418        goto END;
     419    }
     420
     421    if ( TRACE_ON(ver) )
     422        print_vffi_debug( vffi );
     423
     424    if(data)
     425    {
     426        if(datasize < len)
     427            len = datasize; /* truncate data */
     428        if(len)
     429            memcpy(data, buf, len);
     430        else
     431            len = 0xFFFFFFFF;
     432    }
     433END:
     434    FreeResource16(hMem);
     435    FreeLibrary16(hModule);
     436
     437    return len;
     438}
     439#endif
     440
     441/***********************************************************************
     442 *           GetFileVersionInfoSizeA         [VERSION.@]
    269443 */
    270444DWORD WINAPI GetFileVersionInfoSizeA( LPCSTR filename, LPDWORD handle )
     
    274448    BYTE buf[144];
    275449
    276     TRACE("(%s,%p)\n", debugstr_a(filename), handle );
    277 
    278     len = GetFileResourceSize( filename,
     450    dprintf(("(%s,%p)\n", debugstr_a(filename), handle ));
     451
     452    len = VERSION_GetFileVersionInfo_PE(filename, handle, 0, NULL);
     453    /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */
     454    if(len == 0xFFFFFFFF)
     455    {
     456        SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
     457        return 0;
     458    }
     459    if(len) return len;
     460#ifndef __WIN32OS2__
     461    len = VERSION_GetFileVersionInfo_16(filename, handle, 0, NULL);
     462    /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */
     463    if(len == 0xFFFFFFFF)
     464    {
     465        SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
     466        return 0;
     467    }
     468    if(len) return len;
     469#endif
     470    len = GetFileResourceSize16( filename,
    279471                                 MAKEINTRESOURCEA(VS_FILE_INFO),
    280472                                 MAKEINTRESOURCEA(VS_VERSION_INFO),
     
    282474    if (!len) return 0;
    283475
    284     ret = GetFileResource( filename,
     476    ret = GetFileResource16( filename,
    285477                             MAKEINTRESOURCEA(VS_FILE_INFO),
    286478                             MAKEINTRESOURCEA(VS_VERSION_INFO),
     
    289481
    290482    if ( handle ) *handle = offset;
    291    
     483
    292484    if ( VersionInfoIs16( buf ) )
    293485        vffi = (VS_FIXEDFILEINFO *)VersionInfo16_Value( (VS_VERSION_INFO_STRUCT16 *)buf );
     
    297489    if ( vffi->dwSignature != VS_FFI_SIGNATURE )
    298490    {
    299         WARN("vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n",
    300                    vffi->dwSignature, VS_FFI_SIGNATURE );
     491        dprintf(("vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n",
     492                   vffi->dwSignature, VS_FFI_SIGNATURE ));
    301493        return 0;
    302494    }
     
    305497        len = ((VS_VERSION_INFO_STRUCT16 *)buf)->wLength;
    306498
     499#ifdef DEBUG
    307500    if ( TRACE_ON(ver) )
    308501        print_vffi_debug( vffi );
     502#endif
    309503
    310504    return len;
     
    312506
    313507/***********************************************************************
    314  *           GetFileVersionInfoSize32W         [VERSION.3]
     508 *           GetFileVersionInfoSizeW         [VERSION.@]
    315509 */
    316510DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle )
    317511{
    318     LPSTR fn = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
    319     DWORD ret = GetFileVersionInfoSizeA( fn, handle );
     512    DWORD ret, len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL );
     513    LPSTR fn = HeapAlloc( GetProcessHeap(), 0, len );
     514    WideCharToMultiByte( CP_ACP, 0, filename, -1, fn, len, NULL, NULL );
     515    ret = GetFileVersionInfoSizeA( fn, handle );
    320516    HeapFree( GetProcessHeap(), 0, fn );
    321517    return ret;
     
    323519
    324520/***********************************************************************
    325  *           GetFileVersionInfo32A             [VERSION.1]
    326  */
    327 DWORD WINAPI GetFileVersionInfoA( LPCSTR filename, DWORD handle,
     521 *           GetFileVersionInfoA             [VERSION.@]
     522 */
     523BOOL WINAPI GetFileVersionInfoA( LPCSTR filename, DWORD handle,
    328524                                    DWORD datasize, LPVOID data )
    329525{
    330     TRACE("(%s,%ld,size=%ld,data=%p)\n",
    331                 debugstr_a(filename), handle, datasize, data );
    332 
    333     if ( !GetFileResource( filename, MAKEINTRESOURCEA(VS_FILE_INFO),
     526    DWORD len;
     527
     528    dprintf(("(%s,%ld,size=%ld,data=%p)\n",
     529                debugstr_a(filename), handle, datasize, data ));
     530
     531    len = VERSION_GetFileVersionInfo_PE(filename, &handle, datasize, data);
     532    /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */
     533    if(len == 0xFFFFFFFF) return FALSE;
     534    if(len)
     535        goto DO_CONVERT;
     536#ifndef __WIN32OS2__
     537    len = VERSION_GetFileVersionInfo_16(filename, &handle, datasize, data);
     538    /* 0xFFFFFFFF means: file exists, but VERSION_INFO not found */
     539    if(len == 0xFFFFFFFF) return FALSE;
     540    if(len)
     541        goto DO_CONVERT;
     542#endif
     543
     544    if ( !GetFileResource16( filename, MAKEINTRESOURCEA(VS_FILE_INFO),
    334545                                       MAKEINTRESOURCEA(VS_VERSION_INFO),
    335546                                       handle, datasize, data ) )
    336547        return FALSE;
    337 
     548DO_CONVERT:
    338549    if (    datasize >= sizeof(VS_VERSION_INFO_STRUCT16)
    339          && datasize >= ((VS_VERSION_INFO_STRUCT16 *)data)->wLength 
     550         && datasize >= ((VS_VERSION_INFO_STRUCT16 *)data)->wLength
    340551         && !VersionInfoIs16( data ) )
    341552    {
    342553        /* convert resource from PE format to NE format */
    343         ConvertVersionInfo32To16( (VS_VERSION_INFO_STRUCT32 *)data, 
     554        ConvertVersionInfo32To16( (VS_VERSION_INFO_STRUCT32 *)data,
    344555                                  (VS_VERSION_INFO_STRUCT16 *)data );
    345556    }
     
    349560
    350561/***********************************************************************
    351  *           GetFileVersionInfo32W             [VERSION.4]
    352  */
    353 DWORD WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
     562 *           GetFileVersionInfoW             [VERSION.@]
     563 */
     564BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,
    354565                                    DWORD datasize, LPVOID data )
    355566{
    356     LPSTR fn = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
     567    DWORD len = WideCharToMultiByte( CP_ACP, 0, filename, -1, NULL, 0, NULL, NULL );
     568    LPSTR fn = HeapAlloc( GetProcessHeap(), 0, len );
    357569    DWORD retv = TRUE;
    358570
    359     TRACE("(%s,%ld,size=%ld,data=%p)\n",
    360                 debugstr_a(fn), handle, datasize, data );
    361 
    362     if ( !GetFileResource( fn, MAKEINTRESOURCEA(VS_FILE_INFO),
     571    WideCharToMultiByte( CP_ACP, 0, filename, -1, fn, len, NULL, NULL );
     572
     573    dprintf(("(%s,%ld,size=%ld,data=%p)\n",
     574                debugstr_w(filename), handle, datasize, data ));
     575
     576    if(VERSION_GetFileVersionInfo_PE(fn, &handle, datasize, data))
     577        goto END;
     578#ifndef __WIN32OS2__
     579    if(VERSION_GetFileVersionInfo_16(fn, &handle, datasize, data))
     580        goto END;
     581#endif
     582    if ( !GetFileResource16( fn, MAKEINTRESOURCEA(VS_FILE_INFO),
    363583                                 MAKEINTRESOURCEA(VS_VERSION_INFO),
    364584                                 handle, datasize, data ) )
     
    366586
    367587    else if (    datasize >= sizeof(VS_VERSION_INFO_STRUCT16)
    368               && datasize >= ((VS_VERSION_INFO_STRUCT16 *)data)->wLength 
     588              && datasize >= ((VS_VERSION_INFO_STRUCT16 *)data)->wLength
    369589              && VersionInfoIs16( data ) )
    370590    {
    371         ERR("Cannot access NE resource in %s\n", debugstr_a(fn) );
     591        dprintf(("Cannot access NE resource in %s\n", debugstr_a(fn) ));
    372592        retv =  FALSE;
    373593    }
    374 
     594END:
    375595    HeapFree( GetProcessHeap(), 0, fn );
    376596    return retv;
    377597}
    378 #endif //!__WIN32OS2__
     598
    379599
    380600/***********************************************************************
    381601 *           VersionInfo16_FindChild             [internal]
    382602 */
    383 VS_VERSION_INFO_STRUCT16 *VersionInfo16_FindChild( VS_VERSION_INFO_STRUCT16 *info,
     603static VS_VERSION_INFO_STRUCT16 *VersionInfo16_FindChild( VS_VERSION_INFO_STRUCT16 *info,
    384604                                            LPCSTR szKey, UINT cbKey )
    385605{
     
    388608    while ( (DWORD)child < (DWORD)info + info->wLength )
    389609    {
    390         if ( !lstrncmpiA( child->szKey, szKey, cbKey ) )
     610        if ( !strncasecmp( child->szKey, szKey, cbKey ) )
    391611            return child;
    392612
     
    401621 *           VersionInfo32_FindChild             [internal]
    402622 */
    403 VS_VERSION_INFO_STRUCT32 *VersionInfo32_FindChild( VS_VERSION_INFO_STRUCT32 *info,
     623static VS_VERSION_INFO_STRUCT32 *VersionInfo32_FindChild( VS_VERSION_INFO_STRUCT32 *info,
    404624                                            LPCWSTR szKey, UINT cbKey )
    405625{
     
    408628    while ( (DWORD)child < (DWORD)info + info->wLength )
    409629    {
    410 #ifdef __WIN32OS2__
    411         if ( !lstrncmpiW( child->szKey, szKey, cbKey ) )
    412 #else
    413         if ( !CRTDLL_wcsnicmp( child->szKey, szKey, cbKey ) )
    414 #endif
     630        if ( !strncmpiW( child->szKey, szKey, cbKey ) )
    415631            return child;
    416632
     
    422638
    423639/***********************************************************************
    424  *           VerQueryValue32W              [VERSION.13]
    425  */
    426 DWORD VerQueryValue32W( LPVOID pBlock, LPCWSTR lpSubBlock,
    427                         LPVOID *lplpBuffer, UINT *puLen, BOOL *bText)
    428 {
    429     VS_VERSION_INFO_STRUCT32 *info = (VS_VERSION_INFO_STRUCT32 *)pBlock;
    430     if ( VersionInfoIs16( info ) )
    431     {
    432         ERR("called on NE resource!\n" );
    433         return FALSE;
    434     }
    435 
    436 #if defined(__WIN32OS2__)
    437     dprintf(("VerQueryValueW %x %x %x %x", pBlock, lpSubBlock, lplpBuffer, puLen));
    438 #else
    439     TRACE("(%p,%s,%p,%p)\n",
    440                 pBlock, debugstr_w(lpSubBlock), lplpBuffer, puLen );
    441 #endif
     640 *           VerQueryValueA              [VERSION.@]
     641 */
     642DWORD WINAPI VerQueryValueA( LPVOID pBlock, LPCSTR lpSubBlock,
     643                               LPVOID *lplpBuffer, UINT *puLen )
     644{
     645    VS_VERSION_INFO_STRUCT16 *info = (VS_VERSION_INFO_STRUCT16 *)pBlock;
     646    if ( !VersionInfoIs16( info ) )
     647    {
     648        INT len;
     649        LPWSTR wide_str;
     650        DWORD give;
     651
     652        /* <lawson_whitney@juno.com> Feb 2001 */
     653        /* AOL 5.0 does this, expecting to get this: */
     654        len = MultiByteToWideChar(CP_ACP, 0, lpSubBlock, -1, NULL, 0);
     655        wide_str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
     656        MultiByteToWideChar(CP_ACP, 0, lpSubBlock, -1, wide_str, len);
     657
     658        give = VerQueryValueW(pBlock, wide_str, lplpBuffer, puLen);
     659        HeapFree(GetProcessHeap(), 0, wide_str);
     660        return give;
     661    }
     662
     663    dprintf(("(%p,%s,%p,%p)\n",
     664                pBlock, debugstr_a(lpSubBlock), lplpBuffer, puLen ));
    442665
    443666    while ( *lpSubBlock )
    444667    {
    445668        /* Find next path component */
    446         LPCWSTR lpNextSlash;
     669        LPCSTR lpNextSlash;
    447670        for ( lpNextSlash = lpSubBlock; *lpNextSlash; lpNextSlash++ )
    448671            if ( *lpNextSlash == '\\' )
     
    457680
    458681        /* We have a non-empty component: search info for key */
    459         info = VersionInfo32_FindChild( info, lpSubBlock, lpNextSlash-lpSubBlock );
     682        info = VersionInfo16_FindChild( info, lpSubBlock, lpNextSlash-lpSubBlock );
    460683        if ( !info ) return FALSE;
    461684
     
    465688
    466689    /* Return value */
    467     *lplpBuffer = VersionInfo32_Value( info );
     690    *lplpBuffer = VersionInfo16_Value( info );
    468691    *puLen = info->wValueLength;
    469     *bText = info->bText;
    470 
    471 #if defined(__WIN32OS2__)
    472     dprintf(("VerQueryValueW successful"));
    473 #endif
     692
    474693    return TRUE;
    475694}
    476695
    477 
    478 #if defined(__WIN32OS2__)
    479 DWORD VerQueryValueW( LPVOID pBlock, LPCWSTR lpSubBlock,
    480                       LPVOID *lplpBuffer, UINT *puLen)
    481 {
    482  BOOL bText;
    483 
    484     return VerQueryValue32W(pBlock, lpSubBlock, lplpBuffer, puLen, &bText);
    485 }
    486 #endif
    487 
    488 /***********************************************************************
    489  *           VerQueryValue32A              [VERSION.12]
    490  */
    491 DWORD WINAPI VerQueryValueA( LPVOID pBlock, LPCSTR lpSubBlock,
     696/***********************************************************************
     697 *           VerQueryValueW              [VERSION.@]
     698 */
     699DWORD WINAPI VerQueryValueW( LPVOID pBlock, LPCWSTR lpSubBlock,
    492700                               LPVOID *lplpBuffer, UINT *puLen )
    493701{
    494     VS_VERSION_INFO_STRUCT16 *info = (VS_VERSION_INFO_STRUCT16 *)pBlock;
    495     if ( !VersionInfoIs16( info ) )
    496     {
    497 #ifdef __WIN32OS2__
    498         // this is a quick hack, not much tested
    499         WCHAR *ustring = (WCHAR *)malloc(strlen((char *)lpSubBlock)*2+2);
    500         LPVOID ubuffer;
    501         char *abuffer;
    502         UINT len = *puLen * 2;
    503         BOOL rc, bText;
    504 
    505         dprintf(("VERSION: called on PE unicode resource!\n" ));
    506 
    507         AsciiToUnicode((char *)lpSubBlock, ustring);
    508         rc = VerQueryValue32W( pBlock, (LPWSTR)ustring, &ubuffer, &len, &bText);
    509         if(rc == 0) {
    510                 free(ustring);
    511                 return 0;
    512         }
    513         if(!bText) {
    514           *lplpBuffer = ubuffer;
    515         }
    516         else
    517         {
    518           *lplpBuffer = malloc(len+1); // FIXME: no free, memory leak!!
    519           UnicodeToAsciiN((WCHAR *)ubuffer, (char *)*lplpBuffer, len);
    520         }
    521         *puLen = len;
    522         free(ustring);
    523         return rc;
    524 #else
    525         ERR("called on PE resource!\n" );
     702    VS_VERSION_INFO_STRUCT32 *info = (VS_VERSION_INFO_STRUCT32 *)pBlock;
     703    if ( VersionInfoIs16( info ) )
     704    {
     705        dprintf(("called on NE resource!\n" ));
    526706        return FALSE;
    527 #endif //__WIN32OS2__
    528     }
    529 
    530     TRACE("(%p,%s,%p,%p)\n",
    531                 pBlock, debugstr_a(lpSubBlock), lplpBuffer, puLen );
     707    }
     708
     709    dprintf(("(%p,%s,%p,%p)\n",
     710                pBlock, debugstr_w(lpSubBlock), lplpBuffer, puLen ));
    532711
    533712    while ( *lpSubBlock )
    534713    {
    535714        /* Find next path component */
    536         LPCSTR lpNextSlash;
     715        LPCWSTR lpNextSlash;
    537716        for ( lpNextSlash = lpSubBlock; *lpNextSlash; lpNextSlash++ )
    538717            if ( *lpNextSlash == '\\' )
     
    547726
    548727        /* We have a non-empty component: search info for key */
    549         info = VersionInfo16_FindChild( info, lpSubBlock, lpNextSlash-lpSubBlock );
     728        info = VersionInfo32_FindChild( info, lpSubBlock, lpNextSlash-lpSubBlock );
    550729        if ( !info ) return FALSE;
    551730
     
    555734
    556735    /* Return value */
    557     *lplpBuffer = VersionInfo16_Value( info );
     736    *lplpBuffer = VersionInfo32_Value( info );
    558737    *puLen = info->wValueLength;
    559738
Note: See TracChangeset for help on using the changeset viewer.