mirror of https://github.com/lianthony/NT4.0
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.
336 lines
10 KiB
336 lines
10 KiB
// ZONE.H
|
|
|
|
#define DNS_MAX_ENUM_ZONE_INFO 1000 // Arbitrary chosen
|
|
#define DNS_DEFAULT_TTL 3600
|
|
|
|
extern UINT cbDnsRpcBufferAlloc;
|
|
extern HINSTANCE hInstanceSave;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// RAWDATALINK
|
|
// Instead of downloading one record at the time, we allocate
|
|
// a large buffer and we try to fill as much as we can. Then,
|
|
// if there are still more record we allocate another one.
|
|
struct RAWDATALINK
|
|
{
|
|
RAWDATALINK * pNextBuffer;
|
|
BYTE rgbRawData[];
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// ADVANCED_DATA
|
|
// This is how we pass data to and from the 'Advanced...' dialog
|
|
// in the Wins and Wins Reverse Prop sheets.
|
|
struct ADVANCED_DATA
|
|
{
|
|
BOOL fForwardZone; //if FALSE, next item N/A
|
|
BOOL fUseNetbiosScope;
|
|
DWORD dwLookupTimeout;
|
|
DWORD dwCacheTimeout;
|
|
BOOL fDirty;
|
|
};
|
|
|
|
#define DEFAULT_LOOKUP_TIMEOUT 1 // 1 second
|
|
#define DEFAULT_CACHE_TIMEOUT 600 //10 minutes
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
class CDomainNode
|
|
{
|
|
friend class CZoneRootDomain;
|
|
friend class CZoneDomain;
|
|
friend class CDnsRpcRecord;
|
|
friend class CDlgZoneHelper;
|
|
friend class CZoneWiz;
|
|
friend class CRecordWiz;
|
|
friend class CResourceRecordDlgHandler;
|
|
friend class CServerList;
|
|
public:
|
|
enum
|
|
{
|
|
// What flags a children is allowed to inherit from its parent
|
|
mskfReadOnly = 0x00000001,
|
|
mskfReverseMode = 0x00000002,
|
|
mskfSecondaryZone = 0x00000004,
|
|
mskParentCopyFlags = 0x000000FF,
|
|
|
|
// For both CZoneRootDomain and CZoneDomain
|
|
mskfRpcDataValid = 0x00010000,
|
|
mskfConnecting = 0x00020000,
|
|
mskfConnectedOnce = 0x00040000,
|
|
mskfFailedToConnect = 0x00080000,
|
|
mskfServerUnavailable = 0x00100000,
|
|
mskfOutOfMemory = 0x00200000,
|
|
mskfRpcNotify = 0x00400000,
|
|
mskfGotFocus = 0x01000000,
|
|
mskfIsDirty = 0x02000000,
|
|
mskfHasChildren = 0x04000000,
|
|
|
|
// For CZoneRootDomain only
|
|
mskfIsZoneRootDomain = 0x10000000,
|
|
mskfZonePaused = 0x20000000,
|
|
mskfZoneInfoValid = 0x40000000,
|
|
mskfRefreshDone = 0x80000000,
|
|
};
|
|
|
|
protected:
|
|
DWORD m_dwFlags;
|
|
ITreeItem * m_pThisTreeItem; // Pointer to self as a TreeItem
|
|
CServer * m_pParentServer; // Server name. eg: "\\kernel"
|
|
const char * m_pszFullName; // Full name. eg: "dev.nt.microsoft.com"
|
|
RAWDATALINK * m_pDnsRawData; // Linked list of buffers to store the record data.
|
|
CDnsRpcRecord * m_pDRR; // Linked list of pointers to the raw data.
|
|
ADVANCED_DATA * m_padData; // data for advanced dialog
|
|
|
|
public:
|
|
~CDomainNode();
|
|
void InitDomainNode(CServer * pParent, const char pszFullName[]);
|
|
void RpcGetNodeRecords();
|
|
void FlushNodeRecords();
|
|
BYTE * PbAllocateRawNode(UINT cbNodeSize);
|
|
UINT RevIpAddrOrder(const char * pszInAddr, char * pszOutAddr);
|
|
CDnsRpcRecord * PRpcCreateDnsRecord(const char pszShortName[], const DNS_RPC_RECORD * pDnsRecord);
|
|
CZoneDomain * PCreateNewDomain(const char pszShortName[]);
|
|
CZoneRootDomain * PFindZoneRootDomainParent();
|
|
UINT IdsGetStatusPaneText(UINT ids = IDS_NONE);
|
|
|
|
// DNS API Support
|
|
inline const char * PchGetServerNameA() const
|
|
{
|
|
Assert(m_pParentServer != NULL);
|
|
return m_pParentServer->PchGetNameA();
|
|
}
|
|
inline const char * PchGetFullNameA() const
|
|
{
|
|
Assert(m_pszFullName != NULL);
|
|
Assert(strlen(m_pszFullName) < DNS_MAX_NAME_LENGTH);
|
|
return m_pszFullName;
|
|
}
|
|
|
|
// Debugging
|
|
#ifdef DEBUG
|
|
CDomainNode() { GarbageInit(this, sizeof(*this)); }
|
|
void AssertNodeValid(UINT uFlags = AV_mskfCheckTypical) const;
|
|
#endif
|
|
|
|
}; // CDomainNode
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDnsRpcRecord
|
|
//
|
|
// All variables are READ ONLY.
|
|
// The parent object CDomainNode is responsible of storing and freeing the data.
|
|
//
|
|
class CDnsRpcRecord
|
|
{
|
|
public:
|
|
enum { cbDNS_RPC_RECORD_MAX = 600 }; // Maximum number of bytes a record can have
|
|
|
|
public:
|
|
const DNS_RPC_RECORD * m_pDnsRecord; // Pointer to the record data own by parent
|
|
CDomainNode * m_pParentDomain; // Parent of the record
|
|
CDnsRpcRecord * m_pNextRecord; // Next sibling
|
|
const TCHAR * m_pszRecordType; // Name of the record type (for speed for sorting and paintind)
|
|
const char * m_pszShortName; // Typically data inside a CDomainNode object
|
|
|
|
public:
|
|
CDnsRpcRecord(CDomainNode * pParentDomain, const DNS_RPC_RECORD * pDnsRecord, const char pszShortName[]);
|
|
void Attach(CDomainNode * pParentDomain);
|
|
void Detach();
|
|
void GetFullNameA(OUT char szFullName[], UINT cchBuffer) const;
|
|
|
|
// For sorting
|
|
// Get the data of the item (for sorting)
|
|
const char * PchGetSzData(INOUT char * pszInOutBuffer) const;
|
|
inline int CompareName(const CDnsRpcRecord * pDRR) const
|
|
{
|
|
Assert(pDRR != NULL);
|
|
Assert(pDRR->m_pszShortName != NULL);
|
|
Assert(m_pszShortName != NULL);
|
|
return _strcmpi(
|
|
m_pszShortName[0] ? m_pszShortName : m_pParentDomain->PchGetFullNameA(),
|
|
pDRR->m_pszShortName[0] ? pDRR->m_pszShortName : pDRR->m_pParentDomain->PchGetFullNameA());
|
|
}
|
|
|
|
inline int CompareType(const CDnsRpcRecord * pDRR) const
|
|
{
|
|
Assert(pDRR != NULL);
|
|
Assert(pDRR->m_pszRecordType != NULL);
|
|
Assert(m_pszRecordType != NULL);
|
|
return lstrcmp(m_pszRecordType, pDRR->m_pszRecordType);
|
|
}
|
|
|
|
inline int CompareData(const CDnsRpcRecord * pDRR) const
|
|
{
|
|
char szData1[260];
|
|
char szData2[260];
|
|
return _strcmpi(PchGetSzData(INOUT szData1), pDRR->PchGetSzData(INOUT szData2));
|
|
}
|
|
|
|
// RPC Stuff
|
|
BOOL FRpcSetRecordData(const DNS_RPC_RECORD * pDnsRecord);
|
|
void RpcDeleteRecord();
|
|
|
|
void DlgProperties();
|
|
static void DlgNewRecord(CDomainNode * pParentDomain);
|
|
static void DrawItem(DRAWITEMSTRUCT * pDIS);
|
|
|
|
}; // CDnsRpcRecord
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
class CZoneRootDomain : public ITreeItem, public CDomainNode
|
|
{
|
|
public:
|
|
static const char * s_szNameNull; // Empty name for ZoneRootDomain records
|
|
// Zone information
|
|
DNS_ZONE_INFO * m_pZoneInfo;
|
|
// Read ONLY pointers (do not delete them)
|
|
const CDnsRpcRecord * m_pSOA;
|
|
const CDnsRpcRecord * m_pWINS;
|
|
const CDnsRpcRecord * m_pNBSTAT;
|
|
|
|
public:
|
|
CZoneRootDomain(CServer * pParent, DNS_ZONE_INFO * pZoneInfo);
|
|
~CZoneRootDomain();
|
|
|
|
IID QueryInterface() const;
|
|
void OnSetFocus();
|
|
void OnKillFocus();
|
|
void OnLButtonClick(POINT * pptMouse);
|
|
void OnLButtonDblClk(POINT * pptMouse);
|
|
void OnRButtonClick(POINT * pptMouse);
|
|
void OnUpdateMenuUI(HMENU hmenu);
|
|
LONG OnUpdateMenuSelect(INOUT MENUSELECTINFO * pMSI);
|
|
BOOL FOnMenuCommand(UINT wCmdId);
|
|
|
|
void Attach(CServer * pParent);
|
|
void Detach();
|
|
void Refresh();
|
|
void UpdateUI();
|
|
|
|
void DlgProperties(CDnsRpcRecord * pDRR = NULL);
|
|
#ifdef DEBUG
|
|
void AssertValid(UINT uFlags = AV_mskfCheckTypical) const;
|
|
#endif // DEBUG
|
|
|
|
private:
|
|
// RPC Interface
|
|
void RpcPauseZone(); // Pause the zone
|
|
void RpcResumeZone(); // Resume zone
|
|
void RpcDeleteZone(); // Delete the zone from the server
|
|
|
|
private:
|
|
void SetZoneInfo(DNS_ZONE_INFO * pZoneInfo);
|
|
|
|
protected:
|
|
// Dialog/PropertySheet Interface
|
|
static CZoneRootDomain * s_pThis;
|
|
static BOOL CALLBACK DlgProcPropGeneral(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
static BOOL CALLBACK DlgProcPropSecondaries(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
static BOOL CALLBACK DlgProcPropAdvanced(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
static BOOL CALLBACK DlgProcPropSoaRecord(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
static BOOL CALLBACK DlgProcPropWinsResolution(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
static BOOL CALLBACK DlgProcPropWinsRevResolution(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
static BOOL CALLBACK DlgProcPropNbStat(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
}; // CZoneRootDomain
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
class CZoneDomain : public ITreeItem, public CDomainNode
|
|
{
|
|
public:
|
|
|
|
public:
|
|
CZoneDomain(ITreeItem * pParent, const char pszFullName[]);
|
|
~CZoneDomain();
|
|
|
|
IID QueryInterface() const;
|
|
void OnSetFocus();
|
|
void OnKillFocus();
|
|
void OnLButtonClick(POINT * pptMouse);
|
|
void OnLButtonDblClk(POINT * pptMouse);
|
|
void OnRButtonClick(POINT * pptMouse);
|
|
void OnUpdateMenuUI(HMENU hmenu);
|
|
LONG OnUpdateMenuSelect(INOUT MENUSELECTINFO * pMSI);
|
|
BOOL FOnMenuCommand(UINT wCmdId);
|
|
|
|
void Attach(ITreeItem * pParent);
|
|
void Detach();
|
|
void Refresh();
|
|
void UpdateUI();
|
|
|
|
protected:
|
|
void RpcDeleteNode();
|
|
static BOOL CALLBACK DlgProcDeleteNode(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
public:
|
|
#ifdef DEBUG
|
|
void AssertValid(UINT uFlags = AV_mskfCheckTypical) const;
|
|
#endif // DEBUG
|
|
|
|
}; // CZoneDomain
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Create New Zone Wizard
|
|
class CZoneWiz
|
|
{
|
|
public:
|
|
enum { cchZoneNameMax = 256 };
|
|
enum { cchDatabaseNameMax = 256 };
|
|
enum { dwWizButtonsNil = -1 };
|
|
|
|
protected:
|
|
// Data to create new zone
|
|
CServer * m_pParentServer;
|
|
|
|
// Drag & drop support
|
|
BOOL m_fDragMode;
|
|
RECT m_rcDialog;
|
|
RECT m_rcTreeView;
|
|
RECT m_rcTreeItem;
|
|
HTREEITEM m_htiOld;
|
|
HWND m_hwndEditServerInit;
|
|
HWND m_hwndEditZoneInit;
|
|
CZoneRootDomain * m_pZoneRootDomainInit;
|
|
const DNS_RPC_RECORD * m_pSOAInit;
|
|
// int m_cIpAddressInit;
|
|
// const IP_ADDRESS * m_paIpAddressInit;
|
|
|
|
// New Zone Data
|
|
char m_szZoneName[cchZoneNameMax];
|
|
char m_szDatabaseName[cchDatabaseNameMax];
|
|
DWORD m_dwZoneType; // Type of zone (Primary | Secondary)
|
|
IP_ADDRESS * m_adwIpAddress; // Array of IP Masters
|
|
DWORD m_cIpAddress; // Number of IP Masters
|
|
BYTE m_rgbSOA[600]; // SOA record
|
|
BOOL m_fSOADataValid; // is SOA record good?
|
|
// Other runtime variables for wizard
|
|
HWND m_hwndWiz; // Window handle of the Wizard
|
|
HWND m_hwndDragFinger; // Window handle of the icon to drag
|
|
HWND m_hwndEditZoneName; // Name of the zone
|
|
HWND m_hwndEditDatabaseName; // Name of the database
|
|
HWND m_hwndIpList; // Handle of the IP Master list
|
|
BOOL m_fNoEchoToDatabase; // Do not echo the zone name as the database filename
|
|
DWORD m_dwWizButtonsPrev; // Previous state of the buttons
|
|
|
|
public:
|
|
void DoWizard(CServer * pParent);
|
|
|
|
protected:
|
|
void SetWizButtons(DWORD dwWizButtons);
|
|
BOOL RpcCreateZone();
|
|
|
|
protected:
|
|
// Used for wizard procs
|
|
static CZoneWiz * s_pThis;
|
|
static BOOL CALLBACK DlgProcWiz0(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
static BOOL CALLBACK DlgProcWiz1(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
static BOOL CALLBACK DlgProcWiz2(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
static BOOL CALLBACK DlgProcWiz3(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
static BOOL CALLBACK DlgProcWiz4(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
}; // CZoneWiz
|
|
|
|
|
|
|