From 6016ac658835757583c80e1f12a52e9b9cc4adc9 Mon Sep 17 00:00:00 2001
From: "Mark Palange (Mani)" <palange@lindenlab.com>
Date: Fri, 20 Nov 2009 10:09:22 -0800
Subject: 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

---
 indra/llcommon/llsys.cpp     | 129 +++++++++++++++++++++++++++++++++++--------
 indra/newview/CMakeLists.txt |   2 +-
 2 files changed, 108 insertions(+), 23 deletions(-)

diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 3652eeba72..cba8cf85b0 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -76,6 +76,75 @@ extern int errno;
 static const S32 CPUINFO_BUFFER_SIZE = 16383;
 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() :
 	mMajorVer(0), mMinorVer(0), mBuild(0)
 {
@@ -98,6 +167,11 @@ LLOSInfo::LLOSInfo() :
 	mMinorVer = osvi.dwMinorVersion;
 	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)
 	{
 	case VER_PLATFORM_WIN32_NT:
@@ -122,8 +196,22 @@ LLOSInfo::LLOSInfo() :
 				 else
 					 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..
 				typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo
 				SYSTEM_INFO si; //System Info object file contains architecture info
@@ -141,32 +229,13 @@ LLOSInfo::LLOSInfo() :
 				//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(osvi.wProductType == VER_NT_WORKSTATION)
-						mOSStringSimple = "Microsoft Windows Vista 64-bit ";
-					 else 
-						mOSStringSimple = "Microsoft Windows Vista Server 64-bit ";
+					mOSStringSimple += "64-bit ";
 				}
 				else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
 				{
-					 if(osvi.wProductType == VER_NT_WORKSTATION)
-						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 ";
+					mOSStringSimple += "32-bit ";
 				}
 			}
-			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.
 			{
 				mOSStringSimple = "Microsoft Windows (unrecognized) ";
@@ -211,6 +280,7 @@ LLOSInfo::LLOSInfo() :
 								  csdversion.c_str(),
 								  (osvi.dwBuildNumber & 0xffff));
 			}
+
 			mOSString = mOSStringSimple + tmpstr;
 		}
 		break;
@@ -240,6 +310,21 @@ LLOSInfo::LLOSInfo() :
 		mOSString = mOSStringSimple;
 		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
 	struct utsname un;
 	if(uname(&un) != -1)
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 4adef84cd3..0666ad1c2a 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1378,7 +1378,7 @@ if (WINDOWS)
     # sets the 'working directory' for debugging from visual studio.
     if (NOT UNATTENDED)
         add_custom_command(
-            TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
+            TARGET ${VIEWER_BINARY_NAME} POST_BUILD
             COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
             ARGS
               --solution 
-- 
cgit v1.2.3


From 172cba3c42027c5abc277e571dcd18b6fcc5fe8c Mon Sep 17 00:00:00 2001
From: "Mark Palange (Mani)" <palange@lindenlab.com>
Date: Fri, 20 Nov 2009 11:21:24 -0800
Subject: Added two more procedurally created dirs to .hgignore to reduce the
 clutter of an hg status

---
 .hgignore | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.hgignore b/.hgignore
index 4d98acf5d9..886af2b007 100644
--- a/.hgignore
+++ b/.hgignore
@@ -13,6 +13,7 @@ LICENSES
 indra/.distcc
 indra/build-darwin-*
 indra/build-vc[0-9]*
+indra/CMakeFiles
 indra/lib/mono/1.0/*.dll
 indra/lib/mono/indra/*.dll
 indra/lib/mono/indra/*.exe
@@ -31,6 +32,7 @@ indra/newview/mozilla-universal-darwin.tgz
 indra/newview/res-sdl
 indra/newview/vivox-runtime
 indra/server-linux-*
+indra/temp
 indra/test/linden_file.dat
 indra/test_apps/llmediatest/dependencies/i686-win32
 indra/test_apps/terrain_mule/*.dll
-- 
cgit v1.2.3