You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
5.1 KiB
161 lines
5.1 KiB
#pragma warning(disable: 4201) // nameless struct/union
|
|
#pragma warning(disable: 4514) // unreferenced inline function removed
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Includes
|
|
// --------------------------------------------------------------------------------
|
|
#include "pch.hxx"
|
|
#include "shlwapi.h"
|
|
//#include "shared.h"
|
|
#define IMPLEMENT_LOADER_FUNCTIONS
|
|
#include "demand.h"
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// CRIT_GET_PROC_ADDR
|
|
// --------------------------------------------------------------------------------
|
|
#define CRIT_GET_PROC_ADDR(h, fn, temp) \
|
|
temp = (TYP_##fn) GetProcAddress(h, #fn); \
|
|
if (temp) \
|
|
VAR_##fn = temp; \
|
|
else \
|
|
{ \
|
|
goto error; \
|
|
}
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// RESET
|
|
// --------------------------------------------------------------------------------
|
|
#define RESET(fn) VAR_##fn = LOADER_##fn;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// GET_PROC_ADDR
|
|
// --------------------------------------------------------------------------------
|
|
#define GET_PROC_ADDR(h, fn) \
|
|
VAR_##fn = (TYP_##fn) GetProcAddress(h, #fn);
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// GET_PROC_ADDR_ORDINAL
|
|
// --------------------------------------------------------------------------------
|
|
#define GET_PROC_ADDR_ORDINAL(h, fn, ord) \
|
|
VAR_##fn = (TYP_##fn) GetProcAddress(h, MAKEINTRESOURCE(ord)); \
|
|
Assert(VAR_##fn != NULL);
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// GET_PROC_ADDR3
|
|
// --------------------------------------------------------------------------------
|
|
#define GET_PROC_ADDR3(h, fn, varname) \
|
|
VAR_##varname = (TYP_##varname) GetProcAddress(h, #fn); \
|
|
Assert(VAR_##varname != NULL);
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Static Globals
|
|
// --------------------------------------------------------------------------------
|
|
HMODULE s_hINetComm = 0;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// FreeDemandLoadedLibs
|
|
// --------------------------------------------------------------------------------
|
|
void FreeDemandLoadedLibs(void)
|
|
{
|
|
if (s_hINetComm)
|
|
{
|
|
FreeLibrary(s_hINetComm);
|
|
s_hINetComm=NULL;
|
|
}
|
|
}
|
|
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// SmartLoadLibrary
|
|
// --------------------------------------------------------------------------------
|
|
HINSTANCE SmartLoadLibrary(HKEY hKeyRoot, LPCSTR pszRegRoot, LPCSTR pszRegValue,
|
|
LPCSTR pszDllName)
|
|
{
|
|
// Locals
|
|
BOOL fProblem=FALSE;
|
|
HINSTANCE hInst=NULL;
|
|
HKEY hKey=NULL, hKey2 = NULL;
|
|
CHAR szPath[MAX_PATH];
|
|
DWORD cb=MAX_PATH;
|
|
DWORD dwT;
|
|
LPSTR pszPath=szPath;
|
|
CHAR szT[MAX_PATH];
|
|
|
|
// Try to open the regkey
|
|
if (ERROR_SUCCESS != RegOpenKeyEx(hKeyRoot, pszRegRoot, 0, KEY_QUERY_VALUE, &hKey))
|
|
goto exit;
|
|
|
|
// Query the Value
|
|
if (ERROR_SUCCESS != RegQueryValueEx(hKey, pszRegValue, 0, &dwT, (LPBYTE)szPath, &cb))
|
|
goto exit;
|
|
|
|
// Remove the file name from the path
|
|
PathRemoveFileSpecA(szPath);
|
|
PathAppendA(szPath, pszDllName);
|
|
|
|
// Expand Sz ?
|
|
if (REG_EXPAND_SZ == dwT)
|
|
{
|
|
// Expand It
|
|
cb = ExpandEnvironmentStrings(szPath, szT, MAX_PATH);
|
|
|
|
// Failure
|
|
if (cb == 0 || cb > MAX_PATH)
|
|
{
|
|
goto exit;
|
|
}
|
|
|
|
// Change pszPath
|
|
pszPath = szT;
|
|
}
|
|
|
|
// Try to Load Library the Dll
|
|
hInst = LoadLibrary(pszPath);
|
|
|
|
// Failure ?
|
|
if (NULL == hInst)
|
|
{
|
|
// If we are not going to try the GetModuleFName, just try the dll name
|
|
hInst = LoadLibrary(pszDllName);
|
|
|
|
// We really failed
|
|
if (NULL == hInst)
|
|
{
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
exit:
|
|
// Cleanup
|
|
if (hKey)
|
|
RegCloseKey(hKey);
|
|
|
|
// Done
|
|
return hInst;
|
|
}
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// DemandLoadINETCOMM
|
|
// --------------------------------------------------------------------------------
|
|
BOOL DemandLoadINETCOMM(void)
|
|
{
|
|
BOOL fRet = TRUE;
|
|
|
|
if (0 == s_hINetComm)
|
|
{
|
|
|
|
s_hINetComm = SmartLoadLibrary(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Outlook Express\\Inetcomm", "DllPath", "INETCOMM.DLL");
|
|
|
|
if (0 == s_hINetComm)
|
|
fRet = FALSE;
|
|
else
|
|
{
|
|
GET_PROC_ADDR(s_hINetComm, MimeEditViewSource);
|
|
GET_PROC_ADDR(s_hINetComm, MimeEditCreateMimeDocument);
|
|
}
|
|
}
|
|
|
|
return fRet;
|
|
}
|
|
|
|
|