[PATCH 1/2] dlls: Add initial mmdevapi dll

Maarten Lankhorst m.b.lankhorst at gmail.com
Wed Dec 9 08:38:43 CST 2009


---
 dlls/mmdevapi/Makefile.in   |   15 ++++
 dlls/mmdevapi/main.c        |   60 ++++++++++++++
 dlls/mmdevapi/mmdevapi.spec |   18 ++++
 dlls/mmdevapi/regsvr.c      |  181 +++++++++++++++++++++++++++++++++++++++++++
 tools/wine.inf.in           |    1 +
 5 files changed, 275 insertions(+), 0 deletions(-)
 create mode 100644 dlls/mmdevapi/Makefile.in
 create mode 100644 dlls/mmdevapi/main.c
 create mode 100644 dlls/mmdevapi/mmdevapi.spec
 create mode 100644 dlls/mmdevapi/regsvr.c

diff --git a/dlls/mmdevapi/Makefile.in b/dlls/mmdevapi/Makefile.in
new file mode 100644
index 0000000..6cd0a77
--- /dev/null
+++ b/dlls/mmdevapi/Makefile.in
@@ -0,0 +1,15 @@
+# Generated from /home/ftp/MMDevAPI.dll by winedump.
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = mmdevapi.dll
+IMPORTS   = user32 kernel32 ntdll advapi32 ole32
+
+C_SRCS = \
+	main.c \
+	regsvr.c
+
+ at MAKE_DLL_RULES@
+
+ at DEPENDENCIES@  # everything below this line is overwritten by make depend
diff --git a/dlls/mmdevapi/main.c b/dlls/mmdevapi/main.c
new file mode 100644
index 0000000..0ce3031
--- /dev/null
+++ b/dlls/mmdevapi/main.c
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2009 Maarten Lankhorst
+ *
+ * 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 "config.h"
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "wine/debug.h"
+
+#include "initguid.h"
+#include "ole2.h"
+#include "mmdeviceapi.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi);
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+    TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
+
+    switch (fdwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+            DisableThreadLibraryCalls(hinstDLL);
+            break;
+        case DLL_PROCESS_DETACH:
+            break;
+    }
+
+    return TRUE;
+}
+
+HRESULT WINAPI DllCanUnloadNow(void)
+{
+	FIXME("stub\n");
+	return S_FALSE;
+}
+
+HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
+{
+	FIXME("stub\n");
+	return E_NOINTERFACE;
+}
+
diff --git a/dlls/mmdevapi/mmdevapi.spec b/dlls/mmdevapi/mmdevapi.spec
new file mode 100644
index 0000000..1aa0a35
--- /dev/null
+++ b/dlls/mmdevapi/mmdevapi.spec
@@ -0,0 +1,18 @@
+2 stub MMDEVAPI_2
+3 stub MMDEVAPI_3
+4 stub MMDEVAPI_4
+5 stub MMDEVAPI_5
+6 stub MMDEVAPI_6
+7 stub MMDEVAPI_7
+8 stub MMDEVAPI_8
+9 stub MMDEVAPI_9
+10 stub MMDEVAPI_10
+11 stub MMDEVAPI_11
+12 stub MMDEVAPI_12
+13 stub MMDEVAPI_13
+14 stub MMDEVAPI_14
+15 stub MMDEVAPI_15
+16 stdcall -private DllCanUnloadNow()
+17 stdcall -private DllGetClassObject( ptr ptr ptr )
+18 stdcall -private DllRegisterServer()
+19 stdcall -private DllUnregisterServer()
diff --git a/dlls/mmdevapi/regsvr.c b/dlls/mmdevapi/regsvr.c
new file mode 100644
index 0000000..265c0a3
--- /dev/null
+++ b/dlls/mmdevapi/regsvr.c
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2009 Vincent Povirk for CodeWeavers
+ * Copyright 2009 Maarten Lankhorst
+ *
+ * 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
+ */
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#define COBJMACROS
+#include <stdarg.h>
+#include <string.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "winreg.h"
+#include "winerror.h"
+
+#include "guiddef.h"
+#include "objbase.h"
+#include "ocidl.h"
+#include "mmdeviceapi.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi);
+
+/***********************************************************************
+ *		interface for self-registering
+ */
+struct regsvr_coclass
+{
+    CLSID const *clsid;		/* NULL for end of list */
+    LPCSTR name;		/* can be NULL to omit */
+    LPCSTR ips32;		/* can be NULL to omit */
+    LPCSTR ips32_tmodel;	/* can be NULL to omit */
+};
+
+static HRESULT register_coclasses(struct regsvr_coclass const *list);
+static HRESULT unregister_coclasses(struct regsvr_coclass const *list);
+
+/***********************************************************************
+ *		static string constants
+ */
+static WCHAR const clsid_keyname[] = {
+    'C', 'L', 'S', 'I', 'D', 0 };
+static WCHAR const ips32_keyname[] = {
+    'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
+    '3', '2', 0 };
+static WCHAR const progid_keyname[] = {
+    'P', 'r', 'o', 'g', 'I', 'D', 0 };
+static WCHAR const viprogid_keyname[] = {
+    'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p',
+    'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D',
+    0 };
+static char const tmodel_valuename[] = "ThreadingModel";
+
+/***********************************************************************
+ *		register_coclasses
+ */
+static HRESULT register_coclasses(struct regsvr_coclass const *list)
+{
+    LONG res = ERROR_SUCCESS;
+    HKEY coclass_key;
+
+    res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0,
+			  KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL);
+    if (res != ERROR_SUCCESS) goto error_return;
+
+    for (; res == ERROR_SUCCESS && list->clsid; ++list) {
+	WCHAR buf[39];
+	HKEY clsid_key;
+
+	StringFromGUID2(list->clsid, buf, 39);
+	res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
+			      KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL);
+	if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+
+	if (list->name) {
+	    res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ,
+				 (CONST BYTE*)(list->name),
+				 strlen(list->name) + 1);
+	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+	}
+
+	if (list->ips32) {
+	    HKEY ips32_key;
+
+	    res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0,
+				  KEY_READ | KEY_WRITE, NULL,
+				  &ips32_key, NULL);
+	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+
+	    res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ,
+				 (CONST BYTE*)list->ips32,
+				 lstrlenA(list->ips32) + 1);
+	    if (res == ERROR_SUCCESS && list->ips32_tmodel)
+		res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ,
+				     (CONST BYTE*)list->ips32_tmodel,
+				     strlen(list->ips32_tmodel) + 1);
+	    RegCloseKey(ips32_key);
+	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+	}
+
+    error_close_clsid_key:
+	RegCloseKey(clsid_key);
+    }
+
+error_close_coclass_key:
+    RegCloseKey(coclass_key);
+error_return:
+    return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ *		unregister_coclasses
+ */
+static HRESULT unregister_coclasses(struct regsvr_coclass const *list)
+{
+    LONG res = ERROR_SUCCESS;
+    HKEY coclass_key;
+
+    res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0,
+			KEY_READ | KEY_WRITE, &coclass_key);
+    if (res == ERROR_FILE_NOT_FOUND) return S_OK;
+    if (res != ERROR_SUCCESS) goto error_return;
+
+    for (; res == ERROR_SUCCESS && list->clsid; ++list) {
+	WCHAR buf[39];
+
+	StringFromGUID2(list->clsid, buf, 39);
+	res = RegDeleteTreeW(coclass_key, buf);
+	if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+	if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+    }
+
+error_close_coclass_key:
+    RegCloseKey(coclass_key);
+error_return:
+    return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ *		coclass list
+ */
+static struct regsvr_coclass const coclass_list[] = {
+    {   &CLSID_MMDeviceEnumerator,
+	"MMDeviceEnumerator class",
+	"mmdevapi.dll",
+	"both"
+    },
+    { NULL }			/* list terminator */
+};
+
+HRESULT WINAPI DllRegisterServer(void)
+{
+    TRACE("\n");
+
+    return register_coclasses(coclass_list);
+}
+
+HRESULT WINAPI DllUnregisterServer(void)
+{
+    TRACE("\n");
+
+    return unregister_coclasses(coclass_list);
+}
diff --git a/tools/wine.inf.in b/tools/wine.inf.in
index f676898..623ea0a 100644
--- a/tools/wine.inf.in
+++ b/tools/wine.inf.in
@@ -2385,6 +2385,7 @@ HKLM,%CurrentVersion%\Telephony\Country List\998,"SameAreaRule",,"G"
 11,,itss.dll,1
 11,,jscript.dll,1
 11,,mlang.dll,1
+11,,mmdevapi.dll,1
 11,,msctf.dll,1
 11,,msdaps.dll,1
 11,,mshtml.dll,1
-- 
1.6.5.4




More information about the wine-patches mailing list