According to Stefans suggestion I have implemented a test for the string
copies into the identifier structure. Test is designed to fail to give
me a hint what is going on. Hopefully someone can post the results of a
test run in native environment.

Thank you
diff --git a/dlls/ddraw/tests/ddrawmodes.c b/dlls/ddraw/tests/ddrawmodes.c
index bd8bec7..b52a903 100644
--- a/dlls/ddraw/tests/ddrawmodes.c
+++ b/dlls/ddraw/tests/ddrawmodes.c
@@ -645,6 +645,38 @@ static void testddraw3(void)
     if(SUCCEEDED(hr) && dd3) IDirectDraw3_Release(dd3);
 }
 
+static void testddraw7(void)
+{
+    IDirectDraw7 *dd7;
+    HRESULT hr;
+    DWORD dddi2[0x110];
+    DDDEVICEIDENTIFIER2 *pdddi2;
+
+    hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7);
+    ok(hr==DD_OK, "IDirectDraw7_QueryInterface returned %08x\n", hr);
+
+    if (hr==DD_OK)
+    {
+         pdddi2 = (DDDEVICEIDENTIFIER2 *)dddi2;
+         dddi2[0x7f] = 0xdeadbeef;
+         dddi2[0xff] = 0xdeadbeef;
+         dddi2[0x10b] = 0xdeadbeef;
+         hr = IDirectDraw7_GetDeviceIdentifier(dd7, pdddi2, 0);
+         ok(hr==DD_OK, "get device identifier failed with %08x\n", hr);
+
+         if (hr==DD_OK)
+         {
+             /* check how strings are copied to the structure */
+             ok(1==0, "last bytes of szDriver string are %08x\n", dddi2[0x7f]);
+             ok(1==0, "last bytes of szDescription string are %08x\n", dddi2[0xff]);
+             /* verify that 8 byte structure size alignment will not overwrite memory */
+             ok(dddi2[0x10b]==0xdeadbeef, "memory beyond DDDEVICEIDENTIFIER2 overwritten\n");
+         }
+
+         IDirectDraw_Release(dd7);
+    }
+}
+
 START_TEST(ddrawmodes)
 {
     init_function_pointers();
@@ -663,6 +695,7 @@ START_TEST(ddrawmodes)
         testdisplaymodes();
     flushdisplaymodes();
     testddraw3();
+    testddraw7();
     releasedirectdraw();
 
     createdirectdraw();


Reply via email to