diff --git a/bin/ch/ChakraRtInterface.cpp b/bin/ch/ChakraRtInterface.cpp index aefd08c101b..f9c5a057d6c 100644 --- a/bin/ch/ChakraRtInterface.cpp +++ b/bin/ch/ChakraRtInterface.cpp @@ -23,6 +23,11 @@ ChakraRTInterface::ArgInfo* ChakraRTInterface::m_argInfo = nullptr; TestHooks ChakraRTInterface::m_testHooks = { 0 }; JsAPIHooks ChakraRTInterface::m_jsApiHooks = { 0 }; +LPCSTR GetChakraDllName() +{ + return chakraDllName; +} + // Wrapper functions to abstract out loading ChakraCore // and resolving its symbols // Currently, these functions resolve to the PAL on Linux diff --git a/bin/ch/ChakraRtInterface.h b/bin/ch/ChakraRtInterface.h index 9657a4db78c..d5e1cd5426c 100644 --- a/bin/ch/ChakraRtInterface.h +++ b/bin/ch/ChakraRtInterface.h @@ -188,6 +188,8 @@ struct JsAPIHooks JsrtTTDReplayExecutionPtr pfJsrtTTDReplayExecution; }; +LPCSTR GetChakraDllName(); + class ChakraRTInterface { public: diff --git a/bin/ch/ch.cpp b/bin/ch/ch.cpp index 38a88b5525b..917911afe58 100644 --- a/bin/ch/ch.cpp +++ b/bin/ch/ch.cpp @@ -6,6 +6,7 @@ #include "Core/AtomLockGuids.h" #include #ifdef _WIN32 +#include #include #endif @@ -90,9 +91,64 @@ void __stdcall PrintUsage() #endif } +void __stdcall PrintChVersion() +{ + wprintf(_u("%s version %d.%d.%d.0\n"), hostName, CHAKRA_CORE_MAJOR_VERSION, CHAKRA_CORE_MINOR_VERSION, CHAKRA_CORE_PATCH_VERSION); +} + +#ifdef _WIN32 +void __stdcall PrintChakraCoreVersion() +{ + char filename[_MAX_PATH]; + char drive[_MAX_DRIVE]; + char dir[_MAX_DIR]; + + LPCSTR chakraDllName = GetChakraDllName(); + + char modulename[_MAX_PATH]; + GetModuleFileNameA(NULL, modulename, _MAX_PATH); + _splitpath_s(modulename, drive, _MAX_DRIVE, dir, _MAX_DIR, nullptr, 0, nullptr, 0); + _makepath_s(filename, drive, dir, chakraDllName, nullptr); + + UINT size = 0; + LPBYTE lpBuffer = NULL; + DWORD verSize = GetFileVersionInfoSizeA(filename, NULL); + + if (verSize != NULL) + { + LPSTR verData = new char[verSize]; + + if (GetFileVersionInfoA(filename, NULL, verSize, verData) && + VerQueryValue(verData, _u("\\"), (VOID FAR * FAR *)&lpBuffer, &size) && + (size != 0)) + { + VS_FIXEDFILEINFO *verInfo = (VS_FIXEDFILEINFO *)lpBuffer; + if (verInfo->dwSignature == VS_FFI_SIGNATURE) + { + // Doesn't matter if you are on 32 bit or 64 bit, + // DWORD is always 32 bits, so first two revision numbers + // come from dwFileVersionMS, last two come from dwFileVersionLS + printf("%s version %d.%d.%d.%d\n", + chakraDllName, + (verInfo->dwFileVersionMS >> 16) & 0xffff, + (verInfo->dwFileVersionMS >> 0) & 0xffff, + (verInfo->dwFileVersionLS >> 16) & 0xffff, + (verInfo->dwFileVersionLS >> 0) & 0xffff); + } + } + + delete[] verData; + } +} +#endif + void __stdcall PrintVersion() { - wprintf(_u("%d.%d.%d\n"), CHAKRA_CORE_MAJOR_VERSION, CHAKRA_CORE_MINOR_VERSION, CHAKRA_CORE_PATCH_VERSION); + PrintChVersion(); + +#ifdef _WIN32 + PrintChakraCoreVersion(); +#endif } // On success the param byteCodeBuffer will be allocated in the function. diff --git a/bin/ch/ch.vcxproj b/bin/ch/ch.vcxproj index 46358a4f39b..ecdc0f7f0dd 100644 --- a/bin/ch/ch.vcxproj +++ b/bin/ch/ch.vcxproj @@ -37,6 +37,7 @@ ole32.lib; kernel32.lib; Rpcrt4.lib; + version.lib; @@ -102,4 +103,4 @@ - \ No newline at end of file +