From 49950d8b6685395c882bf45023c92879b74ab0b5 Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Mon, 16 Sep 2013 08:11:37 +0200 Subject: [PATCH] change verison detect and other small fixes --- lib/builder-targets.sh | 6 +- lib/builder-utils.sh | 37 ++- libexec/ShowVer.exe | Bin 86077 -> 0 bytes libexec/ShowVer/ShowVer.cpp | 531 ------------------------------------ libexec/ShowVer/ShowVer.dsp | 112 -------- libexec/ShowVer/ShowVer.rc | 110 -------- libexec/VersionInfo.vbs | 4 + 7 files changed, 33 insertions(+), 767 deletions(-) delete mode 100755 libexec/ShowVer.exe delete mode 100644 libexec/ShowVer/ShowVer.cpp delete mode 100644 libexec/ShowVer/ShowVer.dsp delete mode 100644 libexec/ShowVer/ShowVer.rc create mode 100644 libexec/VersionInfo.vbs diff --git a/lib/builder-targets.sh b/lib/builder-targets.sh index baff09b..32ce873 100644 --- a/lib/builder-targets.sh +++ b/lib/builder-targets.sh @@ -20,11 +20,11 @@ builder_config() { CMD_unix2dos="`which unix2dos.exe`" ; builder_check_error "Command 'unix2dos' not installed" CMD_sha1sum="`which sha1sum.exe`" ; builder_check_error "Command 'sha1sum' not installed" CMD_inifile="`which inifile.exe`" ; builder_check_error "Command 'inifile' not installed (http://www.horstmuc.de/wbat32d.htm#inifile)" - CMD_showver="`which ShowVer.exe`" ; builder_check_error "Command 'ShowVer' not installed (http://www.codeproject.com/Articles/2457/ShowVer-exe-command-line-VERSIONINFO-display-progr)" CMD_tidy="`which tidy.exe`" ; builder_check_error "Command 'tidy' not installed" CMD_msiexec="`which msiexec.exe`" ; builder_check_error "Command 'msiexec' not installed" CMD_innounp="`which innounp.exe`" ; builder_check_error "Command 'innounp' not installed" CMD_xmlstarlet="`which xmlstarlet.exe`" ; builder_check_error "Command 'xmlstarlat' not installed" + CMD_msix="`which MsiX.exe`" ; builder_check_error "Command 'msix' not installed" # Check temp dir test -d ${TMP_DIR} @@ -215,10 +215,10 @@ builder_create() { done # convert to dos file linefeed - find $INST_DIR -type f | xargs -n1 -iREP sh -c 'file -i $0 | grep -v "utf-16" | grep "text/plain" && '$CMD_unix2dos' $0 ' REP >/dev/null +# find $INST_DIR -type f | xargs -n1 -iREP sh -c 'file -i $0 | grep -v "utf-16" | grep "text/plain" && '$CMD_unix2dos' $0 ' REP >/dev/null # set exec bit on executeables - find $INST_DIR -type f -iname "*.exe" -o -iname "*.bat" -o -iname "*.cmd" -o -iname "*.msi" -o -iname "*.msp" | xargs chmod +x -v +# find $INST_DIR -type f -iname "*.exe" -o -iname "*.bat" -o -iname "*.cmd" -o -iname "*.msi" -o -iname "*.msp" | xargs chmod +x -v # Create changelog based on git - if available if [ -d "${PRODUCT_DIR}/.git" ] ; then diff --git a/lib/builder-utils.sh b/lib/builder-utils.sh index ae08bf5..97dc96c 100644 --- a/lib/builder-utils.sh +++ b/lib/builder-utils.sh @@ -200,9 +200,15 @@ write_ini_file() { # Var: # ################### -vercomp() { - [ ! $(echo -e "$1\n$2" | sort --version-sort | head -1) = "$1" ] -} +# return 0 if program version is equal or greater than check version +check_version() +{ + local version=$1 check=$2 + local winner=$(echo -e "$version\n$check" | sed '/^$/d' | sort -Vr | head -1) + [[ "$winner" = "$version" ]] && return 0 + return 1 + } + ################### # Get Verison of File @@ -219,9 +225,16 @@ vercomp() { get_file_ver() { local getver_file=$2 local __resultvar=$1 - local myresult=`$CMD_showver $(cygpath -pw "$getver_file") | grep FileVersion: | rev | cut -d: -f1 | rev | tr -d ' '` + # local myresult=`$CMD_showver $(cygpath -pw "$getver_file") | grep FileVersion: | rev | cut -d: -f1 | rev | tr -d ' '` + local myresult=`cscript //nologo $(cygpath -pw "$BASEDIR/libexec/VersionInfo.vbs") $(cygpath -pw "$getver_file") | tr -d '\r' | tr -d '\n'` + local mydate=`date -r $getver_file +%Y.%m.%d.%M` + if [ "x$myresult" = "x" ] ; then + echo "$getver_file -> $mydate" + eval $__resultvar="'$mydate'" + else echo "$getver_file -> $myresult" eval $__resultvar="'$myresult'" + fi } ################### @@ -237,26 +250,26 @@ get_file_ver() { copyver() { local source_file=$1 local target_file=$2 - local source_ver="" - local target_ver="" + local source_ver="0.0.0.0" + local target_ver="0.0.0.0" echo "Source File: $source_file Target Version: $target_file" if [ -f "$source_file" ] && [ -f "$target_file" ] ; then get_file_ver source_ver $source_file get_file_ver target_ver $target_file - if [ vercomp $source_ver $target_ver ] ; then + if check_version $source_ver $target_ver ; then echo "Source Verssion: $source_ver > Target Version: $target_ver" echo "Copying File" - cp $source_file $target_file + cp -a $source_file $target_file else echo "Source Verssion: $source_ver =< Target Version: $target_ver" echo "Not Copying File" fi elif [ -f "$source_file" ] && [ ! -f "$target_file" ] ; then - source_ver=$(get_file_version $source_file) + get_file_ver source_ver $source_file echo "Source Verssion: $source_ver" echo "Copying File" - cp $source_file $target_file + cp -a $source_file $target_file else echo "Nothing to copy" fi @@ -317,6 +330,8 @@ function extract_file() { cp $src $dst_dir $CMD_msiexec /p "$src_file" /a "$dst_file" SHORTFILENAMES=TRUE /qb popd + elif [ "$format" = "msp-x" ]; then + $CMD_msix $(cygpath -pw "$src") /out $(cygpath -pw "$dst") elif [ "$format" = "7zip" ]; then $CMD_7z x -y $option -o$dst $src elif [ "$format" = "unzip" ]; then @@ -338,7 +353,7 @@ function extract_file() { popd done elif [ "$format" = "inno" ]; then - $CMD_innounp $option -d $dst $src + $CMD_innounp -x -d"$(cygpath -pw "$dst")" "$(cygpath -pw "$src")" else fatal_error "Unknown compression format: $format" fi diff --git a/libexec/ShowVer.exe b/libexec/ShowVer.exe deleted file mode 100755 index 6984bd3fcf01a2b8f262762a334e085adb1157a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86077 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 L - * Permission is given by the author to freely redistribute and include - * this code in any program as long as this credit is given where due. - * - * THIS CODE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY - * OF ANY KIND, EITHER EXPRESSED OR IMPLIED. IN PARTICULAR, NO WARRANTY IS MADE - * THAT THE CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE - * OR NON-INFRINGING. IN NO EVENT WILL THE AUTHOR BE LIABLE FOR ANY COSTS OR DAMAGES - * ARISING FROM ANY USE OF THIS CODE. NO USE OF THIS CODE IS AUTHORIZED EXCEPT UNDER - * THIS DISCLAIMER. - * - * Use at your own risk! - */ -// ---------------------------------------------------------------------------- - -#include -#include - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -#include - -typedef unsigned char byte; - -#ifndef _DEBUG -# define ASSERT(s) -#else -# include // for _ASSERTE() -# define ASSERT _ASSERTE -#endif - -#define HDUMP 0 -// ---------------------------------------------------------------------------- -#if HDUMP - -#define CHARPRINT(a) \ - { unsigned char tchar; \ - switch (a) { \ - case 0x0D: /* CR */ \ - tchar = 0x11; \ - break; \ - case 0x0A: /* LF */ \ - tchar = 0x19; \ - break; \ - case 0x07: /* BEL */ \ - tchar = 0x0F; \ - break; \ - case '\t': /* TAB */ \ - tchar = 0x1D; \ - break; \ - case '\0': /* NUL */ \ - tchar = 0xF8; \ - break; \ - case 0x08: /* BACKTAB? */ \ - tchar = 0xAE; \ - break; \ - case 0x1A: /* BACKTAB? */ \ - tchar = 0xAE; \ - break; \ - case 0x1B: /* BACKSPACE */ \ - tchar = 0xAE; \ - break; \ - case ' ': /* SPACE */ \ - tchar = 0xC4; \ - break; \ - default: \ - tchar = buf[i]; \ - break; \ - } \ - printf ("%c", tchar); \ - } -// ---------------------------------------------------------------------------- - -int hdump(byte* pBuf, size_t size, size_t start, size_t len) -{ - int ch; - int i, firsti, lasti, tlasti; - unsigned char buf[16]; - unsigned long offs, end; - firsti = (int)(start & 0xFL); - offs = start & ~0xFL; - - byte* pEnd = pBuf+size; - - if (pBuf == NULL) { - return 0; - } - - end = (len!=0) ? start+len : ~len; - lasti = 16; - tlasti = 8; - - for ( ; offs < end; offs += 16) { - unsigned long rmdr = end - offs; - if (rmdr < 16) { - lasti = rmdr; - if (rmdr < 8) { - tlasti = rmdr; - } - } - for (i = firsti; i < lasti; i++) { - ch = (pBuf < pEnd) ? *(pBuf++) : EOF; - buf[i] = (unsigned char) ch; - if (ch == EOF) { - lasti = i; - if (i < 8) tlasti = i; - break; - } - } - /* Print address */ - printf("% 8lx: ", offs); - - /* Print 2 groups of 8 chars in hex format */ - for (i = 0; i < firsti && i < 8; i++) { - printf(" "); // only could happen first time around - } - for ( ; i < tlasti; i++) { - printf("%2.2x ", buf[i]); - } - for ( ; i < 8; i++) { - printf(" "); - } - printf(" "); - for ( ; i < firsti; i++) { - printf(" "); // only could happen first time around - } - for ( ; i < lasti; i++) { - printf("%2.2x ", (unsigned) buf[i]); - } - for ( ; i < 16; i++) { - printf(" "); - } - printf("| "); - - /* Print 2 groups of 8 chars in char format */ - for (i = 0; i < firsti && i < 8; i++) { - printf(" "); - } - for ( ; i < tlasti; i++) { - CHARPRINT(buf[i]) - } - for ( ; i < 8; i++) { - printf(" "); - } - printf(" "); - - for ( ; i < firsti; i++) { - printf(" "); - } - for ( ; i < lasti; i++) { - CHARPRINT(buf[i]) - } - for ( ; i < 16; i++) { - printf(" "); - } - - printf("\n"); - - if (ch == EOF) break; - - firsti = 0; - } - return 1; -} -#endif // HDUMP -// ---------------------------------------------------------------------------- -int usage() -{ - printf("ShowVer \n"); - return 0; -} -// ---------------------------------------------------------------------------- - -int error(wchar_t* sfnName) -{ - DWORD dwErrCode = GetLastError(); - wchar_t* sMsg; - FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - dwErrCode, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (wchar_t*) &sMsg, - 0, - NULL); - // Process any inserts in sMsg. - // ... - printf("Unable to access file \"%S\" : %S", sfnName, sMsg); - LocalFree(sMsg); - return 0; -} -// ---------------------------------------------------------------------------- - -/* ----- VS_VERSION.dwFileFlags ----- */ -#define S_VS_FFI_SIGNATURE "VS_FFI_SIGNATURE" -#define S_VS_FFI_STRUCVERSION "VS_FFI_STRUCVERSION" -#define S_VS_FFI_FILEFLAGSMASK "VS_FFI_FILEFLAGSMASK" - -/* ----- VS_VERSION.dwFileFlags ----- */ -#define S_VS_FF_DEBUG "VS_FF_DEBUG" -#define S_VS_FF_PRERELEASE "VS_FF_PRERELEASE" -#define S_VS_FF_PATCHED "VS_FF_PATCHED" -#define S_VS_FF_PRIVATEBUILD "VS_FF_PRIVATEBUILD" -#define S_VS_FF_INFOINFERRED "VS_FF_INFOINFERRED" -#define S_VS_FF_SPECIALBUILD "VS_FF_SPECIALBUILD" - -// ---------------------------------------------------------------------------- -char* showFileFlags(DWORD dwFileFlags) -{ -#define MAXFLAGSSTR 200 - static char s[MAXFLAGSSTR]; - int pos = 0; - s[pos] = '\0'; -#define VS_FF_KNOWNFLAGS (VS_FF_DEBUG \ - | VS_FF_PRERELEASE \ - | VS_FF_PATCHED \ - | VS_FF_PRIVATEBUILD \ - | VS_FF_INFOINFERRED \ - | VS_FF_SPECIALBUILD \ - ) - if (dwFileFlags & ~VS_FF_KNOWNFLAGS) pos += sprintf(&s[pos], "0x%x", dwFileFlags & ~VS_FF_KNOWNFLAGS); - - if (dwFileFlags & VS_FF_DEBUG) { if (pos) { memcpy(&s[pos], " | ", 3); pos += 3; } ; memcpy(&s[pos], S_VS_FF_DEBUG, sizeof(S_VS_FF_DEBUG)); pos += sizeof(S_VS_FF_DEBUG) - 1; } - if (dwFileFlags & VS_FF_PRERELEASE) { if (pos) { memcpy(&s[pos], " | ", 3); pos += 3; } ; memcpy(&s[pos], S_VS_FF_PRERELEASE, sizeof(S_VS_FF_PRERELEASE)); pos += sizeof(S_VS_FF_PRERELEASE) - 1; } - if (dwFileFlags & VS_FF_PATCHED) { if (pos) { memcpy(&s[pos], " | ", 3); pos += 3; } ; memcpy(&s[pos], S_VS_FF_PATCHED, sizeof(S_VS_FF_PATCHED)); pos += sizeof(S_VS_FF_PATCHED) - 1; } - if (dwFileFlags & VS_FF_PRIVATEBUILD) { if (pos) { memcpy(&s[pos], " | ", 3); pos += 3; } ; memcpy(&s[pos], S_VS_FF_PRIVATEBUILD, sizeof(S_VS_FF_PRIVATEBUILD)); pos += sizeof(S_VS_FF_PRIVATEBUILD) - 1; } - if (dwFileFlags & VS_FF_INFOINFERRED) { if (pos) { memcpy(&s[pos], " | ", 3); pos += 3; } ; memcpy(&s[pos], S_VS_FF_INFOINFERRED, sizeof(S_VS_FF_INFOINFERRED)); pos += sizeof(S_VS_FF_INFOINFERRED) - 1; } - if (dwFileFlags & VS_FF_SPECIALBUILD) { if (pos) { memcpy(&s[pos], " | ", 3); pos += 3; } ; memcpy(&s[pos], S_VS_FF_SPECIALBUILD, sizeof(S_VS_FF_SPECIALBUILD)); pos += sizeof(S_VS_FF_SPECIALBUILD) - 1; } - - if (!pos) memcpy(s, "0", 2); - return s; -} -/* ----- VS_VERSION.dwFileOS ----- */ -#define S_VOS_UNKNOWN "VOS_UNKNOWN" -#define S_VOS_DOS "VOS_DOS" -#define S_VOS_OS216 "VOS_OS216" -#define S_VOS_OS232 "VOS_OS232" -#define S_VOS_NT "VOS_NT" - -#define S_VOS__BASE "VOS__BASE" -#define S_VOS__WINDOWS16 "VOS__WINDOWS16" -#define S_VOS__PM16 "VOS__PM16" -#define S_VOS__PM32 "VOS__PM32" -#define S_VOS__WINDOWS32 "VOS__WINDOWS32" - -#define S_VOS_DOS_WINDOWS16 "VOS_DOS_WINDOWS16" -#define S_VOS_DOS_WINDOWS32 "VOS_DOS_WINDOWS32" -#define S_VOS_OS216_PM16 "VOS_OS216_PM16" -#define S_VOS_OS232_PM32 "VOS_OS232_PM32" -#define S_VOS_NT_WINDOWS32 "VOS_NT_WINDOWS32" - -char* showFileOS(DWORD dwFileOS) -{ - switch(dwFileOS) { - case VOS_UNKNOWN: return S_VOS_UNKNOWN; - case VOS_DOS: return S_VOS_DOS; - case VOS_OS216: return S_VOS_OS216; - case VOS_OS232: return S_VOS_OS232; - case VOS_NT: return S_VOS_NT; - -// case VOS__BASE: return S_VOS__BASE; - case VOS__WINDOWS16:return S_VOS__WINDOWS16; - case VOS__PM16: return S_VOS__PM16; - case VOS__PM32: return S_VOS__PM32; - case VOS__WINDOWS32:return S_VOS__WINDOWS32; - - case VOS_DOS_WINDOWS16: return S_VOS_DOS_WINDOWS16; - case VOS_DOS_WINDOWS32: return S_VOS_DOS_WINDOWS32; - case VOS_OS216_PM16: return S_VOS_OS216_PM16; - case VOS_OS232_PM32: return S_VOS_OS232_PM32; - case VOS_NT_WINDOWS32: return S_VOS_NT_WINDOWS32; - - default: return "Unknown FileOS"; - } -} -/* ----- VS_VERSION.dwFileType ----- */ -#define S_VFT_UNKNOWN "VFT_UNKNOWN" -#define S_VFT_APP "VFT_APP" -#define S_VFT_DLL "VFT_DLL" -#define S_VFT_DRV "VFT_DRV" -#define S_VFT_FONT "VFT_FONT" -#define S_VFT_VXD "VFT_VXD" -#define S_VFT_STATIC_LIB "VFT_STATIC_LIB" - -char* showFileType(DWORD dwFileType) -{ - switch(dwFileType) { - case VFT_UNKNOWN: return S_VFT_UNKNOWN; - case VFT_APP: return S_VFT_APP; - case VFT_DLL: return S_VFT_DLL; - case VFT_DRV: return S_VFT_DRV; - case VFT_FONT: return S_VFT_FONT; - case VFT_VXD: return S_VFT_VXD; - case VFT_STATIC_LIB:return S_VFT_STATIC_LIB; - default: return "Unknown FileType"; - } -} -/* ----- VS_VERSION.dwFileSubtype for VFT_WINDOWS_DRV ----- */ -#define S_VFT2_UNKNOWN "VFT2_UNKNOWN" -#define S_VFT2_DRV_PRINTER "VFT2_DRV_PRINTER" -#define S_VFT2_DRV_KEYBOARD "VFT2_DRV_KEYBOARD" -#define S_VFT2_DRV_LANGUAGE "VFT2_DRV_LANGUAGE" -#define S_VFT2_DRV_DISPLAY "VFT2_DRV_DISPLAY" -#define S_VFT2_DRV_MOUSE "VFT2_DRV_MOUSE" -#define S_VFT2_DRV_NETWORK "VFT2_DRV_NETWORK" -#define S_VFT2_DRV_SYSTEM "VFT2_DRV_SYSTEM" -#define S_VFT2_DRV_INSTALLABLE "VFT2_DRV_INSTALLABLE" -#define S_VFT2_DRV_SOUND "VFT2_DRV_SOUND" -#define S_VFT2_DRV_COMM "VFT2_DRV_COMM" -#define S_VFT2_DRV_INPUTMETHOD "VFT2_DRV_INPUTMETHOD" - -/* ----- VS_VERSION.dwFileSubtype for VFT_WINDOWS_FONT ----- */ -#define S_VFT2_FONT_RASTER "VFT2_FONT_RASTER" -#define S_VFT2_FONT_VECTOR "VFT2_FONT_VECTOR" -#define S_VFT2_FONT_TRUETYPE "VFT2_FONT_TRUETYPE" - -char* showFileSubtype(DWORD dwFileType, DWORD dwFileSubtype) -{ - static char s[50]; - switch(dwFileType) { - case VFT_DRV: - switch(dwFileSubtype) { - case VFT2_UNKNOWN: return "FileSubtype: " S_VFT2_UNKNOWN; - case VFT2_DRV_PRINTER: return "FileSubtype: " S_VFT2_DRV_PRINTER; - case VFT2_DRV_KEYBOARD: return "FileSubtype: " S_VFT2_DRV_KEYBOARD; - case VFT2_DRV_LANGUAGE: return "FileSubtype: " S_VFT2_DRV_LANGUAGE; - case VFT2_DRV_DISPLAY: return "FileSubtype: " S_VFT2_DRV_DISPLAY; - case VFT2_DRV_MOUSE: return "FileSubtype: " S_VFT2_DRV_MOUSE; - case VFT2_DRV_NETWORK: return "FileSubtype: " S_VFT2_DRV_NETWORK; - case VFT2_DRV_SYSTEM: return "FileSubtype: " S_VFT2_DRV_SYSTEM; - case VFT2_DRV_INSTALLABLE:return "FileSubtype: " S_VFT2_DRV_INSTALLABLE; - case VFT2_DRV_SOUND: return "FileSubtype: " S_VFT2_DRV_SOUND; - case VFT2_DRV_COMM: return "FileSubtype: " S_VFT2_DRV_COMM; - case VFT2_DRV_INPUTMETHOD:return "FileSubtype: " S_VFT2_DRV_INPUTMETHOD; - default: s[0] = '\0'; sprintf(s, "Unknown FileSubtype: %x", dwFileSubtype); return s; - } - break; - - case VFT_FONT: - switch(dwFileSubtype) { - case VFT2_FONT_RASTER: return "FileSubtype: " S_VFT2_FONT_RASTER; - case VFT2_FONT_VECTOR: return "FileSubtype: " S_VFT2_FONT_VECTOR; - case VFT2_FONT_TRUETYPE:return "FileSubtype: " S_VFT2_FONT_TRUETYPE; - default: s[0] = '\0'; sprintf(s, "Unknown FileSubtype: %x", dwFileSubtype); return s; - } - break; - - default: s[0] = '\0'; if (dwFileSubtype) sprintf(s, ", FileSubtype: %x", dwFileSubtype); return s; - } -} -// ---------------------------------------------------------------------------- - -void showFIXEDFILEINFO(VS_FIXEDFILEINFO* pValue) -{ - ASSERT(VS_FFI_SIGNATURE == pValue->dwSignature); - ASSERT(VS_FFI_STRUCVERSION == pValue->dwStrucVersion); - - // dump the VS_FIXEDFILEINFO numbers - printf(" Signature: %08x\n" - , pValue->dwSignature -// , (VS_FFI_SIGNATURE == pValue->dwSignature) ? "" : " (expected " S_VS_FFI_SIGNATURE - ); - printf(" StrucVersion: %d.%d\n" - , pValue->dwStrucVersion >> 16, pValue->dwStrucVersion & 0xFFFF); - printf(" FileVersion: %d.%d.%d.%d\n" - , pValue->dwFileVersionMS >> 16, pValue->dwFileVersionMS & 0xFFFF - , pValue->dwFileVersionLS >> 16, pValue->dwFileVersionLS & 0xFFFF); - printf(" ProductVersion: %d.%d.%d.%d\n" - , pValue->dwProductVersionMS >> 16, pValue->dwProductVersionMS & 0xFFFF - , pValue->dwProductVersionLS >> 16, pValue->dwProductVersionLS & 0xFFFF); - printf(" FileFlagsMask: %s%x\n" - , pValue->dwFileFlagsMask ? "0x" : "" - , pValue->dwFileFlagsMask); - if (pValue->dwFileFlags) - printf(" FileFlags: 0x%x (%s)\n" - , pValue->dwFileFlags - , showFileFlags(pValue->dwFileFlags)); - else - printf(" FileFlags: 0\n"); - printf(" FileOS: %s\n" - , showFileOS(pValue->dwFileOS)); - printf(" FileType: %s%s\n" //FileSubtype - , showFileType(pValue->dwFileType) - , showFileSubtype(pValue->dwFileType, pValue->dwFileSubtype)); - printf(" FileDate: %x.%x\n" - , pValue->dwFileDateMS, pValue->dwFileDateLS); -} -// ---------------------------------------------------------------------------- - -struct VS_VERSIONINFO { - WORD wLength; - WORD wValueLength; - WORD wType; - WCHAR szKey[1]; - WORD Padding1[1]; - VS_FIXEDFILEINFO Value; - WORD Padding2[1]; - WORD Children[1]; -}; - -struct String { - WORD wLength; - WORD wValueLength; - WORD wType; - WCHAR szKey[1]; - WORD Padding[1]; - WORD Value[1]; -}; - -struct StringTable { - WORD wLength; - WORD wValueLength; - WORD wType; - WCHAR szKey[1]; - WORD Padding[1]; - String Children[1]; -}; - -struct StringFileInfo { - WORD wLength; - WORD wValueLength; - WORD wType; - WCHAR szKey[1]; - WORD Padding[1]; - StringTable Children[1]; -}; - -struct Var { - WORD wLength; - WORD wValueLength; - WORD wType; - WCHAR szKey[1]; - WORD Padding[1]; - DWORD Value[1]; -}; - -struct VarFileInfo { - WORD wLength; - WORD wValueLength; - WORD wType; - WCHAR szKey[1]; - WORD Padding[1]; - Var Children[1]; -}; - -// ---------------------------------------------------------------------------- - -int showVer(void* pVer, DWORD size) -{ - // Interpret the VS_VERSIONINFO header pseudo-struct - VS_VERSIONINFO* pVS = (VS_VERSIONINFO*)pVer; -#define roundoffs(a,b,r) (((byte*)(b) - (byte*)(a) + ((r)-1)) & ~((r)-1)) -#define roundpos(b, a, r) (((byte*)(a))+roundoffs(a,b,r)) -// byte* nEndRaw = roundpos((((byte*)pVer) + size), pVer, 4); -// byte* nEndNamed = roundpos((((byte*) pVS) + pVS->wLength), pVS, 4); -// ASSERT(nEndRaw == nEndNamed); // size reported from GetFileVersionInfoSize is much padded for some reason... - - ASSERT(!wcscmp(pVS->szKey, L"VS_VERSION_INFO")); - printf(" (type:%d)\n", pVS->wType); - byte* pVt = (byte*) &pVS->szKey[wcslen(pVS->szKey)+1]; - VS_FIXEDFILEINFO* pValue = (VS_FIXEDFILEINFO*) roundpos(pVt, pVS, 4); - if (pVS->wValueLength) { - showFIXEDFILEINFO(pValue); // Show the 'Value' element - } - // Iterate over the 'Children' elements of VS_VERSIONINFO (either StringFileInfo or VarFileInfo) - StringFileInfo* pSFI = (StringFileInfo*) roundpos(((byte*)pValue) + pVS->wValueLength, pValue, 4); - for ( ; ((byte*) pSFI) < (((byte*) pVS) + pVS->wLength); pSFI = (StringFileInfo*)roundpos((((byte*) pSFI) + pSFI->wLength), pSFI, 4)) { // StringFileInfo / VarFileInfo - if (!wcscmp(pSFI->szKey, L"StringFileInfo")) { - // The current child is a StringFileInfo element - ASSERT(1 == pSFI->wType); - ASSERT(!pSFI->wValueLength); - // Iterate through the StringTable elements of StringFileInfo - StringTable* pST = (StringTable*) roundpos(&pSFI->szKey[wcslen(pSFI->szKey)+1], pSFI, 4); - for ( ; ((byte*) pST) < (((byte*) pSFI) + pSFI->wLength); pST = (StringTable*)roundpos((((byte*) pST) + pST->wLength), pST, 4)) { - printf(" LangID: %S\n", pST->szKey); - ASSERT(!pST->wValueLength); - // Iterate through the String elements of StringTable - String* pS = (String*) roundpos(&pST->szKey[wcslen(pST->szKey)+1], pST, 4); - for ( ; ((byte*) pS) < (((byte*) pST) + pST->wLength); pS = (String*) roundpos((((byte*) pS) + pS->wLength), pS, 4)) { - wchar_t* psVal = (wchar_t*) roundpos(&pS->szKey[wcslen(pS->szKey)+1], pS, 4); - printf(" %-18S: %.*S\n", pS->szKey, pS->wValueLength, psVal); // print : - } - } - } - else { - // The current child is a VarFileInfo element - ASSERT(1 == pSFI->wType); // ?? it just seems to be this way... - VarFileInfo* pVFI = (VarFileInfo*) pSFI; - ASSERT(!wcscmp(pVFI->szKey, L"VarFileInfo")); - ASSERT(!pVFI->wValueLength); - // Iterate through the Var elements of VarFileInfo (there should be only one, but just in case...) - Var* pV = (Var*) roundpos(&pVFI->szKey[wcslen(pVFI->szKey)+1], pVFI, 4); - for ( ; ((byte*) pV) < (((byte*) pVFI) + pVFI->wLength); pV = (Var*)roundpos((((byte*) pV) + pV->wLength), pV, 4)) { - printf(" %S: ", pV->szKey); - // Iterate through the array of pairs of 16-bit language ID values that make up the standard 'Translation' VarFileInfo element. - WORD* pwV = (WORD*) roundpos(&pV->szKey[wcslen(pV->szKey)+1], pV, 4); - for (WORD* wpos = pwV ; ((byte*) wpos) < (((byte*) pwV) + pV->wValueLength); wpos+=2) { - printf("%04x%04x ", (int)*wpos++, (int)(*(wpos+1))); - } - printf("\n"); - } - } - } - ASSERT((byte*) pSFI == roundpos((((byte*) pVS) + pVS->wLength), pVS, 4)); - return pValue->dwFileVersionMS; // !!! return major version number -} -// ---------------------------------------------------------------------------- - -int wmain(int argc, wchar_t *argv[], wchar_t *envp[]) -// Prints out the version info of the file named in argv[1], and returns the major version number as the exit code -{ - if (argc <= 1) return usage(); - - wchar_t* sfnFile = argv[1]; - DWORD dummy; - DWORD size = GetFileVersionInfoSizeW(sfnFile, &dummy); - if (!size) return error(sfnFile); - void* pVer = _alloca(size); memset(pVer, 0, size); - if (0 == GetFileVersionInfoW(sfnFile, 0, size, pVer)) return error(sfnFile); -#if HDUMP - printf("VERSIONINFO dump for file \"%S\":\n", sfnFile); - hdump((byte*) pVer, size, 0, 0); -#endif // HDUMP - printf("VERSIONINFO for file \"%S\": ", sfnFile); - return showVer(pVer, size); -} -// ---------------------------------------------------------------------------- - diff --git a/libexec/ShowVer/ShowVer.dsp b/libexec/ShowVer/ShowVer.dsp deleted file mode 100644 index 444a0f9..0000000 --- a/libexec/ShowVer/ShowVer.dsp +++ /dev/null @@ -1,112 +0,0 @@ -# Microsoft Developer Studio Project File - Name="ShowVer" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=ShowVer - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "ShowVer.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "ShowVer.mak" CFG="ShowVer - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "ShowVer - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "ShowVer - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "ShowVer - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /c -# SUBTRACT CPP /YX /Yc /Yu -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 Version.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "ShowVer - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c -# SUBTRACT CPP /YX /Yc /Yu -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 Version.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "ShowVer - Win32 Release" -# Name "ShowVer - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\ShowVer.cpp -# End Source File -# Begin Source File - -SOURCE=.\ShowVer.rc -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# Begin Source File - -SOURCE=.\ReadMe.txt -# End Source File -# End Target -# End Project diff --git a/libexec/ShowVer/ShowVer.rc b/libexec/ShowVer/ShowVer.rc deleted file mode 100644 index 1d68c8b..0000000 --- a/libexec/ShowVer/ShowVer.rc +++ /dev/null @@ -1,110 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "AuthorName", "Ted Peck\0" - VALUE "Comments", "\0" - VALUE "CompanyName", "\0" - VALUE "FileDescription", "ShowVer console app for VersionInfo display\0" - VALUE "FileVersion", "1, 0, 0, 1\0" - VALUE "InternalName", "ShowVer\0" - VALUE "LegalCopyright", "Copyright © 2002\0" - VALUE "LegalTrademarks", "\0" - VALUE "OriginalFilename", "ShowVer.exe\0" - VALUE "PrivateBuild", "\0" - VALUE "ProductName", "ShowVer\0" - VALUE "ProductVersion", "1, 0, 0, 1\0" - VALUE "SpecialBuild", "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif // !_MAC - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/libexec/VersionInfo.vbs b/libexec/VersionInfo.vbs new file mode 100644 index 0000000..ab813d7 --- /dev/null +++ b/libexec/VersionInfo.vbs @@ -0,0 +1,4 @@ +set args = WScript.Arguments +Set fso = CreateObject("Scripting.FileSystemObject") +WScript.Echo fso.GetFileVersion(args(0)) +Wscript.Quit