Erich E. Hoover : ddraw: Return the D3D identifier when GetDeviceIdentifier is called with no flags.

Alexandre Julliard julliard at winehq.org
Tue Feb 11 13:32:41 CST 2014


Module: wine
Branch: master
Commit: 68e3b18533e3c71515a7294c0312c1b3c2201ee8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=68e3b18533e3c71515a7294c0312c1b3c2201ee8

Author: Erich E. Hoover <erich.e.hoover at gmail.com>
Date:   Tue Feb 11 09:21:53 2014 -0700

ddraw: Return the D3D identifier when GetDeviceIdentifier is called with no flags.

---

 dlls/ddraw/ddraw.c            |   43 +++++++++++++++++++++++++++++++++--------
 dlls/ddraw/tests/ddrawmodes.c |   18 +++++++++++++++++
 dlls/wined3d/directx.c        |    4 ++--
 3 files changed, 55 insertions(+), 10 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index c4c0b33..ed0606f 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2561,19 +2561,46 @@ static HRESULT WINAPI ddraw7_EvaluateMode(IDirectDraw7 *iface, DWORD Flags, DWOR
 static HRESULT WINAPI ddraw7_GetDeviceIdentifier(IDirectDraw7 *iface,
         DDDEVICEIDENTIFIER2 *DDDI, DWORD Flags)
 {
+    struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
+    struct wined3d_adapter_identifier adapter_id;
+    HRESULT hr = S_OK;
+
     TRACE("iface %p, device_identifier %p, flags %#x.\n", iface, DDDI, Flags);
 
-    if(!DDDI)
+    if (!DDDI)
         return DDERR_INVALIDPARAMS;
 
-    /* The DDGDI_GETHOSTIDENTIFIER returns the information about the 2D
-     * host adapter, if there's a secondary 3D adapter. This doesn't apply
-     * to any modern hardware, nor is it interesting for Wine, so ignore it.
-     * Size of DDDEVICEIDENTIFIER2 may be aligned to 8 bytes and thus 4
-     * bytes too long. So only copy the relevant part of the structure
-     */
+    if (Flags & DDGDI_GETHOSTIDENTIFIER)
+    {
+        /* The DDGDI_GETHOSTIDENTIFIER returns the information about the 2D
+         * host adapter, if there's a secondary 3D adapter. This doesn't apply
+         * to any modern hardware, nor is it interesting for Wine, so ignore it.
+         * Size of DDDEVICEIDENTIFIER2 may be aligned to 8 bytes and thus 4
+         * bytes too long. So only copy the relevant part of the structure
+         */
 
-    memcpy(DDDI, &deviceidentifier, FIELD_OFFSET(DDDEVICEIDENTIFIER2, dwWHQLLevel) + sizeof(DWORD));
+        memcpy(DDDI, &deviceidentifier, FIELD_OFFSET(DDDEVICEIDENTIFIER2, dwWHQLLevel) + sizeof(DWORD));
+        return DD_OK;
+    }
+
+    /* Drakan: Order of the Flame expects accurate D3D device information from ddraw */
+    adapter_id.driver = DDDI->szDriver;
+    adapter_id.driver_size = sizeof(DDDI->szDriver);
+    adapter_id.description = DDDI->szDescription;
+    adapter_id.description_size = sizeof(DDDI->szDescription);
+    adapter_id.device_name_size = 0;
+    wined3d_mutex_lock();
+    hr = wined3d_get_adapter_identifier(ddraw->wined3d, WINED3DADAPTER_DEFAULT, 0x0, &adapter_id);
+    wined3d_mutex_unlock();
+    if (FAILED(hr)) return hr;
+
+    DDDI->liDriverVersion = adapter_id.driver_version;
+    DDDI->dwVendorId = adapter_id.vendor_id;
+    DDDI->dwDeviceId = adapter_id.device_id;
+    DDDI->dwSubSysId = adapter_id.subsystem_id;
+    DDDI->dwRevision = adapter_id.revision;
+    DDDI->guidDeviceIdentifier = adapter_id.device_identifier;
+    DDDI->dwWHQLLevel = adapter_id.whql_level;
     return DD_OK;
 }
 
diff --git a/dlls/ddraw/tests/ddrawmodes.c b/dlls/ddraw/tests/ddrawmodes.c
index 2d7123b..39b3555 100644
--- a/dlls/ddraw/tests/ddrawmodes.c
+++ b/dlls/ddraw/tests/ddrawmodes.c
@@ -999,6 +999,24 @@ static void testddraw7(void)
              ok(pend[1]==0xdeadbeef, "memory beyond DDDEVICEIDENTIFIER2 overwritten\n");
          }
 
+         /* recheck with the DDGDI_GETHOSTIDENTIFIER flag */
+         pend[0] = 0xdeadbeef;
+         pend[1] = 0xdeadbeef;
+         hr = IDirectDraw7_GetDeviceIdentifier(dd7, pdddi2, DDGDI_GETHOSTIDENTIFIER);
+         ok(hr==DD_OK, "get device identifier failed with %08x\n", hr);
+         if (hr==DD_OK)
+         {
+             /* szDriver contains the name of the driver DLL */
+             ok(strstr(pdddi2->szDriver, ".dll")!=NULL, "szDriver does not contain DLL name\n");
+             /* check how strings are copied into the structure */
+             ok(pdddi2->szDriver[MAX_DDDEVICEID_STRING - 1]==0, "szDriver not cleared\n");
+             ok(pdddi2->szDescription[MAX_DDDEVICEID_STRING - 1]==0, "szDescription not cleared\n");
+             /* verify that 8 byte structure size alignment will not overwrite memory */
+             ok(pend[0]==0xdeadbeef || broken(pend[0] != 0xdeadbeef), /* win2k */
+                "memory beyond DDDEVICEIDENTIFIER2 overwritten\n");
+             ok(pend[1]==0xdeadbeef, "memory beyond DDDEVICEIDENTIFIER2 overwritten\n");
+         }
+
          IDirectDraw_Release(dd7);
          HeapFree( GetProcessHeap(), 0, pdddi2 );
     }
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 16b9948..a779af7 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -3413,7 +3413,7 @@ HRESULT CDECL wined3d_get_adapter_identifier(const struct wined3d *wined3d,
         const char *name = adapter->driver_info.name;
         len = min(strlen(name), identifier->driver_size - 1);
         memcpy(identifier->driver, name, len);
-        identifier->driver[len] = '\0';
+        memset(&identifier->driver[len], 0, identifier->driver_size - len);
     }
 
     if (identifier->description_size)
@@ -3421,7 +3421,7 @@ HRESULT CDECL wined3d_get_adapter_identifier(const struct wined3d *wined3d,
         const char *description = adapter->driver_info.description;
         len = min(strlen(description), identifier->description_size - 1);
         memcpy(identifier->description, description, len);
-        identifier->description[len] = '\0';
+        memset(&identifier->description[len], 0, identifier->description_size - len);
     }
 
     /* Note that d3d8 doesn't supply a device name. */




More information about the wine-cvs mailing list