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_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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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