1 #ifndef _WINDNS_INCLUDED_
2 #define _WINDNS_INCLUDED_
8 #define DNS_QUERY_STANDARD 0x0
9 #define DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE 0x1
10 #define DNS_QUERY_USE_TCP_ONLY 0x2
11 #define DNS_QUERY_NO_RECURSION 0x4
12 #define DNS_QUERY_BYPASS_CACHE 0x8
13 #define DNS_QUERY_NO_WIRE_QUERY 0x10
14 #define DNS_QUERY_NO_LOCAL_NAME 0x20
15 #define DNS_QUERY_NO_HOSTS_FILE 0x40
16 #define DNS_QUERY_NO_NETBT 0x80
17 #define DNS_QUERY_TREAT_AS_FQDN 0x1000
18 #define DNS_QUERY_WIRE_ONLY 0x100
19 #define DNS_QUERY_RETURN_MESSAGE 0x200
20 #define DNS_QUERY_DONT_RESET_TTL_VALUES 0x100000
21 #define DNS_QUERY_RESERVED 0xff000000
23 #define DNS_UPDATE_SECURITY_USE_DEFAULT 0x0
24 #define DNS_UPDATE_SECURITY_OFF 0x10
25 #define DNS_UPDATE_SECURITY_ON 0x20
26 #define DNS_UPDATE_SECURITY_ONLY 0x100
27 #define DNS_UPDATE_CACHE_SECURITY_CONTEXT 0x200
28 #define DNS_UPDATE_TEST_USE_LOCAL_SYS_ACCT 0x400
29 #define DNS_UPDATE_FORCE_SECURITY_NEGO 0x800
30 #define DNS_UPDATE_RESERVED 0xffff0000
32 #define DNS_CONFIG_FLAG_ALLOC TRUE
36 typedef DWORD IP4_ADDRESS
;
38 typedef _Return_type_success_(return == 0) DWORD DNS_STATUS
;
40 #define DNS_TYPE_ZERO 0x0000
41 #define DNS_TYPE_A 0x0001
42 #define DNS_TYPE_NS 0x0002
43 #define DNS_TYPE_MD 0x0003
44 #define DNS_TYPE_MF 0x0004
45 #define DNS_TYPE_CNAME 0x0005
46 #define DNS_TYPE_SOA 0x0006
47 #define DNS_TYPE_MB 0x0007
48 #define DNS_TYPE_MG 0x0008
49 #define DNS_TYPE_MR 0x0009
50 #define DNS_TYPE_NULL 0x000a
51 #define DNS_TYPE_WKS 0x000b
52 #define DNS_TYPE_PTR 0x000c
53 #define DNS_TYPE_HINFO 0x000d
54 #define DNS_TYPE_MINFO 0x000e
55 #define DNS_TYPE_MX 0x000f
56 #define DNS_TYPE_TEXT 0x0010
57 #define DNS_TYPE_RP 0x0011
58 #define DNS_TYPE_AFSDB 0x0012
59 #define DNS_TYPE_X25 0x0013
60 #define DNS_TYPE_ISDN 0x0014
61 #define DNS_TYPE_RT 0x0015
62 #define DNS_TYPE_NSAP 0x0016
63 #define DNS_TYPE_NSAPPTR 0x0017
64 #define DNS_TYPE_SIG 0x0018
65 #define DNS_TYPE_KEY 0x0019
66 #define DNS_TYPE_PX 0x001a
67 #define DNS_TYPE_GPOS 0x001b
68 #define DNS_TYPE_AAAA 0x001c
69 #define DNS_TYPE_LOC 0x001d
70 #define DNS_TYPE_NXT 0x001e
71 #define DNS_TYPE_EID 0x001f
72 #define DNS_TYPE_NIMLOC 0x0020
73 #define DNS_TYPE_SRV 0x0021
74 #define DNS_TYPE_ATMA 0x0022
75 #define DNS_TYPE_NAPTR 0x0023
76 #define DNS_TYPE_KX 0x0024
77 #define DNS_TYPE_CERT 0x0025
78 #define DNS_TYPE_A6 0x0026
79 #define DNS_TYPE_DNAME 0x0027
80 #define DNS_TYPE_SINK 0x0028
81 #define DNS_TYPE_OPT 0x0029
82 #define DNS_TYPE_UINFO 0x0064
83 #define DNS_TYPE_UID 0x0065
84 #define DNS_TYPE_GID 0x0066
85 #define DNS_TYPE_UNSPEC 0x0067
86 #define DNS_TYPE_ADDRS 0x00f8
87 #define DNS_TYPE_TKEY 0x00f9
88 #define DNS_TYPE_TSIG 0x00fa
89 #define DNS_TYPE_IXFR 0x00fb
90 #define DNS_TYPE_AXFR 0x00fc
91 #define DNS_TYPE_MAILB 0x00fd
92 #define DNS_TYPE_MAILA 0x00fe
93 #define DNS_TYPE_ALL 0x00ff
94 #define DNS_TYPE_ANY 0x00ff
96 #define DNS_TYPE_WINS 0xff01
97 #define DNS_TYPE_WINSR 0xff02
98 #define DNS_TYPE_NBSTAT (DNS_TYPE_WINSR)
100 #define DNSREC_QUESTION 0
101 #define DNSREC_ANSWER 1
102 #define DNSREC_AUTHORITY 2
103 #define DNSREC_ADDITIONAL 3
105 #define DNS_ATMA_MAX_ADDR_LENGTH 20
107 typedef enum _DNS_CHARSET
{
115 DnsConfigPrimaryDomainName_W
,
116 DnsConfigPrimaryDomainName_A
,
117 DnsConfigPrimaryDomainName_UTF8
,
118 DnsConfigAdapterDomainName_W
,
119 DnsConfigAdapterDomainName_A
,
120 DnsConfigAdapterDomainName_UTF8
,
121 DnsConfigDnsServerList
,
123 DnsConfigAdapterInfo
,
124 DnsConfigPrimaryHostNameRegistrationEnabled
,
125 DnsConfigAdapterHostNameRegistrationEnabled
,
126 DnsConfigAddressRegistrationMaxCount
,
129 DnsConfigHostName_UTF8
,
130 DnsConfigFullHostName_W
,
131 DnsConfigFullHostName_A
,
132 DnsConfigFullHostName_UTF8
138 DnsFreeParsedMessageFields
141 typedef enum _DNS_NAME_FORMAT
{
145 DnsNameHostnameLabel
,
157 typedef struct _IP4_ARRAY
{
159 IP4_ADDRESS AddrArray
[1];
160 } IP4_ARRAY
, *PIP4_ARRAY
;
164 } IP6_ADDRESS
, *PIP6_ADDRESS
, DNS_IP6_ADDRESS
, *PDNS_IP6_ADDRESS
;
166 #pragma pack(push, 1)
168 typedef struct _DNS_HEADER
{
170 BYTE RecursionDesired
:1;
172 BYTE Authoritative
:1;
176 BYTE CheckingDisabled
:1;
177 BYTE AuthenticatedData
:1;
179 BYTE RecursionAvailable
:1;
182 WORD NameServerCount
;
183 WORD AdditionalCount
;
184 } DNS_HEADER
, *PDNS_HEADER
;
186 typedef struct _DNS_WIRE_QUESTION
{
189 } DNS_WIRE_QUESTION
, *PDNS_WIRE_QUESTION
;
191 typedef struct _DNS_WIRE_RECORD
{
196 } DNS_WIRE_RECORD
, *PDNS_WIRE_RECORD
;
200 typedef struct _DNS_MESSAGE_BUFFER
{
201 DNS_HEADER MessageHead
;
203 } DNS_MESSAGE_BUFFER
, *PDNS_MESSAGE_BUFFER
;
205 typedef struct _DnsRecordFlags
{
214 IP4_ADDRESS IpAddress
;
215 } DNS_A_DATA
, *PDNS_A_DATA
;
218 DNS_IP6_ADDRESS Ip6Address
;
219 } DNS_AAAA_DATA
, *PDNS_AAAA_DATA
;
223 BYTE Address
[DNS_ATMA_MAX_ADDR_LENGTH
];
224 } DNS_ATMA_DATA
, *PDNS_ATMA_DATA
;
231 } DNS_KEY_DATA
, *PDNS_KEY_DATA
;
241 } DNS_LOC_DATA
, *PDNS_LOC_DATA
;
245 LPSTR pNameErrorsMailbox
;
246 } DNS_MINFO_DATAA
, *PDNS_MINFO_DATAA
;
250 LPWSTR pNameErrorsMailbox
;
251 } DNS_MINFO_DATAW
, *PDNS_MINFO_DATAW
;
257 } DNS_MX_DATAA
, *PDNS_MX_DATAA
;
260 LPWSTR pNameExchange
;
263 } DNS_MX_DATAW
, *PDNS_MX_DATAW
;
268 } DNS_NULL_DATA
, *PDNS_NULL_DATA
;
274 } DNS_NXT_DATAA
, *PDNS_NXT_DATAA
;
280 } DNS_NXT_DATAW
, *PDNS_NXT_DATAW
;
284 } DNS_PTR_DATAA
, *PDNS_PTR_DATAA
;
288 } DNS_PTR_DATAW
, *PDNS_PTR_DATAW
;
301 } DNS_SIG_DATAA
, *PDNS_SIG_DATAA
;
314 } DNS_SIG_DATAW
, *PDNS_SIG_DATAW
;
317 LPSTR pNamePrimaryServer
;
318 LPSTR pNameAdministrator
;
324 } DNS_SOA_DATAA
, *PDNS_SOA_DATAA
;
327 LPWSTR pNamePrimaryServer
;
328 LPWSTR pNameAdministrator
;
334 } DNS_SOA_DATAW
, *PDNS_SOA_DATAW
;
342 } DNS_SRV_DATAA
, *PDNS_SRV_DATAA
;
350 } DNS_SRV_DATAW
, *PDNS_SRV_DATAW
;
354 LPSTR pStringArray
[1];
355 } DNS_TXT_DATAA
, *PDNS_TXT_DATAA
;
359 LPWSTR pStringArray
[1];
360 } DNS_TXT_DATAW
, *PDNS_TXT_DATAW
;
363 LPSTR pNameAlgorithm
;
364 PBYTE pAlgorithmPacket
;
373 UCHAR cAlgNameLength
;
374 BOOL bPacketPointers
;
375 } DNS_TKEY_DATAA
, *PDNS_TKEY_DATAA
;
378 LPWSTR pNameAlgorithm
;
379 PBYTE pAlgorithmPacket
;
388 UCHAR cAlgNameLength
;
389 BOOL bPacketPointers
;
390 } DNS_TKEY_DATAW
, *PDNS_TKEY_DATAW
;
393 LPSTR pNameAlgorithm
;
394 PBYTE pAlgorithmPacket
;
397 LONGLONG i64CreateTime
;
403 UCHAR cAlgNameLength
;
404 BOOL bPacketPointers
;
405 } DNS_TSIG_DATAA
, *PDNS_TSIG_DATAA
;
408 LPWSTR pNameAlgorithm
;
409 PBYTE pAlgorithmPacket
;
412 LONGLONG i64CreateTime
;
418 UCHAR cAlgNameLength
;
419 BOOL bPacketPointers
;
420 } DNS_TSIG_DATAW
, *PDNS_TSIG_DATAW
;
424 DWORD dwLookupTimeout
;
425 DWORD dwCacheTimeout
;
426 DWORD cWinsServerCount
;
427 IP4_ADDRESS WinsServers
[1];
428 } DNS_WINS_DATA
, *PDNS_WINS_DATA
;
432 DWORD dwLookupTimeout
;
433 DWORD dwCacheTimeout
;
434 LPSTR pNameResultDomain
;
435 } DNS_WINSR_DATAA
, *PDNS_WINSR_DATAA
;
439 DWORD dwLookupTimeout
;
440 DWORD dwCacheTimeout
;
441 LPWSTR pNameResultDomain
;
442 } DNS_WINSR_DATAW
, *PDNS_WINSR_DATAW
;
445 IP4_ADDRESS IpAddress
;
448 } DNS_WKS_DATA
, *PDNS_WKS_DATA
;
450 typedef struct _DnsRecordA
{
451 struct _DnsRecordA
* pNext
;
463 DNS_SOA_DATAA SOA
, Soa
;
464 DNS_PTR_DATAA PTR
, Ptr
, NS
, Ns
, CNAME
, Cname
, MB
, Mb
, MD
, Md
, MF
, Mf
, MG
, Mg
, MR
, Mr
;
465 DNS_MINFO_DATAA MINFO
, Minfo
, RP
, Rp
;
466 DNS_MX_DATAA MX
, Mx
, AFSDB
, Afsdb
, RT
, Rt
;
467 DNS_TXT_DATAA HINFO
, Hinfo
, ISDN
, Isdn
, TXT
, Txt
, X25
;
469 DNS_WKS_DATA WKS
, Wks
;
471 DNS_KEY_DATA KEY
, Key
;
472 DNS_SIG_DATAA SIG
, Sig
;
473 DNS_ATMA_DATA ATMA
, Atma
;
474 DNS_NXT_DATAA NXT
, Nxt
;
475 DNS_SRV_DATAA SRV
, Srv
;
476 DNS_TKEY_DATAA TKEY
, Tkey
;
477 DNS_TSIG_DATAA TSIG
, Tsig
;
478 DNS_WINS_DATA WINS
, Wins
;
479 DNS_WINSR_DATAA WINSR
, WinsR
, NBSTAT
, Nbstat
;
481 } DNS_RECORDA
, *PDNS_RECORDA
;
483 typedef struct _DnsRecordW
{
484 struct _DnsRecordW
* pNext
;
496 DNS_SOA_DATAW SOA
, Soa
;
497 DNS_PTR_DATAW PTR
, Ptr
, NS
, Ns
, CNAME
, Cname
, MB
, Mb
, MD
, Md
, MF
, Mf
, MG
, Mg
, MR
, Mr
;
498 DNS_MINFO_DATAW MINFO
, Minfo
, RP
, Rp
;
499 DNS_MX_DATAW MX
, Mx
, AFSDB
, Afsdb
, RT
, Rt
;
500 DNS_TXT_DATAW HINFO
, Hinfo
, ISDN
, Isdn
, TXT
, Txt
, X25
;
502 DNS_WKS_DATA WKS
, Wks
;
504 DNS_KEY_DATA KEY
, Key
;
505 DNS_SIG_DATAW SIG
, Sig
;
506 DNS_ATMA_DATA ATMA
, Atma
;
507 DNS_NXT_DATAW NXT
, Nxt
;
508 DNS_SRV_DATAW SRV
, Srv
;
509 DNS_TKEY_DATAW TKEY
, Tkey
;
510 DNS_TSIG_DATAW TSIG
, Tsig
;
511 DNS_WINS_DATA WINS
, Wins
;
512 DNS_WINSR_DATAW WINSR
, WinsR
, NBSTAT
, Nbstat
;
514 } DNS_RECORDW
, *PDNS_RECORDW
;
517 #define DNS_RECORD DNS_RECORDW
518 #define PDNS_RECORD PDNS_RECORDW
520 #define DNS_RECORD DNS_RECORDA
521 #define PDNS_RECORD PDNS_RECORDA
524 typedef struct _DnsRRSet
{
525 PDNS_RECORD pFirstRR
;
527 } DNS_RRSET
, *PDNS_RRSET
;
529 #define DNS_RRSET_INIT(rrset) \
531 PDNS_RRSET _prrset = &(rrset); \
532 _prrset->pFirstRR = NULL; \
533 _prrset->pLastRR = (PDNS_RECORD) &_prrset->pFirstRR; \
536 #define DNS_RRSET_ADD(rrset, pnewRR) \
538 PDNS_RRSET _prrset = &(rrset); \
539 PDNS_RECORD _prrnew = (pnewRR); \
540 _prrset->pLastRR->pNext = _prrnew; \
541 _prrset->pLastRR = _prrnew; \
544 #define DNS_RRSET_TERMINATE(rrset) \
546 PDNS_RRSET _prrset = &(rrset); \
547 _prrset->pLastRR->pNext = NULL; \
552 DnsAcquireContextHandle_A(
553 _In_ DWORD CredentialFlags
,
554 _In_opt_ PVOID Credentials
,
555 _Outptr_ PHANDLE pContext
);
559 DnsAcquireContextHandle_W(
560 _In_ DWORD CredentialFlags
,
561 _In_opt_ PVOID Credentials
,
562 _Outptr_ PHANDLE pContext
);
566 DnsExtractRecordsFromMessage_W(
567 _In_ PDNS_MESSAGE_BUFFER pDnsBuffer
,
568 _In_ WORD wMessageLength
,
569 _Outptr_ PDNS_RECORD
*ppRecord
);
573 DnsExtractRecordsFromMessage_UTF8(
574 _In_ PDNS_MESSAGE_BUFFER pDnsBuffer
,
575 _In_ WORD wMessageLength
,
576 _Outptr_ PDNS_RECORD
*ppRecord
);
580 DnsModifyRecordsInSet_A(
581 _In_opt_ PDNS_RECORD pAddRecords
,
582 _In_opt_ PDNS_RECORD pDeleteRecords
,
584 _In_opt_ HANDLE hCredentials
,
585 _Inout_opt_ PIP4_ARRAY pExtraList
,
586 _Inout_opt_ PVOID pReserved
);
590 DnsModifyRecordsInSet_W(
591 _In_opt_ PDNS_RECORD pAddRecords
,
592 _In_opt_ PDNS_RECORD pDeleteRecords
,
594 _In_opt_ HANDLE hCredentials
,
595 _Inout_opt_ PIP4_ARRAY pExtraList
,
596 _Inout_opt_ PVOID pReserved
);
600 DnsModifyRecordsInSet_UTF8(
601 _In_opt_ PDNS_RECORD pAddRecords
,
602 _In_opt_ PDNS_RECORD pDeleteRecords
,
604 _In_opt_ HANDLE hCredentials
,
605 _Inout_opt_ PIP4_ARRAY pExtraList
,
606 _Inout_opt_ PVOID pReserved
);
626 _Inout_opt_ PIP4_ARRAY pExtra
,
627 _Outptr_result_maybenull_ PDNS_RECORD
*ppQueryResults
,
628 _Outptr_opt_result_maybenull_ PVOID
*pReserved
);
636 _Inout_opt_ PIP4_ARRAY pExtra
,
637 _Outptr_result_maybenull_ PDNS_RECORD
*ppQueryResults
,
638 _Outptr_opt_result_maybenull_ PVOID
*pReserved
);
646 _Inout_opt_ PIP4_ARRAY pExtra
,
647 _Outptr_result_maybenull_ PDNS_RECORD
*ppQueryResults
,
648 _Outptr_opt_result_maybenull_ PVOID
*pReserved
);
653 _In_ DNS_CONFIG_TYPE Config
,
655 _In_opt_ PWSTR pwsAdapterName
,
656 _In_opt_ PVOID pReserved
,
657 _Out_writes_bytes_to_opt_(*pBufLen
, *pBufLen
) PVOID pBuffer
,
658 _Inout_ PDWORD pBufLen
);
669 _In_ PDNS_RECORD pRecord
,
670 _In_ DNS_CHARSET CharSetIn
,
671 _In_ DNS_CHARSET CharSetOut
);
676 _Inout_opt_ PDNS_RECORD
,
682 _Inout_ PDNS_RECORD pRR1
,
683 _Inout_ PDNS_RECORD pRR2
,
684 _Outptr_opt_result_maybenull_ PDNS_RECORD
*ppDiff1
,
685 _Outptr_opt_result_maybenull_ PDNS_RECORD
*ppDiff2
);
690 _In_ PDNS_RECORD pRecordSet
,
691 _In_ DNS_CHARSET CharSetIn
,
692 _In_ DNS_CHARSET CharSetOut
);
697 _Inout_ PDNS_RECORD
);
701 DnsReleaseContextHandle(
706 DnsReplaceRecordSetA(
707 _In_ PDNS_RECORD pReplaceSet
,
709 _In_opt_ HANDLE hContext
,
710 _Inout_opt_ PIP4_ARRAY pExtraInfo
,
711 _Inout_opt_ PVOID pReserved
);
715 DnsReplaceRecordSetW(
716 _In_ PDNS_RECORD pReplaceSet
,
718 _In_opt_ HANDLE hContext
,
719 _Inout_opt_ PIP4_ARRAY pExtraInfo
,
720 _Inout_opt_ PVOID pReserved
);
724 DnsReplaceRecordSetUTF8(
725 _In_ PDNS_RECORD pReplaceSet
,
727 _In_opt_ HANDLE hContext
,
728 _Inout_opt_ PIP4_ARRAY pExtraInfo
,
729 _Inout_opt_ PVOID pReserved
);
735 _In_ DNS_NAME_FORMAT
);
741 _In_ DNS_NAME_FORMAT
);
745 DnsValidateName_UTF8(
747 _In_ DNS_NAME_FORMAT
);
751 DnsWriteQuestionToBuffer_W(
752 _Inout_ PDNS_MESSAGE_BUFFER pDnsBuffer
,
753 _Inout_ PDWORD pdwBufferSize
,
757 _In_ BOOL fRecursionDesired
);
761 DnsWriteQuestionToBuffer_UTF8(
762 _Inout_ PDNS_MESSAGE_BUFFER pDnsBuffer
,
763 _Inout_ PDWORD pdwBufferSize
,
767 _In_ BOOL fRecursionDesired
);
771 #define DNS_MINFO_DATA DNS_MINFO_DATAW
772 #define PDNS_MINFO_DATA PDNS_MINFO_DATAW
773 #define DNS_MX_DATA DNS_MX_DATAW
774 #define PDNS_MX_DATA PDNS_MX_DATAW
775 #define DNS_NXT_DATA DNS_NXT_DATAW
776 #define PDNS_NXT_DATA PDNS_NXT_DATAW
777 #define DNS_PTR_DATA DNS_PTR_DATAW
778 #define PDNS_PTR_DATA PDNS_PTR_DATAW
779 #define DNS_SIG_DATA DNS_SIG_DATAW
780 #define PDNS_SIG_DATA PDNS_SIG_DATAW
781 #define DNS_SOA_DATA DNS_SOA_DATAW
782 #define PDNS_SOA_DATA PDNS_SOA_DATAW
783 #define DNS_TXT_DATA DNS_TXT_DATAW
784 #define PDNS_TXT_DATA PDNS_TXT_DATAW
785 #define DNS_TKEY_DATA DNS_TKEY_DATAW
786 #define PDNS_TKEY_DATA PDNS_TKEY_DATAW
787 #define DNS_WINSR_DATA DNS_WINSR_DATAW
788 #define PDNS_WINSR_DATA PDNS_WINSR_DATAW
789 #define DnsAcquireContextHandle DnsAcquireContextHandle_W
790 #define DnsModifyRecordsInSet DnsModifyRecordsInSet_W
791 #define DnsNameCompare DnsNameCompare_W
792 #define DnsQuery DnsQuery_W
793 #define DnsReplaceRecordSet DnsReplaceRecordSetW
794 #define DnsValidateName DnsValidateName_W
798 #define DNS_MINFO_DATA DNS_MINFO_DATAA
799 #define PDNS_MINFO_DATA PDNS_MINFO_DATAA
800 #define DNS_MX_DATA DNS_MX_DATAA
801 #define PDNS_MX_DATA PDNS_MX_DATAA
802 #define DNS_NXT_DATA DNS_NXT_DATAA
803 #define PDNS_NXT_DATA PDNS_NXT_DATAA
804 #define DNS_PTR_DATA DNS_PTR_DATAA
805 #define PDNS_PTR_DATA PDNS_PTR_DATAA
806 #define DNS_SIG_DATA DNS_SIG_DATAA
807 #define PDNS_SIG_DATA PDNS_SIG_DATAA
808 #define DNS_SOA_DATA DNS_SOA_DATAA
809 #define PDNS_SOA_DATA PDNS_SOA_DATAA
810 #define DNS_TXT_DATA DNS_TXT_DATAA
811 #define PDNS_TXT_DATA PDNS_TXT_DATAA
812 #define DNS_TKEY_DATA DNS_TKEY_DATAA
813 #define PDNS_TKEY_DATA PDNS_TKEY_DATAA
814 #define DNS_WINSR_DATA DNS_WINSR_DATAA
815 #define PDNS_WINSR_DATA PDNS_WINSR_DATAA
816 #define DnsAcquireContextHandle DnsAcquireContextHandle_A
817 #define DnsModifyRecordsInSet DnsModifyRecordsInSet_A
818 #define DnsNameCompare DnsNameCompare_A
819 #define DnsQuery DnsQuery_A
820 #define DnsReplaceRecordSet DnsReplaceRecordSetA
821 #define DnsValidateName DnsValidateName_A
825 #endif /* RC_INVOKED */
831 #endif /* _WINDNS_INCLUDED_ */