diff --git a/dlls/d3d11/d3d11.spec b/dlls/d3d11/d3d11.spec index 365e5d7c0ce..87304b7c132 100644 --- a/dlls/d3d11/d3d11.spec +++ b/dlls/d3d11/d3d11.spec @@ -5,7 +5,7 @@ @ stdcall D3D11CreateDevice(ptr long ptr long ptr long long ptr ptr ptr) @ stdcall D3D11CreateDeviceAndSwapChain(ptr long ptr long ptr long long ptr ptr ptr ptr ptr) @ stdcall D3D11On12CreateDevice(ptr long ptr long ptr long long ptr ptr ptr) -@ stub D3DKMTCloseAdapter +@ stdcall D3DKMTCloseAdapter(ptr) gdi32.D3DKMTCloseAdapter @ stub D3DKMTCreateAllocation @ stub D3DKMTCreateContext @ stub D3DKMTCreateDevice diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c index 01efc6903b5..da3aad9e7ce 100644 --- a/dlls/gdi32/driver.c +++ b/dlls/gdi32/driver.c @@ -1279,8 +1279,28 @@ NTSTATUS WINAPI D3DKMTEscape( const void *pData ) */ NTSTATUS WINAPI D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) { - FIXME("(%p): stub\n", desc); - return STATUS_SUCCESS; + NTSTATUS status = STATUS_INVALID_PARAMETER; + struct d3dkmt_adapter *adapter; + + TRACE("(%p)\n", desc); + + if (!desc || !desc->hAdapter) + return STATUS_INVALID_PARAMETER; + + EnterCriticalSection( &driver_section ); + LIST_FOR_EACH_ENTRY( adapter, &d3dkmt_adapters, struct d3dkmt_adapter, entry ) + { + if (adapter->handle == desc->hAdapter) + { + list_remove( &adapter->entry ); + heap_free( adapter ); + status = STATUS_SUCCESS; + break; + } + } + LeaveCriticalSection( &driver_section ); + + return status; } /****************************************************************************** diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c index 067c1628384..caded27aefd 100644 --- a/dlls/gdi32/tests/driver.c +++ b/dlls/gdi32/tests/driver.c @@ -179,11 +179,11 @@ static void test_D3DKMTCloseAdapter(void) /* Invalid parameters */ status = pD3DKMTCloseAdapter(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(&close_adapter_desc, 0, sizeof(close_adapter_desc)); status = pD3DKMTCloseAdapter(&close_adapter_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_D3DKMTCreateDevice(void)