[PATCH 4/5] wbemprox: Fix processor caption on AMD 64-bit.

Hans Leidekker hans at codeweavers.com
Fri Jan 25 03:44:13 CST 2019


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/wbemprox/builtin.c     | 62 +++++++++++++++++++++----------------
 dlls/wbemprox/tests/query.c | 11 +++++++
 2 files changed, 46 insertions(+), 27 deletions(-)

diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index 620d64e2e6..03f6e62562 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -2842,13 +2842,6 @@ void do_cpuid( unsigned int ax, unsigned int *p )
 }
 #endif
 
-static const WCHAR *get_osarchitecture(void)
-{
-    SYSTEM_INFO info;
-    GetNativeSystemInfo( &info );
-    if (info.u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) return os_64bitW;
-    return os_32bitW;
-}
 static unsigned int get_processor_model( unsigned int reg0, unsigned int *stepping, unsigned int *family )
 {
     unsigned int model, family_id = (reg0 & (0x0f << 8)) >> 8;
@@ -2863,6 +2856,32 @@ static unsigned int get_processor_model( unsigned int reg0, unsigned int *steppi
     *stepping = reg0 & 0x0f;
     return model;
 }
+static void regs_to_str( unsigned int *regs, unsigned int len, WCHAR *buffer )
+{
+    unsigned int i;
+    unsigned char *p = (unsigned char *)regs;
+
+    for (i = 0; i < len; i++) { buffer[i] = *p++; }
+    buffer[i] = 0;
+}
+static void get_processor_manufacturer( WCHAR *manufacturer )
+{
+    unsigned int tmp, regs[4] = {0, 0, 0, 0};
+
+    do_cpuid( 0, regs );
+    tmp = regs[2];      /* swap edx and ecx */
+    regs[2] = regs[3];
+    regs[3] = tmp;
+
+    regs_to_str( regs + 1, 12, manufacturer );
+}
+static const WCHAR *get_osarchitecture(void)
+{
+    SYSTEM_INFO info;
+    GetNativeSystemInfo( &info );
+    if (info.u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) return os_64bitW;
+    return os_32bitW;
+}
 static void get_processor_caption( WCHAR *caption )
 {
     static const WCHAR fmtW[] =
@@ -2870,9 +2889,17 @@ static void get_processor_caption( WCHAR *caption )
          'M','o','d','e','l',' ','%','u',' ','S','t','e','p','p','i','n','g',' ','%','u',0};
     static const WCHAR x86W[] = {'x','8','6',0};
     static const WCHAR intel64W[] = {'I','n','t','e','l','6','4',0};
-    const WCHAR *arch = (get_osarchitecture() == os_32bitW) ? x86W : intel64W;
+    static const WCHAR amd64W[] = {'A','M','D','6','4',0};
+    static const WCHAR authenticamdW[] = {'A','u','t','h','e','n','t','i','c','A','M','D',0};
+    const WCHAR *arch;
+    WCHAR manufacturer[13];
     unsigned int regs[4] = {0, 0, 0, 0}, family, model, stepping;
 
+    get_processor_manufacturer( manufacturer );
+    if (get_osarchitecture() == os_32bitW) arch = x86W;
+    else if (!strcmpW( manufacturer, authenticamdW )) arch = amd64W;
+    else arch = intel64W;
+
     do_cpuid( 1, regs );
 
     model = get_processor_model( regs[0], &stepping, &family );
@@ -2903,25 +2930,6 @@ static void get_processor_id( WCHAR *processor_id )
     do_cpuid( 1, regs );
     sprintfW( processor_id, fmtW, regs[3], regs[0] );
 }
-static void regs_to_str( unsigned int *regs, unsigned int len, WCHAR *buffer )
-{
-    unsigned int i;
-    unsigned char *p = (unsigned char *)regs;
-
-    for (i = 0; i < len; i++) { buffer[i] = *p++; }
-    buffer[i] = 0;
-}
-static void get_processor_manufacturer( WCHAR *manufacturer )
-{
-    unsigned int tmp, regs[4] = {0, 0, 0, 0};
-
-    do_cpuid( 0, regs );
-    tmp = regs[2];      /* swap edx and ecx */
-    regs[2] = regs[3];
-    regs[3] = tmp;
-
-    regs_to_str( regs + 1, 12, manufacturer );
-}
 static void get_processor_name( WCHAR *name )
 {
     unsigned int regs[4] = {0, 0, 0, 0};
diff --git a/dlls/wbemprox/tests/query.c b/dlls/wbemprox/tests/query.c
index 0fa6b5e966..82195ebedd 100644
--- a/dlls/wbemprox/tests/query.c
+++ b/dlls/wbemprox/tests/query.c
@@ -1553,6 +1553,8 @@ 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 captionW[] =
+        {'C','a','p','t','i','o','n',0};
     static const WCHAR familyW[] =
         {'F','a','m','i','l','y',0};
     static const WCHAR levelW[] =
@@ -1586,6 +1588,15 @@ static void test_Win32_Processor( IWbemServices *services )
         hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
         if (hr != S_OK) break;
 
+        type = 0xdeadbeef;
+        VariantInit( &val );
+        hr = IWbemClassObject_Get( obj, captionW, 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( "caption %s\n", wine_dbgstr_w(V_BSTR( &val )) );
+        VariantClear( &val );
+
         type = 0xdeadbeef;
         VariantInit( &val );
         hr = IWbemClassObject_Get( obj, architectureW, 0, &val, &type, NULL );
-- 
2.20.1




More information about the wine-devel mailing list