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.
239 lines
5.1 KiB
239 lines
5.1 KiB
//=--------------------------------------------------------------------------=
|
|
// insengmn.cpp
|
|
//=--------------------------------------------------------------------------=
|
|
// Copyright 1995-1996 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
// various globals which the framewrk requires
|
|
//
|
|
//
|
|
|
|
#include "inspch.h"
|
|
#include "insobj.h"
|
|
#include "insfact.h"
|
|
#include "sitefact.h"
|
|
#include "insengmn.h"
|
|
#include "resource.h"
|
|
#include "advpub.h"
|
|
|
|
|
|
LONG g_cLocks = 0;
|
|
HINSTANCE g_hInstance = NULL;
|
|
HANDLE g_hHeap = NULL;
|
|
CRITICAL_SECTION g_cs = {0}; // per-instance
|
|
|
|
#define GUID_STR_LEN 40
|
|
//
|
|
// helper macros
|
|
//
|
|
|
|
|
|
OBJECTINFO g_ObjectInfo[] =
|
|
{
|
|
{ NULL, &CLSID_InstallEngine, NULL, OI_COCREATEABLE, "InstallEngine",
|
|
MAKEINTRESOURCE(IDS_INSTALLENGINE), NULL, NULL, VERSION_0, 0, 0 },
|
|
{ NULL, &CLSID_DownloadSiteMgr, NULL, OI_COCREATEABLE, "DownloadSiteMgr",
|
|
MAKEINTRESOURCE(IDS_DOWNLOADSITEMGR), NULL, NULL, VERSION_0, 0, 0 },
|
|
{ NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, 0, 0, 0 },
|
|
} ;
|
|
|
|
|
|
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
|
|
{
|
|
if((riid == IID_IClassFactory) || (riid == IID_IUnknown))
|
|
{
|
|
const OBJECTINFO *pcls;
|
|
for (pcls = g_ObjectInfo; pcls->pclsid; pcls++)
|
|
{
|
|
if(rclsid == *pcls->pclsid)
|
|
{
|
|
*ppv = pcls->cf;
|
|
((IUnknown *)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
}
|
|
}
|
|
|
|
*ppv = NULL;
|
|
return CLASS_E_CLASSNOTAVAILABLE;
|
|
}
|
|
|
|
STDAPI DllCanUnloadNow(void)
|
|
{
|
|
if (g_cLocks)
|
|
return S_FALSE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
void InitClassFactories()
|
|
{
|
|
g_ObjectInfo[0].cf = (void *) new CInstallEngineFactory();
|
|
g_ObjectInfo[1].cf = (void *) new CSiteManagerFactory();
|
|
}
|
|
|
|
|
|
void DeleteClassFactories()
|
|
{
|
|
delete g_ObjectInfo[0].cf;
|
|
delete g_ObjectInfo[1].cf;
|
|
}
|
|
|
|
|
|
|
|
STDAPI_(BOOL) DllMain(HANDLE hDll, DWORD dwReason, void *lpReserved)
|
|
{
|
|
DWORD dwThreadID;
|
|
|
|
switch(dwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
g_hInstance = (HINSTANCE)hDll;
|
|
g_hHeap = GetProcessHeap();
|
|
InitializeCriticalSection(&g_cs);
|
|
DisableThreadLibraryCalls(g_hInstance);
|
|
InitClassFactories();
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
DeleteCriticalSection(&g_cs);
|
|
DeleteClassFactories();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
void DllAddRef(void)
|
|
{
|
|
InterlockedIncrement(&g_cLocks);
|
|
}
|
|
|
|
void DllRelease(void)
|
|
{
|
|
InterlockedDecrement(&g_cLocks);
|
|
}
|
|
|
|
HRESULT PurgeDownloadDirectory(LPCSTR pszDownloadDir)
|
|
{
|
|
return DelNode(pszDownloadDir, ADN_DONT_DEL_DIR);
|
|
}
|
|
|
|
|
|
STDAPI DllRegisterServer(void)
|
|
{
|
|
// BUGBUG: pass back return from RegInstall ?
|
|
RegInstall(g_hInstance, "DllReg", NULL);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDAPI DllUnregisterServer(void)
|
|
{
|
|
RegInstall(g_hInstance, "DllUnreg", NULL);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDAPI DllInstall(BOOL bInstall, LPCSTR lpCmdLine)
|
|
{
|
|
// BUGBUG: pass back return from RegInstall ?
|
|
if (bInstall)
|
|
RegInstall(g_hInstance, "DllInstall", NULL);
|
|
else
|
|
RegInstall(g_hInstance, "DllUninstall", NULL);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// CRT stubs
|
|
//=--------------------------------------------------------------------------=
|
|
// these two things are here so the CRTs aren't needed. this is good.
|
|
//
|
|
// basically, the CRTs define this to pull in a bunch of stuff. we'll just
|
|
// define them here so we don't get an unresolved external.
|
|
//
|
|
// TODO: if you are going to use the CRTs, then remove this line.
|
|
//
|
|
extern "C" int _fltused = 1;
|
|
|
|
extern "C" int _cdecl _purecall(void)
|
|
{
|
|
// FAIL("Pure virtual function called.");
|
|
return 0;
|
|
}
|
|
|
|
void * _cdecl operator new
|
|
(
|
|
size_t size
|
|
)
|
|
{
|
|
return HeapAlloc(g_hHeap, 0, size);
|
|
}
|
|
|
|
//=---------------------------------------------------------------------------=
|
|
// overloaded delete
|
|
//=---------------------------------------------------------------------------=
|
|
// retail case just uses win32 Local* heap mgmt functions
|
|
//
|
|
// Parameters:
|
|
// void * - [in] free me!
|
|
//
|
|
// Notes:
|
|
//
|
|
void _cdecl operator delete ( void *ptr)
|
|
{
|
|
HeapFree(g_hHeap, 0, ptr);
|
|
}
|
|
|
|
#ifndef _X86_
|
|
extern "C" void _fpmath() {}
|
|
#endif
|
|
|
|
|
|
void * _cdecl malloc(size_t n)
|
|
{
|
|
#ifdef _MALLOC_ZEROINIT
|
|
void* p = HeapAlloc(g_hHeap, 0, n);
|
|
if (p != NULL)
|
|
ZeroMemory(p, n);
|
|
return p;
|
|
#else
|
|
return HeapAlloc(g_hHeap, 0, n);
|
|
#endif
|
|
}
|
|
|
|
void * _cdecl calloc(size_t n, size_t s)
|
|
{
|
|
#ifdef _MALLOC_ZEROINIT
|
|
return malloc(n * s);
|
|
#else
|
|
void* p = malloc(n * s);
|
|
if (p != NULL)
|
|
ZeroMemory(p, n * s);
|
|
return p;
|
|
#endif
|
|
}
|
|
|
|
void* _cdecl realloc(void* p, size_t n)
|
|
{
|
|
if (p == NULL)
|
|
return malloc(n);
|
|
|
|
return HeapReAlloc(g_hHeap, 0, p, n);
|
|
}
|
|
|
|
void _cdecl free(void* p)
|
|
{
|
|
if (p == NULL)
|
|
return;
|
|
|
|
HeapFree(g_hHeap, 0, p);
|
|
}
|
|
|