diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 0693dbc..d5b43f4 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -12772,6 +12772,82 @@
     ok(!refcount, "DirectDraw has %u references left.\n", refcount);
 }
 
+static void test_get_surface_from_dc(void)
+{
+    IDirectDrawSurface *surface1, *tmp;
+    IDirectDrawSurface4 *surface;
+    DDSURFACEDESC2 surface_desc;
+    IDirectDraw4 *ddraw;
+    ULONG refcount;
+    HWND window;
+    HRESULT hr;
+    HDC dc;
+
+    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+    memset(&surface_desc, 0, sizeof(surface_desc));
+    surface_desc.dwSize = sizeof(surface_desc);
+    surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+    surface_desc.dwWidth = 64;
+    surface_desc.dwHeight = 64;
+    surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
+
+    hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+    ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+    hr = IDirectDrawSurface4_QueryInterface(surface, &IID_IDirectDrawSurface, (void **)&surface1);
+    ok(SUCCEEDED(hr), "Failed to query IDirectDrawSurface interface, hr %#x.\n", hr);
+
+    refcount = get_refcount((IUnknown *)surface1);
+    ok(refcount == 1, "Got unexpected refcount %u.\n", refcount);
+    refcount = get_refcount((IUnknown *)surface);
+    ok(refcount == 1, "Got unexpected refcount %u.\n", refcount);
+
+    hr = IDirectDrawSurface4_GetDC(surface, &dc);
+    ok(SUCCEEDED(hr), "Failed to get DC, hr %#x.\n", hr);
+
+    hr = IDirectDraw4_GetSurfaceFromDC(ddraw, dc, NULL);
+    ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+
+    hr = IDirectDraw4_GetSurfaceFromDC(ddraw, dc, (IDirectDrawSurface4 **)&tmp);
+    ok(SUCCEEDED(hr), "GetSurfaceFromDC failed, hr %#x.\n", hr);
+    ok(tmp == surface1, "Got unexpected surface %p, expected %p.\n", tmp, surface1);
+
+    refcount = get_refcount((IUnknown *)surface1);
+    ok(refcount == 2, "Got unexpected refcount %u.\n", refcount);
+    refcount = get_refcount((IUnknown *)surface);
+    ok(refcount == 1, "Got unexpected refcount %u.\n", refcount);
+
+    hr = IDirectDrawSurface4_ReleaseDC(surface, dc);
+    ok(SUCCEEDED(hr), "ReleaseDC failed, hr %#x.\n", hr);
+
+    IDirectDrawSurface_Release(tmp);
+
+    dc = CreateCompatibleDC(NULL);
+    ok(!!dc, "CreateCompatibleDC failed.\n");
+
+    tmp = (void *)0xdeadbeef;
+    hr = IDirectDraw4_GetSurfaceFromDC(ddraw, dc, (IDirectDrawSurface4 **)&tmp);
+    ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+    ok(!tmp, "Got unexpected surface %p.\n", tmp);
+
+    ok(DeleteDC(dc), "DeleteDC failed.\n");
+
+    tmp = (void *)0xdeadbeef;
+    hr = IDirectDraw4_GetSurfaceFromDC(ddraw, NULL, (IDirectDrawSurface4 **)&tmp);
+    ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+    ok(!tmp, "Got unexpected surface %p.\n", tmp);
+
+    IDirectDrawSurface4_Release(surface);
+    IDirectDrawSurface_Release(surface1);
+    IDirectDraw4_Release(ddraw);
+    DestroyWindow(window);
+}
+
 START_TEST(ddraw4)
 {
     IDirectDraw4 *ddraw;
@@ -12874,4 +12950,5 @@
     test_transform_vertices();
     test_display_mode_surface_pixel_format();
     test_surface_desc_size();
+    test_get_surface_from_dc();
 }
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 0f44d3c..70aff8f 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -12445,6 +12445,82 @@
     ok(!refcount, "DirectDraw has %u references left.\n", refcount);
 }
 
