Owen Rudge : mapi32: Scan registry for MAPI providers and load them.
Alexandre Julliard
julliard at winehq.org
Fri Sep 18 13:37:36 CDT 2009
Module: wine
Branch: master
Commit: b6e5ee604ac46d4a2d1c1cc547100cbe5c36187f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b6e5ee604ac46d4a2d1c1cc547100cbe5c36187f
Author: Owen Rudge <orudge at codeweavers.com>
Date: Fri Sep 18 15:15:34 2009 +0100
mapi32: Scan registry for MAPI providers and load them.
---
dlls/mapi32/Makefile.in | 2 +-
dlls/mapi32/mapi32_main.c | 5 +-
dlls/mapi32/util.c | 144 +++++++++++++++++++++++++++++++++++++++++++++
dlls/mapi32/util.h | 28 +++++++++
4 files changed, 177 insertions(+), 2 deletions(-)
diff --git a/dlls/mapi32/Makefile.in b/dlls/mapi32/Makefile.in
index 3e311de..e38cfcf 100644
--- a/dlls/mapi32/Makefile.in
+++ b/dlls/mapi32/Makefile.in
@@ -4,7 +4,7 @@ SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = mapi32.dll
IMPORTLIB = mapi32
-IMPORTS = uuid shlwapi shell32 kernel32
+IMPORTS = uuid shlwapi shell32 advapi32 kernel32
C_SRCS = \
imalloc.c \
diff --git a/dlls/mapi32/mapi32_main.c b/dlls/mapi32/mapi32_main.c
index b9d5888..0f82e76 100644
--- a/dlls/mapi32/mapi32_main.c
+++ b/dlls/mapi32/mapi32_main.c
@@ -1,7 +1,7 @@
/*
* MAPI basics
*
- * Copyright 2001 CodeWeavers Inc.
+ * Copyright 2001, 2009 CodeWeavers Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,6 +29,7 @@
#include "mapiform.h"
#include "mapi.h"
#include "wine/debug.h"
+#include "util.h"
WINE_DEFAULT_DEBUG_CHANNEL(mapi);
@@ -45,9 +46,11 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hinstDLL);
+ load_mapi_providers();
break;
case DLL_PROCESS_DETACH:
TRACE("DLL_PROCESS_DETACH: %d objects remaining\n", MAPI_ObjectCount);
+ unload_mapi_providers();
break;
}
return TRUE;
diff --git a/dlls/mapi32/util.c b/dlls/mapi32/util.c
index c621a0f..6044749 100644
--- a/dlls/mapi32/util.c
+++ b/dlls/mapi32/util.c
@@ -2,6 +2,7 @@
* MAPI Utility functions
*
* Copyright 2004 Jon Griffiths
+ * Copyright 2009 Owen Rudge for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -37,6 +38,7 @@
#include "mapival.h"
#include "xcmc.h"
#include "msi.h"
+#include "util.h"
WINE_DEFAULT_DEBUG_CHANNEL(mapi);
@@ -903,3 +905,145 @@ HRESULT WINAPI HrQueryAllRows(LPMAPITABLE lpTable, LPSPropTagArray lpPropTags,
*lppRows = NULL;
return MAPI_E_CALL_FAILED;
}
+
+static HMODULE mapi_provider;
+static HMODULE mapi_ex_provider;
+
+/**************************************************************************
+ * load_mapi_provider
+ *
+ * Attempts to load a MAPI provider from the specified registry key.
+ *
+ * Returns a handle to the loaded module in `mapi_provider' if successful.
+ */
+static void load_mapi_provider(HKEY hkeyMail, LPCWSTR valueName, HMODULE *mapi_provider)
+{
+ static const WCHAR mapi32_dll[] = {'m','a','p','i','3','2','.','d','l','l',0 };
+
+ DWORD dwType, dwLen = 0;
+ LPWSTR dllPath;
+
+ /* Check if we have a value set for DLLPath */
+ if ((RegQueryValueExW(hkeyMail, valueName, NULL, &dwType, NULL, &dwLen) == ERROR_SUCCESS) &&
+ ((dwType == REG_SZ) || (dwType == REG_EXPAND_SZ)) && (dwLen > 0))
+ {
+ dllPath = HeapAlloc(GetProcessHeap(), 0, dwLen);
+
+ if (dllPath)
+ {
+ RegQueryValueExW(hkeyMail, valueName, NULL, NULL, (LPBYTE)dllPath, &dwLen);
+
+ /* Check that this value doesn't refer to mapi32.dll (eg, as Outlook does) */
+ if (lstrcmpiW(dllPath, mapi32_dll) != 0)
+ {
+ if (dwType == REG_EXPAND_SZ)
+ {
+ DWORD dwExpandLen;
+ LPWSTR dllPathExpanded;
+
+ /* Expand the path if necessary */
+ dwExpandLen = ExpandEnvironmentStringsW(dllPath, NULL, 0);
+ dllPathExpanded = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * dwExpandLen + 1);
+
+ if (dllPathExpanded)
+ {
+ ExpandEnvironmentStringsW(dllPath, dllPathExpanded, dwExpandLen + 1);
+
+ HeapFree(GetProcessHeap(), 0, dllPath);
+ dllPath = dllPathExpanded;
+ }
+ }
+
+ /* Load the DLL */
+ TRACE("loading %s\n", debugstr_w(dllPath));
+ *mapi_provider = LoadLibraryW(dllPath);
+ }
+
+ HeapFree(GetProcessHeap(), 0, dllPath);
+ }
+ }
+}
+
+/**************************************************************************
+ * load_mapi_providers
+ *
+ * Scans the registry for MAPI providers and attempts to load a Simple and
+ * Extended MAPI library.
+ *
+ * Returns TRUE if at least one library loaded, FALSE otherwise.
+ */
+void load_mapi_providers(void)
+{
+ static const WCHAR regkey_mail[] = {
+ 'S','o','f','t','w','a','r','e','\\','C','l','i','e','n','t','s','\\',
+ 'M','a','i','l',0 };
+
+ static const WCHAR regkey_dllpath[] = {'D','L','L','P','a','t','h',0 };
+ static const WCHAR regkey_dllpath_ex[] = {'D','L','L','P','a','t','h','E','x',0 };
+ static const WCHAR regkey_backslash[] = { '\\', 0 };
+
+ HKEY hkeyMail;
+ DWORD dwType, dwLen = 0;
+ LPWSTR appName = NULL, appKey = NULL;
+
+ TRACE("()\n");
+
+ /* Open the Mail key */
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, regkey_mail, 0, KEY_READ, &hkeyMail) != ERROR_SUCCESS)
+ return;
+
+ /* Check if we have a default value set, and the length of it */
+ if ((RegQueryValueExW(hkeyMail, NULL, NULL, &dwType, NULL, &dwLen) != ERROR_SUCCESS) ||
+ !((dwType == REG_SZ) || (dwType == REG_EXPAND_SZ)) || (dwLen == 0))
+ goto cleanUp;
+
+ appName = HeapAlloc(GetProcessHeap(), 0, dwLen);
+
+ if (!appName)
+ goto cleanUp;
+
+ /* Get the value, and get the path to the app key */
+ RegQueryValueExW(hkeyMail, NULL, NULL, NULL, (LPBYTE)appName, &dwLen);
+
+ TRACE("appName: %s\n", debugstr_w(appName));
+
+ appKey = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * (lstrlenW(regkey_mail) +
+ lstrlenW(regkey_backslash) + lstrlenW(appName)));
+
+ if (!appKey)
+ goto cleanUp;
+
+ lstrcpyW(appKey, regkey_mail);
+ lstrcatW(appKey, regkey_backslash);
+ lstrcatW(appKey, appName);
+
+ RegCloseKey(hkeyMail);
+
+ TRACE("appKey: %s\n", debugstr_w(appKey));
+
+ /* Open the app's key */
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, appKey, 0, KEY_READ, &hkeyMail) != ERROR_SUCCESS)
+ return;
+
+ /* Try to load the providers */
+ load_mapi_provider(hkeyMail, regkey_dllpath, &mapi_provider);
+ load_mapi_provider(hkeyMail, regkey_dllpath_ex, &mapi_ex_provider);
+
+cleanUp:
+ RegCloseKey(hkeyMail);
+ HeapFree(GetProcessHeap(), 0, appKey);
+ HeapFree(GetProcessHeap(), 0, appName);
+}
+
+/**************************************************************************
+ * unload_mapi_providers
+ *
+ * Unloads any loaded MAPI libraries.
+ */
+void unload_mapi_providers(void)
+{
+ TRACE("()\n");
+
+ FreeLibrary(mapi_provider);
+ FreeLibrary(mapi_ex_provider);
+}
diff --git a/dlls/mapi32/util.h b/dlls/mapi32/util.h
new file mode 100644
index 0000000..450d671
--- /dev/null
+++ b/dlls/mapi32/util.h
@@ -0,0 +1,28 @@
+/*
+ * MAPI utility header file
+ *
+ * Copyright 2009 Owen Rudge 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
+ */
+
+#ifndef _MAPI_UTIL_H
+
+#define _MAPI_UTIL_H
+
+extern void load_mapi_providers(void);
+extern void unload_mapi_providers(void);
+
+#endif
More information about the wine-cvs
mailing list