[v6 PATCH 1/4] mfplat: Implement MFTRegister

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Mon May 8 17:50:26 CDT 2017


From: Michael Müller <michael at fds-team.de>

v6
- Removed unneeded allocation.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
 dlls/mfplat/Makefile.in |   1 +
 dlls/mfplat/main.c      | 124 ++++++++++++++++++++++++++++++++++++++++++++++++
 dlls/mfplat/mfplat.spec |   2 +-
 include/mfapi.h         |   3 ++
 4 files changed, 129 insertions(+), 1 deletion(-)

diff --git a/dlls/mfplat/Makefile.in b/dlls/mfplat/Makefile.in
index 2b5bd24..8af0525 100644
--- a/dlls/mfplat/Makefile.in
+++ b/dlls/mfplat/Makefile.in
@@ -1,4 +1,5 @@
 MODULE    = mfplat.dll
+IMPORTS   = advapi32
 
 C_SRCS = \
 	main.c
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index aae81f8..299f30b 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -23,15 +23,44 @@
 
 #include "windef.h"
 #include "winbase.h"
+#include "winuser.h"
+#include "winreg.h"
 
 #include "initguid.h"
 #include "mfapi.h"
 #include "mferror.h"
 
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
 
+static const WCHAR transform_keyW[] = {'S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s',
+                                 '\\','M','e','d','i','a','F','o','u','n','d','a','t','i','o','n','\\',
+                                 'T','r','a','n','s','f','o','r','m','s',0};
+static const WCHAR categories_keyW[] = {'S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s',
+                                 '\\','M','e','d','i','a','F','o','u','n','d','a','t','i','o','n','\\',
+                                 'T','r','a','n','s','f','o','r','m','s','\\',
+                                 'C','a','t','e','g','o','r','i','e','s',0};
+static const WCHAR inputtypesW[]  = {'I','n','p','u','t','T','y','p','e','s',0};
+static const WCHAR outputtypesW[] = {'O','u','t','p','u','t','T','y','p','e','s',0};
+static const WCHAR szGUIDFmt[] =
+{
+    '%','0','8','x','-','%','0','4','x','-','%','0','4','x','-','%','0',
+    '2','x','%','0','2','x','-','%','0','2','x','%','0','2','x','%','0','2',
+    'x','%','0','2','x','%','0','2','x','%','0','2','x',0
+};
+
+static WCHAR* GUIDToString(WCHAR *str, REFGUID guid)
+{
+    sprintfW(str, szGUIDFmt, guid->Data1, guid->Data2,
+        guid->Data3, guid->Data4[0], guid->Data4[1],
+        guid->Data4[2], guid->Data4[3], guid->Data4[4],
+        guid->Data4[5], guid->Data4[6], guid->Data4[7]);
+
+    return str;
+}
+
 BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
 {
     switch (reason)
@@ -46,6 +75,101 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
     return TRUE;
 }
 
