Changeset 10296 for trunk/src/version/info.c
- Timestamp:
- Oct 24, 2003, 4:47:25 PM (22 years ago)
- File:
-
- 1 edited
-
trunk/src/version/info.c (modified) (29 diffs)
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 * 5 4 * Copyright 1996,1997 Marcus Meissner 6 5 * Copyright 1997 David Cuthbert 7 6 * 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> 10 27 #include <stdlib.h> 11 28 #include <string.h> 12 29 30 #include "windef.h" 31 #include "winbase.h" 13 32 #include "winreg.h" 14 33 #include "winver.h" 15 #include "wine/winestring.h" 34 #include "wine/winuser16.h" 35 #include "wine/unicode.h" 16 36 #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 39 WINE_DEFAULT_DEBUG_CHANNEL(ver); 24 40 25 41 … … 32 48 * 33 49 *****************************************************************************/ 50 #ifdef DEBUG 34 51 static void print_vffi_debug(VS_FIXEDFILEINFO *vffi) 35 52 { … … 50 67 51 68 TRACE("("); 52 DPRINTF(" OS=0x%x.0x%x ",69 TRACE(" OS=0x%x.0x%x ", 53 70 HIWORD(vffi->dwFileOS), 54 71 LOWORD(vffi->dwFileOS) 55 72 ); 56 73 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; 61 78 case VOS_UNKNOWN: 62 79 default: 63 DPRINTF("UNKNOWN(0x%lx),",vffi->dwFileOS&0xFFFF0000);break;80 TRACE("UNKNOWN(0x%lx),",vffi->dwFileOS&0xFFFF0000);break; 64 81 } 65 82 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; 72 89 } 73 DPRINTF(")\n");90 TRACE(")\n"); 74 91 75 92 switch (vffi->dwFileType) { … … 85 102 default: 86 103 case VFT2_UNKNOWN: 87 DPRINTF("UNKNOWN(0x%lx)",vffi->dwFileSubtype);104 TRACE("UNKNOWN(0x%lx)",vffi->dwFileSubtype); 88 105 break; 89 106 case VFT2_DRV_PRINTER: 90 DPRINTF("PRINTER");107 TRACE("PRINTER"); 91 108 break; 92 109 case VFT2_DRV_KEYBOARD: 93 DPRINTF("KEYBOARD");110 TRACE("KEYBOARD"); 94 111 break; 95 112 case VFT2_DRV_LANGUAGE: 96 DPRINTF("LANGUAGE");113 TRACE("LANGUAGE"); 97 114 break; 98 115 case VFT2_DRV_DISPLAY: 99 DPRINTF("DISPLAY");116 TRACE("DISPLAY"); 100 117 break; 101 118 case VFT2_DRV_MOUSE: 102 DPRINTF("MOUSE");119 TRACE("MOUSE"); 103 120 break; 104 121 case VFT2_DRV_NETWORK: 105 DPRINTF("NETWORK");122 TRACE("NETWORK"); 106 123 break; 107 124 case VFT2_DRV_SYSTEM: 108 DPRINTF("SYSTEM");125 TRACE("SYSTEM"); 109 126 break; 110 127 case VFT2_DRV_INSTALLABLE: 111 DPRINTF("INSTALLABLE");128 TRACE("INSTALLABLE"); 112 129 break; 113 130 case VFT2_DRV_SOUND: 114 DPRINTF("SOUND");131 TRACE("SOUND"); 115 132 break; 116 133 case VFT2_DRV_COMM: 117 DPRINTF("COMM");134 TRACE("COMM"); 118 135 break; 119 136 case VFT2_DRV_INPUTMETHOD: 120 DPRINTF("INPUTMETHOD");137 TRACE("INPUTMETHOD"); 121 138 break; 122 139 } … … 126 143 switch (vffi->dwFileSubtype) { 127 144 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; 133 150 } 134 151 break; … … 136 153 case VFT_STATIC_LIB:TRACE("filetype=STATIC_LIB");break; 137 154 } 138 DPRINTF("\n");155 TRACE("\n"); 139 156 TRACE(" filedata=0x%lx.0x%lx\n", 140 157 vffi->dwFileDateMS,vffi->dwFileDateLS); 141 158 } 142 159 #else 160 #define print_vffi_debug(a) 161 #endif 143 162 144 163 /*********************************************************************** … … 176 195 ( ((VS_VERSION_INFO_STRUCT16 *)ver)->szKey[0] >= ' ' ) 177 196 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) ) 179 199 180 200 #define VersionInfo16_Value( ver ) \ 181 DWORD_ALIGN( (ver) ->szKey + lstrlenA((ver)->szKey) + 1 )201 DWORD_ALIGN( (ver), (ver)->szKey + strlen((ver)->szKey) + 1 ) 182 202 #define VersionInfo32_Value( ver ) \ 183 DWORD_ALIGN( (ver) ->szKey + lstrlenW((ver)->szKey) + 1 )203 DWORD_ALIGN( (ver), (ver)->szKey + strlenW((ver)->szKey) + 1 ) 184 204 185 205 #define VersionInfo16_Children( ver ) \ … … 196 216 (VS_VERSION_INFO_STRUCT32 *)( (LPBYTE)ver + (((ver)->wLength + 3) & ~3) ) 197 217 198 #ifndef __WIN32OS2__199 218 /*********************************************************************** 200 219 * ConvertVersionInfo32To16 [internal] 201 220 */ 202 void ConvertVersionInfo32To16( VS_VERSION_INFO_STRUCT32 *info32, 221 void ConvertVersionInfo32To16( VS_VERSION_INFO_STRUCT32 *info32, 203 222 VS_VERSION_INFO_STRUCT16 *info16 ) 204 223 { … … 211 230 VS_VERSION_INFO_STRUCT16 *child16; 212 231 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 )); 216 235 217 236 /* 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) )); 222 241 223 242 /* Convert value */ … … 225 244 { 226 245 info16->wValueLength = 0; 227 TRACE("No value present\n");246 dprintf(("No value present\n" )); 228 247 } 229 248 else if ( bText ) 230 249 { 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 )), 236 256 debugstr_a(VersionInfo16_Value( info16 )) ); 237 257 } … … 241 261 memmove( VersionInfo16_Value( info16 ), lpValue, wValueLength ); 242 262 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 )); 245 265 } 246 266 247 267 /* Convert children */ 248 268 child16 = VersionInfo16_Children( info16 ); 249 while ( (DWORD)child32 < (DWORD)info32 + wLength )269 while ( (DWORD)child32 < (DWORD)info32 + wLength && child32->wLength != 0 ) 250 270 { 251 271 VS_VERSION_INFO_STRUCT32 *nextChild = VersionInfo32_Next( child32 ); … … 260 280 info16->wLength = (DWORD)child16 - (DWORD)info16; 261 281 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 */ 293 static 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 } 356 END: 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 */ 371 static 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 } 433 END: 434 FreeResource16(hMem); 435 FreeLibrary16(hModule); 436 437 return len; 438 } 439 #endif 440 441 /*********************************************************************** 442 * GetFileVersionInfoSizeA [VERSION.@] 269 443 */ 270 444 DWORD WINAPI GetFileVersionInfoSizeA( LPCSTR filename, LPDWORD handle ) … … 274 448 BYTE buf[144]; 275 449 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, 279 471 MAKEINTRESOURCEA(VS_FILE_INFO), 280 472 MAKEINTRESOURCEA(VS_VERSION_INFO), … … 282 474 if (!len) return 0; 283 475 284 ret = GetFileResource ( filename,476 ret = GetFileResource16( filename, 285 477 MAKEINTRESOURCEA(VS_FILE_INFO), 286 478 MAKEINTRESOURCEA(VS_VERSION_INFO), … … 289 481 290 482 if ( handle ) *handle = offset; 291 483 292 484 if ( VersionInfoIs16( buf ) ) 293 485 vffi = (VS_FIXEDFILEINFO *)VersionInfo16_Value( (VS_VERSION_INFO_STRUCT16 *)buf ); … … 297 489 if ( vffi->dwSignature != VS_FFI_SIGNATURE ) 298 490 { 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 )); 301 493 return 0; 302 494 } … … 305 497 len = ((VS_VERSION_INFO_STRUCT16 *)buf)->wLength; 306 498 499 #ifdef DEBUG 307 500 if ( TRACE_ON(ver) ) 308 501 print_vffi_debug( vffi ); 502 #endif 309 503 310 504 return len; … … 312 506 313 507 /*********************************************************************** 314 * GetFileVersionInfoSize 32W [VERSION.3]508 * GetFileVersionInfoSizeW [VERSION.@] 315 509 */ 316 510 DWORD WINAPI GetFileVersionInfoSizeW( LPCWSTR filename, LPDWORD handle ) 317 511 { 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 ); 320 516 HeapFree( GetProcessHeap(), 0, fn ); 321 517 return ret; … … 323 519 324 520 /*********************************************************************** 325 * GetFileVersionInfo 32A [VERSION.1]326 */ 327 DWORDWINAPI GetFileVersionInfoA( LPCSTR filename, DWORD handle,521 * GetFileVersionInfoA [VERSION.@] 522 */ 523 BOOL WINAPI GetFileVersionInfoA( LPCSTR filename, DWORD handle, 328 524 DWORD datasize, LPVOID data ) 329 525 { 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), 334 545 MAKEINTRESOURCEA(VS_VERSION_INFO), 335 546 handle, datasize, data ) ) 336 547 return FALSE; 337 548 DO_CONVERT: 338 549 if ( datasize >= sizeof(VS_VERSION_INFO_STRUCT16) 339 && datasize >= ((VS_VERSION_INFO_STRUCT16 *)data)->wLength 550 && datasize >= ((VS_VERSION_INFO_STRUCT16 *)data)->wLength 340 551 && !VersionInfoIs16( data ) ) 341 552 { 342 553 /* convert resource from PE format to NE format */ 343 ConvertVersionInfo32To16( (VS_VERSION_INFO_STRUCT32 *)data, 554 ConvertVersionInfo32To16( (VS_VERSION_INFO_STRUCT32 *)data, 344 555 (VS_VERSION_INFO_STRUCT16 *)data ); 345 556 } … … 349 560 350 561 /*********************************************************************** 351 * GetFileVersionInfo 32W [VERSION.4]352 */ 353 DWORDWINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle,562 * GetFileVersionInfoW [VERSION.@] 563 */ 564 BOOL WINAPI GetFileVersionInfoW( LPCWSTR filename, DWORD handle, 354 565 DWORD datasize, LPVOID data ) 355 566 { 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 ); 357 569 DWORD retv = TRUE; 358 570 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), 363 583 MAKEINTRESOURCEA(VS_VERSION_INFO), 364 584 handle, datasize, data ) ) … … 366 586 367 587 else if ( datasize >= sizeof(VS_VERSION_INFO_STRUCT16) 368 && datasize >= ((VS_VERSION_INFO_STRUCT16 *)data)->wLength 588 && datasize >= ((VS_VERSION_INFO_STRUCT16 *)data)->wLength 369 589 && VersionInfoIs16( data ) ) 370 590 { 371 ERR("Cannot access NE resource in %s\n", debugstr_a(fn));591 dprintf(("Cannot access NE resource in %s\n", debugstr_a(fn) )); 372 592 retv = FALSE; 373 593 } 374 594 END: 375 595 HeapFree( GetProcessHeap(), 0, fn ); 376 596 return retv; 377 597 } 378 #endif //!__WIN32OS2__ 598 379 599 380 600 /*********************************************************************** 381 601 * VersionInfo16_FindChild [internal] 382 602 */ 383 VS_VERSION_INFO_STRUCT16 *VersionInfo16_FindChild( VS_VERSION_INFO_STRUCT16 *info, 603 static VS_VERSION_INFO_STRUCT16 *VersionInfo16_FindChild( VS_VERSION_INFO_STRUCT16 *info, 384 604 LPCSTR szKey, UINT cbKey ) 385 605 { … … 388 608 while ( (DWORD)child < (DWORD)info + info->wLength ) 389 609 { 390 if ( ! lstrncmpiA( child->szKey, szKey, cbKey ) )610 if ( !strncasecmp( child->szKey, szKey, cbKey ) ) 391 611 return child; 392 612 … … 401 621 * VersionInfo32_FindChild [internal] 402 622 */ 403 VS_VERSION_INFO_STRUCT32 *VersionInfo32_FindChild( VS_VERSION_INFO_STRUCT32 *info, 623 static VS_VERSION_INFO_STRUCT32 *VersionInfo32_FindChild( VS_VERSION_INFO_STRUCT32 *info, 404 624 LPCWSTR szKey, UINT cbKey ) 405 625 { … … 408 628 while ( (DWORD)child < (DWORD)info + info->wLength ) 409 629 { 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 ) ) 415 631 return child; 416 632 … … 422 638 423 639 /*********************************************************************** 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 */ 642 DWORD 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 )); 442 665 443 666 while ( *lpSubBlock ) 444 667 { 445 668 /* Find next path component */ 446 LPC WSTR lpNextSlash;669 LPCSTR lpNextSlash; 447 670 for ( lpNextSlash = lpSubBlock; *lpNextSlash; lpNextSlash++ ) 448 671 if ( *lpNextSlash == '\\' ) … … 457 680 458 681 /* We have a non-empty component: search info for key */ 459 info = VersionInfo 32_FindChild( info, lpSubBlock, lpNextSlash-lpSubBlock );682 info = VersionInfo16_FindChild( info, lpSubBlock, lpNextSlash-lpSubBlock ); 460 683 if ( !info ) return FALSE; 461 684 … … 465 688 466 689 /* Return value */ 467 *lplpBuffer = VersionInfo 32_Value( info );690 *lplpBuffer = VersionInfo16_Value( info ); 468 691 *puLen = info->wValueLength; 469 *bText = info->bText; 470 471 #if defined(__WIN32OS2__) 472 dprintf(("VerQueryValueW successful")); 473 #endif 692 474 693 return TRUE; 475 694 } 476 695 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 */ 699 DWORD WINAPI VerQueryValueW( LPVOID pBlock, LPCWSTR lpSubBlock, 492 700 LPVOID *lplpBuffer, UINT *puLen ) 493 701 { 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" )); 526 706 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 )); 532 711 533 712 while ( *lpSubBlock ) 534 713 { 535 714 /* Find next path component */ 536 LPC STR lpNextSlash;715 LPCWSTR lpNextSlash; 537 716 for ( lpNextSlash = lpSubBlock; *lpNextSlash; lpNextSlash++ ) 538 717 if ( *lpNextSlash == '\\' ) … … 547 726 548 727 /* We have a non-empty component: search info for key */ 549 info = VersionInfo 16_FindChild( info, lpSubBlock, lpNextSlash-lpSubBlock );728 info = VersionInfo32_FindChild( info, lpSubBlock, lpNextSlash-lpSubBlock ); 550 729 if ( !info ) return FALSE; 551 730 … … 555 734 556 735 /* Return value */ 557 *lplpBuffer = VersionInfo 16_Value( info );736 *lplpBuffer = VersionInfo32_Value( info ); 558 737 *puLen = info->wValueLength; 559 738
Note:
See TracChangeset
for help on using the changeset viewer.
