| 520 | } |
| 521 | |
| 522 | BOOL GetFileVersionValue(const TCHAR *szFullFileName, VersionSubBlockType_t subBlockType, |
| 523 | WORD *pwLanguage, DWORD *pdwProductVersionLS, DWORD *pdwProductVersionMS, |
| 524 | const TCHAR *szVersionInfo, TCHAR *szVersionBuffer, UINT cchMax) |
| 525 | { |
| 526 | BOOL bSuccess = FALSE; |
| 527 | DWORD dwLen = GetFileVersionInfoSize(szFullFileName, NULL); |
| 528 | |
| 529 | if(dwLen > 0) |
| 530 | { |
| 531 | void *pBlock = malloc(dwLen); |
| 532 | |
| 533 | if(pBlock != NULL) |
| 534 | { |
| 535 | BOOL bRet = GetFileVersionInfo(szFullFileName, NULL, dwLen, pBlock); |
| 536 | |
| 537 | if(bRet) |
| 538 | { |
| 539 | TCHAR szSubBlock[64]; |
| 540 | LPVOID *pBuffer = NULL; |
| 541 | UINT uStructureSize = 0; |
| 542 | |
| 543 | LangAndCodePage *plcp = NULL; |
| 544 | VS_FIXEDFILEINFO *pvsffi = NULL; |
| 545 | |
| 546 | if(subBlockType == ROOT) |
| 547 | { |
| 548 | StringCchCopy(szSubBlock, SIZEOF_ARRAY(szSubBlock), _T("\\")); |
| 549 | pBuffer = reinterpret_cast<LPVOID *>(&pvsffi); |
| 550 | uStructureSize = sizeof(VS_FIXEDFILEINFO); |
| 551 | } |
| 552 | else if(subBlockType == TRANSLATION || |
| 553 | subBlockType == STRING_TABLE_VALUE) |
| 554 | { |
| 555 | StringCchCopy(szSubBlock, SIZEOF_ARRAY(szSubBlock), _T("\\VarFileInfo\\Translation")); |
| 556 | pBuffer = reinterpret_cast<LPVOID *>(&plcp); |
| 557 | uStructureSize = sizeof(LangAndCodePage); |
| 558 | } |
| 559 | |
| 560 | UINT uLen; |
| 561 | bRet = VerQueryValue(pBlock, szSubBlock, pBuffer, &uLen); |
| 562 | |
| 563 | if(bRet && (uLen >= uStructureSize)) |
| 564 | { |
| 565 | bSuccess = TRUE; |
| 566 | |
| 567 | if(subBlockType == ROOT) |
| 568 | { |
| 569 | *pdwProductVersionLS = pvsffi->dwProductVersionLS; |
| 570 | *pdwProductVersionMS = pvsffi->dwProductVersionMS; |
| 571 | } |
| 572 | else if(subBlockType == TRANSLATION) |
| 573 | { |
| 574 | *pwLanguage = plcp[0].wLanguage; |
| 575 | } |
| 576 | else if(subBlockType == STRING_TABLE_VALUE) |
| 577 | { |
| 578 | bSuccess = GetStringTableValue(pBlock, plcp, uLen / sizeof(LangAndCodePage), |
| 579 | szVersionInfo, szVersionBuffer, cchMax); |
no test coverage detected