msdmo: Use specified category in DMOUnregister().

This commit is contained in:
Nikolay Sivov 2014-12-29 13:25:45 +03:00 committed by Alexandre Julliard
parent 8fc7e175dc
commit af6712599a
5 changed files with 118 additions and 24 deletions

1
configure vendored
View File

@ -17215,6 +17215,7 @@ wine_fn_config_dll msctf enable_msctf clean
wine_fn_config_test dlls/msctf/tests msctf_test
wine_fn_config_dll msdaps enable_msdaps clean
wine_fn_config_dll msdmo enable_msdmo implib
wine_fn_config_test dlls/msdmo/tests msdmo_test
wine_fn_config_dll msftedit enable_msftedit
wine_fn_config_dll msg711.acm enable_msg711_acm
wine_fn_config_dll msgsm32.acm enable_msgsm32_acm

View File

@ -3039,6 +3039,7 @@ WINE_CONFIG_DLL(msctf,,[clean])
WINE_CONFIG_TEST(dlls/msctf/tests)
WINE_CONFIG_DLL(msdaps,,[clean])
WINE_CONFIG_DLL(msdmo,,[implib])
WINE_CONFIG_TEST(dlls/msdmo/tests)
WINE_CONFIG_DLL(msftedit)
WINE_CONFIG_DLL(msg711.acm)
WINE_CONFIG_DLL(msgsm32.acm)

View File

@ -188,7 +188,10 @@ HRESULT WINAPI DMORegister(
HKEY hckey = 0;
HKEY hclskey = 0;
TRACE("%s\n", debugstr_w(szName));
TRACE("%s %s %s\n", debugstr_w(szName), debugstr_guid(clsidDMO), debugstr_guid(guidCategory));
if (IsEqualGUID(guidCategory, &GUID_NULL))
return E_INVALIDARG;
hres = RegCreateKeyExW(HKEY_CLASSES_ROOT, szDMORootKey, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hrkey, NULL);
@ -252,46 +255,70 @@ lend:
return hres;
}
static HRESULT unregister_dmo_from_category(const WCHAR *dmoW, const WCHAR *catW, HKEY categories)
{
HKEY catkey;
LONG ret;
ret = RegOpenKeyExW(categories, catW, 0, KEY_WRITE, &catkey);
if (!ret)
{
ret = RegDeleteKeyW(catkey, dmoW);
RegCloseKey(catkey);
}
return !ret ? S_OK : S_FALSE;
}
/***************************************************************
* DMOUnregister (MSDMO.@)
*
* Unregister a DirectX Media Object.
*/
HRESULT WINAPI DMOUnregister(REFCLSID clsidDMO, REFGUID guidCategory)
HRESULT WINAPI DMOUnregister(REFCLSID dmo, REFGUID category)
{
WCHAR szguid[64];
HKEY hrkey = 0;
HKEY hckey = 0;
HKEY rootkey = 0, categorieskey = 0;
WCHAR dmoW[64], catW[64];
HRESULT hr = S_FALSE;
LONG ret;
GUIDToString(szguid, clsidDMO);
TRACE("%s %s\n", debugstr_guid(dmo), debugstr_guid(category));
TRACE("%s %p\n", debugstr_w(szguid), guidCategory);
ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, szDMORootKey, 0, KEY_WRITE, &rootkey);
if (ret)
return HRESULT_FROM_WIN32(ret);
ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, szDMORootKey, 0, KEY_WRITE, &hrkey);
if (ERROR_SUCCESS != ret)
GUIDToString(dmoW, dmo);
RegDeleteKeyW(rootkey, dmoW);
/* open 'Categories' */
ret = RegOpenKeyExW(rootkey, szDMOCategories, 0, KEY_WRITE|KEY_ENUMERATE_SUB_KEYS, &categorieskey);
RegCloseKey(rootkey);
if (ret)
{
hr = HRESULT_FROM_WIN32(ret);
goto lend;
}
ret = RegDeleteKeyW(hrkey, szguid);
if (ERROR_SUCCESS != ret)
goto lend;
/* remove from all categories */
if (IsEqualGUID(category, &GUID_NULL))
{
DWORD index = 0, len = sizeof(catW)/sizeof(WCHAR);
ret = RegOpenKeyExW(hrkey, szDMOCategories, 0, KEY_WRITE, &hckey);
if (ERROR_SUCCESS != ret)
goto lend;
ret = RegDeleteKeyW(hckey, szguid);
if (ERROR_SUCCESS != ret)
goto lend;
while (!RegEnumKeyExW(categorieskey, index++, catW, &len, NULL, NULL, NULL, NULL))
hr = unregister_dmo_from_category(dmoW, catW, categorieskey);
}
else
{
GUIDToString(catW, category);
hr = unregister_dmo_from_category(dmoW, catW, categorieskey);
}
lend:
if (hckey)
RegCloseKey(hckey);
if (hrkey)
RegCloseKey(hrkey);
if (categorieskey)
RegCloseKey(categorieskey);
return HRESULT_FROM_WIN32(ret);
return hr;
}

View File

@ -0,0 +1,5 @@
TESTDLL = msdmo.dll
IMPORTS = msdmo
C_SRCS = \
msdmo.c

60
dlls/msdmo/tests/msdmo.c Normal file
View File

@ -0,0 +1,60 @@
/*
* MSDMO tests
*
* Copyright 2014 Nikolay Sivov for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "initguid.h"
#include "dmo.h"
#include "wine/test.h"
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
static const GUID GUID_unknowndmo = {0x14d99047,0x441f,0x4cd3,{0xbc,0xa8,0x3e,0x67,0x99,0xaf,0x34,0x75}};
static const GUID GUID_unknowncategory = {0x14d99048,0x441f,0x4cd3,{0xbc,0xa8,0x3e,0x67,0x99,0xaf,0x34,0x75}};
static void test_DMOUnregister(void)
{
static const WCHAR testdmoW[] = {'t','e','s','t','d','m','o',0};
HRESULT hr;
hr = DMOUnregister(&GUID_unknowndmo, &GUID_unknowncategory);
ok(hr == S_FALSE, "got 0x%08x\n", hr);
hr = DMOUnregister(&GUID_unknowndmo, &GUID_NULL);
ok(hr == S_FALSE, "got 0x%08x\n", hr);
/* can't register for all categories */
hr = DMORegister(testdmoW, &GUID_unknowndmo, &GUID_NULL, 0, 0, NULL, 0, NULL);
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
hr = DMORegister(testdmoW, &GUID_unknowndmo, &GUID_unknowncategory, 0, 0, NULL, 0, NULL);
if (hr != S_OK) {
win_skip("Failed to register DMO. Probably user doesn't have persmissions to do so.\n");
return;
}
hr = DMOUnregister(&GUID_unknowndmo, &GUID_NULL);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = DMOUnregister(&GUID_unknowndmo, &GUID_NULL);
ok(hr == S_FALSE, "got 0x%08x\n", hr);
}
START_TEST(msdmo)
{
test_DMOUnregister();
}