//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1999 // // File: server.h // //-------------------------------------------------------------------------- #ifndef _SERVER_H #define _SERVER_H #include "dnsutil.h" /////////////////////////////////////////////////////////////////////////////// // GLOBAL FUNCTIONS DNS_STATUS ServerHasCache(LPCWSTR lpszServerName, BOOL* pbRes); DNS_STATUS ServerHasRootZone(LPCWSTR lpszServerName, BOOL* pbRes); extern LPCWSTR DNS_EVT_COMMAND_LINE; extern LPCWSTR MMC_APP; /////////////////////////////////////////////////////////////////////////////// // FORWARD DECLARATIONS class CDNSMTContainerNode; class CDNSServerNode; class CDNSZoneNode; class CDNSDomainNode; class CCathegoryFolderNode; class CDNSRootHintsNode; class CDNSServer_TestPropertyPage; class CDNSQueryFilter; /////////////////////////////////////////////////////////////////////////////// // defines for server test intervals #define MIN_SERVER_TEST_INTERVAL 30 // seconds #define MAX_SERVER_TEST_INTERVAL 3600 // seconds in 1 hour #define DEFAULT_SERVER_TEST_INTERVAL 60 // seconds /////////////////////////////////////////////////////////////////////////////// // defines for server sheet messages #define SHEET_MSG_SERVER_TEST_DATA (1) #define SHEET_MSG_SELECT_PAGE (2) /////////////////////////////////////////////////////////////////////////////// // CZoneInfoHolder : simple memory manager for arrays of zone info handles class CZoneInfoHolder { public: CZoneInfoHolder(); ~CZoneInfoHolder(); BOOL Grow(); PDNS_ZONE_INFO* m_zoneInfoArray; DWORD m_dwArrSize; DWORD m_dwZoneCount; private: void AllocateMemory(DWORD dwArrSize); void FreeMemory(); }; /////////////////////////////////////////////////////////////////////////////// // CDNSMTContainerNode // base class from which all the MT nodes derive from class CDNSMTContainerNode : public CMTContainerNode { public: // enumeration for node states, to handle icon changes typedef enum { notLoaded = 0, // initial state, valid only if server never contacted loading, loaded, unableToLoad, accessDenied } nodeStateType; CDNSMTContainerNode(); void SetServerNode(CDNSServerNode* pServerNode) { ASSERT(pServerNode != NULL); m_pServerNode = pServerNode; } CDNSServerNode* GetServerNode() { ASSERT( m_pServerNode != NULL); return m_pServerNode; } virtual HRESULT OnSetToolbarVerbState(IToolbar* pToolbar, CNodeList* pNodeList); virtual int GetImageIndex(BOOL bOpenImage); virtual CColumnSet* GetColumnSet() { if (m_pColumnSet == NULL) { CDNSRootData* pRoot = (CDNSRootData*)GetRootContainer(); m_pColumnSet = ((CDNSComponentDataObjectBase*)pRoot->GetComponentDataObject())->GetColumnSet(L"---Default Column Set---"); } return m_pColumnSet; } virtual LPCWSTR GetColumnID() { return GetColumnSet()->GetColumnID(); } virtual LPWSTR GetDescriptionBarText(); protected: virtual BOOL CanCloseSheets(); virtual void OnChangeState(CComponentDataObject* pComponentDataObject); virtual void OnHaveData(CObjBase* pObj, CComponentDataObject* pComponentDataObject); virtual void OnError(DWORD dwErr); CColumnSet* m_pColumnSet; CString m_szDescriptionBar; private: CDNSServerNode* m_pServerNode; }; /////////////////////////////////////////////////////////////////////////////// // CDNSQueryObj : general purpose base class class CDNSQueryObj : public CQueryObj { public: CDNSQueryObj(BOOL bAdvancedView, DWORD dwServerVersion) { m_dwServerVersion = dwServerVersion; m_bAdvancedView = bAdvancedView; // internal state variables m_nObjectCount = 0; m_nMaxObjectCount = DNS_QUERY_OBJ_COUNT_MAX; m_bGetAll = TRUE; m_nFilterOption = DNS_QUERY_FILTER_DISABLED; } CString m_szServerName; DWORD m_dwServerVersion; BOOL m_bAdvancedView; public: virtual BOOL AddQueryResult(CObjBase* pObj) { BOOL bRet = CQueryObj::AddQueryResult(pObj); if (bRet) m_nObjectCount++; return bRet; } void SetFilterOptions(CDNSQueryFilter* pFilter); BOOL TooMuchData(); protected: ULONG m_nMaxObjectCount; // max number of objects in a query BOOL m_bGetAll; ULONG m_nObjectCount; // number of objects queried so far UINT m_nFilterOption; CString m_szFilterString1; int m_nFilterStringLen1; // cached value CString m_szFilterString2; int m_nFilterStringLen2; // cached value protected: BOOL MatchName(LPCWSTR lpszName); }; ///////////////////////////////////////////////////////////////////////// // CCathegoryFolderNode class CCathegoryFolderQueryObj : public CDNSQueryObj { public: CCathegoryFolderQueryObj(BOOL bAdvancedView, DWORD dwServerVersion) : CDNSQueryObj(bAdvancedView, dwServerVersion) { } virtual BOOL Enumerate(); typedef enum { unk, cache, fwdAuthoritated, revAuthoritated, domainForwarders } queryType; void SetType(queryType type) { m_type = type;} protected: queryType m_type; BOOL CanAddZone(PDNS_RPC_ZONE pZoneInfo); }; class CCathegoryFolderNode : public CDNSMTContainerNode { public: CCathegoryFolderNode() { m_type = CCathegoryFolderQueryObj::unk; } virtual HRESULT OnCommand(long nCommandID, DATA_OBJECT_TYPES type, CComponentDataObject* pComponentData, CNodeList* pNodeList); virtual void OnDelete(CComponentDataObject*, CNodeList*) { ASSERT(FALSE);} virtual BOOL OnSetRefreshVerbState(DATA_OBJECT_TYPES type, BOOL* pbHide, CNodeList* pNodeList); virtual LPCWSTR GetString(int nCol) { return (nCol == 0) ? GetDisplayName() : g_lpszNullString; } CCathegoryFolderQueryObj::queryType GetType() { return m_type;} virtual LPWSTR GetDescriptionBarText(); virtual CColumnSet* GetColumnSet() { if (m_pColumnSet == NULL) { CDNSRootData* pRoot = (CDNSRootData*)GetRootContainer(); m_pColumnSet = ((CDNSComponentDataObjectBase*)pRoot->GetComponentDataObject())->GetColumnSet(L"---Zone Column Set---"); } return m_pColumnSet; } virtual BOOL CanExpandSync() { return TRUE; } protected: virtual LPCONTEXTMENUITEM2 OnGetContextMenuItemTable() { return CDNSCathegoryFolderHolder::GetContextMenuItem(); } virtual BOOL OnAddMenuItem(LPCONTEXTMENUITEM2 pContextMenuItem2, long *pInsertionAllowed); virtual CQueryObj* OnCreateQuery(); CCathegoryFolderQueryObj::queryType m_type; }; ///////////////////////////////////////////////////////////////////////// // CDNSCacheNode // // * contains the root domain "." // * can delete items underneath, but cannot add or modify class CDNSCacheNode : public CCathegoryFolderNode { public: CDNSCacheNode(); virtual HRESULT OnCommand(long nCommandID, DATA_OBJECT_TYPES type, CComponentDataObject* pComponentData, CNodeList* pNodeList); void OnClearCache(CComponentDataObject* pComponentData); virtual BOOL CanExpandSync() { return TRUE; } protected: virtual LPCONTEXTMENUITEM2 OnGetContextMenuItemTable() { return CDNSCacheMenuHolder::GetContextMenuItem(); } virtual BOOL OnAddMenuItem(LPCONTEXTMENUITEM2 pContextMenuItem2, long *pInsertionAllowed); }; ///////////////////////////////////////////////////////////////////////// // CDNSDomainForwardersNode // // * contains the domain forwarders as zones // * this node will always be hidden // class CDNSDomainForwardersNode : public CCathegoryFolderNode { public: CDNSDomainForwardersNode(); virtual BOOL OnEnumerate(CComponentDataObject* pComponentData, BOOL bAsync = TRUE); }; ///////////////////////////////////////////////////////////////////////// // CDNSAuthoritatedZonesNode // // * contains autoritated zones, both primary and secondary // * have one for FWD and one for REVERSE class CDNSAuthoritatedZonesNode : public CCathegoryFolderNode { public: CDNSAuthoritatedZonesNode(BOOL bReverse, UINT nStringID); BOOL IsReverse() { return m_bReverse;} virtual HRESULT OnCommand(long nCommandID, DATA_OBJECT_TYPES type, CComponentDataObject* pComponentData, CNodeList* pNodeList); virtual BOOL OnSetRefreshVerbState(DATA_OBJECT_TYPES type, BOOL* pbHide, CNodeList* pNodeList); virtual HRESULT OnSetToolbarVerbState(IToolbar* pToolbar, CNodeList* pNodeList); virtual BOOL CanExpandSync() { return TRUE; } protected: virtual LPCONTEXTMENUITEM2 OnGetContextMenuItemTable() { return CDNSAuthoritatedZonesMenuHolder::GetContextMenuItem(); } virtual BOOL OnAddMenuItem(LPCONTEXTMENUITEM2 pContextMenuItem2, long *pInsertionAllowed); private: // command handlers HRESULT OnNewZone(CComponentDataObject* pComponentData, CNodeList* pNodeList); // data BOOL m_bReverse; DECLARE_TOOLBAR_MAP() }; ///////////////////////////////////////////////////////////////////////// // CDNSForwardZonesNode class CDNSForwardZonesNode : public CDNSAuthoritatedZonesNode { public: CDNSForwardZonesNode(); virtual HRESULT OnShow(LPCONSOLE lpConsole); virtual HRESULT GetResultViewType(CComponentDataObject* pComponentData, LPOLESTR *ppViewType, long *pViewOptions); }; ///////////////////////////////////////////////////////////////////////// // CDNSReverseZonesNode class CDNSReverseZonesNode : public CDNSAuthoritatedZonesNode { public: CDNSReverseZonesNode(); virtual BOOL OnRefresh(CComponentDataObject* pComponentData, CNodeList* pNodeList); protected: virtual void OnHaveData(CObjBase* pObj, CComponentDataObject* pComponentDataObject); void ChangeViewOption(BOOL bAdvanced, CComponentDataObject* pComponentDataObject); virtual HRESULT OnShow(LPCONSOLE lpConsole); virtual HRESULT GetResultViewType(CComponentDataObject* pComponentData, LPOLESTR *ppViewType, long *pViewOptions); private: // cached pointers to autocreated zones CDNSZoneNode* m_p0ZoneNode; CDNSZoneNode* m_p127ZoneNode; CDNSZoneNode* m_p255ZoneNode; friend class CDNSServerNode; }; ///////////////////////////////////////////////////////////////////////// // CDNSServerTestOptions class CDNSServerTestOptions { public: CDNSServerTestOptions(); HRESULT Save(IStream* pStm); HRESULT Load(IStream* pStm); const CDNSServerTestOptions& operator=(const CDNSServerTestOptions& x); BOOL operator==(const CDNSServerTestOptions& x) const; BOOL m_bEnabled; // polling enabled DWORD m_dwInterval; // seconds // query types BOOL m_bSimpleQuery; BOOL m_bRecursiveQuery; }; //////////////////////////////////////////////////////////////////////// // CDNSServerTestQueryResult class CDNSServerTestQueryResult { public: CDNSServerTestQueryResult() { memset(this, 0x0, sizeof(CDNSServerTestQueryResult));} const CDNSServerTestQueryResult& operator=(const CDNSServerTestQueryResult& x) { memcpy(this, &x, sizeof(CDNSServerTestQueryResult)); return *this; } BOOL operator==(const CDNSServerTestQueryResult& x) { ASSERT(m_serverCookie == x.m_serverCookie); // always compare the same server // we do not compare the time // we do not compare the force logging flag // we want just to compare the query flags and the results return (m_dwQueryFlags == x.m_dwQueryFlags) && (m_dwAddressResolutionResult == x.m_dwAddressResolutionResult) && (m_dwPlainQueryResult == x.m_dwPlainQueryResult) && (m_dwRecursiveQueryResult == x.m_dwRecursiveQueryResult); } BOOL Succeded() { return (m_dwAddressResolutionResult == 0) && (m_dwPlainQueryResult == 0) && (m_dwRecursiveQueryResult == 0); } static DWORD Pack(BOOL bPlainQuery, BOOL bRecursiveQuery) { DWORD dw = 0; if (bPlainQuery) dw |= 0x1; if (bRecursiveQuery) dw |= 0x2; return dw; } static void Unpack(DWORD dwQueryFlags, BOOL* pbPlainQuery, BOOL* pbRecursiveQuery) { *pbPlainQuery = (dwQueryFlags & 0x1); *pbRecursiveQuery = (dwQueryFlags & 0x2); } // Data MMC_COOKIE m_serverCookie; BOOL m_bAsyncQuery; SYSTEMTIME m_queryTime; DWORD m_dwQueryFlags; DWORD m_dwAddressResolutionResult; DWORD m_dwPlainQueryResult; DWORD m_dwRecursiveQueryResult; }; //////////////////////////////////////////////////////////////////////// // CDNSServerTestQueryResultList class CDNSServerTestQueryResultList : public CList< CDNSServerTestQueryResult*, CDNSServerTestQueryResult* > { public: typedef enum addAction { none = 0, changed, added, addedAndRemoved}; CDNSServerTestQueryResultList() { m_nMaxCount = 50; ExceptionPropagatingInitializeCriticalSection(&m_cs); } ~CDNSServerTestQueryResultList() { while (!IsEmpty()) delete RemoveHead(); ::DeleteCriticalSection(&m_cs); } public: void Lock() { ::EnterCriticalSection(&m_cs); } void Unlock() { ::LeaveCriticalSection(&m_cs); } addAction AddTestQueryResult(CDNSServerTestQueryResult* pTestResult) { addAction action = none; Lock(); // determine if we have to add INT_PTR nCount = GetCount(); CDNSServerTestQueryResult* pLastQueryResult = NULL; if (nCount > 0) pLastQueryResult = GetHead(); if ((pTestResult->m_bAsyncQuery) || (pLastQueryResult == NULL) || !(*pLastQueryResult == *pTestResult)) { // make sure we do not have too many items BOOL bRemoveLast = nCount > m_nMaxCount; if (bRemoveLast) { delete RemoveTail(); } // add the item AddHead(pTestResult); action = bRemoveLast ? addedAndRemoved : added; } else { // just just update the time stamp in the last message we have ASSERT(pLastQueryResult != NULL); memcpy(&(pLastQueryResult->m_queryTime), &(pTestResult->m_queryTime), sizeof(SYSTEMTIME)); action = changed; delete pTestResult; // not added } Unlock(); return action; } BOOL LastQuerySuceeded() { BOOL bRes = TRUE; Lock(); if (GetCount() > 0) bRes = GetHead()->Succeded(); Unlock(); return bRes; } int GetMaxCount() { return m_nMaxCount; } private: CRITICAL_SECTION m_cs; int m_nMaxCount; }; ///////////////////////////////////////////////////////////////////////// // CDNSServerNode class CDNSServerQueryObj : public CDNSQueryObj { public: CDNSServerQueryObj(BOOL bAdvancedView, DWORD dwServerVersion) : CDNSQueryObj(bAdvancedView, dwServerVersion){} virtual BOOL Enumerate(); private: }; class CDNSServerNode : public CDNSMTContainerNode { public: CDNSServerNode(LPCTSTR lpszName, BOOL bIsLocalServer = FALSE); virtual ~CDNSServerNode(); virtual void SetDisplayName(LPCWSTR lpszDisplayName); void SetLocalServer(BOOL bLocalServer) { m_bLocalServer = bLocalServer; } BOOL IsLocalServer() { return m_bLocalServer; } // node info DECLARE_NODE_GUID() virtual HRESULT GetDataHere(CLIPFORMAT cf, LPSTGMEDIUM lpMedium, CDataObject* pDataObject); virtual HRESULT GetData(CLIPFORMAT cf, LPSTGMEDIUM lpMedium, CDataObject* pDataObject); HRESULT RetrieveEventViewerLogs(LPSTGMEDIUM lpMedium, CDataObject* pDataObject); virtual CColumnSet* GetColumnSet() { if (m_pColumnSet == NULL) { CDNSRootData* pRoot = (CDNSRootData*)GetRootContainer(); m_pColumnSet = ((CDNSComponentDataObjectBase*)pRoot->GetComponentDataObject())->GetColumnSet(L"---Server Column Set---"); } return m_pColumnSet; } virtual HRESULT OnCommand(long nCommandID, DATA_OBJECT_TYPES type, CComponentDataObject* pComponentData, CNodeList* pNodeList); virtual void OnDelete(CComponentDataObject* pComponentData, CNodeList* pNodeList); virtual BOOL OnRefresh(CComponentDataObject* pComponentData, CNodeList* pNodeList); virtual LPCWSTR GetString(int nCol) { return (nCol == 0) ? GetDisplayName() : g_lpszNullString; } virtual int GetImageIndex(BOOL bOpenImage); virtual BOOL HasPropertyPages(DATA_OBJECT_TYPES type, BOOL* pbHideVerb, CNodeList* pNodeList); virtual HRESULT CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, CNodeList* pNodeList); virtual void DecrementSheetLockCount(); virtual BOOL CanExpandSync() { return FALSE; } protected: virtual LPCONTEXTMENUITEM2 OnGetContextMenuItemTable() { return CDNSServerMenuHolder::GetContextMenuItem(); } virtual BOOL OnAddMenuItem(LPCONTEXTMENUITEM2 pContextMenuItem2, long *pInsertionAllowed); virtual BOOL OnSetDeleteVerbState(DATA_OBJECT_TYPES type, BOOL* pbHide, CNodeList* pNodeList); virtual BOOL OnSetRefreshVerbState(DATA_OBJECT_TYPES type, BOOL* pbHide, CNodeList* pNodeList); virtual HRESULT OnSetToolbarVerbState(IToolbar* pToolbar, CNodeList* pNodeList); virtual HRESULT GetResultViewType(CComponentDataObject* pComponentData, LPOLESTR *ppViewType, long *pViewOptions); virtual HRESULT OnShow(LPCONSOLE lpConsole); virtual CQueryObj* OnCreateQuery(); virtual void OnHaveData(CObjBase* pObj, CComponentDataObject* pComponentDataObject); #ifdef USE_NDNC BOOL ContainsDefaultNDNCs(); #endif virtual void SetRecordAging(); virtual void ScavengeRecords(); private: // folders mainipulation //CCathegoryFolderNode* GetCathegoryFolder(CCathegoryFolderQueryObj::queryType type); CDNSAuthoritatedZonesNode* GetAuthoritatedZoneFolder(BOOL bFwd); // command handlers HRESULT OnNewZone(CComponentDataObject* pComponentData, CNodeList* pNodeList); void OnUpdateDataFiles(CComponentDataObject* pComponentData); void OnClearCache(CComponentDataObject* pComponentData); void OnConfigureServer(CComponentDataObject* pComponentData); #ifdef USE_NDNC void OnCreateNDNC(); #endif public: void ChangeViewOption(BOOL bAdvanced, CComponentDataObject* pComponentData); // serialization from/to stream static HRESULT CreateFromStream(IStream* pStm, CDNSServerNode** ppServerNode); HRESULT SaveToStream(IStream* pStm); // DNS specific helpers #ifdef USE_NDNC DNS_STATUS CreatePrimaryZone(LPCTSTR lpszName, LPCTSTR lpszFileName, BOOL bLoadExisting, BOOL bFwd, BOOL bDSIntegrated, UINT nDynamicUpdate, CComponentDataObject* pComponentData, ReplicationType replType, PCWSTR pszPartitionName); DNS_STATUS CreateStubZone(LPCTSTR lpszName, LPCTSTR lpszFileName, BOOL bLoadExisting, BOOL bDSIntegrated, BOOL bFwd, DWORD* ipMastersArray, int nIPMastersCount, BOOL bLocalListOfMasters, CComponentDataObject* pComponentData, ReplicationType replType, PCWSTR pszPartitionName); #else DNS_STATUS CreatePrimaryZone(LPCTSTR lpszName, LPCTSTR lpszFileName, BOOL bLoadExisting, BOOL bFwd, BOOL bDSIntegrated, UINT nDynamicUpdate, CComponentDataObject* pComponentData); DNS_STATUS CreateStubZone(LPCTSTR lpszName, LPCTSTR lpszFileName, BOOL bLoadExisting, BOOL bDSIntegrated, BOOL bFwd, DWORD* ipMastersArray, int nIPMastersCount, BOOL bLocalListOfMasters, CComponentDataObject* pComponentData); #endif // USE_NDNC DNS_STATUS CreateSecondaryZone(LPCTSTR lpszName, LPCTSTR lpszFileName, BOOL bLoadExisting, BOOL bFwd, DWORD* ipMastersArray, int nIPMastersCount, CComponentDataObject* pComponentData); DNS_STATUS CreateForwarderZone(LPCTSTR lpszName, DWORD* ipMastersArray, int nIPMastersCount, DWORD dwTimeout, DWORD fSlave, CComponentDataObject* pComponentData); DNS_STATUS EnumZoneInfo(CZoneInfoHolder* pZoneInfoHolder); static DNS_STATUS EnumZoneInfo(LPCTSTR lpszServerName, CZoneInfoHolder* pZoneInfoHolder); DNS_STATUS ClearCache(); // name used for RPC calls LPCWSTR GetRPCName(); // server info access functions BOOL HasServerInfo() { ASSERT(m_pServInfoEx != NULL); return m_pServInfoEx->HasData();} void AttachServerInfo(CDNSServerInfoEx* pNewInfo); BOOL CanUseADS(); DWORD GetVersion(); BYTE GetMajorVersion(){ return DNS_SRV_MAJOR_VERSION(GetVersion());} BYTE GetMinorVersion(){ return DNS_SRV_MINOR_VERSION(GetVersion());} WORD GetBuildNumber() { return DNS_SRV_BUILD_NUMBER(GetVersion());} void CreateDsServerLdapPath(CString& sz); void CreateDsZoneLdapPath(CDNSZoneNode* pZoneNode, CString& sz); void CreateDsZoneName(CDNSZoneNode* pZoneNode, CString& sz); void CreateDsNodeLdapPath(CDNSZoneNode* pZoneNode, CDNSDomainNode* pDomainNode, CString& sz); void CreateLdapPathFromX500Name(LPCWSTR lpszX500Name, CString& szLdapPath); // // Server property accessors // DWORD GetNameCheckFlag(); DNS_STATUS ResetNameCheckFlag(DWORD dwNameCheckFlag); DWORD GetLogLevelFlag(); DNS_STATUS ResetLogLevelFlag(DWORD dwLogLevel); DWORD GetEventLogLevelFlag(); DNS_STATUS ResetEventLogLevelFlag(DWORD dwEventLogLevel); PIP_ARRAY GetDebugLogFilterList(); DNS_STATUS ResetDebugLogFilterList(PIP_ARRAY pIPArray); PCWSTR GetDebugLogFileName(); DNS_STATUS ResetDebugLogFileName(PCWSTR pszLogFileName); DWORD GetDebugLogFileMaxSize(); DNS_STATUS ResetDebugLogFileMaxSize(DWORD dwMaxSize); BOOL DoesRecursion(); void GetAdvancedOptions(BOOL* bOptionsArray); DNS_STATUS ResetAdvancedOptions(BOOL* bOptionsArray, DNS_STATUS* dwRegKeyOptionsErrorArr); UCHAR GetBootMethod(); DNS_STATUS ResetBootMethod(UCHAR fBootMethod); BOOL IsServerConfigured(); DNS_STATUS SetServerConfigured(); BOOL GetScavengingState(); DWORD GetScavengingInterval(); DNS_STATUS ResetScavengingInterval(DWORD dwScavengingInterval); DWORD GetDefaultRefreshInterval(); DNS_STATUS ResetDefaultRefreshInterval(DWORD dwRefreshInterval); DWORD GetDefaultNoRefreshInterval(); DNS_STATUS ResetDefaultNoRefreshInterval(DWORD dwNoRefreshInterval); DWORD GetDefaultScavengingState(); DNS_STATUS ResetDefaultScavengingState(DWORD bScavengingState); #ifdef USE_NDNC PCSTR GetDomainName(); PCSTR GetForestName(); #endif DNS_STATUS ResetListenAddresses(DWORD cAddrCount, PIP_ADDRESS pipAddrs); void GetListenAddressesInfo(DWORD* pcAddrCount, PIP_ADDRESS* ppipAddrs); void GetServerAddressesInfo(DWORD* pcAddrCount, PIP_ADDRESS* ppipAddrs); DNS_STATUS ResetForwarders(DWORD cForwardersCount, PIP_ADDRESS pipForwarders, DWORD dwForwardTimeout, DWORD fSlave); void GetForwardersInfo(DWORD* pcForwardersCount, PIP_ADDRESS* ppipForwarders, DWORD* pdwForwardTimeout, DWORD* pfSlave); // Root Hints management API's BOOL HasRootHints() { return m_pRootHintsNode != NULL;} CDNSRootHintsNode* GetRootHints(); void AttachRootHints(CDNSRootHintsNode* pNewRootHints); // testing options void GetTestOptions(CDNSServerTestOptions* pOptions); void ResetTestOptions(CDNSServerTestOptions* pOptions); BOOL IsTestEnabled() { return m_testOptions.m_bEnabled;} DWORD GetTestInterval() { return m_testOptions.m_dwInterval;} BOOL IsTestSimpleQueryEnabled() { return m_testOptions.m_bSimpleQuery;} BOOL IsRecursiveQueryEnabled() { return m_testOptions.m_bRecursiveQuery;} // test result manipulation void AddTestQueryResult(CDNSServerTestQueryResult* pTestResult, CComponentDataObject* pComponentData); void SetProppageStart(int nStartPage) { m_nStartProppage = nStartPage; } CDNSDomainForwardersNode* GetDomainForwardersNode() { return m_pDomainForwardersFolderNode; } private: DNS_STATUS WriteDirtyZones(); CDNSZoneNode* GetNewZoneNode(); // server info manipulation CDNSServerInfoEx* m_pServInfoEx; void FreeServInfo(); // free memory DNS_STATUS GetServInfo(); // read info from server // root hints info CDNSRootHintsNode* m_pRootHintsNode; void FreeRootHints(); // server test query info CDNSServerTestOptions m_testOptions; DWORD m_dwTestTime; CDNSServerTestQueryResultList m_testResultList; BOOL m_bTestQueryPending; BOOL m_bShowMessages; BOOL m_bPrevQuerySuccess; int m_nStartProppage; BOOL m_bLocalServer; // cached pointer to cache folder CDNSCacheNode* m_pCacheFolderNode; CDNSForwardZonesNode* m_pFwdZonesFolderNode; CDNSReverseZonesNode* m_pRevZonesFolderNode; CDNSDomainForwardersNode* m_pDomainForwardersFolderNode; friend class CDNSRootData; friend class CDNSServer_TestPropertyPage; DECLARE_TOOLBAR_MAP() }; #endif // _SERVER_H