Files
reactos/reactos/include/WinDNS.h
Aleksey Bragin f43d6624c8 It is a part of a multipart commit, related to making ReactOS compilable both under MinGW and MSVC6.
Main work on converting ROS to be able to be compiled under MSVC6 was done by Mark Nordell.
Work done by me - incorporating all this stuff into the newest CVS tree.

svn path=/trunk/; revision=7327
2003-12-30 11:53:35 +00:00

446 lines
12 KiB
C

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: include/WinDNS.h
* PURPOSE: Structures and definitions needed for DNSAPI compatibility.
* PROGRAMER: Art Yerkes
* UPDATE HISTORY:
* 12/15/03 -- Created
*/
#ifndef WINDNS_H
#define WINDNS_H
/* The WinDNS Header */
/* Constants provided by DNSAPI */
#define DNS_CONFIG_FLAG_ALLOC TRUE
#define BIT(n) (1<<(n))
#define DNS_QUERY_STANDARD 0
#define DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE BIT(0)
#define DNS_QUERY_USE_TCP_ONLY BIT(1)
#define DNS_QUERY_NO_RECURSION BIT(2)
#define DNS_QUERY_BYPASS_CACHE BIT(3)
#define DNS_QUERY_NO_WIRE_QUERY BIT(4)
#define DNS_QUERY_NO_LOCAL_NAME BIT(5)
#define DNS_QUERY_NO_HOSTS_FILE BIT(6)
#define DNS_QUERY_NO_NETBT BIT(7)
#define DNS_QUERY_WIRE_ONLY BIT(8)
#define DNS_QUERY_RETURN_MESSAGE BIT(9)
#define DNS_QUERY_TREAT_AS_FQDN BIT(12)
#define DNS_QUERY_DONT_RESET_TTL_VALUES BIT(23)
#define DNS_QUERY_RESERVED (0xff << 24)
#define DNS_QUERY_CACHE_ONLY BIT(4)
#define DNS_TYPE_ZERO 0
#define DNS_TYPE_A 1
#define DNS_TYPE_NS 2
#define DNS_TYPE_MD 3
#define DNS_TYPE_MF 4
#define DNS_TYPE_CNAME 5
#define DNS_TYPE_SOA 6
#define DNS_TYPE_MB 7
#define DNS_TYPE_MG 8
#define DNS_TYPE_MR 9
#define DNS_TYPE_NULL 10
#define DNS_TYPE_WKS 11
#define DNS_TYPE_PTR 12
#define DNS_TYPE_HINFO 13
#define DNS_TYPE_MINFO 14
#define DNS_TYPE_MX 15
#define DNS_TYPE_TXT 16
#define DNS_TYPE_RP 17
#define DNS_TYPE_AFSDB 18
#define DNS_TYPE_X25 19
#define DNS_TYPE_ISDN 20
#define DNS_TYPE_RT 21
#define DNS_TYPE_NSAP 22
#define DNS_TYPE_NSAPPTR 23
#define DNS_TYPE_SIG 24
#define DNS_TYPE_KEY 25
#define DNS_TYPE_PX 26
#define DNS_TYPE_GPOS 27
#define DNS_TYPE_AAAA 28
#define DNS_TYPE_LOC 29
#define DNS_TYPE_NXT 30
#define DNS_TYPE_EID 31 /* I've never heard of nimrod before. */
#define DNS_TYPE_NIMLOC 32 /* But it does exist. */
#define DNS_TYPE_SRV 33
#define DNS_TYPE_ATMA 34
#define DNS_TYPE_NAPTR 35
#define DNS_TYPE_KX 36
#define DNS_TYPE_CERT 37
#define DNS_TYPE_A6 38
#define DNS_TYPE_DNAME 39
#define DNS_TYPE_SINK 40
#define DNS_TYPE_OPT 41
#define DNS_TYPE_UINFO 100
#define DNS_TYPE_UID 101
#define DNS_TYPE_GID 102
#define DNS_TYPE_UNSPEC 103
#define DNS_TYPE_ADDRS 248
#define DNS_TYPE_TKEY 249
#define DNS_TYPE_TSIG 250
#define DNS_TYPE_IXFR 251
#define DNS_TYPE_AXFR 252
#define DNS_TYPE_MAILB 253
#define DNS_TYPE_MAILA 254
#define DNS_TYPE_ANY 255
#define DNS_SWAPX(x) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
#define DNS_RTYPE_ZERO DNS_SWAPX(DNS_TYPE_ZERO)
#define DNS_RTYPE_A DNS_SWAPX(DNS_TYPE_A)
#define DNS_RTYPE_NS DNS_SWAPX(DNS_TYPE_NS)
#define DNS_RTYPE_MD DNS_SWAPX(DNS_TYPE_MD)
#define DNS_RTYPE_MF DNS_SWAPX(DNS_TYPE_MF)
#define DNS_RTYPE_CNAME DNS_SWAPX(DNS_TYPE_CNAME)
#define DNS_RTYPE_SOA DNS_SWAPX(DNS_TYPE_SOA)
#define DNS_RTYPE_MB DNS_SWAPX(DNS_TYPE_MB)
#define DNS_RTYPE_MG DNS_SWAPX(DNS_TYPE_MG)
#define DNS_RTYPE_MR DNS_SWAPX(DNS_TYPE_MR)
#define DNS_RTYPE_NULL DNS_SWAPX(DNS_TYPE_NULL)
#define DNS_RTYPE_WKS DNS_SWAPX(DNS_TYPE_WKS)
#define DNS_RTYPE_PTR DNS_SWAPX(DNS_TYPE_PTR)
#define DNS_RTYPE_HINFO DNS_SWAPX(DNS_TYPE_HINFO)
#define DNS_RTYPE_MINFO DNS_SWAPX(DNS_TYPE_MINFO)
#define DNS_RTYPE_MX DNS_SWAPX(DNS_TYPE_MX)
#define DNS_RTYPE_TEXT DNS_SWAPX(DNS_TYPE_TEXT)
#define DNS_RTYPE_RP DNS_SWAPX(DNS_TYPE_RP)
#define DNS_RTYPE_AFSDB DNS_SWAPX(DNS_TYPE_AFSDB)
#define DNS_RTYPE_X25 DNS_SWAPX(DNS_TYPE_X25)
#define DNS_RTYPE_ISDN DNS_SWAPX(DNS_TYPE_ISDN)
#define DNS_RTYPE_RT DNS_SWAPX(DNS_TYPE_RT)
#define DNS_RTYPE_NSAP DNS_SWAPX(DNS_TYPE_NSAP)
#define DNS_RTYPE_NSAPPTR DNS_SWAPX(DNS_TYPE_NSAPPTR)
#define DNS_RTYPE_SIG DNS_SWAPX(DNS_TYPE_SIG)
#define DNS_RTYPE_KEY DNS_SWAPX(DNS_TYPE_KEY)
#define DNS_RTYPE_PX DNS_SWAPX(DNS_TYPE_PX)
#define DNS_RTYPE_GPOS DNS_SWAPX(DNS_TYPE_GPOS)
#define DNS_RTYPE_AAAA DNS_SWAPX(DNS_TYPE_AAAA)
#define DNS_RTYPE_LOC DNS_SWAPX(DNS_TYPE_LOC)
#define DNS_RTYPE_NXT DNS_SWAPX(DNS_TYPE_NXT)
#define DNS_RTYPE_EID DNS_SWAPX(DNS_TYPE_EID)
#define DNS_RTYPE_NIMLOC DNS_SWAPX(DNS_TYPE_NIMLOC)
#define DNS_RTYPE_SRV DNS_SWAPX(DNS_TYPE_SRV)
#define DNS_RTYPE_ATMA DNS_SWAPX(DNS_TYPE_ATMA)
#define DNS_RTYPE_NAPTR DNS_SWAPX(DNS_TYPE_NAPTR)
#define DNS_RTYPE_KX DNS_SWAPX(DNS_TYPE_KX)
#define DNS_RTYPE_CERT DNS_SWAPX(DNS_TYPE_CERT)
#define DNS_RTYPE_A6 DNS_SWAPX(DNS_TYPE_A6)
#define DNS_RTYPE_DNAME DNS_SWAPX(DNS_TYPE_DNAME)
#define DNS_RTYPE_SINK DNS_SWAPX(DNS_TYPE_SINK)
#define DNS_RTYPE_OPT DNS_SWAPX(DNS_TYPE_OPT)
#define DNS_RTYPE_UINFO DNS_SWAPX(DNS_TYPE_UINFO)
#define DNS_RTYPE_UID DNS_SWAPX(DNS_TYPE_UID)
#define DNS_RTYPE_GID DNS_SWAPX(DNS_TYPE_GID)
#define DNS_RTYPE_UNSPEC DNS_SWAPX(DNS_TYPE_UNSPEC)
#define DNS_RTYPE_ADDRS DNS_SWAPX(DNS_TYPE_ADDRS)
#define DNS_RTYPE_TKEY DNS_SWAPX(DNS_TYPE_TKEY)
#define DNS_RTYPE_TSIG DNS_SWAPX(DNS_TYPE_TSIG)
#define DNS_RTYPE_IXFR DNS_SWAPX(DNS_TYPE_IXFR)
#define DNS_RTYPE_AXFR DNS_SWAPX(DNS_TYPE_AXFR)
#define DNS_RTYPE_MAILB DNS_SWAPX(DNS_TYPE_MAILB)
#define DNS_RTYPE_MAILA DNS_SWAPX(DNS_TYPE_MAILA)
#define DNS_RTYPE_ANY DNS_SWAPX(DNS_TYPE_ANY)
/* Simple types */
typedef LONG DNS_STATUS;
typedef DNS_STATUS *PDNS_STATUS;
typedef DWORD IP4_ADDRESS;
typedef IP4_ADDRESS *PIP4_ADDRESS;
typedef struct {
DWORD IP6Dword[4];
} IP6_ADDRESS, *PIP6_ADDRESS;
typedef enum {
DnsFreeFlat,
DnsFreeRecordList,
DnsFreeParsedMessageFields
} DNS_FREE_TYPE;
typedef enum {
DnsNameDomain,
DnsNameDomainLabel,
DnsNameHostnameFull,
DnsNameHostnameLabel,
DnsNameWildcard,
DnsNameSrvRecord
} DNS_NAME_FORMAT;
/* The below is for repetitive names that distinguish character coding */
#define DNS_PASTE(x,y) x ## y
#define DNSCT_TRIPLET(x) DNS_PASTE(x,_W), DNS_PASTE(x,_A), DNS_PASTE(x,_UTF8)
typedef enum {
DNSCT_TRIPLET(DnsConfigPrimaryDomainName),
DNSCT_TRIPLET(DnsConfigAdapterDomainName),
DnsConfigDnsServerList,
DnsConfigSearchList,
DnsConfigAdapterInfo,
DnsConfigPrimaryHostNameRegistrationEnabled,
DnsConfigAdapterHostNameRegistrationEnabled,
DnsConfigAddressRegistrationMaxCount,
DNSCT_TRIPLET(DnsConfigHostName),
DNSCT_TRIPLET(DnsConfigFullHostName)
} DNS_CONFIG_TYPE;
/* Aggregates provided by DNSAPI */
typedef struct {
DWORD Section : 2;
DWORD Delete : 1;
DWORD CharSet : 2;
DWORD Unused : 3;
DWORD Reserved : 24;
} DNS_RECORD_FLAGS;
typedef struct _IP4_ARRAY {
DWORD AddrCount;
IP4_ADDRESS AddrArray[1]; /* Avoid zero-length array warning */
} IP4_ARRAY, *PIP4_ARRAY;
typedef struct _DNS_HEADER {
WORD Xid;
BYTE RecursionDesired;
BYTE Truncation;
BYTE Authoritative;
BYTE Opcode;
BYTE IsResponse;
BYTE ResponseCode;
BYTE Reserved;
BYTE RecursionAvailable;
WORD QuestionCount;
WORD NameServerCount;
WORD AdditionalCount;
} DNS_HEADER, *PDNS_HEADER;
typedef struct _DNS_MESSAGE_BUFFER {
DNS_HEADER MessageHead;
CHAR MessageBody[1];
} DNS_MESSAGE_BUFFER, *PDNS_MESSAGE_BUFFER;
/* Some DNSAPI structs are sensitive to character coding. This will allow
* us to define them once.
*
* the XNAME(n) macro turns the name into either nA or nW
* the PSTR type expands to either LPWSTR or LPSTR.
*/
/* A record, indicates an IPv4 address. */
typedef struct {
IP4_ADDRESS IpAddress;
} DNS_A_DATA, *PDNS_A_DATA;
typedef struct {
DWORD dwByteCount;
BYTE Data[1];
} DNS_NULL_DATA, *PDNS_NULL_DATA;
typedef struct {
IP4_ADDRESS IpAddress;
UCHAR chProtocol;
BYTE BitMask[1];
} DNS_WKS_DATA, *PDNS_WKS_DATA;
typedef struct {
IP6_ADDRESS Ip6Address;
} DNS_AAAA_DATA, *PDNS_AAAA_DATA;
typedef struct {
WORD wFlags;
BYTE chProtocol;
BYTE chAlgorithm;
BYTE Key[1];
} DNS_KEY_DATA, *PDNS_KEY_DATA;
typedef struct {
WORD wVersion;
WORD wSize;
WORD wHorPrec;
WORD wVerPrec;
DWORD dwLatitude;
DWORD dwLongitude;
DWORD dwAltitude;
} DNS_LOC_DATA, *PDNS_LOC_DATA;
/* Here's the ugly bit, we import twice; once for wchar and once for char. */
#define XNAME(a) a ## A
#define PSTR LPSTR
#define _WINDNS_STRUCT_DEFINITIONS
#include "WinDNS.h"
#undef XNAME
#undef PSTR
#define XNAME(a) a ## W
#define PSTR LPWSTR
#include "WinDNS.h"
#undef XNAME
#undef PSTR
#undef _WINDNS_STRUCT_DEFINITIONS
#ifndef _DISABLE_TIDENTS
#ifdef _UNICODE
#define DECLARE_STRUCT(x) typedef DNS_PASTE(x,W) x , *DNS_PASTE(P,x)
#define DECLARE_FUNC(x) DNS_PASTE(x,_W)
#else /* _UNICODE */
#define DECLARE_STRUCT(x) typedef DNS_PASTE(x,A) x , *DNS_PASTE(P,x)
#define DECLARE_FUNC(x) DNS_PASTE(x,_A)
#endif /* _UNICODE */
/* Now, all the declarations go off. */
DECLARE_STRUCT(DNS_PTR_DATA);
DECLARE_STRUCT(DNS_SOA_DATA);
DECLARE_STRUCT(DNS_MINFO_DATA);
DECLARE_STRUCT(DNS_MX_DATA);
DECLARE_STRUCT(DNS_TXT_DATA);
DECLARE_STRUCT(DNS_SIG_DATA);
DECLARE_STRUCT(DNS_NXT_DATA);
DECLARE_STRUCT(DNS_SRV_DATA);
DECLARE_STRUCT(DNS_RECORD);
#define DnsAcquireContextHandle DECLARE_FUNC(DnsAcquireContextHandle)
#define DnsValidateName DECLARE_FUNC(DnsValidateName)
#define DnsQuery DECLARE_FUNC(DnsQuery)
#endif /* _DISABLE_TIDENTS */
/* Prototypes */
void WINAPI DnsReleaseContextHandle( HANDLE ContextHandle );
DNS_STATUS WINAPI DnsAcquireContextHandle_W
( DWORD CredentialsFlags,
PVOID Credentials,
HANDLE *ContextHandle );
DNS_STATUS WINAPI DnsAcquireContextHandle_UTF8
( DWORD CredentialsFlags,
PVOID Credentials,
HANDLE *ContextHandle );
DNS_STATUS WINAPI DnsAcquireContextHandle_A
( DWORD CredentialsFlags,
PVOID Credentials,
HANDLE *ContextHandle );
DNS_STATUS WINAPI DnsValidateName_W
( LPCWSTR Name, DNS_NAME_FORMAT Format );
DNS_STATUS WINAPI DnsValidateName_UTF8
( LPCSTR Name, DNS_NAME_FORMAT Format );
DNS_STATUS WINAPI DnsValidateName_A
( LPCSTR Name, DNS_NAME_FORMAT Format );
DNS_STATUS WINAPI DnsQuery_W
( LPCWSTR Name, WORD Type, DWORD Options, PIP4_ARRAY Servers,
PDNS_RECORDW *Result, PVOID *Reserved );
DNS_STATUS WINAPI DnsQuery_UTF8
( LPCSTR Name, WORD Type, DWORD Options, PIP4_ARRAY Servers,
PDNS_RECORDA *Result, PVOID *Reserved );
DNS_STATUS WINAPI DnsQuery_A
( LPCSTR Name, WORD Type, DWORD Options, PIP4_ARRAY Servers,
PDNS_RECORDA *Result, PVOID *Reserved );
VOID WINAPI DnsFree( PVOID Data, DNS_FREE_TYPE FreeType );
VOID WINAPI DnsRecordListFree( PVOID RecordList,
DNS_FREE_TYPE FreeType );
#endif//WINDNS_H
#ifdef _WINDNS_STRUCT_DEFINITIONS
/* PTR record, indicates an additional lookup for the given name is needed. */
typedef struct {
PSTR pNameHost;
} XNAME(DNS_PTR_DATA), *XNAME(PDNS_PTR_DATA);
typedef struct {
PSTR pNamePrimaryServer;
PSTR pNameAdministrator;
DWORD dwSerialNo;
DWORD dwRefresh;
DWORD dwRetry;
DWORD dwExpire;
DWORD dwDefaultTtl;
} XNAME(DNS_SOA_DATA), *XNAME(PDNS_SOA_DATA);
/* MINFO record, who to mail about questions or problems. */
typedef struct {
PSTR pNameMailbox;
PSTR pNameErrorsMailbox;
} XNAME(DNS_MINFO_DATA), *XNAME(PNDS_MINFO_DATA);
/* MX record, who processes the mail for this domain? */
typedef struct {
PSTR pNameExchange;
WORD wPreference;
WORD Pad;
} XNAME(DNS_MX_DATA), *XNAME(PDNS_MX_DATA);
/* TXT record, miscellaneous information. */
typedef struct {
DWORD dwStringCount;
PSTR pStringArray[1];
} XNAME(DNS_TXT_DATA), *XNAME(PDNS_TXT_DATA);
typedef struct {
PSTR pNameSigner;
WORD wTypeCovered;
BYTE cbAlgorithm;
BYTE cbLabelCount;
DWORD dwOriginalTtl;
DWORD dwExpiration;
DWORD dwTimeSigned;
WORD wKeyTag;
WORD Pad;
BYTE Signature[1];
} XNAME(DNS_SIG_DATA), *XNAME(PDNS_SIG_DATA);
typedef struct {
PSTR pNameNext;
WORD wNumTypes;
WORD wTypes[1];
} XNAME(DNS_NXT_DATA), *XNAME(PDNS_NXT_DATA);
typedef struct {
PSTR pNameTarget;
WORD wPriority;
WORD wWeight;
WORD wPort;
WORD Pad;
} XNAME(DNS_SRV_DATA), *XNAME(PDNS_SRV_DATA);
typedef struct XNAME(_DNS_RECORD_) {
struct XNAME(_DNS_RECORD_) *pNext;
PSTR pName;
WORD wType;
WORD wDataLength;
union {
DWORD DW;
DNS_RECORD_FLAGS S;
} Flags;
DWORD dwTtl;
DWORD dwReserved;
union {
DNS_A_DATA A;
XNAME(DNS_SOA_DATA) SOA, Soa;
XNAME(DNS_PTR_DATA) PTR, Ptr, NS, Ns, CNAME, Cname, MB, Mb, MD, Md, MF, Mf, MG, Mg, MR, Mr;
XNAME(DNS_MINFO_DATA) MINFO, Minfo, RP, Rp;
XNAME(DNS_MX_DATA) MX, Mx, AFSDB, Afsdb, RT, Rt;
XNAME(DNS_TXT_DATA) HINFO, Hinfo, ISDN, Isdn, TXT, Txt;
DNS_NULL_DATA Null;
DNS_WKS_DATA WKS, Wks;
DNS_AAAA_DATA AAAA;
DNS_KEY_DATA KEY, Key;
XNAME(DNS_SIG_DATA) SIG, Sig;
XNAME(DNS_NXT_DATA) NXT, Nxt;
XNAME(DNS_SRV_DATA) SRV, Srv;
} Data;
} XNAME(DNS_RECORD), *XNAME(PDNS_RECORD);
#endif /* _WINDNS_STRUCT_DEFINITIONS */