[PATCH 2/2] wbemprox: Map CIM_UINT16 and CIM_UINT32 to VT_I4 by default.

Hans Leidekker hans at codeweavers.com
Thu Sep 19 07:36:34 CDT 2019


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47782
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/wbemprox/builtin.c          | 134 +++++++++++++++----------------
 dlls/wbemprox/class.c            |  13 +--
 dlls/wbemprox/query.c            |  64 +++++++--------
 dlls/wbemprox/tests/query.c      |  97 ++++++++++++----------
 dlls/wbemprox/wbemprox_private.h |   2 -
 5 files changed, 148 insertions(+), 162 deletions(-)

diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index 9ee7762b5b..9d4369bdff 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -441,8 +441,6 @@ static const WCHAR prop_usernameW[] =
     {'U','s','e','r','N','a','m','e',0};
 static const WCHAR prop_uuidW[] =
     {'U','U','I','D',0};
-static const WCHAR prop_varianttypeW[] =
-    {'V','a','r','i','a','n','t','T','y','p','e',0};
 static const WCHAR prop_vendorW[] =
     {'V','e','n','d','o','r',0};
 static const WCHAR prop_versionW[] =
@@ -493,8 +491,8 @@ static const struct column col_bios[] =
     { prop_releasedateW,        CIM_DATETIME|COL_FLAG_DYNAMIC },
     { prop_serialnumberW,       CIM_STRING },
     { prop_smbiosbiosversionW,  CIM_STRING|COL_FLAG_DYNAMIC },
-    { prop_smbiosmajorversionW, CIM_UINT16, VT_I4 },
-    { prop_smbiosminorversionW, CIM_UINT16, VT_I4 },
+    { prop_smbiosmajorversionW, CIM_UINT16 },
+    { prop_smbiosminorversionW, CIM_UINT16 },
     { prop_versionW,            CIM_STRING|COL_FLAG_KEY }
 };
 static const struct column col_cdromdrive[] =
@@ -509,12 +507,12 @@ static const struct column col_compsys[] =
 {
     { prop_descriptionW,          CIM_STRING },
     { prop_domainW,               CIM_STRING },
-    { prop_domainroleW,           CIM_UINT16, VT_I4 },
+    { prop_domainroleW,           CIM_UINT16 },
     { prop_manufacturerW,         CIM_STRING },
     { prop_modelW,                CIM_STRING },
     { prop_nameW,                 CIM_STRING|COL_FLAG_DYNAMIC },
-    { prop_numlogicalprocessorsW, CIM_UINT32, VT_I4 },
-    { prop_numprocessorsW,        CIM_UINT32, VT_I4 },
+    { prop_numlogicalprocessorsW, CIM_UINT32 },
+    { prop_numprocessorsW,        CIM_UINT32 },
     { prop_totalphysicalmemoryW,  CIM_UINT64 },
     { prop_usernameW,             CIM_STRING|COL_FLAG_DYNAMIC }
 };
