SM & SMDLL definitions
[reactos.git] / reactos / include / WinDNS.h
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: include/WinDNS.h
5 * PURPOSE: Structures and definitions needed for DNSAPI compatibility.
6 * PROGRAMER: Art Yerkes
7 * UPDATE HISTORY:
8 * 12/15/03 -- Created
9 */
10
11 #ifndef WINDNS_H
12 #define WINDNS_H
13
14 /* The WinDNS Header */
15 #ifdef __USE_W32API
16 #include_next <windns.h>
17 #else
18
19 /* Constants provided by DNSAPI */
20 #define DNS_CONFIG_FLAG_ALLOC TRUE
21
22 #define BIT(n) (1<<(n))
23 #define DNS_QUERY_STANDARD 0
24 #define DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE BIT(0)
25 #define DNS_QUERY_USE_TCP_ONLY BIT(1)
26 #define DNS_QUERY_NO_RECURSION BIT(2)
27 #define DNS_QUERY_BYPASS_CACHE BIT(3)
28 #define DNS_QUERY_NO_WIRE_QUERY BIT(4)
29 #define DNS_QUERY_NO_LOCAL_NAME BIT(5)
30 #define DNS_QUERY_NO_HOSTS_FILE BIT(6)
31 #define DNS_QUERY_NO_NETBT BIT(7)
32 #define DNS_QUERY_WIRE_ONLY BIT(8)
33 #define DNS_QUERY_RETURN_MESSAGE BIT(9)
34 #define DNS_QUERY_TREAT_AS_FQDN BIT(12)
35 #define DNS_QUERY_DONT_RESET_TTL_VALUES BIT(23)
36 #define DNS_QUERY_RESERVED (0xff << 24)
37 #define DNS_QUERY_CACHE_ONLY BIT(4)
38
39 #define DNS_TYPE_ZERO 0
40 #define DNS_TYPE_A 1
41 #define DNS_TYPE_NS 2
42 #define DNS_TYPE_MD 3
43 #define DNS_TYPE_MF 4
44 #define DNS_TYPE_CNAME 5
45 #define DNS_TYPE_SOA 6
46 #define DNS_TYPE_MB 7
47 #define DNS_TYPE_MG 8
48 #define DNS_TYPE_MR 9
49 #define DNS_TYPE_NULL 10
50 #define DNS_TYPE_WKS 11
51 #define DNS_TYPE_PTR 12
52 #define DNS_TYPE_HINFO 13
53 #define DNS_TYPE_MINFO 14
54 #define DNS_TYPE_MX 15
55 #define DNS_TYPE_TXT 16
56 #define DNS_TYPE_RP 17
57 #define DNS_TYPE_AFSDB 18
58 #define DNS_TYPE_X25 19
59 #define DNS_TYPE_ISDN 20
60 #define DNS_TYPE_RT 21
61 #define DNS_TYPE_NSAP 22
62 #define DNS_TYPE_NSAPPTR 23
63 #define DNS_TYPE_SIG 24
64 #define DNS_TYPE_KEY 25
65 #define DNS_TYPE_PX 26
66 #define DNS_TYPE_GPOS 27
67 #define DNS_TYPE_AAAA 28
68 #define DNS_TYPE_LOC 29
69 #define DNS_TYPE_NXT 30
70 #define DNS_TYPE_EID 31 /* I've never heard of nimrod before. */
71 #define DNS_TYPE_NIMLOC 32 /* But it does exist. */
72 #define DNS_TYPE_SRV 33
73 #define DNS_TYPE_ATMA 34
74 #define DNS_TYPE_NAPTR 35
75 #define DNS_TYPE_KX 36
76 #define DNS_TYPE_CERT 37
77 #define DNS_TYPE_A6 38
78 #define DNS_TYPE_DNAME 39
79 #define DNS_TYPE_SINK 40
80 #define DNS_TYPE_OPT 41
81
82 #define DNS_TYPE_UINFO 100
83 #define DNS_TYPE_UID 101
84 #define DNS_TYPE_GID 102
85 #define DNS_TYPE_UNSPEC 103
86
87 #define DNS_TYPE_ADDRS 248
88 #define DNS_TYPE_TKEY 249
89 #define DNS_TYPE_TSIG 250
90 #define DNS_TYPE_IXFR 251
91 #define DNS_TYPE_AXFR 252
92 #define DNS_TYPE_MAILB 253
93 #define DNS_TYPE_MAILA 254
94 #define DNS_TYPE_ANY 255
95
96 #define DNS_SWAPX(x) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
97
98 #define DNS_RTYPE_ZERO DNS_SWAPX(DNS_TYPE_ZERO)
99 #define DNS_RTYPE_A DNS_SWAPX(DNS_TYPE_A)
100 #define DNS_RTYPE_NS DNS_SWAPX(DNS_TYPE_NS)
101 #define DNS_RTYPE_MD DNS_SWAPX(DNS_TYPE_MD)
102 #define DNS_RTYPE_MF DNS_SWAPX(DNS_TYPE_MF)
103 #define DNS_RTYPE_CNAME DNS_SWAPX(DNS_TYPE_CNAME)
104 #define DNS_RTYPE_SOA DNS_SWAPX(DNS_TYPE_SOA)
105 #define DNS_RTYPE_MB DNS_SWAPX(DNS_TYPE_MB)
106 #define DNS_RTYPE_MG DNS_SWAPX(DNS_TYPE_MG)
107 #define DNS_RTYPE_MR DNS_SWAPX(DNS_TYPE_MR)
108 #define DNS_RTYPE_NULL DNS_SWAPX(DNS_TYPE_NULL)
109 #define DNS_RTYPE_WKS DNS_SWAPX(DNS_TYPE_WKS)
110 #define DNS_RTYPE_PTR DNS_SWAPX(DNS_TYPE_PTR)
111 #define DNS_RTYPE_HINFO DNS_SWAPX(DNS_TYPE_HINFO)
112 #define DNS_RTYPE_MINFO DNS_SWAPX(DNS_TYPE_MINFO)
113 #define DNS_RTYPE_MX DNS_SWAPX(DNS_TYPE_MX)
114 #define DNS_RTYPE_TEXT DNS_SWAPX(DNS_TYPE_TEXT)
115 #define DNS_RTYPE_RP DNS_SWAPX(DNS_TYPE_RP)
116 #define DNS_RTYPE_AFSDB DNS_SWAPX(DNS_TYPE_AFSDB)
117 #define DNS_RTYPE_X25 DNS_SWAPX(DNS_TYPE_X25)
118 #define DNS_RTYPE_ISDN DNS_SWAPX(DNS_TYPE_ISDN)
119 #define DNS_RTYPE_RT DNS_SWAPX(DNS_TYPE_RT)
120 #define DNS_RTYPE_NSAP DNS_SWAPX(DNS_TYPE_NSAP)
121 #define DNS_RTYPE_NSAPPTR DNS_SWAPX(DNS_TYPE_NSAPPTR)
122 #define DNS_RTYPE_SIG DNS_SWAPX(DNS_TYPE_SIG)
123 #define DNS_RTYPE_KEY DNS_SWAPX(DNS_TYPE_KEY)
124 #define DNS_RTYPE_PX DNS_SWAPX(DNS_TYPE_PX)
125 #define DNS_RTYPE_GPOS DNS_SWAPX(DNS_TYPE_GPOS)
126 #define DNS_RTYPE_AAAA DNS_SWAPX(DNS_TYPE_AAAA)
127 #define DNS_RTYPE_LOC DNS_SWAPX(DNS_TYPE_LOC)
128 #define DNS_RTYPE_NXT DNS_SWAPX(DNS_TYPE_NXT)
129 #define DNS_RTYPE_EID DNS_SWAPX(DNS_TYPE_EID)
130 #define DNS_RTYPE_NIMLOC DNS_SWAPX(DNS_TYPE_NIMLOC)
131 #define DNS_RTYPE_SRV DNS_SWAPX(DNS_TYPE_SRV)
132 #define DNS_RTYPE_ATMA DNS_SWAPX(DNS_TYPE_ATMA)
133 #define DNS_RTYPE_NAPTR DNS_SWAPX(DNS_TYPE_NAPTR)
134 #define DNS_RTYPE_KX DNS_SWAPX(DNS_TYPE_KX)
135 #define DNS_RTYPE_CERT DNS_SWAPX(DNS_TYPE_CERT)
136 #define DNS_RTYPE_A6 DNS_SWAPX(DNS_TYPE_A6)
137 #define DNS_RTYPE_DNAME DNS_SWAPX(DNS_TYPE_DNAME)
138 #define DNS_RTYPE_SINK DNS_SWAPX(DNS_TYPE_SINK)
139 #define DNS_RTYPE_OPT DNS_SWAPX(DNS_TYPE_OPT)
140 #define DNS_RTYPE_UINFO DNS_SWAPX(DNS_TYPE_UINFO)
141 #define DNS_RTYPE_UID DNS_SWAPX(DNS_TYPE_UID)
142 #define DNS_RTYPE_GID DNS_SWAPX(DNS_TYPE_GID)
143 #define DNS_RTYPE_UNSPEC DNS_SWAPX(DNS_TYPE_UNSPEC)
144 #define DNS_RTYPE_ADDRS DNS_SWAPX(DNS_TYPE_ADDRS)
145 #define DNS_RTYPE_TKEY DNS_SWAPX(DNS_TYPE_TKEY)
146 #define DNS_RTYPE_TSIG DNS_SWAPX(DNS_TYPE_TSIG)
147 #define DNS_RTYPE_IXFR DNS_SWAPX(DNS_TYPE_IXFR)
148 #define DNS_RTYPE_AXFR DNS_SWAPX(DNS_TYPE_AXFR)
149 #define DNS_RTYPE_MAILB DNS_SWAPX(DNS_TYPE_MAILB)
150 #define DNS_RTYPE_MAILA DNS_SWAPX(DNS_TYPE_MAILA)
151 #define DNS_RTYPE_ANY DNS_SWAPX(DNS_TYPE_ANY)
152
153 /* Simple types */
154 typedef LONG DNS_STATUS;
155 typedef DNS_STATUS *PDNS_STATUS;
156 typedef DWORD IP4_ADDRESS;
157 typedef IP4_ADDRESS *PIP4_ADDRESS;
158 typedef struct {
159 DWORD IP6Dword[4];
160 } IP6_ADDRESS, *PIP6_ADDRESS;
161
162 typedef enum {
163 DnsFreeFlat,
164 DnsFreeRecordList,
165 DnsFreeParsedMessageFields
166 } DNS_FREE_TYPE;
167
168 typedef enum {
169 DnsNameDomain,
170 DnsNameDomainLabel,
171 DnsNameHostnameFull,
172 DnsNameHostnameLabel,
173 DnsNameWildcard,
174 DnsNameSrvRecord
175 } DNS_NAME_FORMAT;
176
177 /* The below is for repetitive names that distinguish character coding */
178 #define DNS_PASTE(x,y) x ## y
179 #define DNSCT_TRIPLET(x) DNS_PASTE(x,_W), DNS_PASTE(x,_A), DNS_PASTE(x,_UTF8)
180
181 typedef enum {
182 DNSCT_TRIPLET(DnsConfigPrimaryDomainName),
183 DNSCT_TRIPLET(DnsConfigAdapterDomainName),
184 DnsConfigDnsServerList,
185 DnsConfigSearchList,
186 DnsConfigAdapterInfo,
187 DnsConfigPrimaryHostNameRegistrationEnabled,
188 DnsConfigAdapterHostNameRegistrationEnabled,
189 DnsConfigAddressRegistrationMaxCount,
190 DNSCT_TRIPLET(DnsConfigHostName),
191 DNSCT_TRIPLET(DnsConfigFullHostName)
192 } DNS_CONFIG_TYPE;
193
194 /* Aggregates provided by DNSAPI */
195
196 typedef struct {
197 DWORD Section : 2;
198 DWORD Delete : 1;
199 DWORD CharSet : 2;
200 DWORD Unused : 3;
201 DWORD Reserved : 24;
202 } DNS_RECORD_FLAGS;
203
204 typedef struct _IP4_ARRAY {
205 DWORD AddrCount;
206 IP4_ADDRESS AddrArray[1]; /* Avoid zero-length array warning */
207 } IP4_ARRAY, *PIP4_ARRAY;
208
209 typedef struct _DNS_HEADER {
210 WORD Xid;
211 BYTE RecursionDesired;
212 BYTE Truncation;
213 BYTE Authoritative;
214 BYTE Opcode;
215 BYTE IsResponse;
216 BYTE ResponseCode;
217 BYTE Reserved;
218 BYTE RecursionAvailable;
219 WORD QuestionCount;
220 WORD NameServerCount;
221 WORD AdditionalCount;
222 } DNS_HEADER, *PDNS_HEADER;
223
224 typedef struct _DNS_MESSAGE_BUFFER {
225 DNS_HEADER MessageHead;
226 CHAR MessageBody[1];
227 } DNS_MESSAGE_BUFFER, *PDNS_MESSAGE_BUFFER;
228
229 /* Some DNSAPI structs are sensitive to character coding. This will allow
230 * us to define them once.
231 *
232 * the XNAME(n) macro turns the name into either nA or nW
233 * the PSTR type expands to either LPWSTR or LPSTR.
234 */
235
236 /* A record, indicates an IPv4 address. */
237 typedef struct {
238 IP4_ADDRESS IpAddress;
239 } DNS_A_DATA, *PDNS_A_DATA;
240
241 typedef struct {
242 DWORD dwByteCount;
243 BYTE Data[1];
244 } DNS_NULL_DATA, *PDNS_NULL_DATA;
245
246 typedef struct {
247 IP4_ADDRESS IpAddress;
248 UCHAR chProtocol;
249 BYTE BitMask[1];
250 } DNS_WKS_DATA, *PDNS_WKS_DATA;
251
252 typedef struct {
253 IP6_ADDRESS Ip6Address;
254 } DNS_AAAA_DATA, *PDNS_AAAA_DATA;
255
256 typedef struct {
257 WORD wFlags;
258 BYTE chProtocol;
259 BYTE chAlgorithm;
260 BYTE Key[1];
261 } DNS_KEY_DATA, *PDNS_KEY_DATA;
262
263 typedef struct {
264 WORD wVersion;
265 WORD wSize;
266 WORD wHorPrec;
267 WORD wVerPrec;
268 DWORD dwLatitude;
269 DWORD dwLongitude;
270 DWORD dwAltitude;
271 } DNS_LOC_DATA, *PDNS_LOC_DATA;
272
273 /* Here's the ugly bit, we import twice; once for wchar and once for char. */
274 #define XNAME(a) a ## A
275 #define PSTR LPSTR
276 #define _WINDNS_STRUCT_DEFINITIONS
277 #include "WinDNS.h"
278 #undef XNAME
279 #undef PSTR
280 #define XNAME(a) a ## W
281 #define PSTR LPWSTR
282 #include "WinDNS.h"
283 #undef XNAME
284 #undef PSTR
285 #undef _WINDNS_STRUCT_DEFINITIONS
286
287 #ifndef _DISABLE_TIDENTS
288 #ifdef _UNICODE
289 #define DECLARE_STRUCT(x) typedef DNS_PASTE(x,W) x , *DNS_PASTE(P,x)
290 #define DECLARE_FUNC(x) DNS_PASTE(x,_W)
291 #else /* _UNICODE */
292 #define DECLARE_STRUCT(x) typedef DNS_PASTE(x,A) x , *DNS_PASTE(P,x)
293 #define DECLARE_FUNC(x) DNS_PASTE(x,_A)
294 #endif /* _UNICODE */
295
296 /* Now, all the declarations go off. */
297
298 DECLARE_STRUCT(DNS_PTR_DATA);
299 DECLARE_STRUCT(DNS_SOA_DATA);
300 DECLARE_STRUCT(DNS_MINFO_DATA);
301 DECLARE_STRUCT(DNS_MX_DATA);
302 DECLARE_STRUCT(DNS_TXT_DATA);
303 DECLARE_STRUCT(DNS_SIG_DATA);
304 DECLARE_STRUCT(DNS_NXT_DATA);
305 DECLARE_STRUCT(DNS_SRV_DATA);
306 DECLARE_STRUCT(DNS_RECORD);
307
308 #define DnsAcquireContextHandle DECLARE_FUNC(DnsAcquireContextHandle)
309 #define DnsValidateName DECLARE_FUNC(DnsValidateName)
310 #define DnsQuery DECLARE_FUNC(DnsQuery)
311
312 #endif /* _DISABLE_TIDENTS */
313
314 /* Prototypes */
315
316 void WINAPI DnsReleaseContextHandle( HANDLE ContextHandle );
317
318 DNS_STATUS WINAPI DnsAcquireContextHandle_W
319 ( DWORD CredentialsFlags,
320 PVOID Credentials,
321 HANDLE *ContextHandle );
322 DNS_STATUS WINAPI DnsAcquireContextHandle_UTF8
323 ( DWORD CredentialsFlags,
324 PVOID Credentials,
325 HANDLE *ContextHandle );
326 DNS_STATUS WINAPI DnsAcquireContextHandle_A
327 ( DWORD CredentialsFlags,
328 PVOID Credentials,
329 HANDLE *ContextHandle );
330
331 DNS_STATUS WINAPI DnsValidateName_W
332 ( LPCWSTR Name, DNS_NAME_FORMAT Format );
333 DNS_STATUS WINAPI DnsValidateName_UTF8
334 ( LPCSTR Name, DNS_NAME_FORMAT Format );
335 DNS_STATUS WINAPI DnsValidateName_A
336 ( LPCSTR Name, DNS_NAME_FORMAT Format );
337
338 DNS_STATUS WINAPI DnsQuery_W
339 ( LPCWSTR Name, WORD Type, DWORD Options, PIP4_ARRAY Servers,
340 PDNS_RECORDW *Result, PVOID *Reserved );
341 DNS_STATUS WINAPI DnsQuery_UTF8
342 ( LPCSTR Name, WORD Type, DWORD Options, PIP4_ARRAY Servers,
343 PDNS_RECORDA *Result, PVOID *Reserved );
344 DNS_STATUS WINAPI DnsQuery_A
345 ( LPCSTR Name, WORD Type, DWORD Options, PIP4_ARRAY Servers,
346 PDNS_RECORDA *Result, PVOID *Reserved );
347 VOID WINAPI DnsFree( PVOID Data, DNS_FREE_TYPE FreeType );
348 VOID WINAPI DnsRecordListFree( PVOID RecordList,
349 DNS_FREE_TYPE FreeType );
350
351 #endif//WINDNS_H
352
353 #ifdef _WINDNS_STRUCT_DEFINITIONS
354
355 /* PTR record, indicates an additional lookup for the given name is needed. */
356 typedef struct {
357 PSTR pNameHost;
358 } XNAME(DNS_PTR_DATA), *XNAME(PDNS_PTR_DATA);
359
360 typedef struct {
361 PSTR pNamePrimaryServer;
362 PSTR pNameAdministrator;
363 DWORD dwSerialNo;
364 DWORD dwRefresh;
365 DWORD dwRetry;
366 DWORD dwExpire;
367 DWORD dwDefaultTtl;
368 } XNAME(DNS_SOA_DATA), *XNAME(PDNS_SOA_DATA);
369
370 /* MINFO record, who to mail about questions or problems. */
371 typedef struct {
372 PSTR pNameMailbox;
373 PSTR pNameErrorsMailbox;
374 } XNAME(DNS_MINFO_DATA), *XNAME(PNDS_MINFO_DATA);
375
376 /* MX record, who processes the mail for this domain? */
377 typedef struct {
378 PSTR pNameExchange;
379 WORD wPreference;
380 WORD Pad;
381 } XNAME(DNS_MX_DATA), *XNAME(PDNS_MX_DATA);
382
383 /* TXT record, miscellaneous information. */
384 typedef struct {
385 DWORD dwStringCount;
386 PSTR pStringArray[1];
387 } XNAME(DNS_TXT_DATA), *XNAME(PDNS_TXT_DATA);
388
389 typedef struct {
390 PSTR pNameSigner;
391 WORD wTypeCovered;
392 BYTE cbAlgorithm;
393 BYTE cbLabelCount;
394 DWORD dwOriginalTtl;
395 DWORD dwExpiration;
396 DWORD dwTimeSigned;
397 WORD wKeyTag;
398 WORD Pad;
399 BYTE Signature[1];
400 } XNAME(DNS_SIG_DATA), *XNAME(PDNS_SIG_DATA);
401
402 typedef struct {
403 PSTR pNameNext;
404 WORD wNumTypes;
405 WORD wTypes[1];
406 } XNAME(DNS_NXT_DATA), *XNAME(PDNS_NXT_DATA);
407
408 typedef struct {
409 PSTR pNameTarget;
410 WORD wPriority;
411 WORD wWeight;
412 WORD wPort;
413 WORD Pad;
414 } XNAME(DNS_SRV_DATA), *XNAME(PDNS_SRV_DATA);
415
416 typedef struct XNAME(_DNS_RECORD_) {
417 struct XNAME(_DNS_RECORD_) *pNext;
418 PSTR pName;
419 WORD wType;
420 WORD wDataLength;
421
422 union {
423 DWORD DW;
424 DNS_RECORD_FLAGS S;
425 } Flags;
426
427 DWORD dwTtl;
428 DWORD dwReserved;
429
430 union {
431 DNS_A_DATA A;
432 XNAME(DNS_SOA_DATA) SOA, Soa;
433 XNAME(DNS_PTR_DATA) PTR, Ptr, NS, Ns, CNAME, Cname, MB, Mb, MD, Md, MF, Mf, MG, Mg, MR, Mr;
434 XNAME(DNS_MINFO_DATA) MINFO, Minfo, RP, Rp;
435 XNAME(DNS_MX_DATA) MX, Mx, AFSDB, Afsdb, RT, Rt;
436 XNAME(DNS_TXT_DATA) HINFO, Hinfo, ISDN, Isdn, TXT, Txt;
437 DNS_NULL_DATA Null;
438 DNS_WKS_DATA WKS, Wks;
439 DNS_AAAA_DATA AAAA;
440 DNS_KEY_DATA KEY, Key;
441 XNAME(DNS_SIG_DATA) SIG, Sig;
442 XNAME(DNS_NXT_DATA) NXT, Nxt;
443 XNAME(DNS_SRV_DATA) SRV, Srv;
444 } Data;
445 } XNAME(DNS_RECORD), *XNAME(PDNS_RECORD);
446
447 #endif /* __USE_W32API */
448 #endif /* _WINDNS_STRUCT_DEFINITIONS */
449