wbemprox: Add more Win32_Processor properties.

Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Hans Leidekker 2018-02-05 16:08:17 +01:00 committed by Alexandre Julliard
parent bc07327c15
commit 4f640fa9b6
2 changed files with 134 additions and 0 deletions

View File

@ -139,6 +139,8 @@ static const WCHAR prop_adaptertypeW[] =
{'A','d','a','p','t','e','r','T','y','p','e',0}; {'A','d','a','p','t','e','r','T','y','p','e',0};
static const WCHAR prop_addresswidthW[] = static const WCHAR prop_addresswidthW[] =
{'A','d','d','r','e','s','s','W','i','d','t','h',0}; {'A','d','d','r','e','s','s','W','i','d','t','h',0};
static const WCHAR prop_architectureW[] =
{'A','r','c','h','i','t','e','c','t','u','r','e',0};
static const WCHAR prop_attributesW[] = static const WCHAR prop_attributesW[] =
{'A','t','t','r','i','b','u','t','e','s',0}; {'A','t','t','r','i','b','u','t','e','s',0};
static const WCHAR prop_availabilityW[] = static const WCHAR prop_availabilityW[] =
@ -251,6 +253,8 @@ static const WCHAR prop_ipenabledW[] =
{'I','P','E','n','a','b','l','e','d',0}; {'I','P','E','n','a','b','l','e','d',0};
static const WCHAR prop_lastbootuptimeW[] = static const WCHAR prop_lastbootuptimeW[] =
{'L','a','s','t','B','o','o','t','U','p','T','i','m','e',0}; {'L','a','s','t','B','o','o','t','U','p','T','i','m','e',0};
static const WCHAR prop_levelW[] =
{'L','e','v','e','l',0};
static const WCHAR prop_localW[] = static const WCHAR prop_localW[] =
{'L','o','c','a','l',0}; {'L','o','c','a','l',0};
static const WCHAR prop_localdatetimeW[] = static const WCHAR prop_localdatetimeW[] =
@ -321,6 +325,8 @@ static const WCHAR prop_referenceddomainnameW[] =
{'R','e','f','e','r','e','n','c','e','d','D','o','m','a','i','n','N','a','m','e',0}; {'R','e','f','e','r','e','n','c','e','d','D','o','m','a','i','n','N','a','m','e',0};
static const WCHAR prop_releasedateW[] = static const WCHAR prop_releasedateW[] =
{'R','e','l','e','a','s','e','D','a','t','e',0}; {'R','e','l','e','a','s','e','D','a','t','e',0};
static const WCHAR prop_revisionW[] =
{'R','e','v','i','s','i','o','n',0};
static const WCHAR prop_serialnumberW[] = static const WCHAR prop_serialnumberW[] =
{'S','e','r','i','a','l','N','u','m','b','e','r',0}; {'S','e','r','i','a','l','N','u','m','b','e','r',0};
static const WCHAR prop_servicepackmajorW[] = static const WCHAR prop_servicepackmajorW[] =
@ -610,6 +616,7 @@ static const struct column col_process[] =
static const struct column col_processor[] = static const struct column col_processor[] =
{ {
{ prop_addresswidthW, CIM_UINT16, VT_I4 }, { prop_addresswidthW, CIM_UINT16, VT_I4 },
{ prop_architectureW, CIM_UINT16, VT_I4 },
{ prop_captionW, CIM_STRING|COL_FLAG_DYNAMIC }, { prop_captionW, CIM_STRING|COL_FLAG_DYNAMIC },
{ prop_cpustatusW, CIM_UINT16 }, { prop_cpustatusW, CIM_UINT16 },
{ prop_currentclockspeedW, CIM_UINT32, VT_I4 }, { prop_currentclockspeedW, CIM_UINT32, VT_I4 },
@ -617,6 +624,7 @@ static const struct column col_processor[] =
{ prop_descriptionW, CIM_STRING|COL_FLAG_DYNAMIC }, { prop_descriptionW, CIM_STRING|COL_FLAG_DYNAMIC },
{ prop_deviceidW, CIM_STRING|COL_FLAG_DYNAMIC|COL_FLAG_KEY }, { prop_deviceidW, CIM_STRING|COL_FLAG_DYNAMIC|COL_FLAG_KEY },
{ prop_familyW, CIM_UINT16, VT_I4 }, { prop_familyW, CIM_UINT16, VT_I4 },
{ prop_levelW, CIM_UINT16, VT_I4 },
{ prop_manufacturerW, CIM_STRING|COL_FLAG_DYNAMIC }, { prop_manufacturerW, CIM_STRING|COL_FLAG_DYNAMIC },
{ prop_maxclockspeedW, CIM_UINT32, VT_I4 }, { prop_maxclockspeedW, CIM_UINT32, VT_I4 },
{ prop_nameW, CIM_STRING|COL_FLAG_DYNAMIC }, { prop_nameW, CIM_STRING|COL_FLAG_DYNAMIC },
@ -624,6 +632,7 @@ static const struct column col_processor[] =
{ prop_numlogicalprocessorsW, CIM_UINT32, VT_I4 }, { prop_numlogicalprocessorsW, CIM_UINT32, VT_I4 },
{ prop_processoridW, CIM_STRING|COL_FLAG_DYNAMIC }, { prop_processoridW, CIM_STRING|COL_FLAG_DYNAMIC },
{ prop_processortypeW, CIM_UINT16, VT_I4 }, { prop_processortypeW, CIM_UINT16, VT_I4 },
{ prop_revisionW, CIM_UINT16, VT_I4 },
{ prop_uniqueidW, CIM_STRING }, { prop_uniqueidW, CIM_STRING },
{ prop_versionW, CIM_STRING|COL_FLAG_DYNAMIC } { prop_versionW, CIM_STRING|COL_FLAG_DYNAMIC }
}; };
@ -1012,6 +1021,7 @@ struct record_process
struct record_processor struct record_processor
{ {
UINT16 addresswidth; UINT16 addresswidth;
UINT16 architecture;
const WCHAR *caption; const WCHAR *caption;
UINT16 cpu_status; UINT16 cpu_status;
UINT32 currentclockspeed; UINT32 currentclockspeed;
@ -1019,6 +1029,7 @@ struct record_processor
const WCHAR *description; const WCHAR *description;
const WCHAR *device_id; const WCHAR *device_id;
UINT16 family; UINT16 family;
UINT16 level;
const WCHAR *manufacturer; const WCHAR *manufacturer;
UINT32 maxclockspeed; UINT32 maxclockspeed;
const WCHAR *name; const WCHAR *name;
@ -1026,6 +1037,7 @@ struct record_processor
UINT32 num_logical_processors; UINT32 num_logical_processors;
const WCHAR *processor_id; const WCHAR *processor_id;
UINT16 processortype; UINT16 processortype;
UINT16 revision;
const WCHAR *unique_id; const WCHAR *unique_id;
const WCHAR *version; const WCHAR *version;
}; };
@ -2605,6 +2617,12 @@ static void get_processor_version( WCHAR *version )
do_cpuid( 1, regs ); do_cpuid( 1, regs );
sprintfW( version, fmtW, (regs[0] & (15 << 4)) >> 4, regs[0] & 15 ); sprintfW( version, fmtW, (regs[0] & (15 << 4)) >> 4, regs[0] & 15 );
} }
static UINT16 get_processor_revision(void)
{
unsigned int regs[4] = {0, 0, 0, 0};
do_cpuid( 1, regs );
return regs[0];
}
static void get_processor_id( WCHAR *processor_id ) static void get_processor_id( WCHAR *processor_id )
{ {
static const WCHAR fmtW[] = {'%','0','8','X','%','0','8','X',0}; static const WCHAR fmtW[] = {'%','0','8','X','%','0','8','X',0};
@ -2699,6 +2717,7 @@ static enum fill_status fill_processor( struct table *table, const struct expr *
{ {
rec = (struct record_processor *)(table->data + offset); rec = (struct record_processor *)(table->data + offset);
rec->addresswidth = get_osarchitecture() == os_32bitW ? 32 : 64; rec->addresswidth = get_osarchitecture() == os_32bitW ? 32 : 64;
rec->architecture = get_osarchitecture() == os_32bitW ? 0 : 9;
rec->caption = heap_strdupW( caption ); rec->caption = heap_strdupW( caption );
rec->cpu_status = 1; /* CPU Enabled */ rec->cpu_status = 1; /* CPU Enabled */
rec->currentclockspeed = get_processor_currentclockspeed( i ); rec->currentclockspeed = get_processor_currentclockspeed( i );
@ -2707,6 +2726,7 @@ static enum fill_status fill_processor( struct table *table, const struct expr *
sprintfW( device_id, fmtW, i ); sprintfW( device_id, fmtW, i );
rec->device_id = heap_strdupW( device_id ); rec->device_id = heap_strdupW( device_id );
rec->family = 2; /* Unknown */ rec->family = 2; /* Unknown */
rec->level = 15;
rec->manufacturer = heap_strdupW( manufacturer ); rec->manufacturer = heap_strdupW( manufacturer );
rec->maxclockspeed = get_processor_maxclockspeed( i ); rec->maxclockspeed = get_processor_maxclockspeed( i );
rec->name = heap_strdupW( name ); rec->name = heap_strdupW( name );
@ -2714,6 +2734,7 @@ static enum fill_status fill_processor( struct table *table, const struct expr *
rec->num_logical_processors = num_logical_processors; rec->num_logical_processors = num_logical_processors;
rec->processor_id = heap_strdupW( processor_id ); rec->processor_id = heap_strdupW( processor_id );
rec->processortype = 3; /* central processor */ rec->processortype = 3; /* central processor */
rec->revision = get_processor_revision();
rec->unique_id = NULL; rec->unique_id = NULL;
rec->version = heap_strdupW( version ); rec->version = heap_strdupW( version );
if (!match_row( table, i, cond, &status )) if (!match_row( table, i, cond, &status ))

View File

@ -1444,6 +1444,118 @@ static void test_IP4RouteTable( IWbemServices *services )
SysFreeString( wql ); SysFreeString( wql );
} }
static void test_Win32_Processor( IWbemServices *services )
{
static const WCHAR architectureW[] =
{'A','r','c','h','i','t','e','c','t','u','r','e',0};
static const WCHAR familyW[] =
{'F','a','m','i','l','y',0};
static const WCHAR levelW[] =
{'L','e','v','e','l',0};
static const WCHAR manufacturerW[] =
{'M','a','n','u','f','a','c','t','u','r','e','r',0};
static const WCHAR nameW[] =
{'N','a','m','e',0};
static const WCHAR processoridW[] =
{'P','r','o','c','e','s','s','o','r','I','d',0};
static const WCHAR revisionW[] =
{'R','e','v','i','s','i','o','n',0};
static const WCHAR versionW[] =
{'V','e','r','s','i','o','n',0};
static const WCHAR queryW[] =
{'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
'P','r','o','c','e','s','s','o','r',0};
BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
IEnumWbemClassObject *result;
IWbemClassObject *obj;
VARIANT val;
CIMTYPE type;
HRESULT hr;
DWORD count;
hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
ok( hr == S_OK, "got %08x\n", hr );
for (;;)
{
hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
if (hr != S_OK) break;
type = 0xdeadbeef;
VariantInit( &val );
hr = IWbemClassObject_Get( obj, architectureW, 0, &val, &type, NULL );
ok( hr == S_OK, "got %08x\n", hr );
ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
trace( "architecture %u\n", V_I4( &val ) );
type = 0xdeadbeef;
VariantInit( &val );
hr = IWbemClassObject_Get( obj, familyW, 0, &val, &type, NULL );
ok( hr == S_OK, "got %08x\n", hr );
ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
trace( "family %u\n", V_I4( &val ) );
type = 0xdeadbeef;
VariantInit( &val );
hr = IWbemClassObject_Get( obj, levelW, 0, &val, &type, NULL );
ok( hr == S_OK, "got %08x\n", hr );
ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
trace( "level %u\n", V_I4( &val ) );
type = 0xdeadbeef;
VariantInit( &val );
hr = IWbemClassObject_Get( obj, manufacturerW, 0, &val, &type, NULL );
ok( hr == S_OK, "got %08x\n", hr );
ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
trace( "manufacturer %s\n", wine_dbgstr_w(V_BSTR( &val )) );
VariantClear( &val );
type = 0xdeadbeef;
VariantInit( &val );
hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL );
ok( hr == S_OK, "got %08x\n", hr );
ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
trace( "name %s\n", wine_dbgstr_w(V_BSTR( &val )) );
VariantClear( &val );
type = 0xdeadbeef;
VariantInit( &val );
hr = IWbemClassObject_Get( obj, processoridW, 0, &val, &type, NULL );
ok( hr == S_OK, "got %08x\n", hr );
ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
trace( "processorid %s\n", wine_dbgstr_w(V_BSTR( &val )) );
VariantClear( &val );
type = 0xdeadbeef;
VariantInit( &val );
hr = IWbemClassObject_Get( obj, revisionW, 0, &val, &type, NULL );
ok( hr == S_OK, "got %08x\n", hr );
ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
trace( "revision %u\n", V_I4( &val ) );
type = 0xdeadbeef;
VariantInit( &val );
hr = IWbemClassObject_Get( obj, versionW, 0, &val, &type, NULL );
ok( hr == S_OK, "got %08x\n", hr );
ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
trace( "version %s\n", wine_dbgstr_w(V_BSTR( &val )) );
VariantClear( &val );
IWbemClassObject_Release( obj );
}
SysFreeString( query );
SysFreeString( wql );
}
START_TEST(query) START_TEST(query)
{ {
static const WCHAR cimv2W[] = {'R','O','O','T','\\','C','I','M','V','2',0}; static const WCHAR cimv2W[] = {'R','O','O','T','\\','C','I','M','V','2',0};
@ -1485,6 +1597,7 @@ START_TEST(query)
test_ComputerSystemProduct( services ); test_ComputerSystemProduct( services );
test_PhysicalMemory( services ); test_PhysicalMemory( services );
test_IP4RouteTable( services ); test_IP4RouteTable( services );
test_Win32_Processor( services );
SysFreeString( path ); SysFreeString( path );
IWbemServices_Release( services ); IWbemServices_Release( services );