change verison detect and other small fixes

This commit is contained in:
Mario Fetka 2013-09-16 08:11:37 +02:00
parent 8ad86744fc
commit 49950d8b66
7 changed files with 33 additions and 767 deletions

View File

@ -20,11 +20,11 @@ builder_config() {
CMD_unix2dos="`which unix2dos.exe`" ; builder_check_error "Command 'unix2dos' not installed" 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_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_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_tidy="`which tidy.exe`" ; builder_check_error "Command 'tidy' not installed"
CMD_msiexec="`which msiexec.exe`" ; builder_check_error "Command 'msiexec' 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_innounp="`which innounp.exe`" ; builder_check_error "Command 'innounp' not installed"
CMD_xmlstarlet="`which xmlstarlet.exe`" ; builder_check_error "Command 'xmlstarlat' 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 # Check temp dir
test -d ${TMP_DIR} test -d ${TMP_DIR}
@ -215,10 +215,10 @@ builder_create() {
done done
# convert to dos file linefeed # 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 # 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 # Create changelog based on git - if available
if [ -d "${PRODUCT_DIR}/.git" ] ; then if [ -d "${PRODUCT_DIR}/.git" ] ; then

View File

@ -200,10 +200,16 @@ write_ini_file() {
# Var: # Var:
# #
################### ###################
vercomp() { # return 0 if program version is equal or greater than check version
[ ! $(echo -e "$1\n$2" | sort --version-sort | head -1) = "$1" ] 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 # Get Verison of File
# #
@ -219,9 +225,16 @@ vercomp() {
get_file_ver() { get_file_ver() {
local getver_file=$2 local getver_file=$2
local __resultvar=$1 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" echo "$getver_file -> $myresult"
eval $__resultvar="'$myresult'" eval $__resultvar="'$myresult'"
fi
} }
################### ###################
@ -237,26 +250,26 @@ get_file_ver() {
copyver() { copyver() {
local source_file=$1 local source_file=$1
local target_file=$2 local target_file=$2
local source_ver="" local source_ver="0.0.0.0"
local target_ver="" local target_ver="0.0.0.0"
echo "Source File: $source_file Target Version: $target_file" echo "Source File: $source_file Target Version: $target_file"
if [ -f "$source_file" ] && [ -f "$target_file" ] ; then if [ -f "$source_file" ] && [ -f "$target_file" ] ; then
get_file_ver source_ver $source_file get_file_ver source_ver $source_file
get_file_ver target_ver $target_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 "Source Verssion: $source_ver > Target Version: $target_ver"
echo "Copying File" echo "Copying File"
cp $source_file $target_file cp -a $source_file $target_file
else else
echo "Source Verssion: $source_ver =< Target Version: $target_ver" echo "Source Verssion: $source_ver =< Target Version: $target_ver"
echo "Not Copying File" echo "Not Copying File"
fi fi
elif [ -f "$source_file" ] && [ ! -f "$target_file" ] ; then 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 "Source Verssion: $source_ver"
echo "Copying File" echo "Copying File"
cp $source_file $target_file cp -a $source_file $target_file
else else
echo "Nothing to copy" echo "Nothing to copy"
fi fi
@ -317,6 +330,8 @@ function extract_file() {
cp $src $dst_dir cp $src $dst_dir
$CMD_msiexec /p "$src_file" /a "$dst_file" SHORTFILENAMES=TRUE /qb $CMD_msiexec /p "$src_file" /a "$dst_file" SHORTFILENAMES=TRUE /qb
popd popd
elif [ "$format" = "msp-x" ]; then
$CMD_msix $(cygpath -pw "$src") /out $(cygpath -pw "$dst")
elif [ "$format" = "7zip" ]; then elif [ "$format" = "7zip" ]; then
$CMD_7z x -y $option -o$dst $src $CMD_7z x -y $option -o$dst $src
elif [ "$format" = "unzip" ]; then elif [ "$format" = "unzip" ]; then
@ -338,7 +353,7 @@ function extract_file() {
popd popd
done done
elif [ "$format" = "inno" ]; then elif [ "$format" = "inno" ]; then
$CMD_innounp $option -d $dst $src $CMD_innounp -x -d"$(cygpath -pw "$dst")" "$(cygpath -pw "$src")"
else else
fatal_error "Unknown compression format: $format" fatal_error "Unknown compression format: $format"
fi fi

Binary file not shown.

View File

@ -1,531 +0,0 @@
/*
* File: ShowVer.cpp
* Version: 1.0, 2002-6-4
* Purpose: console program to display file VERSIONINFO text
* Copyright (c) 2002 by Ted Peck <tpeck@roundwave.com>
* 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 <stdio.h>
#include <malloc.h>
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
typedef unsigned char byte;
#ifndef _DEBUG
# define ASSERT(s)
#else
# include <CRTDbg.h> // 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 <filename>\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 <sKey> : <sValue>
}
}
}
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);
}
// ----------------------------------------------------------------------------

View File

@ -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

View File

@ -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

4
libexec/VersionInfo.vbs Normal file
View File

@ -0,0 +1,4 @@
set args = WScript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")
WScript.Echo fso.GetFileVersion(args(0))
Wscript.Quit