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