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.
349 lines
12 KiB
349 lines
12 KiB
// RRECORD.H
|
|
|
|
|
|
#define DNS_RECORDTYPE_GENERIC 0x00 // 0
|
|
#define DNS_RECORDTYPE_A 0x01 // 1
|
|
#define DNS_RECORDTYPE_NS 0x02 // 2
|
|
#define DNS_RECORDTYPE_MD 0x03 // 3
|
|
#define DNS_RECORDTYPE_MF 0x04 // 4
|
|
#define DNS_RECORDTYPE_CNAME 0x05 // 5
|
|
#define DNS_RECORDTYPE_SOA 0x06 // 6
|
|
#define DNS_RECORDTYPE_MB 0x07 // 7
|
|
#define DNS_RECORDTYPE_MG 0x08 // 8
|
|
#define DNS_RECORDTYPE_MR 0x09 // 9
|
|
#define DNS_RECORDTYPE_NULL 0x0a // 10
|
|
#define DNS_RECORDTYPE_WKS 0x0b // 11
|
|
#define DNS_RECORDTYPE_PTR 0x0c // 12
|
|
#define DNS_RECORDTYPE_HINFO 0x0d // 13
|
|
#define DNS_RECORDTYPE_MINFO 0x0e // 14
|
|
#define DNS_RECORDTYPE_MX 0x0f // 15
|
|
#define DNS_RECORDTYPE_TXT 0x10 // 16
|
|
#define DNS_RECORDTYPE_RP 0x11 // 17
|
|
#define DNS_RECORDTYPE_AFSDB 0x12 // 18
|
|
#define DNS_RECORDTYPE_X25 0x13 // 19
|
|
#define DNS_RECORDTYPE_ISDN 0x14 // 20
|
|
#define DNS_RECORDTYPE_RT 0x15 // 21
|
|
|
|
#define DNS_RECORDTYPE_NSAP 0x16 // 22
|
|
#define DNS_RECORDTYPE_NSAPPTR 0x17 // 23
|
|
#define DNS_RECORDTYPE_SIG 0x18 // 24
|
|
#define DNS_RECORDTYPE_KEY 0x19 // 25
|
|
#define DNS_RECORDTYPE_PX 0x1a // 26
|
|
#define DNS_RECORDTYPE_GPOS 0x1b // 27
|
|
|
|
#define DNS_RECORDTYPE_AAAA 0x1c // 28
|
|
|
|
#define DNS_RECORDTYPE_IXFR 0xfb // 251
|
|
#define DNS_RECORDTYPE_AXFR 0xfc // 252
|
|
#define DNS_RECORDTYPE_MAILB 0xfd // 253
|
|
#define DNS_RECORDTYPE_MAILA 0xfe // 254
|
|
#define DNS_RECORDTYPE_ALL 0xff // 255
|
|
|
|
#define DNS_RECORDTYPE_WINS DNS_TYPE_WINS
|
|
#define DNS_RECORDTYPE_NBSTAT DNS_TYPE_NBSTAT
|
|
|
|
typedef WORD WRRT;
|
|
typedef WORD IRRT;
|
|
|
|
// Hungarian notation (also used in string table)
|
|
// RRT - Resource Record Type
|
|
// RRD - Resource Record Description
|
|
// RRN - Resource Record Name
|
|
// RRH - Resource Record Help
|
|
//
|
|
// iRRT - Index of a resource type
|
|
// wRRT - Value of a resource type
|
|
//
|
|
|
|
#define iRRT_Generic 0
|
|
#define iRRT_A 1
|
|
#define iRRT_NS 2
|
|
#define iRRT_MD 3
|
|
#define iRRT_MF 4
|
|
#define iRRT_CNAME 5
|
|
#define iRRT_SOA 6
|
|
#define iRRT_MB 7
|
|
#define iRRT_MG 8
|
|
#define iRRT_MR 9
|
|
#define iRRT_NULL 10
|
|
#define iRRT_WKS 11
|
|
#define iRRT_PTR 12
|
|
#define iRRT_HINFO 13
|
|
#define iRRT_MINFO 14
|
|
#define iRRT_MX 15
|
|
#define iRRT_TXT 16
|
|
#define iRRT_RP 17
|
|
#define iRRT_AFSDB 18
|
|
#define iRRT_X25 19
|
|
#define iRRT_ISDN 20
|
|
#define iRRT_RT 21
|
|
#define iRRT_NSAP 22
|
|
#define iRRT_NSAPPTR 23
|
|
#define iRRT_SIG 24
|
|
#define iRRT_KEY 25
|
|
#define iRRT_PX 26
|
|
#define iRRT_GPOS 27
|
|
#define iRRT_AAAA 28
|
|
#define iRRT_1To1Last 28 // Last index where a wRRT == iRRT
|
|
|
|
#define iRRT_IXFR 29
|
|
#define iRRT_AXFR 30
|
|
#define iRRT_MAILB 31
|
|
#define iRRT_MAILA 32
|
|
|
|
#define iRRT_WINS 33
|
|
#define iRRT_NBSTAT 34
|
|
|
|
#define iRRT_Last 34 // Last know resource record
|
|
#define iRRT_Max (iRRT_Last+1) // Maximum resource record
|
|
#define iRRT_Nil 0xFFFF // Invalid resource record
|
|
|
|
|
|
|
|
#define RRT_mskfHasShortName 0x0001
|
|
#define RRT_mskfShowEdit0 0x0002
|
|
#define RRT_mskfShowEdit1 0x0004
|
|
#define RRT_mskfShowEdit2 0x0008
|
|
#define RRT_mskfShowEdit3 0x0800
|
|
#define RRT_mskfShowIpEdit1 0x0010
|
|
#define RRT_mskfShowIpEdit2 0x0020
|
|
#define RRT_mskfShowButtons 0x1000
|
|
#define RRT_mskfShrinkEdit1 0x0040
|
|
#define RRT_mskfShrinkEdit2 0x0080
|
|
#define RRT_mskfShrinkEdit3 0x2000
|
|
#define RRT_mskfNoHelp 0x0100 // Record has a no help and/or description
|
|
#define RRT_mskfNoAutoPrefix 0x0200
|
|
#define RRT_mskfHasForPrefix 0x0400
|
|
|
|
#define RRT_mskfIsSameKindOf 0x8000
|
|
#define RRT_mskSameKindOf 0x00FF
|
|
|
|
|
|
#define SHORT_STRING_LEN 10
|
|
#define IP_ADDR_LEN 16
|
|
|
|
struct RRT_INFO
|
|
{
|
|
WRRT wType; // Resource Type
|
|
WORD wIdString; // String IDs (wIdListBox, wIdName1, wIdHelp1, wIdName2, wIdHelp2)
|
|
WORD wFlags; // Control Flags
|
|
WORD wUnused; // Unused yet
|
|
};
|
|
|
|
// Resource Record Type Flags
|
|
const RRT_INFO rgRRTInfo[iRRT_Max] =
|
|
{
|
|
{ DNS_RECORDTYPE_GENERIC, IDS_RRD_GENERIC,
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 | RRT_mskfShowEdit2 | RRT_mskfShrinkEdit1, 0 },
|
|
{ DNS_RECORDTYPE_A, IDS_RRD_ADDRESS, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 | RRT_mskfShowIpEdit2 | RRT_mskfHasShortName, 0 },
|
|
{ DNS_RECORDTYPE_NS, IDS_RRD_NS, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 | RRT_mskfNoHelp, 0 },
|
|
{ DNS_RECORDTYPE_MD, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_MF, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_CNAME, IDS_RRD_CNAME,
|
|
RRT_mskfNoAutoPrefix | RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowEdit2 | RRT_mskfHasShortName },
|
|
{ DNS_RECORDTYPE_SOA, IDS_RRD_SOA,
|
|
RRT_mskfNoAutoPrefix | RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowEdit2},
|
|
{ DNS_RECORDTYPE_MB, IDS_RRD_MB, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowEdit2 | RRT_mskfHasShortName},
|
|
{ DNS_RECORDTYPE_MG, IDS_RRD_MG, RRT_mskfNoAutoPrefix | RRT_mskfShowEdit0 | RRT_mskfShowEdit1},
|
|
{ DNS_RECORDTYPE_MR, IDS_RRD_MR, RRT_mskfNoAutoPrefix | RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowEdit2 | RRT_mskfHasShortName},
|
|
{ DNS_RECORDTYPE_NULL, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_WKS, IDS_RRD_WKS,RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowIpEdit2 | RRT_mskfShowEdit3 | RRT_mskfShowButtons |
|
|
RRT_mskfHasShortName },
|
|
{ DNS_RECORDTYPE_PTR, IDS_RRD_PTR,
|
|
RRT_mskfNoAutoPrefix | RRT_mskfShowIpEdit1 | RRT_mskfShowEdit1 },
|
|
{ DNS_RECORDTYPE_HINFO, IDS_RRD_HINFO, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowEdit2 | RRT_mskfShowEdit3 | RRT_mskfHasShortName },
|
|
{ DNS_RECORDTYPE_MINFO, IDS_RRD_MINFO, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowEdit2 | RRT_mskfShowEdit3 | RRT_mskfHasShortName },
|
|
{ DNS_RECORDTYPE_MX, IDS_RRD_MX, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowEdit2 | RRT_mskfShowEdit3 | RRT_mskfShrinkEdit3 | RRT_mskfHasShortName, 0 },
|
|
{ DNS_RECORDTYPE_TXT, IDS_RRD_TXT, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 | RRT_mskfShowEdit2 | RRT_mskfHasShortName, 0 },
|
|
{ DNS_RECORDTYPE_RP, IDS_RRD_RP, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowEdit2 | RRT_mskfShowEdit3 | RRT_mskfHasShortName },
|
|
{ DNS_RECORDTYPE_AFSDB, IDS_RRD_AFSDB, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowEdit2 | RRT_mskfShowButtons |
|
|
RRT_mskfHasShortName },
|
|
{ DNS_RECORDTYPE_X25, IDS_RRD_X25, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowEdit2 | RRT_mskfHasShortName},
|
|
{ DNS_RECORDTYPE_ISDN, IDS_RRD_ISDN, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowEdit2 | RRT_mskfShowEdit3 | RRT_mskfHasShortName },
|
|
{ DNS_RECORDTYPE_RT, IDS_RRD_RT, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 |
|
|
RRT_mskfShowEdit2 | RRT_mskfShowEdit3 | RRT_mskfHasShortName },
|
|
{ DNS_RECORDTYPE_NSAP, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_NSAPPTR, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_SIG, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_KEY, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_PX, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_GPOS, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_AAAA, IDS_RRD_AAAA, RRT_mskfNoAutoPrefix |
|
|
RRT_mskfShowEdit0 | RRT_mskfShowEdit1 | RRT_mskfShowEdit2 | RRT_mskfHasShortName, 0 },
|
|
{ DNS_RECORDTYPE_IXFR, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_AXFR, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_MAILB, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_MAILA, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_WINS, 0, 0, 0 },
|
|
{ DNS_RECORDTYPE_NBSTAT, 0, 0, 0 }
|
|
};
|
|
|
|
#ifdef DEBUG
|
|
void DbgPrintDnsRecord(DWORD dwTraceFlags, const DNS_RPC_RECORD * pDnsRecord);
|
|
#else
|
|
#define DbgPrintDnsRecord(dwTraceFlags, pDnsRecord)
|
|
#endif // ~DEBUG
|
|
|
|
// Array of pointers to the known resource type
|
|
extern LPTSTR rgszRRT_Names[];
|
|
// Buffer to hold IDS_RRT_S_RECORD
|
|
extern TCHAR szRecordTypeFmt[];
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
IRRT IrrtFromWrrt(WRRT wRRT);
|
|
|
|
inline WRRT WrrtFromIrrt(IRRT iRRT)
|
|
{
|
|
Assert(iRRT < iRRT_Max);
|
|
return rgRRTInfo[iRRT].wType;
|
|
} // WrrtFromIrrt
|
|
|
|
inline const TCHAR * const IRRT_PchGetName(IRRT iRRT)
|
|
{
|
|
Assert(iRRT < iRRT_Max);
|
|
return (const TCHAR *)rgszRRT_Names[iRRT];
|
|
} // IRRT_PchGetName
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
class CResourceRecordDlgHandler
|
|
{
|
|
friend class CRecordWiz;
|
|
|
|
protected:
|
|
// Initial values
|
|
HWND m_hdlg; // Handle of the dialog
|
|
HWND m_hwndList; // Handle of the resource type list
|
|
HWND m_hwndStatic0;
|
|
HWND m_hwndStatic1;
|
|
HWND m_hwndStatic2;
|
|
HWND m_hwndStatic3;
|
|
HWND m_hwndStatic4;
|
|
HWND m_hwndEdit0;
|
|
HWND m_hwndEdit1;
|
|
HWND m_hwndEdit2;
|
|
HWND m_hwndEdit3;
|
|
HWND m_hwndIpEdit1;
|
|
HWND m_hwndIpEdit2;
|
|
HWND m_hwndRadio1;
|
|
HWND m_hwndRadio2;
|
|
HWND m_hwndStaticTTL;
|
|
HWND m_hwndEditTTL;
|
|
HWND m_hwndSpinTTL;
|
|
HWND m_hwndComboTTL;
|
|
RECT m_rcEdit0;
|
|
RECT m_rcEdit1;
|
|
RECT m_rcEdit2;
|
|
RECT m_rcEdit3;
|
|
RECT m_rcStatic0;
|
|
RECT m_rcStatic1;
|
|
RECT m_rcStatic2;
|
|
RECT m_rcStatic3;
|
|
SIZE m_sizeStatic;
|
|
SIZE m_sizeEdit;
|
|
SIZE m_sizeIpEdit;
|
|
|
|
// User Init variables
|
|
CDnsRpcRecord * m_pCurrentDRR; // For "Record Properties" (existing record)
|
|
CDnsRpcRecord * m_pParentDRR; // For "New Record" from a RR
|
|
CDomainNode * m_pParentDomain; // For "New Record" from DomainNode
|
|
BOOL m_fHostParent; // "For Host" vs "For Domain"
|
|
char m_ipPTR_IpAddr[IP_ADDR_LEN]; // For PTR records.
|
|
|
|
// Volatile variables
|
|
BOOL m_fSkipBugInEditControl; // Well known windows bug in edit control
|
|
IRRT m_iRRT;
|
|
HWND m_hwndAutoFillPrev;
|
|
WORD m_wFlagsPrev;
|
|
UINT m_wIdStringDescriptionPrev;
|
|
|
|
public:
|
|
void OnInitDialog(HWND hdlg, IN const IRRT rgIrrtListBox[], IN const DNS_RPC_RECORD * pDnsRecordInit = NULL);
|
|
void InitRecordData(IN const DNS_RPC_RECORD * pDnsRecord);
|
|
void SetCurrentRecord(CDnsRpcRecord * pCurrentDRR, UINT idsCaptionExtra);
|
|
void SetParentDomain(CDnsRpcRecord * pParentDRR);
|
|
void SetParentDomain(CDomainNode * pParentDomain);
|
|
void OnUpdateControls();
|
|
BOOL FGetRecordData(OUT DNS_RPC_RECORD * pDnsRecordData, UINT cbBufferSize);
|
|
BOOL FIsRecordValid();
|
|
BOOL FIsRecordDirty();
|
|
BOOL FOnOK(); // When OK button is clicked
|
|
|
|
#ifdef DEBUG
|
|
BOOL m_fInit;
|
|
CResourceRecordDlgHandler() { Destroy(); }
|
|
void Destroy() { GarbageInit(this, sizeof(*this)); m_fInit = FALSE; }
|
|
#endif // DEBUG
|
|
|
|
}; // CResourceRecordDlgHandler
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRecordWiz
|
|
//
|
|
// Generic Wizard for creating resource records
|
|
class CRecordWiz
|
|
{
|
|
private:
|
|
CDomainNode * m_pParentDomain;
|
|
|
|
union
|
|
{
|
|
char m_szHostName[cchDnsNameMax]; // Host name
|
|
char m_szDomainName[cchDnsNameMax]; // Domain name
|
|
};
|
|
|
|
// NewDomain/NewHost dialog
|
|
UINT m_ids; // String Id
|
|
|
|
// NewRecord/RecordProperties
|
|
CDnsRpcRecord * m_pDRRCurrent;
|
|
BOOL m_fReadOnly;
|
|
BOOL m_fNewRecord;
|
|
const IRRT * m_pIrrtInit; // What RRTs to put in the listbox (May be null if m_pDnsRecordInit is not)
|
|
const DNS_RPC_RECORD * m_pDnsRecordInit; // Pointer to the record to initialize
|
|
|
|
public:
|
|
void DoNewRecord(CDomainNode * pParentDomain);
|
|
void DoNewRecord(CDnsRpcRecord * pDRRHost);
|
|
void DoNewHost(CDomainNode * pParentDomain);
|
|
void DoNewDomain(CDomainNode * pParentDomain);
|
|
void DoProperties(CDnsRpcRecord * pDRR);
|
|
|
|
protected:
|
|
static CRecordWiz * s_pThis;
|
|
static BOOL CALLBACK DlgProcNewDomain(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
static BOOL CALLBACK DlgProcRecordProperties(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
}; // CRecordWiz
|
|
|
|
|
|
// So far, we need only one handler at the time
|
|
extern CResourceRecordDlgHandler g_ResourceRecordDlgHandler;
|
|
|