+static HRESULT register_transform(CLSID *clsid, WCHAR *name,
+                                  UINT32 cinput, MFT_REGISTER_TYPE_INFO *input_types,
+                                  UINT32 coutput, MFT_REGISTER_TYPE_INFO *output_types)
+{
+    static const WCHAR reg_format[] = {'%','s','\\','%','s',0};
+    HKEY hclsid = 0;
+    WCHAR buffer[64];
+    DWORD size;
+    LONG ret;
+    WCHAR str[250];
+
+    GUIDToString(buffer, clsid);
+    sprintfW(str, reg_format, transform_keyW, buffer);
+
+    if (RegCreateKeyW(HKEY_LOCAL_MACHINE, str, &hclsid))
+        return E_FAIL;
+
+    size = (strlenW(name) + 1) * sizeof(WCHAR);
+    if (RegSetValueExW(hclsid, NULL, 0, REG_SZ, (BYTE *)name, size))
+        goto err;
+
+    if (cinput && input_types)
+    {
+        size = cinput * sizeof(MFT_REGISTER_TYPE_INFO);
+
+        ret = RegSetValueExW(hclsid, inputtypesW, 0, REG_BINARY, (BYTE *)input_types, size);
+        if (ret)
+            goto err;
+    }
+
+    if (coutput && output_types)
+    {
+        size = coutput * sizeof(MFT_REGISTER_TYPE_INFO);
+
+        ret = RegSetValueExW(hclsid, outputtypesW, 0, REG_BINARY, (BYTE *)output_types, size);
+        if (ret)
+            goto err;
+    }
+
+    RegCloseKey(hclsid);
+    return S_OK;
+
+err:
+    RegCloseKey(hclsid);
+    return E_FAIL;
+}
+
+static HRESULT register_category(CLSID *clsid, GUID *category)
+{
+    static const WCHAR reg_format[] = {'%','s','\\','%','s','\\','%','s',0};
+    HKEY htmp1;
+    WCHAR guid1[64], guid2[64];
+    WCHAR str[350];
+
+    GUIDToString(guid1, category);
+    GUIDToString(guid2, clsid);
+
+    sprintfW(str, reg_format, categories_keyW, guid1, guid2);
+
+    if (RegCreateKeyW(HKEY_LOCAL_MACHINE, str, &htmp1))
+        return E_FAIL;
+
+    RegCloseKey(htmp1);
+    return S_OK;
+}
+
+/***********************************************************************
+ *      MFTRegister (mfplat.@)
+ */
+HRESULT WINAPI MFTRegister(CLSID clsid, GUID category, LPWSTR name, UINT32 flags, UINT32 cinput,
+                           MFT_REGISTER_TYPE_INFO *input_types, UINT32 coutput,
+                           MFT_REGISTER_TYPE_INFO *output_types, IMFAttributes *attributes)
+{
+    HRESULT hr;
+
+    TRACE("(%s, %s, %s, %x, %u, %p, %u, %p, %p)\n", debugstr_guid(&clsid), debugstr_guid(&category),
+                                                    debugstr_w(name), flags, cinput, input_types,
+                                                    coutput, output_types, attributes);
+
+    if (attributes)
+        FIXME("attributes not yet supported.\n");
+
+    if (flags)
+        FIXME("flags not yet supported.\n");
+
+    hr = register_transform(&clsid, name, cinput, input_types, coutput, output_types);
+    if(FAILED(hr))
+        ERR("Failed to write register transform\n");
+
+    if (SUCCEEDED(hr))
+        hr = register_category(&clsid, &category);
+
+    return hr;
+}
+
 /***********************************************************************
  *      MFStartup (mfplat.@)
  */
diff --git a/dlls/mfplat/mfplat.spec b/dlls/mfplat/mfplat.spec
index 9c96f436..042a919 100644
--- a/dlls/mfplat/mfplat.spec
+++ b/dlls/mfplat/mfplat.spec
@@ -137,7 +137,7 @@
 @ stub MFTEnum
 @ stub MFTEnumEx
 @ stub MFTGetInfo
-@ stub MFTRegister
+@ stdcall MFTRegister(int128 int128 wstr long long ptr long ptr ptr)
 @ stub MFTRegisterLocal
 @ stub MFTRegisterLocalByCLSID
 @ stub MFTUnregister
diff --git a/include/mfapi.h b/include/mfapi.h
index 5219ce1..2eca9c3 100644
--- a/include/mfapi.h
+++ b/include/mfapi.h
@@ -33,6 +33,9 @@ HRESULT WINAPI MFCancelWorkItem(MFWORKITEM_KEY key);
 HRESULT WINAPI MFCreateAttributes(IMFAttributes **attributes, UINT32 size);
 HRESULT WINAPI MFGetTimerPeriodicity(DWORD *periodicity);
 HRESULT WINAPI MFLockPlatform(void);
+HRESULT WINAPI MFTRegister(CLSID clsid, GUID category, LPWSTR name, UINT32 flags, UINT32 cinput,
+                           MFT_REGISTER_TYPE_INFO *input_types, UINT32 coutput,
+                           MFT_REGISTER_TYPE_INFO *output_types, IMFAttributes *attributes);
 HRESULT WINAPI MFShutdown(void);
 HRESULT WINAPI MFStartup(ULONG version, DWORD flags);
 HRESULT WINAPI MFUnlockPlatform(void);
-- 
1.9.1



More information about the wine-patches mailing list