Signed-off-by: Zhiyi Zhang zzhang@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 | 10 +++---- include/ddk/d3dkmthk.h | 1 + 6 files changed, 38 insertions(+), 7 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 d5765af2a1..9208f6ecd5 100644 --- a/dlls/gdi32/driver.c +++ b/dlls/gdi32/driver.c @@ -1395,3 +1395,32 @@ NTSTATUS WINAPI D3DKMTCreateDevice( D3DKMT_CREATEDEVICE *desc ) LeaveCriticalSection( &driver_section ); return STATUS_SUCCESS; } + +/****************************************************************************** + * D3DKMTDestroyDevice [GDI32.@] + */ +NTSTATUS WINAPI D3DKMTDestroyDevice( const D3DKMT_DESTROYDEVICE *desc ) +{ + NTSTATUS status = STATUS_INVALID_PARAMETER; + struct d3dkmt_device *device; + + TRACE("(%p)\n", desc); + + if (!desc || !desc->hDevice) + return STATUS_INVALID_PARAMETER; + + EnterCriticalSection( &driver_section ); + LIST_FOR_EACH_ENTRY( device, &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 f5c23dad76..b5f6f75a83 100644 --- a/dlls/gdi32/tests/driver.c +++ b/dlls/gdi32/tests/driver.c @@ -194,9 +194,9 @@ static void test_D3DKMTCreateDevice(void) D3DKMT_DESTROYDEVICE destroy_device_desc; NTSTATUS status;
- if (!pD3DKMTCreateDevice || pD3DKMTCreateDevice(NULL) == STATUS_PROCEDURE_NOT_FOUND || !pD3DKMTDestroyDevice) + if (!pD3DKMTCreateDevice || pD3DKMTCreateDevice(NULL) == STATUS_PROCEDURE_NOT_FOUND) { - skip("D3DKMTCreateDevice() or D3DKMTDestroyDevice() is unavailable.\n"); + win_skip("D3DKMTCreateDevice() is unavailable.\n"); return; }
@@ -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