Skip to content
Snippets Groups Projects
Commit 6016ac65 authored by Mark Palange (Mani)'s avatar Mark Palange (Mani)
Browse files

EXT-2618 Added code to determine if the viewer is running 'compatibility mode'

OS version string reports compatibility mode and real os version number, if accessible.
reviewed by Richard
parent 6253e261
No related branches found
No related tags found
No related merge requests found
...@@ -76,6 +76,75 @@ extern int errno; ...@@ -76,6 +76,75 @@ extern int errno;
static const S32 CPUINFO_BUFFER_SIZE = 16383; static const S32 CPUINFO_BUFFER_SIZE = 16383;
LLCPUInfo gSysCPU; LLCPUInfo gSysCPU;
#if LL_WINDOWS
#ifndef DLLVERSIONINFO
typedef struct _DllVersionInfo
{
DWORD cbSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformID;
}DLLVERSIONINFO;
#endif
#ifndef DLLGETVERSIONPROC
typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *);
#endif
bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number)
{
bool result = false;
const U32 BUFF_SIZE = 32767;
WCHAR tempBuf[BUFF_SIZE];
if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE))
{
std::basic_string<WCHAR> shell32_path(tempBuf);
// Shell32.dll contains the DLLGetVersion function.
// according to msdn its not part of the API
// so you have to go in and get it.
// http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx
shell32_path += TEXT("\\shell32.dll");
HMODULE hDllInst = LoadLibrary(shell32_path.c_str()); //load the DLL
if(hDllInst)
{ // Could successfully load the DLL
DLLGETVERSIONPROC pDllGetVersion;
/*
You must get this function explicitly because earlier versions of the DLL
don't implement this function. That makes the lack of implementation of the
function a version marker in itself.
*/
pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst,
"DllGetVersion");
if(pDllGetVersion)
{
// DLL supports version retrieval function
DLLVERSIONINFO dvi;
ZeroMemory(&dvi, sizeof(dvi));
dvi.cbSize = sizeof(dvi);
HRESULT hr = (*pDllGetVersion)(&dvi);
if(SUCCEEDED(hr))
{ // Finally, the version is at our hands
major = dvi.dwMajorVersion;
minor = dvi.dwMinorVersion;
build_number = dvi.dwBuildNumber;
result = true;
}
}
FreeLibrary(hDllInst); // Release DLL
}
}
return result;
}
#endif // LL_WINDOWS
LLOSInfo::LLOSInfo() : LLOSInfo::LLOSInfo() :
mMajorVer(0), mMinorVer(0), mBuild(0) mMajorVer(0), mMinorVer(0), mBuild(0)
{ {
...@@ -98,6 +167,11 @@ LLOSInfo::LLOSInfo() : ...@@ -98,6 +167,11 @@ LLOSInfo::LLOSInfo() :
mMinorVer = osvi.dwMinorVersion; mMinorVer = osvi.dwMinorVersion;
mBuild = osvi.dwBuildNumber; mBuild = osvi.dwBuildNumber;
DWORD shell32_major, shell32_minor, shell32_build;
bool got_shell32_version = get_shell32_dll_version(shell32_major,
shell32_minor,
shell32_build);
switch(osvi.dwPlatformId) switch(osvi.dwPlatformId)
{ {
case VER_PLATFORM_WIN32_NT: case VER_PLATFORM_WIN32_NT:
...@@ -122,8 +196,22 @@ LLOSInfo::LLOSInfo() : ...@@ -122,8 +196,22 @@ LLOSInfo::LLOSInfo() :
else else
mOSStringSimple = "Microsoft Windows Server 2003 "; mOSStringSimple = "Microsoft Windows Server 2003 ";
} }
else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 1)
{ {
if(osvi.dwMinorVersion == 0)
{
mOSStringSimple = "Microsoft Windows Vista ";
}
else if(osvi.dwMinorVersion == 1)
{
mOSStringSimple = "Microsoft Windows 7 ";
}
if(osvi.wProductType != VER_NT_WORKSTATION)
{
mOSStringSimple += "Server ";
}
///get native system info if available.. ///get native system info if available..
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo
SYSTEM_INFO si; //System Info object file contains architecture info SYSTEM_INFO si; //System Info object file contains architecture info
...@@ -141,32 +229,13 @@ LLOSInfo::LLOSInfo() : ...@@ -141,32 +229,13 @@ LLOSInfo::LLOSInfo() :
//of windows than this code does (in case it is needed for the future) //of windows than this code does (in case it is needed for the future)
if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) //check for 64 bit if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) //check for 64 bit
{ {
if(osvi.wProductType == VER_NT_WORKSTATION) mOSStringSimple += "64-bit ";
mOSStringSimple = "Microsoft Windows Vista 64-bit ";
else
mOSStringSimple = "Microsoft Windows Vista Server 64-bit ";
} }
else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL ) else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
{ {
if(osvi.wProductType == VER_NT_WORKSTATION) mOSStringSimple += "32-bit ";
mOSStringSimple = "Microsoft Windows Vista 32-bit ";
else
mOSStringSimple = "Microsoft Windows Vista Server 32-bit ";
}
else // PROCESSOR_ARCHITECTURE_IA64 || PROCESSOR_ARCHITECTURE_UNKNOWN not checked
{
if(osvi.wProductType == VER_NT_WORKSTATION)
mOSStringSimple = "Microsoft Windows Vista ";
else
mOSStringSimple = "Microsoft Windows Vista Server ";
} }
} }
else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1)
{
if(osvi.wProductType == VER_NT_WORKSTATION)
mOSStringSimple = "Microsoft Windows 7 ";
else mOSStringSimple = "Microsoft Windows 7 Server ";
}
else // Use the registry on early versions of Windows NT. else // Use the registry on early versions of Windows NT.
{ {
mOSStringSimple = "Microsoft Windows (unrecognized) "; mOSStringSimple = "Microsoft Windows (unrecognized) ";
...@@ -211,6 +280,7 @@ LLOSInfo::LLOSInfo() : ...@@ -211,6 +280,7 @@ LLOSInfo::LLOSInfo() :
csdversion.c_str(), csdversion.c_str(),
(osvi.dwBuildNumber & 0xffff)); (osvi.dwBuildNumber & 0xffff));
} }
mOSString = mOSStringSimple + tmpstr; mOSString = mOSStringSimple + tmpstr;
} }
break; break;
...@@ -240,6 +310,21 @@ LLOSInfo::LLOSInfo() : ...@@ -240,6 +310,21 @@ LLOSInfo::LLOSInfo() :
mOSString = mOSStringSimple; mOSString = mOSStringSimple;
break; break;
} }
std::string compatibility_mode;
if(got_shell32_version)
{
if(osvi.dwMajorVersion != shell32_major
|| osvi.dwMinorVersion != shell32_minor)
{
compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)",
shell32_major,
shell32_minor,
shell32_build);
}
}
mOSString += compatibility_mode;
#else #else
struct utsname un; struct utsname un;
if(uname(&un) != -1) if(uname(&un) != -1)
......
...@@ -1378,7 +1378,7 @@ if (WINDOWS) ...@@ -1378,7 +1378,7 @@ if (WINDOWS)
# sets the 'working directory' for debugging from visual studio. # sets the 'working directory' for debugging from visual studio.
if (NOT UNATTENDED) if (NOT UNATTENDED)
add_custom_command( add_custom_command(
TARGET ${VIEWER_BINARY_NAME} PRE_BUILD TARGET ${VIEWER_BINARY_NAME} POST_BUILD
COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
ARGS ARGS
--solution --solution
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment