Module: wine Branch: master Commit: 68e3b18533e3c71515a7294c0312c1b3c2201ee8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=68e3b18533e3c71515a7294c03...
Author: Erich E. Hoover erich.e.hoover@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. */