|
|
//***************************************************************************
//
// Copyright (c) 1992-1999 Microsoft Corporation
//
// File: libmain.cpp
//
// Description :
// The main entry point to the dll
//
// Part of : Wbem ADS 3rd party extension
//
// History:
// corinaf 10/9/98 Created
//
//***************************************************************************
#include "precomp.h"
//#define INITGUID
HINSTANCE g_hInst = NULL; ULONG g_ulObjCount = 0; // Number of objects alive in the dll
BOOL g_bLogging = TRUE;
//+---------------------------------------------------------------
//
// Function: DllGetClassObject
//
// Synopsis: Standard DLL entrypoint for locating class factories
// Called by OLE's CoGetClassObject (from CoCreateInstance)
//
//----------------------------------------------------------------
extern "C" STDAPI DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID FAR* ppv) { HRESULT hr; IClassFactory *pCF;
*ppv = NULL;
if (clsid == CLSID_WMIExtension) { pCF = new CWMIExtensionCF(); if (!pCF) return E_OUTOFMEMORY; } else return E_FAIL;
hr = pCF->QueryInterface(iid, ppv); //If QI failed delete the CF object
if (FAILED(hr)) delete pCF;
// pCF->Release(); Don't release because CWMIExtensionCF() sets the ref count to 0 not 1.
return hr; }
//+---------------------------------------------------------------
//
// Function: DllCanUnloadNow
//
// Synopsis: Standard DLL entrypoint to determine if DLL can be unloaded
//
//---------------------------------------------------------------
extern "C" STDAPI DllCanUnloadNow(void) { return (g_ulObjCount > 0 ? S_FALSE : S_OK); }
//+---------------------------------------------------------------------------
//
// Function: DllMain
//
// Synopsis: entry point for NT - post .546
//
//----------------------------------------------------------------------------
extern "C" BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls((HINSTANCE)hDll); g_hInst = (HINSTANCE)hDll; break; case DLL_PROCESS_DETACH: break; default: break; }
return TRUE;
// return LibMain((HINSTANCE)hDll, dwReason, lpReserved);
}
#define WCHAR_LEN_IN_BYTES(str) wcslen(str)*sizeof(WCHAR)+sizeof(WCHAR)
//***************************************************************************
//
// DllRegisterServer
//
// Purpose: Called during setup or by regsvr32.
//
// Return: NOERROR if registration successful, error otherwise.
//***************************************************************************
STDAPI DllRegisterServer(void) { HKEY hKey1=NULL, hKey2=NULL, hKey3=NULL, hKey4=NULL; DWORD dwDisposition; WCHAR wcClsid[128], wcIid[128], wcTypelibid[128]; WCHAR wcKey[128]; WCHAR wcModule[128]; WCHAR wcText[] = L"WMI ADSI Extension"; WCHAR wcTypeLibText[] = L"WMI ADSI Extension Type Library"; WCHAR wcModel[] = L"Apartment";
// Create strings for the CLSID & IID
StringFromGUID2(CLSID_WMIExtension, wcClsid, 128); StringFromGUID2(IID_IWMIExtension, wcIid, 128); StringFromGUID2(LIBID_WMIEXTENSIONLib, wcTypelibid, 128);
GetModuleFileName(g_hInst, wcModule, 128);
//Create entry under CLSID
//==========================
wcscpy(wcKey, L"CLSID\\"); wcscat(wcKey, wcClsid); RegCreateKeyEx(HKEY_CLASSES_ROOT, wcKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey1, &dwDisposition); if (!hKey1) return E_FAIL; RegSetValueEx(hKey1, NULL, 0, REG_SZ, (LPBYTE)wcText, WCHAR_LEN_IN_BYTES(wcText)); RegCreateKeyEx(hKey1,L"InprocServer32", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey2, &dwDisposition); if (!hKey2) { RegCloseKey(hKey1); return E_FAIL; } RegSetValueEx(hKey2, NULL, 0, REG_SZ, (LPBYTE)wcModule, WCHAR_LEN_IN_BYTES(wcModule)); RegSetValueEx(hKey2, L"ThreadingModel", 0, REG_SZ, (LPBYTE)wcModel, WCHAR_LEN_IN_BYTES(wcModel)); RegCloseKey(hKey2); hKey2=NULL;
//RegCreateKey(hKey1, L"ProgID", &hKey2);
//RegSetValueEx(hKey2, NULL, 0, REG_SZ, (LPBYTE)WBEM_NAMESPACE_NAME, WCHAR_LEN_IN_BYTES(WBEM_NAMESPACE_NAME));
//RegCloseKey(hKey2);
RegCreateKeyEx(hKey1, L"TypeLib", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey2, &dwDisposition); if (!hKey2) { RegCloseKey(hKey1); return E_FAIL; } RegSetValueEx(hKey2, NULL, 0, REG_SZ, (LPBYTE)wcTypelibid, WCHAR_LEN_IN_BYTES(wcTypelibid)); RegCloseKey(hKey2); hKey2=NULL;
RegCreateKeyEx(hKey1, L"Version", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey2, &dwDisposition); if (!hKey2) { RegCloseKey(hKey1); return E_FAIL; } RegSetValueEx(hKey2, NULL, 0, REG_SZ, (LPBYTE)L"1.0", WCHAR_LEN_IN_BYTES(L"1.0")); RegCloseKey(hKey2); hKey2=NULL;
RegCloseKey(hKey1); hKey1=NULL;
//Create entries under Typelib for the type library
//=================================================
wcscpy(wcKey, L"Typelib\\"); wcscat(wcKey, wcTypelibid);
RegCreateKeyEx(HKEY_CLASSES_ROOT, wcKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey1, &dwDisposition); if (!hKey1) return E_FAIL; RegCreateKeyEx(hKey1, L"1.0", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey2, &dwDisposition); if (!hKey2) { RegCloseKey(hKey1); return E_FAIL; } RegSetValueEx(hKey2, NULL, 0, REG_SZ, (LPBYTE)wcTypeLibText, WCHAR_LEN_IN_BYTES(wcTypeLibText)); RegCreateKeyEx(hKey2, L"0", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey3, &dwDisposition); if (!hKey3) { RegCloseKey(hKey2); RegCloseKey(hKey1); return E_FAIL; } RegCreateKeyEx(hKey3, L"win32", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey4, &dwDisposition); if (!hKey4) { RegCloseKey(hKey3); RegCloseKey(hKey2); RegCloseKey(hKey1); return E_FAIL; }
//Create path to typelib - take module path and change file extension
WCHAR *ext = wcsrchr(wcModule, L'.'); wcscpy(ext, L".tlb"); RegSetValueEx(hKey4, NULL, 0, REG_SZ, (LPBYTE)wcModule, WCHAR_LEN_IN_BYTES(wcModule)); RegCloseKey(hKey4); hKey4=NULL; RegCloseKey(hKey3); hKey3=NULL;
RegCreateKeyEx(hKey2, L"FLAGS", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey3, &dwDisposition); if (!hKey3) { RegCloseKey(hKey2); RegCloseKey(hKey1); return E_FAIL; } RegSetValueEx(hKey3, NULL, 0, REG_SZ, (LPBYTE)L"0", WCHAR_LEN_IN_BYTES(L"0")); RegCloseKey(hKey3); hKey3=NULL;
RegCreateKeyEx(hKey2, L"HELPDIR", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey3, &dwDisposition); if (!hKey3) { RegCloseKey(hKey2); RegCloseKey(hKey1); return E_FAIL; } RegSetValueEx(hKey3, NULL, 0, REG_SZ, (LPBYTE)L"", WCHAR_LEN_IN_BYTES(L"")); RegCloseKey(hKey3); hKey3=NULL;
RegCloseKey(hKey2); hKey2=NULL; RegCloseKey(hKey1); hKey1=NULL;
//Make ADSI extension registration
//=================================
wcscpy(wcKey, L"SOFTWARE\\Microsoft\\ADs\\Providers\\LDAP\\Extensions\\"); wcscat (wcKey, L"Computer\\"); //for Computer class extension
wcscat(wcKey, wcClsid); RegCreateKeyEx(HKEY_LOCAL_MACHINE, wcKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey1, &dwDisposition); if (!hKey1) return E_FAIL; RegSetValueEx(hKey1, L"Interfaces", 0, REG_MULTI_SZ, (LPBYTE)wcIid, WCHAR_LEN_IN_BYTES(wcIid)); RegCloseKey(hKey1); hKey1=NULL;
return NOERROR;
}
//***************************************************************************
//
// DllUnregisterServer
//
// Purpose: Called when it is time to remove the registry entries.
//
// Return: NOERROR if registration successful, error otherwise.
//***************************************************************************
STDAPI DllUnregisterServer(void) { HRESULT hr; HKEY hKey1, hKey2, hKey3; WCHAR wcClsid[128], wcIid[128], wcTypelibid[128]; WCHAR wcKey[128]; WCHAR wcText[] = L"WMI ADSI Extension"; WCHAR wcTypeLibText[] = L"WMI ADSI Extension Type Library"; WCHAR wcModel[] = L"Apartment";
// Create strings for the CLSID & IID
StringFromGUID2(CLSID_WMIExtension, wcClsid, 128); StringFromGUID2(IID_IWMIExtension, wcIid, 128); StringFromGUID2(LIBID_WMIEXTENSIONLib, wcTypelibid, 128);
//Delete entry under \software\microsoft\ads for the extension
//============================================================
wcscpy(wcKey, L"SOFTWARE\\Microsoft\\ADs\\Providers\\LDAP\\Extensions\\"); wcscat (wcKey, L"Computer\\"); //for Computer class extension
hr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, wcKey, 0, KEY_ALL_ACCESS, &hKey1); if (hr == NOERROR) { RegDeleteKey(hKey1, wcClsid); RegCloseKey(hKey1); }
//Delete entries under CLSID
//==========================
wcscpy(wcKey, L"CLSID\\"); wcscat(wcKey, wcClsid);
hr = RegOpenKeyEx(HKEY_CLASSES_ROOT, wcKey, 0, KEY_ALL_ACCESS, &hKey1); if(hr == NOERROR) { RegDeleteKey(hKey1, L"InProcServer32"); RegDeleteKey(hKey1, L"TypeLib"); RegDeleteKey(hKey1, L"Version"); RegCloseKey(hKey1); }
hr = RegOpenKeyEx(HKEY_CLASSES_ROOT, L"CLSID", 0, KEY_ALL_ACCESS, &hKey1); if(hr == NOERROR) { RegDeleteKey(hKey1,wcClsid); RegCloseKey(hKey1); }
//Delete entries under Typelib for the type library
//=================================================
wcscpy(wcKey, L"Typelib\\"); wcscat(wcKey, wcTypelibid);
hr = RegOpenKeyEx(HKEY_CLASSES_ROOT, wcKey, 0, KEY_ALL_ACCESS, &hKey1); if (hr == NOERROR) { hr = RegOpenKeyEx(hKey1, L"1.0", 0, KEY_ALL_ACCESS, &hKey2); if (hr == NOERROR) { hr = RegOpenKeyEx(hKey2, L"0", 0, KEY_ALL_ACCESS, &hKey3); if (hr == NOERROR) { RegDeleteKey(hKey3, L"win32"); RegCloseKey(hKey3); } RegDeleteKey(hKey2, L"0"); RegDeleteKey(hKey2, L"FLAGS"); RegDeleteKey(hKey2, L"HELPDIR"); RegCloseKey(hKey2); } RegDeleteKey(hKey1, L"1.0"); RegCloseKey(hKey1); }
hr = RegOpenKeyEx(HKEY_CLASSES_ROOT, L"Typelib", 0, KEY_ALL_ACCESS, &hKey1); if (hr == NOERROR) { RegDeleteKey(hKey1, wcTypelibid); RegCloseKey(hKey1); }
return NOERROR; }
|