Pengpeng Dong : wbemprox: Implement Win32_SoundDevice.{DeviceID, PNPDeviceID}.

Alexandre Julliard julliard at winehq.org
Thu Oct 29 16:32:08 CDT 2020


Module: wine
Branch: master
Commit: 89698cfae4d9aefd3f77c2982e64f7b98e00edf1
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=89698cfae4d9aefd3f77c2982e64f7b98e00edf1

Author: Pengpeng Dong <dongpengpeng at uniontech.com>
Date:   Thu Oct 29 13:15:48 2020 +0100

wbemprox: Implement Win32_SoundDevice.{DeviceID, PNPDeviceID}.

Signed-off-by: Pengpeng Dong <dongpengpeng at uniontech.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wbemprox/builtin.c | 95 ++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 71 insertions(+), 24 deletions(-)

diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index e35aa069e1d..be22d8d3066 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -376,8 +376,10 @@ static const struct column col_sid[] =
 };
 static const struct column col_sounddevice[] =
 {
+    { L"DeviceID",     CIM_STRING },
     { L"Manufacturer", CIM_STRING },
     { L"Name",         CIM_STRING },
+    { L"PNPDeviceID",  CIM_STRING },
     { L"ProductName",  CIM_STRING },
     { L"Status",       CIM_STRING },
     { L"StatusInfo",   CIM_UINT16 },
@@ -766,8 +768,10 @@ struct record_sid
 };
 struct record_sounddevice
 {
+    const WCHAR *deviceid;
     const WCHAR *manufacturer;
     const WCHAR *name;
+    const WCHAR *pnpdeviceid;
     const WCHAR *productname;
     const WCHAR *status;
     UINT16       statusinfo;
@@ -886,10 +890,7 @@ static const struct record_quickfixengineering data_quickfixengineering[] =
 {
     { L"http://winehq.org", L"KB1234567" },
 };
-static const struct record_sounddevice data_sounddevice[] =
-{
-    { L"The Wine Project", L"Wine Audio Device", L"Wine Audio Device", L"OK", 3 /* enabled */ }
-};
+
 static const struct record_stdregprov data_stdregprov[] =
 {
     { reg_create_key, reg_enum_key, reg_enum_values, reg_get_stringvalue }
@@ -3830,7 +3831,7 @@ static enum fill_status fill_systemenclosure( struct table *table, const struct
     return status;
 }
 
-static WCHAR *get_pnpdeviceid( DXGI_ADAPTER_DESC *desc )
+static WCHAR *get_videocontroller_pnpdeviceid( DXGI_ADAPTER_DESC *desc )
 {
     static const WCHAR fmtW[] = L"PCI\\VEN_%04X&DEV_%04X&SUBSYS_%08X&REV_%02X\\0&DEADBEEF&0&DEAD";
     UINT len = sizeof(fmtW) + 2;
@@ -3846,7 +3847,7 @@ static WCHAR *get_pnpdeviceid( DXGI_ADAPTER_DESC *desc )
 #define HW_VENDOR_VMWARE 0x15ad
 #define HW_VENDOR_INTEL  0x8086
 
-static const WCHAR *get_installeddriver( UINT vendorid )
+static const WCHAR *get_videocontroller_installeddriver( UINT vendorid )
 {
     /* FIXME: wined3d has a better table, but we cannot access this information through dxgi */
 
@@ -3856,12 +3857,32 @@ static const WCHAR *get_installeddriver( UINT vendorid )
     return L"wine.dll";
 }
 
+static BOOL get_dxgi_adapter_desc( DXGI_ADAPTER_DESC *desc )
+{
+    IDXGIFactory *factory;
+    IDXGIAdapter *adapter;
+    HRESULT hr;
+
+    memset( desc, 0, sizeof(*desc) );
+    hr = CreateDXGIFactory( &IID_IDXGIFactory, (void **)&factory );
+    if (FAILED( hr )) return FALSE;
+
+    hr = IDXGIFactory_EnumAdapters( factory, 0, &adapter );
+    if (FAILED( hr ))
+    {
+        IDXGIFactory_Release( factory );
+        return FALSE;
+    }
+
+    hr = IDXGIAdapter_GetDesc( adapter, desc );
+    IDXGIAdapter_Release( adapter );
+    IDXGIFactory_Release( factory );
+    return SUCCEEDED( hr );
+}
+
 static enum fill_status fill_videocontroller( struct table *table, const struct expr *cond )
 {
     struct record_videocontroller *rec;
-    HRESULT hr;
-    IDXGIFactory *factory = NULL;
-    IDXGIAdapter *adapter = NULL;
     DXGI_ADAPTER_DESC desc;
     UINT row = 0, hres = 1024, vres = 768, vidmem = 512 * 1024 * 1024;
     const WCHAR *name = L"VideoController1";
@@ -3870,22 +3891,13 @@ static enum fill_status fill_videocontroller( struct table *table, const struct
 
     if (!resize_table( table, 1, sizeof(*rec) )) return FILL_STATUS_FAILED;
 
-    memset (&desc, 0, sizeof(desc));
-    hr = CreateDXGIFactory( &IID_IDXGIFactory, (void **)&factory );
-    if (FAILED(hr)) goto done;
-
-    hr = IDXGIFactory_EnumAdapters( factory, 0, &adapter );
-    if (FAILED(hr)) goto done;
-
-    hr = IDXGIAdapter_GetDesc( adapter, &desc );
-    if (SUCCEEDED(hr))
+    if (get_dxgi_adapter_desc( &desc ))
     {
         if (desc.DedicatedVideoMemory > UINT_MAX) vidmem = 0xfff00000;
         else vidmem = desc.DedicatedVideoMemory;
         name = desc.Description;
     }
 
-done:
     rec = (struct record_videocontroller *)table->data;
     rec->adapter_compatibility = L"(Standard display types)";
     rec->adapter_dactype       = L"Integrated RAMDAC";
@@ -3902,9 +3914,9 @@ done:
     rec->device_id             = L"VideoController1";
     rec->driverdate            = L"20170101000000.000000+000";
     rec->driverversion         = L"1.0";
-    rec->installeddriver       = get_installeddriver( desc.VendorId );
+    rec->installeddriver       = get_videocontroller_installeddriver( desc.VendorId );
     rec->name                  = heap_strdupW( name );
-    rec->pnpdevice_id          = get_pnpdeviceid( &desc );
+    rec->pnpdevice_id          = get_videocontroller_pnpdeviceid( &desc );
     rec->status                = L"OK";
     rec->videoarchitecture     = 2; /* Unknown */
     rec->videomemorytype       = 2; /* Unknown */
@@ -3916,9 +3928,44 @@ done:
 
     TRACE("created %u rows\n", row);
     table->num_rows = row;
+    return status;
+}
 
-    if (adapter) IDXGIAdapter_Release( adapter );
-    if (factory) IDXGIFactory_Release( factory );
+static WCHAR *get_sounddevice_pnpdeviceid( DXGI_ADAPTER_DESC *desc )
+{
+    static const WCHAR fmtW[] = L"HDAUDIO\\FUNC_01&VEN_%04X&DEV_%04X&SUBSYS_%08X&REV_%04X\\0&DEADBEEF&0&DEAD";
+    UINT len = sizeof(fmtW) + 2;
+    WCHAR *ret;
+
+    if (!(ret = heap_alloc( len * sizeof(WCHAR) ))) return NULL;
+    swprintf( ret, len, fmtW, desc->VendorId, desc->DeviceId, desc->SubSysId, desc->Revision );
+    return ret;
+}
+
+static enum fill_status fill_sounddevice( struct table *table, const struct expr *cond )
+{
+    struct record_sounddevice *rec;
+    DXGI_ADAPTER_DESC desc;
+    UINT row = 0;
+    enum fill_status status = FILL_STATUS_UNFILTERED;
+
+    if (!resize_table( table, 1, sizeof(*rec) )) return FILL_STATUS_FAILED;
+
+    get_dxgi_adapter_desc( &desc );
+
+    rec = (struct record_sounddevice *)table->data;
+    rec->deviceid = get_sounddevice_pnpdeviceid( &desc );
+    rec->manufacturer = L"The Wine Project";
+    rec->name = L"Wine Audio Device";
+    rec->pnpdeviceid = get_sounddevice_pnpdeviceid( &desc );
+    rec->productname = L"Wine Audio Device";
+    rec->status = L"OK";
+    rec->statusinfo = 3;
+    if (!match_row( table, row, cond, &status )) free_row_values( table, row );
+    else row++;
+
+    TRACE("created %u rows\n", row);
+    table->num_rows = row;
     return status;
 }
 
@@ -3960,7 +4007,7 @@ static struct table builtin_classes[] =
     { L"Win32_QuickFixEngineering", C(col_quickfixengineering), D(data_quickfixengineering) },
     { L"Win32_SID", C(col_sid), 0, 0, NULL, fill_sid },
     { L"Win32_Service", C(col_service), 0, 0, NULL, fill_service },
-    { L"Win32_SoundDevice", C(col_sounddevice), D(data_sounddevice) },
+    { L"Win32_SoundDevice", C(col_sounddevice), 0, 0, NULL, fill_sounddevice },
     { L"Win32_SystemEnclosure", C(col_systemenclosure), 0, 0, NULL, fill_systemenclosure },
     { L"Win32_VideoController", C(col_videocontroller), 0, 0, NULL, fill_videocontroller },
     { L"Win32_WinSAT", C(col_winsat), D(data_winsat) },




More information about the wine-cvs mailing list