[PATCH 4/4] gdi32: Implement D3DKMTDestroyDevice.

Zhiyi Zhang zzhang at codeweavers.com
Tue Jun 4 02:43:41 CDT 2019


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 .../api-ms-win-dx-d3dkmt-l1-1-0.spec          |  2 +-
 dlls/d3d11/d3d11.spec                         |  2 +-
 dlls/gdi32/driver.c                           | 29 +++++++++++++++++++
 dlls/gdi32/gdi32.spec                         |  1 +
 dlls/gdi32/tests/driver.c                     |  6 ++--
 include/ddk/d3dkmthk.h                        |  1 +
 6 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec b/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec
index cb7935bbbc..43452cda74 100644
--- a/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec
+++ b/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec
@@ -22,7 +22,7 @@
 @ stub D3DKMTDestroyAllocation
 @ stub D3DKMTDestroyContext
 @ stdcall D3DKMTDestroyDCFromMemory(ptr) gdi32.D3DKMTDestroyDCFromMemory
-@ stub D3DKMTDestroyDevice
+@ stdcall D3DKMTDestroyDevice(ptr) gdi32.D3DKMTDestroyDevice
 @ stub D3DKMTDestroyKeyedMutex
 @ stub D3DKMTDestroyOutputDupl
 @ stub D3DKMTDestroyOverlay
diff --git a/dlls/d3d11/d3d11.spec b/dlls/d3d11/d3d11.spec
index e4692ace9c..01bc8bfebc 100644
--- a/dlls/d3d11/d3d11.spec
+++ b/dlls/d3d11/d3d11.spec
@@ -12,7 +12,7 @@
 @ stub D3DKMTCreateSynchronizationObject
 @ stub D3DKMTDestroyAllocation
 @ stub D3DKMTDestroyContext
-@ stub D3DKMTDestroyDevice
+@ stdcall D3DKMTDestroyDevice(ptr) gdi32.D3DKMTDestroyDevice
 @ stub D3DKMTDestroySynchronizationObject
 @ stub D3DKMTEscape
 @ stub D3DKMTGetContextSchedulingPriority
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index bf5db9d58c..075dac2337 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -1378,3 +1378,32 @@ NTSTATUS WINAPI D3DKMTCreateDevice( D3DKMT_CREATEDEVICE *desc )
     LeaveCriticalSection( &driver_section );
     return STATUS_SUCCESS;
 }
+
+/******************************************************************************
+ *		D3DKMTDestroyDevice [GDI32.@]
+ */
+NTSTATUS WINAPI D3DKMTDestroyDevice( const D3DKMT_DESTROYDEVICE *desc )
+{
+    struct d3dkmt_device *device, *device2;
+    NTSTATUS status = STATUS_INVALID_PARAMETER;
+
+    TRACE("(%p)\n", desc);
+
+    if (!desc || !desc->hDevice)
+        return STATUS_INVALID_PARAMETER;
+
+    EnterCriticalSection( &driver_section );
+    LIST_FOR_EACH_ENTRY_SAFE( device, device2, &d3dkmt_devices, struct d3dkmt_device, entry )
+    {
+        if (device->handle == desc->hDevice)
+        {
+            list_remove( &device->entry );
+            heap_free( device );
+            status = STATUS_SUCCESS;
+            break;
+        }
+    }
+    LeaveCriticalSection( &driver_section );
+
+    return status;
+}
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
index 88fe846eb8..9abd82173c 100644
--- a/dlls/gdi32/gdi32.spec
+++ b/dlls/gdi32/gdi32.spec
@@ -84,6 +84,7 @@
 @ stdcall D3DKMTCreateDCFromMemory(ptr)
 @ stdcall D3DKMTCreateDevice(ptr)
 @ stdcall D3DKMTDestroyDCFromMemory(ptr)
+@ stdcall D3DKMTDestroyDevice(ptr)
 @ stdcall D3DKMTEscape(ptr)
 @ stdcall D3DKMTOpenAdapterFromGdiDisplayName(ptr)
 @ stdcall D3DKMTOpenAdapterFromHdc(ptr)
diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c
index f8cd1d14bd..b5f6f75a83 100644
--- a/dlls/gdi32/tests/driver.c
+++ b/dlls/gdi32/tests/driver.c
@@ -240,17 +240,17 @@ static void test_D3DKMTDestroyDevice(void)
 
     if (!pD3DKMTDestroyDevice || pD3DKMTDestroyDevice(NULL) == STATUS_PROCEDURE_NOT_FOUND)
     {
-        skip("D3DKMTDestroyDevice() is unavailable.\n");
+        win_skip("D3DKMTDestroyDevice() is unavailable.\n");
         return;
     }
 
     /* Invalid parameters */
     status = pD3DKMTDestroyDevice(NULL);
-    todo_wine ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#x.\n", status);
+    ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#x.\n", status);
 
     memset(&destroy_device_desc, 0, sizeof(destroy_device_desc));
     status = pD3DKMTDestroyDevice(&destroy_device_desc);
-    todo_wine ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#x.\n", status);
+    ok(status == STATUS_INVALID_PARAMETER, "Got unexpected return code %#x.\n", status);
 }
 
 static void test_D3DKMTCheckVidPnExclusiveOwnership(void)
diff --git a/include/ddk/d3dkmthk.h b/include/ddk/d3dkmthk.h
index 90bf907e30..081758bf5d 100644
--- a/include/ddk/d3dkmthk.h
+++ b/include/ddk/d3dkmthk.h
@@ -169,6 +169,7 @@ NTSTATUS WINAPI D3DKMTCloseAdapter(const D3DKMT_CLOSEADAPTER *desc);
 NTSTATUS WINAPI D3DKMTCreateDevice(D3DKMT_CREATEDEVICE *desc);
 NTSTATUS WINAPI D3DKMTCreateDCFromMemory(D3DKMT_CREATEDCFROMMEMORY *desc);
 NTSTATUS WINAPI D3DKMTDestroyDCFromMemory(const D3DKMT_DESTROYDCFROMMEMORY *desc);
+NTSTATUS WINAPI D3DKMTDestroyDevice(const D3DKMT_DESTROYDEVICE *desc);
 NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName(D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc);
 
 #ifdef __cplusplus
-- 
2.20.1




More information about the wine-devel mailing list