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.
313 lines
7.6 KiB
313 lines
7.6 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
|
//
|
|
// File: domain.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include <atlimpl.cpp> // include only once ont in PCH
|
|
|
|
// this redefines the DEFINE_GUID() macro to do allocation.
|
|
#include "initguid.h"
|
|
#include <dsclient.h>
|
|
#include <dsadminp.h>
|
|
|
|
#include "resource.h"
|
|
#include "domain.h"
|
|
|
|
#include "domobj.h"
|
|
#include "cdomain.h"
|
|
|
|
|
|
|
|
HRESULT WINAPI CDomainAdminModule::UpdateRegistryCLSID(const CLSID& clsid, BOOL bRegister)
|
|
{
|
|
static const WCHAR szIPS32[] = _T("InprocServer32");
|
|
static const WCHAR szCLSID[] = _T("CLSID");
|
|
|
|
HRESULT hRes = S_OK;
|
|
|
|
LPOLESTR lpOleStrCLSIDValue;
|
|
::StringFromCLSID(clsid, &lpOleStrCLSIDValue);
|
|
|
|
CRegKey key;
|
|
if (bRegister)
|
|
{
|
|
LONG lRes = key.Open(HKEY_CLASSES_ROOT, szCLSID);
|
|
if (lRes == ERROR_SUCCESS)
|
|
{
|
|
lRes = key.Create(key, lpOleStrCLSIDValue);
|
|
if (lRes == ERROR_SUCCESS)
|
|
{
|
|
WCHAR szModule[_MAX_PATH+1] = {0};
|
|
::GetModuleFileName(m_hInst, szModule, _MAX_PATH);
|
|
key.SetKeyValue(szIPS32, szModule);
|
|
}
|
|
}
|
|
if (lRes != ERROR_SUCCESS)
|
|
hRes = HRESULT_FROM_WIN32(lRes);
|
|
}
|
|
else
|
|
{
|
|
key.Attach(HKEY_CLASSES_ROOT);
|
|
if (key.Open(key, szCLSID) == ERROR_SUCCESS)
|
|
key.RecurseDeleteKey(lpOleStrCLSIDValue);
|
|
}
|
|
::CoTaskMemFree(lpOleStrCLSIDValue);
|
|
return hRes;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDomainAdminModule _Module;
|
|
|
|
BEGIN_OBJECT_MAP(ObjectMap)
|
|
OBJECT_ENTRY(CLSID_DomainAdmin, CComponentDataImpl)
|
|
OBJECT_ENTRY(CLSID_DomainSnapinAbout, CDomainSnapinAbout)
|
|
END_OBJECT_MAP()
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
class CDomainApp : public CWinApp
|
|
{
|
|
public:
|
|
virtual BOOL InitInstance();
|
|
virtual int ExitInstance();
|
|
};
|
|
|
|
CDomainApp theApp;
|
|
|
|
BOOL CDomainApp::InitInstance()
|
|
{
|
|
_Module.Init(ObjectMap, m_hInstance);
|
|
SHFusionInitializeFromModule(m_hInstance);
|
|
return CWinApp::InitInstance();
|
|
}
|
|
|
|
int CDomainApp::ExitInstance()
|
|
{
|
|
_Module.Term();
|
|
|
|
DEBUG_VERIFY_INSTANCE_COUNT(CComponentImpl);
|
|
DEBUG_VERIFY_INSTANCE_COUNT(CComponentDataImpl);
|
|
|
|
SHFusionUninitialize();
|
|
|
|
return CWinApp::ExitInstance();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Used to determine whether the DLL can be unloaded by OLE
|
|
|
|
STDAPI DllCanUnloadNow(void)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
return (AfxDllCanUnloadNow()==S_OK && _Module.GetLockCount()==0) ? S_OK : S_FALSE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Returns a class factory to create an object of the requested type
|
|
|
|
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
|
|
{
|
|
return _Module.GetClassObject(rclsid, riid, ppv);
|
|
}
|
|
|
|
LPCTSTR g_cszBasePath = _T("Software\\Microsoft\\MMC\\SnapIns");
|
|
LPCTSTR g_cszNameString = _T("NameString");
|
|
LPCTSTR g_cszNameStringIndirect = _T("NameStringIndirect");
|
|
LPCTSTR g_cszProvider = _T("Provider");
|
|
LPCTSTR g_cszVersion = _T("Version");
|
|
LPCTSTR g_cszAbout = _T("About");
|
|
LPCTSTR g_cszStandAlone = _T("StandAlone");
|
|
LPCTSTR g_cszNodeTypes = _T("NodeTypes");
|
|
|
|
LPCTSTR GUIDToCString(REFGUID guid, CString & str)
|
|
{
|
|
USES_CONVERSION;
|
|
|
|
OLECHAR lpszGUID[128];
|
|
int nChars = ::StringFromGUID2(guid, lpszGUID, 128);
|
|
LPTSTR lpString = OLE2T(lpszGUID);
|
|
|
|
LPTSTR lpGUID = str.GetBuffer(nChars);
|
|
if (lpGUID)
|
|
{
|
|
// NOTICE-2002/03/07-ericb - SecurityPush: reviewed safe.
|
|
CopyMemory(lpGUID, lpString, nChars*sizeof(TCHAR));
|
|
str.ReleaseBuffer();
|
|
}
|
|
|
|
return str;
|
|
}
|
|
|
|
HRESULT RegisterSnapin()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
CString strKey;
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
|
|
try
|
|
{
|
|
CString str;
|
|
|
|
CRegKey rkBase;
|
|
rkBase.Open(HKEY_LOCAL_MACHINE, g_cszBasePath);
|
|
|
|
// Create snapin GUID key and set properties
|
|
CRegKey rkCLSID;
|
|
rkCLSID.Create(rkBase, GUIDToCString(CLSID_DomainAdmin, str));
|
|
str.LoadString(IDS_DESCRIPTION);
|
|
// str = _T("MSFT Domain Tree Manager");
|
|
rkCLSID.SetValue(str, g_cszNameString);
|
|
|
|
{
|
|
WCHAR szModule[_MAX_PATH+1] = {0};
|
|
::GetModuleFileName(AfxGetInstanceHandle(), szModule, _MAX_PATH);
|
|
str.Format(_T("@%s,-%d"), szModule, IDS_DESCRIPTION);
|
|
rkCLSID.SetValue(str, g_cszNameStringIndirect);
|
|
}
|
|
|
|
rkCLSID.SetValue(STR_SNAPIN_COMPANY, g_cszProvider);
|
|
str.Format(TEXT("%hs"), STR_SNAPIN_VERSION); // this is a concatenation of ANSI strings, hence this conversion to UNICODE.
|
|
rkCLSID.SetValue(str, g_cszVersion);
|
|
|
|
rkCLSID.SetValue(GUIDToCString(CLSID_DomainSnapinAbout, str), g_cszAbout);
|
|
|
|
// Create "StandAlone" key
|
|
CRegKey rkStandAlone;
|
|
rkStandAlone.Create(rkCLSID, g_cszStandAlone);
|
|
|
|
// Create "NodeTypes" key
|
|
CRegKey rkNodeTypes;
|
|
rkNodeTypes.Create(rkCLSID, g_cszNodeTypes);
|
|
|
|
// NodeTypes guids
|
|
CRegKey rkN1;
|
|
rkN1.Create(rkNodeTypes, GUIDToCString(cDefaultNodeType, str));
|
|
}
|
|
catch(CMemoryException * e)
|
|
{
|
|
e->Delete();
|
|
hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
|
|
}
|
|
catch(COleException * e)
|
|
{
|
|
e->Delete();
|
|
hr = SELFREG_E_CLASS;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT UnregisterSnapin()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
try
|
|
{
|
|
CRegKey rkBase;
|
|
rkBase.Open(HKEY_LOCAL_MACHINE, g_cszBasePath);
|
|
|
|
CString str;
|
|
rkBase.RecurseDeleteKey(GUIDToCString(CLSID_DomainAdmin, str));
|
|
}
|
|
catch(CException * e)
|
|
{
|
|
DWORD err = ::GetLastError();
|
|
hr = HRESULT_FROM_WIN32(err);
|
|
e->Delete();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DllRegisterServer - Adds entries to the system registry
|
|
|
|
STDAPI DllRegisterServer(void)
|
|
{
|
|
HRESULT hRes = _Module.RegisterServer(/* bRegTypeLib */ FALSE);
|
|
if (FAILED(hRes))
|
|
return SELFREG_E_CLASS;
|
|
|
|
return RegisterSnapin();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DllUnregisterServer - Removes entries from the system registry
|
|
|
|
STDAPI DllUnregisterServer(void)
|
|
{
|
|
_Module.UnregisterServer();
|
|
return UnregisterSnapin();
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// CDsUiWizDLL
|
|
|
|
CDsUiWizDLL::CDsUiWizDLL()
|
|
{
|
|
m_hLibrary = NULL;
|
|
m_pfFunction = NULL;
|
|
}
|
|
|
|
|
|
CDsUiWizDLL::~CDsUiWizDLL()
|
|
{
|
|
if (m_hLibrary != NULL)
|
|
{
|
|
::FreeLibrary(m_hLibrary);
|
|
m_hLibrary = NULL;
|
|
}
|
|
}
|
|
|
|
BOOL CDsUiWizDLL::Load()
|
|
{
|
|
if (m_hLibrary != NULL)
|
|
return TRUE; // already loaded
|
|
// NOTICE-2002/03/07-ericb - SecurityPush: reviewed safe.
|
|
m_hLibrary = ::LoadLibrary(_T("dsuiwiz.dll"));
|
|
if (NULL == m_hLibrary)
|
|
{
|
|
// The library is not present
|
|
return FALSE;
|
|
}
|
|
m_pfFunction = ::GetProcAddress(m_hLibrary, "TrustWizard" );
|
|
if ( NULL == m_pfFunction )
|
|
{
|
|
// The library is present but does not have the entry point
|
|
::FreeLibrary( m_hLibrary );
|
|
m_hLibrary = NULL;
|
|
return FALSE;
|
|
}
|
|
ASSERT(m_hLibrary != NULL);
|
|
ASSERT(m_pfFunction != NULL);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
typedef HRESULT (*TRUST_WIZARD_PROC) (HWND, LPCWSTR);
|
|
|
|
HRESULT CDsUiWizDLL::TrustWizard(HWND hWndParent, LPCWSTR lpsz)
|
|
{
|
|
ASSERT(m_hLibrary != NULL);
|
|
ASSERT(m_pfFunction != NULL);
|
|
return ((TRUST_WIZARD_PROC)m_pfFunction) (hWndParent, lpsz);
|
|
}
|