910 lines
28 KiB
C++
910 lines
28 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows/NT **/
|
|
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
server.h
|
|
This file contains the prototypes for a DHCP Server
|
|
object and the Bootp and Global Options objects
|
|
contained within it. The other object that a can be
|
|
within a DHCP server is a superscope, which is defined is
|
|
in cdhcpss.cpp and cdhcpss.h.
|
|
|
|
FILE HISTORY:
|
|
|
|
*/
|
|
|
|
#ifndef _SERVER_H
|
|
#define _SERVER_H
|
|
|
|
#ifndef _DHCPHAND_H
|
|
#include "dhcphand.h"
|
|
#endif
|
|
|
|
#ifndef _SERVSTAT_H
|
|
#include "servstat.h" // Server statistics
|
|
#endif
|
|
|
|
#ifndef _SSCPSTAT_H
|
|
#include "sscpstat.h" // Superscope statistics
|
|
#endif
|
|
|
|
#ifndef _CLASSMOD_H
|
|
#include "classmod.h" // Class Stuff
|
|
#endif
|
|
|
|
#define SERVER_OPTION_AUTO_REFRESH 0x00000001
|
|
#define SERVER_OPTION_AUDIT_LOGGING 0x00000002
|
|
#define SERVER_OPTION_SHOW_BOOTP 0x00000004
|
|
#define SERVER_OPTION_EXTENSION 0x00000008 // this server was added as an extension
|
|
#define SERVER_OPTION_SHOW_ROGUE 0x00000010
|
|
|
|
#define AUTO_REFRESH_HOURS_MAX 23
|
|
#define AUTO_REFRESH_MINUTES_MAX 59
|
|
#define AUTO_REFRESH_SECONDS_MAX 59
|
|
|
|
#define DHCP_QDATA_VERSION 0x00000001
|
|
#define DHCP_QDATA_SERVER_INFO 0x00000002
|
|
#define DHCP_QDATA_STATS 0x00000003
|
|
#define DHCP_QDATA_CLASS_INFO 0x00000004
|
|
#define DHCP_QDATA_MCAST_STATS 0x00000005
|
|
#define DHCP_QDATA_OPTION_VALUES 0x00000006
|
|
#define DHCP_QDATA_ROGUE_INFO 0x00000007
|
|
#define DHCP_QDATA_SERVER_ID 0x00000008
|
|
#define DHCP_QDATA_SUBNET_INFO_CACHE 0x00000009
|
|
|
|
typedef struct DhcpRogueInfo_tag
|
|
{
|
|
BOOL fIsRogue;
|
|
BOOL fIsInNt5Domain;
|
|
}
|
|
DHCP_ROGUE_INFO, * LPDHCP_ROGUE_INFO;
|
|
|
|
typedef struct DhcpServerInfo_tag
|
|
{
|
|
BOOL fAuditLog;
|
|
DWORD dwPingRetries;
|
|
CString strDatabasePath;
|
|
CString strBackupPath;
|
|
|
|
// audit logging stuff
|
|
CString strAuditLogDir;
|
|
DWORD dwDiskCheckInterval;
|
|
DWORD dwMaxLogFilesSize;
|
|
DWORD dwMinSpaceOnDisk;
|
|
|
|
// Does it support DynamicBOOTP?
|
|
BOOL fSupportsDynBootp;
|
|
|
|
// Does it support Bindings?
|
|
BOOL fSupportsBindings;
|
|
}
|
|
DHCP_SERVER_CONFIG, * LPDHCP_SERVER_CONFIG;
|
|
|
|
typedef struct DhcpServerId_tag
|
|
{
|
|
CString strIp;
|
|
CString strName;
|
|
}
|
|
DHCP_SERVER_ID, * LPDHCP_SERVER_ID;
|
|
|
|
class CDhcpGlobalOptions;
|
|
class CSubnetInfoCache;
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Class: CDhcpServer
|
|
---------------------------------------------------------------------------*/
|
|
class CDhcpServer : public CMTDhcpHandler
|
|
{
|
|
public:
|
|
CDhcpServer(ITFSComponentData* pTFSComponentData, LPCWSTR pServerName = NULL);
|
|
~CDhcpServer();
|
|
|
|
// Interface
|
|
public:
|
|
// base handler functionality we override
|
|
OVERRIDE_NodeHandler_HasPropertyPages();
|
|
OVERRIDE_NodeHandler_CreatePropertyPages();
|
|
OVERRIDE_NodeHandler_OnAddMenuItems();
|
|
OVERRIDE_NodeHandler_OnCommand();
|
|
OVERRIDE_NodeHandler_GetString();
|
|
|
|
OVERRIDE_BaseHandlerNotify_OnCreateNodeId2();
|
|
|
|
OVERRIDE_NodeHandler_DestroyHandler();
|
|
|
|
// Choose which messages we want to handle
|
|
OVERRIDE_BaseHandlerNotify_OnDelete();
|
|
OVERRIDE_BaseHandlerNotify_OnPropertyChange();
|
|
|
|
// Result handler functionality
|
|
OVERRIDE_BaseResultHandlerNotify_OnResultSelect();
|
|
OVERRIDE_BaseResultHandlerNotify_OnResultDelete();
|
|
|
|
OVERRIDE_ResultHandler_OnGetResultViewType();
|
|
|
|
public:
|
|
// CMTDhcpHandler functionality
|
|
virtual HRESULT InitializeNode(ITFSNode * pNode);
|
|
virtual int GetImageIndex(BOOL bOpenImage);
|
|
ITFSQueryObject* OnCreateQuery(ITFSNode * pNode);
|
|
virtual void OnHaveData(ITFSNode * pParentNode, ITFSNode * pNode);
|
|
virtual void OnHaveData(ITFSNode * pParentNode, LPARAM Data, LPARAM Type);
|
|
virtual DWORD UpdateStatistics(ITFSNode * pNode);
|
|
ITFSQueryObject* OnCreateStatsQuery(ITFSNode *pNode);
|
|
virtual void UpdateToolbar(IToolbar * pToolbar, LONG_PTR dwNodeType, BOOL bSelect);
|
|
|
|
void UpdateConsoleVerbs(ITFSComponent* pComponent, IConsoleVerb * pConsoleVerb, LONG_PTR dwNodeType, BOOL bMultiSelect = FALSE);
|
|
|
|
STDMETHOD(OnNotifyExiting)(LPARAM);
|
|
|
|
HRESULT OnUpdateToolbarButtons(ITFSNode * pNode, LPDHCPTOOLBARNOTIFY pToolbarNotify);
|
|
|
|
public:
|
|
// implementation specific
|
|
BOOL FEnableCreateSuperscope(ITFSNode * pNode);
|
|
void UpdateToolbarStates(ITFSNode * pNode);
|
|
void SetExtensionName();
|
|
HRESULT BuildDisplayName(CString * pstrDisplayName);
|
|
|
|
LPCWSTR GetIpAddress();
|
|
void GetIpAddress(DHCP_IP_ADDRESS *pdhcpIpAddress);
|
|
|
|
LPCTSTR GetName() { return m_strDnsName; }
|
|
void SetName(LPCTSTR pName) { m_strDnsName = pName; }
|
|
|
|
BOOL GetDefaultOptions();
|
|
CDhcpOption * FindOption(DHCP_OPTION_ID dhcpOptionId, LPCTSTR pszVendor);
|
|
|
|
void SetVersion(LARGE_INTEGER & liVersion)
|
|
{ m_liDhcpVersion.QuadPart = liVersion.QuadPart; }
|
|
void GetVersion(LARGE_INTEGER & liVersion)
|
|
{ liVersion.QuadPart = m_liDhcpVersion.QuadPart; }
|
|
|
|
DWORD CreateScope(DHCP_IP_ADDRESS dhcpSubnetAddress,
|
|
DHCP_IP_ADDRESS dhcpSubnetMask,
|
|
LPCTSTR pName,
|
|
LPCTSTR pComment);
|
|
|
|
DWORD CreateMScope(LPDHCP_MSCOPE_INFO pMScopeInfo);
|
|
|
|
DWORD DeleteScope(ITFSNode * pScopeNode, BOOL * pfWantCancel = NULL);
|
|
DWORD DeleteSubnet(DWORD dwScopeId, BOOL bForce = FALSE);
|
|
|
|
DWORD DeleteSuperscope(ITFSNode * pNode, BOOL * pfRefresh = NULL);
|
|
DWORD RemoveSuperscope(LPCTSTR pszName);
|
|
|
|
DWORD DeleteMScope(ITFSNode * pScopeNode, BOOL * pfWantCancel = NULL);
|
|
DWORD DeleteMSubnet(LPCTSTR pszName, BOOL bForce = FALSE);
|
|
|
|
DWORD SetConfigInfo(BOOL bAuditLogging, DWORD dwPingRetries, LPCTSTR pszDatabasePath = NULL, LPCTSTR pszBackupPath = NULL);
|
|
DWORD SetConfigInfo(DWORD dwSetFlags, LPDHCP_SERVER_CONFIG_INFO pServerConfigInfo);
|
|
DWORD SetConfigInfo(DWORD dwSetFlags, LPDHCP_SERVER_CONFIG_INFO_V4 pServerConfigInfo);
|
|
|
|
DWORD SetAutoRefresh(ITFSNode * pNode, BOOL bAutoRefreshOn, DWORD dwRefreshInterval);
|
|
BOOL IsAutoRefreshEnabled() { return m_dwServerOptions & SERVER_OPTION_AUTO_REFRESH; }
|
|
void GetAutoRefresh(BOOL * pbAutoRefreshOn, LPDWORD pdwRefreshInterval)
|
|
{
|
|
if (pbAutoRefreshOn) *pbAutoRefreshOn = m_dwServerOptions & SERVER_OPTION_AUTO_REFRESH;
|
|
if (pdwRefreshInterval) *pdwRefreshInterval = m_dwRefreshInterval;
|
|
}
|
|
|
|
// default option functions
|
|
LONG CreateOption(CDhcpOption * pdhcType);
|
|
LONG DeleteOption(DHCP_OPTION_ID dhcid, LPCTSTR pszVendor);
|
|
LONG UpdateOptionList(COptionList * poblValues, COptionList * poblDefunct, CWnd *pwndMsgParent);
|
|
void DisplayUpdateErrors(COptionList * poblValues, COptionList * poblDefunct, CWnd *pwndMsgParent);
|
|
|
|
// Functions to get and set the DNS reg option
|
|
DWORD GetDnsRegistration(LPDWORD pDnsRegOption);
|
|
DWORD SetDnsRegistration(DWORD DnsRegOption);
|
|
|
|
LONG ScanDatabase(DWORD FixFlag, LPDHCP_SCAN_LIST *ScanList, DHCP_IP_ADDRESS dhcpSubnetAddress);
|
|
LONG ScanDatabase(DWORD FixFlag, LPDHCP_SCAN_LIST *ScanList, LPWSTR pMScopeName);
|
|
|
|
CDhcpDefaultOptionsOnServer * GetDefaultOptionsList() { return m_pDefaultOptionsOnServer; }
|
|
CDhcpGlobalOptions * GetGlobalOptionsContainer();
|
|
|
|
// These funtions allow initialization of cached values in the server object.
|
|
// use SetConfigInfo to actually set them on the server
|
|
BOOL SetAuditLogging(BOOL bNewAuditLogging)
|
|
{
|
|
BOOL bOld = m_dwServerOptions & SERVER_OPTION_AUDIT_LOGGING;
|
|
m_dwServerOptions = bNewAuditLogging ? m_dwServerOptions | SERVER_OPTION_AUDIT_LOGGING :
|
|
m_dwServerOptions & ~SERVER_OPTION_AUDIT_LOGGING;
|
|
return bOld;
|
|
}
|
|
BOOL GetAuditLogging() { return m_dwServerOptions & SERVER_OPTION_AUDIT_LOGGING; }
|
|
DWORD SetPingRetries(DWORD dwNewCount) { DWORD dwOld = m_dwPingRetries; m_dwPingRetries = dwNewCount; return dwOld; }
|
|
DWORD GetPingRetries() { return m_dwPingRetries; }
|
|
|
|
void SetAuditLogPath(LPCTSTR pszPath) { m_strAuditLogPath = pszPath; }
|
|
|
|
// determine if the server has superscopes
|
|
BOOL HasSuperscopes(ITFSNode * pNode);
|
|
|
|
// statistics information
|
|
LPDHCP_MIB_INFO SetMibInfo(LPDHCP_MIB_INFO pMibInfo);
|
|
LPDHCP_MIB_INFO DuplicateMibInfo();
|
|
void FreeDupMibInfo(LPDHCP_MIB_INFO pDupMibInfo);
|
|
|
|
LPDHCP_MCAST_MIB_INFO SetMCastMibInfo(LPDHCP_MCAST_MIB_INFO pMibInfo);
|
|
LPDHCP_MCAST_MIB_INFO DuplicateMCastMibInfo();
|
|
void FreeDupMCastMibInfo(LPDHCP_MCAST_MIB_INFO pDupMibInfo);
|
|
|
|
// adding child nodes sorted
|
|
HRESULT AddScopeSorted(ITFSNode * pServerNode, ITFSNode * pScopeNode);
|
|
HRESULT AddSuperscopeSorted(ITFSNode * pServerNode, ITFSNode * pScopeNode);
|
|
HRESULT AddMScopeSorted(ITFSNode * pServerNode, ITFSNode * pScopeNode);
|
|
HRESULT GetBootpPosition(ITFSNode * pServerNode, LONG_PTR * puRelativeFlag, LONG_PTR * puRelativeID);
|
|
|
|
// hide/show/query bootp folders
|
|
BOOL IsBootpVisible() { return m_dwServerOptions & SERVER_OPTION_SHOW_BOOTP; }
|
|
|
|
HRESULT ShowNode(ITFSNode * pServerNode, UINT uNodeType, BOOL bVisible);
|
|
|
|
// access to the server options for save/restore
|
|
DWORD GetServerOptions() { return m_dwServerOptions; }
|
|
void SetServerOptions(DWORD dwServerOptions) { m_dwServerOptions = dwServerOptions; }
|
|
|
|
HRESULT TriggerStatsRefresh(ITFSNode * pNode);
|
|
|
|
void DisplayRogueWarning();
|
|
|
|
// multicast scope stuff
|
|
BOOL DoesMScopeExist(ITFSNode * pServerNode, DWORD dwScopeId);
|
|
|
|
// Dynamic Bootp support
|
|
BOOL FSupportsDynBootp() { return m_fSupportsDynBootp; }
|
|
|
|
// Bindings support
|
|
BOOL FSupportsBindings() { return m_fSupportsBindings; }
|
|
|
|
// Access to the classInfoarray
|
|
void SetClassInfoArray(CClassInfoArray * pClassInfoArray)
|
|
{
|
|
CSingleLock sl(&m_csMibInfo);
|
|
sl.Lock();
|
|
|
|
m_ClassInfoArray.RemoveAll();
|
|
m_ClassInfoArray.Copy(*pClassInfoArray);
|
|
}
|
|
|
|
void GetClassInfoArray(CClassInfoArray & ClassInfoArray)
|
|
{
|
|
CSingleLock sl(&m_csMibInfo);
|
|
sl.Lock();
|
|
|
|
ClassInfoArray.Copy(m_ClassInfoArray);
|
|
}
|
|
|
|
CClassInfoArray * GetClassInfoArray()
|
|
{
|
|
CSingleLock sl(&m_csMibInfo);
|
|
sl.Lock();
|
|
|
|
return &m_ClassInfoArray;
|
|
}
|
|
|
|
BOOL RemoveClass(LPCTSTR pClassName)
|
|
{
|
|
CSingleLock sl(&m_csMibInfo);
|
|
sl.Lock();
|
|
|
|
return m_ClassInfoArray.RemoveClass(pClassName);
|
|
}
|
|
|
|
void AddClass(LPCTSTR pName, LPCTSTR pComment, CByteArray & baData)
|
|
{
|
|
CSingleLock sl(&m_csMibInfo);
|
|
sl.Lock();
|
|
|
|
CClassInfo ClassInfo;
|
|
|
|
ClassInfo.strName = pName;
|
|
ClassInfo.strComment = pComment;
|
|
ClassInfo.baData.Copy(baData);
|
|
|
|
m_ClassInfoArray.Add(ClassInfo);
|
|
}
|
|
|
|
void SetOptionValueEnum(COptionValueEnum * pEnum)
|
|
{
|
|
CSingleLock sl(&m_csMibInfo);
|
|
sl.Lock();
|
|
|
|
m_ServerOptionValues.DeleteAll();
|
|
m_ServerOptionValues.Copy(pEnum);
|
|
}
|
|
|
|
COptionValueEnum * GetOptionValueEnum()
|
|
{
|
|
CSingleLock sl(&m_csMibInfo);
|
|
sl.Lock();
|
|
|
|
return &m_ServerOptionValues;
|
|
}
|
|
|
|
// Implementation
|
|
private:
|
|
// Command handlers
|
|
HRESULT OnDefineUserClasses(ITFSNode * pNode);
|
|
HRESULT OnDefineVendorClasses(ITFSNode * pNode);
|
|
HRESULT OnCreateNewSuperscope(ITFSNode * pNode);
|
|
HRESULT OnCreateNewScope(ITFSNode * pNode);
|
|
HRESULT OnCreateNewMScope(ITFSNode * pNode);
|
|
HRESULT OnShowServerStats(ITFSNode * pNode);
|
|
HRESULT OnSetDefaultOptions(ITFSNode * pNode);
|
|
HRESULT OnReconcileAll(ITFSNode * pNode);
|
|
HRESULT OnServerAuthorize(ITFSNode * pNode);
|
|
HRESULT OnServerDeauthorize(ITFSNode * pNode);
|
|
HRESULT OnDelete(ITFSNode * pNode);
|
|
HRESULT OnControlService(ITFSNode * pNode, BOOL fStart);
|
|
HRESULT OnPauseResumeService(ITFSNode * pNode, BOOL fPause);
|
|
HRESULT OnRestartService(ITFSNode * pNode);
|
|
HRESULT OnServerBackup(ITFSNode * pNode);
|
|
HRESULT OnServerRestore(ITFSNode * pNode);
|
|
|
|
// Attributes
|
|
public:
|
|
DWORD SetBindings(LPDHCP_BIND_ELEMENT_ARRAY BindArray);
|
|
DWORD GetBindings(LPDHCP_BIND_ELEMENT_ARRAY &BindArray);
|
|
BOOL m_bStatsOnly;
|
|
CSubnetInfoCache * m_pSubnetInfoCache;
|
|
|
|
protected:
|
|
void UpdateResultMessage(ITFSNode * pNode);
|
|
|
|
// we override this because we handle the error messages ourselves in UpdateResultMessage
|
|
// by not returning anything the base class won't put up a result pane message
|
|
void GetErrorMessages(CString & strTitle, CString & strBody, IconIdentifier * icon) {};
|
|
|
|
private:
|
|
BOOL m_bNetbios; // Name is a NetBIOS name
|
|
|
|
DHCP_IP_ADDRESS m_dhcpServerAddress; // Standard 32-bit value (eg: 0x7f000001)
|
|
|
|
CString m_strServerAddress;
|
|
CString m_strDnsName;
|
|
CString m_strState; // rogue or not
|
|
LARGE_INTEGER m_liDhcpVersion;
|
|
|
|
DWORD m_dwServerOptions; // Any of the SERVER_OPTIONS
|
|
DWORD m_dwRefreshInterval;
|
|
DWORD m_dwPingRetries;
|
|
CString m_strAuditLogPath;
|
|
CString m_strDatabasePath;
|
|
CString m_strBackupPath;
|
|
|
|
BOOL m_fSupportsDynBootp;
|
|
BOOL m_fSupportsBindings;
|
|
|
|
int m_StatsTimerId;
|
|
|
|
LPDHCP_MIB_INFO m_pMibInfo; // for statistics
|
|
LPDHCP_MCAST_MIB_INFO m_pMCastMibInfo;
|
|
|
|
DHCP_ROGUE_INFO m_RogueInfo;
|
|
|
|
CCriticalSection m_csMibInfo;
|
|
|
|
CDhcpDefaultOptionsOnServer * m_pDefaultOptionsOnServer;
|
|
|
|
CServerStats m_dlgStats;
|
|
CClassInfoArray m_ClassInfoArray;
|
|
COptionValueEnum m_ServerOptionValues;
|
|
};
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Class: CDhcpGlobalOptions
|
|
---------------------------------------------------------------------------*/
|
|
class CDhcpGlobalOptions : public CMTDhcpHandler
|
|
{
|
|
public:
|
|
CDhcpGlobalOptions(ITFSComponentData * pComponentData);
|
|
~CDhcpGlobalOptions();
|
|
|
|
// Interface
|
|
public:
|
|
// base handler functionality we override
|
|
OVERRIDE_NodeHandler_OnAddMenuItems();
|
|
OVERRIDE_NodeHandler_HasPropertyPages();
|
|
OVERRIDE_NodeHandler_CreatePropertyPages();
|
|
OVERRIDE_NodeHandler_OnCommand();
|
|
OVERRIDE_NodeHandler_GetString()
|
|
{ return (nCol == 0) ? GetDisplayName() : NULL; }
|
|
|
|
OVERRIDE_BaseHandlerNotify_OnCreateNodeId2();
|
|
OVERRIDE_BaseHandlerNotify_OnPropertyChange();
|
|
|
|
virtual HRESULT EnumerateResultPane(ITFSComponent *, MMC_COOKIE, LPARAM, LPARAM);
|
|
|
|
// Result handler functionality we override
|
|
OVERRIDE_BaseResultHandlerNotify_OnResultSelect();
|
|
OVERRIDE_BaseResultHandlerNotify_OnResultDelete();
|
|
OVERRIDE_BaseResultHandlerNotify_OnResultUpdateView();
|
|
OVERRIDE_BaseResultHandlerNotify_OnResultPropertyChange();
|
|
OVERRIDE_ResultHandler_CompareItems();
|
|
OVERRIDE_ResultHandler_OnGetResultViewType();
|
|
|
|
public:
|
|
// CMTDhcpHandler functionality
|
|
virtual HRESULT InitializeNode(ITFSNode * pNode);
|
|
virtual int GetImageIndex(BOOL bOpenImage);
|
|
ITFSQueryObject* OnCreateQuery(ITFSNode * pNode);
|
|
virtual void OnHaveData(ITFSNode * pParentNode, LPARAM Data, LPARAM Type);
|
|
|
|
STDMETHOD(OnNotifyExiting)(LPARAM);
|
|
|
|
CDhcpServer* GetServerObject(ITFSNode * pNode)
|
|
{
|
|
SPITFSNode spServerNode;
|
|
pNode->GetParent(&spServerNode);
|
|
return GETHANDLER(CDhcpServer, spServerNode);
|
|
}
|
|
|
|
private:
|
|
// command handlers
|
|
HRESULT OnCreateNewOptions(ITFSNode * pNode);
|
|
|
|
// Attributes
|
|
private:
|
|
void UpdateResultMessage(ITFSNode * pNode);
|
|
|
|
};
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Class: CDhcpBootp
|
|
---------------------------------------------------------------------------*/
|
|
class CDhcpBootp : public CMTDhcpHandler
|
|
{
|
|
public:
|
|
CDhcpBootp(ITFSComponentData * pComponentData);
|
|
~CDhcpBootp();
|
|
|
|
// Interface
|
|
public:
|
|
// base handler functionality we override
|
|
OVERRIDE_NodeHandler_OnAddMenuItems();
|
|
OVERRIDE_NodeHandler_OnCommand();
|
|
OVERRIDE_NodeHandler_GetString()
|
|
{ return (nCol == 0) ? GetDisplayName() : NULL; }
|
|
|
|
OVERRIDE_BaseHandlerNotify_OnCreateNodeId2();
|
|
|
|
// Result handler functionality we override
|
|
OVERRIDE_BaseResultHandlerNotify_OnResultDelete();
|
|
|
|
OVERRIDE_ResultHandler_CompareItems();
|
|
OVERRIDE_ResultHandler_OnGetResultViewType();
|
|
|
|
public:
|
|
// CMTDhcpHandler functionality
|
|
virtual HRESULT InitializeNode(ITFSNode * pNode);
|
|
virtual int GetImageIndex(BOOL bOpenImage);
|
|
ITFSQueryObject* OnCreateQuery(ITFSNode * pNode);
|
|
|
|
CDhcpServer* GetServerObject(ITFSNode * pNode)
|
|
{
|
|
SPITFSNode spServerNode;
|
|
pNode->GetParent(&spServerNode);
|
|
return GETHANDLER(CDhcpServer, spServerNode);
|
|
}
|
|
|
|
private:
|
|
// command handlers
|
|
DWORD OnCreateNewBootpEntry(ITFSNode * pNode);
|
|
|
|
// Implementation
|
|
private:
|
|
|
|
// Attributes
|
|
private:
|
|
};
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Class: CDhcpSuperscope
|
|
---------------------------------------------------------------------------*/
|
|
class CDhcpSuperscope : public CMTDhcpHandler
|
|
{
|
|
public:
|
|
CDhcpSuperscope(ITFSComponentData * pComponentData, LPCWSTR pSuperscopeName = NULL);
|
|
~CDhcpSuperscope();
|
|
|
|
public:
|
|
// base handler functionality we override
|
|
OVERRIDE_NodeHandler_HasPropertyPages() { return hrOK; }
|
|
OVERRIDE_NodeHandler_CreatePropertyPages();
|
|
OVERRIDE_NodeHandler_OnAddMenuItems();
|
|
OVERRIDE_NodeHandler_OnCommand();
|
|
OVERRIDE_NodeHandler_GetString();
|
|
|
|
OVERRIDE_NodeHandler_DestroyHandler();
|
|
|
|
// Choose which messages we want to handle
|
|
OVERRIDE_BaseHandlerNotify_OnCreateNodeId2();
|
|
OVERRIDE_BaseHandlerNotify_OnDelete();
|
|
OVERRIDE_BaseHandlerNotify_OnPropertyChange();
|
|
|
|
// Result handler functionality we override
|
|
OVERRIDE_BaseResultHandlerNotify_OnResultDelete();
|
|
OVERRIDE_ResultHandler_OnGetResultViewType();
|
|
|
|
// Implementation
|
|
private:
|
|
// Command handlers
|
|
HRESULT OnActivateSuperscope(ITFSNode * pNode);
|
|
HRESULT OnCreateNewScope(ITFSNode * pNode);
|
|
HRESULT OnDelete(ITFSNode * pNode);
|
|
HRESULT OnShowSuperscopeStats(ITFSNode * pNode);
|
|
|
|
public:
|
|
// public functions for superscope manipulation
|
|
LPCWSTR GetName() { return m_strName; };
|
|
void SetName(LPCWSTR pName) { m_strName = pName; }
|
|
|
|
HRESULT DoesSuperscopeExist(LPCWSTR szName);
|
|
HRESULT AddScope(DHCP_IP_ADDRESS scopeAddress);
|
|
HRESULT RemoveScope(DHCP_IP_ADDRESS scopeAddress);
|
|
HRESULT Rename(ITFSNode * pNode, LPCWSTR szNewName);
|
|
HRESULT GetSuperscopeInfo(LPDHCP_SUPER_SCOPE_TABLE *pSuperscopeTable);
|
|
HRESULT SetSuperscope(DHCP_IP_ADDRESS SubnetAddress, BOOL ChangeExisting);
|
|
|
|
public:
|
|
// helpers
|
|
void SetServer(ITFSNode * pServerNode) { m_spServerNode.Set(pServerNode); }
|
|
HRESULT BuildDisplayName(CString * pstrDisplayName, LPCTSTR pName);
|
|
void UpdateToolbarStates();
|
|
void SetState(DHCP_SUBNET_STATE dhcpState) { m_SuperscopeState = dhcpState; }
|
|
void NotifyScopeStateChange(ITFSNode * pNode, DHCP_SUBNET_STATE newScopeState);
|
|
|
|
// adding child nodes sorted
|
|
HRESULT AddScopeSorted(ITFSNode * pServerNode, ITFSNode * pScopeNode);
|
|
|
|
public:
|
|
// CMTDhcpHandler functionality
|
|
virtual HRESULT InitializeNode(ITFSNode * pNode);
|
|
virtual void OnHaveData(ITFSNode * pParentNode, ITFSNode * pNode);
|
|
virtual int GetImageIndex(BOOL bOpenImage);
|
|
virtual DWORD UpdateStatistics(ITFSNode * pNode);
|
|
ITFSQueryObject* OnCreateQuery(ITFSNode * pNode);
|
|
|
|
STDMETHOD(OnNotifyExiting)(LPARAM lParam);
|
|
|
|
CDhcpServer* GetServerObject()
|
|
{
|
|
return GETHANDLER(CDhcpServer, m_spServerNode);
|
|
}
|
|
|
|
HRESULT OnUpdateToolbarButtons(ITFSNode * pNode, LPDHCPTOOLBARNOTIFY pToolbarNotify);
|
|
|
|
// Implementation
|
|
private:
|
|
|
|
// Attributes
|
|
private:
|
|
CString m_strName;
|
|
CString m_strState;
|
|
DHCP_SUBNET_STATE m_SuperscopeState;
|
|
SPITFSNode m_spServerNode;
|
|
CSuperscopeStats m_dlgStats;
|
|
};
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Class: CHostInfo
|
|
---------------------------------------------------------------------------*/
|
|
class CHostInfo
|
|
{
|
|
public:
|
|
CHostInfo()
|
|
{
|
|
IpAddress = 0;
|
|
}
|
|
|
|
CHostInfo(LPDHCP_HOST_INFO pDhcpHostInfo)
|
|
{
|
|
Set(pDhcpHostInfo);
|
|
}
|
|
|
|
CHostInfo(CHostInfo & hostInfo)
|
|
{
|
|
*this = hostInfo;
|
|
}
|
|
|
|
CHostInfo & operator = (const CHostInfo & hostInfo)
|
|
{
|
|
if (this != &hostInfo)
|
|
{
|
|
IpAddress = hostInfo.IpAddress;
|
|
NetBiosName = hostInfo.NetBiosName;
|
|
HostName = hostInfo.HostName;
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
void Set(LPDHCP_HOST_INFO pDhcpHostInfo)
|
|
{
|
|
IpAddress = pDhcpHostInfo->IpAddress;
|
|
NetBiosName = pDhcpHostInfo->NetBiosName;
|
|
HostName = pDhcpHostInfo->HostName;
|
|
}
|
|
|
|
public:
|
|
DHCP_IP_ADDRESS IpAddress; // minimum information always available
|
|
CString NetBiosName; // optional information
|
|
CString HostName; // optional information
|
|
};
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Class: CSubnetInfo
|
|
---------------------------------------------------------------------------*/
|
|
class CSubnetInfo
|
|
{
|
|
public:
|
|
CSubnetInfo()
|
|
{
|
|
SubnetAddress = 0;
|
|
SubnetMask = 0;
|
|
SubnetState = DhcpSubnetDisabled;
|
|
|
|
// multicast specific fields
|
|
MScopeAddressPolicy = 0;
|
|
MScopeFlags = 0;
|
|
TTL = 0;
|
|
ExpiryTime.dwLowDateTime = 0;
|
|
ExpiryTime.dwHighDateTime = 0;
|
|
}
|
|
|
|
CSubnetInfo(LPDHCP_SUBNET_INFO pDhcpSubnetInfo)
|
|
{
|
|
Set(pDhcpSubnetInfo);
|
|
}
|
|
|
|
CSubnetInfo(CSubnetInfo & subnetInfo)
|
|
{
|
|
*this = subnetInfo;
|
|
}
|
|
|
|
CSubnetInfo & operator = (const CSubnetInfo & subnetInfo)
|
|
{
|
|
if (this != &subnetInfo)
|
|
{
|
|
SubnetAddress = subnetInfo.SubnetAddress;
|
|
SubnetMask = subnetInfo.SubnetMask;
|
|
SubnetName = subnetInfo.SubnetName;
|
|
SubnetComment = subnetInfo.SubnetComment;
|
|
PrimaryHost = subnetInfo.PrimaryHost;
|
|
SubnetState = subnetInfo.SubnetState;
|
|
|
|
MScopeAddressPolicy = subnetInfo.MScopeAddressPolicy;
|
|
MScopeFlags = subnetInfo.MScopeFlags;
|
|
TTL = subnetInfo.TTL;
|
|
ExpiryTime = subnetInfo.ExpiryTime;
|
|
LangTag = subnetInfo.LangTag;
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
void Set(LPDHCP_SUBNET_INFO pDhcpSubnetInfo)
|
|
{
|
|
SubnetAddress = pDhcpSubnetInfo->SubnetAddress;
|
|
SubnetMask = pDhcpSubnetInfo->SubnetMask;
|
|
SubnetName = pDhcpSubnetInfo->SubnetName;
|
|
SubnetComment = pDhcpSubnetInfo->SubnetComment;
|
|
PrimaryHost.Set(&pDhcpSubnetInfo->PrimaryHost);
|
|
SubnetState = pDhcpSubnetInfo->SubnetState;
|
|
|
|
MScopeAddressPolicy = 0;
|
|
MScopeFlags = 0;
|
|
TTL = 0;
|
|
ExpiryTime.dwLowDateTime = 0;
|
|
ExpiryTime.dwHighDateTime = 0;
|
|
}
|
|
|
|
void Set(LPDHCP_MSCOPE_INFO pMScopeInfo)
|
|
{
|
|
SubnetName = pMScopeInfo->MScopeName;
|
|
SubnetComment = pMScopeInfo->MScopeComment;
|
|
SubnetAddress = pMScopeInfo->MScopeId;
|
|
MScopeAddressPolicy = pMScopeInfo->MScopeAddressPolicy;
|
|
PrimaryHost.Set(&pMScopeInfo->PrimaryHost);
|
|
SubnetState = pMScopeInfo->MScopeState;
|
|
MScopeFlags = pMScopeInfo->MScopeFlags;
|
|
TTL = pMScopeInfo->TTL;
|
|
ExpiryTime = pMScopeInfo->ExpiryTime;
|
|
LangTag = pMScopeInfo->LangTag;
|
|
|
|
SubnetMask = 0;
|
|
}
|
|
|
|
public:
|
|
// common fields
|
|
DHCP_IP_ADDRESS SubnetAddress;
|
|
DHCP_IP_MASK SubnetMask;
|
|
CString SubnetName;
|
|
CString SubnetComment;
|
|
CHostInfo PrimaryHost;
|
|
DHCP_SUBNET_STATE SubnetState;
|
|
|
|
// multicast specific fields
|
|
DWORD MScopeAddressPolicy;
|
|
DWORD MScopeFlags;
|
|
BYTE TTL;
|
|
DATE_TIME ExpiryTime;
|
|
CString LangTag;
|
|
};
|
|
|
|
typedef CArray<CSubnetInfo, CSubnetInfo&> CSubnetInfoArrayBase;
|
|
typedef CMap<DHCP_IP_ADDRESS, DHCP_IP_ADDRESS, CSubnetInfo, CSubnetInfo &> CSubnetInfoCacheBase;
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Class: CSubnetInfoCache
|
|
---------------------------------------------------------------------------*/
|
|
class CSubnetInfoCache : public CSubnetInfoCacheBase
|
|
{
|
|
public:
|
|
DWORD GetInfo(CString & strServer, DHCP_IP_ADDRESS ipAddress, CSubnetInfo & subnetInfo);
|
|
};
|
|
|
|
class CMScopeInfoCache : public CSubnetInfoArrayBase
|
|
{
|
|
public:
|
|
DWORD GetInfo(CString & strServer, LPCTSTR pszName, CSubnetInfo & subnetInfo);
|
|
BOOL Lookup(LPCTSTR pszName, CSubnetInfo & subnetInfo)
|
|
{
|
|
BOOL fFound = FALSE;
|
|
|
|
for (int i = 0; i < GetSize(); i++)
|
|
{
|
|
if (GetAt(i).SubnetName.Compare(pszName) == 0)
|
|
{
|
|
subnetInfo = GetAt(i);
|
|
fFound = TRUE;
|
|
}
|
|
}
|
|
|
|
return fFound;
|
|
}
|
|
};
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Class: CDhcpServerQueryObj
|
|
---------------------------------------------------------------------------*/
|
|
class CDhcpServerQueryObj : public CDHCPQueryObj
|
|
{
|
|
public:
|
|
CDhcpServerQueryObj(ITFSComponentData * pTFSComponentData,
|
|
ITFSNodeMgr * pNodeMgr)
|
|
: CDHCPQueryObj(pTFSComponentData, pNodeMgr)
|
|
{
|
|
// default to the cache in this object
|
|
m_pSubnetInfoCache = &m_SubnetInfoCache;
|
|
};
|
|
|
|
STDMETHODIMP Execute();
|
|
|
|
virtual void OnEventAbort(LPARAM Data, LPARAM Type);
|
|
|
|
LONG CreateOption(CDhcpOption * pOption);
|
|
void UpdateDefaultOptionsOnServer(CDhcpDefaultOptionsOnServer * pOptionsOnServer,
|
|
CDhcpDefaultOptionsMasterList * pMasterList);
|
|
void EnumSubnetsV4();
|
|
void EnumSubnets();
|
|
void EnumMScopes(); //Multicast scopes
|
|
|
|
CDhcpSuperscope * FindSuperscope(CNodeListBase & listSuperscopes, LPWSTR pSuperScopeName);
|
|
|
|
DWORD SetVersion();
|
|
DWORD GetConfigInfo();
|
|
DWORD GetStatistics();
|
|
DWORD GetStatus();
|
|
|
|
BOOL VerifyDhcpServer();
|
|
|
|
public:
|
|
DHCP_RESUME_HANDLE m_dhcpResumeHandle;
|
|
DWORD m_dwPreferredMax;
|
|
LARGE_INTEGER m_liDhcpVersion;
|
|
|
|
DWORD m_dwPingRetries;
|
|
BOOL m_fAuditLog;
|
|
BOOL m_bStatsOnly;
|
|
BOOL m_fSupportsDynBootp;
|
|
BOOL m_fSupportsBindings;
|
|
CString m_strDatabasePath;
|
|
CString m_strBackupPath;
|
|
CString m_strAuditLogPath;
|
|
CString m_strServerName;
|
|
|
|
CDhcpDefaultOptionsOnServer * m_pDefaultOptionsOnServer;
|
|
|
|
CSubnetInfoCache * m_pSubnetInfoCache;
|
|
CSubnetInfoCache m_SubnetInfoCache;
|
|
CMScopeInfoCache m_MScopeInfoCache;
|
|
};
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Class: CDhcpSuperscopeQueryObj
|
|
---------------------------------------------------------------------------*/
|
|
class CDhcpSuperscopeQueryObj : public CDHCPQueryObj
|
|
{
|
|
public:
|
|
CDhcpSuperscopeQueryObj
|
|
(
|
|
ITFSComponentData* pTFSComponentData,
|
|
ITFSNodeMgr* pNodeMgr
|
|
) : CDHCPQueryObj(pTFSComponentData, pNodeMgr) {};
|
|
STDMETHODIMP Execute();
|
|
|
|
public:
|
|
CString m_strSuperscopeName;
|
|
};
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Class: CDhcpBootpQueryObj
|
|
---------------------------------------------------------------------------*/
|
|
class CDhcpBootpQueryObj : public CDHCPQueryObj
|
|
{
|
|
public:
|
|
CDhcpBootpQueryObj
|
|
(
|
|
ITFSComponentData* pTFSComponentData,
|
|
ITFSNodeMgr* pNodeMgr
|
|
) : CDHCPQueryObj(pTFSComponentData, pNodeMgr) {};
|
|
|
|
STDMETHODIMP Execute();
|
|
};
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Class: CDhcpGlobalOptionsQueryObj
|
|
---------------------------------------------------------------------------*/
|
|
class CDhcpGlobalOptionsQueryObj : public CDHCPQueryObj
|
|
{
|
|
public:
|
|
CDhcpGlobalOptionsQueryObj
|
|
(
|
|
ITFSComponentData* pTFSComponentData,
|
|
ITFSNodeMgr* pNodeMgr
|
|
) : CDHCPQueryObj(pTFSComponentData, pNodeMgr) {};
|
|
|
|
STDMETHODIMP Execute();
|
|
|
|
public:
|
|
DHCP_RESUME_HANDLE m_dhcpResumeHandle;
|
|
DWORD m_dwPreferredMax;
|
|
LARGE_INTEGER m_liDhcpVersion;
|
|
};
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Class: COptionNodeEnum
|
|
---------------------------------------------------------------------------*/
|
|
class COptionNodeEnum : public CTFSNodeList
|
|
{
|
|
public:
|
|
COptionNodeEnum(ITFSComponentData * pTFSCompData, ITFSNodeMgr * pNodeMgr);
|
|
|
|
DWORD Enum(LPCTSTR pServer, LARGE_INTEGER & liVersion, DHCP_OPTION_SCOPE_INFO & dhcpOptionScopeInfo);
|
|
|
|
protected:
|
|
DWORD EnumOptions(LPCTSTR pServer, DHCP_OPTION_SCOPE_INFO & dhcpOptionScopeInfo);
|
|
DWORD EnumOptionsV5(LPCTSTR pServer, DHCP_OPTION_SCOPE_INFO & dhcpOptionScopeInfo);
|
|
|
|
// V5 Helper
|
|
HRESULT CreateOptions(LPDHCP_OPTION_VALUE_ARRAY pOptionValues, LPCTSTR pClassName, LPCTSTR pszVendor);
|
|
|
|
protected:
|
|
SPITFSComponentData m_spTFSCompData;
|
|
SPITFSNodeMgr m_spNodeMgr;
|
|
};
|
|
|
|
|
|
#endif _SERVER_H
|