📄 jwawindns.pas
字号:
{$EXTERNALSYM DNSREC_AUTHORITY}
DNSREC_ADDITIONAL = ($00000003);
{$EXTERNALSYM DNSREC_ADDITIONAL}
// RR Section in packet (update)
DNSREC_ZONE = ($00000000);
{$EXTERNALSYM DNSREC_ZONE}
DNSREC_PREREQ = ($00000001);
{$EXTERNALSYM DNSREC_PREREQ}
DNSREC_UPDATE = ($00000002);
{$EXTERNALSYM DNSREC_UPDATE}
// Delete RR (update) or No-exist (prerequisite)
DNSREC_DELETE = ($00000004);
{$EXTERNALSYM DNSREC_DELETE}
DNSREC_NOEXIST = ($00000004);
{$EXTERNALSYM DNSREC_NOEXIST}
//
// Record \ RR set structure
//
// Note: The dwReserved flag serves to insure that the substructures
// start on 64-bit boundaries. Do NOT pack this structure, as the
// substructures may contain pointers or int64 values which are
// properly aligned unpacked.
//
type
PDNS_RECORD = ^DNS_RECORD;
{$EXTERNALSYM PDNS_RECORD}
_DnsRecord = record
pNext: PDNS_RECORD;
pName: LPTSTR;
wType: WORD;
wDataLength: WORD; // Not referenced for DNS record types defined above.
Flags: record
case Integer of
0: (DW: DWORD); // flags as DWORD
1: (S: DNS_RECORD_FLAGS); // flags as structure
end;
dwTtl: DWORD;
dwReserved: DWORD;
// Record Data
Data: record
case Integer of
0: (A: DNS_A_DATA);
1: (SOA, Soa_: DNS_SOA_DATA);
2: (PTR, Ptr_,
NS, Ns_,
CNAME, Cname_,
MB, Mb_,
MD, Md_,
MF, Mf_,
MG, Mg_,
MR, Mr_: DNS_PTR_DATA);
3: (MINFO, Minfo_,
RP, Rp_: DNS_MINFO_DATA);
4: (MX, Mx_,
AFSDB, Afsdb_,
RT, Rt_: DNS_MX_DATA);
5: (HINFO, Hinfo_,
ISDN, Isdn_,
TXT, Txt_,
X25: DNS_TXT_DATA);
6: (Null: DNS_NULL_DATA);
7: (WKS, Wks_: DNS_WKS_DATA);
8: (AAAA: DNS_AAAA_DATA);
9: (KEY, Key_: DNS_KEY_DATA);
10: (SIG, Sig_: DNS_SIG_DATA);
11: (ATMA, Atma_: DNS_ATMA_DATA);
12: (NXT, Nxt_: DNS_NXT_DATA);
13: (SRV, Srv_: DNS_SRV_DATA);
14: (TKEY, Tkey_: DNS_TKEY_DATA);
15: (TSIG, Tsig_: DNS_TSIG_DATA);
16: (WINS, Wins_: DNS_WINS_DATA);
17: (WINSR, WinsR_, NBSTAT, Nbstat_: DNS_WINSR_DATA);
end;
end;
{$EXTERNALSYM _DnsRecord}
DNS_RECORD = _DnsRecord;
{$EXTERNALSYM DNS_RECORD}
PPDNS_RECORD = ^PDNS_RECORD;
{$NODEFINE PPDNS_RECORD}
TDnsRecord = DNS_RECORD;
PDnsRecord = PDNS_RECORD;
//
// Header or fixed size of DNS_RECORD
//
const
DNS_RECORD_FIXED_SIZE = 24; // FIELD_OFFSET( DNS_RECORD, Data )
{$EXTERNALSYM DNS_RECORD_FIXED_SIZE}
SIZEOF_DNS_RECORD_HEADER = DNS_RECORD_FIXED_SIZE;
{$EXTERNALSYM SIZEOF_DNS_RECORD_HEADER}
//
// Resource record set building
//
// pFirst points to first record in list.
// pLast points to last record in list.
//
type
PDnsRRSet = ^DnsRRSet;
{$EXTERNALSYM PDnsRRSet}
_DnsRRSet = record
pFirstRR: PDNS_RECORD;
pLastRR: PDNS_RECORD;
end;
{$EXTERNALSYM _DnsRRSet}
DnsRRSet = _DnsRRSet;
{$EXTERNALSYM DnsRRSet}
TDnsrrset = DnsRRSet;
//
// To init pFirst is NULL.
// But pLast points at the location of the pFirst pointer -- essentially
// treating the pFirst ptr as a DNS_RECORD. (It is a DNS_RECORD with
// only a pNext field, but that's the only part we use.)
//
// Then when the first record is added to the list, the pNext field of
// this dummy record (which corresponds to pFirst's value) is set to
// point at the first record. So pFirst then properly points at the
// first record.
//
// (This works only because pNext is the first field in a
// DNS_RECORD structure and hence casting a PDNS_RECORD ptr to
// PDNS_RECORD* and dereferencing yields its pNext field)
//
// Use TERMINATE when have built RR set by grabbing records out of
// existing set. This makes sure that at the end, the last RR is
// properly NULL terminated.
//
procedure DNS_RRSET_INIT(rrset: PDnsRRSet);
{$EXTERNALSYM DNS_RRSET_INIT}
//procedure DNS_RRSET_ADD(rrset, pnewRR: PDNS_RRSET);
//{$EXTERNALSYM DNS_RRSET_ADD}
procedure DNS_RRSET_TERMINATE(rrset: PDnsRRSet);
{$EXTERNALSYM DNS_RRSET_TERMINATE}
//
// Record set manipulation
//
//
// Record Copy
// Record copy functions also do conversion between character sets.
//
// Note, it might be advisable to directly expose non-Ex copy
// functions _W, _A for record and set, to avoid exposing the
// conversion enum.
//
type
_DNS_CHARSET = (
DnsCharSetUnknown,
DnsCharSetUnicode,
DnsCharSetUtf8,
DnsCharSetAnsi);
{$EXTERNALSYM _DNS_CHARSET}
DNS_CHARSET = _DNS_CHARSET;
{$EXTERNALSYM DNS_CHARSET}
TDnsCharSet = DNS_CHARSET;
PDnsCharSet = ^DNS_CHARSET;
function DnsRecordCopyEx(pRecord: PDNS_RECORD; CharSetIn: DNS_CHARSET; CharSetOut: DNS_CHARSET): PDNS_RECORD; stdcall;
{$EXTERNALSYM DnsRecordCopyEx}
function DnsRecordSetCopyEx(pRecordSet: PDNS_RECORD; CharSetIn: DNS_CHARSET; CharSetOut: DNS_CHARSET): PDNS_RECORD; stdcall;
{$EXTERNALSYM DnsRecordSetCopyEx}
{$IFDEF UNICODE}
function DnsRecordCopy(pRR: PDNS_RECORD): PDNS_RECORD;
{$EXTERNALSYM DnsRecordCopy}
function DnsRecordSetCopy(pRR: PDNS_RECORD): PDNS_RECORD;
{$EXTERNALSYM DnsRecordSetCopy}
{$ELSE}
function DnsRecordCopy(pRR: PDNS_RECORD): PDNS_RECORD;
{$EXTERNALSYM DnsRecordCopy}
function DnsRecordSetCopy(pRR: PDNS_RECORD): PDNS_RECORD;
{$EXTERNALSYM DnsRecordSetCopy}
{$ENDIF}
//
// Record Compare
//
// Note: these routines only compare records of the SAME character set.
// (ANSI, unicode or UTF8). Furthermore the routines assume the character
// set is indicated within the record. If compare of user created, rather
// than DNS API created record lists is desired, then caller should use
// DnsRecordCopy API and compare copies.
//
function DnsRecordCompare(pRecord1: PDNS_RECORD; pRecord2: PDNS_RECORD): BOOL; stdcall;
{$EXTERNALSYM DnsRecordCompare}
function DnsRecordSetCompare(pRR1: PDNS_RECORD; pRR2: PDNS_RECORD; var ppDiff1, ppDiff2: PDNS_RECORD): BOOL; stdcall;
{$EXTERNALSYM DnsRecordSetCompare}
//
// Detach next record set from record list
//
function DnsRecordSetDetach(pRecordList: PDNS_RECORD): PDNS_RECORD; stdcall;
{$EXTERNALSYM DnsRecordSetDetach}
//
// Free record list
//
// Only supported free is deep free of entire record list with LocalFree().
// This correctly frees record list returned by DnsQuery() or DnsRecordSetCopy()
//
type
DNS_FREE_TYPE = (DnsFreeFlat, DnsFreeRecordList);
{$EXTERNALSYM DNS_FREE_TYPE}
TDnsFreeType = DNS_FREE_TYPE;
procedure DnsFreeRecordListDeep(pRecordList: PDNS_RECORD; FreeType: DNS_FREE_TYPE); stdcall;
{$EXTERNALSYM DnsFreeRecordListDeep}
procedure DnsRecordListFree(pRecordList: PDNS_RECORD; FreeType: DNS_FREE_TYPE); stdcall;
{$EXTERNALSYM DnsRecordListFree}
procedure DnsFree(pData: PVOID; FreeType: DNS_FREE_TYPE); stdcall;
{$EXTERNALSYM DnsFree}
//
// DNS Query API
//
//
// Options for DnsQuery
//
const
DNS_QUERY_STANDARD = $00000000;
{$EXTERNALSYM DNS_QUERY_STANDARD}
DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE = $00000001;
{$EXTERNALSYM DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE}
DNS_QUERY_USE_TCP_ONLY = $00000002;
{$EXTERNALSYM DNS_QUERY_USE_TCP_ONLY}
DNS_QUERY_NO_RECURSION = $00000004;
{$EXTERNALSYM DNS_QUERY_NO_RECURSION}
DNS_QUERY_BYPASS_CACHE = $00000008;
{$EXTERNALSYM DNS_QUERY_BYPASS_CACHE}
DNS_QUERY_NO_WIRE_QUERY = $00000010;
{$EXTERNALSYM DNS_QUERY_NO_WIRE_QUERY}
DNS_QUERY_NO_LOCAL_NAME = $00000020;
{$EXTERNALSYM DNS_QUERY_NO_LOCAL_NAME}
DNS_QUERY_NO_HOSTS_FILE = $00000040;
{$EXTERNALSYM DNS_QUERY_NO_HOSTS_FILE}
DNS_QUERY_NO_NETBT = $00000080;
{$EXTERNALSYM DNS_QUERY_NO_NETBT}
DNS_QUERY_WIRE_ONLY = $00000100;
{$EXTERNALSYM DNS_QUERY_WIRE_ONLY}
DNS_QUERY_RETURN_MESSAGE = $00000200;
{$EXTERNALSYM DNS_QUERY_RETURN_MESSAGE}
DNS_QUERY_TREAT_AS_FQDN = $00001000;
{$EXTERNALSYM DNS_QUERY_TREAT_AS_FQDN}
DNS_QUERY_DONT_RESET_TTL_VALUES = $00100000;
{$EXTERNALSYM DNS_QUERY_DONT_RESET_TTL_VALUES}
DNS_QUERY_RESERVED = DWORD($ff000000);
{$EXTERNALSYM DNS_QUERY_RESERVED}
// Backward compatibility with Win2K
// Do not use
DNS_QUERY_CACHE_ONLY = DNS_QUERY_NO_WIRE_QUERY;
{$EXTERNALSYM DNS_QUERY_CACHE_ONLY}
function DnsQuery_A(pszName: PCSTR; wType: WORD; Options: DWORD; aipServers: PIP4_ARRAY; ppQueryResults: PPDNS_RECORD; pReserved: PPVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsQuery_A}
function DnsQuery_UTF8(pszName: PCSTR; wType: WORD; Options: DWORD; aipServers: PIP4_ARRAY; ppQueryResults: PPDNS_RECORD; pReserved: PPVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsQuery_UTF8}
function DnsQuery_W(pszName: LPCWSTR; wType: WORD; Options: DWORD; aipServers: PIP4_ARRAY; ppQueryResults: PPDNS_RECORD; pReserved: PPVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsQuery_W}
{$IFDEF UNICODE}
function DnsQuery(pszName: LPCWSTR; wType: WORD; Options: DWORD; aipServers: PIP4_ARRAY; ppQueryResults: PPDNS_RECORD; pReserved: PPVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsQuery}
{$ELSE}
function DnsQuery(pszName: PCSTR; wType: WORD; Options: DWORD; aipServers: PIP4_ARRAY; ppQueryResults: PPDNS_RECORD; pReserved: PPVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsQuery}
{$ENDIF}
//
// DNS Update API
//
// DnsAcquireContextHandle
// DnsReleaseContextHandle
// DnsModifyRecordsInSet
// DnsReplaceRecordSet
//
//
// Update flags
//
const
DNS_UPDATE_SECURITY_USE_DEFAULT = $00000000;
{$EXTERNALSYM DNS_UPDATE_SECURITY_USE_DEFAULT}
DNS_UPDATE_SECURITY_OFF = $00000010;
{$EXTERNALSYM DNS_UPDATE_SECURITY_OFF}
DNS_UPDATE_SECURITY_ON = $00000020;
{$EXTERNALSYM DNS_UPDATE_SECURITY_ON}
DNS_UPDATE_SECURITY_ONLY = $00000100;
{$EXTERNALSYM DNS_UPDATE_SECURITY_ONLY}
DNS_UPDATE_CACHE_SECURITY_CONTEXT = $00000200;
{$EXTERNALSYM DNS_UPDATE_CACHE_SECURITY_CONTEXT}
DNS_UPDATE_TEST_USE_LOCAL_SYS_ACCT = $00000400;
{$EXTERNALSYM DNS_UPDATE_TEST_USE_LOCAL_SYS_ACCT}
DNS_UPDATE_FORCE_SECURITY_NEGO = $00000800;
{$EXTERNALSYM DNS_UPDATE_FORCE_SECURITY_NEGO}
DNS_UPDATE_TRY_ALL_MASTER_SERVERS = $00001000;
{$EXTERNALSYM DNS_UPDATE_TRY_ALL_MASTER_SERVERS}
DNS_UPDATE_SKIP_NO_UPDATE_ADAPTERS = $00002000;
{$EXTERNALSYM DNS_UPDATE_SKIP_NO_UPDATE_ADAPTERS}
DNS_UPDATE_RESERVED = DWORD($ffff0000);
{$EXTERNALSYM DNS_UPDATE_RESERVED}
//
// Note: pCredentials paramater is currently respectively
// PSEC_WINNT_AUTH_IDENTITY_W or PSEC_WINNT_AUTH_IDENTITY_A.
// Using PVOID to obviate the need for including rpcdce.h
// in order to include this file and to leave open the
// possibility of alternative credential specifications in
// the future.
//
function DnsAcquireContextHandle_W(CredentialFlags: DWORD; pCredentials: PVOID; pContextHandle: PHANDLE): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsAcquireContextHandle_W}
function DnsAcquireContextHandle_A(CredentialFlags: DWORD; pCredentials: PVOID; pContextHandle: PHANDLE): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsAcquireContextHandle_A}
{$IFDEF UNICODE}
function DnsAcquireContextHandle(CredentialFlags: DWORD; pCredentials: PVOID; pContextHandle: PHANDLE): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsAcquireContextHandle}
{$ELSE}
function DnsAcquireContextHandle(CredentialFlags: DWORD; pCredentials: PVOID; pContextHandle: PHANDLE): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsAcquireContextHandle}
{$ENDIF}
procedure DnsReleaseContextHandle(hContext: HANDLE); stdcall;
{$EXTERNALSYM DnsReleaseContextHandle}
//
// Dynamic Update API
//
function DnsModifyRecordsInSet_W(pAddRecords: PDNS_RECORD; pDeleteRecords: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsModifyRecordsInSet_W}
function DnsModifyRecordsInSet_A(pAddRecords: PDNS_RECORD; pDeleteRecords: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsModifyRecordsInSet_A}
function DnsModifyRecordsInSet_UTF8(pAddRecords: PDNS_RECORD; pDeleteRecords: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsModifyRecordsInSet_UTF8}
{$IFDEF UNICODE}
function DnsModifyRecordsInSet(pAddRecords: PDNS_RECORD; pDeleteRecords: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsModifyRecordsInSet}
{$ELSE}
function DnsModifyRecordsInSet(pAddRecords: PDNS_RECORD; pDeleteRecords: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsModifyRecordsInSet}
{$ENDIF}
function DnsReplaceRecordSetW(pNewSet: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsReplaceRecordSetW}
function DnsReplaceRecordSetA(pNewSet: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsReplaceRecordSetA}
function DnsReplaceRecordSetUTF8(pNewSet: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsReplaceRecordSetUTF8}
{$IFDEF UNICODE}
function DnsReplaceRecordSet(pNewSet: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsReplaceRecordSet}
{$ELSE}
function DnsReplaceRecordSet(pNewSet: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsReplaceRecordSet}
{$ENDIF}
//
// DNS name validation
//
type
_DNS_NAME_FORMAT = (
DnsNameDomain,
DnsNameDomainLabel,
DnsNameHostnameFull,
DnsNameHostnameLabel,
DnsNameWildcard,
DnsNameSrvRecord);
{$EXTERNALSYM _DNS_NAME_FORMAT}
DNS_NAME_FORMAT = _DNS_NAME_FORMAT;
{$EXTERNALSYM DNS_NAME_FORMAT}
TDnsNameFormat = DNS_NAME_FORMAT;
PDnsNameFormat = ^DNS_NAME_FORMAT;
function DnsValidateName_UTF8(pszName: LPCSTR; Format: DNS_NAME_FORMAT): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsValidateName_UTF8}
function DnsValidateName_W(pwszName: LPCWSTR; Format: DNS_NAME_FORMAT): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsValidateName_W}
function DnsValidateName_A(pszName: LPCSTR; Format: DNS_NAME_FORMAT): DNS_STATUS; stdcall;
{$EXTERNALSYM DnsValidateName_A}
{$IFDEF UNICODE}
function DnsValidateName(pszName: LPCWSTR; Format: DNS_NAME_FORMAT): DNS_STATUS;
{$EXTERNALSYM DnsValidateName}
{$ELSE}
function DnsValidateName(pszName: LPCSTR; Format: DNS_NAME_FORMAT): DNS_STATUS;
{$EXTERNALSYM DnsValidateName}
{$ENDIF}
//
// DNS name comparison
//
function DnsNameCompare_A(pName1: LPSTR; pName2: LPSTR): BOOL; stdcall;
{$EXTERNALSYM DnsNameCompare_A}
function DnsNameCompare_W(pName1: LPWSTR; pName2: LPWSTR): BOOL; stdcall;
{$EXTERNALSYM DnsNameCompare_W}
{$IFDEF UNICODE}
function DnsNameCompare(pName1: LPWSTR; pName2: LPWSTR): BOOL; stdcall;
{$EXTERNALSYM DnsNameCompare}
{$ELSE}
function DnsNameCompare(pName1: LPSTR; pName2: LPSTR): BOOL; stdcall;
{$EXTERNALSYM DnsNameCompare}
{$ENDIF}
//
// DNS message "roll-your-own" routines
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -