Index: src/ch/UpdateChecker.cpp
===================================================================
diff -u -N -r8ef3d7626821ec49c5cad75fd8176e492884bc7b -rd5fd15320ef765fd5225b10e764bca458c2e317c
--- src/ch/UpdateChecker.cpp	(.../UpdateChecker.cpp)	(revision 8ef3d7626821ec49c5cad75fd8176e492884bc7b)
+++ src/ch/UpdateChecker.cpp	(.../UpdateChecker.cpp)	(revision d5fd15320ef765fd5225b10e764bca458c2e317c)
@@ -29,6 +29,8 @@
 #include "../libicpf/exception.h"
 #include "../libicpf/circ_buffer.h"
 #include "../libchcore/TWin32ErrorFormatter.h"
+#include "WindowsVersion.h"
+#include <boost/lexical_cast.hpp>
 
 // timeout used with waiting for events (avoiding hangs)
 #define FORCE_TIMEOUT 60000
@@ -74,7 +76,7 @@
 /// @param[in] pszPath		Url to be opened (full path to file).
 /// @return    S_OK if opened, S_FALSE if wait for result is needed, E_* for errors.
 // ============================================================================
-HRESULT CAsyncHttpFile::Open(const tchar_t* pszPath)
+HRESULT CAsyncHttpFile::Open(const tchar_t* pszPath, const wchar_t* pszUserAgent)
 {
 	if(!pszPath)
 	{
@@ -99,7 +101,7 @@
 		return E_FAIL;
 	}
 
-	m_hInternet = ::InternetOpen(_T(PRODUCT_NAME), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_ASYNC);
+	m_hInternet = ::InternetOpen(pszUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_ASYNC);
 	if(!m_hInternet)
 	{
 		SetErrorCode(GetLastError());
@@ -618,6 +620,20 @@
 	return bCheckForBeta;
 }
 
+std::wstring CUpdateChecker::GetUserAgent()
+{
+	std::wstring wstrUserAgent(PRODUCT_FULL_VERSION_T);
+	wstrUserAgent += L" (" +
+		boost::lexical_cast<std::wstring>(PRODUCT_VERSION1) + L"." + 
+		boost::lexical_cast<std::wstring>(PRODUCT_VERSION2) + L"." + 
+		boost::lexical_cast<std::wstring>(PRODUCT_VERSION3) + L"." + 
+		boost::lexical_cast<std::wstring>(PRODUCT_VERSION4) + L")";
+
+	wstrUserAgent += L" (" + WindowsVersion::GetWindowsVersion() + L")";
+
+	return wstrUserAgent;
+}
+
 // ============================================================================
 /// CUpdateChecker::GetResult
 /// @date 2009/04/18
@@ -662,7 +678,8 @@
 	vBuffer.reserve(stReserveBuffer);
 
 	// open the connection and try to get to the file
-	HRESULT hResult = pUpdateChecker->m_httpFile.Open(strSite);
+	std::wstring wstrUserAgent = GetUserAgent();
+	HRESULT hResult = pUpdateChecker->m_httpFile.Open(strSite, wstrUserAgent.c_str());
 	if(SUCCEEDED(hResult))
 	{
 		eWaitResult = pUpdateChecker->m_httpFile.WaitForResult(pUpdateChecker->m_hKillEvent);