+static void test_get_surface_from_dc(void)
+{
+    IDirectDrawSurface7 *surface, *tmp;
+    IDirectDrawSurface *surface1;
+    DDSURFACEDESC2 surface_desc;
+    IDirectDraw7 *ddraw;
+    ULONG refcount;
+    HWND window;
+    HRESULT hr;
+    HDC dc;
+
+    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+    memset(&surface_desc, 0, sizeof(surface_desc));
+    surface_desc.dwSize = sizeof(surface_desc);
+    surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+    surface_desc.dwWidth = 64;
+    surface_desc.dwHeight = 64;
+    surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
+
+    hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+    ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+    hr = IDirectDrawSurface7_QueryInterface(surface, &IID_IDirectDrawSurface, (void **)&surface1);
+    ok(SUCCEEDED(hr), "Failed to query IDirectDrawSurface interface, hr %#x.\n", hr);
+
+    refcount = get_refcount((IUnknown *)surface1);
+    ok(refcount == 1, "Got unexpected refcount %u.\n", refcount);
+    refcount = get_refcount((IUnknown *)surface);
+    ok(refcount == 1, "Got unexpected refcount %u.\n", refcount);
+
+    hr = IDirectDrawSurface7_GetDC(surface, &dc);
+    ok(SUCCEEDED(hr), "Failed to get DC, hr %#x.\n", hr);
+
+    hr = IDirectDraw7_GetSurfaceFromDC(ddraw, dc, NULL);
+    ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+
+    hr = IDirectDraw7_GetSurfaceFromDC(ddraw, dc, &tmp);
+    ok(SUCCEEDED(hr), "GetSurfaceFromDC failed, hr %#x.\n", hr);
+    ok(tmp == surface, "Got unexpected surface %p, expected %p.\n", tmp, surface);
+
+    refcount = get_refcount((IUnknown *)surface1);
+    ok(refcount == 1, "Got unexpected refcount %u.\n", refcount);
+    refcount = get_refcount((IUnknown *)surface);
+    ok(refcount == 2, "Got unexpected refcount %u.\n", refcount);
+
+    hr = IDirectDrawSurface7_ReleaseDC(surface, dc);
+    ok(SUCCEEDED(hr), "ReleaseDC failed, hr %#x.\n", hr);
+
+    IDirectDrawSurface_Release(tmp);
+
+    dc = CreateCompatibleDC(NULL);
+    ok(!!dc, "CreateCompatibleDC failed.\n");
+
+    tmp = (void *)0xdeadbeef;
+    hr = IDirectDraw7_GetSurfaceFromDC(ddraw, dc, &tmp);
+    ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+    ok(!tmp, "Got unexpected surface %p.\n", tmp);
+
+    ok(DeleteDC(dc), "DeleteDC failed.\n");
+
+    tmp = (void *)0xdeadbeef;
+    hr = IDirectDraw7_GetSurfaceFromDC(ddraw, NULL, &tmp);
+    ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+    ok(!tmp, "Got unexpected surface %p.\n", tmp);
+
+    IDirectDrawSurface7_Release(surface);
+    IDirectDrawSurface_Release(surface1);
+    IDirectDraw7_Release(ddraw);
+    DestroyWindow(window);
+}
+
 START_TEST(ddraw7)
 {
     HMODULE module = GetModuleHandleA("ddraw.dll");
@@ -12557,4 +12633,5 @@
     test_edge_antialiasing_blending();
     test_display_mode_surface_pixel_format();
     test_surface_desc_size();
+    test_get_surface_from_dc();
 }
diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index 9492ee4..6ecf7fe 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -2163,129 +2163,6 @@
     return TRUE;
 }
 
