msdmo: Use specified category in DMOUnregister().
This commit is contained in:
parent
8fc7e175dc
commit
af6712599a
|
@ -17215,6 +17215,7 @@ wine_fn_config_dll msctf enable_msctf clean
|
||||||
wine_fn_config_test dlls/msctf/tests msctf_test
|
wine_fn_config_test dlls/msctf/tests msctf_test
|
||||||
wine_fn_config_dll msdaps enable_msdaps clean
|
wine_fn_config_dll msdaps enable_msdaps clean
|
||||||
wine_fn_config_dll msdmo enable_msdmo implib
|
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 msftedit enable_msftedit
|
||||||
wine_fn_config_dll msg711.acm enable_msg711_acm
|
wine_fn_config_dll msg711.acm enable_msg711_acm
|
||||||
wine_fn_config_dll msgsm32.acm enable_msgsm32_acm
|
wine_fn_config_dll msgsm32.acm enable_msgsm32_acm
|
||||||
|
|
|
@ -3039,6 +3039,7 @@ WINE_CONFIG_DLL(msctf,,[clean])
|
||||||
WINE_CONFIG_TEST(dlls/msctf/tests)
|
WINE_CONFIG_TEST(dlls/msctf/tests)
|
||||||
WINE_CONFIG_DLL(msdaps,,[clean])
|
WINE_CONFIG_DLL(msdaps,,[clean])
|
||||||
WINE_CONFIG_DLL(msdmo,,[implib])
|
WINE_CONFIG_DLL(msdmo,,[implib])
|
||||||
|
WINE_CONFIG_TEST(dlls/msdmo/tests)
|
||||||
WINE_CONFIG_DLL(msftedit)
|
WINE_CONFIG_DLL(msftedit)
|
||||||
WINE_CONFIG_DLL(msg711.acm)
|
WINE_CONFIG_DLL(msg711.acm)
|
||||||
WINE_CONFIG_DLL(msgsm32.acm)
|
WINE_CONFIG_DLL(msgsm32.acm)
|
||||||
|
|
|
@ -188,7 +188,10 @@ HRESULT WINAPI DMORegister(
|
||||||
HKEY hckey = 0;
|
HKEY hckey = 0;
|
||||||
HKEY hclskey = 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,
|
hres = RegCreateKeyExW(HKEY_CLASSES_ROOT, szDMORootKey, 0, NULL,
|
||||||
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hrkey, NULL);
|
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hrkey, NULL);
|
||||||
|
@ -252,46 +255,70 @@ lend:
|
||||||
return hres;
|
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.@)
|
* DMOUnregister (MSDMO.@)
|
||||||
*
|
*
|
||||||
* Unregister a DirectX Media Object.
|
* Unregister a DirectX Media Object.
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI DMOUnregister(REFCLSID clsidDMO, REFGUID guidCategory)
|
HRESULT WINAPI DMOUnregister(REFCLSID dmo, REFGUID category)
|
||||||
{
|
{
|
||||||
WCHAR szguid[64];
|
HKEY rootkey = 0, categorieskey = 0;
|
||||||
HKEY hrkey = 0;
|
WCHAR dmoW[64], catW[64];
|
||||||
HKEY hckey = 0;
|
HRESULT hr = S_FALSE;
|
||||||
LONG ret;
|
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);
|
GUIDToString(dmoW, dmo);
|
||||||
if (ERROR_SUCCESS != ret)
|
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;
|
goto lend;
|
||||||
|
}
|
||||||
|
|
||||||
ret = RegDeleteKeyW(hrkey, szguid);
|
/* remove from all categories */
|
||||||
if (ERROR_SUCCESS != ret)
|
if (IsEqualGUID(category, &GUID_NULL))
|
||||||
goto lend;
|
{
|
||||||
|
DWORD index = 0, len = sizeof(catW)/sizeof(WCHAR);
|
||||||
|
|
||||||
ret = RegOpenKeyExW(hrkey, szDMOCategories, 0, KEY_WRITE, &hckey);
|
while (!RegEnumKeyExW(categorieskey, index++, catW, &len, NULL, NULL, NULL, NULL))
|
||||||
if (ERROR_SUCCESS != ret)
|
hr = unregister_dmo_from_category(dmoW, catW, categorieskey);
|
||||||
goto lend;
|
}
|
||||||
|
else
|
||||||
ret = RegDeleteKeyW(hckey, szguid);
|
{
|
||||||
if (ERROR_SUCCESS != ret)
|
GUIDToString(catW, category);
|
||||||
goto lend;
|
hr = unregister_dmo_from_category(dmoW, catW, categorieskey);
|
||||||
|
}
|
||||||
|
|
||||||
lend:
|
lend:
|
||||||
if (hckey)
|
if (categorieskey)
|
||||||
RegCloseKey(hckey);
|
RegCloseKey(categorieskey);
|
||||||
if (hrkey)
|
|
||||||
RegCloseKey(hrkey);
|
|
||||||
|
|
||||||
return HRESULT_FROM_WIN32(ret);
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
TESTDLL = msdmo.dll
|
||||||
|
IMPORTS = msdmo
|
||||||
|
|
||||||
|
C_SRCS = \
|
||||||
|
msdmo.c
|
|
@ -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();
|
||||||
|
}
|
Loading…
Reference in New Issue