Example #1
0
/*
 * Execute individual Put and Get operations.
 * 
 * @param cache Cache instance.
 */
void PutGet(Cache<int, Organization>& cache) 
{
    // Create new Organization to store in cache.
    Organization org("Microsoft", Address("1096 Eddy Street, San Francisco, CA", 94109));

    // Put organization to cache.
    cache.Put(1, org);

    // Get recently created employee as a strongly-typed fully de-serialized instance.
    Organization orgFromCache = cache.Get(1);

    std::cout <<  ">>> Retrieved organization instance from cache: " << std::endl;
    std::cout << orgFromCache.ToString() << std::endl;
    std::cout << std::endl;
}
Example #2
0
int GetConcurrencyFactor()
{
	static Cache<int> Value;

	return Value.Get([]()
	{
		int ThreadCount = 0;

		for (int i = 0; i < GetCpuCount(); i++)
		{
			CpuInfo Info = GetCpuInfo(i);
			ThreadCount += Info.ThreadCount;
		}

		return ThreadCount;
	});
}
Example #3
0
PixelSize
TextCache::GetSize(const Font &font, const char *text)
{
#ifndef ENABLE_OPENGL
  const ScopeLock protect(text_cache_mutex);
#endif

  TextCacheKey key(font, text);
  const PixelSize *cached = size_cache.Get(key);
  if (cached != NULL)
    return *cached;

  PixelSize size = font.TextSize(text);

  key.Allocate();
  size_cache.Put(std::move(key), std::move(size));
  return size;
}
Example #4
0
RamInfo GetRamInfo()
{
	static Cache<RamInfo> Value;

	return Value.Get([]() 
	{
		MEMORYSTATUSEX MemInfo;
		MemInfo.dwLength = sizeof(MEMORYSTATUSEX);
		GlobalMemoryStatusEx(&MemInfo);

		RamInfo Info;
		Info.TotalPhysicalRam = MemInfo.ullTotalPhys;
		Info.TotalVirtualRam = MemInfo.ullTotalVirtual;
		Info.TotalPageRam = MemInfo.ullTotalPageFile;

		return Info;
	});
}
Example #5
0
int GetGpuCount()
{
	static Cache<int> Value;

	return Value.Get([]()
	{
		WmiQuery Query(&Environment::gWmiConnection, "select * from Win32_VideoController");
		WmiQueryResult Result;

		int CpuCount = 1;

		if (Query.Execute(&Result).Succeeded())
		{
			CpuCount = Result.RowCount();
		}

		return CpuCount;
	});
}
Example #6
0
PixelSize
TextCache::GetSize(const Font &font, const char *text)
{
#ifndef ENABLE_OPENGL
  const Poco::ScopedLock<Poco::Mutex> protect(text_cache_mutex);
#endif

  TextCacheKey key(font, text);
  const PixelSize *cached = size_cache.Get(key);
  if (cached != nullptr)
    return *cached;

#ifdef UNICODE
  PixelSize size = font.TextSize(UTF8ToWideConverter(text));
#else
  PixelSize size = font.TextSize(text);
#endif

  key.Allocate();
  size_cache.Put(std::move(key), std::move(size));
  return size;
}
Example #7
0
String GetUsername()
{
	static Cache<String> Value;

	return Value.Get([]() 
	{
		char Buffer[UNLEN + 1];
		Buffer[UNLEN] = '\0';

		DWORD BufferLen = UNLEN;

		if (0 == GetUserNameA(Buffer, &BufferLen))
		{
			LogLastSystemError("GetUsername");
			return String("Unknown");
		}
		else
		{
			return String(Buffer);
		}
	});
}
Example #8
0
PixelSize
TextCache::LookupSize(const Font &font, const char *text)
{
#ifndef ENABLE_OPENGL
  const ScopeLock protect(text_cache_mutex);
#endif

  PixelSize size = { 0, 0 };

  if (*text == 0)
    return size;

  TextCacheKey key(font, text);
  const RenderedText *cached = text_cache.Get(key);
  if (cached == NULL)
    return size;

#ifdef ENABLE_OPENGL
  return cached->texture->GetSize();
#else
  return { cached->width, cached->height };
#endif
}
Example #9
0
TextCache::Result
TextCache::Get(const Font &font, const char *text)
{
#ifdef ENABLE_OPENGL
  assert(pthread_equal(pthread_self(), OpenGL::thread));
#endif
  assert(font.IsDefined());
  assert(text != NULL);

  if (StringIsEmpty(text)) {
#ifdef ENABLE_OPENGL
    return nullptr;
#else
    return Result::Null();
#endif
  }

  TextCacheKey key(font, text);

  /* look it up */

#ifndef ENABLE_OPENGL
  const ScopeLock protect(text_cache_mutex);
#endif

  const RenderedText *cached = text_cache.Get(key);
  if (cached != NULL)
    return *cached;

  /* render the text into a OpenGL texture */

#ifdef USE_FREETYPE
  PixelSize size = font.TextSize(text);
  size_t buffer_size = font.BufferSize(size);
  if (buffer_size == 0) {
#ifdef ENABLE_OPENGL
    return nullptr;
#else
    return Result::Null();
#endif
  }

  uint8_t *buffer = new uint8_t[buffer_size];
  if (buffer == nullptr) {
#ifdef ENABLE_OPENGL
    return nullptr;
#else
    return Result::Null();
#endif
  }

  font.Render(text, size, buffer);
  RenderedText rt(size.cx, size.cy, buffer);
#ifdef ENABLE_OPENGL
  delete[] buffer;
#endif
#elif defined(ANDROID)
  PixelSize size, allocated_size;
  int texture_id = font.TextTextureGL(text, size, allocated_size);
  if (texture_id == 0)
    return NULL;

  RenderedText rt(texture_id, size.cx, size.cy,
                  allocated_size.cx, allocated_size.cy);
#else
#error No font renderer
#endif

  Result result = rt;

  key.Allocate();
  text_cache.Put(std::move(key), std::move(rt));

  /* done */

  return result;
}
Example #10
0
Array<String> GetCommandLineArguments()
{
	static Cache< Array<String> > Value;

	return Value.Get([]()
	{
		Array<String> Result;

		const char* CmdLine = ::GetCommandLineA();
		int CmdLineLen = (int)strlen(CmdLine);

		bool InQuotes = false;
		char QuoteChar = '"';
		String Segment = "";

		for (int i = 0; i < CmdLineLen; i++)
		{
			char Chr = CmdLine[i];
			bool bIgnoreChr = false;

			if (InQuotes == true)
			{
				if (Chr == QuoteChar)
				{
					InQuotes = false;
					bIgnoreChr = true;
				}
			}
			else
			{
				if (Chr == '"' || Chr == '\'')
				{
					InQuotes = true;
					bIgnoreChr = true;
					QuoteChar = Chr;
				}
			}


			if (Chr == ' ' && !InQuotes)
			{
				if (!Segment.IsEmpty())
				{
					Result.Push(Segment);
					Segment = "";
				}
			}
			else if (!bIgnoreChr)
			{
				Segment += Chr;
			}
		}

		if (!Segment.IsEmpty())
		{
			if (!Segment.IsEmpty())
			{
				Result.Push(Segment);
				Segment = "";
			}
		}

		// Remove the EXE path, we don't care about it.
		if (Result.Length() > 0)
		{
			Result.RemoveAt(0);
		}

		return Result;
	});
}
Example #11
0
Path GetSpecialPath(SpecialPath Type)
{
	switch (Type)
	{
	case SpecialPath::ExecutableFile:
		{
			static Cache<Path> CachedPath;

			return CachedPath.Get([]()
			{
				HMODULE hModule = GetModuleHandle(NULL);
				if (hModule)
				{
					char ModulePath[MAX_PATH + 1];
					GetModuleFileNameA(hModule, ModulePath, sizeof(ModulePath));

					return Path(ModulePath);
				}
				else
				{
					return Path("");
				}
			});
		}
	case SpecialPath::TempDirectory:
		{
			static Cache<Path> CachedPath;

			return CachedPath.Get([]()
			{
				char TempPath[MAX_PATH + 1];
				if (!GetTempPathA(sizeof(TempPath), TempPath))
				{
					LogLastSystemError("GetTempPath");
					return Path("");
				}

				return Path(TempPath);
			});
		}
	case SpecialPath::SaveDataDirectory:
		{
			static Cache<Path> CachedPath;

			return CachedPath.Get([]()
			{
				char TempPath[MAX_PATH + 1];

				if (SHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, 0, TempPath) != S_OK)
				{
					LogLastSystemError("SHGetFolderPath");
					return Path("");
				}

				return Path(TempPath);
			});
		}
	default:
		{
			LD_CONSTANT_LD_ASSERT();
			return Path("");
		}
	}
}
Example #12
0
String GetPlatformName()
{
	static Cache<String> Value;

	return Value.Get([] () 
	{		
		SYSTEM_INFO SystemInfo;

		OSVERSIONINFOEXA VersionInfo;
		VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);

		DWORD ProductType;

		GetSystemInfo(&SystemInfo);

		if (!GetVersionExA((OSVERSIONINFOA*)&VersionInfo))
		{
			LogLastSystemError("GetVersionEx");
			return String("Unknown");
		}

		if (!GetProductInfo(VersionInfo.dwMajorVersion, VersionInfo.dwMinorVersion, 0, 0, &ProductType))
		{
			LogLastSystemError("GetProductInfo");
			return String("Unknown");
		}

		String Result = "Unknown";

		if (VER_PLATFORM_WIN32_NT == VersionInfo.dwPlatformId && VersionInfo.dwMajorVersion > 4)
		{
			Result = "Microsoft ";

			if (VersionInfo.dwMajorVersion >= 6)
			{
				if (VersionInfo.dwMajorVersion == 6 && VersionInfo.dwMinorVersion == 0)
				{
					if (VersionInfo.wProductType == VER_NT_WORKSTATION)
					{
						Result += "Windows Vista";
					}
					else
					{
						Result += "Windows Server 2008";
					}
				}
				else if (VersionInfo.dwMinorVersion == 0 || VersionInfo.dwMinorVersion == 1 || VersionInfo.dwMinorVersion == 2 || VersionInfo.dwMinorVersion == 3)
				{
					if (VersionInfo.dwMajorVersion == 6)
					{
						if (VersionInfo.wProductType == VER_NT_WORKSTATION && VersionInfo.dwMinorVersion == 1)
						{
							Result += "Windows 7";
						}
						else if (VersionInfo.wProductType == VER_NT_WORKSTATION && VersionInfo.dwMinorVersion == 2)
						{
							Result += "Windows 8";
						}
						else if (VersionInfo.wProductType == VER_NT_WORKSTATION && VersionInfo.dwMinorVersion == 3)
						{
							Result += "Windows 8.1";
						}
						else
						{
							Result += "Windows Server 2008 R2";
						}
					}
					else if (VersionInfo.dwMajorVersion == 10)
					{
						if (VersionInfo.wProductType == VER_NT_WORKSTATION)
						{
							Result += "Windows 10";
						}
						else
						{
							Result += "Windows Server 2016";
						}
					}
					else
					{
						Result += "Unknown Windows Version";
					}

					Result += " ";

					switch (ProductType)
					{
					case PRODUCT_BUSINESS:							Result += "Business"; break;
					case PRODUCT_BUSINESS_N:						Result += "Business N"; break;
					case PRODUCT_CLUSTER_SERVER:					Result += "HPC Edition"; break;
					case PRODUCT_CLUSTER_SERVER_V:					Result += "Server Hyper Core V"; break;
					case PRODUCT_CORE:								Result += "Home"; break;
					case PRODUCT_CORE_COUNTRYSPECIFIC:				Result += "Home China"; break;
					case PRODUCT_CORE_N:							Result += "Home N"; break;
					case PRODUCT_CORE_SINGLELANGUAGE:				Result += "Home Single Language"; break;
					case PRODUCT_DATACENTER_EVALUATION_SERVER:		Result += "Server Datacenter(evaluation installation)"; break;
					case PRODUCT_DATACENTER_SERVER:					Result += "Server Datacenter(full installation)"; break;
					case PRODUCT_DATACENTER_SERVER_CORE:			Result += "Server Datacenter(core installation)"; break;
					case PRODUCT_DATACENTER_SERVER_CORE_V:			Result += "Server Datacenter without Hyper - V(core installation)"; break;
					case PRODUCT_DATACENTER_SERVER_V:				Result += "Server Datacenter without Hyper - V(full installation)"; break;
					case PRODUCT_EDUCATION:							Result += "Education"; break;
					case PRODUCT_EDUCATION_N:						Result += "Education N"; break;
					case PRODUCT_ENTERPRISE:						Result += "Enterprise"; break;
					case PRODUCT_ENTERPRISE_E:						Result += "Enterprise E"; break;
					case PRODUCT_ENTERPRISE_EVALUATION:				Result += "Enterprise Evaluation"; break;
					case PRODUCT_ENTERPRISE_N:						Result += "Enterprise N"; break;
					case PRODUCT_ENTERPRISE_N_EVALUATION:			Result += "Enterprise N Evaluation"; break;
					case PRODUCT_ENTERPRISE_S:						Result += "Enterprise 2015 LTSB"; break;
					case PRODUCT_ENTERPRISE_S_EVALUATION:			Result += "Enterprise 2015 LTSB Evaluation"; break;
					case PRODUCT_ENTERPRISE_S_N:					Result += "Enterprise 2015 LTSB N"; break;
					case PRODUCT_ENTERPRISE_S_N_EVALUATION:			Result += "Enterprise 2015 LTSB N Evaluation"; break;
					case PRODUCT_ENTERPRISE_SERVER:					Result += "Server Enterprise(full installation)"; break;
					case PRODUCT_ENTERPRISE_SERVER_CORE:			Result += "Server Enterprise(core installation)"; break;
					case PRODUCT_ENTERPRISE_SERVER_CORE_V:			Result += "Server Enterprise without Hyper - V(core installation)"; break;
					case PRODUCT_ENTERPRISE_SERVER_IA64:			Result += "Server Enterprise for Itanium - based Systems"; break;
					case PRODUCT_ENTERPRISE_SERVER_V:				Result += "Server Enterprise without Hyper - V(full installation)"; break;
					case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL:		Result += "Windows Essential Server Solution Additional"; break;
					case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC:	Result += "Windows Essential Server Solution Additional SVC"; break;
					case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT:		Result += "Windows Essential Server Solution Management"; break;
					case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC:	Result += "Windows Essential Server Solution Management SVC"; break;
					case PRODUCT_HOME_BASIC:						Result += "Home Basic"; break;
					case PRODUCT_HOME_BASIC_E:						Result += "Not supported (Home Basic E)"; break;
					case PRODUCT_HOME_BASIC_N:						Result += "Home Basic N"; break;
					case PRODUCT_HOME_PREMIUM:						Result += "Home Premium"; break;
					case PRODUCT_HOME_PREMIUM_E:					Result += "Not supported (Home Premium E)"; break;
					case PRODUCT_HOME_PREMIUM_N:					Result += "Home Premium N"; break;
					case PRODUCT_HOME_PREMIUM_SERVER:				Result += "Windows Home Server 2011"; break;
					case PRODUCT_HOME_SERVER:						Result += "Windows Storage Server 2008 R2 Essentials"; break;
					case PRODUCT_HYPERV:							Result += "Microsoft Hyper - V Server"; break;
					case PRODUCT_IOTUAP:							Result += "IoT Core"; break;
					case PRODUCT_IOTUAPCOMMERCIAL:					Result += "IoT Core Commercial"; break;
					case PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT:	Result += "Windows Essential Business Server Management Server"; break;
					case PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING:	Result += "Windows Essential Business Server Messaging Server"; break;
					case PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY:	Result += "Windows Essential Business Server Security Server"; break;
					case PRODUCT_MOBILE_CORE:						Result += "Mobile"; break;
					case PRODUCT_MOBILE_ENTERPRISE:					Result += "Mobile Enterprise"; break;
					case PRODUCT_MULTIPOINT_PREMIUM_SERVER:			Result += "Windows MultiPoint Server Premium(full installation)"; break;
					case PRODUCT_MULTIPOINT_STANDARD_SERVER:		Result += "Windows MultiPoint Server Standard(full installation)"; break;
					case PRODUCT_PROFESSIONAL:						Result += "Pro"; break;
					case PRODUCT_PROFESSIONAL_E:					Result += "Not supported (Pro E)"; break;
					case PRODUCT_PROFESSIONAL_N:					Result += "Pro N"; break;
					case PRODUCT_PROFESSIONAL_WMC:					Result += "Professional with Media Center"; break;
					case PRODUCT_SB_SOLUTION_SERVER:				Result += "Windows Small Business Server 2011 Essentials"; break;
					case PRODUCT_SB_SOLUTION_SERVER_EM:				Result += "Server For SB Solutions EM"; break;
					case PRODUCT_SERVER_FOR_SB_SOLUTIONS:			Result += "Server For SB Solutions"; break;
					case PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM:		Result += "Server For SB Solutions EM"; break;
					case PRODUCT_SERVER_FOR_SMALLBUSINESS:			Result += "Windows Server 2008 for Windows Essential Server Solutions"; break;
					case PRODUCT_SERVER_FOR_SMALLBUSINESS_V:		Result += "Windows Server 2008 without Hyper - V for Windows Essential Server Solutions"; break;
					case PRODUCT_SERVER_FOUNDATION:					Result += "Server Foundation"; break;
					case PRODUCT_SMALLBUSINESS_SERVER:				Result += "Windows Small Business Server"; break;
					case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:		Result += "Small Business Server Premium"; break;
					case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE:	Result += "Small Business Server Premium(core installation)"; break;
					case PRODUCT_SOLUTION_EMBEDDEDSERVER:			Result += "Windows MultiPoint Server"; break;
					case PRODUCT_STANDARD_EVALUATION_SERVER:		Result += "Server Standard(evaluation installation)"; break;
					case PRODUCT_STANDARD_SERVER:					Result += "Server Standard"; break;
					case PRODUCT_STANDARD_SERVER_CORE:				Result += "Server Standard(core installation)"; break;
					case PRODUCT_STANDARD_SERVER_CORE_V:			Result += "Server Standard without Hyper - V(core installation)"; break;
					case PRODUCT_STANDARD_SERVER_V:					Result += "Server Standard without Hyper - V"; break;
					case PRODUCT_STANDARD_SERVER_SOLUTIONS:			Result += "Server Solutions Premium"; break;
					case PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE:	Result += "Server Solutions Premium(core installation)"; break;
					case PRODUCT_STARTER:							Result += "Starter"; break;
					case PRODUCT_STARTER_E:							Result += "Not supported (Starter E)"; break;
					case PRODUCT_STARTER_N:							Result += "Starter N"; break;
					case PRODUCT_STORAGE_ENTERPRISE_SERVER:			Result += "Storage Server Enterprise"; break;
					case PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE:	Result += "Storage Server Enterprise(core installation)"; break;
					case PRODUCT_STORAGE_EXPRESS_SERVER:			Result += "Storage Server Express"; break;
					case PRODUCT_STORAGE_EXPRESS_SERVER_CORE:		Result += "Storage Server Express(core installation)"; break;
					case PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER:Result += "Storage Server Standard(evaluation installation)"; break;
					case PRODUCT_STORAGE_STANDARD_SERVER:			Result += "Storage Server Standard"; break;
					case PRODUCT_STORAGE_STANDARD_SERVER_CORE:		Result += "Storage Server Standard(core installation)"; break;
					case PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER:Result += "Storage Server Workgroup(evaluation installation)"; break;
					case PRODUCT_STORAGE_WORKGROUP_SERVER:			Result += "Storage Server Workgroup"; break;
					case PRODUCT_STORAGE_WORKGROUP_SERVER_CORE:		Result += "Storage Server Workgroup(core installation)"; break;
					case PRODUCT_ULTIMATE:							Result += "Ultimate"; break;
					case PRODUCT_ULTIMATE_E:						Result += "Not supported (Ultimate E)"; break;
					case PRODUCT_ULTIMATE_N:						Result += "Ultimate N"; break;
					case PRODUCT_UNDEFINED:							Result += "An unknown product"; break;
					case PRODUCT_WEB_SERVER:						Result += "Web Server(full installation)"; break;
					case PRODUCT_WEB_SERVER_CORE:					Result += "Web Server(core installation)"; break;
					default:										Result += "Unknown product type"; break;
					}
				}
			}
			else if (VersionInfo.dwMajorVersion == 5 && VersionInfo.dwMinorVersion == 2)
			{
				if (GetSystemMetrics(SM_SERVERR2))
				{
					Result += "Windows Server 2003 R2";
				}
				else if (VersionInfo.wSuiteMask & VER_SUITE_STORAGE_SERVER)
				{
					Result += "Windows Storage Server 2003";
				}
				else if (VersionInfo.wSuiteMask & VER_SUITE_WH_SERVER)
				{
					Result += "Windows Home Server";
				}
				else if (VersionInfo.wProductType & VER_NT_WORKSTATION && SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
				{
					Result += "Windows XP Professional x64 Edition";
				}
				else
				{
					Result += "Windows Server 2003";
				}

				if (VersionInfo.wProductType != VER_NT_WORKSTATION)
				{
					if (SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
					{
						if (VersionInfo.wSuiteMask & VER_SUITE_DATACENTER)
						{
							Result += " Datacenter Edition for Itanium-based Systems";
						}
						else if (VersionInfo.wSuiteMask & VER_SUITE_ENTERPRISE)
						{
							Result += " Enterprise Edition for Itanium-based Systems";
						}
					}
					else if (SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
					{
						if (VersionInfo.wSuiteMask & VER_SUITE_DATACENTER)
						{
							Result += " Datacenter x64 Edition";
						}
						else if (VersionInfo.wSuiteMask & VER_SUITE_ENTERPRISE)
						{
							Result += " Enterprise x64 Edition";
						}
						else
						{
							Result += " Standard x64 Edition";
						}
					}
					else
					{
						if (VersionInfo.wSuiteMask & VER_SUITE_COMPUTE_SERVER)
						{
							Result += " Compute Cluster Edition";
						}
						else if (VersionInfo.wSuiteMask & VER_SUITE_DATACENTER)
						{
							Result += " Datacenter Edition";
						}
						else if (VersionInfo.wSuiteMask & VER_SUITE_ENTERPRISE)
						{
							Result += " Enterprise Edition";
						}
						else if (VersionInfo.wSuiteMask & VER_SUITE_BLADE)
						{
							Result += " Web Edition";
						}
						else
						{
							Result += " Standard Edition";
						}
					}
				}
			}
			else if (VersionInfo.dwMajorVersion == 5 && VersionInfo.dwMinorVersion == 1)
			{
				Result += "Windows XP";
				if (VersionInfo.wSuiteMask & VER_SUITE_PERSONAL)
				{
					Result += " Home Edition";
				}
				else
				{
					Result += " Professional";
				}
			}
			else if (VersionInfo.dwMajorVersion == 5 && VersionInfo.dwMinorVersion == 0)
			{
				Result += "Windows 2000 ";

				if (VersionInfo.wProductType == VER_NT_WORKSTATION)
				{
					Result += " Professional";
				}
				else
				{
					if (VersionInfo.wSuiteMask & VER_SUITE_DATACENTER)
					{
						Result += " Datacenter Server";
					}
					else if (VersionInfo.wSuiteMask & VER_SUITE_ENTERPRISE)
					{
						Result += " Advanced Server";
					}
					else
					{
						Result += " Server";
					}
				}
			}

			if (strlen(VersionInfo.szCSDVersion) > 0)
			{
				Result += " ";
				Result += VersionInfo.szCSDVersion;
			}

			Result += String(" (Build ") + (int)VersionInfo.dwBuildNumber + String(")");

			if (VersionInfo.dwMajorVersion >= 6)
			{
				if (SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
				{
					Result += ", 64-bit";
				}
				else if (SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
				{
					Result += ", 32-bit";
				}
			}
		}

		return Result;
	});
}