JwaWinDNS.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:73k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Domain Naming Services API interface Unit for Object Pascal                  }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: windns.h, released June 2000. The original Pascal      }
  9. { code is: WinDNS.pas, released December 2000. The initial developer of the    }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. {******************************************************************}
  44. {     }
  45. { Notes (TODO):                                                    }
  46. {   DnsRecordSetDetach() and DnsValidateName_X() didn't have a cc  }
  47. {   IP_ADDRESS_STRING_LENGTH is defined nowhere                    }
  48. {   DNS_WINS_RECORD macro  untranslatable due to IP_ADDRESS        }
  49. {   DNS_RRSET_ADD macro untranslatable                             }
  50. {     }
  51. {******************************************************************}
  52. unit JwaWinDNS;
  53. {$WEAKPACKAGEUNIT}
  54. {$HPPEMIT ''}
  55. {$HPPEMIT '#include "WinDNS.h"'}
  56. {$HPPEMIT ''}
  57. {$HPPEMIT 'typeded PDNS_RECORD *PPDNS_RECORD'}
  58. {$HPPEMIT ''}
  59. {$I WINDEFINES.INC}
  60. interface
  61. uses
  62.   JwaWinsock2, JwaWinType;
  63. {.$DEFINE ATMA_E164}
  64. type
  65.   IN6_ADDR = Pointer; // todo
  66. //
  67. //  Define QWORD -- not yet defined globally 
  68. //
  69. type
  70.   QWORD = Int64;
  71.   {$EXTERNALSYM QWORD}
  72. //
  73. //  DNS public types
  74. //
  75. type
  76.   DNS_STATUS = Longint;
  77.   {$EXTERNALSYM DNS_STATUS}
  78.   PDNS_STATUS = ^DNS_STATUS;
  79.   {$EXTERNALSYM PDNS_STATUS}
  80.   TDnsStatus = DNS_STATUS;
  81.   PDnsStatus = PDNS_STATUS;
  82. //
  83. //  IP Address
  84. //
  85. type
  86.   IP4_ADDRESS = DWORD;
  87.   {$EXTERNALSYM IP4_ADDRESS}
  88.   PIP4_ADDRESS = ^IP4_ADDRESS;
  89.   {$EXTERNALSYM PIP4_ADDRESS}
  90.   TIP4Address = IP4_ADDRESS;
  91.   PIP4Address = PIP4_ADDRESS;
  92. const
  93.   SIZEOF_IP4_ADDRESS         = 4;
  94.   {$EXTERNALSYM SIZEOF_IP4_ADDRESS}
  95.   IP4_ADDRESS_STRING_LENGTH  = 15;
  96.   {$EXTERNALSYM IP4_ADDRESS_STRING_LENGTH}
  97.   IP4_ADDRESS_STRING_BUFFER_LENGTH = 16;
  98.   {$EXTERNALSYM IP4_ADDRESS_STRING_BUFFER_LENGTH}
  99. //
  100. //  IP Address Array type
  101. //
  102. type
  103.   PIP4_ARRAY = ^IP4_ARRAY;
  104.   {$EXTERNALSYM PIP4_ARRAY}
  105.   _IP4_ARRAY = record
  106.     AddrCount: DWORD;
  107.     AddrArray: array [0..0] of IP4_ADDRESS;
  108.   end;
  109.   {$EXTERNALSYM _IP4_ARRAY}
  110.   IP4_ARRAY = _IP4_ARRAY;
  111.   {$EXTERNALSYM IP4_ARRAY}
  112.   TIp4Array = IP4_ARRAY;
  113.   PIp4Array = PIP4_ARRAY;
  114. //
  115. //  IPv6 Address
  116. //
  117.   PIP6_ADDRESS = ^IP6_ADDRESS;
  118.   {$EXTERNALSYM PIP6_ADDRESS}
  119.   IP6_ADDRESS = record
  120.     case Integer of
  121.       0: (IP6Qword: array [0..1] of QWORD);
  122.       1: (IP6Dword: array [0..3] of DWORD);
  123.       2: (IP6Word: array [0..7] of WORD);
  124.       3: (IP6Byte: array [0..15] of BYTE);
  125.       4: (In6: IN6_ADDR);
  126.   end;
  127.   {$EXTERNALSYM IP6_ADDRESS}
  128.   TIp6Address = IP6_ADDRESS;
  129.   PIp6Address = PIP6_ADDRESS;
  130. //  Backward compatibility
  131.   DNS_IP6_ADDRESS = IP6_ADDRESS;
  132.   {$EXTERNALSYM DNS_IP6_ADDRESS}
  133.   PDNS_IP6_ADDRESS = ^IP6_ADDRESS;
  134.   {$EXTERNALSYM PDNS_IP6_ADDRESS}
  135.   TDnsIp6Address = DNS_IP6_ADDRESS;
  136.   PDnsIp6Address = PDNS_IP6_ADDRESS;
  137. //
  138. //  IP6 string max is 45 bytes
  139. //      - 6 WORDs in colon+hex (5 chars)
  140. //      - last DWORD as IP4 (15 chars)
  141. //  
  142. const
  143.   IP6_ADDRESS_STRING_LENGTH        = (47);
  144.   {$EXTERNALSYM IP6_ADDRESS_STRING_LENGTH}
  145.   IP6_ADDRESS_STRING_BUFFER_LENGTH = (48);
  146.   {$EXTERNALSYM IP6_ADDRESS_STRING_BUFFER_LENGTH}
  147. //  backcompat
  148.   IPV6_ADDRESS_STRING_LENGTH = IP6_ADDRESS_STRING_LENGTH;
  149.   {$EXTERNALSYM IPV6_ADDRESS_STRING_LENGTH}
  150. //
  151. //  Inline byte flipping -- can be done in registers
  152. //
  153. procedure INLINE_WORD_FLIP(var Out: WORD; In_: WORD);
  154. {$EXTERNALSYM INLINE_WORD_FLIP}
  155. procedure INLINE_HTONS(var Out: WORD; In_: WORD);
  156. {$EXTERNALSYM INLINE_HTONS}
  157. procedure INLINE_NTOHS(var Out: WORD; In_: WORD);
  158. {$EXTERNALSYM INLINE_NTOHS}
  159. procedure INLINE_DWORD_FLIP(var Out: DWORD; In_: DWORD);
  160. {$EXTERNALSYM INLINE_DWORD_FLIP}
  161. procedure INLINE_NTOHL(var Out: DWORD; In_: DWORD);
  162. {$EXTERNALSYM INLINE_NTOHL}
  163. procedure INLINE_HTONL(var Out: DWORD; In_: DWORD);
  164. {$EXTERNALSYM INLINE_HTONL}
  165. //
  166. //  Inline byte flip and write to packet (unaligned)
  167. //
  168. procedure INLINE_WRITE_FLIPPED_WORD(pout: PWORD; In_: WORD);
  169. {$EXTERNALSYM INLINE_WRITE_FLIPPED_WORD}
  170. procedure INLINE_WRITE_FLIPPED_DWORD(pout: PDWORD; In_: DWORD);
  171. {$EXTERNALSYM INLINE_WRITE_FLIPPED_DWORD}
  172. //
  173. //  Basic DNS definitions
  174. //
  175. //
  176. //  DNS port for both UDP and TCP is 53.
  177. //
  178. const
  179.   DNS_PORT_HOST_ORDER = ($0035); // port 53
  180.   {$EXTERNALSYM DNS_PORT_HOST_ORDER}
  181.   DNS_PORT_NET_ORDER  = ($3500);
  182.   {$EXTERNALSYM DNS_PORT_NET_ORDER}
  183. //
  184. //  DNS UDP packets no more than 512 bytes
  185. //
  186.   DNS_RFC_MAX_UDP_PACKET_LENGTH = (512);
  187.   {$EXTERNALSYM DNS_RFC_MAX_UDP_PACKET_LENGTH}
  188. //
  189. //  DNS Names limited to 255, 63 in any one label
  190. //
  191.   DNS_MAX_NAME_LENGTH  = (255);
  192.   {$EXTERNALSYM DNS_MAX_NAME_LENGTH}
  193.   DNS_MAX_LABEL_LENGTH = (63);
  194.   {$EXTERNALSYM DNS_MAX_LABEL_LENGTH}
  195.   DNS_MAX_NAME_BUFFER_LENGTH  = (256);
  196.   {$EXTERNALSYM DNS_MAX_NAME_BUFFER_LENGTH}
  197.   DNS_MAX_LABEL_BUFFER_LENGTH = (64);
  198.   {$EXTERNALSYM DNS_MAX_LABEL_BUFFER_LENGTH}
  199. //
  200. //  Reverse lookup domain names
  201. //
  202.   DNS_IP4_REVERSE_DOMAIN_STRING = ('in-addr.arpa.');
  203.   {$EXTERNALSYM DNS_IP4_REVERSE_DOMAIN_STRING}
  204.   //DNS_MAX_IP4_REVERSE_NAME_LENGTH = (IP_ADDRESS_STRING_LENGTH + 1 + SizeOf(DNS_IP4_REVERSE_DOMAIN_STRING));
  205.   //{$EXTERNALSYM DNS_MAX_IP4_REVERSE_NAME_LENGTH}
  206.   //DNS_MAX_IP4_REVERSE_NAME_BUFFER_LENGTH = (DNS_MAX_IP4_REVERSE_NAME_LENGTH + 1);
  207.   //{$EXTERNALSYM DNS_MAX_IP4_REVERSE_NAME_BUFFER_LENGTH}
  208.   DNS_IP6_REVERSE_DOMAIN_STRING = ('ip6.int.');
  209.   {$EXTERNALSYM DNS_IP6_REVERSE_DOMAIN_STRING}
  210.   DNS_MAX_IP6_REVERSE_NAME_LENGTH = (64 + SizeOf(DNS_IP6_REVERSE_DOMAIN_STRING));
  211.   {$EXTERNALSYM DNS_MAX_IP6_REVERSE_NAME_LENGTH}
  212.   DNS_MAX_IP6_REVERSE_NAME_BUFFER_LENGTH = (DNS_MAX_IP6_REVERSE_NAME_LENGTH + 1);
  213.   {$EXTERNALSYM DNS_MAX_IP6_REVERSE_NAME_BUFFER_LENGTH}
  214. //  Combined
  215.   DNS_MAX_REVERSE_NAME_LENGTH = DNS_MAX_IP6_REVERSE_NAME_LENGTH;
  216.   {$EXTERNALSYM DNS_MAX_REVERSE_NAME_LENGTH}
  217.   DNS_MAX_REVERSE_NAME_BUFFER_LENGTH = DNS_MAX_IP6_REVERSE_NAME_BUFFER_LENGTH;
  218.   {$EXTERNALSYM DNS_MAX_REVERSE_NAME_BUFFER_LENGTH}
  219. //
  220. //  DNS Text string limited by size representable
  221. //      in a single byte length field
  222.   DNS_MAX_TEXT_STRING_LENGTH = (255);
  223.   {$EXTERNALSYM DNS_MAX_TEXT_STRING_LENGTH}
  224. //
  225. //  DNS On-The-Wire Structures
  226. //
  227. //
  228. //  DNS Message Header
  229. //
  230. type
  231.   _DNS_HEADER = packed record
  232.     Xid: WORD;
  233.     Flags: Byte;
  234.     //BYTE    RecursionDesired : 1;
  235.     //BYTE    Truncation : 1;
  236.     //BYTE    Authoritative : 1;
  237.     //BYTE    Opcode : 4;
  238.     //BYTE    IsResponse : 1;
  239.     Flags2: Byte;
  240.     //BYTE    ResponseCode : 4;
  241.     //BYTE    Reserved : 3;
  242.     //BYTE    RecursionAvailable : 1;
  243.     QuestionCount: WORD;
  244.     AnswerCount: WORD;
  245.     NameServerCount: WORD;
  246.     AdditionalCount: WORD;
  247.   end;
  248.   {$EXTERNALSYM _DNS_HEADER}
  249.   DNS_HEADER = _DNS_HEADER;
  250.   {$EXTERNALSYM DNS_HEADER}
  251.   PDNS_HEADER = ^DNS_HEADER;
  252.   {$EXTERNALSYM PDNS_HEADER}
  253.   TDnsHeader = DNS_HEADER;
  254.   PDnsHeader = PDNS_HEADER;
  255. //
  256. //  Flags as WORD
  257. //
  258. function DNS_HEADER_FLAGS(pHead: PDNS_HEADER): WORD;
  259. {$EXTERNALSYM DNS_HEADER_FLAGS}
  260. //
  261. //  Byte flip DNS header tofrom host order.
  262. //
  263. //  Note that this does NOT flip flags, as definition above defines
  264. //  flags as individual bytes for direct access to net byte order.
  265. //
  266. procedure DNS_BYTE_FLIP_HEADER_COUNTS(var pHeader: PDNS_HEADER);
  267. {$EXTERNALSYM DNS_BYTE_FLIP_HEADER_COUNTS}
  268. //
  269. //  Question name follows header
  270. //
  271. const
  272.   DNS_OFFSET_TO_QUESTION_NAME = SizeOf(DNS_HEADER);
  273.   {$EXTERNALSYM DNS_OFFSET_TO_QUESTION_NAME}
  274. //
  275. //  Question immediately follows header so compressed question name
  276. //      0xC000 | sizeof(DNS_HEADER)
  277.   DNS_COMPRESSED_QUESTION_NAME = ($C00C);
  278.   {$EXTERNALSYM DNS_COMPRESSED_QUESTION_NAME}
  279. //
  280. //  Packet extraction macros
  281. //
  282. {
  283. #define DNS_QUESTION_NAME_FROM_HEADER( _pHeader_ ) 
  284.             ( (PCHAR)( (PDNS_HEADER)(_pHeader_) + 1 ) )
  285. #define DNS_ANSWER_FROM_QUESTION( _pQuestion_ ) 
  286.             ( (PCHAR)( (PDNS_QUESTION)(_pQuestion_) + 1 ) )
  287. }
  288. //
  289. //  DNS Question
  290. //
  291. type
  292.   PDNS_WIRE_QUESTION = ^DNS_WIRE_QUESTION;
  293.   {$EXTERNALSYM PDNS_WIRE_QUESTION}
  294.   _DNS_WIRE_QUESTION = packed record
  295.     //  Preceded by question name
  296.     QuestionType: WORD;
  297.     QuestionClass: WORD;
  298.   end;
  299.   {$EXTERNALSYM _DNS_WIRE_QUESTION}
  300.   DNS_WIRE_QUESTION = _DNS_WIRE_QUESTION;
  301.   {$EXTERNALSYM DNS_WIRE_QUESTION}
  302.   TDnsWireQuestion = DNS_WIRE_QUESTION;
  303.   PDnsWireQuestion = PDNS_WIRE_QUESTION;
  304. //
  305. //  DNS Resource Record
  306. //
  307.   PDNS_WIRE_RECORD = ^DNS_WIRE_RECORD;
  308.   {$EXTERNALSYM PDNS_WIRE_RECORD}
  309.   _DNS_WIRE_RECORD = packed record
  310.     //  Preceded by record owner name
  311.     RecordType: WORD;
  312.     RecordClass: WORD;
  313.     TimeToLive: DWORD;
  314.     DataLength: WORD;
  315.     //  Followed by record data
  316.   end;
  317.   {$EXTERNALSYM _DNS_WIRE_RECORD}
  318.   DNS_WIRE_RECORD = _DNS_WIRE_RECORD;
  319.   {$EXTERNALSYM DNS_WIRE_RECORD}
  320.   TDnsWireRecord = DNS_WIRE_RECORD;
  321.   PDnsWireRecord = PDNS_WIRE_RECORD;
  322. //
  323. //  DNS Query Types
  324. //
  325. const
  326.   DNS_OPCODE_QUERY         = 0; // Query
  327.   {$EXTERNALSYM DNS_OPCODE_QUERY}
  328.   DNS_OPCODE_IQUERY        = 1; // Obsolete: IP to name
  329.   {$EXTERNALSYM DNS_OPCODE_IQUERY}
  330.   DNS_OPCODE_SERVER_STATUS = 2; // Obsolete: DNS ping
  331.   {$EXTERNALSYM DNS_OPCODE_SERVER_STATUS}
  332.   DNS_OPCODE_UNKNOWN       = 3; // Unknown
  333.   {$EXTERNALSYM DNS_OPCODE_UNKNOWN}
  334.   DNS_OPCODE_NOTIFY        = 4; // Notify
  335.   {$EXTERNALSYM DNS_OPCODE_NOTIFY}
  336.   DNS_OPCODE_UPDATE        = 5; // Dynamic Update
  337.   {$EXTERNALSYM DNS_OPCODE_UPDATE}
  338. //
  339. //  DNS response codes.
  340. //
  341. //  Sent in the "ResponseCode" field of a DNS_HEADER.
  342. //
  343.   DNS_RCODE_NOERROR  = 0;
  344.   {$EXTERNALSYM DNS_RCODE_NOERROR}
  345.   DNS_RCODE_FORMERR  = 1; // Format error
  346.   {$EXTERNALSYM DNS_RCODE_FORMERR}
  347.   DNS_RCODE_SERVFAIL = 2; // Server failure
  348.   {$EXTERNALSYM DNS_RCODE_SERVFAIL}
  349.   DNS_RCODE_NXDOMAIN = 3; // Name error
  350.   {$EXTERNALSYM DNS_RCODE_NXDOMAIN}
  351.   DNS_RCODE_NOTIMPL  = 4; // Not implemented
  352.   {$EXTERNALSYM DNS_RCODE_NOTIMPL}
  353.   DNS_RCODE_REFUSED  = 5; // Refused
  354.   {$EXTERNALSYM DNS_RCODE_REFUSED}
  355.   DNS_RCODE_YXDOMAIN = 6; // Domain name should not exist
  356.   {$EXTERNALSYM DNS_RCODE_YXDOMAIN}
  357.   DNS_RCODE_YXRRSET  = 7; // RR set should not exist
  358.   {$EXTERNALSYM DNS_RCODE_YXRRSET}
  359.   DNS_RCODE_NXRRSET  = 8; // RR set does not exist
  360.   {$EXTERNALSYM DNS_RCODE_NXRRSET}
  361.   DNS_RCODE_NOTAUTH  = 9; // Not authoritative for zone
  362.   {$EXTERNALSYM DNS_RCODE_NOTAUTH}
  363.   DNS_RCODE_NOTZONE  = 10; // Name is not zone
  364.   {$EXTERNALSYM DNS_RCODE_NOTZONE}
  365.   DNS_RCODE_MAX      = 15;
  366.   {$EXTERNALSYM DNS_RCODE_MAX}
  367. //
  368. //  Extended RCODEs
  369. //
  370.   DNS_RCODE_BADVERS = 16; // Bad EDNS version
  371.   {$EXTERNALSYM DNS_RCODE_BADVERS}
  372.   DNS_RCODE_BADSIG  = 16; // Bad signature
  373.   {$EXTERNALSYM DNS_RCODE_BADSIG}
  374.   DNS_RCODE_BADKEY  = 17; // Bad key
  375.   {$EXTERNALSYM DNS_RCODE_BADKEY}
  376.   DNS_RCODE_BADTIME = 18; // Bad timestamp
  377.   {$EXTERNALSYM DNS_RCODE_BADTIME}
  378. //
  379. //  Mappings to friendly names
  380. //
  381.   DNS_RCODE_NO_ERROR        = DNS_RCODE_NOERROR;
  382.   {$EXTERNALSYM DNS_RCODE_NO_ERROR}
  383.   DNS_RCODE_FORMAT_ERROR    = DNS_RCODE_FORMERR;
  384.   {$EXTERNALSYM DNS_RCODE_FORMAT_ERROR}
  385.   DNS_RCODE_SERVER_FAILURE  = DNS_RCODE_SERVFAIL;
  386.   {$EXTERNALSYM DNS_RCODE_SERVER_FAILURE}
  387.   DNS_RCODE_NAME_ERROR      = DNS_RCODE_NXDOMAIN;
  388.   {$EXTERNALSYM DNS_RCODE_NAME_ERROR}
  389.   DNS_RCODE_NOT_IMPLEMENTED = DNS_RCODE_NOTIMPL;
  390.   {$EXTERNALSYM DNS_RCODE_NOT_IMPLEMENTED}
  391. //
  392. //  DNS Classes
  393. //
  394. //  Classes are on the wire as WORDs.
  395. //
  396. //  _CLASS_ defines in host order.
  397. //  _RCLASS_ defines in net byte order.
  398. //
  399. //  Generally we'll avoid byte flip and test class in net byte order.
  400. //
  401.   DNS_CLASS_INTERNET = $0001; // 1
  402.   {$EXTERNALSYM DNS_CLASS_INTERNET}
  403.   DNS_CLASS_CSNET    = $0002; // 2
  404.   {$EXTERNALSYM DNS_CLASS_CSNET}
  405.   DNS_CLASS_CHAOS    = $0003; // 3
  406.   {$EXTERNALSYM DNS_CLASS_CHAOS}
  407.   DNS_CLASS_HESIOD   = $0004; // 4
  408.   {$EXTERNALSYM DNS_CLASS_HESIOD}
  409.   DNS_CLASS_NONE     = $00fe; // 254
  410.   {$EXTERNALSYM DNS_CLASS_NONE}
  411.   DNS_CLASS_ALL      = $00ff; // 255
  412.   {$EXTERNALSYM DNS_CLASS_ALL}
  413.   DNS_CLASS_ANY      = $00ff; // 255
  414.   {$EXTERNALSYM DNS_CLASS_ANY}
  415.   DNS_RCLASS_INTERNET = $0100; // 1
  416.   {$EXTERNALSYM DNS_RCLASS_INTERNET}
  417.   DNS_RCLASS_CSNET    = $0200; // 2
  418.   {$EXTERNALSYM DNS_RCLASS_CSNET}
  419.   DNS_RCLASS_CHAOS    = $0300; // 3
  420.   {$EXTERNALSYM DNS_RCLASS_CHAOS}
  421.   DNS_RCLASS_HESIOD   = $0400; // 4
  422.   {$EXTERNALSYM DNS_RCLASS_HESIOD}
  423.   DNS_RCLASS_NONE     = $fe00; // 254
  424.   {$EXTERNALSYM DNS_RCLASS_NONE}
  425.   DNS_RCLASS_ALL      = $ff00; // 255
  426.   {$EXTERNALSYM DNS_RCLASS_ALL}
  427.   DNS_RCLASS_ANY      = $ff00; // 255
  428.   {$EXTERNALSYM DNS_RCLASS_ANY}
  429. //
  430. //  DNS Record Types
  431. //
  432. //  _TYPE_ defines are in host byte order.
  433. //  _RTYPE_ defines are in net byte order.
  434. //
  435. //  Generally always deal with types in host byte order as we index
  436. //  resource record functions by type.
  437. //
  438.   DNS_TYPE_ZERO = $0000;
  439.   {$EXTERNALSYM DNS_TYPE_ZERO}
  440. //  RFC 1034/1035
  441.   DNS_TYPE_A     = $0001; // 1
  442.   {$EXTERNALSYM DNS_TYPE_A}
  443.   DNS_TYPE_NS    = $0002; // 2
  444.   {$EXTERNALSYM DNS_TYPE_NS}
  445.   DNS_TYPE_MD    = $0003; // 3
  446.   {$EXTERNALSYM DNS_TYPE_MD}
  447.   DNS_TYPE_MF    = $0004; // 4
  448.   {$EXTERNALSYM DNS_TYPE_MF}
  449.   DNS_TYPE_CNAME = $0005; // 5
  450.   {$EXTERNALSYM DNS_TYPE_CNAME}
  451.   DNS_TYPE_SOA   = $0006; // 6
  452.   {$EXTERNALSYM DNS_TYPE_SOA}
  453.   DNS_TYPE_MB    = $0007; // 7
  454.   {$EXTERNALSYM DNS_TYPE_MB}
  455.   DNS_TYPE_MG    = $0008; // 8
  456.   {$EXTERNALSYM DNS_TYPE_MG}
  457.   DNS_TYPE_MR    = $0009; // 9
  458.   {$EXTERNALSYM DNS_TYPE_MR}
  459.   DNS_TYPE_NULL  = $000a; // 10
  460.   {$EXTERNALSYM DNS_TYPE_NULL}
  461.   DNS_TYPE_WKS   = $000b; // 11
  462.   {$EXTERNALSYM DNS_TYPE_WKS}
  463.   DNS_TYPE_PTR   = $000c; // 12
  464.   {$EXTERNALSYM DNS_TYPE_PTR}
  465.   DNS_TYPE_HINFO = $000d; // 13
  466.   {$EXTERNALSYM DNS_TYPE_HINFO}
  467.   DNS_TYPE_MINFO = $000e; // 14
  468.   {$EXTERNALSYM DNS_TYPE_MINFO}
  469.   DNS_TYPE_MX    = $000f; // 15
  470.   {$EXTERNALSYM DNS_TYPE_MX}
  471.   DNS_TYPE_TEXT  = $0010; // 16
  472.   {$EXTERNALSYM DNS_TYPE_TEXT}
  473. //  RFC 1183
  474.   DNS_TYPE_RP    = $0011; // 17
  475.   {$EXTERNALSYM DNS_TYPE_RP}
  476.   DNS_TYPE_AFSDB = $0012; // 18
  477.   {$EXTERNALSYM DNS_TYPE_AFSDB}
  478.   DNS_TYPE_X25   = $0013; // 19
  479.   {$EXTERNALSYM DNS_TYPE_X25}
  480.   DNS_TYPE_ISDN  = $0014; // 20
  481.   {$EXTERNALSYM DNS_TYPE_ISDN}
  482.   DNS_TYPE_RT    = $0015; // 21
  483.   {$EXTERNALSYM DNS_TYPE_RT}
  484. //  RFC 1348
  485.   DNS_TYPE_NSAP    = $0016; // 22
  486.   {$EXTERNALSYM DNS_TYPE_NSAP}
  487.   DNS_TYPE_NSAPPTR = $0017; // 23
  488.   {$EXTERNALSYM DNS_TYPE_NSAPPTR}
  489. //  RFC 2065    (DNS security)
  490.   DNS_TYPE_SIG = $0018; // 24
  491.   {$EXTERNALSYM DNS_TYPE_SIG}
  492.   DNS_TYPE_KEY = $0019; // 25
  493.   {$EXTERNALSYM DNS_TYPE_KEY}
  494. //  RFC 1664    (X.400 mail)
  495.   DNS_TYPE_PX = $001a; // 26
  496.   {$EXTERNALSYM DNS_TYPE_PX}
  497. //  RFC 1712    (Geographic position)
  498.   DNS_TYPE_GPOS = $001b; // 27
  499.   {$EXTERNALSYM DNS_TYPE_GPOS}
  500. //  RFC 1886    (IPv6 Address)
  501.   DNS_TYPE_AAAA = $001c; // 28
  502.   {$EXTERNALSYM DNS_TYPE_AAAA}
  503. //  RFC 1876    (Geographic location)
  504.   DNS_TYPE_LOC = $001d; // 29
  505.   {$EXTERNALSYM DNS_TYPE_LOC}
  506. //  RFC 2065    (Secure negative response)
  507.   DNS_TYPE_NXT = $001e; // 30
  508.   {$EXTERNALSYM DNS_TYPE_NXT}
  509. //  Patton      (Endpoint Identifier)
  510.   DNS_TYPE_EID = $001f; // 31
  511.   {$EXTERNALSYM DNS_TYPE_EID}
  512. //  Patton      (Nimrod Locator)
  513.   DNS_TYPE_NIMLOC = $0020; // 32
  514.   {$EXTERNALSYM DNS_TYPE_NIMLOC}
  515. //  RFC 2052    (Service location)
  516.   DNS_TYPE_SRV = $0021; // 33
  517.   {$EXTERNALSYM DNS_TYPE_SRV}
  518. //  ATM Standard something-or-another (ATM Address)
  519.   DNS_TYPE_ATMA = $0022; // 34
  520.   {$EXTERNALSYM DNS_TYPE_ATMA}
  521. //  RFC 2168    (Naming Authority Pointer)
  522.   DNS_TYPE_NAPTR = $0023; // 35
  523.   {$EXTERNALSYM DNS_TYPE_NAPTR}
  524. //  RFC 2230    (Key Exchanger)
  525.   DNS_TYPE_KX = $0024; // 36
  526.   {$EXTERNALSYM DNS_TYPE_KX}
  527. //  RFC 2538    (CERT)
  528.   DNS_TYPE_CERT = $0025; // 37
  529.   {$EXTERNALSYM DNS_TYPE_CERT}
  530. //  A6 Draft    (A6)
  531.   DNS_TYPE_A6 = $0026; // 38
  532.   {$EXTERNALSYM DNS_TYPE_A6}
  533. //  DNAME Draft (DNAME)
  534.   DNS_TYPE_DNAME = $0027; // 39
  535.   {$EXTERNALSYM DNS_TYPE_DNAME}
  536. //  Eastlake    (Kitchen Sink)
  537.   DNS_TYPE_SINK = $0028; // 40
  538.   {$EXTERNALSYM DNS_TYPE_SINK}
  539. //  RFC 2671    (EDNS OPT)
  540.   DNS_TYPE_OPT = $0029; // 41
  541.   {$EXTERNALSYM DNS_TYPE_OPT}
  542. //
  543. //  IANA Reserved
  544. //
  545.   DNS_TYPE_UINFO  = $0064; // 100
  546.   {$EXTERNALSYM DNS_TYPE_UINFO}
  547.   DNS_TYPE_UID    = $0065; // 101
  548.   {$EXTERNALSYM DNS_TYPE_UID}
  549.   DNS_TYPE_GID    = $0066; // 102
  550.   {$EXTERNALSYM DNS_TYPE_GID}
  551.   DNS_TYPE_UNSPEC = $0067; // 103
  552.   {$EXTERNALSYM DNS_TYPE_UNSPEC}
  553. //
  554. //  Query only types (1035, 1995)
  555. //      - Crawford      (ADDRS)
  556. //      - TKEY draft    (TKEY)
  557. //      - TSIG draft    (TSIG)
  558. //      - RFC 1995      (IXFR)
  559. //      - RFC 1035      (AXFR up)
  560. //
  561.   DNS_TYPE_ADDRS = $00f8; // 248
  562.   {$EXTERNALSYM DNS_TYPE_ADDRS}
  563.   DNS_TYPE_TKEY  = $00f9; // 249
  564.   {$EXTERNALSYM DNS_TYPE_TKEY}
  565.   DNS_TYPE_TSIG  = $00fa; // 250
  566.   {$EXTERNALSYM DNS_TYPE_TSIG}
  567.   DNS_TYPE_IXFR  = $00fb; // 251
  568.   {$EXTERNALSYM DNS_TYPE_IXFR}
  569.   DNS_TYPE_AXFR  = $00fc; // 252
  570.   {$EXTERNALSYM DNS_TYPE_AXFR}
  571.   DNS_TYPE_MAILB = $00fd; // 253
  572.   {$EXTERNALSYM DNS_TYPE_MAILB}
  573.   DNS_TYPE_MAILA = $00fe; // 254
  574.   {$EXTERNALSYM DNS_TYPE_MAILA}
  575.   DNS_TYPE_ALL   = $00ff; // 255
  576.   {$EXTERNALSYM DNS_TYPE_ALL}
  577.   DNS_TYPE_ANY   = $00ff; // 255
  578.   {$EXTERNALSYM DNS_TYPE_ANY}
  579. //
  580. //  Temp Microsoft types -- use until get IANA approval for real type
  581. //
  582.   DNS_TYPE_WINS   = $ff01; // 64K - 255
  583.   {$EXTERNALSYM DNS_TYPE_WINS}
  584.   DNS_TYPE_WINSR  = $ff02; // 64K - 254
  585.   {$EXTERNALSYM DNS_TYPE_WINSR}
  586.   DNS_TYPE_NBSTAT = (DNS_TYPE_WINSR);
  587.   {$EXTERNALSYM DNS_TYPE_NBSTAT}
  588. //
  589. //  DNS Record Types -- Net Byte Order
  590. //
  591.   DNS_RTYPE_A       = $0100; // 1
  592.   {$EXTERNALSYM DNS_RTYPE_A}
  593.   DNS_RTYPE_NS      = $0200; // 2
  594.   {$EXTERNALSYM DNS_RTYPE_NS}
  595.   DNS_RTYPE_MD      = $0300; // 3
  596.   {$EXTERNALSYM DNS_RTYPE_MD}
  597.   DNS_RTYPE_MF      = $0400; // 4
  598.   {$EXTERNALSYM DNS_RTYPE_MF}
  599.   DNS_RTYPE_CNAME   = $0500; // 5
  600.   {$EXTERNALSYM DNS_RTYPE_CNAME}
  601.   DNS_RTYPE_SOA     = $0600; // 6
  602.   {$EXTERNALSYM DNS_RTYPE_SOA}
  603.   DNS_RTYPE_MB      = $0700; // 7
  604.   {$EXTERNALSYM DNS_RTYPE_MB}
  605.   DNS_RTYPE_MG      = $0800; // 8
  606.   {$EXTERNALSYM DNS_RTYPE_MG}
  607.   DNS_RTYPE_MR      = $0900; // 9
  608.   {$EXTERNALSYM DNS_RTYPE_MR}
  609.   DNS_RTYPE_NULL    = $0a00; // 10
  610.   {$EXTERNALSYM DNS_RTYPE_NULL}
  611.   DNS_RTYPE_WKS     = $0b00; // 11
  612.   {$EXTERNALSYM DNS_RTYPE_WKS}
  613.   DNS_RTYPE_PTR     = $0c00; // 12
  614.   {$EXTERNALSYM DNS_RTYPE_PTR}
  615.   DNS_RTYPE_HINFO   = $0d00; // 13
  616.   {$EXTERNALSYM DNS_RTYPE_HINFO}
  617.   DNS_RTYPE_MINFO   = $0e00; // 14
  618.   {$EXTERNALSYM DNS_RTYPE_MINFO}
  619.   DNS_RTYPE_MX      = $0f00; // 15
  620.   {$EXTERNALSYM DNS_RTYPE_MX}
  621.   DNS_RTYPE_TEXT    = $1000; // 16
  622.   {$EXTERNALSYM DNS_RTYPE_TEXT}
  623.   DNS_RTYPE_RP      = $1100; // 17
  624.   {$EXTERNALSYM DNS_RTYPE_RP}
  625.   DNS_RTYPE_AFSDB   = $1200; // 18
  626.   {$EXTERNALSYM DNS_RTYPE_AFSDB}
  627.   DNS_RTYPE_X25     = $1300; // 19
  628.   {$EXTERNALSYM DNS_RTYPE_X25}
  629.   DNS_RTYPE_ISDN    = $1400; // 20
  630.   {$EXTERNALSYM DNS_RTYPE_ISDN}
  631.   DNS_RTYPE_RT      = $1500; // 21
  632.   {$EXTERNALSYM DNS_RTYPE_RT}
  633.   DNS_RTYPE_NSAP    = $1600; // 22
  634.   {$EXTERNALSYM DNS_RTYPE_NSAP}
  635.   DNS_RTYPE_NSAPPTR = $1700; // 23
  636.   {$EXTERNALSYM DNS_RTYPE_NSAPPTR}
  637.   DNS_RTYPE_SIG     = $1800; // 24
  638.   {$EXTERNALSYM DNS_RTYPE_SIG}
  639.   DNS_RTYPE_KEY     = $1900; // 25
  640.   {$EXTERNALSYM DNS_RTYPE_KEY}
  641.   DNS_RTYPE_PX      = $1a00; // 26
  642.   {$EXTERNALSYM DNS_RTYPE_PX}
  643.   DNS_RTYPE_GPOS    = $1b00; // 27
  644.   {$EXTERNALSYM DNS_RTYPE_GPOS}
  645.   DNS_RTYPE_AAAA    = $1c00; // 28
  646.   {$EXTERNALSYM DNS_RTYPE_AAAA}
  647.   DNS_RTYPE_LOC     = $1d00; // 29
  648.   {$EXTERNALSYM DNS_RTYPE_LOC}
  649.   DNS_RTYPE_NXT     = $1e00; // 30
  650.   {$EXTERNALSYM DNS_RTYPE_NXT}
  651.   DNS_RTYPE_EID     = $1f00; // 31
  652.   {$EXTERNALSYM DNS_RTYPE_EID}
  653.   DNS_RTYPE_NIMLOC  = $2000; // 32
  654.   {$EXTERNALSYM DNS_RTYPE_NIMLOC}
  655.   DNS_RTYPE_SRV     = $2100; // 33
  656.   {$EXTERNALSYM DNS_RTYPE_SRV}
  657.   DNS_RTYPE_ATMA    = $2200; // 34
  658.   {$EXTERNALSYM DNS_RTYPE_ATMA}
  659.   DNS_RTYPE_NAPTR   = $2300; // 35
  660.   {$EXTERNALSYM DNS_RTYPE_NAPTR}
  661.   DNS_RTYPE_KX      = $2400; // 36
  662.   {$EXTERNALSYM DNS_RTYPE_KX}
  663.   DNS_RTYPE_CERT    = $2500; // 37
  664.   {$EXTERNALSYM DNS_RTYPE_CERT}
  665.   DNS_RTYPE_A6      = $2600; // 38
  666.   {$EXTERNALSYM DNS_RTYPE_A6}
  667.   DNS_RTYPE_DNAME   = $2700; // 39
  668.   {$EXTERNALSYM DNS_RTYPE_DNAME}
  669.   DNS_RTYPE_SINK    = $2800; // 40
  670.   {$EXTERNALSYM DNS_RTYPE_SINK}
  671.   DNS_RTYPE_OPT     = $2900; // 41
  672.   {$EXTERNALSYM DNS_RTYPE_OPT}
  673. //
  674. //  IANA Reserved
  675. //
  676.   DNS_RTYPE_UINFO  = $6400; // 100
  677.   {$EXTERNALSYM DNS_RTYPE_UINFO}
  678.   DNS_RTYPE_UID    = $6500; // 101
  679.   {$EXTERNALSYM DNS_RTYPE_UID}
  680.   DNS_RTYPE_GID    = $6600; // 102
  681.   {$EXTERNALSYM DNS_RTYPE_GID}
  682.   DNS_RTYPE_UNSPEC = $6700; // 103
  683.   {$EXTERNALSYM DNS_RTYPE_UNSPEC}
  684. //
  685. //  Query only types
  686. //
  687.   DNS_RTYPE_TKEY  = $f900; // 249
  688.   {$EXTERNALSYM DNS_RTYPE_TKEY}
  689.   DNS_RTYPE_TSIG  = $fa00; // 250
  690.   {$EXTERNALSYM DNS_RTYPE_TSIG}
  691.   DNS_RTYPE_IXFR  = $fb00; // 251
  692.   {$EXTERNALSYM DNS_RTYPE_IXFR}
  693.   DNS_RTYPE_AXFR  = $fc00; // 252
  694.   {$EXTERNALSYM DNS_RTYPE_AXFR}
  695.   DNS_RTYPE_MAILB = $fd00; // 253
  696.   {$EXTERNALSYM DNS_RTYPE_MAILB}
  697.   DNS_RTYPE_MAILA = $fe00; // 254
  698.   {$EXTERNALSYM DNS_RTYPE_MAILA}
  699.   DNS_RTYPE_ALL   = $ff00; // 255
  700.   {$EXTERNALSYM DNS_RTYPE_ALL}
  701.   DNS_RTYPE_ANY   = $ff00; // 255
  702.   {$EXTERNALSYM DNS_RTYPE_ANY}
  703. //
  704. //  Temp Microsoft types -- use until get IANA approval for real type
  705. //
  706.   DNS_RTYPE_WINS  = $01ff; // 64K - 255
  707.   {$EXTERNALSYM DNS_RTYPE_WINS}
  708.   DNS_RTYPE_WINSR = $02ff; // 64K - 254
  709.   {$EXTERNALSYM DNS_RTYPE_WINSR}
  710. //
  711. //  Record type specific definitions
  712. //
  713. //
  714. //  ATMA (ATM address type) formats
  715. //
  716. //  Define these directly for any environment (ex NT4)
  717. //  without winsock2 ATM support (ws2atm.h)
  718. //
  719. {$IFNDEF ATMA_E164}
  720.   DNS_ATMA_FORMAT_E164     = 1;
  721.   {$EXTERNALSYM DNS_ATMA_FORMAT_E164}
  722.   DNS_ATMA_FORMAT_AESA     = 2;
  723.   {$EXTERNALSYM DNS_ATMA_FORMAT_AESA}
  724.   DNS_ATMA_MAX_ADDR_LENGTH = (20);
  725.   {$EXTERNALSYM DNS_ATMA_MAX_ADDR_LENGTH}
  726. {$ELSE}
  727.   DNS_ATMA_FORMAT_E164     = ATM_E164;
  728.   {$EXTERNALSYM DNS_ATMA_FORMAT_E164}
  729.   DNS_ATMA_FORMAT_AESA     = ATM_AESA;
  730.   {$EXTERNALSYM DNS_ATMA_FORMAT_AESA}
  731.   DNS_ATMA_MAX_ADDR_LENGTH = ATM_ADDR_SIZE;
  732.   {$EXTERNALSYM DNS_ATMA_MAX_ADDR_LENGTH}
  733. {$ENDIF}
  734.   DNS_ATMA_AESA_ADDR_LENGTH  = (20);
  735.   {$EXTERNALSYM DNS_ATMA_AESA_ADDR_LENGTH}
  736.   DNS_ATMA_MAX_RECORD_LENGTH = (DNS_ATMA_MAX_ADDR_LENGTH+1);
  737.   {$EXTERNALSYM DNS_ATMA_MAX_RECORD_LENGTH}
  738. //
  739. //  DNSSEC defs
  740. //
  741. //  DNSSEC algorithms
  742.   DNSSEC_ALGORITHM_RSAMD5  = 1;
  743.   {$EXTERNALSYM DNSSEC_ALGORITHM_RSAMD5}
  744.   DNSSEC_ALGORITHM_NULL    = 253;
  745.   {$EXTERNALSYM DNSSEC_ALGORITHM_NULL}
  746.   DNSSEC_ALGORITHM_PRIVATE = 254;
  747.   {$EXTERNALSYM DNSSEC_ALGORITHM_PRIVATE}
  748. //  DNSSEC KEY protocol table
  749.   DNSSEC_PROTOCOL_NONE   = 0;
  750.   {$EXTERNALSYM DNSSEC_PROTOCOL_NONE}
  751.   DNSSEC_PROTOCOL_TLS    = 1;
  752.   {$EXTERNALSYM DNSSEC_PROTOCOL_TLS}
  753.   DNSSEC_PROTOCOL_EMAIL  = 2;
  754.   {$EXTERNALSYM DNSSEC_PROTOCOL_EMAIL}
  755.   DNSSEC_PROTOCOL_DNSSEC = 3;
  756.   {$EXTERNALSYM DNSSEC_PROTOCOL_DNSSEC}
  757.   DNSSEC_PROTOCOL_IPSEC  = 4;
  758.   {$EXTERNALSYM DNSSEC_PROTOCOL_IPSEC}
  759. //  DNSSEC KEY flag field
  760.   DNSSEC_KEY_FLAG_NOAUTH = $0001;
  761.   {$EXTERNALSYM DNSSEC_KEY_FLAG_NOAUTH}
  762.   DNSSEC_KEY_FLAG_NOCONF = $0002;
  763.   {$EXTERNALSYM DNSSEC_KEY_FLAG_NOCONF}
  764.   DNSSEC_KEY_FLAG_FLAG2  = $0004;
  765.   {$EXTERNALSYM DNSSEC_KEY_FLAG_FLAG2}
  766.   DNSSEC_KEY_FLAG_EXTEND = $0008;
  767.   {$EXTERNALSYM DNSSEC_KEY_FLAG_EXTEND}
  768. {$DEFINE DNSSEC_KEY_FLAG_}
  769.   DNSSEC_KEY_FLAG_FLAG4 = $0010;
  770.   {$EXTERNALSYM DNSSEC_KEY_FLAG_FLAG4}
  771.   DNSSEC_KEY_FLAG_FLAG5 = $0020;
  772.   {$EXTERNALSYM DNSSEC_KEY_FLAG_FLAG5}
  773. // bits 6,7 are name type
  774.   DNSSEC_KEY_FLAG_USER  = $0000;
  775.   {$EXTERNALSYM DNSSEC_KEY_FLAG_USER}
  776.   DNSSEC_KEY_FLAG_ZONE  = $0040;
  777.   {$EXTERNALSYM DNSSEC_KEY_FLAG_ZONE}
  778.   DNSSEC_KEY_FLAG_HOST  = $0080;
  779.   {$EXTERNALSYM DNSSEC_KEY_FLAG_HOST}
  780.   DNSSEC_KEY_FLAG_NTPE3 = $00c0;
  781.   {$EXTERNALSYM DNSSEC_KEY_FLAG_NTPE3}
  782. // bits 8-11 are reserved for future use
  783.   DNSSEC_KEY_FLAG_FLAG8  = $0100;
  784.   {$EXTERNALSYM DNSSEC_KEY_FLAG_FLAG8}
  785.   DNSSEC_KEY_FLAG_FLAG9  = $0200;
  786.   {$EXTERNALSYM DNSSEC_KEY_FLAG_FLAG9}
  787.   DNSSEC_KEY_FLAG_FLAG10 = $0400;
  788.   {$EXTERNALSYM DNSSEC_KEY_FLAG_FLAG10}
  789.   DNSSEC_KEY_FLAG_FLAG11 = $0800;
  790.   {$EXTERNALSYM DNSSEC_KEY_FLAG_FLAG11}
  791. // bits 12-15 are sig field
  792.   DNSSEC_KEY_FLAG_SIG0  = $0000;
  793.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG0}
  794.   DNSSEC_KEY_FLAG_SIG1  = $1000;
  795.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG1}
  796.   DNSSEC_KEY_FLAG_SIG2  = $2000;
  797.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG2}
  798.   DNSSEC_KEY_FLAG_SIG3  = $3000;
  799.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG3}
  800.   DNSSEC_KEY_FLAG_SIG4  = $4000;
  801.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG4}
  802.   DNSSEC_KEY_FLAG_SIG5  = $5000;
  803.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG5}
  804.   DNSSEC_KEY_FLAG_SIG6  = $6000;
  805.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG6}
  806.   DNSSEC_KEY_FLAG_SIG7  = $7000;
  807.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG7}
  808.   DNSSEC_KEY_FLAG_SIG8  = $8000;
  809.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG8}
  810.   DNSSEC_KEY_FLAG_SIG9  = $9000;
  811.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG9}
  812.   DNSSEC_KEY_FLAG_SIG10 = $a000;
  813.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG10}
  814.   DNSSEC_KEY_FLAG_SIG11 = $b000;
  815.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG11}
  816.   DNSSEC_KEY_FLAG_SIG12 = $c000;
  817.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG12}
  818.   DNSSEC_KEY_FLAG_SIG13 = $d000;
  819.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG13}
  820.   DNSSEC_KEY_FLAG_SIG14 = $e000;
  821.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG14}
  822.   DNSSEC_KEY_FLAG_SIG15 = $f000;
  823.   {$EXTERNALSYM DNSSEC_KEY_FLAG_SIG15}
  824. //
  825. //  TKEY modes
  826. //
  827.   DNS_TKEY_MODE_SERVER_ASSIGN   = 1;
  828.   {$EXTERNALSYM DNS_TKEY_MODE_SERVER_ASSIGN}
  829.   DNS_TKEY_MODE_DIFFIE_HELLMAN  = 2;
  830.   {$EXTERNALSYM DNS_TKEY_MODE_DIFFIE_HELLMAN}
  831.   DNS_TKEY_MODE_GSS             = 3;
  832.   {$EXTERNALSYM DNS_TKEY_MODE_GSS}
  833.   DNS_TKEY_MODE_RESOLVER_ASSIGN = 4;
  834.   {$EXTERNALSYM DNS_TKEY_MODE_RESOLVER_ASSIGN}
  835. //
  836. //  WINS + NBSTAT flag field
  837. //
  838.   DNS_WINS_FLAG_SCOPE = DWORD($80000000);
  839.   {$EXTERNALSYM DNS_WINS_FLAG_SCOPE}
  840.   DNS_WINS_FLAG_LOCAL = ($00010000);
  841.   {$EXTERNALSYM DNS_WINS_FLAG_LOCAL}
  842. //
  843. //  Helpful checks
  844. //
  845. function IS_WORD_ALIGNED(P: Pointer): BOOL;
  846. {$EXTERNALSYM IS_DWORD_ALIGNED}
  847. function IS_DWORD_ALIGNED(P: Pointer): BOOL;
  848. {$EXTERNALSYM IS_DWORD_ALIGNED}
  849. function IS_QWORD_ALIGNED(P: Pointer): BOOL;
  850. {$EXTERNALSYM IS_QWORD_ALIGNED}
  851. //
  852. //  DNS config API
  853. //
  854. //
  855. //  Types of DNS configuration info
  856. //
  857. type
  858.   DNS_CONFIG_TYPE = (
  859.     //  In Win2K
  860.     DnsConfigPrimaryDomainName_W,
  861.     DnsConfigPrimaryDomainName_A,
  862.     DnsConfigPrimaryDomainName_UTF8,
  863.     //  Not available yet
  864.     DnsConfigAdapterDomainName_W,
  865.     DnsConfigAdapterDomainName_A,
  866.     DnsConfigAdapterDomainName_UTF8,
  867.     //  In Win2K
  868.     DnsConfigDnsServerList,
  869.     //  Not available yet
  870.     DnsConfigSearchList,
  871.     DnsConfigAdapterInfo,
  872.     //  In Win2K
  873.     DnsConfigPrimaryHostNameRegistrationEnabled,
  874.     DnsConfigAdapterHostNameRegistrationEnabled,
  875.     DnsConfigAddressRegistrationMaxCount,
  876.     //  In WindowsXP
  877.     DnsConfigHostName_W,
  878.     DnsConfigHostName_A,
  879.     DnsConfigHostName_UTF8,
  880.     DnsConfigFullHostName_W,
  881.     DnsConfigFullHostName_A,
  882.     DnsConfigFullHostName_UTF8);
  883.   {$EXTERNALSYM DNS_CONFIG_TYPE}
  884.   TDnsConfigType = DNS_CONFIG_TYPE;
  885. //
  886. //  Config API flags
  887. //
  888. //
  889. //  Causes config info to be allocated with LocalAlloc()
  890. //
  891. const
  892.   DNS_CONFIG_FLAG_ALLOC = ($00000001);
  893.   {$EXTERNALSYM DNS_CONFIG_FLAG_ALLOC}
  894. function DnsQueryConfig(Config: DNS_CONFIG_TYPE; Flag: DWORD; pwsAdapterName: PWSTR; pReserved, pBuffer: PVOID; pBufferLength: PDWORD): DNS_STATUS; stdcall;
  895. {$EXTERNALSYM DnsQueryConfig}
  896. //
  897. //  DNS resource record structure
  898. //
  899. //
  900. //  Record data for specific types
  901. //
  902. type
  903.   PDNS_A_DATA = ^DNS_A_DATA;
  904.   {$EXTERNALSYM PDNS_A_DATA}
  905.   DNS_A_DATA = record
  906.     IpAddress: IP4_ADDRESS;
  907.   end;
  908.   {$EXTERNALSYM DNS_A_DATA}
  909.   TDnsAData = DNS_A_DATA;
  910.   PDnsAData = PDNS_A_DATA;
  911.   PDNS_PTR_DATA = ^DNS_PTR_DATA;
  912.   {$EXTERNALSYM PDNS_PTR_DATA}
  913.   DNS_PTR_DATA = record
  914.     pNameHost: LPTSTR;
  915.   end;
  916.   {$EXTERNALSYM DNS_PTR_DATA}
  917.   TDnsPtrData = DNS_PTR_DATA;
  918.   PDnsPtrData = PDNS_PTR_DATA;
  919.   PDNS_SOA_DATA = ^DNS_SOA_DATA;
  920.   {$EXTERNALSYM PDNS_SOA_DATA}
  921.   DNS_SOA_DATA = record
  922.     pNamePrimaryServer: LPTSTR;
  923.     pNameAdministrator: LPTSTR;
  924.     dwSerialNo: DWORD;
  925.     dwRefresh: DWORD;
  926.     dwRetry: DWORD;
  927.     dwExpire: DWORD;
  928.     dwDefaultTtl: DWORD;
  929.   end;
  930.   {$EXTERNALSYM DNS_SOA_DATA}
  931.   TDnsSoaData = DNS_SOA_DATA;
  932.   PDnsSoaData = PDNS_SOA_DATA;
  933.   PDNS_MINFO_DATA = ^DNS_MINFO_DATA;
  934.   {$EXTERNALSYM PDNS_MINFO_DATA}
  935.   DNS_MINFO_DATA = record
  936.     pNameMailbox: LPTSTR;
  937.     pNameErrorsMailbox: LPTSTR;
  938.   end;
  939.   {$EXTERNALSYM DNS_MINFO_DATA}
  940.   TDnsMinfoData = DNS_MINFO_DATA;
  941.   PDnsMinfoData = PDNS_MINFO_DATA;
  942.   PDNS_MX_DATA = ^DNS_MX_DATA;
  943.   {$EXTERNALSYM PDNS_MX_DATA}
  944.   DNS_MX_DATA = record
  945.     pNameExchange: LPTSTR;
  946.     wPreference: WORD;
  947.     Pad: WORD; // keep ptrs DWORD aligned
  948.   end;
  949.   {$EXTERNALSYM DNS_MX_DATA}
  950.   TDnsMxData = DNS_MX_DATA;
  951.   PDnsMxData = PDNS_MX_DATA;
  952.   PDNS_TXT_DATA = ^DNS_TXT_DATA;
  953.   {$EXTERNALSYM PDNS_TXT_DATA}
  954.   DNS_TXT_DATA = record
  955.     dwStringCount: DWORD;
  956.     pStringArray: array [0..0] of LPTSTR;
  957.   end;
  958.   {$EXTERNALSYM DNS_TXT_DATA}
  959.   TDnsTxtData = DNS_TXT_DATA;
  960.   PDnsTxtData = PDNS_TXT_DATA;
  961.   PDNS_NULL_DATA = ^DNS_NULL_DATA;
  962.   {$EXTERNALSYM PDNS_NULL_DATA}
  963.   DNS_NULL_DATA = record
  964.     dwByteCount: DWORD;
  965.     Data: array [0..0] of BYTE;
  966.   end;
  967.   {$EXTERNALSYM DNS_NULL_DATA}
  968.   TDnsNullData = DNS_NULL_DATA;
  969.   PDnsNullData = PDNS_NULL_DATA;
  970.   PDNS_WKS_DATA = ^DNS_WKS_DATA;
  971.   {$EXTERNALSYM PDNS_WKS_DATA}
  972.   DNS_WKS_DATA = record
  973.     IpAddress: IP4_ADDRESS;
  974.     chProtocol: UCHAR;
  975.     BitMask: array [0..0] of BYTE;
  976.   end;
  977.   {$EXTERNALSYM DNS_WKS_DATA}
  978.   TDnsWksData = DNS_WKS_DATA;
  979.   PDnsWksData = PDNS_WKS_DATA;
  980.   PDNS_AAAA_DATA = ^DNS_AAAA_DATA;
  981.   {$EXTERNALSYM PDNS_AAAA_DATA}
  982.   DNS_AAAA_DATA = record
  983.     Ip6Address: DNS_IP6_ADDRESS;
  984.   end;
  985.   {$EXTERNALSYM DNS_AAAA_DATA}
  986.   TDnsAaaaData = DNS_AAAA_DATA;
  987.   PDnsAaaaData = PDNS_AAAA_DATA;
  988.   PDNS_SIG_DATA = ^DNS_SIG_DATA;
  989.   {$EXTERNALSYM PDNS_SIG_DATA}
  990.   DNS_SIG_DATA = record
  991.     pNameSigner: LPTSTR;
  992.     wTypeCovered: WORD;
  993.     chAlgorithm: BYTE;
  994.     chLabelCount: BYTE;
  995.     dwOriginalTtl: DWORD;
  996.     dwExpiration: DWORD;
  997.     dwTimeSigned: DWORD;
  998.     wKeyTag: WORD;
  999.     Pad: WORD; // keep byte field aligned
  1000.     Signature: array [0..0] of BYTE;
  1001.   end;
  1002.   {$EXTERNALSYM DNS_SIG_DATA}
  1003.   TDnsSigData = DNS_SIG_DATA;
  1004.   PDnsSigData = PDNS_SIG_DATA;
  1005.   PDNS_KEY_DATA = ^DNS_KEY_DATA;
  1006.   {$EXTERNALSYM PDNS_KEY_DATA}
  1007.   DNS_KEY_DATA = record
  1008.     wFlags: WORD;
  1009.     chProtocol: BYTE;
  1010.     chAlgorithm: BYTE;
  1011.     Key: array [0..1 - 1] of BYTE;
  1012.   end;
  1013.   {$EXTERNALSYM DNS_KEY_DATA}
  1014.   TDnsKeyData = DNS_KEY_DATA;
  1015.   PDnsKeyData = PDNS_KEY_DATA;
  1016.   PDNS_LOC_DATA = ^DNS_LOC_DATA;
  1017.   {$EXTERNALSYM PDNS_LOC_DATA}
  1018.   DNS_LOC_DATA = record
  1019.     wVersion: WORD;
  1020.     wSize: WORD;
  1021.     wHorPrec: WORD;
  1022.     wVerPrec: WORD;
  1023.     dwLatitude: DWORD;
  1024.     dwLongitude: DWORD;
  1025.     dwAltitude: DWORD;
  1026.   end;
  1027.   {$EXTERNALSYM DNS_LOC_DATA}
  1028.   TDnsLocData = DNS_LOC_DATA;
  1029.   PDnsLocData = PDNS_LOC_DATA;
  1030.   PDNS_NXT_DATA = ^DNS_NXT_DATA;
  1031.   {$EXTERNALSYM PDNS_NXT_DATA}
  1032.   DNS_NXT_DATA = record
  1033.     pNameNext: LPTSTR;
  1034.     wNumTypes: WORD;
  1035.     wTypes: array [0..0] of WORD;
  1036.   end;
  1037.   {$EXTERNALSYM DNS_NXT_DATA}
  1038.   TDnsNxtData = DNS_NXT_DATA;
  1039.   PDnsNxtData = PDNS_NXT_DATA;
  1040.   PDNS_SRV_DATA = ^DNS_SRV_DATA;
  1041.   {$EXTERNALSYM PDNS_SRV_DATA}
  1042.   DNS_SRV_DATA = record
  1043.     pNameTarget: LPTSTR;
  1044.     wPriority: WORD;
  1045.     wWeight: WORD;
  1046.     wPort: WORD;
  1047.     Pad: WORD; // keep ptrs DWORD aligned
  1048.   end;
  1049.   {$EXTERNALSYM DNS_SRV_DATA}
  1050.   TDnsSrvData = DNS_SRV_DATA;
  1051.   PDnsSrvData = PDNS_SRV_DATA;
  1052.   PDNS_ATMA_DATA = ^DNS_ATMA_DATA;
  1053.   {$EXTERNALSYM PDNS_ATMA_DATA}
  1054.   DNS_ATMA_DATA = record
  1055.     AddressType: BYTE;
  1056.     Address: array [0..DNS_ATMA_MAX_ADDR_LENGTH - 1] of BYTE;
  1057.     //  E164 -- Null terminated string of less than
  1058.     //      DNS_ATMA_MAX_ADDR_LENGTH
  1059.     //
  1060.     //  For NSAP (AESA) BCD encoding of exactly
  1061.     //      DNS_ATMA_AESA_ADDR_LENGTH
  1062.   end;
  1063.   {$EXTERNALSYM DNS_ATMA_DATA}
  1064.   TDnsAtmaData = DNS_ATMA_DATA;
  1065.   PDnsAtmaData = PDNS_ATMA_DATA;
  1066.   PDNS_TKEY_DATA = ^DNS_TKEY_DATA;
  1067.   {$EXTERNALSYM PDNS_TKEY_DATA}
  1068.   DNS_TKEY_DATA = record
  1069.     pNameAlgorithm: LPTSTR;
  1070.     pAlgorithmPacket: PBYTE;
  1071.     pKey: PBYTE;
  1072.     pOtherData: PBYTE;
  1073.     dwCreateTime: DWORD;
  1074.     dwExpireTime: DWORD;
  1075.     wMode: WORD;
  1076.     wError: WORD;
  1077.     wKeyLength: WORD;
  1078.     wOtherLength: WORD;
  1079.     cAlgNameLength: UCHAR;
  1080.     bPacketPointers: BOOL;
  1081.   end;
  1082.   {$EXTERNALSYM DNS_TKEY_DATA}
  1083.   TDnsTkeyData = DNS_TKEY_DATA;
  1084.   PDnsTkeyData = PDNS_TKEY_DATA;
  1085.   PDNS_TSIG_DATA = ^DNS_TSIG_DATA;
  1086.   {$EXTERNALSYM PDNS_TSIG_DATA}
  1087.   DNS_TSIG_DATA = record
  1088.     pNameAlgorithm: LPTSTR;
  1089.     pAlgorithmPacket: PBYTE;
  1090.     pSignature: PBYTE;
  1091.     pOtherData: PBYTE;
  1092.     i64CreateTime: LONGLONG;
  1093.     wFudgeTime: WORD;
  1094.     wOriginalXid: WORD;
  1095.     wError: WORD;
  1096.     wSigLength: WORD;
  1097.     wOtherLength: WORD;
  1098.     cAlgNameLength: UCHAR;
  1099.     bPacketPointers: BOOL;
  1100.   end;
  1101.   {$EXTERNALSYM DNS_TSIG_DATA}
  1102.   TDnsTsigData = DNS_TSIG_DATA;
  1103.   PDnsTsigData = PDNS_TSIG_DATA;
  1104. //
  1105. //  MS only types -- only hit the wire in MS-MS zone transfer
  1106. //
  1107.   PDNS_WINS_DATA = ^DNS_WINS_DATA;
  1108.   {$EXTERNALSYM PDNS_WINS_DATA}
  1109.   DNS_WINS_DATA = record
  1110.     dwMappingFlag: DWORD;
  1111.     dwLookupTimeout: DWORD;
  1112.     dwCacheTimeout: DWORD;
  1113.     cWinsServerCount: DWORD;
  1114.     WinsServers: array [0..0] of IP4_ADDRESS;
  1115.   end;
  1116.   {$EXTERNALSYM DNS_WINS_DATA}
  1117.   TDnsWinsData = DNS_WINS_DATA;
  1118.   PDnsWinsData = PDNS_WINS_DATA;
  1119.   PDNS_WINSR_DATA = ^DNS_WINSR_DATA;
  1120.   {$EXTERNALSYM PDNS_WINSR_DATA}
  1121.   DNS_WINSR_DATA = record
  1122.     dwMappingFlag: DWORD;
  1123.     dwLookupTimeout: DWORD;
  1124.     dwCacheTimeout: DWORD;
  1125.     pNameResultDomain: LPTSTR;
  1126.   end;
  1127.   {$EXTERNALSYM DNS_WINSR_DATA}
  1128.   TDnsWinsrData = DNS_WINSR_DATA;
  1129.   PDnsWinsrData = PDNS_WINSR_DATA;
  1130. //
  1131. //  Length of non-fixed-length data types
  1132. //
  1133. function DNS_TEXT_RECORD_LENGTH(StringCount: Integer): Integer;
  1134. {$EXTERNALSYM DNS_TEXT_RECORD_LENGTH}
  1135. function DNS_NULL_RECORD_LENGTH(ByteCount: Integer): Integer;
  1136. {$EXTERNALSYM DNS_NULL_RECORD_LENGTH}
  1137. function DNS_WKS_RECORD_LENGTH(ByteCount: Integer): Integer;
  1138. {$EXTERNALSYM DNS_WKS_RECORD_LENGTH}
  1139. //function DNS_WINS_RECORD_LENGTH(IpCount: Integer): Integer;
  1140. //{$EXTERNALSYM DNS_WINS_RECORD_LENGTH}
  1141. //
  1142. //  Record flags
  1143. //
  1144. type
  1145.   _DnsRecordFlags = record
  1146.     //DWORD   Section     : 2;
  1147.     //DWORD   Delete      : 1;
  1148.     //DWORD   CharSet     : 2;
  1149.     //DWORD   Unused      : 3;
  1150.     //DWORD   Reserved    : 24;
  1151.     Flags: DWORD;
  1152.   end;
  1153.   {$EXTERNALSYM _DnsRecordFlags}
  1154.   DNS_RECORD_FLAGS = _DnsRecordFlags;
  1155.   {$EXTERNALSYM DNS_RECORD_FLAGS}
  1156.   TDnsRecordFlags = DNS_RECORD_FLAGS;
  1157.   PDnsRecordFlags = ^DNS_RECORD_FLAGS;
  1158. //
  1159. //  Wire Record Sections
  1160. //
  1161. //  Useable both in record flags "Section" and as index into
  1162. //  wire message header section counts.
  1163. //
  1164.   _DnsSection = (
  1165.     DnsSectionQuestion,
  1166.     DnsSectionAnswer,
  1167.     DnsSectionAuthority,
  1168.     DnsSectionAddtional);
  1169.   {$EXTERNALSYM _DnsSection}
  1170.   DNS_SECTION = _DnsSection;
  1171.   TDnsSection = _DnsSection;
  1172. //  Update message section names
  1173. const
  1174.   DnsSectionZone   = DnsSectionQuestion;
  1175.   {$EXTERNALSYM DnsSectionZone}
  1176.   DnsSectionPrereq = DnsSectionAnswer;
  1177.   {$EXTERNALSYM DnsSectionPrereq}
  1178.   DnsSectionUpdate = DnsSectionAuthority;
  1179.   {$EXTERNALSYM DnsSectionUpdate}
  1180. //
  1181. //  Record flags as bit flags
  1182. //  These may be or'd together to set the fields
  1183. //
  1184. //  RR Section in packet
  1185.   DNSREC_SECTION = ($00000003);
  1186.   {$EXTERNALSYM DNSREC_SECTION}
  1187.   DNSREC_QUESTION   = ($00000000);
  1188.   {$EXTERNALSYM DNSREC_QUESTION}
  1189.   DNSREC_ANSWER     = ($00000001);
  1190.   {$EXTERNALSYM DNSREC_ANSWER}
  1191.   DNSREC_AUTHORITY  = ($00000002);
  1192.   {$EXTERNALSYM DNSREC_AUTHORITY}
  1193.   DNSREC_ADDITIONAL = ($00000003);
  1194.   {$EXTERNALSYM DNSREC_ADDITIONAL}
  1195. //  RR Section in packet (update)
  1196.   DNSREC_ZONE   = ($00000000);
  1197.   {$EXTERNALSYM DNSREC_ZONE}
  1198.   DNSREC_PREREQ = ($00000001);
  1199.   {$EXTERNALSYM DNSREC_PREREQ}
  1200.   DNSREC_UPDATE = ($00000002);
  1201.   {$EXTERNALSYM DNSREC_UPDATE}
  1202. //  Delete RR (update) or No-exist (prerequisite)
  1203.   DNSREC_DELETE  = ($00000004);
  1204.   {$EXTERNALSYM DNSREC_DELETE}
  1205.   DNSREC_NOEXIST = ($00000004);
  1206.   {$EXTERNALSYM DNSREC_NOEXIST}
  1207. //
  1208. //  Record  RR set structure
  1209. //
  1210. //  Note:  The dwReserved flag serves to insure that the substructures
  1211. //  start on 64-bit boundaries.  Do NOT pack this structure, as the
  1212. //  substructures may contain pointers or int64 values which are
  1213. //  properly aligned unpacked.
  1214. //
  1215. type
  1216.   PDNS_RECORD = ^DNS_RECORD;
  1217.   {$EXTERNALSYM PDNS_RECORD}
  1218.   _DnsRecord = record
  1219.     pNext: PDNS_RECORD;
  1220.     pName: LPTSTR;
  1221.     wType: WORD;
  1222.     wDataLength: WORD; // Not referenced for DNS record types defined above.
  1223.     Flags: record
  1224.     case Integer of
  1225.       0: (DW: DWORD);             // flags as DWORD
  1226.       1: (S: DNS_RECORD_FLAGS);   // flags as structure
  1227.     end;
  1228.     dwTtl: DWORD;
  1229.     dwReserved: DWORD;
  1230.     //  Record Data
  1231.     Data: record
  1232.     case Integer of
  1233.        0: (A: DNS_A_DATA);
  1234.        1: (SOA, Soa_: DNS_SOA_DATA);
  1235.        2: (PTR, Ptr_,
  1236.            NS, Ns_,
  1237.            CNAME, Cname_,
  1238.            MB, Mb_,
  1239.            MD, Md_,
  1240.            MF, Mf_,
  1241.            MG, Mg_,
  1242.            MR, Mr_: DNS_PTR_DATA);
  1243.        3: (MINFO, Minfo_,
  1244.            RP, Rp_: DNS_MINFO_DATA);
  1245.        4: (MX, Mx_,
  1246.            AFSDB, Afsdb_,
  1247.            RT, Rt_: DNS_MX_DATA);
  1248.        5: (HINFO, Hinfo_,
  1249.            ISDN, Isdn_,
  1250.            TXT, Txt_,
  1251.            X25: DNS_TXT_DATA);
  1252.        6: (Null: DNS_NULL_DATA);
  1253.        7: (WKS, Wks_: DNS_WKS_DATA);
  1254.        8: (AAAA: DNS_AAAA_DATA);
  1255.        9: (KEY, Key_: DNS_KEY_DATA);
  1256.       10: (SIG, Sig_: DNS_SIG_DATA);
  1257.       11: (ATMA, Atma_: DNS_ATMA_DATA);
  1258.       12: (NXT, Nxt_: DNS_NXT_DATA);
  1259.       13: (SRV, Srv_: DNS_SRV_DATA);
  1260.       14: (TKEY, Tkey_: DNS_TKEY_DATA);
  1261.       15: (TSIG, Tsig_: DNS_TSIG_DATA);
  1262.       16: (WINS, Wins_: DNS_WINS_DATA);
  1263.       17: (WINSR, WinsR_, NBSTAT, Nbstat_: DNS_WINSR_DATA);
  1264.     end;
  1265.    end;
  1266.   {$EXTERNALSYM _DnsRecord}
  1267.   DNS_RECORD = _DnsRecord;
  1268.   {$EXTERNALSYM DNS_RECORD}
  1269.   PPDNS_RECORD = ^PDNS_RECORD;
  1270.   {$NODEFINE PPDNS_RECORD}
  1271.   TDnsRecord = DNS_RECORD;
  1272.   PDnsRecord = PDNS_RECORD;
  1273. //
  1274. //  Header or fixed size of DNS_RECORD
  1275. //
  1276. const
  1277.   DNS_RECORD_FIXED_SIZE = 24;                // FIELD_OFFSET( DNS_RECORD, Data )
  1278.   {$EXTERNALSYM DNS_RECORD_FIXED_SIZE}
  1279.   SIZEOF_DNS_RECORD_HEADER = DNS_RECORD_FIXED_SIZE;
  1280.   {$EXTERNALSYM SIZEOF_DNS_RECORD_HEADER}
  1281. //
  1282. //  Resource record set building
  1283. //
  1284. //  pFirst points to first record in list.
  1285. //  pLast points to last record in list.
  1286. //
  1287. type
  1288.   PDnsRRSet = ^DnsRRSet;
  1289.   {$EXTERNALSYM PDnsRRSet}
  1290.   _DnsRRSet = record
  1291.     pFirstRR: PDNS_RECORD;
  1292.     pLastRR: PDNS_RECORD;
  1293.   end;
  1294.   {$EXTERNALSYM _DnsRRSet}
  1295.   DnsRRSet = _DnsRRSet;
  1296.   {$EXTERNALSYM DnsRRSet}
  1297.   TDnsrrset = DnsRRSet;
  1298. //
  1299. //  To init pFirst is NULL.
  1300. //  But pLast points at the location of the pFirst pointer -- essentially
  1301. //  treating the pFirst ptr as a DNS_RECORD.  (It is a DNS_RECORD with
  1302. //  only a pNext field, but that's the only part we use.)
  1303. //
  1304. //  Then when the first record is added to the list, the pNext field of
  1305. //  this dummy record (which corresponds to pFirst's value) is set to
  1306. //  point at the first record.  So pFirst then properly points at the
  1307. //  first record.
  1308. //
  1309. //  (This works only because pNext is the first field in a
  1310. //  DNS_RECORD structure and hence casting a PDNS_RECORD ptr to
  1311. //  PDNS_RECORD* and dereferencing yields its pNext field)
  1312. //
  1313. //  Use TERMINATE when have built RR set by grabbing records out of
  1314. //  existing set.   This makes sure that at the end, the last RR is
  1315. //  properly NULL terminated.
  1316. //
  1317. procedure DNS_RRSET_INIT(rrset: PDnsRRSet);
  1318. {$EXTERNALSYM DNS_RRSET_INIT}
  1319. //procedure DNS_RRSET_ADD(rrset, pnewRR: PDNS_RRSET);
  1320. //{$EXTERNALSYM DNS_RRSET_ADD}
  1321. procedure DNS_RRSET_TERMINATE(rrset: PDnsRRSet);
  1322. {$EXTERNALSYM DNS_RRSET_TERMINATE}
  1323. //
  1324. //  Record set manipulation
  1325. //
  1326. //
  1327. //  Record Copy
  1328. //  Record copy functions also do conversion between character sets.
  1329. //
  1330. //  Note, it might be advisable to directly expose non-Ex copy
  1331. //  functions _W, _A for record and set, to avoid exposing the
  1332. //  conversion enum.
  1333. //
  1334. type
  1335.   _DNS_CHARSET = (
  1336.     DnsCharSetUnknown,
  1337.     DnsCharSetUnicode,
  1338.     DnsCharSetUtf8,
  1339.     DnsCharSetAnsi);
  1340.   {$EXTERNALSYM _DNS_CHARSET}
  1341.   DNS_CHARSET = _DNS_CHARSET;
  1342.   {$EXTERNALSYM DNS_CHARSET}
  1343.   TDnsCharSet = DNS_CHARSET;
  1344.   PDnsCharSet = ^DNS_CHARSET;
  1345. function DnsRecordCopyEx(pRecord: PDNS_RECORD; CharSetIn: DNS_CHARSET; CharSetOut: DNS_CHARSET): PDNS_RECORD; stdcall;
  1346. {$EXTERNALSYM DnsRecordCopyEx}
  1347. function DnsRecordSetCopyEx(pRecordSet: PDNS_RECORD; CharSetIn: DNS_CHARSET; CharSetOut: DNS_CHARSET): PDNS_RECORD; stdcall;
  1348. {$EXTERNALSYM DnsRecordSetCopyEx}
  1349. {$IFDEF UNICODE}
  1350. function DnsRecordCopy(pRR: PDNS_RECORD): PDNS_RECORD;
  1351. {$EXTERNALSYM DnsRecordCopy}
  1352. function DnsRecordSetCopy(pRR: PDNS_RECORD): PDNS_RECORD;
  1353. {$EXTERNALSYM DnsRecordSetCopy}
  1354. {$ELSE}
  1355. function DnsRecordCopy(pRR: PDNS_RECORD): PDNS_RECORD;
  1356. {$EXTERNALSYM DnsRecordCopy}
  1357. function DnsRecordSetCopy(pRR: PDNS_RECORD): PDNS_RECORD;
  1358. {$EXTERNALSYM DnsRecordSetCopy}
  1359. {$ENDIF}
  1360. //
  1361. //  Record Compare
  1362. //
  1363. //  Note:  these routines only compare records of the SAME character set.
  1364. //  (ANSI, unicode or UTF8).  Furthermore the routines assume the character
  1365. //  set is indicated within the record.  If compare of user created, rather
  1366. //  than DNS API created record lists is desired, then caller should use
  1367. //  DnsRecordCopy API and compare copies.
  1368. //
  1369. function DnsRecordCompare(pRecord1: PDNS_RECORD; pRecord2: PDNS_RECORD): BOOL; stdcall;
  1370. {$EXTERNALSYM DnsRecordCompare}
  1371. function DnsRecordSetCompare(pRR1: PDNS_RECORD; pRR2: PDNS_RECORD; var ppDiff1, ppDiff2: PDNS_RECORD): BOOL; stdcall;
  1372. {$EXTERNALSYM DnsRecordSetCompare}
  1373. //
  1374. //  Detach next record set from record list
  1375. //
  1376. function DnsRecordSetDetach(pRecordList: PDNS_RECORD): PDNS_RECORD; stdcall;
  1377. {$EXTERNALSYM DnsRecordSetDetach}
  1378. //
  1379. //  Free record list
  1380. //
  1381. //  Only supported free is deep free of entire record list with LocalFree().
  1382. //  This correctly frees record list returned by DnsQuery() or DnsRecordSetCopy()
  1383. //
  1384. type
  1385.   DNS_FREE_TYPE = (DnsFreeFlat, DnsFreeRecordList);
  1386.   {$EXTERNALSYM DNS_FREE_TYPE}
  1387.   TDnsFreeType = DNS_FREE_TYPE;
  1388. procedure DnsFreeRecordListDeep(pRecordList: PDNS_RECORD; FreeType: DNS_FREE_TYPE); stdcall;
  1389. {$EXTERNALSYM DnsFreeRecordListDeep}
  1390. procedure DnsRecordListFree(pRecordList: PDNS_RECORD; FreeType: DNS_FREE_TYPE); stdcall;
  1391. {$EXTERNALSYM DnsRecordListFree}
  1392. procedure DnsFree(pData: PVOID; FreeType: DNS_FREE_TYPE); stdcall;
  1393. {$EXTERNALSYM DnsFree}
  1394. //
  1395. //  DNS Query API
  1396. //
  1397. //
  1398. //  Options for DnsQuery
  1399. //
  1400. const
  1401.   DNS_QUERY_STANDARD                  = $00000000;
  1402.   {$EXTERNALSYM DNS_QUERY_STANDARD}
  1403.   DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE = $00000001;
  1404.   {$EXTERNALSYM DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE}
  1405.   DNS_QUERY_USE_TCP_ONLY              = $00000002;
  1406.   {$EXTERNALSYM DNS_QUERY_USE_TCP_ONLY}
  1407.   DNS_QUERY_NO_RECURSION              = $00000004;
  1408.   {$EXTERNALSYM DNS_QUERY_NO_RECURSION}
  1409.   DNS_QUERY_BYPASS_CACHE              = $00000008;
  1410.   {$EXTERNALSYM DNS_QUERY_BYPASS_CACHE}
  1411.   DNS_QUERY_NO_WIRE_QUERY = $00000010;
  1412.   {$EXTERNALSYM DNS_QUERY_NO_WIRE_QUERY}
  1413.   DNS_QUERY_NO_LOCAL_NAME = $00000020;
  1414.   {$EXTERNALSYM DNS_QUERY_NO_LOCAL_NAME}
  1415.   DNS_QUERY_NO_HOSTS_FILE = $00000040;
  1416.   {$EXTERNALSYM DNS_QUERY_NO_HOSTS_FILE}
  1417.   DNS_QUERY_NO_NETBT      = $00000080;
  1418.   {$EXTERNALSYM DNS_QUERY_NO_NETBT}
  1419.   DNS_QUERY_WIRE_ONLY      = $00000100;
  1420.   {$EXTERNALSYM DNS_QUERY_WIRE_ONLY}
  1421.   DNS_QUERY_RETURN_MESSAGE = $00000200;
  1422.   {$EXTERNALSYM DNS_QUERY_RETURN_MESSAGE}
  1423.   DNS_QUERY_TREAT_AS_FQDN         = $00001000;
  1424.   {$EXTERNALSYM DNS_QUERY_TREAT_AS_FQDN}
  1425.   DNS_QUERY_DONT_RESET_TTL_VALUES = $00100000;
  1426.   {$EXTERNALSYM DNS_QUERY_DONT_RESET_TTL_VALUES}
  1427.   DNS_QUERY_RESERVED              = DWORD($ff000000);
  1428.   {$EXTERNALSYM DNS_QUERY_RESERVED}
  1429. //  Backward compatibility with Win2K
  1430. //  Do not use
  1431.   DNS_QUERY_CACHE_ONLY = DNS_QUERY_NO_WIRE_QUERY;
  1432.   {$EXTERNALSYM DNS_QUERY_CACHE_ONLY}
  1433. function DnsQuery_A(pszName: PCSTR; wType: WORD; Options: DWORD; aipServers: PIP4_ARRAY; ppQueryResults: PPDNS_RECORD; pReserved: PPVOID): DNS_STATUS; stdcall;
  1434. {$EXTERNALSYM DnsQuery_A}
  1435. function DnsQuery_UTF8(pszName: PCSTR; wType: WORD; Options: DWORD; aipServers: PIP4_ARRAY; ppQueryResults: PPDNS_RECORD; pReserved: PPVOID): DNS_STATUS; stdcall;
  1436. {$EXTERNALSYM DnsQuery_UTF8}
  1437. function DnsQuery_W(pszName: LPCWSTR; wType: WORD; Options: DWORD; aipServers: PIP4_ARRAY; ppQueryResults: PPDNS_RECORD; pReserved: PPVOID): DNS_STATUS; stdcall;
  1438. {$EXTERNALSYM DnsQuery_W}
  1439. {$IFDEF UNICODE}
  1440. function DnsQuery(pszName: LPCWSTR; wType: WORD; Options: DWORD; aipServers: PIP4_ARRAY; ppQueryResults: PPDNS_RECORD; pReserved: PPVOID): DNS_STATUS; stdcall;
  1441. {$EXTERNALSYM DnsQuery}
  1442. {$ELSE}
  1443. function DnsQuery(pszName: PCSTR; wType: WORD; Options: DWORD; aipServers: PIP4_ARRAY; ppQueryResults: PPDNS_RECORD; pReserved: PPVOID): DNS_STATUS; stdcall;
  1444. {$EXTERNALSYM DnsQuery}
  1445. {$ENDIF}
  1446. //
  1447. //  DNS Update API
  1448. //
  1449. //      DnsAcquireContextHandle
  1450. //      DnsReleaseContextHandle
  1451. //      DnsModifyRecordsInSet
  1452. //      DnsReplaceRecordSet
  1453. //
  1454. //
  1455. //  Update flags
  1456. //
  1457. const
  1458.   DNS_UPDATE_SECURITY_USE_DEFAULT    = $00000000;
  1459.   {$EXTERNALSYM DNS_UPDATE_SECURITY_USE_DEFAULT}
  1460.   DNS_UPDATE_SECURITY_OFF            = $00000010;
  1461.   {$EXTERNALSYM DNS_UPDATE_SECURITY_OFF}
  1462.   DNS_UPDATE_SECURITY_ON             = $00000020;
  1463.   {$EXTERNALSYM DNS_UPDATE_SECURITY_ON}
  1464.   DNS_UPDATE_SECURITY_ONLY           = $00000100;
  1465.   {$EXTERNALSYM DNS_UPDATE_SECURITY_ONLY}
  1466.   DNS_UPDATE_CACHE_SECURITY_CONTEXT  = $00000200;
  1467.   {$EXTERNALSYM DNS_UPDATE_CACHE_SECURITY_CONTEXT}
  1468.   DNS_UPDATE_TEST_USE_LOCAL_SYS_ACCT = $00000400;
  1469.   {$EXTERNALSYM DNS_UPDATE_TEST_USE_LOCAL_SYS_ACCT}
  1470.   DNS_UPDATE_FORCE_SECURITY_NEGO     = $00000800;
  1471.   {$EXTERNALSYM DNS_UPDATE_FORCE_SECURITY_NEGO}
  1472.   DNS_UPDATE_TRY_ALL_MASTER_SERVERS  = $00001000;
  1473.   {$EXTERNALSYM DNS_UPDATE_TRY_ALL_MASTER_SERVERS}
  1474.   DNS_UPDATE_SKIP_NO_UPDATE_ADAPTERS = $00002000;
  1475.   {$EXTERNALSYM DNS_UPDATE_SKIP_NO_UPDATE_ADAPTERS}
  1476.   DNS_UPDATE_RESERVED                = DWORD($ffff0000);
  1477.   {$EXTERNALSYM DNS_UPDATE_RESERVED}
  1478. //
  1479. //  Note:  pCredentials paramater is currently respectively
  1480. //  PSEC_WINNT_AUTH_IDENTITY_W or PSEC_WINNT_AUTH_IDENTITY_A.
  1481. //  Using PVOID to obviate the need for including rpcdce.h
  1482. //  in order to include this file and to leave open the
  1483. //  possibility of alternative credential specifications in
  1484. //  the future.
  1485. //
  1486. function DnsAcquireContextHandle_W(CredentialFlags: DWORD; pCredentials: PVOID; pContextHandle: PHANDLE): DNS_STATUS; stdcall;
  1487. {$EXTERNALSYM DnsAcquireContextHandle_W}
  1488. function DnsAcquireContextHandle_A(CredentialFlags: DWORD; pCredentials: PVOID; pContextHandle: PHANDLE): DNS_STATUS; stdcall;
  1489. {$EXTERNALSYM DnsAcquireContextHandle_A}
  1490. {$IFDEF UNICODE}
  1491. function DnsAcquireContextHandle(CredentialFlags: DWORD; pCredentials: PVOID; pContextHandle: PHANDLE): DNS_STATUS; stdcall;
  1492. {$EXTERNALSYM DnsAcquireContextHandle}
  1493. {$ELSE}
  1494. function DnsAcquireContextHandle(CredentialFlags: DWORD; pCredentials: PVOID; pContextHandle: PHANDLE): DNS_STATUS; stdcall;
  1495. {$EXTERNALSYM DnsAcquireContextHandle}
  1496. {$ENDIF}
  1497. procedure DnsReleaseContextHandle(hContext: HANDLE); stdcall;
  1498. {$EXTERNALSYM DnsReleaseContextHandle}
  1499. //
  1500. //  Dynamic Update API
  1501. //
  1502. function DnsModifyRecordsInSet_W(pAddRecords: PDNS_RECORD; pDeleteRecords: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
  1503. {$EXTERNALSYM DnsModifyRecordsInSet_W}
  1504. function DnsModifyRecordsInSet_A(pAddRecords: PDNS_RECORD; pDeleteRecords: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
  1505. {$EXTERNALSYM DnsModifyRecordsInSet_A}
  1506. function DnsModifyRecordsInSet_UTF8(pAddRecords: PDNS_RECORD; pDeleteRecords: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
  1507. {$EXTERNALSYM DnsModifyRecordsInSet_UTF8}
  1508. {$IFDEF UNICODE}
  1509. function DnsModifyRecordsInSet(pAddRecords: PDNS_RECORD; pDeleteRecords: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
  1510. {$EXTERNALSYM DnsModifyRecordsInSet}
  1511. {$ELSE}
  1512. function DnsModifyRecordsInSet(pAddRecords: PDNS_RECORD; pDeleteRecords: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
  1513. {$EXTERNALSYM DnsModifyRecordsInSet}
  1514. {$ENDIF}
  1515. function DnsReplaceRecordSetW(pNewSet: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
  1516. {$EXTERNALSYM DnsReplaceRecordSetW}
  1517. function DnsReplaceRecordSetA(pNewSet: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
  1518. {$EXTERNALSYM DnsReplaceRecordSetA}
  1519. function DnsReplaceRecordSetUTF8(pNewSet: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
  1520. {$EXTERNALSYM DnsReplaceRecordSetUTF8}
  1521. {$IFDEF UNICODE}
  1522. function DnsReplaceRecordSet(pNewSet: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
  1523. {$EXTERNALSYM DnsReplaceRecordSet}
  1524. {$ELSE}
  1525. function DnsReplaceRecordSet(pNewSet: PDNS_RECORD; Options: DWORD; hContext: HANDLE; pServerList: PIP4_ARRAY; pReserved: PVOID): DNS_STATUS; stdcall;
  1526. {$EXTERNALSYM DnsReplaceRecordSet}
  1527. {$ENDIF}
  1528. //
  1529. //  DNS name validation
  1530. //
  1531. type
  1532.   _DNS_NAME_FORMAT = (
  1533.     DnsNameDomain,
  1534.     DnsNameDomainLabel,
  1535.     DnsNameHostnameFull,
  1536.     DnsNameHostnameLabel,
  1537.     DnsNameWildcard,
  1538.     DnsNameSrvRecord);
  1539.   {$EXTERNALSYM _DNS_NAME_FORMAT}
  1540.   DNS_NAME_FORMAT = _DNS_NAME_FORMAT;
  1541.   {$EXTERNALSYM DNS_NAME_FORMAT}
  1542.   TDnsNameFormat = DNS_NAME_FORMAT;
  1543.   PDnsNameFormat = ^DNS_NAME_FORMAT;
  1544. function DnsValidateName_UTF8(pszName: LPCSTR; Format: DNS_NAME_FORMAT): DNS_STATUS; stdcall;
  1545. {$EXTERNALSYM DnsValidateName_UTF8}
  1546. function DnsValidateName_W(pwszName: LPCWSTR; Format: DNS_NAME_FORMAT): DNS_STATUS; stdcall;
  1547. {$EXTERNALSYM DnsValidateName_W}
  1548. function DnsValidateName_A(pszName: LPCSTR; Format: DNS_NAME_FORMAT): DNS_STATUS; stdcall;
  1549. {$EXTERNALSYM DnsValidateName_A}
  1550. {$IFDEF UNICODE}
  1551. function DnsValidateName(pszName: LPCWSTR; Format: DNS_NAME_FORMAT): DNS_STATUS;
  1552. {$EXTERNALSYM DnsValidateName}
  1553. {$ELSE}
  1554. function DnsValidateName(pszName: LPCSTR; Format: DNS_NAME_FORMAT): DNS_STATUS;
  1555. {$EXTERNALSYM DnsValidateName}
  1556. {$ENDIF}
  1557. //
  1558. //  DNS name comparison
  1559. //
  1560. function DnsNameCompare_A(pName1: LPSTR; pName2: LPSTR): BOOL; stdcall;
  1561. {$EXTERNALSYM DnsNameCompare_A}
  1562. function DnsNameCompare_W(pName1: LPWSTR; pName2: LPWSTR): BOOL; stdcall;
  1563. {$EXTERNALSYM DnsNameCompare_W}
  1564. {$IFDEF UNICODE}
  1565. function DnsNameCompare(pName1: LPWSTR; pName2: LPWSTR): BOOL; stdcall;
  1566. {$EXTERNALSYM DnsNameCompare}
  1567. {$ELSE}
  1568. function DnsNameCompare(pName1: LPSTR; pName2: LPSTR): BOOL; stdcall;
  1569. {$EXTERNALSYM DnsNameCompare}
  1570. {$ENDIF}
  1571. //
  1572. //  DNS message "roll-your-own" routines
  1573. //
  1574. type
  1575.   PDNS_MESSAGE_BUFFER = ^DNS_MESSAGE_BUFFER;
  1576.   {$EXTERNALSYM PDNS_MESSAGE_BUFFER}
  1577.   _DNS_MESSAGE_BUFFER = record
  1578.     MessageHead: DNS_HEADER;
  1579.     MessageBody: array [0..0] of CHAR;
  1580.   end;
  1581.   {$EXTERNALSYM _DNS_MESSAGE_BUFFER}
  1582.   DNS_MESSAGE_BUFFER = _DNS_MESSAGE_BUFFER;
  1583.   {$EXTERNALSYM DNS_MESSAGE_BUFFER}
  1584.   TDnsMessageBuffer = DNS_MESSAGE_BUFFER;
  1585.   PDnsMessageBuffer = PDNS_MESSAGE_BUFFER;
  1586. function DnsWriteQuestionToBuffer_W(pDnsBuffer: PDNS_MESSAGE_BUFFER; pdwBufferSize: LPDWORD; pszName: LPWSTR; wType: WORD; Xid: WORD; fRecursionDesired: BOOL): BOOL; stdcall;
  1587. {$EXTERNALSYM DnsWriteQuestionToBuffer_W}
  1588. function DnsWriteQuestionToBuffer_UTF8(pDnsBuffer: PDNS_MESSAGE_BUFFER; pdwBufferSize: LPDWORD; pszName: LPSTR; wType: WORD; Xid: WORD; fRecursionDesired: BOOL): BOOL; stdcall;
  1589. {$EXTERNALSYM DnsWriteQuestionToBuffer_UTF8}
  1590. function DnsExtractRecordsFromMessage_W(pDnsBuffer: PDNS_MESSAGE_BUFFER; wMessageLength: WORD; ppRecord: PPDNS_RECORD): DNS_STATUS; stdcall;
  1591. {$EXTERNALSYM DnsExtractRecordsFromMessage_W}
  1592. function DnsExtractRecordsFromMessage_UTF8(pDnsBuffer: PDNS_MESSAGE_BUFFER; wMessageLength: WORD; ppRecord: PPDNS_RECORD): DNS_STATUS; stdcall;
  1593. {$EXTERNALSYM DnsExtractRecordsFromMessage_UTF8}
  1594. implementation
  1595. const
  1596.   dnsapi = 'dnsapi.dll';
  1597. procedure INLINE_WORD_FLIP(var Out: WORD; In_: WORD);
  1598. begin
  1599.   Out := (In_ shl 8) or (In_ shr 8);
  1600. end;
  1601. procedure INLINE_HTONS(var Out: WORD; In_: WORD);
  1602. begin
  1603.   INLINE_WORD_FLIP(Out, In_);
  1604. end;
  1605. procedure INLINE_NTOHS(var Out: WORD; In_: WORD);
  1606. begin
  1607.   INLINE_WORD_FLIP(Out, In_);
  1608. end;
  1609. procedure INLINE_DWORD_FLIP(var Out: DWORD; In_: DWORD);
  1610. begin
  1611.   Out := ((In_ shl 8) and $00ff0000) or (In_ shl 24) or
  1612.     ((In_ shr 8) and $0000ff00) or (In_ shr 24);
  1613. end;
  1614. procedure INLINE_NTOHL(var Out: DWORD; In_: DWORD);
  1615. begin
  1616.   INLINE_DWORD_FLIP(Out, In_);
  1617. end;
  1618. procedure INLINE_HTONL(var Out: DWORD; In_: DWORD);
  1619. begin
  1620.   INLINE_DWORD_FLIP(Out, In_);
  1621. end;
  1622. procedure INLINE_WRITE_FLIPPED_WORD(pout: PWORD; In_: WORD);
  1623. begin
  1624.   INLINE_WORD_FLIP(pout^, In_);
  1625. end;
  1626. procedure INLINE_WRITE_FLIPPED_DWORD(pout: PDWORD; In_: DWORD);
  1627. begin
  1628.   INLINE_DWORD_FLIP(pout^, In_);
  1629. end;
  1630. function DNS_HEADER_FLAGS(pHead: PDNS_HEADER): WORD;
  1631. begin
  1632.   Result := PWORD(Integer(pHead) + SizeOf(WORD))^;
  1633. end;
  1634. procedure DNS_BYTE_FLIP_HEADER_COUNTS(var pHeader: PDNS_HEADER);
  1635. var
  1636.   _head: PDNS_HEADER;
  1637. begin
  1638.   _head := pHeader;
  1639.   INLINE_HTONS(_head^.Xid, _head^.Xid);
  1640.   INLINE_HTONS(_head^.QuestionCount, _head^.QuestionCount);
  1641.   INLINE_HTONS(_head^.AnswerCount, _head^.AnswerCount);
  1642.   INLINE_HTONS(_head^.NameServerCount, _head^.NameServerCount);
  1643.   INLINE_HTONS(_head^.AdditionalCount, _head^.AdditionalCount);
  1644. end;
  1645. {
  1646. #define DNS_QUESTION_NAME_FROM_HEADER( _pHeader_ ) 
  1647.             ( (PCHAR)( (PDNS_HEADER)(_pHeader_) + 1 ) )
  1648. #define DNS_ANSWER_FROM_QUESTION( _pQuestion_ ) 
  1649.             ( (PCHAR)( (PDNS_QUESTION)(_pQuestion_) + 1 ) )
  1650. }
  1651. function IS_WORD_ALIGNED(P: Pointer): BOOL;
  1652. begin
  1653.   Result := (Integer(P) and 1) = 0;
  1654. end;
  1655. function IS_DWORD_ALIGNED(P: Pointer): BOOL;
  1656. begin
  1657.   Result := (Integer(P) and 3) = 0;
  1658. end;
  1659. function IS_QWORD_ALIGNED(P: Pointer): BOOL;
  1660. begin
  1661.   Result := (Integer(P) and 7) = 0;
  1662. end;
  1663. {$IFDEF DYNAMIC_LINK}
  1664. var
  1665.   _DnsQueryConfig: Pointer;
  1666. function DnsQueryConfig;
  1667. begin
  1668.   GetProcedureAddress(_DnsQueryConfig, dnsapi, 'DnsQueryConfig');
  1669.   asm
  1670.     mov esp, ebp
  1671.     pop ebp
  1672.     jmp [_DnsQueryConfig]
  1673.   end;
  1674. end;
  1675. {$ELSE}
  1676. function DnsQueryConfig; external dnsapi name 'DnsQueryConfig';
  1677. {$ENDIF DYNAMIC_LINK}
  1678. function DNS_TEXT_RECORD_LENGTH(StringCount: Integer): Integer;
  1679. begin
  1680.   Result := SizeOf(DWORD) + ((StringCount) * SizeOf(PChar));
  1681. end;
  1682. function DNS_NULL_RECORD_LENGTH(ByteCount: Integer): Integer;
  1683. begin
  1684.   Result := SizeOf(DWORD) + (ByteCount);
  1685. end;
  1686. function DNS_WKS_RECORD_LENGTH(ByteCount: Integer): Integer;
  1687. begin
  1688.   Result := SizeOf(DNS_WKS_DATA) + (ByteCount - 1);
  1689. end;
  1690. //#define DNS_WINS_RECORD_LENGTH(IpCount) 
  1691. //            (FIELD_OFFSET(DNS_WINS_DATA, WinsServers) + ((IpCount) * sizeof(IP4_ADDRESS)))
  1692. procedure DNS_RRSET_INIT(rrset: PDnsRRSet);
  1693. begin
  1694.   rrset^.pFirstRR := nil;
  1695.   rrset^.pLastRR := (@rrset^.pFirstRR);
  1696. end;
  1697. //#define DNS_RRSET_ADD( rrset, pnewRR )          
  1698. //        {                                       
  1699. //            PDNS_RRSET  _prrset = &(rrset);     
  1700. //            PDNS_RECORD _prrnew = (pnewRR);     
  1701. //            _prrset->pLastRR->pNext = _prrnew;  
  1702. //            _prrset->pLastRR = _prrnew;         
  1703. //        }
  1704. procedure DNS_RRSET_TERMINATE(rrset: PDnsRRSet);
  1705. begin
  1706.   rrset^.pLastRR^.pNext := nil;
  1707. end;
  1708. {$IFDEF DYNAMIC_LINK}
  1709. var
  1710.   _DnsRecordCopyEx: Pointer;
  1711. function DnsRecordCopyEx;
  1712. begin
  1713.   GetProcedureAddress(_DnsRecordCopyEx, dnsapi, 'DnsRecordCopyEx');
  1714.   asm
  1715.     mov esp, ebp
  1716.     pop ebp
  1717.     jmp [_DnsRecordCopyEx]
  1718.   end;
  1719. end;
  1720. {$ELSE}
  1721. function DnsRecordCopyEx; external dnsapi name 'DnsRecordCopyEx';
  1722. {$ENDIF DYNAMIC_LINK}
  1723. {$IFDEF DYNAMIC_LINK}
  1724. var
  1725.   _DnsRecordSetCopyEx: Pointer;
  1726. function DnsRecordSetCopyEx;
  1727. begin
  1728.   GetProcedureAddress(_DnsRecordSetCopyEx, dnsapi, 'DnsRecordSetCopyEx');
  1729.   asm
  1730.     mov esp, ebp
  1731.     pop ebp
  1732.     jmp [_DnsRecordSetCopyEx]
  1733.   end;
  1734. end;
  1735. {$ELSE}
  1736. function DnsRecordSetCopyEx; external dnsapi name 'DnsRecordSetCopyEx';
  1737. {$ENDIF DYNAMIC_LINK}
  1738. {$IFDEF UNICODE}
  1739. function DnsRecordCopy(pRR: PDNS_RECORD): PDNS_RECORD;
  1740. begin
  1741.   Result := DnsRecordCopyEx(pRR, DnsCharSetUnicode, DnsCharSetUnicode);
  1742. end;
  1743. function DnsRecordSetCopy(pRR: PDNS_RECORD): PDNS_RECORD;
  1744. begin
  1745.   Result := DnsRecordSetCopyEx(pRR, DnsCharSetUnicode, DnsCharSetUnicode);
  1746. end;
  1747. {$ELSE}
  1748. function DnsRecordCopy(pRR: PDNS_RECORD): PDNS_RECORD;
  1749. begin
  1750.   Result := DnsRecordCopyEx(pRR, DnsCharSetAnsi, DnsCharSetAnsi);
  1751. end;
  1752. function DnsRecordSetCopy(pRR: PDNS_RECORD): PDNS_RECORD;
  1753. begin
  1754.   Result := DnsRecordSetCopyEx(pRR, DnsCharSetAnsi, DnsCharSetAnsi);
  1755. end;
  1756. {$ENDIF}
  1757. {$IFDEF DYNAMIC_LINK}
  1758. var
  1759.   _DnsRecordCompare: Pointer;
  1760. function DnsRecordCompare;
  1761. begin
  1762.   GetProcedureAddress(_DnsRecordCompare, dnsapi, 'DnsRecordCompare');
  1763.   asm
  1764.     mov esp, ebp
  1765.     pop ebp
  1766.     jmp [_DnsRecordCompare]
  1767.   end;
  1768. end;
  1769. {$ELSE}
  1770. function DnsRecordCompare; external dnsapi name 'DnsRecordCompare';
  1771. {$ENDIF DYNAMIC_LINK}
  1772. {$IFDEF DYNAMIC_LINK}
  1773. var
  1774.   _DnsRecordSetCompare: Pointer;
  1775. function DnsRecordSetCompare;
  1776. begin
  1777.   GetProcedureAddress(_DnsRecordSetCompare, dnsapi, 'DnsRecordSetCompare');
  1778.   asm
  1779.     mov esp, ebp
  1780.     pop ebp
  1781.     jmp [_DnsRecordSetCompare]
  1782.   end;
  1783. end;
  1784. {$ELSE}
  1785. function DnsRecordSetCompare; external dnsapi name 'DnsRecordSetCompare';
  1786. {$ENDIF DYNAMIC_LINK}
  1787. {$IFDEF DYNAMIC_LINK}
  1788. var
  1789.   _DnsRecordSetDetach: Pointer;
  1790. function DnsRecordSetDetach;
  1791. begin
  1792.   GetProcedureAddress(_DnsRecordSetDetach, dnsapi, 'DnsRecordSetDetach');
  1793.   asm
  1794.     mov esp, ebp
  1795.     pop ebp
  1796.     jmp [_DnsRecordSetDetach]
  1797.   end;
  1798. end;
  1799. {$ELSE}
  1800. function DnsRecordSetDetach; external dnsapi name 'DnsRecordSetDetach';
  1801. {$ENDIF DYNAMIC_LINK}
  1802. {$IFDEF DYNAMIC_LINK}
  1803. var
  1804.   _DnsFreeRecordListDeep: Pointer;
  1805. procedure DnsFreeRecordListDeep;
  1806. begin
  1807.   GetProcedureAddress(_DnsFreeRecordListDeep, dnsapi, 'DnsRecordListFree');
  1808.   asm
  1809.     mov esp, ebp
  1810.     pop ebp
  1811.     jmp [_DnsFreeRecordListDeep]
  1812.   end;
  1813. end;
  1814. {$ELSE}
  1815. procedure DnsFreeRecordListDeep; external dnsapi name 'DnsRecordListFree';
  1816. {$ENDIF DYNAMIC_LINK}
  1817. {$IFDEF DYNAMIC_LINK}
  1818. var
  1819.   _DnsRecordListFree: Pointer;
  1820. procedure DnsRecordListFree;
  1821. begin
  1822.   GetProcedureAddress(_DnsRecordListFree, dnsapi, 'DnsRecordListFree');
  1823.   asm
  1824.     mov esp, ebp
  1825.     pop ebp
  1826.     jmp [_DnsRecordListFree]
  1827.   end;
  1828. end;
  1829. {$ELSE}
  1830. procedure DnsRecordListFree; external dnsapi name 'DnsRecordListFree';
  1831. {$ENDIF DYNAMIC_LINK}
  1832. {$IFDEF DYNAMIC_LINK}
  1833. var
  1834.   _DnsFree: Pointer;
  1835. procedure DnsFree;
  1836. begin
  1837.   GetProcedureAddress(_DnsFree, dnsapi, 'DnsFree');
  1838.   asm
  1839.     mov esp, ebp
  1840.     pop ebp
  1841.     jmp [_DnsFree]
  1842.   end;
  1843. end;
  1844. {$ELSE}
  1845. procedure DnsFree; external dnsapi name 'DnsFree';
  1846. {$ENDIF DYNAMIC_LINK}
  1847. {$IFDEF DYNAMIC_LINK}
  1848. var
  1849.   _DnsQuery_A: Pointer;
  1850. function DnsQuery_A;
  1851. begin
  1852.   GetProcedureAddress(_DnsQuery_A, dnsapi, 'DnsQuery_A');
  1853.   asm
  1854.     mov esp, ebp
  1855.     pop ebp
  1856.     jmp [_DnsQuery_A]
  1857.   end;
  1858. end;
  1859. {$ELSE}
  1860. function DnsQuery_A; external dnsapi name 'DnsQuery_A';
  1861. {$ENDIF DYNAMIC_LINK}
  1862. {$IFDEF DYNAMIC_LINK}
  1863. var
  1864.   _DnsQuery_UTF8: Pointer;
  1865. function DnsQuery_UTF8;
  1866. begin
  1867.   GetProcedureAddress(_DnsQuery_UTF8, dnsapi, 'DnsQuery_UTF8');
  1868.   asm
  1869.     mov esp, ebp
  1870.     pop ebp
  1871.     jmp [_DnsQuery_UTF8]
  1872.   end;
  1873. end;
  1874. {$ELSE}
  1875. function DnsQuery_UTF8; external dnsapi name 'DnsQuery_UTF8';
  1876. {$ENDIF DYNAMIC_LINK}
  1877. {$IFDEF DYNAMIC_LINK}
  1878. var
  1879.   _DnsQuery_W: Pointer;
  1880. function DnsQuery_W;
  1881. begin
  1882.   GetProcedureAddress(_DnsQuery_W, dnsapi, 'DnsQuery_W');
  1883.   asm
  1884.     mov esp, ebp
  1885.     pop ebp
  1886.     jmp [_DnsQuery_W]
  1887.   end;
  1888. end;
  1889. {$ELSE}
  1890. function DnsQuery_W; external dnsapi name 'DnsQuery_W';
  1891. {$ENDIF DYNAMIC_LINK}
  1892. {$IFDEF UNICODE}
  1893. {$IFDEF DYNAMIC_LINK}
  1894. var
  1895.   _DnsQuery: Pointer;
  1896. function DnsQuery;
  1897. begin
  1898.   GetProcedureAddress(_DnsQuery, dnsapi, 'DnsQuery_W');
  1899.   asm
  1900.     mov esp, ebp
  1901.     pop ebp
  1902.     jmp [_DnsQuery]
  1903.   end;
  1904. end;
  1905. {$ELSE}
  1906. function DnsQuery; external dnsapi name 'DnsQuery_W';
  1907. {$ENDIF DYNAMIC_LINK}
  1908. {$ELSE}
  1909. {$IFDEF DYNAMIC_LINK}
  1910. var
  1911.   _DnsQuery: Pointer;
  1912. function DnsQuery;
  1913. begin
  1914.   GetProcedureAddress(_DnsQuery, dnsapi, 'DnsQuery_A');
  1915.   asm
  1916.     mov esp, ebp
  1917.     pop ebp
  1918.     jmp [_DnsQuery]
  1919.   end;
  1920. end;
  1921. {$ELSE}
  1922. function DnsQuery; external dnsapi name 'DnsQuery_A';
  1923. {$ENDIF DYNAMIC_LINK}
  1924. {$ENDIF}
  1925. {$IFDEF DYNAMIC_LINK}
  1926. var
  1927.   _DnsAcquireContextHandle_W: Pointer;
  1928. function DnsAcquireContextHandle_W;
  1929. begin
  1930.   GetProcedureAddress(_DnsAcquireContextHandle_W, dnsapi, 'DnsAcquireContextHandle_W');
  1931.   asm
  1932.     mov esp, ebp
  1933.     pop ebp
  1934.     jmp [_DnsAcquireContextHandle_W]
  1935.   end;
  1936. end;
  1937. {$ELSE}
  1938. function DnsAcquireContextHandle_W; external dnsapi name 'DnsAcquireContextHandle_W';
  1939. {$ENDIF DYNAMIC_LINK}
  1940. {$IFDEF DYNAMIC_LINK}
  1941. var
  1942.   _DnsAcquireContextHandle_A: Pointer;
  1943. function DnsAcquireContextHandle_A;
  1944. begin
  1945.   GetProcedureAddress(_DnsAcquireContextHandle_A, dnsapi, 'DnsAcquireContextHandle_A');
  1946.   asm
  1947.     mov esp, ebp
  1948.     pop ebp
  1949.     jmp [_DnsAcquireContextHandle_A]
  1950.   end;
  1951. end;
  1952. {$ELSE}
  1953. function DnsAcquireContextHandle_A; external dnsapi name 'DnsAcquireContextHandle_A';
  1954. {$ENDIF DYNAMIC_LINK}
  1955. {$IFDEF UNICODE}
  1956. {$IFDEF DYNAMIC_LINK}
  1957. var
  1958.   _DnsAcquireContextHandle: Pointer;
  1959. function DnsAcquireContextHandle;
  1960. begin
  1961.   GetProcedureAddress(_DnsAcquireContextHandle, dnsapi, 'DnsAcquireContextHandle_W');
  1962.   asm
  1963.     mov esp, ebp
  1964.     pop ebp
  1965.     jmp [_DnsAcquireContextHandle]
  1966.   end;
  1967. end;
  1968. {$ELSE}
  1969. function DnsAcquireContextHandle; external dnsapi name 'DnsAcquireContextHandle_W';
  1970. {$ENDIF DYNAMIC_LINK}
  1971. {$ELSE}
  1972. {$IFDEF DYNAMIC_LINK}
  1973. var
  1974.   _DnsAcquireContextHandle: Pointer;
  1975. function DnsAcquireContextHandle;
  1976. begin
  1977.   GetProcedureAddress(_DnsAcquireContextHandle, dnsapi, 'DnsAcquireContextHandle_A');
  1978.   asm
  1979.     mov esp, ebp
  1980.     pop ebp
  1981.     jmp [_DnsAcquireContextHandle]
  1982.   end;
  1983. end;
  1984. {$ELSE}
  1985. function DnsAcquireContextHandle; external dnsapi name 'DnsAcquireContextHandle_A';
  1986. {$ENDIF DYNAMIC_LINK}
  1987. {$ENDIF}
  1988. {$IFDEF DYNAMIC_LINK}
  1989. var
  1990.   _DnsReleaseContextHandle: Pointer;
  1991. procedure DnsReleaseContextHandle;
  1992. begin
  1993.   GetProcedureAddress(_DnsReleaseContextHandle, dnsapi, 'DnsReleaseContextHandle');
  1994.   asm
  1995.     mov esp, ebp
  1996.     pop ebp
  1997.     jmp [_DnsReleaseContextHandle]
  1998.   end;
  1999. end;
  2000. {$ELSE}
  2001. procedure DnsReleaseContextHandle; external dnsapi name 'DnsReleaseContextHandle';
  2002. {$ENDIF DYNAMIC_LINK}
  2003. {$IFDEF DYNAMIC_LINK}
  2004. var
  2005.   _DnsModifyRecordsInSet_W: Pointer;
  2006. function DnsModifyRecordsInSet_W;
  2007. begin
  2008.   GetProcedureAddress(_DnsModifyRecordsInSet_W, dnsapi, 'DnsModifyRecordsInSet_W');
  2009.   asm
  2010.     mov esp, ebp
  2011.     pop ebp
  2012.     jmp [_DnsModifyRecordsInSet_W]
  2013.   end;
  2014. end;
  2015. {$ELSE}
  2016. function DnsModifyRecordsInSet_W; external dnsapi name 'DnsModifyRecordsInSet_W';
  2017. {$ENDIF DYNAMIC_LINK}
  2018. {$IFDEF DYNAMIC_LINK}
  2019. var
  2020.   _DnsModifyRecordsInSet_A: Pointer;
  2021. function DnsModifyRecordsInSet_A;
  2022. begin
  2023.   GetProcedureAddress(_DnsModifyRecordsInSet_A, dnsapi, 'DnsModifyRecordsInSet_A');
  2024.   asm
  2025.     mov esp, ebp
  2026.     pop ebp
  2027.     jmp [_DnsModifyRecordsInSet_A]
  2028.   end;
  2029. end;
  2030. {$ELSE}
  2031. function DnsModifyRecordsInSet_A; external dnsapi name 'DnsModifyRecordsInSet_A';
  2032. {$ENDIF DYNAMIC_LINK}
  2033. {$IFDEF DYNAMIC_LINK}
  2034. var
  2035.   _DnsModifyRecordsInSet_UTF8: Pointer;
  2036. function DnsModifyRecordsInSet_UTF8;
  2037. begin
  2038.   GetProcedureAddress(_DnsModifyRecordsInSet_UTF8, dnsapi, 'DnsModifyRecordsInSet_UTF8');
  2039.   asm
  2040.     mov esp, ebp
  2041.     pop ebp
  2042.     jmp [_DnsModifyRecordsInSet_UTF8]
  2043.   end;
  2044. end;
  2045. {$ELSE}
  2046. function DnsModifyRecordsInSet_UTF8; external dnsapi name 'DnsModifyRecordsInSet_UTF8';
  2047. {$ENDIF DYNAMIC_LINK}
  2048. {$IFDEF UNICODE}
  2049. {$IFDEF DYNAMIC_LINK}
  2050. var
  2051.   _DnsModifyRecordsInSet: Pointer;
  2052. function DnsModifyRecordsInSet;
  2053. begin
  2054.   GetProcedureAddress(_DnsModifyRecordsInSet, dnsapi, 'DnsModifyRecordsInSet_W');
  2055.   asm
  2056.     mov esp, ebp
  2057.     pop ebp
  2058.     jmp [_DnsModifyRecordsInSet]
  2059.   end;
  2060. end;
  2061. {$ELSE}
  2062. function DnsModifyRecordsInSet; external dnsapi name 'DnsModifyRecordsInSet_W';
  2063. {$ENDIF DYNAMIC_LINK}
  2064. {$ELSE}
  2065. {$IFDEF DYNAMIC_LINK}
  2066. var
  2067.   _DnsModifyRecordsInSet: Pointer;
  2068. function DnsModifyRecordsInSet;
  2069. begin
  2070.   GetProcedureAddress(_DnsModifyRecordsInSet, dnsapi, 'DnsModifyRecordsInSet_A');
  2071.   asm
  2072.     mov esp, ebp
  2073.     pop ebp
  2074.     jmp [_DnsModifyRecordsInSet]
  2075.   end;
  2076. end;
  2077. {$ELSE}
  2078. function DnsModifyRecordsInSet; external dnsapi name 'DnsModifyRecordsInSet_A';
  2079. {$ENDIF DYNAMIC_LINK}
  2080. {$ENDIF}
  2081. {$IFDEF DYNAMIC_LINK}
  2082. var
  2083.   _DnsReplaceRecordSetW: Pointer;
  2084. function DnsReplaceRecordSetW;
  2085. begin
  2086.   GetProcedureAddress(_DnsReplaceRecordSetW, dnsapi, 'DnsReplaceRecordSetW');
  2087.   asm
  2088.     mov esp, ebp
  2089.     pop ebp
  2090.     jmp [_DnsReplaceRecordSetW]
  2091.   end;
  2092. end;
  2093. {$ELSE}
  2094. function DnsReplaceRecordSetW; external dnsapi name 'DnsReplaceRecordSetW';
  2095. {$ENDIF DYNAMIC_LINK}
  2096. {$IFDEF DYNAMIC_LINK}
  2097. var
  2098.   _DnsReplaceRecordSetA: Pointer;
  2099. function DnsReplaceRecordSetA;
  2100. begin
  2101.   GetProcedureAddress(_DnsReplaceRecordSetA, dnsapi, 'DnsReplaceRecordSetA');
  2102.   asm
  2103.     mov esp, ebp
  2104.     pop ebp
  2105.     jmp [_DnsReplaceRecordSetA]
  2106.   end;
  2107. end;
  2108. {$ELSE}
  2109. function DnsReplaceRecordSetA; external dnsapi name 'DnsReplaceRecordSetA';
  2110. {$ENDIF DYNAMIC_LINK}
  2111. {$IFDEF DYNAMIC_LINK}
  2112. var
  2113.   _DnsReplaceRecordSetUTF8: Pointer;
  2114. function DnsReplaceRecordSetUTF8;
  2115. begin
  2116.   GetProcedureAddress(_DnsReplaceRecordSetUTF8, dnsapi, 'DnsReplaceRecordSetUTF8');
  2117.   asm
  2118.     mov esp, ebp
  2119.     pop ebp
  2120.     jmp [_DnsReplaceRecordSetUTF8]
  2121.   end;
  2122. end;
  2123. {$ELSE}
  2124. function DnsReplaceRecordSetUTF8; external dnsapi name 'DnsReplaceRecordSetUTF8';
  2125. {$ENDIF DYNAMIC_LINK}
  2126. {$IFDEF UNICODE}
  2127. {$IFDEF DYNAMIC_LINK}
  2128. var
  2129.   _DnsReplaceRecordSet: Pointer;
  2130. function DnsReplaceRecordSet;
  2131. begin
  2132.   GetProcedureAddress(_DnsReplaceRecordSet, dnsapi, 'DnsReplaceRecordSetW');
  2133.   asm
  2134.     mov esp, ebp
  2135.     pop ebp
  2136.     jmp [_DnsReplaceRecordSet]
  2137.   end;
  2138. end;
  2139. {$ELSE}
  2140. function DnsReplaceRecordSet; external dnsapi name 'DnsReplaceRecordSetW';
  2141. {$ENDIF DYNAMIC_LINK}
  2142. {$ELSE}
  2143. {$IFDEF DYNAMIC_LINK}
  2144. var
  2145.   _DnsReplaceRecordSet: Pointer;
  2146. function DnsReplaceRecordSet;
  2147. begin
  2148.   GetProcedureAddress(_DnsReplaceRecordSet, dnsapi, 'DnsReplaceRecordSetA');
  2149.   asm
  2150.     mov esp, ebp
  2151.     pop ebp
  2152.     jmp [_DnsReplaceRecordSet]
  2153.   end;
  2154. end;
  2155. {$ELSE}
  2156. function DnsReplaceRecordSet; external dnsapi name 'DnsReplaceRecordSetA';
  2157. {$ENDIF DYNAMIC_LINK}
  2158. {$ENDIF}
  2159. {$IFDEF DYNAMIC_LINK}
  2160. var
  2161.   _DnsValidateName_UTF8: Pointer;
  2162. function DnsValidateName_UTF8;
  2163. begin
  2164.   GetProcedureAddress(_DnsValidateName_UTF8, dnsapi, 'DnsValidateName_UTF8');
  2165.   asm
  2166.     mov esp, ebp
  2167.     pop ebp
  2168.     jmp [_DnsValidateName_UTF8]
  2169.   end;
  2170. end;
  2171. {$ELSE}
  2172. function DnsValidateName_UTF8; external dnsapi name 'DnsValidateName_UTF8';
  2173. {$ENDIF DYNAMIC_LINK}
  2174. {$IFDEF DYNAMIC_LINK}
  2175. var
  2176.   _DnsValidateName_W: Pointer;
  2177. function DnsValidateName_W;
  2178. begin
  2179.   GetProcedureAddress(_DnsValidateName_W, dnsapi, 'DnsValidateName_W');
  2180.   asm
  2181.     mov esp, ebp
  2182.     pop ebp
  2183.     jmp [_DnsValidateName_W]
  2184.   end;
  2185. end;
  2186. {$ELSE}
  2187. function DnsValidateName_W; external dnsapi name 'DnsValidateName_W';
  2188. {$ENDIF DYNAMIC_LINK}
  2189. {$IFDEF DYNAMIC_LINK}
  2190. var
  2191.   _DnsValidateName_A: Pointer;
  2192. function DnsValidateName_A;
  2193. begin
  2194.   GetProcedureAddress(_DnsValidateName_A, dnsapi, 'DnsValidateName_A');
  2195.   asm
  2196.     mov esp, ebp
  2197.     pop ebp
  2198.     jmp [_DnsValidateName_A]
  2199.   end;
  2200. end;
  2201. {$ELSE}
  2202. function DnsValidateName_A; external dnsapi name 'DnsValidateName_A';
  2203. {$ENDIF DYNAMIC_LINK}
  2204. {$IFDEF UNICODE}
  2205. function DnsValidateName(pszName: LPCWSTR; Format: DNS_NAME_FORMAT): DNS_STATUS;
  2206. begin
  2207.   Result := DnsValidateName_W(pszName, Format);
  2208. end;
  2209. {$ELSE}
  2210. function DnsValidateName(pszName: LPCSTR; Format: DNS_NAME_FORMAT): DNS_STATUS;
  2211. begin
  2212.   Result := DnsValidateName_A(pszName, Format);
  2213. end;
  2214. {$ENDIF}
  2215. {$IFDEF DYNAMIC_LINK}
  2216. var
  2217.   _DnsNameCompare_A: Pointer;
  2218. function DnsNameCompare_A;
  2219. begin
  2220.   GetProcedureAddress(_DnsNameCompare_A, dnsapi, 'DnsNameCompare_A');
  2221.   asm
  2222.     mov esp, ebp
  2223.     pop ebp
  2224.     jmp [_DnsNameCompare_A]
  2225.   end;
  2226. end;
  2227. {$ELSE}
  2228. function DnsNameCompare_A; external dnsapi name 'DnsNameCompare_A';
  2229. {$ENDIF DYNAMIC_LINK}
  2230. {$IFDEF DYNAMIC_LINK}
  2231. var
  2232.   _DnsNameCompare_W: Pointer;
  2233. function DnsNameCompare_W;
  2234. begin
  2235.   GetProcedureAddress(_DnsNameCompare_W, dnsapi, 'DnsNameCompare_W');
  2236.   asm
  2237.     mov esp, ebp
  2238.     pop ebp
  2239.     jmp [_DnsNameCompare_W]
  2240.   end;
  2241. end;
  2242. {$ELSE}
  2243. function DnsNameCompare_W; external dnsapi name 'DnsNameCompare_W';
  2244. {$ENDIF DYNAMIC_LINK}
  2245. {$IFDEF UNICODE}
  2246. {$IFDEF DYNAMIC_LINK}
  2247. var
  2248.   _DnsNameCompare: Pointer;
  2249. function DnsNameCompare;
  2250. begin
  2251.   GetProcedureAddress(_DnsNameCompare, dnsapi, 'DnsNameCompare_W');
  2252.   asm
  2253.     mov esp, ebp
  2254.     pop ebp
  2255.     jmp [_DnsNameCompare]
  2256.   end;
  2257. end;
  2258. {$ELSE}
  2259. function DnsNameCompare; external dnsapi name 'DnsNameCompare_W';
  2260. {$ENDIF DYNAMIC_LINK}
  2261. {$ELSE}
  2262. {$IFDEF DYNAMIC_LINK}
  2263. var
  2264.   _DnsNameCompare: Pointer;
  2265. function DnsNameCompare;
  2266. begin
  2267.   GetProcedureAddress(_DnsNameCompare, dnsapi, 'DnsNameCompare_A');
  2268.   asm
  2269.     mov esp, ebp
  2270.     pop ebp
  2271.     jmp [_DnsNameCompare]
  2272.   end;
  2273. end;
  2274. {$ELSE}
  2275. function DnsNameCompare; external dnsapi name 'DnsNameCompare_A';
  2276. {$ENDIF DYNAMIC_LINK}
  2277. {$ENDIF}
  2278. {$IFDEF DYNAMIC_LINK}
  2279. var
  2280.   _DnsWriteQuestionToBuffer_W: Pointer;
  2281. function DnsWriteQuestionToBuffer_W;
  2282. begin
  2283.   GetProcedureAddress(_DnsWriteQuestionToBuffer_W, dnsapi, 'DnsWriteQuestionToBuffer_W');
  2284.   asm
  2285.     mov esp, ebp
  2286.     pop ebp
  2287.     jmp [_DnsWriteQuestionToBuffer_W]
  2288.   end;
  2289. end;
  2290. {$ELSE}
  2291. function DnsWriteQuestionToBuffer_W; external dnsapi name 'DnsWriteQuestionToBuffer_W';
  2292. {$ENDIF DYNAMIC_LINK}
  2293. {$IFDEF DYNAMIC_LINK}
  2294. var
  2295.   _DnsWriteQuestionToBuffer_UTF8: Pointer;
  2296. function DnsWriteQuestionToBuffer_UTF8;
  2297. begin
  2298.   GetProcedureAddress(_DnsWriteQuestionToBuffer_UTF8, dnsapi, 'DnsWriteQuestionToBuffer_UTF8');
  2299.   asm
  2300.     mov esp, ebp
  2301.     pop ebp
  2302.     jmp [_DnsWriteQuestionToBuffer_UTF8]
  2303.   end;
  2304. end;
  2305. {$ELSE}
  2306. function DnsWriteQuestionToBuffer_UTF8; external dnsapi name 'DnsWriteQuestionToBuffer_UTF8';
  2307. {$ENDIF DYNAMIC_LINK}
  2308. {$IFDEF DYNAMIC_LINK}
  2309. var
  2310.   _DnsExtractRecordsFromMessage_W: Pointer;
  2311. function DnsExtractRecordsFromMessage_W;
  2312. begin
  2313.   GetProcedureAddress(_DnsExtractRecordsFromMessage_W, dnsapi, 'DnsExtractRecordsFromMessage_W');
  2314.   asm
  2315.     mov esp, ebp
  2316.     pop ebp
  2317.     jmp [_DnsExtractRecordsFromMessage_W]
  2318.   end;
  2319. end;
  2320. {$ELSE}
  2321. function DnsExtractRecordsFromMessage_W; external dnsapi name 'DnsExtractRecordsFromMessage_W';
  2322. {$ENDIF DYNAMIC_LINK}
  2323. {$IFDEF DYNAMIC_LINK}
  2324. var
  2325.   _DnsExtractRecFromMessage_UTF8: Pointer;
  2326. function DnsExtractRecordsFromMessage_UTF8;
  2327. begin
  2328.   GetProcedureAddress(_DnsExtractRecFromMessage_UTF8, dnsapi, 'DnsExtractRecordsFromMessage_UTF8');
  2329.   asm
  2330.     mov esp, ebp
  2331.     pop ebp
  2332.     jmp [_DnsExtractRecFromMessage_UTF8]
  2333.   end;
  2334. end;
  2335. {$ELSE}
  2336. function DnsExtractRecordsFromMessage_UTF8; external dnsapi name 'DnsExtractRecordsFromMessage_UTF8';
  2337. {$ENDIF DYNAMIC_LINK}
  2338. end.