Leaked source code of windows server 2003
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

#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;
}