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