1381 lines
46 KiB
C++
1381 lines
46 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1997.
|
||
|
//
|
||
|
// File: libmain.cxx
|
||
|
//
|
||
|
// Contents: LibMain for adsiis.dll
|
||
|
//
|
||
|
// Functions: LibMain, DllGetClassObject
|
||
|
//
|
||
|
// History: 25-Oct-94 KrishnaG Created.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
#include "iis.hxx"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
HINSTANCE g_hInst = NULL;
|
||
|
WCHAR * szIISPrefix = L"@IIS!";
|
||
|
|
||
|
STDAPI
|
||
|
DllRegisterServerWin95(VOID);
|
||
|
STDAPI
|
||
|
DllUnregisterServerWin95(VOID);
|
||
|
|
||
|
//
|
||
|
// Global Data
|
||
|
//
|
||
|
|
||
|
WIN32_CRITSEC * g_pGlobalLock = NULL;
|
||
|
SERVER_CACHE * g_pServerCache = NULL;
|
||
|
|
||
|
extern CRITICAL_SECTION g_ExtCritSect;
|
||
|
|
||
|
extern PCLASS_ENTRY gpClassHead;
|
||
|
|
||
|
DECLARE_DEBUG_PRINTS_OBJECT()
|
||
|
#ifdef _NO_TRACING_
|
||
|
DECLARE_DEBUG_VARIABLE();
|
||
|
#endif
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// ADs debug print, mem leak and object tracking-related stuff
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
DECLARE_INFOLEVEL(ADs)
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: ShutDown
|
||
|
//
|
||
|
// Synopsis: Function to handle printing out heap debugging display
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
inline VOID ShutDown()
|
||
|
{
|
||
|
#if DBG==1
|
||
|
#ifndef MSVC
|
||
|
DUMP_TRACKING_INFO_DELETE();
|
||
|
DeleteCriticalSection(&g_csOT);
|
||
|
#endif // ifndef MSVC
|
||
|
DeleteCriticalSection(&g_csDP);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
extern "C" DWORD heapInfoLevel;
|
||
|
extern "C" DWORD OtInfoLevel;
|
||
|
extern "C" DWORD ADsInfoLevel;
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: GetINIHeapInfoLevel
|
||
|
//
|
||
|
// Synopsis: Gets various infolevel values from win.ini
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
inline VOID GetINIHeapInfoLevel()
|
||
|
{
|
||
|
#if DBG==1
|
||
|
const INT MAXINFOLEN=11;
|
||
|
WCHAR awcs[MAXINFOLEN];
|
||
|
|
||
|
#ifndef MSVC
|
||
|
if (GetProfileString(L"IIS",L"heapInfoLevel", L"00000003", awcs,MAXINFOLEN))
|
||
|
heapInfoLevel = wcstoul(awcs, NULL, 16);
|
||
|
|
||
|
if (GetProfileString(L"IIS",L"Ot", L"00000003", awcs, MAXINFOLEN))
|
||
|
OtInfoLevel = wcstoul(awcs, NULL, 16);
|
||
|
|
||
|
#endif // MSVC
|
||
|
|
||
|
if (GetProfileString(L"IIS",L"ADsInfoLevel", L"00000003", awcs,MAXINFOLEN))
|
||
|
ADsInfoLevel = wcstoul(awcs, NULL, 16);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
// Globals
|
||
|
|
||
|
|
||
|
ULONG g_ulObjCount = 0; // Number of objects alive in oleds.dll
|
||
|
|
||
|
|
||
|
//+------------------------------------------------------------------------
|
||
|
//
|
||
|
// Macro that calculates the number of elements in a statically-defined
|
||
|
// array.
|
||
|
//
|
||
|
// Note - I swiped this from ADsary.cxx - A type-safe array class. Remember
|
||
|
// to swipe the whole thing as required.
|
||
|
//-------------------------------------------------------------------------
|
||
|
#define ARRAY_SIZE(_a) (sizeof(_a) / sizeof(_a[0]))
|
||
|
|
||
|
CIISProviderCF g_cfProvider;
|
||
|
CIISNamespaceCF g_cfNamespace;
|
||
|
CIISMimeTypeCF g_cfMimeType;
|
||
|
CIISPropertyAttributeCF g_cfPropertyAttribute;
|
||
|
|
||
|
|
||
|
//+------------------------------------------------------------------------
|
||
|
//
|
||
|
// oleds class factories
|
||
|
//
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
struct CLSCACHE
|
||
|
{
|
||
|
const CLSID * pclsid;
|
||
|
IClassFactory * pCF;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
CLSCACHE g_aclscache[] =
|
||
|
{
|
||
|
&CLSID_IISProvider, &g_cfProvider,
|
||
|
&CLSID_IISNamespace, &g_cfNamespace,
|
||
|
&CLSID_IISMimeType, &g_cfMimeType,
|
||
|
&CLSID_IISPropertyAttribute, &g_cfPropertyAttribute
|
||
|
};
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DllGetClassObject
|
||
|
//
|
||
|
// Synopsis: Standard DLL entrypoint for locating class factories
|
||
|
//
|
||
|
//----------------------------------------------------------------
|
||
|
|
||
|
STDAPI
|
||
|
DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID FAR* ppv)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
size_t i;
|
||
|
|
||
|
for (i = 0; i < ARRAY_SIZE(g_aclscache); i++)
|
||
|
{
|
||
|
if (IsEqualCLSID(clsid, *g_aclscache[i].pclsid))
|
||
|
{
|
||
|
hr = g_aclscache[i].pCF->QueryInterface(iid, ppv);
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*ppv = NULL;
|
||
|
|
||
|
//
|
||
|
// Add Debugging Code to indicate that the oleds.DllGetClassObject has been called with an unknown CLSID.
|
||
|
//
|
||
|
|
||
|
return E_NOINTERFACE;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DllCanUnloadNow
|
||
|
//
|
||
|
// Synopsis: Standard DLL entrypoint to determine if DLL can be unloaded
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
STDAPI
|
||
|
DllCanUnloadNow(void)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
hr = S_FALSE;
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------
|
||
|
//
|
||
|
// Function: LibMain
|
||
|
//
|
||
|
// Synopsis: Standard DLL initialization entrypoint
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
EXTERN_C BOOL __cdecl
|
||
|
LibMain(HINSTANCE hInst, ULONG ulReason, LPVOID pvReserved)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
switch (ulReason)
|
||
|
{
|
||
|
case DLL_PROCESS_ATTACH:
|
||
|
DisableThreadLibraryCalls(hInst);
|
||
|
g_pGlobalLock = new WIN32_CRITSEC();
|
||
|
g_pServerCache = new SERVER_CACHE();
|
||
|
|
||
|
g_hInst = hInst;
|
||
|
|
||
|
|
||
|
#if DBG==1
|
||
|
#ifndef MSVC
|
||
|
INITIALIZE_CRITICAL_SECTION(&g_csOT);
|
||
|
INITIALIZE_CRITICAL_SECTION(&g_csMem);
|
||
|
#endif
|
||
|
INITIALIZE_CRITICAL_SECTION(&g_csDP);
|
||
|
#endif
|
||
|
|
||
|
#ifdef _NO_TRACING_
|
||
|
CREATE_DEBUG_PRINT_OBJECT("adsiis");
|
||
|
SET_DEBUG_FLAGS(DEBUG_ERROR);
|
||
|
#endif
|
||
|
|
||
|
InitializeCriticalSection(&g_ExtCritSect);
|
||
|
|
||
|
gpClassHead = BuildClassesList();
|
||
|
break;
|
||
|
|
||
|
|
||
|
case DLL_PROCESS_DETACH:
|
||
|
|
||
|
#ifdef _NO_TRACING_
|
||
|
DELETE_DEBUG_PRINT_OBJECT();
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// free global list of class entries for 3rd party ext
|
||
|
//
|
||
|
|
||
|
FreeClassesList(gpClassHead);
|
||
|
|
||
|
DeleteCriticalSection(&g_ExtCritSect);
|
||
|
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DllMain
|
||
|
//
|
||
|
// Synopsis: entry point for NT - post .546
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
BOOL
|
||
|
DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
|
||
|
{
|
||
|
return LibMain((HINSTANCE)hDll, dwReason, lpReserved);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: GetCachedClsidIndex
|
||
|
//
|
||
|
// Synopsis: Returns the index of the given CLSID in the cache, or
|
||
|
// -1 if the CLSID is not present in the cache
|
||
|
//
|
||
|
// Arguments: [clsid]
|
||
|
//
|
||
|
// Returns: int
|
||
|
//
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
int
|
||
|
GetCachedClsidIndex(REFCLSID clsid)
|
||
|
{
|
||
|
int i;
|
||
|
CLSCACHE * pclscache;
|
||
|
|
||
|
for (i = 0, pclscache = g_aclscache;
|
||
|
i < ARRAY_SIZE(g_aclscache);
|
||
|
i ++, pclscache++)
|
||
|
{
|
||
|
if (IsEqualCLSID(*pclscache->pclsid, clsid))
|
||
|
return i;
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: GetCachedClassFactory
|
||
|
//
|
||
|
// Synopsis: Returns the cached class factory with the given index.
|
||
|
// The pointer returned has been AddRef'd.
|
||
|
//
|
||
|
// Arguments: [iclsid]
|
||
|
//
|
||
|
// Returns: IClassFactory *
|
||
|
//
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
IClassFactory *
|
||
|
GetCachedClassFactory(int iclsid)
|
||
|
{
|
||
|
IClassFactory * pCF;
|
||
|
|
||
|
// Assert(iclsid >= 0);
|
||
|
// Assert(iclsid < ARRAY_SIZE(g_aclscache));
|
||
|
|
||
|
pCF = g_aclscache[iclsid].pCF;
|
||
|
pCF->AddRef();
|
||
|
|
||
|
return pCF;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: GetCachedClsid
|
||
|
//
|
||
|
// Synopsis: Returns the CLSID corresponding to the given index.
|
||
|
// Normally, code should call GetCachedClassFactory to get
|
||
|
// the class factory directly.
|
||
|
//
|
||
|
// Arguments: [iclsid] -- Clsid index
|
||
|
// [pclsid] -- Matching clsid returned in *pclsid
|
||
|
//
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
void
|
||
|
GetCachedClsid(int iclsid, CLSID * pclsid)
|
||
|
{
|
||
|
// Assert(iclsid >= 0);
|
||
|
// Assert(iclsid < ARRAY_SIZE(g_aclscache));
|
||
|
|
||
|
*pclsid = *g_aclscache[iclsid].pclsid;
|
||
|
}
|
||
|
|
||
|
|
||
|
//+------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DllRegisterServer
|
||
|
//
|
||
|
// Synopsis: Register registry keys for adsiis
|
||
|
//
|
||
|
// Arguments: None
|
||
|
//
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
STDAPI DllRegisterServer(
|
||
|
)
|
||
|
{
|
||
|
HKEY hKeyCLSID, hKeyTemp;
|
||
|
DWORD dwDisposition;
|
||
|
HMODULE hModule;
|
||
|
HRESULT hr;
|
||
|
ITypeLib *pITypeLib;
|
||
|
WCHAR pszName[MAX_PATH +1];
|
||
|
int i;
|
||
|
|
||
|
if ( IISGetPlatformType() == PtWindows95 ) {
|
||
|
return(DllRegisterServerWin95());
|
||
|
}
|
||
|
|
||
|
hModule=GetModuleHandle(TEXT("ADSIIS.DLL"));
|
||
|
|
||
|
if (!hModule) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (GetModuleFileName(hModule, pszName, MAX_PATH+1)==0) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
hr=LoadTypeLibEx(pszName, REGKIND_REGISTER, &pITypeLib);
|
||
|
if (FAILED(hr)) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
pITypeLib->Release();
|
||
|
|
||
|
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
|
||
|
TEXT("Software\\Microsoft\\ADs\\Providers\\IIS"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("IISNamespace"),
|
||
|
sizeof(TEXT("IISNamespace")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyEx(HKEY_CLASSES_ROOT,
|
||
|
TEXT("IISNamespace\\CLSID"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("{d6bfa35e-89f2-11d0-8527-00c04fd8d503}"),
|
||
|
sizeof(TEXT("{d6bfa35e-89f2-11d0-8527-00c04fd8d503}")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
//
|
||
|
// register CLSID
|
||
|
//
|
||
|
|
||
|
if (RegCreateKeyEx(HKEY_CLASSES_ROOT,
|
||
|
TEXT("CLSID\\{d6bfa35e-89f2-11d0-8527-00c04fd8d503}"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyCLSID, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyCLSID, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("IIS Namespace Object"),
|
||
|
sizeof(TEXT("IIS Namespace Object")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegCreateKeyEx(hKeyCLSID,
|
||
|
TEXT("InprocServer32"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("adsiis.dll"),
|
||
|
sizeof(TEXT("adsiis.dll")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT("ThreadingModel"), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("Both"),
|
||
|
sizeof(TEXT("Both")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyEx(hKeyCLSID,
|
||
|
TEXT("ProgID"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("IISNamespace"),
|
||
|
sizeof(TEXT("IISNamespace")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyEx(hKeyCLSID,
|
||
|
TEXT("TypeLib"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("{49d704a0-89f7-11d0-8527-00c04fd8d503}"),
|
||
|
sizeof(TEXT("{49d704a0-89f7-11d0-8527-00c04fd8d503}")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyEx(hKeyCLSID,
|
||
|
TEXT("Version"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("0.0"),
|
||
|
sizeof(TEXT("0.0")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
|
||
|
if (RegCreateKeyEx(HKEY_CLASSES_ROOT,
|
||
|
TEXT("IIS\\CLSID"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("{d88966de-89f2-11d0-8527-00c04fd8d503}"),
|
||
|
sizeof(TEXT("{d88966de-89f2-11d0-8527-00c04fd8d503}")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyEx(HKEY_CLASSES_ROOT,
|
||
|
TEXT("CLSID\\{d88966de-89f2-11d0-8527-00c04fd8d503}"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyCLSID, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyCLSID, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("IIS Provider Object"),
|
||
|
sizeof(TEXT("IIS Provider Object")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegCreateKeyEx(hKeyCLSID,
|
||
|
TEXT("InprocServer32"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("adsiis.dll"),
|
||
|
sizeof(TEXT("adsiis.dll")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT("ThreadingModel"), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("Both"),
|
||
|
sizeof(TEXT("Both")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyEx(hKeyCLSID,
|
||
|
TEXT("ProgID"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("IIS"),
|
||
|
sizeof(TEXT("IIS")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyEx(hKeyCLSID,
|
||
|
TEXT("TypeLib"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("{49d704a0-89f7-11d0-8527-00c04fd8d503}"),
|
||
|
sizeof(TEXT("{49d704a0-89f7-11d0-8527-00c04fd8d503}")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyEx(hKeyCLSID,
|
||
|
TEXT("Version"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("0.0"),
|
||
|
sizeof(TEXT("0.0")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
|
||
|
if (RegCreateKeyEx(HKEY_CLASSES_ROOT,
|
||
|
TEXT("Mimemap\\CLSID"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("{9036b028-a780-11d0-9b3d-0080c710ef95}"),
|
||
|
sizeof(TEXT("{9036b028-a780-11d0-9b3d-0080c710ef95}")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyEx(HKEY_CLASSES_ROOT,
|
||
|
TEXT("CLSID\\{9036b028-a780-11d0-9b3d-0080c710ef95}"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyCLSID, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyCLSID, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("IIS Mimemap Object"),
|
||
|
sizeof(TEXT("IIS Mimemap Object")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegCreateKeyEx(hKeyCLSID,
|
||
|
TEXT("InprocServer32"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("adsiis.dll"),
|
||
|
sizeof(TEXT("adsiis.dll")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT("ThreadingModel"), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("Both"),
|
||
|
sizeof(TEXT("Both")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyEx(hKeyCLSID,
|
||
|
TEXT("ProgID"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("IISMimemap"),
|
||
|
sizeof(TEXT("IISMimemap")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyEx(hKeyCLSID,
|
||
|
TEXT("TypeLib"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("{49d704a0-89f7-11d0-8527-00c04fd8d503}"),
|
||
|
sizeof(TEXT("{49d704a0-89f7-11d0-8527-00c04fd8d503}")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyEx(hKeyCLSID,
|
||
|
TEXT("Version"),
|
||
|
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueEx(hKeyTemp, TEXT(""), NULL, REG_SZ,
|
||
|
(BYTE*) TEXT("0.0"),
|
||
|
sizeof(TEXT("0.0")))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
|
||
|
if (RegCreateKeyExA(HKEY_CLASSES_ROOT,
|
||
|
"PropertyAttribute\\CLSID",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "{FD2280A8-51A4-11D2-A601-3078302C2030}",
|
||
|
sizeof("{FD2280A8-51A4-11D2-A601-3078302C2030}"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(HKEY_CLASSES_ROOT,
|
||
|
"CLSID\\{FD2280A8-51A4-11D2-A601-3078302C2030}",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyCLSID, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyCLSID, "", NULL, REG_SZ,
|
||
|
(BYTE*) "IIS PropertyAttribute Object",
|
||
|
sizeof("IIS PropertyAttribute Object"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"InprocServer32",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "adsiis.dll",
|
||
|
sizeof("adsiis.dll"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "ThreadingModel", NULL, REG_SZ,
|
||
|
(BYTE*) "Both",
|
||
|
sizeof("Both"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"ProgID",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "IISPropertyAttribute",
|
||
|
sizeof("IISPropertyAttribute"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"TypeLib",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "{49d704a0-89f7-11d0-8527-00c04fd8d503}",
|
||
|
sizeof("{49d704a0-89f7-11d0-8527-00c04fd8d503}"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"Version",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "0.0",
|
||
|
sizeof("0.0"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
|
||
|
|
||
|
return NOERROR;
|
||
|
}
|
||
|
|
||
|
//+------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DllUnregisterServer
|
||
|
//
|
||
|
// Synopsis: Register registry keys for adsiis
|
||
|
//
|
||
|
// Arguments: None
|
||
|
//
|
||
|
//+------------------------------------------------------------------------
|
||
|
/* #pragma INTRINSA suppress=all */
|
||
|
STDAPI DllUnregisterServer(void) {
|
||
|
|
||
|
if ( IISGetPlatformType() == PtWindows95 ) {
|
||
|
return(DllUnregisterServerWin95());
|
||
|
}
|
||
|
|
||
|
UnRegisterTypeLib(LIBID_IISOle,
|
||
|
1,
|
||
|
0,
|
||
|
0,
|
||
|
SYS_WIN32);
|
||
|
|
||
|
RegDeleteKey(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\ADs\\Providers\\IIS"));
|
||
|
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("IISNamespace\\CLSID"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("IISNamespace"));
|
||
|
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{d6bfa35e-89f2-11d0-8527-00c04fd8d503}\\InprocServer32"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{d6bfa35e-89f2-11d0-8527-00c04fd8d503}\\ProgID"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{d6bfa35e-89f2-11d0-8527-00c04fd8d503}\\TypeLib"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{d6bfa35e-89f2-11d0-8527-00c04fd8d503}\\Version"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{d6bfa35e-89f2-11d0-8527-00c04fd8d503}"));
|
||
|
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("IIS\\CLSID"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("IIS"));
|
||
|
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{d88966de-89f2-11d0-8527-00c04fd8d503}\\InprocServer32"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{d88966de-89f2-11d0-8527-00c04fd8d503}\\ProgID"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{d88966de-89f2-11d0-8527-00c04fd8d503}\\TypeLib"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{d88966de-89f2-11d0-8527-00c04fd8d503}\\Version"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{d88966de-89f2-11d0-8527-00c04fd8d503}"));
|
||
|
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("Mimemap\\CLSID"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("Mimemap"));
|
||
|
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{9036b028-a780-11d0-9b3d-0080c710ef95}\\InprocServer32"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{9036b028-a780-11d0-9b3d-0080c710ef95}\\ProgID"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{9036b028-a780-11d0-9b3d-0080c710ef95}\\TypeLib"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{9036b028-a780-11d0-9b3d-0080c710ef95}\\Version"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{9036b028-a780-11d0-9b3d-0080c710ef95}"));
|
||
|
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("PropertyAttribute\\CLSID"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("PropertyAttribute"));
|
||
|
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{FD2280A8-51A4-11D2-A601-3078302C2030}\\InprocServer32"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{FD2280A8-51A4-11D2-A601-3078302C2030}\\ProgID"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{FD2280A8-51A4-11D2-A601-3078302C2030}\\TypeLib"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{FD2280A8-51A4-11D2-A601-3078302C2030}\\Version"));
|
||
|
RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("CLSID\\{FD2280A8-51A4-11D2-A601-3078302C2030}"));
|
||
|
|
||
|
return NOERROR;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//+------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DllRegisterServerWin95
|
||
|
//
|
||
|
// Synopsis: Register registry keys for adsiis on win95
|
||
|
//
|
||
|
// Arguments: None
|
||
|
//
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
STDAPI
|
||
|
DllRegisterServerWin95(
|
||
|
)
|
||
|
{
|
||
|
HKEY hKeyCLSID, hKeyTemp;
|
||
|
DWORD dwDisposition;
|
||
|
HMODULE hModule;
|
||
|
HRESULT hr;
|
||
|
ITypeLib *pITypeLib;
|
||
|
WCHAR pszName[MAX_PATH +1];
|
||
|
CHAR pszNameA[MAX_PATH +1];
|
||
|
int i;
|
||
|
|
||
|
hModule=GetModuleHandleA("ADSIIS.DLL");
|
||
|
if (!hModule) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (GetModuleFileNameA(hModule, pszNameA, MAX_PATH+1)==0) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
swprintf(pszName, OLESTR("%S"), pszNameA);
|
||
|
|
||
|
hr=LoadTypeLibEx(pszName, REGKIND_REGISTER, &pITypeLib);
|
||
|
if (FAILED(hr)) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
pITypeLib->Release();
|
||
|
|
||
|
if (RegCreateKeyExA(HKEY_LOCAL_MACHINE,
|
||
|
"Software\\Microsoft\\ADs\\Providers\\IIS",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "IISNamespace",
|
||
|
sizeof("IISNamespace"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(HKEY_CLASSES_ROOT,
|
||
|
"IISNamespace\\CLSID",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "{d6bfa35e-89f2-11d0-8527-00c04fd8d503}",
|
||
|
sizeof("{d6bfa35e-89f2-11d0-8527-00c04fd8d503}"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
//
|
||
|
// register CLSID
|
||
|
//
|
||
|
|
||
|
if (RegCreateKeyExA(HKEY_CLASSES_ROOT,
|
||
|
"CLSID\\{d6bfa35e-89f2-11d0-8527-00c04fd8d503}",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyCLSID, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyCLSID, "", NULL, REG_SZ,
|
||
|
(BYTE*) "IIS Namespace Object",
|
||
|
sizeof("IIS Namespace Object"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"InprocServer32",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "adsiis.dll",
|
||
|
sizeof("adsiis.dll"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "ThreadingModel", NULL, REG_SZ,
|
||
|
(BYTE*) "Both",
|
||
|
sizeof("Both"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"ProgID",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "IISNamespace",
|
||
|
sizeof("IISNamespace"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"TypeLib",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "{49d704a0-89f7-11d0-8527-00c04fd8d503}",
|
||
|
sizeof("{49d704a0-89f7-11d0-8527-00c04fd8d503}"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"Version",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "0.0",
|
||
|
sizeof("0.0"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
|
||
|
if (RegCreateKeyExA(HKEY_CLASSES_ROOT,
|
||
|
"IIS\\CLSID",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "{d88966de-89f2-11d0-8527-00c04fd8d503}",
|
||
|
sizeof("{d88966de-89f2-11d0-8527-00c04fd8d503}"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(HKEY_CLASSES_ROOT,
|
||
|
"CLSID\\{d88966de-89f2-11d0-8527-00c04fd8d503}",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyCLSID, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyCLSID, "", NULL, REG_SZ,
|
||
|
(BYTE*) "IIS Provider Object",
|
||
|
sizeof("IIS Provider Object"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"InprocServer32",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "adsiis.dll",
|
||
|
sizeof("adsiis.dll"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "ThreadingModel", NULL, REG_SZ,
|
||
|
(BYTE*) "Both",
|
||
|
sizeof("Both"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"ProgID",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "IIS",
|
||
|
sizeof("IIS"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"TypeLib",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "{49d704a0-89f7-11d0-8527-00c04fd8d503}",
|
||
|
sizeof("{49d704a0-89f7-11d0-8527-00c04fd8d503}"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"Version",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "0.0",
|
||
|
sizeof("0.0"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
|
||
|
if (RegCreateKeyExA(HKEY_CLASSES_ROOT,
|
||
|
"Mimemap\\CLSID",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "{9036b028-a780-11d0-9b3d-0080c710ef95}",
|
||
|
sizeof("{9036b028-a780-11d0-9b3d-0080c710ef95}"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(HKEY_CLASSES_ROOT,
|
||
|
"CLSID\\{9036b028-a780-11d0-9b3d-0080c710ef95}",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyCLSID, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyCLSID, "", NULL, REG_SZ,
|
||
|
(BYTE*) "IIS Mimemap Object",
|
||
|
sizeof("IIS Mimemap Object"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"InprocServer32",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "adsiis.dll",
|
||
|
sizeof("adsiis.dll"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "ThreadingModel", NULL, REG_SZ,
|
||
|
(BYTE*) "Both",
|
||
|
sizeof("Both"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"ProgID",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "IISMimemap",
|
||
|
sizeof("IISMimemap"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"TypeLib",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "{49d704a0-89f7-11d0-8527-00c04fd8d503}",
|
||
|
sizeof("{49d704a0-89f7-11d0-8527-00c04fd8d503}"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
|
||
|
if (RegCreateKeyExA(hKeyCLSID,
|
||
|
"Version",
|
||
|
NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
|
&hKeyTemp, &dwDisposition)!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExA(hKeyTemp, "", NULL, REG_SZ,
|
||
|
(BYTE*) "0.0",
|
||
|
sizeof("0.0"))!=ERROR_SUCCESS) {
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyTemp);
|
||
|
RegCloseKey(hKeyCLSID);
|
||
|
|
||
|
return NOERROR;
|
||
|
}
|
||
|
|
||
|
//+------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DllUnregisterServerWin95
|
||
|
//
|
||
|
// Synopsis: Register registry keys for adsiis on win95
|
||
|
//
|
||
|
// Arguments: None
|
||
|
//
|
||
|
//+------------------------------------------------------------------------
|
||
|
/* #pragma INTRINSA suppress=all */
|
||
|
STDAPI
|
||
|
DllUnregisterServerWin95(void) {
|
||
|
|
||
|
UnRegisterTypeLib(LIBID_IISOle,
|
||
|
1,
|
||
|
0,
|
||
|
0,
|
||
|
SYS_WIN32);
|
||
|
|
||
|
RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\ADs\\Providers\\IIS");
|
||
|
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "IISNamespace\\CLSID");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "IISNamespace");
|
||
|
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{d6bfa35e-89f2-11d0-8527-00c04fd8d503}\\InprocServer32");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{d6bfa35e-89f2-11d0-8527-00c04fd8d503}\\ProgID");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{d6bfa35e-89f2-11d0-8527-00c04fd8d503}\\TypeLib");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{d6bfa35e-89f2-11d0-8527-00c04fd8d503}\\Version");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{d6bfa35e-89f2-11d0-8527-00c04fd8d503}");
|
||
|
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "IIS\\CLSID");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "IIS");
|
||
|
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{d88966de-89f2-11d0-8527-00c04fd8d503}\\InprocServer32");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{d88966de-89f2-11d0-8527-00c04fd8d503}\\ProgID");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{d88966de-89f2-11d0-8527-00c04fd8d503}\\TypeLib");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{d88966de-89f2-11d0-8527-00c04fd8d503}\\Version");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{d88966de-89f2-11d0-8527-00c04fd8d503}");
|
||
|
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "Mimemap\\CLSID");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "Mimemap");
|
||
|
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{9036b028-a780-11d0-9b3d-0080c710ef95}\\InprocServer32");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{9036b028-a780-11d0-9b3d-0080c710ef95}\\ProgID");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{9036b028-a780-11d0-9b3d-0080c710ef95}\\TypeLib");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{9036b028-a780-11d0-9b3d-0080c710ef95}\\Version");
|
||
|
RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{9036b028-a780-11d0-9b3d-0080c710ef95}");
|
||
|
|
||
|
|
||
|
return NOERROR;
|
||
|
}
|
||
|
|