On 08/09/2016 08:39 AM, Jason Miesionczek wrote:
---
src/Makefile.am | 1 +
src/hyperv/hyperv_driver.c | 62 ++++++-
src/hyperv/hyperv_driver_2012.c | 299 ++++++++++++++++++++++++++++++++++
src/hyperv/hyperv_driver_2012.h | 55 +++++++
src/hyperv/hyperv_private.h | 4 +
src/hyperv/hyperv_wmi.h | 3 +
src/hyperv/hyperv_wmi_generator.input | 35 +++-
src/hyperv/hyperv_wmi_generator.py | 11 +-
8 files changed, 462 insertions(+), 8 deletions(-)
create mode 100644 src/hyperv/hyperv_driver_2012.c
create mode 100644 src/hyperv/hyperv_driver_2012.h
diff --git a/src/Makefile.am b/src/Makefile.am
index d03e6b0..edc2db3 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -888,6 +888,7 @@ ESX_DRIVER_EXTRA_DIST = \
HYPERV_DRIVER_SOURCES = \
hyperv/hyperv_private.h \
hyperv/hyperv_driver.c hyperv/hyperv_driver.h \
+ hyperv/hyperv_driver_2012.c hyperv/hyperv_driver_2012.h \
hyperv/hyperv_network_driver.c hyperv/hyperv_network_driver.h \
hyperv/hyperv_util.c hyperv/hyperv_util.h \
hyperv/hyperv_wmi.c hyperv/hyperv_wmi.h \
diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
index 716fadb..63baef8 100644
--- a/src/hyperv/hyperv_driver.c
+++ b/src/hyperv/hyperv_driver.c
@@ -30,6 +30,7 @@
#include "virlog.h"
#include "viruuid.h"
#include "hyperv_driver.h"
+#include "hyperv_driver_2012.h"
#include "hyperv_network_driver.h"
#include "hyperv_private.h"
#include "hyperv_util.h"
@@ -65,6 +66,35 @@ hypervFreePrivate(hypervPrivate **priv)
/* Forward declaration of hypervCapsInit */
static virCapsPtr hypervCapsInit(hypervPrivate *priv);
+static virHypervisorDriver hypervHypervisorDriver;
+
+static char *
+hypervNodeGetWindowsVersion(hypervPrivate *priv)
+{
+ virBuffer query = VIR_BUFFER_INITIALIZER;
+ Win32_OperatingSystem *operatingSystem = NULL;
+
+ /* Get Win32_OperatingSystem */
+ virBufferAddLit(&query, WIN32_OPERATINGSYSTEM_WQL_SELECT);
+
+ if (hypervGetWin32OperatingSystemList(priv, &query, &operatingSystem) <
0) {
+ goto cleanup;
+ }
+
+ if (operatingSystem == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Could not get Win32_OperatingSystem"));
+ goto cleanup;
+ }
+
+ return operatingSystem->data->Version;
+
+ cleanup:
+ hypervFreeObject(priv, (hypervObject *) operatingSystem);
+ virBufferFreeAndReset(&query);
+
+ return NULL;
+}
static virDrvOpenStatus
hypervConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
@@ -78,6 +108,9 @@ hypervConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
char *password = NULL;
virBuffer query = VIR_BUFFER_INITIALIZER;
Msvm_ComputerSystem *computerSystem = NULL;
+ Msvm_ComputerSystem_2012 *computerSystem2012 = NULL;
+ char *windowsVersion = NULL;
+ char *hypervVersion = (char *)calloc(4, sizeof(char));
Coverity notes hypervVersion would not be free'd if virCheckFlags
returns failure
virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
In fact each "return" after if statement prior to the VIR_ALLOC(priv)
will elicit the same memory leak
So, let's just "char *hyperVersion = NULL;"
then later on...
@@ -175,6 +208,16 @@ hypervConnectOpen(virConnectPtr conn,
virConnectAuthPtr auth,
/* FIXME: Currently only basic authentication is supported */
wsman_transport_set_auth_method(priv->client, "basic");
+ windowsVersion = hypervNodeGetWindowsVersion(priv);
+ if (windowsVersion == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Could not determine Windows version"));
+ goto cleanup;
+ }
+
+ strncpy(hypervVersion, windowsVersion, 3);
+ priv->hypervVersion = hypervVersion;
+
Consider:
if (VIR_STRNDUP(priv->hyperVersion, windowsVersion, 3) < 0)
and remove hyperVersion altogether.
/* Check if the connection can be established and if the server
has the
* Hyper-V role installed. If the call to hypervGetMsvmComputerSystemList
* succeeds than the connection has been established. If the returned list
@@ -183,15 +226,25 @@ hypervConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
virBufferAddLit(&query, "where ");
virBufferAddLit(&query, MSVM_COMPUTERSYSTEM_WQL_PHYSICAL);
- if (hypervGetMsvmComputerSystemList(priv, &query, &computerSystem) < 0)
- goto cleanup;
+ if (strcmp(priv->hypervVersion, HYPERV_VERSION_2008) == 0) {
You could use STREQ instead
+ if (hypervGetMsvmComputerSystemList(priv, &query,
&computerSystem) < 0)
+ goto cleanup;
+ } else if (strcmp(priv->hypervVersion, HYPERV_VERSION_2012) == 0) {
STREQ
+ if (hypervGetMsvmComputerSystem2012List(priv, &query,
&computerSystem2012) < 0)
+ goto cleanup;
+ }
- if (computerSystem == NULL) {
+ if (computerSystem == NULL && computerSystem2012 == NULL) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("%s is not a Hyper-V server"),
conn->uri->server);
goto cleanup;
}
+ if (computerSystem2012 != NULL) {
+ hypervHypervisorDriver.connectListAllDomains = hypervConnectListAllDomains2012;
+ hypervHypervisorDriver.domainGetState = hypervDomainGetState2012;
+ }
+
/* Setup capabilities */
priv->caps = hypervCapsInit(priv);
if (priv->caps == NULL) {
@@ -209,8 +262,9 @@ hypervConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
hypervFreePrivate(&priv);
VIR_FREE(username);
VIR_FREE(password);
+ free(hypervVersion);
VIR_FREE
hypervFreeObject(priv, (hypervObject *)computerSystem);
-
+ hypervFreeObject(priv, (hypervObject *)computerSystem2012);
return result;
}
diff --git a/src/hyperv/hyperv_driver_2012.c b/src/hyperv/hyperv_driver_2012.c
new file mode 100644
index 0000000..6c2b3b6
--- /dev/null
+++ b/src/hyperv/hyperv_driver_2012.c
@@ -0,0 +1,299 @@
There's no copyright
I did't check what/if the difference was with the non-2012 code, but
instead of cut-copy-paste of entire functions - you really need to
consider what the differences are and set some sort of flag so that you
can make those intelligent decisions at the inflection points... The
whole point of a "priv" buffer is it's private you can set flags in
there you can do hypervisor specific stuff in there...
I think you need to figure a better mechanism than different functions
doing relatively the same thing except for well who knows what because I
didn't compare in depth.
John
+#include "hyperv_driver_2012.h"
+
+static int
+hypervMsvmComputerSystemEnabledStateToDomainState2012(
+ Msvm_ComputerSystem_2012 *computerSystem)
+{
+ switch (computerSystem->data->EnabledState) {
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_UNKNOWN:
+ return VIR_DOMAIN_NOSTATE;
+
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_ENABLED:
+ return VIR_DOMAIN_RUNNING;
+
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_DISABLED:
+ return VIR_DOMAIN_SHUTOFF;
+
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_PAUSED:
+ return VIR_DOMAIN_PAUSED;
+
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_SUSPENDED: /* managed save */
+ return VIR_DOMAIN_SHUTOFF;
+
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_STARTING:
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_SNAPSHOTTING:
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_SAVING:
+ return VIR_DOMAIN_RUNNING;
+
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_STOPPING:
+ return VIR_DOMAIN_SHUTDOWN;
+
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_PAUSING:
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_RESUMING:
+ return VIR_DOMAIN_RUNNING;
+
+ default:
+ return VIR_DOMAIN_NOSTATE;
+ }
+}
+
+static int
+hypervMsvmComputerSystemFromDomain2012(virDomainPtr domain,
+ Msvm_ComputerSystem_2012 **computerSystem)
+{
+ hypervPrivate *priv = domain->conn->privateData;
+ char uuid_string[VIR_UUID_STRING_BUFLEN];
+ virBuffer query = VIR_BUFFER_INITIALIZER;
+
+ if (computerSystem == NULL || *computerSystem != NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid
argument"));
+ return -1;
+ }
+
+ virUUIDFormat(domain->uuid, uuid_string);
+
+ virBufferAddLit(&query, MSVM_COMPUTERSYSTEM_WQL_SELECT);
+ virBufferAddLit(&query, "where ");
+ virBufferAddLit(&query, MSVM_COMPUTERSYSTEM_WQL_VIRTUAL);
+ virBufferAsprintf(&query, "and Name = \"%s\"",
uuid_string);
+
+ if (hypervGetMsvmComputerSystem2012List(priv, &query, computerSystem) < 0)
+ return -1;
+
+ if (*computerSystem == NULL) {
+ virReportError(VIR_ERR_NO_DOMAIN,
+ _("No domain with UUID %s"), uuid_string);
+ return -1;
+ }
+
+ return 0;
+}
+
+static bool
+hypervIsMsvmComputerSystemActive2012(Msvm_ComputerSystem_2012 *computerSystem,
+ bool *in_transition)
+{
+ if (in_transition != NULL)
+ *in_transition = false;
+
+ switch (computerSystem->data->EnabledState) {
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_UNKNOWN:
+ return false;
+
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_ENABLED:
+ return true;
+
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_DISABLED:
+ return false;
+
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_PAUSED:
+ return true;
+
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_SUSPENDED: /* managed save */
+ return false;
+
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_STARTING:
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_SNAPSHOTTING:
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_SAVING:
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_STOPPING:
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_PAUSING:
+ case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_RESUMING:
+ if (in_transition != NULL)
+ *in_transition = true;
+
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+static int
+hypervMsvmComputerSystemToDomain2012(virConnectPtr conn,
+ Msvm_ComputerSystem_2012 *computerSystem,
+ virDomainPtr *domain)
+{
+ unsigned char uuid[VIR_UUID_BUFLEN];
+
+ if (domain == NULL || *domain != NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid
argument"));
+ return -1;
+ }
+
+ if (virUUIDParse(computerSystem->data->Name, uuid) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Could not parse UUID from string '%s'"),
+ computerSystem->data->Name);
+ return -1;
+ }
+
+ *domain = virGetDomain(conn, computerSystem->data->ElementName, uuid);
+
+ if (*domain == NULL)
+ return -1;
+
+ if (hypervIsMsvmComputerSystemActive2012(computerSystem, NULL)) {
+ (*domain)->id = computerSystem->data->ProcessID;
+ } else {
+ (*domain)->id = -1;
+ }
+
+ return 0;
+}
+
+int
+hypervDomainGetState2012(virDomainPtr domain, int *state, int *reason,
+ unsigned int flags)
+{
+ int result = -1;
+ hypervPrivate *priv = domain->conn->privateData;
+ Msvm_ComputerSystem_2012 *computerSystem = NULL;
+
+ virCheckFlags(0, -1);
+
+ if (hypervMsvmComputerSystemFromDomain2012(domain, &computerSystem) < 0)
+ goto cleanup;
+
+ *state = hypervMsvmComputerSystemEnabledStateToDomainState2012(computerSystem);
+
+ if (reason != NULL)
+ *reason = 0;
+
+ result = 0;
+
+ cleanup:
+ hypervFreeObject(priv, (hypervObject *)computerSystem);
+
+ return result;
+}
+
+#define MATCH(FLAG) (flags & (FLAG))
+int
+hypervConnectListAllDomains2012(virConnectPtr conn,
+ virDomainPtr **domains,
+ unsigned int flags)
+{
+ hypervPrivate *priv = conn->privateData;
+ virBuffer query = VIR_BUFFER_INITIALIZER;
+ Msvm_ComputerSystem_2012 *computerSystemList = NULL;
+ Msvm_ComputerSystem_2012 *computerSystem = NULL;
+ size_t ndoms;
+ virDomainPtr domain;
+ virDomainPtr *doms = NULL;
+ int count = 0;
+ int ret = -1;
+ size_t i;
+
+ virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1);
+
+ /* check for filter combinations that return no results:
+ * persistent: all hyperv guests are persistent
+ * snapshot: the driver does not support snapshot management
+ * autostart: the driver does not support autostarting guests
+ */
+ if ((MATCH(VIR_CONNECT_LIST_DOMAINS_TRANSIENT) &&
+ !MATCH(VIR_CONNECT_LIST_DOMAINS_PERSISTENT)) ||
+ (MATCH(VIR_CONNECT_LIST_DOMAINS_AUTOSTART) &&
+ !MATCH(VIR_CONNECT_LIST_DOMAINS_NO_AUTOSTART)) ||
+ (MATCH(VIR_CONNECT_LIST_DOMAINS_HAS_SNAPSHOT) &&
+ !MATCH(VIR_CONNECT_LIST_DOMAINS_NO_SNAPSHOT))) {
+ if (domains && VIR_ALLOC_N(*domains, 1) < 0)
+ goto cleanup;
+
+ ret = 0;
+ goto cleanup;
+ }
+
+ virBufferAddLit(&query, MSVM_COMPUTERSYSTEM_WQL_SELECT);
+ virBufferAddLit(&query, "where ");
+ virBufferAddLit(&query, MSVM_COMPUTERSYSTEM_WQL_VIRTUAL);
+
+ /* construct query with filter depending on flags */
+ if (!(MATCH(VIR_CONNECT_LIST_DOMAINS_ACTIVE) &&
+ MATCH(VIR_CONNECT_LIST_DOMAINS_INACTIVE))) {
+ if (MATCH(VIR_CONNECT_LIST_DOMAINS_ACTIVE)) {
+ virBufferAddLit(&query, "and ");
+ virBufferAddLit(&query, MSVM_COMPUTERSYSTEM_WQL_ACTIVE);
+ }
+
+ if (MATCH(VIR_CONNECT_LIST_DOMAINS_INACTIVE)) {
+ virBufferAddLit(&query, "and ");
+ virBufferAddLit(&query, MSVM_COMPUTERSYSTEM_WQL_INACTIVE);
+ }
+ }
+
+ if (hypervGetMsvmComputerSystem2012List(priv, &query,
+ &computerSystemList) < 0)
+ goto cleanup;
+
+ if (domains) {
+ if (VIR_ALLOC_N(doms, 1) < 0)
+ goto cleanup;
+ ndoms = 1;
+ }
+
+ for (computerSystem = computerSystemList; computerSystem != NULL;
+ computerSystem = computerSystem->next) {
+
+ /* filter by domain state */
+ if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE)) {
+ int st =
hypervMsvmComputerSystemEnabledStateToDomainState2012(computerSystem);
+ if (!((MATCH(VIR_CONNECT_LIST_DOMAINS_RUNNING) &&
+ st == VIR_DOMAIN_RUNNING) ||
+ (MATCH(VIR_CONNECT_LIST_DOMAINS_PAUSED) &&
+ st == VIR_DOMAIN_PAUSED) ||
+ (MATCH(VIR_CONNECT_LIST_DOMAINS_SHUTOFF) &&
+ st == VIR_DOMAIN_SHUTOFF) ||
+ (MATCH(VIR_CONNECT_LIST_DOMAINS_OTHER) &&
+ (st != VIR_DOMAIN_RUNNING &&
+ st != VIR_DOMAIN_PAUSED &&
+ st != VIR_DOMAIN_SHUTOFF))))
+ continue;
+ }
+
+ /* managed save filter */
+ if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_MANAGEDSAVE)) {
+ bool mansave = computerSystem->data->EnabledState ==
+ MSVM_COMPUTERSYSTEM_ENABLEDSTATE_SUSPENDED;
+
+ if (!((MATCH(VIR_CONNECT_LIST_DOMAINS_MANAGEDSAVE) && mansave) ||
+ (MATCH(VIR_CONNECT_LIST_DOMAINS_NO_MANAGEDSAVE) &&
!mansave)))
+ continue;
+ }
+
+ if (!doms) {
+ count++;
+ continue;
+ }
+
+ if (VIR_RESIZE_N(doms, ndoms, count, 2) < 0)
+ goto cleanup;
+
+ domain = NULL;
+
+ if (hypervMsvmComputerSystemToDomain2012(conn, computerSystem,
+ &domain) < 0)
+ goto cleanup;
+
+ doms[count++] = domain;
+ }
+
+ if (doms)
+ *domains = doms;
+ doms = NULL;
+ ret = count;
+
+ cleanup:
+ if (doms) {
+ for (i = 0; i < count; ++i)
+ virObjectUnref(doms[i]);
+
+ VIR_FREE(doms);
+ }
+
+ hypervFreeObject(priv, (hypervObject *)computerSystemList);
+
+ return ret;
+}
+
+#undef MATCH
diff --git a/src/hyperv/hyperv_driver_2012.h b/src/hyperv/hyperv_driver_2012.h
new file mode 100644
index 0000000..45eb15b
--- /dev/null
+++ b/src/hyperv/hyperv_driver_2012.h
@@ -0,0 +1,55 @@
+/*
+ * hyperv_driver.h: core driver functions for managing Microsoft Hyper-V hosts
+ *
+ * Copyright (C) 2011 Matthias Bolte <matthias.bolte(a)googlemail.com>
+ * Copyright (C) 2009 Michael Sievers <msievers83(a)googlemail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <
http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef __HYPERV_DRIVER_2012_H__
+# define __HYPERV_DRIVER_2012_H__
+
+#include <config.h>
+
+#include "internal.h"
+#include "datatypes.h"
+#include "virdomainobjlist.h"
+#include "virauth.h"
+#include "viralloc.h"
+#include "virlog.h"
+#include "viruuid.h"
+#include "hyperv_driver.h"
+#include "hyperv_network_driver.h"
+#include "hyperv_private.h"
+#include "hyperv_util.h"
+#include "hyperv_wmi.h"
+#include "openwsman.h"
+#include "virstring.h"
+#include "virtypedparam.h"
+
+#define VIR_FROM_THIS VIR_FROM_HYPERV
+
+int
+hypervConnectListAllDomains2012(virConnectPtr conn,
+ virDomainPtr **domains,
+ unsigned int flags);
+
+int
+hypervDomainGetState2012(virDomainPtr domain, int *state, int *reason,
+ unsigned int flags);
+
+#endif /* __HYPERV_DRIVER_2012_H__ */
diff --git a/src/hyperv/hyperv_private.h b/src/hyperv/hyperv_private.h
index 2dfce6e..db4e15a 100644
--- a/src/hyperv/hyperv_private.h
+++ b/src/hyperv/hyperv_private.h
@@ -37,6 +37,10 @@ struct _hypervPrivate {
WsManClient *client;
virCapsPtr caps;
virDomainXMLOptionPtr xmlopt;
+ char *hypervVersion;
};
+#define HYPERV_VERSION_2008 "6.1"
+#define HYPERV_VERSION_2012 "6.3"
+
#endif /* __HYPERV_PRIVATE_H__ */
diff --git a/src/hyperv/hyperv_wmi.h b/src/hyperv/hyperv_wmi.h
index 67f45fb..be2f429 100644
--- a/src/hyperv/hyperv_wmi.h
+++ b/src/hyperv/hyperv_wmi.h
@@ -35,6 +35,9 @@
#define ROOT_VIRTUALIZATION \
"http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/*"
+#define ROOT_VIRTUALIZATION_V2 \
+ "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/v2/*"
+
typedef struct _hypervObject hypervObject;
int hyperyVerifyResponse(WsManClient *client, WsXmlDocH response,
diff --git a/src/hyperv/hyperv_wmi_generator.input
b/src/hyperv/hyperv_wmi_generator.input
index 28a5bdc..cf136ca 100644
--- a/src/hyperv/hyperv_wmi_generator.input
+++ b/src/hyperv/hyperv_wmi_generator.input
@@ -55,6 +55,37 @@ class Msvm_ComputerSystem
uint16 AssignedNumaNodeList[]
end
+class Msvm_ComputerSystem_2012
+ string Caption
+ string Description
+ string ElementName
+ datetime InstallDate
+ uint16 OperationalStatus[]
+ string StatusDescriptions[]
+ string Status
+ uint16 HealthState
+ uint16 EnabledState
+ string OtherEnabledState
+ uint16 RequestedState
+ uint16 EnabledDefault
+ datetime TimeOfLastStateChange
+ string CreationClassName
+ string Name
+ string PrimaryOwnerName
+ string PrimaryOwnerContact
+ string Roles[]
+ string NameFormat
+ string OtherIdentifyingInfo[]
+ string IdentifyingDescriptions[]
+ uint16 Dedicated[]
+ string OtherDedicatedDescriptions[]
+ uint16 ResetCapability
+ uint16 PowerManagementCapabilities[]
+ uint64 OnTimeInMilliseconds
+ datetime TimeOfLastConfigurationChange
+ uint32 ProcessID
+ uint16 AssignedNumaNodeList[]
+end
class Msvm_ConcreteJob
string Caption
@@ -196,7 +227,7 @@ class Win32_ComputerSystem
string Caption
uint16 ChassisBootupState
string CreationClassName
- int16 CurrentTimeZone
+# uint16 CurrentTimeZone
boolean DaylightInEffect
string Description
string DNSHostName
@@ -466,7 +497,7 @@ class Win32_OperatingSystem
string CSCreationClassName
string CSDVersion
string CSName
- uint16 CurrentTimeZone
+# uint16 CurrentTimeZone
boolean DataExecutionPrevention_Available
boolean DataExecutionPrevention_32BitApplications
boolean DataExecutionPrevention_Drivers
diff --git a/src/hyperv/hyperv_wmi_generator.py b/src/hyperv/hyperv_wmi_generator.py
index 8384634..ed40a79 100755
--- a/src/hyperv/hyperv_wmi_generator.py
+++ b/src/hyperv/hyperv_wmi_generator.py
@@ -61,6 +61,9 @@ class Class:
def generate_classes_header(self):
name_upper = self.name.upper()
+ class_name = self.name
+ if self.name.endswith("_2012"):
+ class_name = class_name[:-5]
header = separator
header += " * %s\n" % self.name
@@ -70,15 +73,17 @@ class Class:
if self.name.startswith("Win32_") or
self.name.startswith("CIM_DataFile"):
header += "
\"http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/%s\"\n" %
self.name
+ elif self.name.endswith("_2012"):
+ header += "
\"http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/v2/%s\"\n"
% class_name
else:
header += "
\"http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/%s\"\n"
% self.name
header += "\n"
header += "#define %s_CLASSNAME \\\n" % name_upper
- header += " \"%s\"\n" % self.name
+ header += " \"%s\"\n" % class_name
header += "\n"
header += "#define %s_WQL_SELECT \\\n" % name_upper
- header += " \"select * from %s \"\n" % self.name
+ header += " \"select * from %s \"\n" % class_name
header += "\n"
header += "struct _%s_Data {\n" % self.name
@@ -134,6 +139,8 @@ class Class:
if self.name.startswith("Win32_") or
self.name.startswith("CIM_DataFile"):
source += " return hypervEnumAndPull(priv, query,
ROOT_CIMV2,\n"
+ elif self.name.endswith("_2012"):
+ source += " return hypervEnumAndPull(priv, query,
ROOT_VIRTUALIZATION_V2,\n"
else:
source += " return hypervEnumAndPull(priv, query,
ROOT_VIRTUALIZATION,\n"