file.write('#define DAY_STR\t\t\t"' + str(now.day) + '"\n')
file.write('\n')
- file.write('#define REG_KEY_NAME\t\t\t"' + os.environ['REG_KEY_NAME'] + '"\n')
- file.write('\n')
-
file.close()
if 'OBJECT_PREFIX' not in os.environ.keys():
os.environ['OBJECT_PREFIX'] = 'XenProject'
- if 'REG_KEY_NAME' not in os.environ.keys():
- os.environ['REG_KEY_NAME'] = 'Windows PV Drivers'
-
os.environ['MAJOR_VERSION'] = '9'
os.environ['MINOR_VERSION'] = '0'
os.environ['MICRO_VERSION'] = '0'
print("PRODUCT_NAME\t\t'%s'" % os.environ['PRODUCT_NAME'])
print("OBJECT_PREFIX\t\t'%s'" % os.environ['OBJECT_PREFIX'])
- print("REG_KEY_NAME\t\t'%s'" % os.environ['REG_KEY_NAME'])
print("MAJOR_VERSION\t\t%s" % os.environ['MAJOR_VERSION'])
print("MINOR_VERSION\t\t%s" % os.environ['MINOR_VERSION'])
print("MICRO_VERSION\t\t%s" % os.environ['MICRO_VERSION'])
CloseHandle(token);
}
-bool CXenIfaceCreator::IsHostTimeUTC()
+bool CXenIfaceCreator::IsRTCInUTC()
{
-#ifdef _WIN64
- // Check SOFTWARE\Wow6432Node\$(VENDOR_NAME_STR)\$(REG_KEY_NAME) $(REG_UTC_NAME) == UTC
- if (RegCheckIsUTC("SOFTWARE\\Wow6432Node"))
- return true;
-#endif
- // Check SOFTWARE\$(VENDOR_NAME_STR)\$(REG_KEY_NAME) $(REG_UTC_NAME) == UTC
- if (RegCheckIsUTC("SOFTWARE"))
- return true;
+ HKEY key;
+ std::string path;
+ DWORD val = 0;
+ DWORD length = sizeof(val);
+ LRESULT lr;
- return false;
+ path = "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation";
+
+ lr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path.c_str(), 0, KEY_READ, &key);
+ if (lr != ERROR_SUCCESS)
+ return false;
+
+ lr = RegQueryValueEx(key, "RealTimeIsUniversal", NULL, NULL,
+ (LPBYTE)&val, &length);
+ RegCloseKey(key);
+
+ // A non-present value -> false
+ if (lr != ERROR_SUCCESS)
+ return false;
+
+ return val;
}
void CXenIfaceCreator::AdjustXenTimeToUTC(FILETIME* now)
now->dwHighDateTime = lnow.HighPart;
}
-bool CXenIfaceCreator::RegCheckIsUTC(const char* rootpath)
-{
- HKEY key;
- LRESULT lr;
- std::string path;
- bool match = false;
-
- path = rootpath;
- path += "\\";
- path += VENDOR_NAME_STR;
- path += "\\";
- path += REG_KEY_NAME;
-
- lr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path.c_str(), 0, KEY_READ, &key);
- if (lr != ERROR_SUCCESS)
- goto fail1;
-
- DWORD size = 32;
- DWORD length;
- char* buffer = NULL;
-
- do {
- length = size;
- if (buffer)
- delete [] buffer;
-
- buffer = new char[size];
- if (buffer == NULL)
- goto fail2;
-
- lr = RegQueryValueEx(key, "HostTime", NULL, NULL, (LPBYTE)buffer, &length);
- size *= 2;
- } while (lr == ERROR_MORE_DATA);
- if (lr != ERROR_SUCCESS)
- goto fail3;
-
- if (!_strnicoll("UTC", buffer, length))
- match = true;
-
-fail3:
- delete [] buffer;
-fail2:
- RegCloseKey(key);
-fail1:
-
- return match;
-}
-
void CXenIfaceCreator::SetXenTime()
{
- // Set VM's time to Xen's time (adjust for UTC settings of VM and guest)
+ // Set VM's time to Xen's time (adjust for UTC setting)
FILETIME now = { 0 };
if (!m_device->SharedInfoGetTime(&now))
return;
- bool IsUTC = IsHostTimeUTC();
+ bool IsUTC = IsRTCInUTC();
if (IsUTC)
AdjustXenTimeToUTC(&now);
SYSTEMTIME cur = { 0 };
GetLocalTime(&cur);
+ CXenAgent::Log("RTC is in %s\n", IsUTC ? "UTC" : "local time");
CXenAgent::Log("Time Now = %d/%d/%d %d:%02d:%02d.%d\n",
cur.wYear, cur.wMonth, cur.wDay,
cur.wHour, cur.wMinute, cur.wSecond, cur.wMilliseconds);