--- old/src/hotspot/os_cpu/windows_x86/vm_version_windows_x86.cpp 2020-08-05 18:24:47.633286160 +0900 +++ new/src/hotspot/os_cpu/windows_x86/vm_version_windows_x86.cpp 2020-08-05 18:24:47.557283783 +0900 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,3 +26,94 @@ #include "runtime/os.hpp" #include "runtime/vm_version.hpp" +#include +#include + +#define VM_MODEL L"Virtual Machine" + + +bool VM_Version::is_in_VM() { + HRESULT hres; + + hres = CoInitializeEx(0, COINIT_MULTITHREADED); + if (hres != S_OK) { + return false; + } + + hres = CoInitializeSecurity(NULL, -1, NULL, NULL, + RPC_C_AUTHN_LEVEL_DEFAULT, + RPC_C_IMP_LEVEL_IMPERSONATE, + NULL, EOAC_NONE, NULL); + if (hres != S_OK) { + CoUninitialize(); + return false; + } + + IWbemLocator* pLoc = NULL; + hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, + IID_IWbemLocator, (LPVOID*)&pLoc); + if (hres != S_OK) { + CoUninitialize(); + return false; + } + + IWbemServices* pSvc = NULL; + BSTR resource = SysAllocString(L"ROOT\\CIMV2"); + hres = pLoc->ConnectServer(resource, + NULL, NULL, 0, NULL, 0, 0, &pSvc); + SysFreeString(resource); + if (hres != S_OK) { + pLoc->Release(); + CoUninitialize(); + return false; + } + + hres = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, + NULL, RPC_C_AUTHN_LEVEL_CALL, + RPC_C_IMP_LEVEL_IMPERSONATE, + NULL, EOAC_NONE); + if (hres != S_OK) { + pSvc->Release(); + pLoc->Release(); + CoUninitialize(); + return false; + } + + IEnumWbemClassObject* pEnumerator = NULL; + BSTR lang = SysAllocString(L"WQL"); + BSTR query = SysAllocString(L"SELECT Model FROM Win32_ComputerSystem"); + hres = pSvc->ExecQuery(lang, query, + WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, + NULL, &pEnumerator); + SysFreeString(lang); + SysFreeString(query); + if (hres != S_OK) { + pSvc->Release(); + pLoc->Release(); + CoUninitialize(); + return false; + } + + bool result = false; + IWbemClassObject* pclsObj = NULL; + ULONG uReturn = 0; + hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); + if (uReturn != 0) { + VARIANT vtProp; + hres = pclsObj->Get(L"Model", 0, &vtProp, 0, 0); + if (hres == S_OK) { + if (wcscmp(VM_MODEL, vtProp.bstrVal) == 0) { + result = true; + } + VariantClear(&vtProp); + } + pclsObj->Release(); + } + + pSvc->Release(); + pLoc->Release(); + pEnumerator->Release(); + CoUninitialize(); + + return result; +}