WinDNS.h 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711
  1. /*++
  2. Copyright (c) 1996-2000 Microsoft Corporation
  3. Module Name:
  4. windns.h
  5. Abstract:
  6. Domain Name System (DNS)
  7. DNS definitions and DNS API.
  8. Author:
  9. Jim Gilroy (jamesg) December 7, 1996
  10. Glenn Curtis (glennc) January 22, 1997
  11. Revision History:
  12. --*/
  13. #ifndef _WINDNS_INCLUDED_
  14. #define _WINDNS_INCLUDED_
  15. #ifdef __cplusplus
  16. extern "C"
  17. {
  18. #endif // __cplusplus
  19. //
  20. // Define QWORD -- not yet defined globally
  21. //
  22. typedef unsigned __int64 QWORD;
  23. //
  24. // DNS public types
  25. //
  26. typedef LONG DNS_STATUS, *PDNS_STATUS;
  27. //
  28. // IP Address
  29. //
  30. typedef DWORD IP4_ADDRESS, *PIP4_ADDRESS;
  31. #define SIZEOF_IP4_ADDRESS (4)
  32. #define IP4_ADDRESS_STRING_LENGTH (15)
  33. #define IP4_ADDRESS_STRING_BUFFER_LENGTH (16)
  34. //
  35. // IP Address Array type
  36. //
  37. typedef struct _IP4_ARRAY
  38. {
  39. DWORD AddrCount;
  40. #ifdef MIDL_PASS
  41. [size_is( AddrCount )] IP4_ADDRESS AddrArray[];
  42. #else
  43. IP4_ADDRESS AddrArray[1];
  44. #endif
  45. }
  46. IP4_ARRAY, *PIP4_ARRAY;
  47. //
  48. // IPv6 Address
  49. //
  50. #ifdef MIDL_PASS
  51. typedef struct
  52. {
  53. #ifdef _WIN64
  54. QWORD IP6Qword[2];
  55. #else
  56. DWORD IP6Dword[4];
  57. #endif
  58. }
  59. IP6_ADDRESS, *PIP6_ADDRESS;
  60. #else
  61. typedef union
  62. {
  63. #ifdef _WIN64
  64. QWORD IP6Qword[2];
  65. #endif
  66. DWORD IP6Dword[4];
  67. WORD IP6Word[8];
  68. BYTE IP6Byte[16];
  69. #ifdef IN6_ADDR
  70. IN6_ADDR In6;
  71. #endif
  72. }
  73. IP6_ADDRESS, *PIP6_ADDRESS;
  74. #endif
  75. // Backward compatibility
  76. typedef IP6_ADDRESS DNS_IP6_ADDRESS, *PDNS_IP6_ADDRESS;
  77. //
  78. // IP6 string max is 45 bytes
  79. // - 6 WORDs in colon+hex (5 chars)
  80. // - last DWORD as IP4 (15 chars)
  81. //
  82. #undef IP6_ADDRESS_STRING_LENGTH
  83. #define IP6_ADDRESS_STRING_LENGTH (47)
  84. #define IP6_ADDRESS_STRING_BUFFER_LENGTH (48)
  85. // backcompat
  86. #define IPV6_ADDRESS_STRING_LENGTH IP6_ADDRESS_STRING_LENGTH
  87. //
  88. // Inline byte flipping -- can be done in registers
  89. //
  90. #define INLINE_WORD_FLIP(out, in) \
  91. { \
  92. WORD _in = (in); \
  93. (out) = (_in << 8) | (_in >> 8); \
  94. }
  95. #define INLINE_HTONS(out, in) INLINE_WORD_FLIP(out, in)
  96. #define INLINE_NTOHS(out, in) INLINE_WORD_FLIP(out, in)
  97. #define INLINE_DWORD_FLIP(out, in) \
  98. { \
  99. DWORD _in = (in); \
  100. (out) = ((_in << 8) & 0x00ff0000) | \
  101. (_in << 24) | \
  102. ((_in >> 8) & 0x0000ff00) | \
  103. (_in >> 24); \
  104. }
  105. #define INLINE_NTOHL(out, in) INLINE_DWORD_FLIP(out, in)
  106. #define INLINE_HTONL(out, in) INLINE_DWORD_FLIP(out, in)
  107. //
  108. // Inline byte flip and write to packet (unaligned)
  109. //
  110. #define INLINE_WRITE_FLIPPED_WORD( pout, in ) \
  111. INLINE_WORD_FLIP( *((UNALIGNED WORD *)(pout)), in )
  112. #define INLINE_WRITE_FLIPPED_DWORD( pout, in ) \
  113. INLINE_DWORD_FLIP( *((UNALIGNED DWORD *)(pout)), in )
  114. //
  115. // Basic DNS definitions
  116. //
  117. //
  118. // DNS port for both UDP and TCP is 53.
  119. //
  120. #define DNS_PORT_HOST_ORDER (0x0035) // port 53
  121. #define DNS_PORT_NET_ORDER (0x3500)
  122. //
  123. // DNS UDP packets no more than 512 bytes
  124. //
  125. #define DNS_RFC_MAX_UDP_PACKET_LENGTH (512)
  126. //
  127. // DNS Names limited to 255, 63 in any one label
  128. //
  129. #define DNS_MAX_NAME_LENGTH (255)
  130. #define DNS_MAX_LABEL_LENGTH (63)
  131. #define DNS_MAX_NAME_BUFFER_LENGTH (256)
  132. #define DNS_MAX_LABEL_BUFFER_LENGTH (64)
  133. //
  134. // Reverse lookup domain names
  135. //
  136. #define DNS_IP4_REVERSE_DOMAIN_STRING_A ("in-addr.arpa.")
  137. #define DNS_IP4_REVERSE_DOMAIN_STRING_W (L"in-addr.arpa.")
  138. #define DNS_MAX_IP4_REVERSE_NAME_LENGTH \
  139. (IP4_ADDRESS_STRING_LENGTH+1+sizeof(DNS_IP4_REVERSE_DOMAIN_STRING_A))
  140. #define DNS_MAX_IP4_REVERSE_NAME_BUFFER_LENGTH \
  141. (DNS_MAX_IP4_REVERSE_NAME_LENGTH + 1)
  142. #define DNS_IP6_REVERSE_DOMAIN_STRING_A ("ip6.arpa.")
  143. #define DNS_IP6_REVERSE_DOMAIN_STRING_W (L"ip6.arpa.")
  144. #define DNS_MAX_IP6_REVERSE_NAME_LENGTH \
  145. (64+sizeof(DNS_IP6_REVERSE_DOMAIN_STRING_A))
  146. #define DNS_MAX_IP6_REVERSE_NAME_BUFFER_LENGTH \
  147. (DNS_MAX_IP6_REVERSE_NAME_LENGTH + 1)
  148. // Combined
  149. #define DNS_MAX_REVERSE_NAME_LENGTH DNS_MAX_IP6_REVERSE_NAME_LENGTH
  150. #define DNS_MAX_REVERSE_NAME_BUFFER_LENGTH DNS_MAX_IP6_REVERSE_NAME_BUFFER_LENGTH
  151. #ifdef UNICODE
  152. #define DNS_IP4_REVERSE_DOMAIN_STRING DNS_IP4_REVERSE_DOMAIN_STRING_W
  153. #define DNS_IP6_REVERSE_DOMAIN_STRING DNS_IP6_REVERSE_DOMAIN_STRING_W
  154. #else
  155. #define DNS_IP4_REVERSE_DOMAIN_STRING DNS_IP4_REVERSE_DOMAIN_STRING_A
  156. #define DNS_IP6_REVERSE_DOMAIN_STRING DNS_IP6_REVERSE_DOMAIN_STRING_A
  157. #endif
  158. //
  159. // DNS Text string limited by size representable
  160. // in a single byte length field
  161. #define DNS_MAX_TEXT_STRING_LENGTH (255)
  162. //
  163. // DNS On-The-Wire Structures
  164. //
  165. #pragma pack(1)
  166. //
  167. // DNS Message Header
  168. //
  169. typedef struct _DNS_HEADER
  170. {
  171. WORD Xid;
  172. BYTE RecursionDesired : 1;
  173. BYTE Truncation : 1;
  174. BYTE Authoritative : 1;
  175. BYTE Opcode : 4;
  176. BYTE IsResponse : 1;
  177. BYTE ResponseCode : 4;
  178. BYTE Reserved : 3;
  179. BYTE RecursionAvailable : 1;
  180. WORD QuestionCount;
  181. WORD AnswerCount;
  182. WORD NameServerCount;
  183. WORD AdditionalCount;
  184. }
  185. DNS_HEADER, *PDNS_HEADER;
  186. //
  187. // Flags as WORD
  188. //
  189. #define DNS_HEADER_FLAGS(pHead) ( *((PWORD)(pHead)+1) )
  190. //
  191. // Byte flip DNS header to\from host order.
  192. //
  193. // Note that this does NOT flip flags, as definition above defines
  194. // flags as individual bytes for direct access to net byte order.
  195. //
  196. #define DNS_BYTE_FLIP_HEADER_COUNTS(pHeader) \
  197. { \
  198. PDNS_HEADER _head = (pHeader); \
  199. INLINE_HTONS(_head->Xid, _head->Xid ); \
  200. INLINE_HTONS(_head->QuestionCount, _head->QuestionCount ); \
  201. INLINE_HTONS(_head->AnswerCount, _head->AnswerCount ); \
  202. INLINE_HTONS(_head->NameServerCount,_head->NameServerCount ); \
  203. INLINE_HTONS(_head->AdditionalCount,_head->AdditionalCount ); \
  204. }
  205. //
  206. // Question name follows header
  207. //
  208. #define DNS_OFFSET_TO_QUESTION_NAME sizeof(DNS_HEADER)
  209. //
  210. // Question immediately follows header so compressed question name
  211. // 0xC000 | sizeof(DNS_HEADER)
  212. #define DNS_COMPRESSED_QUESTION_NAME (0xC00C)
  213. //
  214. // Packet extraction macros
  215. //
  216. #define DNS_QUESTION_NAME_FROM_HEADER( _pHeader_ ) \
  217. ( (PCHAR)( (PDNS_HEADER)(_pHeader_) + 1 ) )
  218. #define DNS_ANSWER_FROM_QUESTION( _pQuestion_ ) \
  219. ( (PCHAR)( (PDNS_QUESTION)(_pQuestion_) + 1 ) )
  220. //
  221. // DNS Question
  222. //
  223. typedef struct _DNS_WIRE_QUESTION
  224. {
  225. // Preceded by question name
  226. WORD QuestionType;
  227. WORD QuestionClass;
  228. }
  229. DNS_WIRE_QUESTION, *PDNS_WIRE_QUESTION;
  230. //
  231. // DNS Resource Record
  232. //
  233. typedef struct _DNS_WIRE_RECORD
  234. {
  235. // Preceded by record owner name
  236. WORD RecordType;
  237. WORD RecordClass;
  238. DWORD TimeToLive;
  239. WORD DataLength;
  240. // Followed by record data
  241. }
  242. DNS_WIRE_RECORD, *PDNS_WIRE_RECORD;
  243. #pragma pack()
  244. //
  245. // DNS Query Types
  246. //
  247. #define DNS_OPCODE_QUERY 0 // Query
  248. #define DNS_OPCODE_IQUERY 1 // Obsolete: IP to name
  249. #define DNS_OPCODE_SERVER_STATUS 2 // Obsolete: DNS ping
  250. #define DNS_OPCODE_UNKNOWN 3 // Unknown
  251. #define DNS_OPCODE_NOTIFY 4 // Notify
  252. #define DNS_OPCODE_UPDATE 5 // Dynamic Update
  253. //
  254. // DNS response codes.
  255. //
  256. // Sent in the "ResponseCode" field of a DNS_HEADER.
  257. //
  258. #define DNS_RCODE_NOERROR 0
  259. #define DNS_RCODE_FORMERR 1 // Format error
  260. #define DNS_RCODE_SERVFAIL 2 // Server failure
  261. #define DNS_RCODE_NXDOMAIN 3 // Name error
  262. #define DNS_RCODE_NOTIMPL 4 // Not implemented
  263. #define DNS_RCODE_REFUSED 5 // Refused
  264. #define DNS_RCODE_YXDOMAIN 6 // Domain name should not exist
  265. #define DNS_RCODE_YXRRSET 7 // RR set should not exist
  266. #define DNS_RCODE_NXRRSET 8 // RR set does not exist
  267. #define DNS_RCODE_NOTAUTH 9 // Not authoritative for zone
  268. #define DNS_RCODE_NOTZONE 10 // Name is not zone
  269. #define DNS_RCODE_MAX 15
  270. //
  271. // Extended RCODEs
  272. //
  273. #define DNS_RCODE_BADVERS 16 // Bad EDNS version
  274. #define DNS_RCODE_BADSIG 16 // Bad signature
  275. #define DNS_RCODE_BADKEY 17 // Bad key
  276. #define DNS_RCODE_BADTIME 18 // Bad timestamp
  277. //
  278. // Mappings to friendly names
  279. //
  280. #define DNS_RCODE_NO_ERROR DNS_RCODE_NOERROR
  281. #define DNS_RCODE_FORMAT_ERROR DNS_RCODE_FORMERR
  282. #define DNS_RCODE_SERVER_FAILURE DNS_RCODE_SERVFAIL
  283. #define DNS_RCODE_NAME_ERROR DNS_RCODE_NXDOMAIN
  284. #define DNS_RCODE_NOT_IMPLEMENTED DNS_RCODE_NOTIMPL
  285. //
  286. // DNS Classes
  287. //
  288. // Classes are on the wire as WORDs.
  289. //
  290. // _CLASS_ defines in host order.
  291. // _RCLASS_ defines in net byte order.
  292. //
  293. // Generally we'll avoid byte flip and test class in net byte order.
  294. //
  295. #define DNS_CLASS_INTERNET 0x0001 // 1
  296. #define DNS_CLASS_CSNET 0x0002 // 2
  297. #define DNS_CLASS_CHAOS 0x0003 // 3
  298. #define DNS_CLASS_HESIOD 0x0004 // 4
  299. #define DNS_CLASS_NONE 0x00fe // 254
  300. #define DNS_CLASS_ALL 0x00ff // 255
  301. #define DNS_CLASS_ANY 0x00ff // 255
  302. #define DNS_RCLASS_INTERNET 0x0100 // 1
  303. #define DNS_RCLASS_CSNET 0x0200 // 2
  304. #define DNS_RCLASS_CHAOS 0x0300 // 3
  305. #define DNS_RCLASS_HESIOD 0x0400 // 4
  306. #define DNS_RCLASS_NONE 0xfe00 // 254
  307. #define DNS_RCLASS_ALL 0xff00 // 255
  308. #define DNS_RCLASS_ANY 0xff00 // 255
  309. //
  310. // DNS Record Types
  311. //
  312. // _TYPE_ defines are in host byte order.
  313. // _RTYPE_ defines are in net byte order.
  314. //
  315. // Generally always deal with types in host byte order as we index
  316. // resource record functions by type.
  317. //
  318. #define DNS_TYPE_ZERO 0x0000
  319. // RFC 1034/1035
  320. #define DNS_TYPE_A 0x0001 // 1
  321. #define DNS_TYPE_NS 0x0002 // 2
  322. #define DNS_TYPE_MD 0x0003 // 3
  323. #define DNS_TYPE_MF 0x0004 // 4
  324. #define DNS_TYPE_CNAME 0x0005 // 5
  325. #define DNS_TYPE_SOA 0x0006 // 6
  326. #define DNS_TYPE_MB 0x0007 // 7
  327. #define DNS_TYPE_MG 0x0008 // 8
  328. #define DNS_TYPE_MR 0x0009 // 9
  329. #define DNS_TYPE_NULL 0x000a // 10
  330. #define DNS_TYPE_WKS 0x000b // 11
  331. #define DNS_TYPE_PTR 0x000c // 12
  332. #define DNS_TYPE_HINFO 0x000d // 13
  333. #define DNS_TYPE_MINFO 0x000e // 14
  334. #define DNS_TYPE_MX 0x000f // 15
  335. #define DNS_TYPE_TEXT 0x0010 // 16
  336. // RFC 1183
  337. #define DNS_TYPE_RP 0x0011 // 17
  338. #define DNS_TYPE_AFSDB 0x0012 // 18
  339. #define DNS_TYPE_X25 0x0013 // 19
  340. #define DNS_TYPE_ISDN 0x0014 // 20
  341. #define DNS_TYPE_RT 0x0015 // 21
  342. // RFC 1348
  343. #define DNS_TYPE_NSAP 0x0016 // 22
  344. #define DNS_TYPE_NSAPPTR 0x0017 // 23
  345. // RFC 2065 (DNS security)
  346. #define DNS_TYPE_SIG 0x0018 // 24
  347. #define DNS_TYPE_KEY 0x0019 // 25
  348. // RFC 1664 (X.400 mail)
  349. #define DNS_TYPE_PX 0x001a // 26
  350. // RFC 1712 (Geographic position)
  351. #define DNS_TYPE_GPOS 0x001b // 27
  352. // RFC 1886 (IPv6 Address)
  353. #define DNS_TYPE_AAAA 0x001c // 28
  354. // RFC 1876 (Geographic location)
  355. #define DNS_TYPE_LOC 0x001d // 29
  356. // RFC 2065 (Secure negative response)
  357. #define DNS_TYPE_NXT 0x001e // 30
  358. // Patton (Endpoint Identifier)
  359. #define DNS_TYPE_EID 0x001f // 31
  360. // Patton (Nimrod Locator)
  361. #define DNS_TYPE_NIMLOC 0x0020 // 32
  362. // RFC 2052 (Service location)
  363. #define DNS_TYPE_SRV 0x0021 // 33
  364. // ATM Standard something-or-another (ATM Address)
  365. #define DNS_TYPE_ATMA 0x0022 // 34
  366. // RFC 2168 (Naming Authority Pointer)
  367. #define DNS_TYPE_NAPTR 0x0023 // 35
  368. // RFC 2230 (Key Exchanger)
  369. #define DNS_TYPE_KX 0x0024 // 36
  370. // RFC 2538 (CERT)
  371. #define DNS_TYPE_CERT 0x0025 // 37
  372. // A6 Draft (A6)
  373. #define DNS_TYPE_A6 0x0026 // 38
  374. // DNAME Draft (DNAME)
  375. #define DNS_TYPE_DNAME 0x0027 // 39
  376. // Eastlake (Kitchen Sink)
  377. #define DNS_TYPE_SINK 0x0028 // 40
  378. // RFC 2671 (EDNS OPT)
  379. #define DNS_TYPE_OPT 0x0029 // 41
  380. //
  381. // IANA Reserved
  382. //
  383. #define DNS_TYPE_UINFO 0x0064 // 100
  384. #define DNS_TYPE_UID 0x0065 // 101
  385. #define DNS_TYPE_GID 0x0066 // 102
  386. #define DNS_TYPE_UNSPEC 0x0067 // 103
  387. //
  388. // Query only types (1035, 1995)
  389. // - Crawford (ADDRS)
  390. // - TKEY draft (TKEY)
  391. // - TSIG draft (TSIG)
  392. // - RFC 1995 (IXFR)
  393. // - RFC 1035 (AXFR up)
  394. //
  395. #define DNS_TYPE_ADDRS 0x00f8 // 248
  396. #define DNS_TYPE_TKEY 0x00f9 // 249
  397. #define DNS_TYPE_TSIG 0x00fa // 250
  398. #define DNS_TYPE_IXFR 0x00fb // 251
  399. #define DNS_TYPE_AXFR 0x00fc // 252
  400. #define DNS_TYPE_MAILB 0x00fd // 253
  401. #define DNS_TYPE_MAILA 0x00fe // 254
  402. #define DNS_TYPE_ALL 0x00ff // 255
  403. #define DNS_TYPE_ANY 0x00ff // 255
  404. //
  405. // Temp Microsoft types -- use until get IANA approval for real type
  406. //
  407. #define DNS_TYPE_WINS 0xff01 // 64K - 255
  408. #define DNS_TYPE_WINSR 0xff02 // 64K - 254
  409. #define DNS_TYPE_NBSTAT (DNS_TYPE_WINSR)
  410. //
  411. // DNS Record Types -- Net Byte Order
  412. //
  413. #define DNS_RTYPE_A 0x0100 // 1
  414. #define DNS_RTYPE_NS 0x0200 // 2
  415. #define DNS_RTYPE_MD 0x0300 // 3
  416. #define DNS_RTYPE_MF 0x0400 // 4
  417. #define DNS_RTYPE_CNAME 0x0500 // 5
  418. #define DNS_RTYPE_SOA 0x0600 // 6
  419. #define DNS_RTYPE_MB 0x0700 // 7
  420. #define DNS_RTYPE_MG 0x0800 // 8
  421. #define DNS_RTYPE_MR 0x0900 // 9
  422. #define DNS_RTYPE_NULL 0x0a00 // 10
  423. #define DNS_RTYPE_WKS 0x0b00 // 11
  424. #define DNS_RTYPE_PTR 0x0c00 // 12
  425. #define DNS_RTYPE_HINFO 0x0d00 // 13
  426. #define DNS_RTYPE_MINFO 0x0e00 // 14
  427. #define DNS_RTYPE_MX 0x0f00 // 15
  428. #define DNS_RTYPE_TEXT 0x1000 // 16
  429. #define DNS_RTYPE_RP 0x1100 // 17
  430. #define DNS_RTYPE_AFSDB 0x1200 // 18
  431. #define DNS_RTYPE_X25 0x1300 // 19
  432. #define DNS_RTYPE_ISDN 0x1400 // 20
  433. #define DNS_RTYPE_RT 0x1500 // 21
  434. #define DNS_RTYPE_NSAP 0x1600 // 22
  435. #define DNS_RTYPE_NSAPPTR 0x1700 // 23
  436. #define DNS_RTYPE_SIG 0x1800 // 24
  437. #define DNS_RTYPE_KEY 0x1900 // 25
  438. #define DNS_RTYPE_PX 0x1a00 // 26
  439. #define DNS_RTYPE_GPOS 0x1b00 // 27
  440. #define DNS_RTYPE_AAAA 0x1c00 // 28
  441. #define DNS_RTYPE_LOC 0x1d00 // 29
  442. #define DNS_RTYPE_NXT 0x1e00 // 30
  443. #define DNS_RTYPE_EID 0x1f00 // 31
  444. #define DNS_RTYPE_NIMLOC 0x2000 // 32
  445. #define DNS_RTYPE_SRV 0x2100 // 33
  446. #define DNS_RTYPE_ATMA 0x2200 // 34
  447. #define DNS_RTYPE_NAPTR 0x2300 // 35
  448. #define DNS_RTYPE_KX 0x2400 // 36
  449. #define DNS_RTYPE_CERT 0x2500 // 37
  450. #define DNS_RTYPE_A6 0x2600 // 38
  451. #define DNS_RTYPE_DNAME 0x2700 // 39
  452. #define DNS_RTYPE_SINK 0x2800 // 40
  453. #define DNS_RTYPE_OPT 0x2900 // 41
  454. //
  455. // IANA Reserved
  456. //
  457. #define DNS_RTYPE_UINFO 0x6400 // 100
  458. #define DNS_RTYPE_UID 0x6500 // 101
  459. #define DNS_RTYPE_GID 0x6600 // 102
  460. #define DNS_RTYPE_UNSPEC 0x6700 // 103
  461. //
  462. // Query only types
  463. //
  464. #define DNS_RTYPE_TKEY 0xf900 // 249
  465. #define DNS_RTYPE_TSIG 0xfa00 // 250
  466. #define DNS_RTYPE_IXFR 0xfb00 // 251
  467. #define DNS_RTYPE_AXFR 0xfc00 // 252
  468. #define DNS_RTYPE_MAILB 0xfd00 // 253
  469. #define DNS_RTYPE_MAILA 0xfe00 // 254
  470. #define DNS_RTYPE_ALL 0xff00 // 255
  471. #define DNS_RTYPE_ANY 0xff00 // 255
  472. //
  473. // Temp Microsoft types -- use until get IANA approval for real type
  474. //
  475. #define DNS_RTYPE_WINS 0x01ff // 64K - 255
  476. #define DNS_RTYPE_WINSR 0x02ff // 64K - 254
  477. //
  478. // Record type specific definitions
  479. //
  480. //
  481. // ATMA (ATM address type) formats
  482. //
  483. // Define these directly for any environment (ex NT4)
  484. // without winsock2 ATM support (ws2atm.h)
  485. //
  486. #ifndef ATMA_E164
  487. #define DNS_ATMA_FORMAT_E164 1
  488. #define DNS_ATMA_FORMAT_AESA 2
  489. #define DNS_ATMA_MAX_ADDR_LENGTH (20)
  490. #else
  491. #define DNS_ATMA_FORMAT_E164 ATM_E164
  492. #define DNS_ATMA_FORMAT_AESA ATM_AESA
  493. #define DNS_ATMA_MAX_ADDR_LENGTH ATM_ADDR_SIZE
  494. #endif
  495. #define DNS_ATMA_AESA_ADDR_LENGTH (20)
  496. #define DNS_ATMA_MAX_RECORD_LENGTH (DNS_ATMA_MAX_ADDR_LENGTH+1)
  497. //
  498. // DNSSEC defs
  499. //
  500. // DNSSEC algorithms
  501. #define DNSSEC_ALGORITHM_RSAMD5 1
  502. #define DNSSEC_ALGORITHM_NULL 253
  503. #define DNSSEC_ALGORITHM_PRIVATE 254
  504. // DNSSEC KEY protocol table
  505. #define DNSSEC_PROTOCOL_NONE 0
  506. #define DNSSEC_PROTOCOL_TLS 1
  507. #define DNSSEC_PROTOCOL_EMAIL 2
  508. #define DNSSEC_PROTOCOL_DNSSEC 3
  509. #define DNSSEC_PROTOCOL_IPSEC 4
  510. // DNSSEC KEY flag field
  511. #define DNSSEC_KEY_FLAG_NOAUTH 0x0001
  512. #define DNSSEC_KEY_FLAG_NOCONF 0x0002
  513. #define DNSSEC_KEY_FLAG_FLAG2 0x0004
  514. #define DNSSEC_KEY_FLAG_EXTEND 0x0008
  515. #define DNSSEC_KEY_FLAG_
  516. #define DNSSEC_KEY_FLAG_FLAG4 0x0010
  517. #define DNSSEC_KEY_FLAG_FLAG5 0x0020
  518. // bits 6,7 are name type
  519. #define DNSSEC_KEY_FLAG_USER 0x0000
  520. #define DNSSEC_KEY_FLAG_ZONE 0x0040
  521. #define DNSSEC_KEY_FLAG_HOST 0x0080
  522. #define DNSSEC_KEY_FLAG_NTPE3 0x00c0
  523. // bits 8-11 are reserved for future use
  524. #define DNSSEC_KEY_FLAG_FLAG8 0x0100
  525. #define DNSSEC_KEY_FLAG_FLAG9 0x0200
  526. #define DNSSEC_KEY_FLAG_FLAG10 0x0400
  527. #define DNSSEC_KEY_FLAG_FLAG11 0x0800
  528. // bits 12-15 are sig field
  529. #define DNSSEC_KEY_FLAG_SIG0 0x0000
  530. #define DNSSEC_KEY_FLAG_SIG1 0x1000
  531. #define DNSSEC_KEY_FLAG_SIG2 0x2000
  532. #define DNSSEC_KEY_FLAG_SIG3 0x3000
  533. #define DNSSEC_KEY_FLAG_SIG4 0x4000
  534. #define DNSSEC_KEY_FLAG_SIG5 0x5000
  535. #define DNSSEC_KEY_FLAG_SIG6 0x6000
  536. #define DNSSEC_KEY_FLAG_SIG7 0x7000
  537. #define DNSSEC_KEY_FLAG_SIG8 0x8000
  538. #define DNSSEC_KEY_FLAG_SIG9 0x9000
  539. #define DNSSEC_KEY_FLAG_SIG10 0xa000
  540. #define DNSSEC_KEY_FLAG_SIG11 0xb000
  541. #define DNSSEC_KEY_FLAG_SIG12 0xc000
  542. #define DNSSEC_KEY_FLAG_SIG13 0xd000
  543. #define DNSSEC_KEY_FLAG_SIG14 0xe000
  544. #define DNSSEC_KEY_FLAG_SIG15 0xf000
  545. //
  546. // TKEY modes
  547. //
  548. #define DNS_TKEY_MODE_SERVER_ASSIGN 1
  549. #define DNS_TKEY_MODE_DIFFIE_HELLMAN 2
  550. #define DNS_TKEY_MODE_GSS 3
  551. #define DNS_TKEY_MODE_RESOLVER_ASSIGN 4
  552. //
  553. // WINS + NBSTAT flag field
  554. //
  555. #define DNS_WINS_FLAG_SCOPE (0x80000000)
  556. #define DNS_WINS_FLAG_LOCAL (0x00010000)
  557. //
  558. // Helpful checks
  559. //
  560. #define IS_WORD_ALIGNED(p) ( !((UINT_PTR)(p) & (UINT_PTR)1) )
  561. #define IS_DWORD_ALIGNED(p) ( !((UINT_PTR)(p) & (UINT_PTR)3) )
  562. #define IS_QWORD_ALIGNED(p) ( !((UINT_PTR)(p) & (UINT_PTR)7) )
  563. //
  564. // DNS config API
  565. //
  566. //
  567. // Types of DNS configuration info
  568. //
  569. typedef enum
  570. {
  571. // In Win2K
  572. DnsConfigPrimaryDomainName_W,
  573. DnsConfigPrimaryDomainName_A,
  574. DnsConfigPrimaryDomainName_UTF8,
  575. // Not available yet
  576. DnsConfigAdapterDomainName_W,
  577. DnsConfigAdapterDomainName_A,
  578. DnsConfigAdapterDomainName_UTF8,
  579. // In Win2K
  580. DnsConfigDnsServerList,
  581. // Not available yet
  582. DnsConfigSearchList,
  583. DnsConfigAdapterInfo,
  584. // In Win2K
  585. DnsConfigPrimaryHostNameRegistrationEnabled,
  586. DnsConfigAdapterHostNameRegistrationEnabled,
  587. DnsConfigAddressRegistrationMaxCount,
  588. // In WindowsXP
  589. DnsConfigHostName_W,
  590. DnsConfigHostName_A,
  591. DnsConfigHostName_UTF8,
  592. DnsConfigFullHostName_W,
  593. DnsConfigFullHostName_A,
  594. DnsConfigFullHostName_UTF8
  595. }
  596. DNS_CONFIG_TYPE;
  597. //
  598. // Config API flags
  599. //
  600. //
  601. // Causes config info to be allocated with LocalAlloc()
  602. //
  603. #define DNS_CONFIG_FLAG_ALLOC (0x00000001)
  604. DNS_STATUS
  605. WINAPI
  606. DnsQueryConfig(
  607. IN DNS_CONFIG_TYPE Config,
  608. IN DWORD Flag,
  609. IN PWSTR pwsAdapterName,
  610. IN PVOID pReserved,
  611. OUT PVOID pBuffer,
  612. IN OUT PDWORD pBufferLength
  613. );
  614. //
  615. // DNS resource record structure
  616. //
  617. //
  618. // Record data for specific types
  619. //
  620. typedef struct
  621. {
  622. IP4_ADDRESS IpAddress;
  623. }
  624. DNS_A_DATA, *PDNS_A_DATA;
  625. typedef struct
  626. {
  627. LPTSTR pNameHost;
  628. }
  629. DNS_PTR_DATA, *PDNS_PTR_DATA;
  630. typedef struct
  631. {
  632. LPTSTR pNamePrimaryServer;
  633. LPTSTR pNameAdministrator;
  634. DWORD dwSerialNo;
  635. DWORD dwRefresh;
  636. DWORD dwRetry;
  637. DWORD dwExpire;
  638. DWORD dwDefaultTtl;
  639. }
  640. DNS_SOA_DATA, *PDNS_SOA_DATA;
  641. typedef struct
  642. {
  643. LPTSTR pNameMailbox;
  644. LPTSTR pNameErrorsMailbox;
  645. }
  646. DNS_MINFO_DATA, *PDNS_MINFO_DATA;
  647. typedef struct
  648. {
  649. LPTSTR pNameExchange;
  650. WORD wPreference;
  651. WORD Pad; // keep ptrs DWORD aligned
  652. }
  653. DNS_MX_DATA, *PDNS_MX_DATA;
  654. typedef struct
  655. {
  656. DWORD dwStringCount;
  657. #ifdef MIDL_PASS
  658. [size_is(dwStringCount)] LPTSTR pStringArray[];
  659. #else
  660. LPTSTR pStringArray[1];
  661. #endif
  662. }
  663. DNS_TXT_DATA, *PDNS_TXT_DATA;
  664. typedef struct
  665. {
  666. DWORD dwByteCount;
  667. #ifdef MIDL_PASS
  668. [size_is(dwByteCount)] BYTE Data[];
  669. #else
  670. BYTE Data[1];
  671. #endif
  672. }
  673. DNS_NULL_DATA, *PDNS_NULL_DATA;
  674. typedef struct
  675. {
  676. IP4_ADDRESS IpAddress;
  677. UCHAR chProtocol;
  678. BYTE BitMask[1];
  679. }
  680. DNS_WKS_DATA, *PDNS_WKS_DATA;
  681. typedef struct
  682. {
  683. DNS_IP6_ADDRESS Ip6Address;
  684. }
  685. DNS_AAAA_DATA, *PDNS_AAAA_DATA;
  686. typedef struct
  687. {
  688. LPTSTR pNameSigner;
  689. WORD wTypeCovered;
  690. BYTE chAlgorithm;
  691. BYTE chLabelCount;
  692. DWORD dwOriginalTtl;
  693. DWORD dwExpiration;
  694. DWORD dwTimeSigned;
  695. WORD wKeyTag;
  696. WORD Pad; // keep byte field aligned
  697. BYTE Signature[1];
  698. }
  699. DNS_SIG_DATA, *PDNS_SIG_DATA;
  700. typedef struct
  701. {
  702. WORD wFlags;
  703. BYTE chProtocol;
  704. BYTE chAlgorithm;
  705. BYTE Key[1];
  706. }
  707. DNS_KEY_DATA, *PDNS_KEY_DATA;
  708. typedef struct
  709. {
  710. WORD wVersion;
  711. WORD wSize;
  712. WORD wHorPrec;
  713. WORD wVerPrec;
  714. DWORD dwLatitude;
  715. DWORD dwLongitude;
  716. DWORD dwAltitude;
  717. }
  718. DNS_LOC_DATA, *PDNS_LOC_DATA;
  719. typedef struct
  720. {
  721. LPTSTR pNameNext;
  722. WORD wNumTypes;
  723. WORD wTypes[1];
  724. }
  725. DNS_NXT_DATA, *PDNS_NXT_DATA;
  726. typedef struct
  727. {
  728. LPTSTR pNameTarget;
  729. WORD wPriority;
  730. WORD wWeight;
  731. WORD wPort;
  732. WORD Pad; // keep ptrs DWORD aligned
  733. }
  734. DNS_SRV_DATA, *PDNS_SRV_DATA;
  735. typedef struct
  736. {
  737. BYTE AddressType;
  738. BYTE Address[ DNS_ATMA_MAX_ADDR_LENGTH ];
  739. // E164 -- Null terminated string of less than
  740. // DNS_ATMA_MAX_ADDR_LENGTH
  741. //
  742. // For NSAP (AESA) BCD encoding of exactly
  743. // DNS_ATMA_AESA_ADDR_LENGTH
  744. }
  745. DNS_ATMA_DATA, *PDNS_ATMA_DATA;
  746. typedef struct
  747. {
  748. LPTSTR pNameAlgorithm;
  749. PBYTE pAlgorithmPacket;
  750. PBYTE pKey;
  751. PBYTE pOtherData;
  752. DWORD dwCreateTime;
  753. DWORD dwExpireTime;
  754. WORD wMode;
  755. WORD wError;
  756. WORD wKeyLength;
  757. WORD wOtherLength;
  758. UCHAR cAlgNameLength;
  759. BOOL bPacketPointers;
  760. }
  761. DNS_TKEY_DATA, *PDNS_TKEY_DATA;
  762. typedef struct
  763. {
  764. LPTSTR pNameAlgorithm;
  765. PBYTE pAlgorithmPacket;
  766. PBYTE pSignature;
  767. PBYTE pOtherData;
  768. LONGLONG i64CreateTime;
  769. WORD wFudgeTime;
  770. WORD wOriginalXid;
  771. WORD wError;
  772. WORD wSigLength;
  773. WORD wOtherLength;
  774. UCHAR cAlgNameLength;
  775. BOOL bPacketPointers;
  776. }
  777. DNS_TSIG_DATA, *PDNS_TSIG_DATA;
  778. //
  779. // MS only types -- only hit the wire in MS-MS zone transfer
  780. //
  781. typedef struct
  782. {
  783. DWORD dwMappingFlag;
  784. DWORD dwLookupTimeout;
  785. DWORD dwCacheTimeout;
  786. DWORD cWinsServerCount;
  787. IP4_ADDRESS WinsServers[1];
  788. }
  789. DNS_WINS_DATA, *PDNS_WINS_DATA;
  790. typedef struct
  791. {
  792. DWORD dwMappingFlag;
  793. DWORD dwLookupTimeout;
  794. DWORD dwCacheTimeout;
  795. LPTSTR pNameResultDomain;
  796. }
  797. DNS_WINSR_DATA, *PDNS_WINSR_DATA;
  798. //
  799. // Length of non-fixed-length data types
  800. //
  801. #define DNS_TEXT_RECORD_LENGTH(StringCount) \
  802. (FIELD_OFFSET(DNS_TXT_DATA, pStringArray) + ((StringCount) * sizeof(PCHAR)))
  803. #define DNS_NULL_RECORD_LENGTH(ByteCount) \
  804. (FIELD_OFFSET(DNS_NULL_DATA, Data) + (ByteCount))
  805. #define DNS_WKS_RECORD_LENGTH(ByteCount) \
  806. (FIELD_OFFSET(DNS_WKS_DATA, BitMask) + (ByteCount))
  807. #define DNS_WINS_RECORD_LENGTH(IpCount) \
  808. (FIELD_OFFSET(DNS_WINS_DATA, WinsServers) + ((IpCount) * sizeof(IP4_ADDRESS)))
  809. //
  810. // Record flags
  811. //
  812. typedef struct _DnsRecordFlags
  813. {
  814. DWORD Section : 2;
  815. DWORD Delete : 1;
  816. DWORD CharSet : 2;
  817. DWORD Unused : 3;
  818. DWORD Reserved : 24;
  819. }
  820. DNS_RECORD_FLAGS;
  821. //
  822. // Wire Record Sections
  823. //
  824. // Useable both in record flags "Section" and as index into
  825. // wire message header section counts.
  826. //
  827. typedef enum _DnsSection
  828. {
  829. DnsSectionQuestion,
  830. DnsSectionAnswer,
  831. DnsSectionAuthority,
  832. DnsSectionAddtional,
  833. }
  834. DNS_SECTION;
  835. // Update message section names
  836. #define DnsSectionZone DnsSectionQuestion
  837. #define DnsSectionPrereq DnsSectionAnswer
  838. #define DnsSectionUpdate DnsSectionAuthority
  839. //
  840. // Record flags as bit flags
  841. // These may be or'd together to set the fields
  842. //
  843. // RR Section in packet
  844. #define DNSREC_SECTION (0x00000003)
  845. #define DNSREC_QUESTION (0x00000000)
  846. #define DNSREC_ANSWER (0x00000001)
  847. #define DNSREC_AUTHORITY (0x00000002)
  848. #define DNSREC_ADDITIONAL (0x00000003)
  849. // RR Section in packet (update)
  850. #define DNSREC_ZONE (0x00000000)
  851. #define DNSREC_PREREQ (0x00000001)
  852. #define DNSREC_UPDATE (0x00000002)
  853. // Delete RR (update) or No-exist (prerequisite)
  854. #define DNSREC_DELETE (0x00000004)
  855. #define DNSREC_NOEXIST (0x00000004)
  856. //
  857. // Record \ RR set structure
  858. //
  859. // Note: The dwReserved flag serves to insure that the substructures
  860. // start on 64-bit boundaries. Do NOT pack this structure, as the
  861. // substructures may contain pointers or int64 values which are
  862. // properly aligned unpacked.
  863. //
  864. #ifdef MIDL_PASS
  865. #define PDNS_RECORD PVOID
  866. #else
  867. typedef struct _DnsRecord
  868. {
  869. struct _DnsRecord * pNext;
  870. LPTSTR pName;
  871. WORD wType;
  872. WORD wDataLength; // Not referenced for DNS record types
  873. // defined above.
  874. union
  875. {
  876. DWORD DW; // flags as DWORD
  877. DNS_RECORD_FLAGS S; // flags as structure
  878. } Flags;
  879. DWORD dwTtl;
  880. DWORD dwReserved;
  881. // Record Data
  882. union
  883. {
  884. DNS_A_DATA A;
  885. DNS_SOA_DATA SOA, Soa;
  886. DNS_PTR_DATA PTR, Ptr,
  887. NS, Ns,
  888. CNAME, Cname,
  889. MB, Mb,
  890. MD, Md,
  891. MF, Mf,
  892. MG, Mg,
  893. MR, Mr;
  894. DNS_MINFO_DATA MINFO, Minfo,
  895. RP, Rp;
  896. DNS_MX_DATA MX, Mx,
  897. AFSDB, Afsdb,
  898. RT, Rt;
  899. DNS_TXT_DATA HINFO, Hinfo,
  900. ISDN, Isdn,
  901. TXT, Txt,
  902. X25;
  903. DNS_NULL_DATA Null;
  904. DNS_WKS_DATA WKS, Wks;
  905. DNS_AAAA_DATA AAAA;
  906. DNS_KEY_DATA KEY, Key;
  907. DNS_SIG_DATA SIG, Sig;
  908. DNS_ATMA_DATA ATMA, Atma;
  909. DNS_NXT_DATA NXT, Nxt;
  910. DNS_SRV_DATA SRV, Srv;
  911. DNS_TKEY_DATA TKEY, Tkey;
  912. DNS_TSIG_DATA TSIG, Tsig;
  913. DNS_WINS_DATA WINS, Wins;
  914. DNS_WINSR_DATA WINSR, WinsR, NBSTAT, Nbstat;
  915. } Data;
  916. }
  917. DNS_RECORD, *PDNS_RECORD;
  918. //
  919. // Header or fixed size of DNS_RECORD
  920. //
  921. #define DNS_RECORD_FIXED_SIZE FIELD_OFFSET( DNS_RECORD, Data )
  922. #define SIZEOF_DNS_RECORD_HEADER DNS_RECORD_FIXED_SIZE
  923. #endif // PRIVATE_DNS_RECORD
  924. //
  925. // Resource record set building
  926. //
  927. // pFirst points to first record in list.
  928. // pLast points to last record in list.
  929. //
  930. typedef struct _DnsRRSet
  931. {
  932. PDNS_RECORD pFirstRR;
  933. PDNS_RECORD pLastRR;
  934. }
  935. DNS_RRSET, *PDNS_RRSET;
  936. //
  937. // To init pFirst is NULL.
  938. // But pLast points at the location of the pFirst pointer -- essentially
  939. // treating the pFirst ptr as a DNS_RECORD. (It is a DNS_RECORD with
  940. // only a pNext field, but that's the only part we use.)
  941. //
  942. // Then when the first record is added to the list, the pNext field of
  943. // this dummy record (which corresponds to pFirst's value) is set to
  944. // point at the first record. So pFirst then properly points at the
  945. // first record.
  946. //
  947. // (This works only because pNext is the first field in a
  948. // DNS_RECORD structure and hence casting a PDNS_RECORD ptr to
  949. // PDNS_RECORD* and dereferencing yields its pNext field)
  950. //
  951. // Use TERMINATE when have built RR set by grabbing records out of
  952. // existing set. This makes sure that at the end, the last RR is
  953. // properly NULL terminated.
  954. //
  955. #define DNS_RRSET_INIT( rrset ) \
  956. { \
  957. PDNS_RRSET _prrset = &(rrset); \
  958. _prrset->pFirstRR = NULL; \
  959. _prrset->pLastRR = (PDNS_RECORD) &_prrset->pFirstRR; \
  960. }
  961. #define DNS_RRSET_ADD( rrset, pnewRR ) \
  962. { \
  963. PDNS_RRSET _prrset = &(rrset); \
  964. PDNS_RECORD _prrnew = (pnewRR); \
  965. _prrset->pLastRR->pNext = _prrnew; \
  966. _prrset->pLastRR = _prrnew; \
  967. }
  968. #define DNS_RRSET_TERMINATE( rrset ) \
  969. { \
  970. PDNS_RRSET _prrset = &(rrset); \
  971. _prrset->pLastRR->pNext = NULL; \
  972. }
  973. //
  974. // Record set manipulation
  975. //
  976. //
  977. // Record Copy
  978. // Record copy functions also do conversion between character sets.
  979. //
  980. // Note, it might be advisable to directly expose non-Ex copy
  981. // functions _W, _A for record and set, to avoid exposing the
  982. // conversion enum.
  983. //
  984. typedef enum _DNS_CHARSET
  985. {
  986. DnsCharSetUnknown,
  987. DnsCharSetUnicode,
  988. DnsCharSetUtf8,
  989. DnsCharSetAnsi,
  990. }
  991. DNS_CHARSET;
  992. PDNS_RECORD
  993. WINAPI
  994. DnsRecordCopyEx(
  995. IN PDNS_RECORD pRecord,
  996. IN DNS_CHARSET CharSetIn,
  997. IN DNS_CHARSET CharSetOut
  998. );
  999. PDNS_RECORD
  1000. WINAPI
  1001. DnsRecordSetCopyEx(
  1002. IN PDNS_RECORD pRecordSet,
  1003. IN DNS_CHARSET CharSetIn,
  1004. IN DNS_CHARSET CharSetOut
  1005. );
  1006. #ifdef UNICODE
  1007. #define DnsRecordCopy(pRR) \
  1008. DnsRecordCopyEx( (pRR), DnsCharSetUnicode, DnsCharSetUnicode )
  1009. #define DnsRecordSetCopy(pRR) \
  1010. DnsRecordSetCopyEx( (pRR), DnsCharSetUnicode, DnsCharSetUnicode )
  1011. #else
  1012. #define DnsRecordCopy(pRR) \
  1013. DnsRecordCopyEx( (pRR), DnsCharSetAnsi, DnsCharSetAnsi )
  1014. #define DnsRecordSetCopy(pRR) \
  1015. DnsRecordSetCopyEx( (pRR), DnsCharSetAnsi, DnsCharSetAnsi )
  1016. #endif
  1017. //
  1018. // Record Compare
  1019. //
  1020. // Note: these routines only compare records of the SAME character set.
  1021. // (ANSI, unicode or UTF8). Furthermore the routines assume the character
  1022. // set is indicated within the record. If compare of user created, rather
  1023. // than DNS API created record lists is desired, then caller should use
  1024. // DnsRecordCopy API and compare copies.
  1025. //
  1026. BOOL
  1027. WINAPI
  1028. DnsRecordCompare(
  1029. IN PDNS_RECORD pRecord1,
  1030. IN PDNS_RECORD pRecord2
  1031. );
  1032. BOOL
  1033. WINAPI
  1034. DnsRecordSetCompare(
  1035. IN OUT PDNS_RECORD pRR1,
  1036. IN OUT PDNS_RECORD pRR2,
  1037. OUT PDNS_RECORD * ppDiff1,
  1038. OUT PDNS_RECORD * ppDiff2
  1039. );
  1040. //
  1041. // Detach next record set from record list
  1042. //
  1043. PDNS_RECORD
  1044. DnsRecordSetDetach(
  1045. IN OUT PDNS_RECORD pRecordList
  1046. );
  1047. //
  1048. // Free record list
  1049. //
  1050. // Only supported free is deep free of entire record list with LocalFree().
  1051. // This correctly frees record list returned by DnsQuery() or DnsRecordSetCopy()
  1052. //
  1053. typedef enum
  1054. {
  1055. DnsFreeFlat = 0,
  1056. DnsFreeRecordList
  1057. }
  1058. DNS_FREE_TYPE;
  1059. #define DnsFreeRecordListDeep DnsFreeRecordList
  1060. VOID
  1061. WINAPI
  1062. DnsRecordListFree(
  1063. IN OUT PDNS_RECORD pRecordList,
  1064. IN DNS_FREE_TYPE FreeType
  1065. );
  1066. VOID
  1067. WINAPI
  1068. DnsFree(
  1069. IN OUT PVOID pData,
  1070. IN DNS_FREE_TYPE FreeType
  1071. );
  1072. //
  1073. // DNS Query API
  1074. //
  1075. //
  1076. // Options for DnsQuery
  1077. //
  1078. #define DNS_QUERY_STANDARD 0x00000000
  1079. #define DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE 0x00000001
  1080. #define DNS_QUERY_USE_TCP_ONLY 0x00000002
  1081. #define DNS_QUERY_NO_RECURSION 0x00000004
  1082. #define DNS_QUERY_BYPASS_CACHE 0x00000008
  1083. #define DNS_QUERY_NO_WIRE_QUERY 0x00000010
  1084. #define DNS_QUERY_NO_LOCAL_NAME 0x00000020
  1085. #define DNS_QUERY_NO_HOSTS_FILE 0x00000040
  1086. #define DNS_QUERY_NO_NETBT 0x00000080
  1087. #define DNS_QUERY_WIRE_ONLY 0x00000100
  1088. #define DNS_QUERY_RETURN_MESSAGE 0x00000200
  1089. #define DNS_QUERY_TREAT_AS_FQDN 0x00001000
  1090. #define DNS_QUERY_DONT_RESET_TTL_VALUES 0x00100000
  1091. #define DNS_QUERY_RESERVED 0xff000000
  1092. // Backward compatibility with Win2K
  1093. // Do not use
  1094. #define DNS_QUERY_CACHE_ONLY DNS_QUERY_NO_WIRE_QUERY
  1095. DNS_STATUS
  1096. WINAPI
  1097. DnsQuery_A(
  1098. IN PCSTR pszName,
  1099. IN WORD wType,
  1100. IN DWORD Options,
  1101. IN PIP4_ARRAY aipServers OPTIONAL,
  1102. IN OUT PDNS_RECORD * ppQueryResults OPTIONAL,
  1103. IN OUT PVOID * pReserved OPTIONAL
  1104. );
  1105. DNS_STATUS
  1106. WINAPI
  1107. DnsQuery_UTF8(
  1108. IN PCSTR pszName,
  1109. IN WORD wType,
  1110. IN DWORD Options,
  1111. IN PIP4_ARRAY aipServers OPTIONAL,
  1112. IN OUT PDNS_RECORD * ppQueryResults OPTIONAL,
  1113. IN OUT PVOID * pReserved OPTIONAL
  1114. );
  1115. DNS_STATUS
  1116. WINAPI
  1117. DnsQuery_W(
  1118. IN PCWSTR pszName,
  1119. IN WORD wType,
  1120. IN DWORD Options,
  1121. IN PIP4_ARRAY aipServers OPTIONAL,
  1122. IN OUT PDNS_RECORD * ppQueryResults OPTIONAL,
  1123. IN OUT PVOID * pReserved OPTIONAL
  1124. );
  1125. #ifdef UNICODE
  1126. #define DnsQuery DnsQuery_W
  1127. #else
  1128. #define DnsQuery DnsQuery_A
  1129. #endif
  1130. //
  1131. // DNS Update API
  1132. //
  1133. // DnsAcquireContextHandle
  1134. // DnsReleaseContextHandle
  1135. // DnsModifyRecordsInSet
  1136. // DnsReplaceRecordSet
  1137. //
  1138. //
  1139. // Update flags
  1140. //
  1141. #define DNS_UPDATE_SECURITY_USE_DEFAULT 0x00000000
  1142. #define DNS_UPDATE_SECURITY_OFF 0x00000010
  1143. #define DNS_UPDATE_SECURITY_ON 0x00000020
  1144. #define DNS_UPDATE_SECURITY_ONLY 0x00000100
  1145. #define DNS_UPDATE_CACHE_SECURITY_CONTEXT 0x00000200
  1146. #define DNS_UPDATE_TEST_USE_LOCAL_SYS_ACCT 0x00000400
  1147. #define DNS_UPDATE_FORCE_SECURITY_NEGO 0x00000800
  1148. #define DNS_UPDATE_TRY_ALL_MASTER_SERVERS 0x00001000
  1149. #define DNS_UPDATE_SKIP_NO_UPDATE_ADAPTERS 0x00002000
  1150. #define DNS_UPDATE_RESERVED 0xffff0000
  1151. //
  1152. // Note: pCredentials paramater is currently respectively
  1153. // PSEC_WINNT_AUTH_IDENTITY_W or PSEC_WINNT_AUTH_IDENTITY_A.
  1154. // Using PVOID to obviate the need for including rpcdce.h
  1155. // in order to include this file and to leave open the
  1156. // possibility of alternative credential specifications in
  1157. // the future.
  1158. //
  1159. DNS_STATUS
  1160. WINAPI
  1161. DnsAcquireContextHandle_W(
  1162. IN DWORD CredentialFlags,
  1163. IN PVOID pCredentials, OPTIONAL
  1164. //IN PSEC_WINNT_AUTH_IDENTITY_W pCredentials,
  1165. OUT PHANDLE pContextHandle
  1166. );
  1167. DNS_STATUS
  1168. WINAPI
  1169. DnsAcquireContextHandle_A(
  1170. IN DWORD CredentialFlags,
  1171. IN PVOID pCredentials, OPTIONAL
  1172. //IN PSEC_WINNT_AUTH_IDENTITY_A pCredentials,
  1173. OUT PHANDLE pContextHandle
  1174. );
  1175. #ifdef UNICODE
  1176. #define DnsAcquireContextHandle DnsAcquireContextHandle_W
  1177. #else
  1178. #define DnsAcquireContextHandle DnsAcquireContextHandle_A
  1179. #endif
  1180. VOID
  1181. WINAPI
  1182. DnsReleaseContextHandle(
  1183. IN HANDLE hContext
  1184. );
  1185. //
  1186. // Dynamic Update API
  1187. //
  1188. DNS_STATUS
  1189. WINAPI
  1190. DnsModifyRecordsInSet_W(
  1191. IN PDNS_RECORD pAddRecords,
  1192. IN PDNS_RECORD pDeleteRecords,
  1193. IN DWORD Options,
  1194. IN HANDLE hContext, OPTIONAL
  1195. IN PIP4_ARRAY pServerList, OPTIONAL
  1196. IN PVOID pReserved
  1197. );
  1198. DNS_STATUS
  1199. WINAPI
  1200. DnsModifyRecordsInSet_A(
  1201. IN PDNS_RECORD pAddRecords,
  1202. IN PDNS_RECORD pDeleteRecords,
  1203. IN DWORD Options,
  1204. IN HANDLE hContext, OPTIONAL
  1205. IN PIP4_ARRAY pServerList, OPTIONAL
  1206. IN PVOID pReserved
  1207. );
  1208. DNS_STATUS
  1209. WINAPI
  1210. DnsModifyRecordsInSet_UTF8(
  1211. IN PDNS_RECORD pAddRecords,
  1212. IN PDNS_RECORD pDeleteRecords,
  1213. IN DWORD Options,
  1214. IN HANDLE hContext, OPTIONAL
  1215. IN PIP4_ARRAY pServerList, OPTIONAL
  1216. IN PVOID pReserved
  1217. );
  1218. #ifdef UNICODE
  1219. #define DnsModifyRecordsInSet DnsModifyRecordsInSet_W
  1220. #else
  1221. #define DnsModifyRecordsInSet DnsModifyRecordsInSet_A
  1222. #endif
  1223. DNS_STATUS
  1224. WINAPI
  1225. DnsReplaceRecordSetW(
  1226. IN PDNS_RECORD pNewSet,
  1227. IN DWORD Options,
  1228. IN HANDLE hContext, OPTIONAL
  1229. IN PIP4_ARRAY pServerList, OPTIONAL
  1230. IN PVOID pReserved
  1231. );
  1232. DNS_STATUS
  1233. WINAPI
  1234. DnsReplaceRecordSetA(
  1235. IN PDNS_RECORD pNewSet,
  1236. IN DWORD Options,
  1237. IN HANDLE hContext, OPTIONAL
  1238. IN PIP4_ARRAY pServerList, OPTIONAL
  1239. IN PVOID pReserved
  1240. );
  1241. DNS_STATUS
  1242. WINAPI
  1243. DnsReplaceRecordSetUTF8(
  1244. IN PDNS_RECORD pNewSet,
  1245. IN DWORD Options,
  1246. IN HANDLE hContext, OPTIONAL
  1247. IN PIP4_ARRAY pServerList, OPTIONAL
  1248. IN PVOID pReserved
  1249. );
  1250. #ifdef UNICODE
  1251. #define DnsReplaceRecordSet DnsReplaceRecordSetW
  1252. #else
  1253. #define DnsReplaceRecordSet DnsReplaceRecordSetA
  1254. #endif
  1255. //
  1256. // DNS name validation
  1257. //
  1258. typedef enum _DNS_NAME_FORMAT
  1259. {
  1260. DnsNameDomain,
  1261. DnsNameDomainLabel,
  1262. DnsNameHostnameFull,
  1263. DnsNameHostnameLabel,
  1264. DnsNameWildcard,
  1265. DnsNameSrvRecord
  1266. }
  1267. DNS_NAME_FORMAT;
  1268. DNS_STATUS
  1269. DnsValidateName_UTF8(
  1270. IN LPCSTR pszName,
  1271. IN DNS_NAME_FORMAT Format
  1272. );
  1273. DNS_STATUS
  1274. DnsValidateName_W(
  1275. IN LPCWSTR pwszName,
  1276. IN DNS_NAME_FORMAT Format
  1277. );
  1278. DNS_STATUS
  1279. DnsValidateName_A(
  1280. IN LPCSTR pszName,
  1281. IN DNS_NAME_FORMAT Format
  1282. );
  1283. #ifdef UNICODE
  1284. #define DnsValidateName(p,f) DnsValidateName_W( (p), (f) )
  1285. #else
  1286. #define DnsValidateName(p,f) DnsValidateName_A( (p), (f) )
  1287. #endif
  1288. //
  1289. // DNS name comparison
  1290. //
  1291. BOOL
  1292. WINAPI
  1293. DnsNameCompare_A(
  1294. IN LPSTR pName1,
  1295. IN LPSTR pName2
  1296. );
  1297. BOOL
  1298. WINAPI
  1299. DnsNameCompare_W(
  1300. IN LPWSTR pName1,
  1301. IN LPWSTR pName2
  1302. );
  1303. #ifdef UNICODE
  1304. #define DnsNameCompare(n1,n2) DnsNameCompare_W( (n1),(n2) )
  1305. #else
  1306. #define DnsNameCompare(n1,n2) DnsNameCompare_A( (n1),(n2) )
  1307. #endif
  1308. //
  1309. // DNS message "roll-your-own" routines
  1310. //
  1311. typedef struct _DNS_MESSAGE_BUFFER
  1312. {
  1313. DNS_HEADER MessageHead;
  1314. CHAR MessageBody[1];
  1315. }
  1316. DNS_MESSAGE_BUFFER, *PDNS_MESSAGE_BUFFER;
  1317. BOOL
  1318. WINAPI
  1319. DnsWriteQuestionToBuffer_W(
  1320. IN OUT PDNS_MESSAGE_BUFFER pDnsBuffer,
  1321. IN OUT LPDWORD pdwBufferSize,
  1322. IN LPWSTR pszName,
  1323. IN WORD wType,
  1324. IN WORD Xid,
  1325. IN BOOL fRecursionDesired
  1326. );
  1327. BOOL WINAPI
  1328. DnsWriteQuestionToBuffer_UTF8(
  1329. IN OUT PDNS_MESSAGE_BUFFER pDnsBuffer,
  1330. IN OUT LPDWORD pdwBufferSize,
  1331. IN LPSTR pszName,
  1332. IN WORD wType,
  1333. IN WORD Xid,
  1334. IN BOOL fRecursionDesired
  1335. );
  1336. DNS_STATUS
  1337. WINAPI
  1338. DnsExtractRecordsFromMessage_W(
  1339. IN PDNS_MESSAGE_BUFFER pDnsBuffer,
  1340. IN WORD wMessageLength,
  1341. OUT PDNS_RECORD * ppRecord
  1342. );
  1343. DNS_STATUS
  1344. WINAPI
  1345. DnsExtractRecordsFromMessage_UTF8(
  1346. IN PDNS_MESSAGE_BUFFER pDnsBuffer,
  1347. IN WORD wMessageLength,
  1348. OUT PDNS_RECORD * ppRecord
  1349. );
  1350. #ifdef __cplusplus
  1351. }
  1352. #endif // __cplusplus
  1353. #endif // _WINDNS_INCLUDED_