-static void GetDCTest(void)
-{
-    DDSURFACEDESC ddsd;
-    DDSURFACEDESC2 ddsd2;
-    IDirectDrawSurface *surf;
-    IDirectDrawSurface4 *surf4;
-    IDirectDrawSurface7 *surf7;
-    IDirectDrawSurface *tmp;
-    IDirectDrawSurface7 *tmp7;
-    HRESULT hr;
-    IDirectDraw4 *dd4;
-    IDirectDraw7 *dd7;
-    HDC dc;
-    ULONG ref;
-
-    memset(&ddsd, 0, sizeof(ddsd));
-    ddsd.dwSize = sizeof(ddsd);
-    ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
-    ddsd.dwWidth = 64;
-    ddsd.dwHeight = 64;
-    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
-    memset(&ddsd2, 0, sizeof(ddsd2));
-    ddsd2.dwSize = sizeof(ddsd2);
-    ddsd2.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
-    ddsd2.dwWidth = 64;
-    ddsd2.dwHeight = 64;
-    ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
-
-    hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw4, (void **) &dd4);
-    ok(hr == DD_OK, "IDirectDraw_QueryInterface failed: 0x%08x\n", hr);
-
-    surf = NULL;
-    hr = IDirectDraw4_CreateSurface(dd4, &ddsd2, &surf4, NULL);
-    ok(hr == DD_OK, "IDirectDraw4_CreateSurface failed: 0x%08x\n", hr);
-
-    hr = IDirectDrawSurface4_QueryInterface(surf4, &IID_IDirectDrawSurface, (void **)&surf);
-    ok(SUCCEEDED(hr), "QueryInterface failed, hr %#x.\n", hr);
-
-    ref = getRefcount((IUnknown *) surf);
-    ok(ref == 1, "Refcount is %u, expected 1\n", ref);
-    ref = getRefcount((IUnknown *) surf4);
-    ok(ref == 1, "Refcount is %u, expected 1\n", ref);
-
-    hr = IDirectDrawSurface4_GetDC(surf4, &dc);
-    ok(SUCCEEDED(hr), "GetDC failed, hr %#x.\n", hr);
-
-    hr = IDirectDraw4_GetSurfaceFromDC(dd4, dc, NULL);
-    ok(hr == E_INVALIDARG, "Expected hr E_INVALIDARG, got %#x.\n", hr);
-
-    hr = IDirectDraw4_GetSurfaceFromDC(dd4, dc, (IDirectDrawSurface4 **)&tmp);
-    ok(SUCCEEDED(hr), "GetSurfaceFromDC failed, hr %#x.\n", hr);
-    ok(tmp == surf, "Expected surface %p, got %p.\n\n", surf, tmp);
-
-    ref = getRefcount((IUnknown *) surf);
-    ok(ref == 2, "Refcount is %u, expected 2\n", ref);
-    ref = getRefcount((IUnknown *) tmp);
-    ok(ref == 2, "Refcount is %u, expected 2\n", ref);
-    ref = getRefcount((IUnknown *) surf4);
-    ok(ref == 1, "Refcount is %u, expected 1\n", ref);
-
-    hr = IDirectDrawSurface4_ReleaseDC(surf4, dc);
-    ok(SUCCEEDED(hr), "ReleaseDC failed, hr %#x.\n", hr);
-
-    IDirectDrawSurface_Release(tmp);
-
-    dc = CreateCompatibleDC(NULL);
-    ok(!!dc, "CreateCompatibleDC failed.\n");
-
-    tmp = (IDirectDrawSurface *)0xdeadbeef;
-    hr = IDirectDraw4_GetSurfaceFromDC(dd4, dc, (IDirectDrawSurface4 **)&tmp);
-    ok(hr == DDERR_NOTFOUND, "GetSurfaceFromDC failed, hr %#x.\n", hr);
-    ok(!tmp, "Expected surface NULL, got %p.\n", tmp);
-
-    ok(DeleteDC(dc), "DeleteDC failed.\n");
-
-    tmp = (IDirectDrawSurface *)0xdeadbeef;
-    hr = IDirectDraw4_GetSurfaceFromDC(dd4, NULL, (IDirectDrawSurface4 **)&tmp);
-    ok(hr == DDERR_NOTFOUND, "GetSurfaceFromDC failed, hr %#x.\n", hr);
-    ok(!tmp, "Expected surface NULL, got %p.\n", tmp);
-
-    IDirectDrawSurface4_Release(surf4);
-    IDirectDrawSurface_Release(surf);
-    IDirectDraw4_Release(dd4);
-
-    hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7);
-    ok(hr == DD_OK, "IDirectDraw_QueryInterface failed: 0x%08x\n", hr);
-
-    hr = IDirectDraw7_CreateSurface(dd7, &ddsd2, &surf7, NULL);
-    ok(hr == DD_OK, "IDirectDraw7_CreateSurface failed: 0x%08x\n", hr);
-
-    hr = IDirectDrawSurface7_GetDC(surf7, &dc);
-    ok(SUCCEEDED(hr), "GetDC failed, hr %#x.\n", hr);
-
-    hr = IDirectDraw7_GetSurfaceFromDC(dd7, dc, NULL);
-    ok(hr == E_INVALIDARG, "Expected hr E_INVALIDARG, got %#x.\n", hr);
-
-    hr = IDirectDraw7_GetSurfaceFromDC(dd7, dc, &tmp7);
-    ok(SUCCEEDED(hr), "GetSurfaceFromDC failed, hr %#x.\n", hr);
-    ok(tmp7 == surf7, "Expected surface %p, got %p.\n\n", surf7, tmp7);
-    IDirectDrawSurface7_Release(tmp7);
-
-    hr = IDirectDrawSurface7_ReleaseDC(surf7, dc);
-    ok(SUCCEEDED(hr), "ReleaseDC failed, hr %#x.\n", hr);
-
-    dc = CreateCompatibleDC(NULL);
-    ok(!!dc, "CreateCompatibleDC failed.\n");
-
-    tmp7 = (IDirectDrawSurface7 *)0xdeadbeef;
-    hr = IDirectDraw7_GetSurfaceFromDC(dd7, dc, &tmp7);
-    ok(hr == DDERR_NOTFOUND, "GetSurfaceFromDC failed, hr %#x.\n", hr);
-    ok(!tmp7, "Expected surface NULL, got %p.\n", tmp7);
-
-    ok(DeleteDC(dc), "DeleteDC failed.\n");
-
-    tmp7 = (IDirectDrawSurface7 *)0xdeadbeef;
-    hr = IDirectDraw7_GetSurfaceFromDC(dd7, NULL, (IDirectDrawSurface7 **)&tmp7);
-    ok(hr == DDERR_NOTFOUND, "GetSurfaceFromDC failed, hr %#x.\n", hr);
-    ok(!tmp7, "Expected surface NULL, got %p.\n", tmp7);
-
-    IDirectDrawSurface7_Release(surf7);
-    IDirectDraw7_Release(dd7);
-}
-
 static void BackBufferCreateSurfaceTest(void)
 {
     DDSURFACEDESC ddsd;
@@ -3277,7 +3154,6 @@
     BltParamTest();
     PaletteTest();
     SurfaceCapsTest();
-    GetDCTest();
     BackBufferCreateSurfaceTest();
     BackBufferAttachmentFlipTest();
     CreateSurfaceBadCapsSizeTest();
