jwawindns.pas 67 KB

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