2
0

jwawindns.pas 67 KB

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