@@ -544,7 +542,7 @@ static const struct column col_directory[] =
 static const struct column col_diskdrive[] =
 {
     { prop_deviceidW,      CIM_STRING|COL_FLAG_DYNAMIC|COL_FLAG_KEY },
-    { prop_indexW,         CIM_UINT32, VT_I4 },
+    { prop_indexW,         CIM_UINT32 },
     { prop_interfacetypeW, CIM_STRING },
     { prop_manufacturerW,  CIM_STRING },
     { prop_mediatypeW,     CIM_STRING },
@@ -563,8 +561,8 @@ static const struct column col_diskpartition[] =
     { prop_bootableW,       CIM_BOOLEAN },
     { prop_bootpartitionW,  CIM_BOOLEAN },
     { prop_deviceidW,       CIM_STRING|COL_FLAG_DYNAMIC|COL_FLAG_KEY },
-    { prop_diskindexW,      CIM_UINT32, VT_I4 },
-    { prop_indexW,          CIM_UINT32, VT_I4 },
+    { prop_diskindexW,      CIM_UINT32 },
+    { prop_indexW,          CIM_UINT32 },
     { prop_pnpdeviceidW,    CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_sizeW,           CIM_UINT64 },
     { prop_startingoffsetW, CIM_UINT64 },
@@ -579,7 +577,7 @@ static const struct column col_ip4routetable[] =
 static const struct column col_logicaldisk[] =
 {
     { prop_deviceidW,           CIM_STRING|COL_FLAG_DYNAMIC|COL_FLAG_KEY },
-    { prop_drivetypeW,          CIM_UINT32, VT_I4 },
+    { prop_drivetypeW,          CIM_UINT32 },
     { prop_filesystemW,         CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_freespaceW,          CIM_UINT64 },
     { prop_nameW,               CIM_STRING|COL_FLAG_DYNAMIC },
@@ -595,15 +593,15 @@ static const struct column col_logicaldisktopartition[] =
 static const struct column col_networkadapter[] =
 {
     { prop_adaptertypeW,         CIM_STRING },
-    { prop_adaptertypeidW,       CIM_UINT16, VT_I4 },
+    { prop_adaptertypeidW,       CIM_UINT16 },
     { prop_descriptionW,         CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_deviceidW,            CIM_STRING|COL_FLAG_DYNAMIC|COL_FLAG_KEY },
-    { prop_indexW,               CIM_UINT32, VT_I4 },
-    { prop_interfaceindexW,      CIM_UINT32, VT_I4 },
+    { prop_indexW,               CIM_UINT32 },
+    { prop_interfaceindexW,      CIM_UINT32 },
     { prop_macaddressW,          CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_manufacturerW,        CIM_STRING },
     { prop_nameW,                CIM_STRING|COL_FLAG_DYNAMIC },
-    { prop_netconnectionstatusW, CIM_UINT16, VT_I4 },
+    { prop_netconnectionstatusW, CIM_UINT16 },
     { prop_physicaladapterW,     CIM_BOOLEAN },
     { prop_pnpdeviceidW,         CIM_STRING },
     { prop_speedW,               CIM_UINT64 }
@@ -615,9 +613,9 @@ static const struct column col_networkadapterconfig[] =
     { prop_dhcpenabledW,          CIM_BOOLEAN },
     { prop_dnshostnameW,          CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_dnsserversearchorderW, CIM_STRING|CIM_FLAG_ARRAY|COL_FLAG_DYNAMIC },
-    { prop_indexW,                CIM_UINT32|COL_FLAG_KEY, VT_I4 },
+    { prop_indexW,                CIM_UINT32|COL_FLAG_KEY },
     { prop_ipaddressW,            CIM_STRING|CIM_FLAG_ARRAY|COL_FLAG_DYNAMIC },
-    { prop_ipconnectionmetricW,   CIM_UINT32, VT_I4 },
+    { prop_ipconnectionmetricW,   CIM_UINT32 },
     { prop_ipenabledW,            CIM_BOOLEAN },
     { prop_ipsubnet,              CIM_STRING|CIM_FLAG_ARRAY|COL_FLAG_DYNAMIC },
     { prop_macaddressW,           CIM_STRING|COL_FLAG_DYNAMIC },
@@ -639,16 +637,16 @@ static const struct column col_operatingsystem[] =
     { prop_localeW,                 CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_manufacturerW,           CIM_STRING },
     { prop_nameW,                   CIM_STRING|COL_FLAG_DYNAMIC },
-    { prop_operatingsystemskuW,     CIM_UINT32, VT_I4 },
+    { prop_operatingsystemskuW,     CIM_UINT32 },
     { prop_osarchitectureW,         CIM_STRING },
-    { prop_oslanguageW,             CIM_UINT32, VT_I4 },
-    { prop_osproductsuiteW,         CIM_UINT32, VT_I4 },
-    { prop_ostypeW,                 CIM_UINT16, VT_I4 },
+    { prop_oslanguageW,             CIM_UINT32 },
+    { prop_osproductsuiteW,         CIM_UINT32 },
+    { prop_ostypeW,                 CIM_UINT16 },
     { prop_primaryW,                CIM_BOOLEAN },
     { prop_serialnumberW,           CIM_STRING },
-    { prop_servicepackmajorW,       CIM_UINT16, VT_I4 },
-    { prop_servicepackminorW,       CIM_UINT16, VT_I4 },
-    { prop_suitemaskW,              CIM_UINT32, VT_I4 },
+    { prop_servicepackmajorW,       CIM_UINT16 },
+    { prop_servicepackminorW,       CIM_UINT16 },
+    { prop_suitemaskW,              CIM_UINT32 },
     { prop_systemdirectoryW,        CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_systemdriveW,            CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_totalvirtualmemorysizeW, CIM_UINT64 },
@@ -662,7 +660,6 @@ static const struct column col_param[] =
     { prop_directionW,    CIM_SINT32 },
     { prop_parameterW,    CIM_STRING },
     { prop_typeW,         CIM_UINT32 },
-    { prop_varianttypeW,  CIM_UINT32 },
     { prop_defaultvalueW, CIM_UINT32 }
 };
 static const struct column col_physicalmedia[] =
@@ -673,9 +670,9 @@ static const struct column col_physicalmedia[] =
 static const struct column col_physicalmemory[] =
 {
     { prop_capacityW,             CIM_UINT64 },
-    { prop_configuredclockspeedW, CIM_UINT32, VT_I4 },
+    { prop_configuredclockspeedW, CIM_UINT32 },
     { prop_devicelocatorW,        CIM_STRING },
-    { prop_memorytypeW,           CIM_UINT16, VT_I4 },
+    { prop_memorytypeW,           CIM_UINT16 },
     { prop_partnumberW,           CIM_STRING }
 };
 static const struct column col_pnpentity[] =
@@ -701,33 +698,33 @@ static const struct column col_process[] =
     { prop_descriptionW,    CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_handleW,         CIM_STRING|COL_FLAG_DYNAMIC|COL_FLAG_KEY },
     { prop_nameW,           CIM_STRING|COL_FLAG_DYNAMIC },
-    { prop_pprocessidW,     CIM_UINT32, VT_I4 },
-    { prop_processidW,      CIM_UINT32, VT_I4 },
-    { prop_threadcountW,    CIM_UINT32, VT_I4 },
+    { prop_pprocessidW,     CIM_UINT32 },
+    { prop_processidW,      CIM_UINT32 },
+    { prop_threadcountW,    CIM_UINT32 },
     { prop_workingsetsizeW, CIM_UINT64 },
     /* methods */
     { method_getownerW,     CIM_FLAG_ARRAY|COL_FLAG_METHOD }
 };
 static const struct column col_processor[] =
 {
-    { prop_addresswidthW,         CIM_UINT16, VT_I4 },
-    { prop_architectureW,         CIM_UINT16, VT_I4 },
+    { prop_addresswidthW,         CIM_UINT16 },
+    { prop_architectureW,         CIM_UINT16 },
     { prop_captionW,              CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_cpustatusW,            CIM_UINT16 },
-    { prop_currentclockspeedW,    CIM_UINT32, VT_I4 },
-    { prop_datawidthW,            CIM_UINT16, VT_I4 },
+    { prop_currentclockspeedW,    CIM_UINT32 },
+    { prop_datawidthW,            CIM_UINT16 },
     { prop_descriptionW,          CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_deviceidW,             CIM_STRING|COL_FLAG_DYNAMIC|COL_FLAG_KEY },
-    { prop_familyW,               CIM_UINT16, VT_I4 },
-    { prop_levelW,                CIM_UINT16, VT_I4 },
+    { prop_familyW,               CIM_UINT16 },
+    { prop_levelW,                CIM_UINT16 },
     { prop_manufacturerW,         CIM_STRING|COL_FLAG_DYNAMIC },
-    { prop_maxclockspeedW,        CIM_UINT32, VT_I4 },
+    { prop_maxclockspeedW,        CIM_UINT32 },
     { prop_nameW,                 CIM_STRING|COL_FLAG_DYNAMIC },
-    { prop_numcoresW,             CIM_UINT32, VT_I4 },
-    { prop_numlogicalprocessorsW, CIM_UINT32, VT_I4 },
+    { prop_numcoresW,             CIM_UINT32 },
+    { prop_numlogicalprocessorsW, CIM_UINT32 },
     { prop_processoridW,          CIM_STRING|COL_FLAG_DYNAMIC },
-    { prop_processortypeW,        CIM_UINT16, VT_I4 },
-    { prop_revisionW,             CIM_UINT16, VT_I4 },
+    { prop_processortypeW,        CIM_UINT16 },
+    { prop_revisionW,             CIM_UINT16 },
     { prop_uniqueidW,             CIM_STRING },
     { prop_versionW,              CIM_STRING|COL_FLAG_DYNAMIC }
 };
@@ -771,7 +768,7 @@ static const struct column col_sounddevice[] =
 {
     { prop_nameW,        CIM_STRING },
     { prop_productnameW, CIM_STRING },
-    { prop_statusinfoW,  CIM_UINT16, VT_I4 }
+    { prop_statusinfoW,  CIM_UINT16 }
 };
 static const struct column col_stdregprov[] =
 {
@@ -783,7 +780,7 @@ static const struct column col_stdregprov[] =
 static const struct column col_systemenclosure[] =
 {
     { prop_captionW,      CIM_STRING },
-    { prop_chassistypesW, CIM_UINT16|CIM_FLAG_ARRAY|COL_FLAG_DYNAMIC, VT_I4|VT_ARRAY },
+    { prop_chassistypesW, CIM_UINT16|CIM_FLAG_ARRAY|COL_FLAG_DYNAMIC|VT_ARRAY },
     { prop_descriptionW,  CIM_STRING },
     { prop_lockpresentW,  CIM_BOOLEAN },
     { prop_manufacturerW, CIM_STRING|COL_FLAG_DYNAMIC },
@@ -798,15 +795,15 @@ static const struct column col_systemsecurity[] =
 static const struct column col_videocontroller[] =
 {
     { prop_adapterdactypeW,         CIM_STRING },
-    { prop_adapterramW,             CIM_UINT32, VT_I4 },
+    { prop_adapterramW,             CIM_UINT32 },
     { prop_availabilityW,           CIM_UINT16 },
     { prop_captionW,                CIM_STRING|COL_FLAG_DYNAMIC },
-    { prop_configmanagererrorcodeW, CIM_UINT32, VT_I4 },
-    { prop_currentbitsperpixelW,    CIM_UINT32, VT_I4 },
-    { prop_currenthorizontalresW,   CIM_UINT32, VT_I4 },
-    { prop_currentrefreshrateW,     CIM_UINT32, VT_I4 },
-    { prop_currentscanmodeW,        CIM_UINT16, VT_I4 },
-    { prop_currentverticalresW,     CIM_UINT32, VT_I4 },
+    { prop_configmanagererrorcodeW, CIM_UINT32 },
+    { prop_currentbitsperpixelW,    CIM_UINT32 },
+    { prop_currenthorizontalresW,   CIM_UINT32 },
+    { prop_currentrefreshrateW,     CIM_UINT32 },
+    { prop_currentscanmodeW,        CIM_UINT16 },
+    { prop_currentverticalresW,     CIM_UINT32 },
     { prop_descriptionW,            CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_deviceidW,               CIM_STRING|COL_FLAG_KEY },
     { prop_driverdateW,             CIM_DATETIME },
@@ -815,8 +812,8 @@ static const struct column col_videocontroller[] =
     { prop_nameW,                   CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_pnpdeviceidW,            CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_statusW,                 CIM_STRING },
-    { prop_videoarchitectureW,      CIM_UINT16, VT_I4 },
-    { prop_videomemorytypeW,        CIM_UINT16, VT_I4 },
+    { prop_videoarchitectureW,      CIM_UINT16 },
+    { prop_videomemorytypeW,        CIM_UINT16 },
     { prop_videomodedescriptionW,   CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_videoprocessorW,         CIM_STRING|COL_FLAG_DYNAMIC },
 };
@@ -828,7 +825,7 @@ static const struct column col_winsat[] =
     { prop_graphicsscoreW,         CIM_REAL32 },
     { prop_memoryscoreW,           CIM_REAL32 },
     { prop_timetakenW,             CIM_STRING|COL_FLAG_KEY },
-    { prop_winsatassessmentstateW, CIM_UINT32, VT_I4 },
+    { prop_winsatassessmentstateW, CIM_UINT32 },
     { prop_winsprlevelW,           CIM_REAL32 },
 };
 
@@ -1125,7 +1122,6 @@ struct record_param
     INT32        direction;
     const WCHAR *parameter;
     UINT32       type;
-    UINT32       varianttype;
     UINT32       defaultvalue;
 };
 struct record_physicalmedia
@@ -1303,34 +1299,34 @@ static const struct record_associator data_associator[] =
 };
 static const struct record_param data_param[] =
 {
-    { class_processW, method_getownerW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
+    { class_processW, method_getownerW, -1, param_returnvalueW, CIM_UINT32 },
     { class_processW, method_getownerW, -1, param_userW, CIM_STRING },
     { class_processW, method_getownerW, -1, param_domainW, CIM_STRING },
-    { class_serviceW, method_pauseserviceW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
-    { class_serviceW, method_resumeserviceW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
-    { class_serviceW, method_startserviceW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
-    { class_serviceW, method_stopserviceW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
-    { class_stdregprovW, method_createkeyW, 1, param_defkeyW, CIM_SINT32, 0, 0x80000002 },
+    { class_serviceW, method_pauseserviceW, -1, param_returnvalueW, CIM_UINT32 },
+    { class_serviceW, method_resumeserviceW, -1, param_returnvalueW, CIM_UINT32 },
+    { class_serviceW, method_startserviceW, -1, param_returnvalueW, CIM_UINT32 },
+    { class_serviceW, method_stopserviceW, -1, param_returnvalueW, CIM_UINT32 },
+    { class_stdregprovW, method_createkeyW, 1, param_defkeyW, CIM_SINT32, 0x80000002 },
     { class_stdregprovW, method_createkeyW, 1, param_subkeynameW, CIM_STRING },
-    { class_stdregprovW, method_createkeyW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
-    { class_stdregprovW, method_enumkeyW, 1, param_defkeyW, CIM_SINT32, 0, 0x80000002 },
+    { class_stdregprovW, method_createkeyW, -1, param_returnvalueW, CIM_UINT32 },
+    { class_stdregprovW, method_enumkeyW, 1, param_defkeyW, CIM_SINT32, 0x80000002 },
     { class_stdregprovW, method_enumkeyW, 1, param_subkeynameW, CIM_STRING },
-    { class_stdregprovW, method_enumkeyW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
+    { class_stdregprovW, method_enumkeyW, -1, param_returnvalueW, CIM_UINT32 },
     { class_stdregprovW, method_enumkeyW, -1, param_namesW, CIM_STRING|CIM_FLAG_ARRAY },
-    { class_stdregprovW, method_enumvaluesW, 1, param_defkeyW, CIM_SINT32, 0, 0x80000002 },
+    { class_stdregprovW, method_enumvaluesW, 1, param_defkeyW, CIM_SINT32, 0x80000002 },
     { class_stdregprovW, method_enumvaluesW, 1, param_subkeynameW, CIM_STRING },
-    { class_stdregprovW, method_enumvaluesW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
+    { class_stdregprovW, method_enumvaluesW, -1, param_returnvalueW, CIM_UINT32 },
     { class_stdregprovW, method_enumvaluesW, -1, param_namesW, CIM_STRING|CIM_FLAG_ARRAY },
     { class_stdregprovW, method_enumvaluesW, -1, param_typesW, CIM_SINT32|CIM_FLAG_ARRAY },
-    { class_stdregprovW, method_getstringvalueW, 1, param_defkeyW, CIM_SINT32, 0, 0x80000002 },
+    { class_stdregprovW, method_getstringvalueW, 1, param_defkeyW, CIM_SINT32, 0x80000002 },
     { class_stdregprovW, method_getstringvalueW, 1, param_subkeynameW, CIM_STRING },
     { class_stdregprovW, method_getstringvalueW, 1, param_valuenameW, CIM_STRING },
-    { class_stdregprovW, method_getstringvalueW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
+    { class_stdregprovW, method_getstringvalueW, -1, param_returnvalueW, CIM_UINT32 },
     { class_stdregprovW, method_getstringvalueW, -1, param_valueW, CIM_STRING },
-    { class_systemsecurityW, method_getsdW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
+    { class_systemsecurityW, method_getsdW, -1, param_returnvalueW, CIM_UINT32 },
     { class_systemsecurityW, method_getsdW, -1, param_sdW, CIM_UINT8|CIM_FLAG_ARRAY },
     { class_systemsecurityW, method_setsdW, 1, param_sdW, CIM_UINT8|CIM_FLAG_ARRAY },
-    { class_systemsecurityW, method_setsdW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
+    { class_systemsecurityW, method_setsdW, -1, param_returnvalueW, CIM_UINT32 },
 };
 
 #define FLAVOR_ID (WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE | WBEM_FLAVOR_NOT_OVERRIDABLE |\
diff --git a/dlls/wbemprox/class.c b/dlls/wbemprox/class.c
index 5f8dcea10d..3ee5771e6b 100644
--- a/dlls/wbemprox/class.c
+++ b/dlls/wbemprox/class.c
@@ -227,7 +227,6 @@ static struct record *create_record( struct table *table )
     for (i = 0; i < table->num_cols; i++)
     {
         record->fields[i].type    = table->columns[i].type;
-        record->fields[i].vartype = table->columns[i].vartype;
         record->fields[i].u.ival  = 0;
     }
     record->count = table->num_cols;
@@ -347,13 +346,13 @@ static HRESULT WINAPI class_object_GetQualifierSet(
 
 static HRESULT record_get_value( const struct record *record, UINT index, VARIANT *var, CIMTYPE *type )
 {
-    VARTYPE vartype = record->fields[index].vartype;
+    VARTYPE vartype = to_vartype( record->fields[index].type & CIM_TYPE_MASK );
 
     if (type) *type = record->fields[index].type;
 
     if (record->fields[index].type & CIM_FLAG_ARRAY)
     {
-        V_VT( var ) = vartype ? vartype : to_vartype( record->fields[index].type & CIM_TYPE_MASK ) | VT_ARRAY;
+        V_VT( var ) = vartype | VT_ARRAY;
         V_ARRAY( var ) = to_safearray( record->fields[index].u.aval, record->fields[index].type & CIM_TYPE_MASK );
         return S_OK;
     }
@@ -362,15 +361,12 @@ static HRESULT record_get_value( const struct record *record, UINT index, VARIAN
     case CIM_STRING:
     case CIM_DATETIME:
     case CIM_REFERENCE:
-        if (!vartype) vartype = VT_BSTR;
         V_BSTR( var ) = SysAllocString( record->fields[index].u.sval );
         break;
     case CIM_SINT32:
-        if (!vartype) vartype = VT_I4;
         V_I4( var ) = record->fields[index].u.ival;
         break;
     case CIM_UINT32:
-        if (!vartype) vartype = VT_UI4;
         V_UI4( var ) = record->fields[index].u.ival;
         break;
     default:
@@ -735,7 +731,6 @@ static HRESULT create_signature_columns_and_data( IEnumWbemClassObject *iter, UI
 {
     static const WCHAR parameterW[] = {'P','a','r','a','m','e','t','e','r',0};
     static const WCHAR typeW[] = {'T','y','p','e',0};
-    static const WCHAR varianttypeW[] = {'V','a','r','i','a','n','t','T','y','p','e',0};
     static const WCHAR defaultvalueW[] = {'D','e','f','a','u','l','t','V','a','l','u','e',0};
     struct column *columns;
     BYTE *row;
@@ -764,10 +759,6 @@ static HRESULT create_signature_columns_and_data( IEnumWbemClassObject *iter, UI
         if (hr != S_OK) goto error;
         columns[i].type = V_UI4( &val );
 
-        hr = IWbemClassObject_Get( param, varianttypeW, 0, &val, NULL, NULL );
-        if (hr != S_OK) goto error;
-        columns[i].vartype = V_UI4( &val );
-
         hr = IWbemClassObject_Get( param, defaultvalueW, 0, &val, NULL, NULL );
         if (hr != S_OK) goto error;
         if (V_UI4( &val )) set_default_value( columns[i].type, V_UI4( &val ), row + offset );
diff --git a/dlls/wbemprox/query.c b/dlls/wbemprox/query.c
index b60ad956b3..0f43412473 100644
--- a/dlls/wbemprox/query.c
+++ b/dlls/wbemprox/query.c
@@ -1025,18 +1025,25 @@ VARTYPE to_vartype( CIMTYPE type )
 {
     switch (type)
     {
-    case CIM_BOOLEAN:  return VT_BOOL;
+    case CIM_BOOLEAN:   return VT_BOOL;
+
     case CIM_STRING:
     case CIM_REFERENCE:
-    case CIM_DATETIME: return VT_BSTR;
-    case CIM_SINT8:    return VT_I1;
-    case CIM_UINT8:    return VT_UI1;
-    case CIM_SINT16:   return VT_I2;
-    case CIM_UINT16:   return VT_UI2;
-    case CIM_SINT32:   return VT_I4;
-    case CIM_UINT32:   return VT_UI4;
-    case CIM_SINT64:   return VT_I8;
-    case CIM_UINT64:   return VT_UI8;
+    case CIM_DATETIME:  return VT_BSTR;
+
+    case CIM_SINT8:     return VT_I1;
+    case CIM_UINT8:     return VT_UI1;
+    case CIM_SINT16:    return VT_I2;
+
+    case CIM_UINT16:
+    case CIM_SINT32:
+    case CIM_UINT32:    return VT_I4;
+
+    case CIM_SINT64:    return VT_I8;
+    case CIM_UINT64:    return VT_UI8;
+
+    case CIM_REAL32:    return VT_R4;
+
     default:
         ERR("unhandled type %u\n", type);
         break;
@@ -1044,10 +1051,10 @@ VARTYPE to_vartype( CIMTYPE type )
     return 0;
 }
 
-SAFEARRAY *to_safearray( const struct array *array, CIMTYPE type )
+SAFEARRAY *to_safearray( const struct array *array, CIMTYPE basetype )
 {
     SAFEARRAY *ret;
-    VARTYPE vartype = to_vartype( type );
+    VARTYPE vartype = to_vartype( basetype );
     LONG i;
 
     if (!array || !(ret = SafeArrayCreateVector( vartype, 0, array->count ))) return NULL;
@@ -1187,23 +1194,20 @@ HRESULT get_propval( const struct view *view, UINT index, const WCHAR *name, VAR
 
     if (!ret) return S_OK;
 
-    vartype = table->columns[column].vartype;
+    vartype = to_vartype( table->columns[column].type & CIM_TYPE_MASK );
     if (table->columns[column].type & CIM_FLAG_ARRAY)
     {
         CIMTYPE basetype = table->columns[column].type & CIM_TYPE_MASK;
 
         val_ptr = to_safearray( (const struct array *)(INT_PTR)val, basetype );
         if (!val_ptr) vartype = VT_NULL;
-        else if (!vartype) vartype = to_vartype( basetype ) | VT_ARRAY;
+        else vartype |= VT_ARRAY;
         set_variant( vartype, val, val_ptr, ret );
         return S_OK;
     }
 
     switch (table->columns[column].type & COL_TYPE_MASK)
     {
-    case CIM_BOOLEAN:
-        if (!vartype) vartype = VT_BOOL;
-        break;
     case CIM_STRING:
     case CIM_REFERENCE:
     case CIM_DATETIME:
@@ -1215,24 +1219,6 @@ HRESULT get_propval( const struct view *view, UINT index, const WCHAR *name, VAR
         else
             vartype = VT_NULL;
         break;
-    case CIM_SINT8:
-        if (!vartype) vartype = VT_I1;
-        break;
-    case CIM_UINT8:
-        if (!vartype) vartype = VT_UI1;
-        break;
-    case CIM_SINT16:
-        if (!vartype) vartype = VT_I2;
-        break;
-    case CIM_UINT16:
-        if (!vartype) vartype = VT_UI2;
-        break;
-    case CIM_SINT32:
-        if (!vartype) vartype = VT_I4;
-        break;
-    case CIM_UINT32:
-        if (!vartype) vartype = VT_UI4;
-        break;
     case CIM_SINT64:
         vartype = VT_BSTR;
         val_ptr = get_value_bstr( table, row, column );
@@ -1241,8 +1227,14 @@ HRESULT get_propval( const struct view *view, UINT index, const WCHAR *name, VAR
         vartype = VT_BSTR;
         val_ptr = get_value_bstr( table, row, column );
         break;
+    case CIM_BOOLEAN:
+    case CIM_SINT8:
+    case CIM_UINT8:
+    case CIM_SINT16:
+    case CIM_UINT16:
+    case CIM_SINT32:
+    case CIM_UINT32:
     case CIM_REAL32:
-        if (!vartype) vartype = VT_R4;
         break;
     default:
         ERR("unhandled column type %u\n", table->columns[column].type);
diff --git a/dlls/wbemprox/tests/query.c b/dlls/wbemprox/tests/query.c
index d2fe9dbad8..2bdafde01d 100644
--- a/dlls/wbemprox/tests/query.c
+++ b/dlls/wbemprox/tests/query.c
@@ -216,22 +216,54 @@ static void test_associators( IWbemServices *services )
     }
 }
 
+static void _check_property( ULONG line, IWbemClassObject *obj, const WCHAR *prop, VARTYPE vartype, CIMTYPE cimtype )
+{
+    CIMTYPE type = 0xdeadbeef;
+    VARIANT val;
+    HRESULT hr;
+
+    VariantInit( &val );
+    hr = IWbemClassObject_Get( obj, prop, 0, &val, &type, NULL );
+    ok( hr == S_OK, "%u: failed to get description %08x\n", line, hr );
+    ok( V_VT( &val ) == vartype, "%u: unexpected variant type 0x%x\n", line, V_VT(&val) );
+    ok( type == cimtype, "%u: unexpected type 0x%x\n", line, type );
+    switch (V_VT(&val))
+    {
+    case VT_BSTR:
+        trace( "%s: %s\n", wine_dbgstr_w(prop), wine_dbgstr_w(V_BSTR(&val)) );
+        break;
+    case VT_I2:
+        trace( "%s: %d\n", wine_dbgstr_w(prop), V_I2(&val) );
+        break;
+    case VT_I4:
+        trace( "%s: %d\n", wine_dbgstr_w(prop), V_I4(&val) );
+        break;
+    case VT_R4:
+        trace( "%s: %f\n", wine_dbgstr_w(prop), V_R4(&val) );
+        break;
+    default:
+        break;
+    }
+    VariantClear( &val );
+}
+#define check_property(a,b,c,d) _check_property(__LINE__,a,b,c,d)
+
 static void test_Win32_Service( IWbemServices *services )
 {
-    static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
     static const WCHAR pauseserviceW[] = {'P','a','u','s','e','S','e','r','v','i','c','e',0};
+    static const WCHAR processidW[] = {'P','r','o','c','e','s','s','I','D',0};
     static const WCHAR resumeserviceW[] = {'R','e','s','u','m','e','S','e','r','v','i','c','e',0};
+    static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
+    static const WCHAR serviceW[] = {'W','i','n','3','2','_','S','e','r','v','i','c','e','.',
+        'N','a','m','e','=','"','S','p','o','o','l','e','r','"',0};
     static const WCHAR startserviceW[] = {'S','t','a','r','t','S','e','r','v','i','c','e',0};
-    static const WCHAR stopserviceW[] = {'S','t','o','p','S','e','r','v','i','c','e',0};
     static const WCHAR stateW[] = {'S','t','a','t','e',0};
     static const WCHAR stoppedW[] = {'S','t','o','p','p','e','d',0};
-    static const WCHAR serviceW[] = {'W','i','n','3','2','_','S','e','r','v','i','c','e','.',
-        'N','a','m','e','=','"','S','p','o','o','l','e','r','"',0};
+    static const WCHAR stopserviceW[] = {'S','t','o','p','S','e','r','v','i','c','e',0};
     static const WCHAR emptyW[] = {0};
     BSTR class = SysAllocString( serviceW ), empty = SysAllocString( emptyW ), method;
     IWbemClassObject *service, *out;
     VARIANT state, retval;
-    CIMTYPE type;
     HRESULT hr;
 
     hr = IWbemServices_GetObject( services, class, 0, NULL, &service, NULL );
@@ -240,12 +272,9 @@ static void test_Win32_Service( IWbemServices *services )
         win_skip( "Win32_Service not available\n" );
         goto out;
     }
-    type = 0xdeadbeef;
-    VariantInit( &state );
-    hr = IWbemClassObject_Get( service, stateW, 0, &state, &type, NULL );
-    ok( hr == S_OK, "failed to get service state %08x\n", hr );
-    ok( V_VT( &state ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &state ) );
-    ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
+
+    check_property( service, processidW, VT_I4, CIM_UINT32 );
+    check_property( service, stateW, VT_BSTR, CIM_STRING );
 
     if (!lstrcmpW( V_BSTR( &state ), stoppedW ))
     {
@@ -317,38 +346,6 @@ out:
     SysFreeString( class );
 }
 
-static void _check_property( ULONG line, IWbemClassObject *obj, const WCHAR *prop, VARTYPE vartype, CIMTYPE cimtype )
-{
-    CIMTYPE type = 0xdeadbeef;
-    VARIANT val;
-    HRESULT hr;
-
-    VariantInit( &val );
-    hr = IWbemClassObject_Get( obj, prop, 0, &val, &type, NULL );
-    ok( hr == S_OK, "%u: failed to get description %08x\n", line, hr );
-    ok( V_VT( &val ) == vartype, "%u: unexpected variant type 0x%x\n", line, V_VT(&val) );
-    ok( type == cimtype, "%u: unexpected type 0x%x\n", line, type );
-    switch (V_VT(&val))
-    {
-    case VT_BSTR:
-        trace( "%s: %s\n", wine_dbgstr_w(prop), wine_dbgstr_w(V_BSTR(&val)) );
-        break;
-    case VT_I2:
-        trace( "%s: %d\n", wine_dbgstr_w(prop), V_I2(&val) );
-        break;
-    case VT_I4:
-        trace( "%s: %d\n", wine_dbgstr_w(prop), V_I4(&val) );
-        break;
-    case VT_R4:
-        trace( "%s: %f\n", wine_dbgstr_w(prop), V_R4(&val) );
-        break;
-    default:
-        break;
-    }
-    VariantClear( &val );
-}
-#define check_property(a,b,c,d) _check_property(__LINE__,a,b,c,d)
-
 static void test_Win32_Bios( IWbemServices *services )
 {
     static const WCHAR queryW[] =
@@ -1414,6 +1411,8 @@ static void test_Win32_Processor( IWbemServices *services )
         {'A','r','c','h','i','t','e','c','t','u','r','e',0};
     static const WCHAR captionW[] =
         {'C','a','p','t','i','o','n',0};
+    static const WCHAR cpustatusW[] =
+        {'C','p','u','S','t','a','t','u','s',0};
     static const WCHAR familyW[] =
         {'F','a','m','i','l','y',0};
     static const WCHAR levelW[] =
@@ -1451,8 +1450,9 @@ static void test_Win32_Processor( IWbemServices *services )
         hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
         if (hr != S_OK) break;
 
-        check_property( obj, captionW, VT_BSTR, CIM_STRING );
         check_property( obj, architectureW, VT_I4, CIM_UINT16 );
+        check_property( obj, captionW, VT_BSTR, CIM_STRING );
+        check_property( obj, cpustatusW, VT_I4, CIM_UINT16 );
         check_property( obj, familyW, VT_I4, CIM_UINT16 );
         check_property( obj, levelW, VT_I4, CIM_UINT16 );
         check_property( obj, manufacturerW, VT_BSTR, CIM_STRING );
@@ -1493,6 +1493,8 @@ static void test_Win32_Processor( IWbemServices *services )
 
 static void test_Win32_VideoController( IWbemServices *services )
 {
+    static const WCHAR availabilityW[] =
+        {'A','v','a','i','l','a','b','i','l','i','t','y',0};
     static const WCHAR configmanagererrorcodeW[] =
         {'C','o','n','f','i','g','M','a','n','a','g','e','r','E','r','r','o','r','C','o','d','e',0};
     static const WCHAR driverdateW[] =
@@ -1524,6 +1526,7 @@ static void test_Win32_VideoController( IWbemServices *services )
         hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
         if (hr != S_OK) break;
 
+        check_property( obj, availabilityW, VT_I4, CIM_UINT16 );
         check_property( obj, configmanagererrorcodeW, VT_I4, CIM_UINT32 );
         check_property( obj, driverdateW, VT_BSTR, CIM_DATETIME );
 
@@ -1547,8 +1550,12 @@ static void test_Win32_VideoController( IWbemServices *services )
 
 static void test_Win32_Printer( IWbemServices *services )
 {
+    static const WCHAR attributesW[] =
+        {'A','t','t','r','i','b','u','t','e','s',0};
     static const WCHAR deviceidW[] =
         {'D','e','v','i','c','e','I','d',0};
+    static const WCHAR horizontalresolutionW[] =
+        {'H','o','r','i','z','o','n','t','a','l','R','e','s','o','l','u','t','i','o','n',0};
     static const WCHAR locationW[] =
         {'L','o','c','a','t','i','o','n',0};
     static const WCHAR portnameW[] =
@@ -1576,7 +1583,9 @@ static void test_Win32_Printer( IWbemServices *services )
         hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
         if (hr != S_OK) break;
 
+        check_property( obj, attributesW, VT_I4, CIM_UINT32 );
         check_property( obj, deviceidW, VT_BSTR, CIM_STRING );
+        check_property( obj, horizontalresolutionW, VT_I4, CIM_UINT32 );
 
         type = 0xdeadbeef;
         memset( &val, 0, sizeof(val) );
diff --git a/dlls/wbemprox/wbemprox_private.h b/dlls/wbemprox/wbemprox_private.h
index 7e61cf5ead..9d39a7c92b 100644
--- a/dlls/wbemprox/wbemprox_private.h
+++ b/dlls/wbemprox/wbemprox_private.h
@@ -89,7 +89,6 @@ struct column
 {
     const WCHAR *name;
     UINT type;
-    VARTYPE vartype; /* 0 for default mapping */
 };
 
 enum fill_status
@@ -132,7 +131,6 @@ struct array
 struct field
 {
     UINT type;
-    VARTYPE vartype; /* 0 for default mapping */
     union
     {
         LONGLONG ival;
-- 
2.20.1




More information about the wine-devel mailing list