📄 windns.pas
字号:
{******************************************************************}
{ }
{ Borland Delphi Runtime Library }
{ ACL API interface unit }
{ }
{ Portions created by Microsoft are }
{ Copyright (C) 1995-1999 Microsoft Corporation. }
{ All Rights Reserved. }
{ }
{ The original file is: WinDNS.h, released June 2000. }
{ The original Pascal code is: WinDNS.pas, released December 2000 }
{ The initial developer of the Pascal code is Marcel van Brakel }
{ (brakelm@bart.nl). }
{ }
{ Portions created by Marcel van Brakel are }
{ Copyright (C) 1999 Marcel van Brakel. }
{ }
{ Obtained through: }
{ Joint Endeavour of Delphi Innovators (Project JEDI) }
{ }
{ You may retrieve the latest version of this file at the Project }
{ JEDI home page, located at http://delphi-jedi.org }
{ }
{ The contents of this file are used with permission, subject to }
{ the Mozilla Public License Version 1.1 (the "License"); you may }
{ not use this file except in compliance with the License. You may }
{ obtain a copy of the License at }
{ http://www.mozilla.org/MPL/MPL-1.1.html }
{ }
{ Software distributed under the License is distributed on an }
{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
{ implied. See the License for the specific language governing }
{ rights and limitations under the License. }
{ }
{ Notes (TODO): }
{ DnsRecordSetDetach() and DnsValidateName_X() didn't have a cc }
{ IP_ADDRESS_STRING_LENGTH is defined nowhere }
{ DNS_WINS_RECORD macro untranslatable due to IP_ADDRESS }
{ DNS_RRSET_ADD macro untranslatable }
{ }
{******************************************************************}
unit WinDNS;
{$WEAKPACKAGEUNIT}
{$HPPEMIT ''}
{$HPPEMIT '#include "WinDNS.h"'}
{$HPPEMIT ''}
{$HPPEMIT 'typeded PDNS_RECORD *PPDNS_RECORD'}
{$HPPEMIT ''}
{$I WINDEFINES.INC}
interface
uses
WinType;
{.$DEFINE ATMA_E164}
//
// DNS public types
//
type
DNS_STATUS = Longint;
{$EXTERNALSYM DNS_STATUS}
//
// IP Address
//
type
IP4_ADDRESS = DWORD;
{$EXTERNALSYM IP4_ADDRESS}
PIP4_ADDRESS = ^IP4_ADDRESS;
{$EXTERNALSYM PIP4_ADDRESS}
TIP4Address = IP4_ADDRESS;
PIP4Address = PIP4_ADDRESS;
const
SIZEOF_IP4_ADDRESS = 4;
{$EXTERNALSYM SIZEOF_IP4_ADDRESS}
IP4_ADDRESS_STRING_LENGTH = 15;
{$EXTERNALSYM IP4_ADDRESS_STRING_LENGTH}
//
// IP Address Array type
//
type
_IP4_ARRAY = record
AddrCount: DWORD;
AddrArray: array [0..0] of IP4_ADDRESS;
end;
{$EXTERNALSYM _IP4_ARRAY}
IP4_ARRAY = _IP4_ARRAY;
{$EXTERNALSYM IP4_ARRAY}
PIP4_ARRAY = ^IP4_ARRAY;
{$EXTERNALSYM PIP4_ARRAY}
TIP4Array = IP4_ARRAY;
PIP4Array = PIP4_ARRAY;
//
// IPv6 Address
//
DNS_IP6_ADDRESS = record
IP6Word: array [0..7] of WORD;
end;
{$EXTERNALSYM DNS_IP6_ADDRESS}
PDNS_IP6_ADDRESS = ^DNS_IP6_ADDRESS;
{$EXTERNALSYM PDNS_IP6_ADDRESS}
TDnsIP6Address = DNS_IP6_ADDRESS;
PDnsIP6Address = PDNS_IP6_ADDRESS;
const
IPV6_ADDRESS_STRING_LENGTH = 39;
{$EXTERNALSYM IPV6_ADDRESS_STRING_LENGTH}
//
// Inline byte flipping -- can be done in registers
//
procedure INLINE_WORD_FLIP(var Out: WORD; In_: WORD);
{$EXTERNALSYM INLINE_WORD_FLIP}
procedure INLINE_HTONS(var Out: WORD; In_: WORD);
{$EXTERNALSYM INLINE_HTONS}
procedure INLINE_NTOHS(var Out: WORD; In_: WORD);
{$EXTERNALSYM INLINE_NTOHS}
procedure INLINE_DWORD_FLIP(var Out: DWORD; In_: DWORD);
{$EXTERNALSYM INLINE_DWORD_FLIP}
procedure INLINE_NTOHL(var Out: DWORD; In_: DWORD);
{$EXTERNALSYM INLINE_NTOHL}
procedure INLINE_HTONL(var Out: DWORD; In_: DWORD);
{$EXTERNALSYM INLINE_HTONL}
//
// Inline byte flip and write to packet (unaligned)
//
procedure INLINE_WRITE_FLIPPED_WORD(pout: PWORD; In_: WORD);
{$EXTERNALSYM INLINE_WRITE_FLIPPED_WORD}
procedure INLINE_WRITE_FLIPPED_DWORD(pout: PDWORD; In_: DWORD);
{$EXTERNALSYM INLINE_WRITE_FLIPPED_DWORD}
//
// Basic DNS definitions
//
//
// DNS port for both UDP and TCP is 53.
//
const
DNS_PORT_HOST_ORDER = $0035; // port 53
{$EXTERNALSYM DNS_PORT_HOST_ORDER}
DNS_PORT_NET_ORDER = $3500;
{$EXTERNALSYM DNS_PORT_NET_ORDER}
//
// DNS UDP packets no more than 512 bytes
//
DNS_RFC_MAX_UDP_PACKET_LENGTH = 512;
{$EXTERNALSYM DNS_RFC_MAX_UDP_PACKET_LENGTH}
//
// DNS Names limited to 255, 63 in any one label
//
DNS_MAX_NAME_LENGTH = 255;
{$EXTERNALSYM DNS_MAX_NAME_LENGTH}
DNS_MAX_LABEL_LENGTH = 63;
{$EXTERNALSYM DNS_MAX_LABEL_LENGTH}
DNS_MAX_NAME_BUFFER_LENGTH = 256;
{$EXTERNALSYM DNS_MAX_NAME_BUFFER_LENGTH}
DNS_MAX_LABEL_BUFFER_LENGTH = 64;
{$EXTERNALSYM DNS_MAX_LABEL_BUFFER_LENGTH}
//
// Reverse lookup domain names
//
DNS_REVERSE_DOMAIN_STRING = 'in-addr.arpa.';
{$EXTERNALSYM DNS_REVERSE_DOMAIN_STRING}
//DNS_MAX_REVERSE_NAME_LENGTH = IP_ADDRESS_STRING_LENGTH + 1 + Length(DNS_REVERSE_DOMAIN_STRING) + 1;
//{$EXTERNALSYM DNS_MAX_REVERSE_NAME_LENGTH}
//DNS_MAX_REVERSE_NAME_BUFFER_LENGTH = DNS_MAX_REVERSE_NAME_LENGTH + 1;
//{$EXTERNALSYM DNS_MAX_REVERSE_NAME_BUFFER_LENGTH}
//
// DNS Text string limited by size representable
// in a single byte length field
DNS_MAX_TEXT_STRING_LENGTH = 255;
{$EXTERNALSYM DNS_MAX_TEXT_STRING_LENGTH}
//
// DNS On-The-Wire Structures
//
//#pragma pack(1)
//
// DNS Message Header
//
type
_DNS_HEADER = packed record
Xid: WORD;
Flags: Byte;
//BYTE RecursionDesired : 1;
//BYTE Truncation : 1;
//BYTE Authoritative : 1;
//BYTE Opcode : 4;
//BYTE IsResponse : 1;
Flags2: Byte;
//BYTE ResponseCode : 4;
//BYTE Reserved : 3;
//BYTE RecursionAvailable : 1;
QuestionCount: WORD;
AnswerCount: WORD;
NameServerCount: WORD;
AdditionalCount: WORD;
end;
{$EXTERNALSYM _DNS_HEADER}
DNS_HEADER = _DNS_HEADER;
{$EXTERNALSYM DNS_HEADER}
PDNS_HEADER = ^DNS_HEADER;
{$EXTERNALSYM PDNS_HEADER}
TDnsHeader = DNS_HEADER;
PDnsHeader = PDNS_HEADER;
//
// Flags as WORD
//
function DNS_HEADER_FLAGS(pHead: PDNS_HEADER): WORD;
{$EXTERNALSYM DNS_HEADER_FLAGS}
//
// Byte flip DNS header to\from host order.
//
// Note that this does NOT flip flags, as definition above defines
// flags as individual bytes for direct access to net byte order.
//
procedure DNS_BYTE_FLIP_HEADER_COUNTS(var pHeader: PDNS_HEADER);
{$EXTERNALSYM DNS_BYTE_FLIP_HEADER_COUNTS}
//
// Question name follows header
//
const
DNS_OFFSET_TO_QUESTION_NAME = SizeOf(DNS_HEADER);
{$EXTERNALSYM DNS_OFFSET_TO_QUESTION_NAME}
//
// Question immediately follows header so compressed question name
// 0xC000 | sizeof(DNS_HEADER)
DNS_COMPRESSED_QUESTION_NAME = $C00C;
{$EXTERNALSYM DNS_COMPRESSED_QUESTION_NAME}
//
// Packet extraction macros
//
{
#define DNS_QUESTION_NAME_FROM_HEADER( _pHeader_ ) \
( (PCHAR)( (PDNS_HEADER)(_pHeader_) + 1 ) )
#define DNS_ANSWER_FROM_QUESTION( _pQuestion_ ) \
( (PCHAR)( (PDNS_QUESTION)(_pQuestion_) + 1 ) )
}
//
// DNS Question
//
type
_DNS_WIRE_QUESTION = packed record
// Preceded by question name
QuestionType: WORD;
QuestionClass: WORD;
end;
{$EXTERNALSYM _DNS_WIRE_QUESTION}
DNS_WIRE_QUESTION = _DNS_WIRE_QUESTION;
{$EXTERNALSYM DNS_WIRE_QUESTION}
PDNS_WIRE_QUESTION = ^DNS_WIRE_QUESTION;
{$EXTERNALSYM PDNS_WIRE_QUESTION}
TDnsWireQuestion = DNS_WIRE_QUESTION;
PDnsWireQuestion = PDNS_WIRE_QUESTION;
//
// DNS Resource Record
//
_DNS_WIRE_RECORD = packed record
// Preceded by record owner name
RecordType: WORD;
RecordClass: WORD;
TimeToLive: DWORD;
DataLength: WORD;
// Followed by record data
end;
{$EXTERNALSYM _DNS_WIRE_RECORD}
DNS_WIRE_RECORD = _DNS_WIRE_RECORD;
{$EXTERNALSYM DNS_WIRE_RECORD}
PDNS_WIRE_RECORD = ^DNS_WIRE_RECORD;
{$EXTERNALSYM PDNS_WIRE_RECORD}
TDnsWireRecord = DNS_WIRE_RECORD;
PDnsWireRecord = PDNS_WIRE_RECORD;
//#pragma pack()
//
// DNS Query Types
//
const
DNS_OPCODE_QUERY = 0; // Query
{$EXTERNALSYM DNS_OPCODE_QUERY}
DNS_OPCODE_IQUERY = 1; // Obsolete: IP to name
{$EXTERNALSYM DNS_OPCODE_IQUERY}
DNS_OPCODE_SERVER_STATUS = 2; // Obsolete: DNS ping
{$EXTERNALSYM DNS_OPCODE_SERVER_STATUS}
DNS_OPCODE_UNKNOWN = 3; // Unknown
{$EXTERNALSYM DNS_OPCODE_UNKNOWN}
DNS_OPCODE_NOTIFY = 4; // Notify
{$EXTERNALSYM DNS_OPCODE_NOTIFY}
DNS_OPCODE_UPDATE = 5; // Dynamic Update
{$EXTERNALSYM DNS_OPCODE_UPDATE}
//
// DNS response codes.
//
// Sent in the "ResponseCode" field of a DNS_HEADER.
//
DNS_RCODE_NOERROR = 0;
{$EXTERNALSYM DNS_RCODE_NOERROR}
DNS_RCODE_FORMERR = 1; // Format error
{$EXTERNALSYM DNS_RCODE_FORMERR}
DNS_RCODE_SERVFAIL = 2; // Server failure
{$EXTERNALSYM DNS_RCODE_SERVFAIL}
DNS_RCODE_NXDOMAIN = 3; // Name error
{$EXTERNALSYM DNS_RCODE_NXDOMAIN}
DNS_RCODE_NOTIMPL = 4; // Not implemented
{$EXTERNALSYM DNS_RCODE_NOTIMPL}
DNS_RCODE_REFUSED = 5; // Refused
{$EXTERNALSYM DNS_RCODE_REFUSED}
DNS_RCODE_YXDOMAIN = 6; // Domain name should not exist
{$EXTERNALSYM DNS_RCODE_YXDOMAIN}
DNS_RCODE_YXRRSET = 7; // RR set should not exist
{$EXTERNALSYM DNS_RCODE_YXRRSET}
DNS_RCODE_NXRRSET = 8; // RR set does not exist
{$EXTERNALSYM DNS_RCODE_NXRRSET}
DNS_RCODE_NOTAUTH = 9; // Not authoritative for zone
{$EXTERNALSYM DNS_RCODE_NOTAUTH}
DNS_RCODE_NOTZONE = 10; // Name is not zone
{$EXTERNALSYM DNS_RCODE_NOTZONE}
DNS_RCODE_MAX = 15;
{$EXTERNALSYM DNS_RCODE_MAX}
//
// Extended RCODEs
//
DNS_RCODE_BADSIG = 16; // Bad signature
{$EXTERNALSYM DNS_RCODE_BADSIG}
DNS_RCODE_BADKEY = 17; // Bad key
{$EXTERNALSYM DNS_RCODE_BADKEY}
DNS_RCODE_BADTIME = 18; // Bad timestamp
{$EXTERNALSYM DNS_RCODE_BADTIME}
//
// Mappings to friendly names
//
DNS_RCODE_NO_ERROR = DNS_RCODE_NOERROR;
{$EXTERNALSYM DNS_RCODE_NO_ERROR}
DNS_RCODE_FORMAT_ERROR = DNS_RCODE_FORMERR;
{$EXTERNALSYM DNS_RCODE_FORMAT_ERROR}
DNS_RCODE_SERVER_FAILURE = DNS_RCODE_SERVFAIL;
{$EXTERNALSYM DNS_RCODE_SERVER_FAILURE}
DNS_RCODE_NAME_ERROR = DNS_RCODE_NXDOMAIN;
{$EXTERNALSYM DNS_RCODE_NAME_ERROR}
DNS_RCODE_NOT_IMPLEMENTED = DNS_RCODE_NOTIMPL;
{$EXTERNALSYM DNS_RCODE_NOT_IMPLEMENTED}
//
// DNS Classes
//
// Classes are on the wire as WORDs.
//
// _CLASS_ defines in host order.
// _RCLASS_ defines in net byte order.
//
// Generally we'll avoid byte flip and test class in net byte order.
//
DNS_CLASS_INTERNET = $0001; // 1
{$EXTERNALSYM DNS_CLASS_INTERNET}
DNS_CLASS_CSNET = $0002; // 2
{$EXTERNALSYM DNS_CLASS_CSNET}
DNS_CLASS_CHAOS = $0003; // 3
{$EXTERNALSYM DNS_CLASS_CHAOS}
DNS_CLASS_HESIOD = $0004; // 4
{$EXTERNALSYM DNS_CLASS_HESIOD}
DNS_CLASS_NONE = $00fe; // 254
{$EXTERNALSYM DNS_CLASS_NONE}
DNS_CLASS_ALL = $00ff; // 255
{$EXTERNALSYM DNS_CLASS_ALL}
DNS_CLASS_ANY = $00ff; // 255
{$EXTERNALSYM DNS_CLASS_ANY}
DNS_RCLASS_INTERNET = $0100; // 1
{$EXTERNALSYM DNS_RCLASS_INTERNET}
DNS_RCLASS_CSNET = $0200; // 2
{$EXTERNALSYM DNS_RCLASS_CSNET}
DNS_RCLASS_CHAOS = $0300; // 3
{$EXTERNALSYM DNS_RCLASS_CHAOS}
DNS_RCLASS_HESIOD = $0400; // 4
{$EXTERNALSYM DNS_RCLASS_HESIOD}
DNS_RCLASS_NONE = $fe00; // 254
{$EXTERNALSYM DNS_RCLASS_NONE}
DNS_RCLASS_ALL = $ff00; // 255
{$EXTERNALSYM DNS_RCLASS_ALL}
DNS_RCLASS_ANY = $ff00; // 255
{$EXTERNALSYM DNS_RCLASS_ANY}
//
// DNS Record Types
//
// _TYPE_ defines are in host byte order.
// _RTYPE_ defines are in net byte order.
//
// Generally always deal with types in host byte order as we index
// resource record functions by type.
//
DNS_TYPE_ZERO = $0000;
{$EXTERNALSYM DNS_TYPE_ZERO}
// RFC 1034/1035
DNS_TYPE_A = $0001; // 1
{$EXTERNALSYM DNS_TYPE_A}
DNS_TYPE_NS = $0002; // 2
{$EXTERNALSYM DNS_TYPE_NS}
DNS_TYPE_MD = $0003; // 3
{$EXTERNALSYM DNS_TYPE_MD}
DNS_TYPE_MF = $0004; // 4
{$EXTERNALSYM DNS_TYPE_MF}
DNS_TYPE_CNAME = $0005; // 5
{$EXTERNALSYM DNS_TYPE_CNAME}
DNS_TYPE_SOA = $0006; // 6
{$EXTERNALSYM DNS_TYPE_SOA}
DNS_TYPE_MB = $0007; // 7
{$EXTERNALSYM DNS_TYPE_MB}
DNS_TYPE_MG = $0008; // 8
{$EXTERNALSYM DNS_TYPE_MG}
DNS_TYPE_MR = $0009; // 9
{$EXTERNALSYM DNS_TYPE_MR}
DNS_TYPE_NULL = $000a; // 10
{$EXTERNALSYM DNS_TYPE_NULL}
DNS_TYPE_WKS = $000b; // 11
{$EXTERNALSYM DNS_TYPE_WKS}
DNS_TYPE_PTR = $000c; // 12
{$EXTERNALSYM DNS_TYPE_PTR}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -