Nikolay Sivov : msdmo: Use specified category in DMOUnregister().
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Dec 30 16:48:13 CST 2014
Module: wine
Branch: master
Commit: af6712599a0b6d9d28f4910f9be953223e93c3da
URL: http://source.winehq.org/git/wine.git/?a=commit;h=af6712599a0b6d9d28f4910f9be953223e93c3da
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Dec 29 13:25:45 2014 +0300
msdmo: Use specified category in DMOUnregister().
---
configure | 1 +
configure.ac | 1 +
dlls/msdmo/dmoreg.c | 73 ++++++++++++++++++++++++++++++--------------
dlls/msdmo/tests/Makefile.in | 5 +++
dlls/msdmo/tests/msdmo.c | 60 ++++++++++++++++++++++++++++++++++++
5 files changed, 117 insertions(+), 23 deletions(-)
diff --git a/configure b/configure
index 119eaa8..b4e041d 100755
--- a/configure
+++ b/configure
@@ -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
diff --git a/configure.ac b/configure.ac
index 9f64cd3..94b83ab 100644
--- a/configure.ac
+++ b/configure.ac
@@ -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)
diff --git a/dlls/msdmo/dmoreg.c b/dlls/msdmo/dmoreg.c
index 74ab6b6..0abbea0 100644
--- a/dlls/msdmo/dmoreg.c
+++ b/dlls/msdmo/dmoreg.c
@@ -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)
- goto lend;
+ GUIDToString(dmoW, dmo);
+ RegDeleteKeyW(rootkey, dmoW);
- ret = RegDeleteKeyW(hrkey, szguid);
- if (ERROR_SUCCESS != ret)
+ /* 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 = RegOpenKeyExW(hrkey, szDMOCategories, 0, KEY_WRITE, &hckey);
- if (ERROR_SUCCESS != ret)
- goto lend;
+ /* remove from all categories */
+ if (IsEqualGUID(category, &GUID_NULL))
+ {
+ DWORD index = 0, len = sizeof(catW)/sizeof(WCHAR);
- 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;
}
diff --git a/dlls/msdmo/tests/Makefile.in b/dlls/msdmo/tests/Makefile.in
new file mode 100644
index 0000000..105baba
--- /dev/null
+++ b/dlls/msdmo/tests/Makefile.in
@@ -0,0 +1,5 @@
+TESTDLL = msdmo.dll
+IMPORTS = msdmo
+
+C_SRCS = \
+ msdmo.c
diff --git a/dlls/msdmo/tests/msdmo.c b/dlls/msdmo/tests/msdmo.c
new file mode 100644
index 0000000..4fc0c35
--- /dev/null
+++ b/dlls/msdmo/tests/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();
+}
More information about the wine-cvs
mailing list