Leaked source code of windows server 2003
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.
 
 
 
 
 
 

1321 lines
39 KiB

// This is a part of the Microsoft Management Console.
// Copyright (C) Microsoft Corporation, 1995 - 1999
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Management Console and related
// electronic documentation provided with the interfaces.
// You will need the NT SUR Beta 2 SDK or VC 4.2 in order to build this
// project. This is because you will need MIDL 3.00.15 or higher and new
// headers and libs. If you have VC 4.2 installed, then everything should
// already be configured correctly.
#include "preDNSsn.h"
#include <SnapBase.h>
#include "resource.h"
#include "dnsutil.h"
#include "DNSSnap.h"
#include "snapdata.h"
#include "server.h"
#include "domain.h"
#include "record.h"
#include "zone.h"
#include "HelpArr.h" // context help ID's
// Version info
#include <ntverp.h>
#define IDS_SNAPIN_VERSION VER_PRODUCTVERSION_STR
#define IDS_SNAPIN_PROVIDER VER_COMPANYNAME_STR
#ifdef DEBUG_ALLOCATOR
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#endif
//////////////////////////////////////////////////////////////////////////////
// regsvr debugging
// define to enable MsgBox debugging for regsvr32
//#define _MSGBOX_ON_REG_FAIL
#ifdef _MSGBOX_ON_REG_FAIL
#define _MSGBOX(x) AfxMessageBox(x)
#else
#define _MSGBOX(x)
#endif
#ifdef _MSGBOX_ON_REG_FAIL
#define _REPORT_FAIL(lpszMessage, lpszClsid, lRes) \
ReportFail(lpszMessage, lpszClsid, lRes)
void ReportFail(LPCWSTR lpszMessage, LPCWSTR lpszClsid, LONG lRes)
{
if (lRes == ERROR_SUCCESS)
return;
CString sz;
sz.Format(_T("%s %s %d"), lpszMessage,lpszClsid, lRes);
CThemeContextActivator activator;
AfxMessageBox(sz);
}
#else
#define _REPORT_FAIL(lpszMessage, lpszClsid, lRes)
#endif
//////////////////////////////////////////////////////////////////////////////
// global constants and macros
// GUIDs for snapin
const CLSID CLSID_DNSSnapin =
{ 0x2faebfa2, 0x3f1a, 0x11d0, { 0x8c, 0x65, 0x0, 0xc0, 0x4f, 0xd8, 0xfe, 0xcb } };
// {80105023-50B1-11d1-B930-00A0C9A06D2D}
const CLSID CLSID_DNSSnapinEx =
{ 0x80105023, 0x50b1, 0x11d1, { 0xb9, 0x30, 0x0, 0xa0, 0xc9, 0xa0, 0x6d, 0x2d } };
// {6C1303DC-BA00-11d1-B949-00A0C9A06D2D}
const CLSID CLSID_DNSSnapinAbout =
{ 0x6c1303dc, 0xba00, 0x11d1, { 0xb9, 0x49, 0x0, 0xa0, 0xc9, 0xa0, 0x6d, 0x2d } };
// {6C1303DD-BA00-11d1-B949-00A0C9A06D2D}
const CLSID CLSID_DNSSnapinAboutEx =
{ 0x6c1303dd, 0xba00, 0x11d1, { 0xb9, 0x49, 0x0, 0xa0, 0xc9, 0xa0, 0x6d, 0x2d } };
///////////////////////////////////////////////////////////////////////////////
// RESOURCES
BEGIN_MENU(CDNSRootDataMenuHolder)
BEGIN_CTX
CTX_ENTRY_VIEW(IDM_SNAPIN_ADVANCED_VIEW, L"_DNS_ADVANCED")
CTX_ENTRY_VIEW(IDM_SNAPIN_FILTERING, L"_DNS_FILTER")
CTX_ENTRY_TOP(IDM_SNAPIN_CONNECT_TO_SERVER, L"_DNS_CONNECTTOP")
CTX_ENTRY_TASK(IDM_SNAPIN_CONNECT_TO_SERVER, L"_DNS_CONNECTTASK")
END_CTX
BEGIN_RES
RES_ENTRY(IDS_SNAPIN_ADVANCED_VIEW)
RES_ENTRY(IDS_SNAPIN_FILTERING)
RES_ENTRY(IDS_SNAPIN_CONNECT_TO_SERVER)
RES_ENTRY(IDS_SNAPIN_CONNECT_TO_SERVER)
END_RES
END_MENU
BEGIN_MENU(CDNSServerMenuHolder)
BEGIN_CTX
CTX_ENTRY_VIEW(IDM_SNAPIN_ADVANCED_VIEW, L"_DNS_ADVANCED")
CTX_ENTRY_VIEW(IDM_SNAPIN_MESSAGE, L"_DNS_MESSAGE")
CTX_ENTRY_VIEW(IDM_SNAPIN_FILTERING, L"_DNS_FILTER")
CTX_ENTRY_TOP(IDM_SERVER_CONFIGURE, L"_DNS_CONFIGURETOP")
#ifdef USE_NDNC
CTX_ENTRY_TOP(IDM_SERVER_CREATE_NDNC, L"_DNS_CREATENDNC")
#endif
CTX_ENTRY_TOP(IDM_SERVER_NEW_ZONE, L"_DNS_ZONE")
CTX_ENTRY_TOP(IDM_SERVER_SET_AGING, L"_DNS_AGING")
CTX_ENTRY_TOP(IDM_SERVER_SCAVENGE, L"_DNS_SCAVENGETOP")
CTX_ENTRY_TOP(IDM_SERVER_UPDATE_DATA_FILES, L"_DNS_UPDATETOP")
CTX_ENTRY_TOP(IDM_SERVER_CLEAR_CACHE, L"_DNS_CLEARCACHETOP")
CTX_ENTRY_TOP(IDM_SERVER_NSLOOKUP, L"_DNS_NSLOOKUPTOP")
CTX_ENTRY_TASK(IDM_SERVER_CONFIGURE, L"_DNS_CONFIGURETASK")
CTX_ENTRY_TASK(IDM_SERVER_SCAVENGE, L"_DNS_SCAVENGETASK")
CTX_ENTRY_TASK(IDM_SERVER_UPDATE_DATA_FILES, L"_DNS_UPDATETASK")
CTX_ENTRY_TASK(IDM_SERVER_CLEAR_CACHE, L"_DNS_CLEARCACHETASK")
CTX_ENTRY_TASK(IDM_SERVER_NSLOOKUP, L"_DNS_NSLOOKUPTASK")
END_CTX
BEGIN_RES
RES_ENTRY(IDS_SNAPIN_ADVANCED_VIEW)
RES_ENTRY(IDS_SNAPIN_MESSAGE)
RES_ENTRY(IDS_SNAPIN_FILTERING)
RES_ENTRY(IDS_SERVER_CONFIGURE)
#ifdef USE_NDNC
RES_ENTRY(IDS_SERVER_CREATE_NDNC)
#endif
RES_ENTRY(IDS_SERVER_NEW_ZONE)
RES_ENTRY(IDS_SERVER_SET_AGING)
RES_ENTRY(IDS_SERVER_SCAVENGE)
RES_ENTRY(IDS_SERVER_UPDATE_DATA_FILES)
RES_ENTRY(IDS_SERVER_CLEAR_CACHE)
RES_ENTRY(IDS_SERVER_NSLOOKUP)
RES_ENTRY(IDS_SERVER_CONFIGURE)
RES_ENTRY(IDS_SERVER_SCAVENGE)
RES_ENTRY(IDS_SERVER_UPDATE_DATA_FILES)
RES_ENTRY(IDS_SERVER_CLEAR_CACHE)
RES_ENTRY(IDS_SERVER_NSLOOKUP)
END_RES
END_MENU
BEGIN_MENU(CDNSCathegoryFolderHolder)
BEGIN_CTX
CTX_ENTRY_VIEW(IDM_SNAPIN_ADVANCED_VIEW, L"_DNS_ADVANCED")
CTX_ENTRY_VIEW(IDM_SNAPIN_FILTERING, L"_DNS_FILTER")
END_CTX
BEGIN_RES
RES_ENTRY(IDS_SNAPIN_ADVANCED_VIEW)
RES_ENTRY(IDS_SNAPIN_FILTERING)
END_RES
END_MENU
BEGIN_MENU(CDNSAuthoritatedZonesMenuHolder)
BEGIN_CTX
CTX_ENTRY_VIEW(IDM_SNAPIN_ADVANCED_VIEW, L"_DNS_ADVANCED")
CTX_ENTRY_VIEW(IDM_SNAPIN_FILTERING, L"_DNS_FILTER")
CTX_ENTRY_TOP(IDM_SERVER_NEW_ZONE, L"_DNS_ZONETOP")
END_CTX
BEGIN_RES
RES_ENTRY(IDS_SNAPIN_ADVANCED_VIEW)
RES_ENTRY(IDS_SNAPIN_FILTERING)
RES_ENTRY(IDS_SERVER_NEW_ZONE)
END_RES
END_MENU
BEGIN_MENU(CDNSCacheMenuHolder)
BEGIN_CTX
CTX_ENTRY_TOP(IDM_CACHE_FOLDER_CLEAR_CACHE, L"_DNS_CLEARCACHETOP")
CTX_ENTRY_TASK(IDM_CACHE_FOLDER_CLEAR_CACHE, L"_DNS_CLEARCACHETASK")
END_CTX
BEGIN_RES
RES_ENTRY(IDS_CACHE_FOLDER_CLEAR_CACHE)
RES_ENTRY(IDS_CACHE_FOLDER_CLEAR_CACHE)
END_RES
END_MENU
BEGIN_MENU(CDNSZoneMenuHolder)
BEGIN_CTX
CTX_ENTRY_VIEW(IDM_SNAPIN_ADVANCED_VIEW, L"_DNS_ADVANCED")
CTX_ENTRY_VIEW(IDM_SNAPIN_FILTERING, L"_DNS_FILTER")
CTX_ENTRY_TOP(IDM_ZONE_UPDATE_DATA_FILE, L"_DNS_UPDATETOP")
CTX_ENTRY_TOP(IDM_ZONE_RELOAD, L"_DNS_RELOADTOP")
CTX_ENTRY_TOP(IDM_ZONE_TRANSFER, L"_DNS_TRANSFERTOP")
CTX_ENTRY_TOP(IDM_ZONE_RELOAD_FROM_MASTER, L"_DNS_RELOADMASTERTOP")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_HOST, L"_DNS_NEWHOST")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_PTR, L"_DNS_NEWPTR")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_ALIAS, L"_DNS_NEWALIAS")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_MX, L"_DNS_NEWMX")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_DOMAIN, L"_DNS_NEWDOMAIN")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_DELEGATION, L"_DNS_NEWDELEGATION")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_RECORD, L"_DNS_NEWRECORD")
CTX_ENTRY_TASK(IDM_ZONE_UPDATE_DATA_FILE, L"_DNS_UPDATETASK")
CTX_ENTRY_TASK(IDM_ZONE_RELOAD, L"_DNS_RELOADTASK")
CTX_ENTRY_TASK(IDM_ZONE_TRANSFER, L"_DNS_TRANSFERTASK")
CTX_ENTRY_TASK(IDM_ZONE_RELOAD_FROM_MASTER, L"_DNS_RELOADMASTERTASK")
END_CTX
BEGIN_RES
RES_ENTRY(IDS_SNAPIN_ADVANCED_VIEW)
RES_ENTRY(IDS_SNAPIN_FILTERING)
//RES_ENTRY(IDS_ZONE_PAUSE)
RES_ENTRY(IDS_ZONE_UPDATE_DATA_FILE)
RES_ENTRY(IDS_ZONE_RELOAD)
RES_ENTRY(IDS_ZONE_TRANSFER)
RES_ENTRY(IDS_ZONE_RELOAD_FROM_MASTER)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_HOST)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_PTR)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_ALIAS)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_MX)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_DOMAIN)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_DELEGATION)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_RECORD)
RES_ENTRY(IDS_ZONE_UPDATE_DATA_FILE)
RES_ENTRY(IDS_ZONE_RELOAD)
RES_ENTRY(IDS_ZONE_TRANSFER)
RES_ENTRY(IDS_ZONE_RELOAD_FROM_MASTER)
END_RES
END_MENU
BEGIN_MENU(CDNSDomainMenuHolder)
BEGIN_CTX
CTX_ENTRY_VIEW(IDM_SNAPIN_ADVANCED_VIEW, L"_DNS_ADVANCED")
CTX_ENTRY_VIEW(IDM_SNAPIN_FILTERING, L"_DNS_FITLER")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_HOST, L"_DNS_NEWHOST")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_PTR, L"_DNS_NEWPTR")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_ALIAS, L"_DNS_NEWALIAS")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_MX, L"_DNS_NEWMX")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_DOMAIN, L"_DNS_NEWDOMAIN")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_DELEGATION, L"_DNS_NEWDELEGATION")
CTX_ENTRY_TOP(IDM_DOMAIN_NEW_RECORD, L"_DNS_NEWRECORD")
END_CTX
BEGIN_RES
RES_ENTRY(IDS_SNAPIN_ADVANCED_VIEW)
RES_ENTRY(IDS_SNAPIN_FILTERING)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_HOST)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_PTR)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_ALIAS)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_MX)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_DOMAIN)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_DELEGATION)
RES_ENTRY(IDS_DOMAIN_NEW_NEW_RECORD)
END_RES
END_MENU
BEGIN_MENU(CDNSRecordMenuHolder)
BEGIN_CTX
END_CTX
BEGIN_RES
END_RES
END_MENU
// # of columns in the result pane and map for resource strings
extern RESULT_HEADERMAP _DefaultHeaderStrings[] =
{
{ L"", IDS_HEADER_NAME, LVCFMT_LEFT, 180},
{ L"", IDS_HEADER_TYPE, LVCFMT_LEFT, 150},
{ L"", IDS_HEADER_DATA, LVCFMT_LEFT, 160}
};
extern RESULT_HEADERMAP _ServerHeaderStrings[] =
{
{ L"", IDS_HEADER_NAME, LVCFMT_LEFT, 180},
};
extern RESULT_HEADERMAP _ZoneHeaderStrings[] =
{
{ L"", IDS_HEADER_NAME, LVCFMT_LEFT, 180},
{ L"", IDS_HEADER_TYPE, LVCFMT_LEFT, 90},
// { L"", IDS_HEADER_PARTITION, LVCFMT_LEFT, 100},
{ L"", IDS_HEADER_STATUS, LVCFMT_LEFT, 160}
};
#define N_ZONE_TYPES (7)
extern ZONE_TYPE_MAP _ZoneTypeStrings[] =
{
{ L"", IDS_ZONE_TYPE_AD_INTEGRATED },
{ L"", IDS_ZONE_TYPE_STANDARD_PRIMARY },
{ L"", IDS_ZONE_TYPE_SECONDARY },
{ L"", IDS_ZONE_TYPE_RUNNING },
{ L"", IDS_ZONE_TYPE_PAUSED },
{ L"", IDS_ZONE_TYPE_STUB },
{ L"", IDS_ZONE_TYPE_STUB_DS }
};
//
// Toolbar buttons
//
MMCBUTTON g_DNSMGR_SnapinButtons[] =
{
{ 0, toolbarNewServer, !TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
{ 1, toolbarNewRecord, !TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
{ 2, toolbarNewZone, !TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }
};
//
// We have to maintain the memory for the toolbar button strings
// so this class holds the strings until it is time for them to be
// deleted
//
class CButtonStringsHolder
{
public:
CButtonStringsHolder()
{
m_astr = NULL;
}
~CButtonStringsHolder()
{
if (m_astr != NULL)
delete[] m_astr;
}
CString* m_astr; // dynamic array of CStrings
};
CButtonStringsHolder g_astrButtonStrings;
BOOL LoadZoneTypeResources(ZONE_TYPE_MAP* pHeaderMap, int nCols)
{
HINSTANCE hInstance = _Module.GetModuleInstance();
for ( int i = 0; i < nCols ; i++)
{
if ( 0 == ::LoadString(hInstance, pHeaderMap[i].uResID, pHeaderMap[i].szBuffer, MAX_RESULT_HEADER_STRLEN))
return TRUE;
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// CDNSMgrModule
HRESULT WINAPI CDNSMgrModule::UpdateRegistryCLSID(const CLSID& clsid, BOOL bRegister)
{
static const WCHAR szIPS32[] = _T("InprocServer32");
static const WCHAR szCLSID[] = _T("CLSID");
HRESULT hRes = S_OK;
LPOLESTR lpOleStrCLSIDValue = NULL;
::StringFromCLSID(clsid, &lpOleStrCLSIDValue);
if (lpOleStrCLSIDValue == NULL)
{
return E_OUTOFMEMORY;
}
CRegKey key;
if (bRegister)
{
LONG lRes = key.Open(HKEY_CLASSES_ROOT, szCLSID);
_REPORT_FAIL(L"key.Open(HKEY_CLASSES_ROOT", lpOleStrCLSIDValue, lRes);
if (lRes == ERROR_SUCCESS)
{
lRes = key.Create(key, lpOleStrCLSIDValue);
_REPORT_FAIL(L"key.Create(key", lpOleStrCLSIDValue, lRes);
if (lRes == ERROR_SUCCESS)
{
DWORD bufferSizeInCharacters = MAX_PATH;
WCHAR* szModule = 0;
do
{
if (szModule)
{
delete[] szModule;
szModule = 0;
}
szModule = new WCHAR[bufferSizeInCharacters + 1];
if (szModule)
{
ZeroMemory(szModule, sizeof(WCHAR) * (bufferSizeInCharacters + 1));
DWORD result =
::GetModuleFileName(
m_hInst,
szModule,
bufferSizeInCharacters);
if (result < bufferSizeInCharacters)
{
break;
}
// truncation occurred, grow the buffer and try again
bufferSizeInCharacters *= 2;
}
else
{
break;
}
} while (bufferSizeInCharacters < USHRT_MAX);
if (szModule)
{
lRes = key.SetKeyValue(szIPS32, szModule);
_REPORT_FAIL(L"key.SetKeyValue(szIPS32", lpOleStrCLSIDValue, lRes);
delete[] 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;
}
///////////////////////////////////////////////////////////////////////////////
// Module, Object Map and DLL entry points
CDNSMgrModule _Module;
BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_DNSSnapin, CDNSComponentDataObject) // standalone snapin
OBJECT_ENTRY(CLSID_DNSSnapinEx, CDNSComponentDataObjectEx) // namespace extension
OBJECT_ENTRY(CLSID_DNSSnapinAbout, CDNSSnapinAbout) // standalone snapin about
OBJECT_ENTRY(CLSID_DNSSnapinAboutEx, CDNSSnapinAboutEx) // namespace extension about
END_OBJECT_MAP()
STDAPI DllCanUnloadNow(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return (AfxDllCanUnloadNow()==S_OK && _Module.GetLockCount()==0) ? S_OK : S_FALSE;
}
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
return _Module.GetClassObject(rclsid, riid, ppv);
}
static _NODE_TYPE_INFO_ENTRY _NodeTypeInfoEntryArray[] = {
{ &CDNSRootData::NodeTypeGUID, _T("Root DNS Snapin Subtree") },
{ &CDNSServerNode::NodeTypeGUID, _T("DNS Snapin Server Node") },
{ &CDNSZoneNode::NodeTypeGUID, _T("DNS Snapin Zone Node") },
{ &CDNSDomainNode::NodeTypeGUID, _T("DNS Snapin Domain Node") },
{ &CDNSRecordNodeBase::NodeTypeGUID, _T("DNS Snapin Record Node") },
{ NULL, NULL }
};
///////////////////////////////////////////////////////////////////////////
// external GUIDs (from Computer Management Snapin)
const CLSID CLSID_SystemServiceManagementExt =
{0x58221C6a,0xEA27,0x11CF,{0xAD,0xCF,0x00,0xAA,0x00,0xA8,0x00,0x33}};
const CLSID CLSID_NodeTypeServerApps =
{ 0x476e6449, 0xaaff, 0x11d0, { 0xb9, 0x44, 0x0, 0xc0, 0x4f, 0xd8, 0xd5, 0xb0 } };
const CLSID CLSID_EventViewerExt =
{ 0x394C052E, 0xB830, 0x11D0, { 0x9A, 0x86, 0x00, 0xC0, 0x4F, 0xD8, 0xDB, 0xF7 } };
////////////////////////////////////////////////////////////////////
// Server Applications Registration functions
const TCHAR DNS_KEY[] = TEXT("System\\CurrentControlSet\\Services\\DNS");
const TCHAR CONTROL_KEY[] = TEXT("System\\CurrentControlSet\\Control\\");
BOOL IsDNSServerInstalled()
{
CRegKey regkeyDNSService;
LONG lRes = regkeyDNSService.Open(HKEY_LOCAL_MACHINE, DNS_KEY);
return (lRes == ERROR_SUCCESS);
}
////////////////////////////////////////////////////////////////////
STDAPI DllRegisterServer(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// registers all objects
HRESULT hr = _Module.RegisterServer(/* bRegTypeLib */ FALSE);
ASSERT(SUCCEEDED(hr));
if (FAILED(hr))
{
_MSGBOX(_T("_Module.RegisterServer() failed"));
return hr;
}
CString szVersion, szProvider, szSnapinName, szSnapinNameEx;
szVersion = IDS_SNAPIN_VERSION;
szProvider = IDS_SNAPIN_PROVIDER;
szSnapinName.LoadString(IDS_SNAPIN_NAME);
szSnapinNameEx.LoadString(IDS_SNAPIN_NAME_EX);
// register the standalone DNS snapin into the console snapin list
hr = RegisterSnapin(&CLSID_DNSSnapin,
&CDNSRootData::NodeTypeGUID,
&CLSID_DNSSnapinAbout,
szSnapinName, szVersion, szProvider,
FALSE /*bExtension*/,
_NodeTypeInfoEntryArray,
IDS_SNAPIN_NAME);
ASSERT(SUCCEEDED(hr));
if (FAILED(hr))
{
_MSGBOX(_T("RegisterSnapin(&CLSID_DNSSnapin) failed"));
return hr;
}
// register the extension DNS snapin into the console snapin list
hr = RegisterSnapin(&CLSID_DNSSnapinEx,
&CDNSRootData::NodeTypeGUID,
&CLSID_DNSSnapinAboutEx,
szSnapinNameEx, szVersion, szProvider,
TRUE /*bExtension*/,
_NodeTypeInfoEntryArray,
IDS_SNAPIN_NAME);
ASSERT(SUCCEEDED(hr));
if (FAILED(hr))
{
_MSGBOX(_T("RegisterSnapin(&CLSID_DNSSnapinEx) failed"));
return hr;
}
// register the snapin nodes into the console node list
for (_NODE_TYPE_INFO_ENTRY* pCurrEntry = _NodeTypeInfoEntryArray;
pCurrEntry->m_pNodeGUID != NULL; pCurrEntry++)
{
hr = RegisterNodeType(pCurrEntry->m_pNodeGUID,pCurrEntry->m_lpszNodeDescription);
ASSERT(SUCCEEDED(hr));
if (FAILED(hr))
{
_MSGBOX(_T("RegisterNodeType() failed"));
return hr;
}
}
// the Services Snapin will extend the Server Node (context menu to start/stop DNS)
//
// JonN 9/15/98: Removed the "dynamic" setting. I don't understand why this was
// being registered as a dynamic extension.
hr = RegisterNodeExtension(&CDNSServerNode::NodeTypeGUID, _T("ContextMenu"),
&CLSID_SystemServiceManagementExt,
_T("System Service Management Extension"), FALSE /*bDynamic*/);
if (FAILED(hr))
{
_MSGBOX(_T("RegisterNodeExtension(&CDNSServerNode::NodeTypeGUID) failed"));
return hr;
}
//
// Register the event viewer as a namespace extension of the server node
//
hr = RegisterNodeExtension(&CDNSServerNode::NodeTypeGUID, _T("NameSpace"),
&CLSID_EventViewerExt, _T("Event Viewer Extension"), FALSE);
if (FAILED(hr))
{
_MSGBOX(_T("RegisterNodeExtension(&CDNSServerNode::NodeTypeGUID) failed"));
return hr;
}
//
// the DNS Snapin will be a namespace extension for the Server Apps node
// in the Computer Management Snapin
//
//
// Fixed Bug 13620 DNSMGR: on workstation with AdminPak, dnsmgr.dll should not get loaded
//
OSVERSIONINFOEX verInfoEx;
verInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if (!::GetVersionEx((OSVERSIONINFO*)&verInfoEx) || verInfoEx.wProductType != VER_NT_WORKSTATION)
{
hr = RegisterNodeExtension(&CLSID_NodeTypeServerApps, _T("NameSpace"),
&CLSID_DNSSnapinEx, szSnapinNameEx, TRUE /*bDynamic*/);
if (FAILED(hr))
{
_MSGBOX(_T("RegisterNodeExtension(&CLSID_NodeTypeServerApps) failed"));
return hr;
}
}
return hr;
}
STDAPI DllUnregisterServer(void)
{
HRESULT hr = _Module.UnregisterServer();
ASSERT(SUCCEEDED(hr));
// un register the standalone snapin
hr = UnregisterSnapin(&CLSID_DNSSnapin);
ASSERT(SUCCEEDED(hr));
// un register the extension snapin
hr = UnregisterSnapin(&CLSID_DNSSnapinEx);
ASSERT(SUCCEEDED(hr));
// unregister the snapin nodes,
// this removes also the server node, with the Services Snapin extension keys
for (_NODE_TYPE_INFO_ENTRY* pCurrEntry = _NodeTypeInfoEntryArray;
pCurrEntry->m_pNodeGUID != NULL; pCurrEntry++)
{
hr = UnregisterNodeType(pCurrEntry->m_pNodeGUID);
ASSERT(SUCCEEDED(hr));
}
// the DNS Snapin will be a namespace extension for the Server Apps node
// in the Computer Management Snapin
hr = UnregisterNodeExtension(&CLSID_NodeTypeServerApps, _T("NameSpace"),
&CLSID_DNSSnapinEx, TRUE /*bDynamic*/);
ASSERT(SUCCEEDED(hr));
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// CDNSSnapinApp
class CDNSSnapinApp : public CWinApp
{
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
};
CDNSSnapinApp theApp;
BOOL CDNSSnapinApp::InitInstance()
{
_Module.Init(ObjectMap, m_hInstance);
// Add theming support
SHFusionInitializeFromModuleID(m_hInstance, 2);
// initialize font for Mask Control
WCHAR szFontName[LF_FACESIZE];
int nFontSize;
VERIFY(LoadFontInfoFromResource(IDS_MASK_CTRL_FONT_NAME,
IDS_MASK_CTRL_FONT_SIZE,
szFontName, LF_FACESIZE,
nFontSize,
L"MS Shell Dlg", 8 // default if something goes wrong
));
if (!DNS_ControlsInitialize(m_hInstance, szFontName, nFontSize))
return FALSE;
if (!CDNSComponentDataObject::LoadResources())
return FALSE;
return CWinApp::InitInstance();
}
int CDNSSnapinApp::ExitInstance()
{
#ifdef _DEBUG_REFCOUNT
TRACE(_T("CDNSSnapinApp::ExitInstance()\n"));
ASSERT(CComponentDataObject::m_nOustandingObjects == 0);
ASSERT(CComponentObject::m_nOustandingObjects == 0);
ASSERT(CDataObject::m_nOustandingObjects == 0);
#endif // _DEBUG_REFCOUNT
// Theming support
SHFusionUninitialize();
_Module.Term();
return CWinApp::ExitInstance();
}
////////////////////////////////////////////////////////////////////////
// CDNSComponentObject (.i.e "view")
HRESULT CDNSComponentObject::InitializeHeaders(CContainerNode* pContainerNode)
{
HRESULT hr = S_OK;
ASSERT(m_pHeader);
CColumnSet* pColumnSet = pContainerNode->GetColumnSet();
POSITION pos = pColumnSet->GetHeadPosition();
while (pos != NULL)
{
CColumn* pColumn = pColumnSet->GetNext(pos);
hr = m_pHeader->InsertColumn(pColumn->GetColumnNum(),
pColumn->GetHeader(),
pColumn->GetFormat(),
AUTO_WIDTH);
if (FAILED(hr))
return hr;
hr = m_pHeader->SetColumnWidth(pColumn->GetColumnNum(), pColumn->GetWidth());
if (FAILED(hr))
return hr;
}
return hr;
}
HRESULT CDNSComponentObject::InitializeBitmaps(CTreeNode*)
{
// image lists for nodes
CBitmapHolder<IDB_16x16> _bmp16x16;
CBitmapHolder<IDB_32x32> _bmp32x32;
HRESULT hr = S_OK;
BOOL bLoaded = _bmp16x16.LoadBitmap() && _bmp32x32.LoadBitmap();
if (bLoaded)
{
ASSERT(m_pImageResult != NULL);
hr = m_pImageResult->ImageListSetStrip(reinterpret_cast<LONG_PTR*>(static_cast<HBITMAP>(_bmp16x16)),
reinterpret_cast<LONG_PTR*>(static_cast<HBITMAP>(_bmp32x32)),
0, BMP_COLOR_MASK);
}
else
{
hr = S_FALSE;
}
return hr;
}
CONST INT cButtons = sizeof(g_DNSMGR_SnapinButtons)/sizeof(MMCBUTTON);
HRESULT CDNSComponentObject::InitializeToolbar(IToolbar* pToolbar)
{
ASSERT(pToolbar != NULL);
HRESULT hr = S_OK;
LoadToolbarStrings(g_DNSMGR_SnapinButtons);
CBitmapHolder<IDB_TOOLBAR_BUTTONS> _bmpToolbarButtons;
BOOL bLoaded = _bmpToolbarButtons.LoadBitmap();
if (bLoaded)
{
hr = m_pToolbar->AddBitmap(cButtons, (HBITMAP)_bmpToolbarButtons, 16, 16, RGB(255,0,255));
}
hr = m_pToolbar->AddButtons(cButtons, g_DNSMGR_SnapinButtons);
return hr;
}
HRESULT CDNSComponentObject::LoadToolbarStrings(MMCBUTTON * Buttons)
{
if (g_astrButtonStrings.m_astr == NULL )
{
//
// load strings
//
g_astrButtonStrings.m_astr = new CString[2*cButtons];
for (UINT i = 0; i < cButtons; i++)
{
UINT iButtonTextId = 0, iTooltipTextId = 0;
switch (Buttons[i].idCommand)
{
case toolbarNewServer:
iButtonTextId = IDS_BUTTON_NEW_SERVER;
iTooltipTextId = IDS_TOOLTIP_NEW_SERVER;
break;
case toolbarNewRecord:
iButtonTextId = IDS_BUTTON_NEW_RECORD;
iTooltipTextId = IDS_TOOLTIP_NEW_RECORD;
break;
case toolbarNewZone:
iButtonTextId = IDS_BUTTON_NEW_ZONE;
iTooltipTextId = IDS_TOOLTIP_NEW_ZONE;
break;
default:
ASSERT(FALSE);
break;
}
if (g_astrButtonStrings.m_astr)
{
g_astrButtonStrings.m_astr[i*2].LoadString(iButtonTextId);
Buttons[i].lpButtonText =
const_cast<BSTR>((LPCTSTR)(g_astrButtonStrings.m_astr[i*2]));
g_astrButtonStrings.m_astr[(i*2)+1].LoadString(iTooltipTextId);
Buttons[i].lpTooltipText =
const_cast<BSTR>((LPCTSTR)(g_astrButtonStrings.m_astr[(i*2)+1]));
}
}
}
return S_OK;
}
////////////////////////////////////////////////////////////////////////
// CDNSComponentDataObjectBase (.i.e "document")
CDNSComponentDataObjectBase::CDNSComponentDataObjectBase()
{
CWatermarkInfo* pWatermarkInfo = new CWatermarkInfo;
if (pWatermarkInfo)
{
pWatermarkInfo->m_nIDBanner = IDB_WIZBANNER;
pWatermarkInfo->m_nIDWatermark = IDB_WIZWATERMARK;
}
SetWatermarkInfo(pWatermarkInfo);
CDNSDefaultColumnSet* pDefaultCols =
new CDNSDefaultColumnSet(L"---Default Column Set---");
if (pDefaultCols)
{
m_columnSetList.AddTail(pDefaultCols);
}
CDNSServerColumnSet* pServerCols =
new CDNSServerColumnSet(L"---Server Column Set---");
if (pServerCols)
{
m_columnSetList.AddTail(pServerCols);
}
CDNSZoneColumnSet* pZoneCols =
new CDNSZoneColumnSet(L"---Zone Column Set---");
if (pZoneCols)
{
m_columnSetList.AddTail(pZoneCols);
}
SetLogFileName(L"dcpromodns");
}
HRESULT CDNSComponentDataObjectBase::OnSetImages(LPIMAGELIST lpScopeImage)
{
// image lists for nodes
CBitmapHolder<IDB_16x16> _bmp16x16;
CBitmapHolder<IDB_32x32> _bmp32x32;
BOOL bLoaded = _bmp16x16.LoadBitmap() && _bmp32x32.LoadBitmap();
HRESULT hr = S_OK;
if (bLoaded)
{
ASSERT(lpScopeImage != NULL);
hr = lpScopeImage->ImageListSetStrip(reinterpret_cast<LONG_PTR*>(static_cast<HBITMAP>(_bmp16x16)),
reinterpret_cast<LONG_PTR*>(static_cast<HBITMAP>(_bmp32x32)),
0, BMP_COLOR_MASK);
}
else
{
hr = S_FALSE;
}
return hr;
}
CRootData* CDNSComponentDataObjectBase::OnCreateRootData()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString szSnapinType;
szSnapinType.LoadString(IDS_SNAPIN_NAME);
CDNSRootData* pDNSRootNode = new CDNSRootData(this);
if (pDNSRootNode)
{
pDNSRootNode->SetDisplayName(szSnapinType);
}
return pDNSRootNode;
}
BOOL CDNSComponentDataObjectBase::LoadResources()
{
return
LoadContextMenuResources(CDNSRootDataMenuHolder::GetMenuMap()) &&
LoadContextMenuResources(CDNSServerMenuHolder::GetMenuMap()) &&
LoadContextMenuResources(CDNSCathegoryFolderHolder::GetMenuMap()) &&
LoadContextMenuResources(CDNSAuthoritatedZonesMenuHolder::GetMenuMap()) &&
LoadContextMenuResources(CDNSCacheMenuHolder::GetMenuMap()) &&
LoadContextMenuResources(CDNSZoneMenuHolder::GetMenuMap()) &&
LoadContextMenuResources(CDNSDomainMenuHolder::GetMenuMap()) &&
LoadContextMenuResources(CDNSRecordMenuHolder::GetMenuMap()) &&
LoadResultHeaderResources(_DefaultHeaderStrings,N_DEFAULT_HEADER_COLS) &&
LoadResultHeaderResources(_ServerHeaderStrings,N_SERVER_HEADER_COLS) &&
LoadResultHeaderResources(_ZoneHeaderStrings,N_ZONE_HEADER_COLS) &&
LoadZoneTypeResources(_ZoneTypeStrings, N_ZONE_TYPES) &&
CDNSRecordInfo::LoadResources();
}
STDMETHODIMP CDNSComponentDataObjectBase::CreateComponent(LPCOMPONENT* ppComponent)
{
ASSERT(ppComponent != NULL);
CComObject<CDNSComponentObject>* pObject;
CComObject<CDNSComponentObject>::CreateInstance(&pObject);
ASSERT(pObject != NULL);
// Store IComponentData
pObject->SetIComponentData(this);
return pObject->QueryInterface(IID_IComponent,
reinterpret_cast<void**>(ppComponent));
}
void CDNSComponentDataObjectBase::OnTimer()
{
CDNSRootData* pDNSRootData = (CDNSRootData*)GetRootData();
pDNSRootData->TestServers(m_dwTimerTime, GetTimerInterval(), this);
m_dwTimerTime += GetTimerInterval();
}
void CDNSComponentDataObjectBase::OnTimerThread(WPARAM wParam, LPARAM lParam)
{
CDNSRootData* pDNSRootData = (CDNSRootData*)GetRootData();
pDNSRootData->OnServerTestData(wParam,lParam, this);
}
CTimerThread* CDNSComponentDataObjectBase::OnCreateTimerThread()
{
return new CDNSServerTestTimerThread;
}
void CDNSComponentDataObjectBase::OnNodeContextHelp(CNodeList* pNodeList)
{
ASSERT(pNodeList);
if (pNodeList)
{
ASSERT(pNodeList->GetCount() > 0);
OnNodeContextHelp(pNodeList->GetHead());
}
}
void CDNSComponentDataObjectBase::OnNodeContextHelp(CTreeNode* /*pNode*/)
{
CComPtr<IDisplayHelp> spHelp;
HRESULT hr = GetConsole()->QueryInterface(IID_IDisplayHelp, (void **)&spHelp);
if (SUCCEEDED(hr))
spHelp->ShowTopic(L"DNSconcepts.chm::/sag_DNStopnode.htm");
/*
CString szNode;
if (IS_CLASS(*pNode, CDNSRootData))
{
szNode = _T("Root Node");
}
else if (IS_CLASS(*pNode, CDNSServerNode))
{
szNode = _T("Server Node");
}
else if (IS_CLASS(*pNode, CDNSForwardZonesNode))
{
szNode = _T("Forward Zones Node");
}
else if (IS_CLASS(*pNode, CDNSReverseZonesNode))
{
szNode = _T("Reverse Zones Node");
}
else if (IS_CLASS(*pNode, CDNSZoneNode))
{
szNode = _T("Zone Node");
}
else if (IS_CLASS(*pNode, CDNSDomainNode))
{
szNode = _T("Domain Node");
}
else if (IS_CLASS(*pNode, CDNSCacheNode))
{
szNode = _T("Domain Node");
}
else if (dynamic_cast<CDNSRecordNodeBase*>(pNode) != NULL)
{
szNode = _T("Record Node");
}
if (!szNode.IsEmpty())
{
CString szMsg = _T("Context Help on ");
szMsg += szNode;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CThemeContextActivator activator;
AfxMessageBox(szMsg);
}
*/
}
LPCWSTR g_szContextHelpFileName = L"\\help\\dnsmgr.hlp";
LPCWSTR g_szHTMLHelpFileName = L"\\help\\dnsmgr.chm";
LPCWSTR CDNSComponentDataObjectBase::GetHTMLHelpFileName()
{
return g_szHTMLHelpFileName;
}
void CDNSComponentDataObjectBase::OnDialogContextHelp(UINT nDialogID, HELPINFO* pHelpInfo)
{
ULONG nContextTopic;
if (FindDialogContextTopic(nDialogID, pHelpInfo, &nContextTopic))
WinHelp(g_szContextHelpFileName, HELP_CONTEXTPOPUP, nContextTopic);
}
////////////////////////////////////////////////////////////////////////////////
// help context macros and maps
#define BEGIN_HELP_MAP(map) static DWORD_PTR map[] = {
#define HELP_MAP_ENTRY(x) x, (DWORD_PTR)&g_aHelpIDs_##x ,
#define END_HELP_MAP 0, 0 };
#define NEXT_HELP_MAP_ENTRY(p) ((p)+2)
#define MAP_ENTRY_DLG_ID(p) (*p)
#define MAP_ENTRY_TABLE(p) ((DWORD*)(*(p+1)))
#define IS_LAST_MAP_ENTRY(p) (MAP_ENTRY_DLG_ID(p) == 0)
#define NEXT_HELP_TABLE_ENTRY(p) ((p)+2)
#define TABLE_ENTRY_CTRL_ID(p) (*p)
#define TABLE_ENTRY_HELP_ID(p) (*(p+1))
#define IS_LAST_TABLE_ENTRY(p) (TABLE_ENTRY_CTRL_ID(p) == 0)
BEGIN_HELP_MAP(_DNSMgrContextHelpMap)
// misc dialogs
HELP_MAP_ENTRY(IDD_CHOOSER_CHOOSE_MACHINE)
HELP_MAP_ENTRY(IDD_BROWSE_DIALOG)
HELP_MAP_ENTRY(IDD_FILTERING_LIMITS)
HELP_MAP_ENTRY(IDD_FILTERING_NAME)
// misc. add dialogs
HELP_MAP_ENTRY(IDD_DOMAIN_ADDNEWHOST) // TODO
HELP_MAP_ENTRY(IDD_DOMAIN_ADDNEWDOMAIN)// TODO
HELP_MAP_ENTRY(IDD_SELECT_RECORD_TYPE_DIALOG)
// name servers page, there are more than one
HELP_MAP_ENTRY(IDD_NAME_SERVERS_PAGE)
HELP_MAP_ENTRY(IDD_COPY_ROOTHINTS_DIALOG)
// server property pages
HELP_MAP_ENTRY(IDD_SERVER_INTERFACES_PAGE)
HELP_MAP_ENTRY(IDD_SERVER_DOMAIN_FORWARDERS_PAGE)
HELP_MAP_ENTRY(IDD_SERVER_NEW_DOMAIN_FORWARDER)
HELP_MAP_ENTRY(IDD_SERVER_ADVANCED_PAGE)
HELP_MAP_ENTRY(IDD_SERVER_DEBUG_LOGGING_PAGE)
HELP_MAP_ENTRY(IDD_IP_FILTER_DIALOG)
HELP_MAP_ENTRY(IDD_SERVER_EVENT_LOGGING_PAGE)
HELP_MAP_ENTRY(IDD_SERVMON_TEST_PAGE)
HELP_MAP_ENTRY(IDD_SERVER_AGING_DIALOG)
// zone property pages
#ifdef USE_NDNC
HELP_MAP_ENTRY(IDD_ZONE_GENERAL_PAGE_NDNC)
HELP_MAP_ENTRY(IDD_ZONE_GENERAL_CHANGE_REPLICATION)
#else
HELP_MAP_ENTRY(IDD_ZONE_GENERAL_PAGE)
#endif // USE_NDNC
HELP_MAP_ENTRY(IDD_ZONE_GENERAL_CHANGE_TYPE)
HELP_MAP_ENTRY(IDD_ZONE_WINS_PAGE)
HELP_MAP_ENTRY(IDD_ZONE_NBSTAT_PAGE)
HELP_MAP_ENTRY(IDD_ZONE_ZONE_TRANSFER_PAGE)
HELP_MAP_ENTRY(IDD_ZONE_WINS_ADVANCED) // this is a subdialog
HELP_MAP_ENTRY(IDD_ZONE_NOTIFY_SUBDIALOG) // this is a subdialog
HELP_MAP_ENTRY(IDD_ZONE_AGING_DIALOG)
// record property pages
HELP_MAP_ENTRY(IDD_RR_NS_EDIT)
HELP_MAP_ENTRY(IDD_RR_SOA)
HELP_MAP_ENTRY(IDD_RR_A)
HELP_MAP_ENTRY(IDD_RR_ATMA)
HELP_MAP_ENTRY(IDD_RR_CNAME)
HELP_MAP_ENTRY(IDD_RR_MX)
HELP_MAP_ENTRY(IDD_RR_UNK)
HELP_MAP_ENTRY(IDD_RR_TXT)
HELP_MAP_ENTRY(IDD_RR_X25)
HELP_MAP_ENTRY(IDD_RR_ISDN)
HELP_MAP_ENTRY(IDD_RR_HINFO)
HELP_MAP_ENTRY(IDD_RR_AAAA)
HELP_MAP_ENTRY(IDD_RR_MB)
HELP_MAP_ENTRY(IDD_RR_MG)
HELP_MAP_ENTRY(IDD_RR_MD)
HELP_MAP_ENTRY(IDD_RR_MF)
HELP_MAP_ENTRY(IDD_RR_MR)
HELP_MAP_ENTRY(IDD_RR_MINFO)
HELP_MAP_ENTRY(IDD_RR_RP)
HELP_MAP_ENTRY(IDD_RR_RT)
HELP_MAP_ENTRY(IDD_RR_AFSDB)
HELP_MAP_ENTRY(IDD_RR_WKS)
HELP_MAP_ENTRY(IDD_RR_PTR)
HELP_MAP_ENTRY(IDD_RR_SRV)
HELP_MAP_ENTRY(IDD_RR_KEY)
HELP_MAP_ENTRY(IDD_RR_SIG)
HELP_MAP_ENTRY(IDD_RR_NXT)
END_HELP_MAP
BOOL CDNSComponentDataObjectBase::FindDialogContextTopic(/*IN*/UINT nDialogID,
/*IN*/ HELPINFO* pHelpInfo,
/*OUT*/ ULONG* pnContextTopic)
{
ASSERT(pHelpInfo != NULL);
*pnContextTopic = 0;
const DWORD_PTR* pMapEntry = _DNSMgrContextHelpMap;
while (!IS_LAST_MAP_ENTRY(pMapEntry))
{
if (nDialogID == MAP_ENTRY_DLG_ID(pMapEntry))
{
DWORD* pTable = MAP_ENTRY_TABLE(pMapEntry);
// look inside the table
while (!IS_LAST_TABLE_ENTRY(pTable))
{
if (TABLE_ENTRY_CTRL_ID(pTable) == static_cast<UINT>(pHelpInfo->iCtrlId))
{
*pnContextTopic = TABLE_ENTRY_HELP_ID(pTable);
return TRUE;
}
pTable = NEXT_HELP_TABLE_ENTRY(pTable);
}
}
pMapEntry = NEXT_HELP_MAP_ENTRY(pMapEntry);
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////
// CDNSComponentDataObjectEx (.i.e "document")
// extension snapin
unsigned int g_CFMachineName =
RegisterClipboardFormat(L"MMC_SNAPIN_MACHINE_NAME");
LPWSTR ExtractMachineName(LPDATAOBJECT lpDataObject)
{
ASSERT(lpDataObject != NULL);
STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL };
FORMATETC formatetc = { (CLIPFORMAT)g_CFMachineName, NULL,
DVASPECT_CONTENT, -1, TYMED_HGLOBAL
};
// Allocate memory for the stream
stgmedium.hGlobal = GlobalAlloc(GMEM_SHARE, 512);
LPWSTR pwszMachineName = NULL;
// Attempt to get data from the object
do
{
if (stgmedium.hGlobal == NULL)
break;
if (FAILED(lpDataObject->GetDataHere(&formatetc, &stgmedium)))
break;
pwszMachineName = reinterpret_cast<LPWSTR>(stgmedium.hGlobal);
if (pwszMachineName == NULL)
break;
} while (FALSE);
return pwszMachineName;
}
HRESULT CDNSComponentDataObjectEx::OnExtensionExpand(LPDATAOBJECT lpDataObject, LPARAM param)
{
// this is a namespace extension, need to add
// the root of the snapin
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// NOTICE: the name of the root node is already set in the constructor
// insert the root node in the console
CDNSRootData* pDNSRootNode = (CDNSRootData*)GetRootData();
HSCOPEITEM pParent = param;
pDNSRootNode->SetScopeID(pParent);
HRESULT hr = AddContainerNode(pDNSRootNode, pParent);
if (FAILED(hr))
return hr;
BOOL bLocalHost = FALSE;
if (!pDNSRootNode->IsEnumerated())
{
// get information from the data object
LPWSTR pwszMachineName = ExtractMachineName(lpDataObject);
if ( (pwszMachineName == NULL) || (pwszMachineName[0] == NULL) )
{
if (pwszMachineName != NULL)
::GlobalFree((void*)pwszMachineName);
DWORD dwCharLen = MAX_COMPUTERNAME_LENGTH+1;
pwszMachineName = (LPWSTR)GlobalAlloc(GMEM_SHARE, sizeof(WCHAR)*dwCharLen);
if (pwszMachineName)
{
BOOL bRes = ::GetComputerName(pwszMachineName, &dwCharLen);
ASSERT(dwCharLen <= MAX_COMPUTERNAME_LENGTH);
if (!bRes)
{
wcscpy(pwszMachineName, _T("localhost."));
}
bLocalHost = TRUE;
}
}
// add a new server node with the server name from the data object
CDNSServerNode* pDNSServerNode = new CDNSServerNode(pwszMachineName, bLocalHost);
FREE_INTERNAL((void*)pwszMachineName);
if (pDNSServerNode)
{
VERIFY(pDNSRootNode->AddChildToList(pDNSServerNode));
pDNSRootNode->AddServerToThreadList(pDNSServerNode, this);
}
pDNSRootNode->MarkEnumerated();
}
return hr;
}
HRESULT CDNSComponentDataObjectEx::OnRemoveChildren(LPDATAOBJECT, LPARAM)
{
ASSERT(IsExtensionSnapin());
CDNSRootData* pDNSRootNode = (CDNSRootData*)GetRootData();
CNodeList* pChildList = pDNSRootNode->GetContainerChildList();
ASSERT(pChildList != NULL);
// loop through thelist of servers and remove them from
// the test list
for(POSITION pos = pChildList->GetHeadPosition(); pos != NULL; )
{
CDNSServerNode* pCurrServerNode = (CDNSServerNode*)pChildList->GetNext(pos);
ASSERT(pCurrServerNode != NULL);
pDNSRootNode->RemoveServerFromThreadList(pCurrServerNode, this);
}
// detach all the threads that might be still running
GetRunningThreadTable()->RemoveAll();
// shut down property sheets, if any
GetPropertyPageHolderTable()->WaitForAllToShutDown();
// remove all the children of the root from chaild list
pDNSRootNode->RemoveAllChildrenFromList();
pDNSRootNode->MarkEnumerated(FALSE);
return S_OK;
}
//////////////////////////////////////////////////////////////////////////
// CDNSSnapinAbout
CDNSSnapinAbout::CDNSSnapinAbout()
{
m_szProvider = IDS_SNAPIN_PROVIDER;
m_szVersion = IDS_SNAPIN_VERSION;
m_uIdStrDestription = IDS_SNAPINABOUT_DESCRIPTION;
m_uIdIconImage = IDI_DNS_SNAPIN;
m_uIdBitmapSmallImage = IDB_ABOUT_16x16;
m_uIdBitmapSmallImageOpen = IDB_ABOUT_OPEN_16x16;
m_uIdBitmapLargeImage = IDB_ABOUT_32x32;
m_crImageMask = BMP_COLOR_MASK;
}
//////////////////////////////////////////////////////////////////////////
// CDNSSnapinAboutEx
CDNSSnapinAboutEx::CDNSSnapinAboutEx()
{
m_szProvider = IDS_SNAPIN_PROVIDER;
m_szVersion = IDS_SNAPIN_VERSION;
m_uIdStrDestription = IDS_SNAPINABOUT_DESCRIPTION;
m_uIdIconImage = IDI_DNS_SNAPIN;
m_uIdBitmapSmallImage = IDB_16x16;
m_uIdBitmapSmallImageOpen = IDB_16x16;
m_uIdBitmapLargeImage = IDB_32x32;
m_crImageMask = BMP_COLOR_MASK;
}