Zebediah Figura : msdmo: Return S_OK from DMOGetTypes() even if the buffer is too short.

Alexandre Julliard julliard at winehq.org
Mon Jul 13 16:08:49 CDT 2020


Module: wine
Branch: master
Commit: 03a2191449ab9bbcc118e46e5bac3a7483d509dd
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=03a2191449ab9bbcc118e46e5bac3a7483d509dd

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Mon Jul 13 09:38:02 2020 -0500

msdmo: Return S_OK from DMOGetTypes() even if the buffer is too short.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msdmo/dmoreg.c      | 92 ++++++++++++++++++++----------------------------
 dlls/msdmo/tests/msdmo.c |  2 +-
 2 files changed, 39 insertions(+), 55 deletions(-)

diff --git a/dlls/msdmo/dmoreg.c b/dlls/msdmo/dmoreg.c
index a23bd95512..cd253c3e9a 100644
--- a/dlls/msdmo/dmoreg.c
+++ b/dlls/msdmo/dmoreg.c
@@ -706,62 +706,46 @@ static const IEnumDMOVtbl edmovt =
 	IEnumDMO_fnClone,
 };
 
-
-HRESULT read_types(HKEY root, LPCWSTR key, ULONG *supplied, ULONG requested, DMO_PARTIAL_MEDIATYPE* types )
-{
-    DWORD len = requested * sizeof(DMO_PARTIAL_MEDIATYPE);
-    LONG ret = RegQueryValueExW(root, key, NULL, NULL, (BYTE *)types, &len);
-
-    *supplied = len / sizeof(DMO_PARTIAL_MEDIATYPE);
-    return HRESULT_FROM_WIN32(ret);
-}
-
 /***************************************************************
  * DMOGetTypes (MSDMO.@)
  */
-HRESULT WINAPI DMOGetTypes(REFCLSID clsidDMO,
-               ULONG ulInputTypesRequested,
-               ULONG* pulInputTypesSupplied,
-               DMO_PARTIAL_MEDIATYPE* pInputTypes,
-               ULONG ulOutputTypesRequested,
-               ULONG* pulOutputTypesSupplied,
-               DMO_PARTIAL_MEDIATYPE* pOutputTypes)
+HRESULT WINAPI DMOGetTypes(REFCLSID clsid, ULONG input_count, ULONG *ret_input_count, DMO_PARTIAL_MEDIATYPE *input,
+        ULONG output_count, ULONG *ret_output_count, DMO_PARTIAL_MEDIATYPE *output)
 {
-  HKEY root,hkey;
-  HRESULT ret = S_OK;
-  WCHAR szguid[64];
-
-  TRACE ("(%s,%u,%p,%p,%u,%p,%p)\n", debugstr_guid(clsidDMO), ulInputTypesRequested,
-        pulInputTypesSupplied, pInputTypes, ulOutputTypesRequested, pulOutputTypesSupplied,
-        pOutputTypes);
-
-  if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"DirectShow\\MediaObjects", 0, KEY_READ, &root))
-    return E_FAIL;
-
-  if (ERROR_SUCCESS != RegOpenKeyExW(root,GUIDToString(szguid,clsidDMO) , 0,
-                                     KEY_READ, &hkey))
-  {
-    RegCloseKey(root);
-    return E_FAIL;
-  }
-
-  if (ulInputTypesRequested > 0)
-  {
-    ret = read_types(hkey, L"InputTypes", pulInputTypesSupplied, ulInputTypesRequested, pInputTypes );
-  }
-  else
-    *pulInputTypesSupplied = 0;
-
-  if (ulOutputTypesRequested > 0)
-  {
-    HRESULT ret2;
-    ret2 = read_types(hkey, L"OutputTypes", pulOutputTypesSupplied, ulOutputTypesRequested, pOutputTypes );
-
-    if (ret == S_OK)
-        ret = ret2;
-  }
-  else
-    *pulOutputTypesSupplied = 0;
-
-  return ret;
+    WCHAR guidstr[64];
+    HKEY root, key;
+    LSTATUS ret;
+    DWORD size;
+
+    TRACE("clsid %s, input_count %u, ret_input_count %p, input %p, output_count %u, ret_output_count %p, output %p.\n",
+            debugstr_guid(clsid), input_count, ret_input_count, input, output_count, ret_output_count, output);
+
+    if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"DirectShow\\MediaObjects", 0, KEY_READ, &root))
+        return E_FAIL;
+
+    if (RegOpenKeyExW(root, GUIDToString(guidstr, clsid), 0, KEY_READ, &key))
+    {
+        RegCloseKey(root);
+        return E_FAIL;
+    }
+
+    *ret_input_count = 0;
+    if (input_count > 0)
+    {
+        size = input_count * sizeof(DMO_PARTIAL_MEDIATYPE);
+        ret = RegQueryValueExW(key, L"InputTypes", NULL, NULL, (BYTE *)input, &size);
+        if (!ret || ret == ERROR_MORE_DATA)
+            *ret_input_count = size / sizeof(DMO_PARTIAL_MEDIATYPE);
+    }
+
+    *ret_output_count = 0;
+    if (output_count > 0)
+    {
+        size = output_count * sizeof(DMO_PARTIAL_MEDIATYPE);
+        ret = RegQueryValueExW(key, L"OutputTypes", NULL, NULL, (BYTE *)output, &size);
+        if (!ret || ret == ERROR_MORE_DATA)
+            *ret_output_count = size / sizeof(DMO_PARTIAL_MEDIATYPE);
+    }
+
+    return S_OK;
 }
diff --git a/dlls/msdmo/tests/msdmo.c b/dlls/msdmo/tests/msdmo.c
index 14653ea8d7..2afa56e5a6 100644
--- a/dlls/msdmo/tests/msdmo.c
+++ b/dlls/msdmo/tests/msdmo.c
@@ -143,7 +143,7 @@ static void test_DMOGetTypes(void)
 
     memset(types, 0, sizeof(types));
     hr = DMOGetTypes(&GUID_unknowndmo, 1, &input_count, types, 0, &output_count, NULL);
-    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
     todo_wine ok(input_count == 1, "Got input count %u.\n", input_count);
     ok(!output_count, "Got output count %u.\n", output_count);
     todo_wine ok(!memcmp(types, input_types, sizeof(DMO_PARTIAL_MEDIATYPE)), "Types didn't match.\n");




More information about the wine-cvs mailing list