jwawindns.pas 67 KB

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