windows-nt/Source/XPSP1/NT/com/ole32/ih/hkldinp.h
2020-09-26 16:20:57 +08:00

101 lines
2.6 KiB
C

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994.
//
// File: hkLdInP.h
//
// Contents: Inline function to load the DLL of an inproc server
//
// Functions:
//
// History: 01-Sep-94 Don Wright Created
// 08-Sep-94 Garry Lenz Separate into two functions
// 14-Nov-94 Don Wright Make LogEvent messages more complete
//
//--------------------------------------------------------------------------
#ifndef _LDINPROC_H_
#define _LDINPROC_H_
#include <Windows.h>
#include <TChar.h>
#include "hkregkey.h"
#include "hkLogEvt.h"
#include "hkole32x.h"
#define MAX_CLSID 39 // Length of CLSID string including zero terminator
enum ELOGEVENT
{
eDontLogEvents,
eLogEvents
};
inline HINSTANCE LOADINPROCSERVER(WCHAR* wszClsid, ELOGEVENT eLog=eLogEvents)
{
WCHAR szEventSource[] = L"HookOleLoadInprocServer";
CHAR szInProc32[] = "InprocServer32";
CHAR szClsidKey[MAX_PATH];
CHAR szDllName[MAX_PATH];
WCHAR wszDllName[MAX_PATH];
CHAR szClsid[MAX_CLSID];
WCHAR szMessageBuff[1024];
long lSize = sizeof(szDllName);
LONG lRegResults;
HINSTANCE hDll = NULL;
strcpy(szClsidKey,szCLSIDKey);
strcat(szClsidKey,KEY_SEP);
WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wszClsid, -01, szClsid, sizeof (szClsid), NULL, NULL);
strcat(szClsidKey,szClsid);
strcat(szClsidKey,KEY_SEP);
strcat(szClsidKey,szInProc32);
lRegResults = RegQueryValueA(HKEY_CLASSES_ROOT,
szClsidKey,
szDllName,
&lSize);
if (lRegResults == ERROR_SUCCESS)
{
if (hDll == 0)
{
hDll = LoadLibraryA(szDllName);
if ((eLog == eLogEvents) && (hDll == 0))
{
lstrcpyW(szMessageBuff,L"Error loading library - ");
MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, szDllName, -1, wszDllName, lstrlenA(szDllName)+1);
lstrcatW(szMessageBuff,wszDllName);
lstrcatW(szMessageBuff,L" for CLSID ");
lstrcatW(szMessageBuff,wszClsid);
LogEvent(szEventSource,szMessageBuff);
}
}
}
else if (eLog == eLogEvents)
{
lstrcpyW(szMessageBuff,L"Error reading registry for CLSID!");
lstrcatW(szMessageBuff,wszClsid);
LogEvent(szEventSource,szMessageBuff);
}
return hDll;
}
inline HINSTANCE LOADINPROCSERVER(REFCLSID rclsid, ELOGEVENT eLog=eLogEvents)
{
WCHAR szClsid[MAX_CLSID];
HRESULT hResult;
HINSTANCE hDll = NULL;
hResult = StringFromGUID2(rclsid,szClsid,sizeof(szClsid));
if (SUCCEEDED(hResult))
{
hDll = LOADINPROCSERVER(szClsid, eLogEvents);
}
return hDll;
}
#endif //_LDINPROC_H_