2699 lines
67 KiB
C
2699 lines
67 KiB
C
/*++
|
||
|
||
Copyright (c) 1997 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
dnsapi.h
|
||
|
||
Abstract:
|
||
|
||
Domain Name System (DNS)
|
||
|
||
DNS Client API Library
|
||
|
||
Author:
|
||
|
||
Jim Gilroy (jamesg) December 7, 1996
|
||
|
||
Revision History:
|
||
|
||
Glenn Curtis (glennc) January 22, 1997
|
||
Added Dynamic Update Client API for DNSAPI.DLL
|
||
|
||
--*/
|
||
|
||
|
||
#ifndef _DNSAPI_INCLUDED_
|
||
#define _DNSAPI_INCLUDED_
|
||
|
||
#ifndef _WINSOCK2API_
|
||
#ifndef _WINSOCKAPI_
|
||
#include <winsock2.h>
|
||
#endif
|
||
#endif
|
||
|
||
#ifndef _DNS_INCLUDED_
|
||
#include <dns.h>
|
||
#endif
|
||
|
||
|
||
#ifdef __cplusplus
|
||
extern "C"
|
||
{
|
||
#endif // __cplusplus
|
||
|
||
|
||
//
|
||
// Non-wrapping seconds timer (timer.c)
|
||
//
|
||
|
||
DWORD
|
||
GetCurrentTimeInSeconds(
|
||
VOID
|
||
);
|
||
|
||
|
||
//
|
||
// General DNS utilities (dnsutil.c)
|
||
//
|
||
|
||
LPSTR
|
||
_fastcall
|
||
DnsGetDomainName(
|
||
IN LPSTR pszName
|
||
);
|
||
|
||
LPSTR
|
||
_fastcall
|
||
DnsStatusString(
|
||
IN DNS_STATUS Status
|
||
);
|
||
|
||
#define DnsStatusToErrorString_A(status) DnsStatusString(status)
|
||
|
||
DNS_STATUS
|
||
_fastcall
|
||
DnsMapRcodeToStatus(
|
||
IN BYTE ResponseCode
|
||
);
|
||
|
||
BYTE
|
||
_fastcall
|
||
DnsIsStatusRcode(
|
||
IN DNS_STATUS Status
|
||
);
|
||
|
||
//
|
||
// Machines IP address list (iplist.c)
|
||
//
|
||
// Routine to get the current IP addresses from all adapters
|
||
// configured for the machine.
|
||
//
|
||
|
||
DWORD
|
||
DnsGetIpAddressList(
|
||
OUT PIP_ARRAY * ppIpAddresses
|
||
);
|
||
|
||
//
|
||
// Routine to get the current IP addresses and subnet masks
|
||
// from all adapters configured for the machine.
|
||
//
|
||
|
||
typedef struct _DNS_ADDRESS_INFO_
|
||
{
|
||
IP_ADDRESS ipAddress;
|
||
IP_ADDRESS subnetMask;
|
||
}
|
||
DNS_ADDRESS_INFO, *PDNS_ADDRESS_INFO;
|
||
|
||
DWORD
|
||
DnsGetIpAddressInfoList(
|
||
OUT PDNS_ADDRESS_INFO * ppAddrInfo
|
||
);
|
||
|
||
DWORD
|
||
DnsGetDnsServerList(
|
||
OUT PIP_ARRAY * ppDnsAddresses
|
||
);
|
||
|
||
|
||
//
|
||
// Routines and structures for getting network configuration information
|
||
// for TCPIP interfaces
|
||
//
|
||
|
||
#define NETINFO_FLAG_IS_WAN_ADAPTER (0x00000002)
|
||
#define NETINFO_FLAG_IS_AUTONET_ADAPTER (0x00000004)
|
||
#define NETINFO_FLAG_IS_DHCP_CFG_ADAPTER (0x00000008)
|
||
|
||
|
||
typedef struct _NAME_SERVER_INFORMATION_
|
||
{
|
||
IP_ADDRESS ipAddress;
|
||
DWORD Priority;
|
||
}
|
||
NAME_SERVER_INFORMATION, *PNAME_SERVER_INFORMATION;
|
||
|
||
typedef struct _ADAPTER_INFORMATION_
|
||
{
|
||
LPSTR pszAdapterGuidName;
|
||
LPSTR pszDomain;
|
||
PIP_ARRAY pIPAddresses;
|
||
PIP_ARRAY pIPSubnetMasks;
|
||
DWORD InfoFlags;
|
||
DWORD cServerCount;
|
||
NAME_SERVER_INFORMATION aipServers[1];
|
||
}
|
||
ADAPTER_INFORMATION, *PADAPTER_INFORMATION;
|
||
|
||
typedef struct _SEARCH_INFORMATION_
|
||
{
|
||
LPSTR pszPrimaryDomainName;
|
||
DWORD cNameCount;
|
||
LPSTR aSearchListNames[1];
|
||
}
|
||
SEARCH_INFORMATION, *PSEARCH_INFORMATION;
|
||
|
||
typedef struct _NETWORK_INFORMATION_
|
||
{
|
||
PSEARCH_INFORMATION pSearchInformation;
|
||
DWORD cAdapterCount;
|
||
PADAPTER_INFORMATION aAdapterInfoList[1];
|
||
}
|
||
NETWORK_INFORMATION, *PNETWORK_INFORMATION;
|
||
|
||
|
||
PNETWORK_INFORMATION
|
||
WINAPI
|
||
DnsGetNetworkInformation(
|
||
void
|
||
);
|
||
|
||
PSEARCH_INFORMATION
|
||
WINAPI
|
||
DnsGetSearchInformation(
|
||
void
|
||
);
|
||
|
||
VOID
|
||
WINAPI
|
||
DnsFreeAdapterInformation(
|
||
IN PADAPTER_INFORMATION pAdapterInformation
|
||
);
|
||
|
||
VOID
|
||
WINAPI
|
||
DnsFreeSearchInformation(
|
||
IN PSEARCH_INFORMATION pSearchInformation
|
||
);
|
||
|
||
VOID
|
||
WINAPI
|
||
DnsFreeNetworkInformation(
|
||
IN PNETWORK_INFORMATION pNetworkInformation
|
||
);
|
||
|
||
|
||
|
||
//
|
||
// Resource record type utilities (record.c)
|
||
//
|
||
|
||
BOOL
|
||
_fastcall
|
||
DnsIsAMailboxType(
|
||
IN WORD wType
|
||
);
|
||
|
||
WORD
|
||
DnsRecordTypeForName(
|
||
IN PCHAR pszName,
|
||
IN INT cchNameLength
|
||
);
|
||
|
||
PCHAR
|
||
DnsRecordStringForType(
|
||
IN WORD wType
|
||
);
|
||
|
||
PCHAR
|
||
DnsRecordStringForWritableType(
|
||
IN WORD wType
|
||
);
|
||
|
||
BOOL
|
||
DnsIsStringCountValidForTextType(
|
||
IN WORD wType,
|
||
IN WORD StringCount
|
||
);
|
||
|
||
BOOL
|
||
DnsIpv6StringToAddress(
|
||
OUT PIPV6_ADDRESS pAddress,
|
||
IN PCHAR pchString,
|
||
IN DWORD dwStringLength
|
||
);
|
||
|
||
VOID
|
||
DnsIpv6AddressToString(
|
||
OUT PCHAR pchString,
|
||
IN PIPV6_ADDRESS pAddress
|
||
);
|
||
|
||
|
||
|
||
//
|
||
// Resource record structure for send\recv records.
|
||
//
|
||
|
||
//
|
||
// Record data for specific types
|
||
//
|
||
|
||
#ifdef SDK_DNS_RECORD
|
||
|
||
typedef struct
|
||
{
|
||
IP_ADDRESS ipAddress;
|
||
}
|
||
DNS_A_DATA, *PDNS_A_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
LPTSTR pNameHost;
|
||
}
|
||
DNS_PTR_DATA, *PDNS_PTR_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
LPTSTR pNamePrimaryServer;
|
||
LPTSTR pNameAdministrator;
|
||
DWORD dwSerialNo;
|
||
DWORD dwRefresh;
|
||
DWORD dwRetry;
|
||
DWORD dwExpire;
|
||
DWORD dwDefaultTtl;
|
||
}
|
||
DNS_SOA_DATA, *PDNS_SOA_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
LPTSTR pNameMailbox;
|
||
LPTSTR pNameErrorsMailbox;
|
||
}
|
||
DNS_MINFO_DATA, *PDNS_MINFO_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
LPTSTR pNameExchange;
|
||
WORD wPreference;
|
||
WORD Pad; // keep ptrs DWORD aligned
|
||
}
|
||
DNS_MX_DATA, *PDNS_MX_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwStringCount;
|
||
#ifdef MIDL_PASS
|
||
[size_is(dwStringCount)] LPTSTR * pStringArray;
|
||
#else // MIDL_PASS
|
||
LPTSTR pStringArray[1];
|
||
#endif // MIDL_PASS
|
||
}
|
||
DNS_TXT_DATA, *PDNS_TXT_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwByteCount;
|
||
#ifdef MIDL_PASS
|
||
[size_is(dwByteCount)] PBYTE bData;
|
||
#else // MIDL_PASS
|
||
BYTE bData[1];
|
||
#endif // MIDL_PASS
|
||
}
|
||
DNS_NULL_DATA, *PDNS_NULL_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
IP_ADDRESS ipAddress;
|
||
UCHAR chProtocol;
|
||
BYTE bBitMask[1];
|
||
}
|
||
DNS_WKS_DATA, *PDNS_WKS_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
IPV6_ADDRESS ipv6Address;
|
||
}
|
||
DNS_AAAA_DATA, *PDNS_AAAA_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
LPTSTR pNameSigner;
|
||
WORD wTypeCovered;
|
||
BYTE chAlgorithm;
|
||
BYTE chLabelCount;
|
||
DWORD dwOriginalTtl;
|
||
DWORD dwExpiration;
|
||
DWORD dwTimeSigned;
|
||
WORD wKeyTag;
|
||
WORD Pad; // keep byte field aligned
|
||
BYTE Signature[1];
|
||
}
|
||
DNS_SIG_DATA, *PDNS_SIG_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;
|
||
|
||
typedef struct
|
||
{
|
||
LPTSTR pNameNext;
|
||
BYTE bTypeBitMap[1];
|
||
}
|
||
DNS_NXT_DATA, *PDNS_NXT_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
LPTSTR pNameTarget;
|
||
WORD wPriority;
|
||
WORD wWeight;
|
||
WORD wPort;
|
||
WORD Pad; // keep ptrs DWORD aligned
|
||
}
|
||
DNS_SRV_DATA, *PDNS_SRV_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
LPTSTR pNameAlgorithm;
|
||
PBYTE pAlgorithmPacket;
|
||
PBYTE pKey;
|
||
PBYTE pOtherData;
|
||
DWORD dwCreateTime;
|
||
DWORD dwExpireTime;
|
||
WORD wMode;
|
||
WORD wError;
|
||
WORD wKeyLength;
|
||
WORD wOtherLength;
|
||
UCHAR cAlgNameLength;
|
||
BOOL fPacketPointers;
|
||
}
|
||
DNS_TKEY_DATA, *PDNS_TKEY_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
LPTSTR pNameAlgorithm;
|
||
PBYTE pAlgorithmPacket;
|
||
PBYTE pSignature;
|
||
PBYTE pOtherData;
|
||
LONGLONG i64CreateTime;
|
||
WORD wFudgeTime;
|
||
WORD wOriginalID;
|
||
WORD wError;
|
||
WORD wSigLength;
|
||
WORD wOtherLength;
|
||
UCHAR cAlgNameLength;
|
||
BOOL fPacketPointers;
|
||
}
|
||
DNS_TSIG_DATA, *PDNS_TSIG_DATA;
|
||
|
||
|
||
#define DNS_ATM_TYPE_E164 0x01 // E.164 addressing scheme
|
||
#define DNS_ATM_TYPE_NSAP 0x02 // NSAP-style addressing scheme
|
||
#define DNS_ATM_TYPE_AESA DNS_ATM_TYPE_NSAP
|
||
|
||
#define DNS_ATM_MAX_ADDR_SIZE 20
|
||
|
||
typedef struct
|
||
{
|
||
BYTE AddressType;
|
||
BYTE Address[ DNS_ATM_MAX_ADDR_SIZE ];
|
||
|
||
// Endsystem Address IA5 digits
|
||
// for E164, BCD encoding for NSAP
|
||
// Array size is DNS_ATM_MAX_ADDR_SIZE for NSAP
|
||
// address type, and a null terminated string
|
||
// less than DNS_ATM_MAX_ADDR_SIZE characters
|
||
// for E164 address type.
|
||
}
|
||
DNS_ATMA_DATA, *PDNS_ATMA_DATA;
|
||
|
||
|
||
//
|
||
// MS only types -- only hit the wire in MS-MS zone transfer
|
||
//
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwMappingFlag;
|
||
DWORD dwLookupTimeout;
|
||
DWORD dwCacheTimeout;
|
||
DWORD cWinsServerCount;
|
||
IP_ADDRESS aipWinsServers[1];
|
||
}
|
||
DNS_WINS_DATA, *PDNS_WINS_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwMappingFlag;
|
||
DWORD dwLookupTimeout;
|
||
DWORD dwCacheTimeout;
|
||
LPTSTR pNameResultDomain;
|
||
}
|
||
DNS_WINSR_DATA, *PDNS_WINSR_DATA;
|
||
|
||
|
||
//
|
||
// Length of non-fixed-length data types
|
||
//
|
||
|
||
#define DNS_TEXT_RECORD_LENGTH(StringCount) \
|
||
(sizeof(DWORD) + ((StringCount) * sizeof(PCHAR)))
|
||
|
||
#define DNS_NULL_RECORD_LENGTH(ByteCount) \
|
||
(sizeof(DWORD) + (ByteCount))
|
||
|
||
#define DNS_WKS_RECORD_LENGTH(ByteCount) \
|
||
(sizeof(DNS_WKS_DATA) + (ByteCount-1))
|
||
|
||
#define DNS_WINS_RECORD_LENGTH(IpCount) \
|
||
(sizeof(DNS_WINS_DATA) + ((IpCount-1) * sizeof(IP_ADDRESS)))
|
||
|
||
|
||
//
|
||
// Record flags
|
||
//
|
||
|
||
#if 0
|
||
typedef struct _DnsRecordFlags
|
||
{
|
||
BYTE Section : 2;
|
||
BYTE Delete : 1;
|
||
BYTE Unused : 5;
|
||
|
||
BYTE Unused2 : 4;
|
||
BYTE FreeData : 1;
|
||
BYTE FreeOwner : 1;
|
||
BYTE Unicode : 1;
|
||
BYTE Multiple : 1;
|
||
|
||
WORD Reserved;
|
||
}
|
||
DNSREC_FLAGS;
|
||
#endif
|
||
|
||
|
||
|
||
typedef struct _DnsRecordFlags
|
||
{
|
||
DWORD Section : 2;
|
||
DWORD Delete : 1;
|
||
DWORD CharSet : 2;
|
||
DWORD Unused : 3;
|
||
|
||
DWORD Reserved : 24;
|
||
}
|
||
DNSREC_FLAGS;
|
||
|
||
|
||
//
|
||
// Record flags as bit flags
|
||
// These may be or'd together to set the fields
|
||
//
|
||
|
||
// RR Section in packet
|
||
|
||
#define DNSREC_SECTION (0x00000003)
|
||
|
||
#define DNSREC_QUESTION (0x00000000)
|
||
#define DNSREC_ANSWER (0x00000001)
|
||
#define DNSREC_AUTHORITY (0x00000002)
|
||
#define DNSREC_ADDITIONAL (0x00000003)
|
||
|
||
// RR Section in packet (update)
|
||
|
||
#define DNSREC_ZONE (0x00000000)
|
||
#define DNSREC_PREREQ (0x00000001)
|
||
#define DNSREC_UPDATE (0x00000002)
|
||
|
||
// Delete RR (update) or No-exist (prerequisite)
|
||
|
||
#define DNSREC_DELETE (0x00000004)
|
||
#define DNSREC_NOEXIST (0x00000004)
|
||
|
||
|
||
#ifdef MIDL_PASS
|
||
typedef [switch_type(WORD)] union _DNS_RECORD_DATA_TYPES
|
||
{
|
||
[case(DNS_TYPE_A)] DNS_A_DATA A;
|
||
|
||
[case(DNS_TYPE_SOA)] DNS_SOA_DATA SOA;
|
||
|
||
[case(DNS_TYPE_PTR,
|
||
DNS_TYPE_NS,
|
||
DNS_TYPE_CNAME,
|
||
DNS_TYPE_MB,
|
||
DNS_TYPE_MD,
|
||
DNS_TYPE_MF,
|
||
DNS_TYPE_MG,
|
||
DNS_TYPE_MR)] DNS_PTR_DATA PTR;
|
||
|
||
[case(DNS_TYPE_MINFO,
|
||
DNS_TYPE_RP)] DNS_MINFO_DATA MINFO;
|
||
|
||
[case(DNS_TYPE_MX,
|
||
DNS_TYPE_AFSDB,
|
||
DNS_TYPE_RT)] DNS_MX_DATA MX;
|
||
|
||
#if 0
|
||
// RPC is not able to handle a proper TXT record definition
|
||
// note: that if other types are needed they are fixed
|
||
// (or semi-fixed) size and may be accomodated easily
|
||
[case(DNS_TYPE_HINFO,
|
||
DNS_TYPE_ISDN,
|
||
DNS_TYPE_TEXT,
|
||
DNS_TYPE_X25)] DNS_TXT_DATA TXT;
|
||
|
||
[case(DNS_TYPE_NULL)] DNS_NULL_DATA Null;
|
||
[case(DNS_TYPE_WKS)] DNS_WKS_DATA WKS;
|
||
[case(DNS_TYPE_TKEY)] DNS_TKEY_DATA TKEY;
|
||
[case(DNS_TYPE_TSIG)] DNS_TSIG_DATA TSIG;
|
||
[case(DNS_TYPE_WINS)] DNS_WINS_DATA WINS;
|
||
[case(DNS_TYPE_NBSTAT)] DNS_WINSR_DATA WINSR;
|
||
#endif
|
||
|
||
[case(DNS_TYPE_AAAA)] DNS_AAAA_DATA AAAA;
|
||
[case(DNS_TYPE_SRV)] DNS_SRV_DATA SRV;
|
||
[case(DNS_TYPE_ATMA)] DNS_ATMA_DATA ATMA;
|
||
//
|
||
// BUGBUG - Commented out since this may not be needed - Check with MarioG
|
||
//
|
||
//[default] ;
|
||
}
|
||
DNS_RECORD_DATA_TYPES;
|
||
#endif // MIDL_PASS
|
||
|
||
|
||
//
|
||
// Record \ RR set structure
|
||
//
|
||
// Note: The dwReserved flag serves to insure that the substructures
|
||
// start on 64-bit boundaries. Since adding the LONGLONG to
|
||
// TSIG structure the compiler wants to start them there anyway
|
||
// (to 64-align). This insures that no matter what data fields
|
||
// are present we are properly 64-aligned.
|
||
//
|
||
// Do NOT pack this structure, as the substructures to be 64-aligned
|
||
// for Win64.
|
||
//
|
||
|
||
typedef struct _DnsRecord
|
||
{
|
||
struct _DnsRecord * pNext;
|
||
LPTSTR pName;
|
||
WORD wType;
|
||
WORD wDataLength; // Not referenced for DNS record types
|
||
// defined above.
|
||
#ifdef MIDL_PASS
|
||
DWORD Flags;
|
||
#else // MIDL_PASS
|
||
union
|
||
{
|
||
DWORD DW; // flags as dword
|
||
DNSREC_FLAGS S; // flags as structure
|
||
|
||
} Flags;
|
||
#endif // MIDL_PASS
|
||
|
||
DWORD dwTtl;
|
||
DWORD dwReserved;
|
||
#ifdef MIDL_PASS
|
||
[switch_is(wType)] DNS_RECORD_DATA_TYPES Data;
|
||
#else // MIDL_PASS
|
||
union
|
||
{
|
||
DNS_A_DATA A;
|
||
DNS_SOA_DATA SOA, Soa;
|
||
DNS_PTR_DATA PTR, Ptr,
|
||
NS, Ns,
|
||
CNAME, Cname,
|
||
MB, Mb,
|
||
MD, Md,
|
||
MF, Mf,
|
||
MG, Mg,
|
||
MR, Mr;
|
||
DNS_MINFO_DATA MINFO, Minfo,
|
||
RP, Rp;
|
||
DNS_MX_DATA MX, Mx,
|
||
AFSDB, Afsdb,
|
||
RT, Rt;
|
||
DNS_TXT_DATA HINFO, Hinfo,
|
||
ISDN, Isdn,
|
||
TXT, Txt,
|
||
X25;
|
||
DNS_NULL_DATA Null;
|
||
DNS_WKS_DATA WKS, Wks;
|
||
DNS_AAAA_DATA AAAA;
|
||
DNS_SRV_DATA SRV, Srv;
|
||
DNS_TKEY_DATA TKEY, Tkey;
|
||
DNS_TSIG_DATA TSIG, Tsig;
|
||
DNS_ATMA_DATA ATMA, Atma;
|
||
DNS_WINS_DATA WINS, Wins;
|
||
DNS_WINSR_DATA WINSR, WinsR, NBSTAT, Nbstat;
|
||
|
||
} Data;
|
||
#endif // MIDL_PASS
|
||
}
|
||
DNS_RECORD, *PDNS_RECORD;
|
||
|
||
|
||
|
||
#else // not SDK_DNS_RECORD
|
||
|
||
//
|
||
// Old DNS_RECORD definitions
|
||
// JBUGBUG: save only until Cliff (and any other NT file)
|
||
// can be converted, then dump
|
||
//
|
||
|
||
//
|
||
// Record data for specific types
|
||
//
|
||
|
||
typedef struct
|
||
{
|
||
IP_ADDRESS ipAddress;
|
||
}
|
||
DNS_A_DATA, *PDNS_A_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DNS_NAME nameHost;
|
||
}
|
||
DNS_PTR_DATA, *PDNS_PTR_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DNS_NAME namePrimaryServer;
|
||
DNS_NAME nameAdministrator;
|
||
DWORD dwSerialNo;
|
||
DWORD dwRefresh;
|
||
DWORD dwRetry;
|
||
DWORD dwExpire;
|
||
DWORD dwDefaultTtl;
|
||
}
|
||
DNS_SOA_DATA, *PDNS_SOA_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DNS_NAME nameMailbox;
|
||
DNS_NAME nameErrorsMailbox;
|
||
}
|
||
DNS_MINFO_DATA, *PDNS_MINFO_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DNS_NAME nameExchange;
|
||
WORD wPreference;
|
||
WORD Pad; // keep ptrs DWORD aligned
|
||
}
|
||
DNS_MX_DATA, *PDNS_MX_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwStringCount;
|
||
DNS_TEXT pStringArray[1];
|
||
}
|
||
DNS_TXT_DATA, *PDNS_TXT_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
// DWORD dwByteCount;
|
||
BYTE bData[1];
|
||
}
|
||
DNS_NULL_DATA, *PDNS_NULL_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
IP_ADDRESS ipAddress;
|
||
UCHAR chProtocol;
|
||
BYTE bBitMask[1];
|
||
}
|
||
DNS_WKS_DATA, *PDNS_WKS_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
IPV6_ADDRESS ipv6Address;
|
||
}
|
||
DNS_AAAA_DATA, *PDNS_AAAA_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DNS_NAME nameSigner;
|
||
WORD wTypeCovered;
|
||
BYTE chAlgorithm;
|
||
BYTE chLabelCount;
|
||
DWORD dwOriginalTtl;
|
||
DWORD dwExpiration;
|
||
DWORD dwTimeSigned;
|
||
WORD wKeyTag;
|
||
WORD Pad; // keep byte field aligned
|
||
BYTE Signature[1];
|
||
}
|
||
DNS_SIG_DATA, *PDNS_SIG_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;
|
||
|
||
typedef struct
|
||
{
|
||
DNS_NAME nameNext;
|
||
BYTE bTypeBitMap[1];
|
||
}
|
||
DNS_NXT_DATA, *PDNS_NXT_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DNS_NAME nameTarget;
|
||
WORD wPriority;
|
||
WORD wWeight;
|
||
WORD wPort;
|
||
WORD Pad; // keep ptrs DWORD aligned
|
||
}
|
||
DNS_SRV_DATA, *PDNS_SRV_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DNS_NAME nameAlgorithm;
|
||
PBYTE pAlgorithmPacket;
|
||
PBYTE pKey;
|
||
PBYTE pOtherData;
|
||
DWORD dwCreateTime;
|
||
DWORD dwExpireTime;
|
||
WORD wMode;
|
||
WORD wError;
|
||
WORD wKeyLength;
|
||
WORD wOtherLength;
|
||
UCHAR cAlgNameLength;
|
||
BOOLEAN fPacketPointers;
|
||
}
|
||
DNS_TKEY_DATA, *PDNS_TKEY_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DNS_NAME nameAlgorithm;
|
||
PBYTE pAlgorithmPacket;
|
||
PBYTE pSignature;
|
||
PBYTE pOtherData;
|
||
LONGLONG i64CreateTime;
|
||
WORD wFudgeTime;
|
||
WORD wOriginalID;
|
||
WORD wError;
|
||
WORD wSigLength;
|
||
WORD wOtherLength;
|
||
UCHAR cAlgNameLength;
|
||
BOOLEAN fPacketPointers;
|
||
}
|
||
DNS_TSIG_DATA, *PDNS_TSIG_DATA;
|
||
|
||
#define DNS_ATM_TYPE_E164 0x01 // E.164 addressing scheme
|
||
#define DNS_ATM_TYPE_NSAP 0x02 // NSAP-style addressing scheme
|
||
#define DNS_ATM_TYPE_AESA DNS_ATM_TYPE_NSAP
|
||
|
||
#define DNS_ATM_MAX_ADDR_SIZE 20
|
||
|
||
typedef struct
|
||
{
|
||
BYTE AddressType; // E.164 or NSAP-style ATM Endsystem Address
|
||
BYTE Address[1]; // IA5 digits for E164, BCD encoding for NSAP
|
||
// Array size is DNS_ATM_MAX_ADDR_SIZE for NSAP
|
||
// address type, and a null terminated string
|
||
// less than DNS_ATM_MAX_ADDR_SIZE characters
|
||
// for E164 address type.
|
||
}
|
||
DNS_ATMA_DATA, *PDNS_ATMA_DATA;
|
||
|
||
|
||
//
|
||
// MS only types -- only hit the wire in MS-MS zone transfer
|
||
//
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwMappingFlag;
|
||
DWORD dwLookupTimeout;
|
||
DWORD dwCacheTimeout;
|
||
DWORD cWinsServerCount;
|
||
IP_ADDRESS aipWinsServers[1];
|
||
}
|
||
DNS_WINS_DATA, *PDNS_WINS_DATA;
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwMappingFlag;
|
||
DWORD dwLookupTimeout;
|
||
DWORD dwCacheTimeout;
|
||
DNS_NAME nameResultDomain;
|
||
}
|
||
DNS_WINSR_DATA, *PDNS_WINSR_DATA;
|
||
|
||
|
||
//
|
||
// Length of non-fixed-length data types
|
||
//
|
||
|
||
#define DNS_TEXT_RECORD_LENGTH(StringCount) \
|
||
(sizeof(DWORD) + ((StringCount) * sizeof(PCHAR)))
|
||
|
||
#define DNS_NULL_RECORD_LENGTH(ByteCount) \
|
||
(sizeof(DWORD) + (ByteCount))
|
||
|
||
#define DNS_WKS_RECORD_LENGTH(ByteCount) \
|
||
(sizeof(DNS_WKS_DATA) + (ByteCount-1))
|
||
|
||
#define DNS_WINS_RECORD_LENGTH(IpCount) \
|
||
(sizeof(DNS_WINS_DATA) + ((IpCount-1) * sizeof(IP_ADDRESS)))
|
||
|
||
|
||
//
|
||
// Record flags
|
||
//
|
||
|
||
typedef struct _DnsRecordFlags
|
||
{
|
||
DWORD Section : 2;
|
||
DWORD Delete : 1;
|
||
DWORD Unused : 5;
|
||
|
||
DWORD Unused2 : 4;
|
||
DWORD FreeData : 1;
|
||
DWORD FreeOwner : 1;
|
||
DWORD Unicode : 1;
|
||
DWORD Multiple : 1;
|
||
|
||
DWORD Reserved : 16;
|
||
}
|
||
DNSREC_FLAGS;
|
||
|
||
|
||
//
|
||
// Record flags as bit flags
|
||
// These may be or'd together to set the fields
|
||
//
|
||
|
||
// RR Section in packet
|
||
|
||
#define DNSREC_SECTION (0x00000003)
|
||
|
||
#define DNSREC_QUESTION (0x00000000)
|
||
#define DNSREC_ANSWER (0x00000001)
|
||
#define DNSREC_AUTHORITY (0x00000002)
|
||
#define DNSREC_ADDITIONAL (0x00000003)
|
||
|
||
// RR Section in packet (update)
|
||
|
||
#define DNSREC_ZONE (0x00000000)
|
||
#define DNSREC_PREREQ (0x00000001)
|
||
#define DNSREC_UPDATE (0x00000002)
|
||
|
||
// Delete RR (update) or No-exist (prerequisite)
|
||
|
||
#define DNSREC_DELETE (0x00000004)
|
||
#define DNSREC_NOEXIST (0x00000004)
|
||
|
||
// Owner name is allocated and can be freed with record cleanup
|
||
|
||
#define DNSREC_FREEOWNER (0x00002000)
|
||
|
||
// UNICODE names in record
|
||
|
||
#define DNSREC_UNICODE (0x00004000)
|
||
|
||
// Multiple RR in this record buffer
|
||
// This optimization may be used with fixed types only
|
||
|
||
#define DNSREC_MULTIPLE (0x00008000)
|
||
|
||
|
||
//
|
||
// Record \ RR set structure
|
||
//
|
||
// Note: The dwReserved flag serves to insure that the substructures
|
||
// start on 64-bit boundaries. Since adding the LONGLONG to
|
||
// TSIG structure the compiler wants to start them there anyway
|
||
// (to 64-align). This insures that no matter what data fields
|
||
// are present we are properly 64-aligned.
|
||
//
|
||
// Do NOT pack this structure, as the substructures to be 64-aligned
|
||
// for Win64.
|
||
//
|
||
|
||
typedef struct _DnsRecord
|
||
{
|
||
struct _DnsRecord * pNext;
|
||
DNS_NAME nameOwner;
|
||
WORD wType;
|
||
WORD wDataLength;
|
||
union
|
||
{
|
||
DWORD W; // flags as dword
|
||
DNSREC_FLAGS S; // flags as structure
|
||
|
||
} Flags;
|
||
|
||
DWORD dwTtl;
|
||
DWORD dwReserved;
|
||
union
|
||
{
|
||
DNS_A_DATA A;
|
||
DNS_SOA_DATA SOA, Soa;
|
||
DNS_PTR_DATA PTR, Ptr,
|
||
NS, Ns,
|
||
CNAME, Cname,
|
||
MB, Mb,
|
||
MD, Md,
|
||
MF, Mf,
|
||
MG, Mg,
|
||
MR, Mr;
|
||
DNS_MINFO_DATA MINFO, Minfo,
|
||
RP, Rp;
|
||
DNS_MX_DATA MX, Mx,
|
||
AFSDB, Afsdb,
|
||
RT, Rt;
|
||
DNS_TXT_DATA HINFO, Hinfo,
|
||
ISDN, Isdn,
|
||
TXT, Txt,
|
||
X25;
|
||
DNS_NULL_DATA Null;
|
||
DNS_WKS_DATA WKS, Wks;
|
||
DNS_AAAA_DATA AAAA;
|
||
DNS_SRV_DATA SRV, Srv;
|
||
DNS_TKEY_DATA TKEY, Tkey;
|
||
DNS_TSIG_DATA TSIG, Tsig;
|
||
DNS_ATMA_DATA ATMA, Atma;
|
||
DNS_WINS_DATA WINS, Wins;
|
||
DNS_WINSR_DATA WINSR, WinsR, NBSTAT, Nbstat;
|
||
|
||
} Data;
|
||
}
|
||
DNS_RECORD, *PDNS_RECORD;
|
||
|
||
#endif // End of old DNS_RECORD definitions
|
||
|
||
|
||
#define DNS_RECORD_FIXED_SIZE FIELD_OFFSET( DNS_RECORD, Data )
|
||
#define SIZEOF_DNS_RECORD_HEADER DNS_RECORD_FIXED_SIZE
|
||
|
||
|
||
|
||
//
|
||
// Resource record set building
|
||
//
|
||
// pFirst points to first record in list.
|
||
// pLast points to last record in list.
|
||
//
|
||
|
||
typedef struct _DnsRRSet
|
||
{
|
||
PDNS_RECORD pFirstRR;
|
||
PDNS_RECORD pLastRR;
|
||
}
|
||
DNS_RRSET, *PDNS_RRSET;
|
||
|
||
|
||
//
|
||
// To init pFirst is NULL.
|
||
// But pLast points at the location of the pFirst pointer -- essentially
|
||
// treating the pFirst ptr as a DNS_RECORD. (It is a DNS_RECORD with
|
||
// only a pNext field, but that's the only part we use.)
|
||
//
|
||
// Then when the first record is added to the list, the pNext field of
|
||
// this dummy record (which corresponds to pFirst's value) is set to
|
||
// point at the first record. So pFirst then properly points at the
|
||
// first record.
|
||
//
|
||
// (This works only because pNext is the first field in a
|
||
// DNS_RECORD structure and hence casting a PDNS_RECORD ptr to
|
||
// PDNS_RECORD* and dereferencing yields its pNext field)
|
||
//
|
||
|
||
#define DNS_RRSET_INIT( rrset ) \
|
||
{ \
|
||
PDNS_RRSET _prrset = &(rrset); \
|
||
_prrset->pFirstRR = NULL; \
|
||
_prrset->pLastRR = (PDNS_RECORD) &_prrset->pFirstRR; \
|
||
}
|
||
|
||
#define DNS_RRSET_ADD( rrset, pnewRR ) \
|
||
{ \
|
||
PDNS_RRSET _prrset = &(rrset); \
|
||
PDNS_RECORD _prrnew = (pnewRR); \
|
||
_prrset->pLastRR->pNext = _prrnew; \
|
||
_prrset->pLastRR = _prrnew; \
|
||
}
|
||
|
||
|
||
//
|
||
// Record building (rralloc.c)
|
||
//
|
||
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsAllocateRecord(
|
||
IN WORD wBufferLength
|
||
);
|
||
|
||
VOID
|
||
WINAPI
|
||
DnsRecordListFree(
|
||
IN OUT PDNS_RECORD pRecord,
|
||
IN BOOL fFreeOwner
|
||
);
|
||
|
||
#define DnsFreeRRSet( pRRSet, fFreeOwner ) \
|
||
DnsRecordListFree( (pRRSet), (fFreeOwner) )
|
||
|
||
|
||
PDNS_RECORD
|
||
DnsRecordSetDetach(
|
||
IN OUT PDNS_RECORD pRR
|
||
);
|
||
|
||
PDNS_RECORD
|
||
DnsCreatePtrRecord(
|
||
IN IP_ADDRESS ipAddress,
|
||
IN DNS_NAME pszHostName,
|
||
IN BOOL fUnicodeName
|
||
);
|
||
|
||
|
||
//
|
||
// Record build from data strings (rrbuild.c)
|
||
//
|
||
|
||
PDNS_RECORD
|
||
DnsRecordBuild(
|
||
IN OUT PDNS_RRSET pRRSet,
|
||
IN LPSTR pszOwner,
|
||
IN WORD wType,
|
||
IN BOOL fAdd,
|
||
IN UCHAR Section,
|
||
IN INT Argc,
|
||
IN PCHAR * Argv
|
||
);
|
||
|
||
PDNS_RECORD
|
||
DnsRecordBuild_UTF8(
|
||
IN OUT PDNS_RRSET pRRSet,
|
||
IN LPSTR pszOwner,
|
||
IN WORD wType,
|
||
IN BOOL fAdd,
|
||
IN UCHAR Section,
|
||
IN INT Argc,
|
||
IN PCHAR * Argv
|
||
);
|
||
|
||
PDNS_RECORD
|
||
DnsRecordBuild_W(
|
||
IN OUT PDNS_RRSET pRRSet,
|
||
IN LPWSTR pszOwner,
|
||
IN WORD wType,
|
||
IN BOOL fAdd,
|
||
IN UCHAR Section,
|
||
IN INT Argc,
|
||
IN PWCHAR * Argv
|
||
);
|
||
|
||
|
||
//
|
||
// Record set manipulation
|
||
//
|
||
|
||
//
|
||
// Record Compare
|
||
//
|
||
// Note: these routines will NOT do proper unicode compare, unless
|
||
// records have the fUnicode flag set. Both input record lists
|
||
// must be either ANSI or UNICODE, but not one of each.
|
||
//
|
||
|
||
BOOL
|
||
WINAPI
|
||
DnsRecordCompare(
|
||
IN PDNS_RECORD pRecord1,
|
||
IN PDNS_RECORD pRecord2
|
||
);
|
||
|
||
BOOL
|
||
WINAPI
|
||
DnsRecordSetCompare(
|
||
IN OUT PDNS_RECORD pRR1,
|
||
IN OUT PDNS_RECORD pRR2,
|
||
OUT PDNS_RECORD * ppDiff1,
|
||
OUT PDNS_RECORD * ppDiff2
|
||
);
|
||
|
||
|
||
//
|
||
// DNS Name compare
|
||
//
|
||
|
||
BOOL
|
||
WINAPI
|
||
DnsNameCompare_A(
|
||
IN LPSTR pName1,
|
||
IN LPSTR pName2
|
||
);
|
||
|
||
BOOL
|
||
WINAPI
|
||
DnsNameCompare_W(
|
||
IN LPWSTR pName1,
|
||
IN LPWSTR pName2
|
||
);
|
||
|
||
//
|
||
// Record Copy
|
||
// Record copy functions also do conversion between character sets.
|
||
//
|
||
// Note, it might be advisable to directly expose non-Ex copy
|
||
// functions _W, _A for record and set, to avoid exposing the
|
||
// conversion enum.
|
||
//
|
||
|
||
typedef enum _DNS_CHARSET
|
||
{
|
||
DnsCharSetUnknown,
|
||
DnsCharSetUnicode,
|
||
DnsCharSetUtf8,
|
||
DnsCharSetAnsi,
|
||
}
|
||
DNS_CHARSET;
|
||
|
||
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsRecordCopyEx(
|
||
IN PDNS_RECORD pRecord,
|
||
IN DNS_CHARSET CharSetIn,
|
||
IN DNS_CHARSET CharSetOut
|
||
);
|
||
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsRecordSetCopyEx(
|
||
IN PDNS_RECORD pRecordSet,
|
||
IN DNS_CHARSET CharSetIn,
|
||
IN DNS_CHARSET CharSetOut
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsRecordCopy(pRR) \
|
||
DnsRecordCopyEx( (pRR), DnsCharSetUnicode, DnsCharSetUnicode )
|
||
#define DnsRecordSetCopy(pRR) \
|
||
DnsRecordSetCopyEx( (pRR), DnsCharSetUnicode, DnsCharSetUnicode )
|
||
#else
|
||
#define DnsRecordCopy(pRR) \
|
||
DnsRecordCopyEx( (pRR), DnsCharSetAnsi, DnsCharSetAnsi )
|
||
#define DnsRecordSetCopy(pRR) \
|
||
DnsRecordSetCopyEx( (pRR), DnsCharSetAnsi, DnsCharSetAnsi )
|
||
#endif
|
||
|
||
|
||
#if 0
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsRecordCopy(
|
||
IN PDNS_RECORD pRecord,
|
||
IN BOOL fUnicodeIn
|
||
);
|
||
|
||
PDNS_RECORD
|
||
DnsRecordSetCopy(
|
||
IN PDNS_RECORD pRR,
|
||
IN BOOL fUnicodeIn
|
||
);
|
||
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsRecordCopy_W(
|
||
IN PDNS_RECORD pRecord
|
||
);
|
||
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsRecordSetCopy_W(
|
||
IN PDNS_RECORD pRRSet
|
||
);
|
||
|
||
#endif
|
||
|
||
|
||
//
|
||
// Routines to copy and convert UNICODE records to other string type records
|
||
//
|
||
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsCopyUnicodeRecordToUnicodeRecord(
|
||
IN PDNS_RECORD pRecord
|
||
);
|
||
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsCopyUnicodeRecordToUtf8Record(
|
||
IN PDNS_RECORD pRecord
|
||
);
|
||
|
||
PDNS_RECORD
|
||
WINAPI
|
||
DnsCopyUnicodeRecordToAnsiRecord(
|
||
IN PDNS_RECORD pRecord
|
||
);
|
||
|
||
PDNS_RECORD
|
||
DnsCopyUnicodeRRSetToUnicodeRRSet(
|
||
IN PDNS_RECORD pRR
|
||
);
|
||
|
||
PDNS_RECORD
|
||
DnsCopyUnicodeRRSetToUtf8RRSet(
|
||
IN PDNS_RECORD pRR
|
||
);
|
||
|
||
PDNS_RECORD
|
||
DnsCopyUnicodeRRSetToAnsiRRSet(
|
||
IN PDNS_RECORD pRR
|
||
);
|
||
|
||
|
||
//
|
||
// DNS Update API
|
||
//
|
||
// NOTE:
|
||
//
|
||
// The DNS update API functions have new names to clearify their use.
|
||
// The new functions for various DNS update operations are:
|
||
//
|
||
// DnsAcquireContextHandle
|
||
// DnsReleaseContextHandle
|
||
// DnsAddRecords
|
||
// DnsAddRecordSet
|
||
// DnsModifyRecords
|
||
// DnsModifyRecordSet
|
||
// DnsRemoveRecords
|
||
// DnsReplaceRecordSet
|
||
// DnsUpdateTest
|
||
// DnsGetLastServerUpdateIP
|
||
//
|
||
// The old functions have been changed to macros so
|
||
// as not to break the build.
|
||
//
|
||
|
||
//
|
||
// Old DNS update function definitions
|
||
//
|
||
// Options for DnsModifyRRSet & DnsRegisterRRSet
|
||
//
|
||
|
||
//
|
||
// Update flags
|
||
//
|
||
|
||
//
|
||
// Old flags used for DnsModifyRRSet & DnsRegisterRRSet
|
||
//
|
||
#define DNS_UPDATE_UNIQUE 0x00000000
|
||
#define DNS_UPDATE_SHARED 0x00000001
|
||
|
||
//
|
||
// New flags used for:
|
||
// DnsModifyRecords
|
||
// DnsModifyRecordSet
|
||
// DnsAddRecords
|
||
// DnsAddRecordSet
|
||
// DnsRemoveRecords
|
||
// DnsReplaceRecordSet
|
||
//
|
||
|
||
#define DNS_UPDATE_SECURITY_USE_DEFAULT 0x00000000
|
||
#define DNS_UPDATE_SECURITY_OFF 0x00000010
|
||
#define DNS_UPDATE_SECURITY_ON 0x00000020
|
||
#define DNS_UPDATE_SECURITY_ONLY 0x00000100
|
||
#define DNS_UPDATE_CACHE_SECURITY_CONTEXT 0x00000200
|
||
#define DNS_UPDATE_TEST_USE_LOCAL_SYS_ACCT 0x00000400
|
||
#define DNS_UPDATE_FORCE_SECURITY_NEGO 0x00000800
|
||
#define DNS_UPDATE_RESERVED 0xfffff000
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAcquireContextHandle_W(
|
||
IN DWORD CredentialFlags,
|
||
IN PVOID Credentials OPTIONAL, // Actually this will be a
|
||
// PSEC_WINNT_AUTH_IDENTITY_W,
|
||
// calling this a PVOID to avoid
|
||
// having to include rpcdce.h
|
||
OUT HANDLE * ContextHandle
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAcquireContextHandle_A(
|
||
IN DWORD CredentialFlags,
|
||
IN PVOID Credentials OPTIONAL, // Actually this will be a
|
||
// PSEC_WINNT_AUTH_IDENTITY_A,
|
||
// calling this a PVOID to avoid
|
||
// having to include rpcdce.h
|
||
OUT HANDLE * ContextHandle
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsAcquireContextHandle DnsAcquireContextHandle_W
|
||
#else
|
||
#define DnsAcquireContextHandle DnsAcquireContextHandle_A
|
||
#endif
|
||
|
||
|
||
VOID
|
||
WINAPI
|
||
DnsReleaseContextHandle(
|
||
IN HANDLE ContextHandle
|
||
);
|
||
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsModifyRecords_A(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pCurrentSet,
|
||
IN PDNS_RECORD pNewSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsModifyRecords_UTF8(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pCurrentSet,
|
||
IN PDNS_RECORD pNewSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsModifyRecords_W(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pCurrentSet,
|
||
IN PDNS_RECORD pNewSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsModifyRecords DnsModifyRecords_W
|
||
#else
|
||
#define DnsModifyRecords DnsModifyRecords_A
|
||
#endif
|
||
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsModifyRecordSet_A(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pCurrentSet,
|
||
IN PDNS_RECORD pNewSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsModifyRecordSet_UTF8(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pCurrentSet,
|
||
IN PDNS_RECORD pNewSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsModifyRecordSet_W(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pCurrentSet,
|
||
IN PDNS_RECORD pNewSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsModifyRecordSet DnsModifyRecordSet_W
|
||
#else
|
||
#define DnsModifyRecordSet DnsModifyRecordSet_A
|
||
#endif
|
||
|
||
|
||
#define DnsModifyRRSet_A( _pCSet, \
|
||
_pNSet, \
|
||
_Options, \
|
||
_Servers ) \
|
||
( _Options & DNS_UPDATE_SHARED ) ? \
|
||
DnsModifyRecords_A( NULL, \
|
||
( _pCSet ), \
|
||
( _pNSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) ) \
|
||
: \
|
||
DnsModifyRecordSet_A( NULL, \
|
||
( _pCSet ), \
|
||
( _pNSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
|
||
#define DnsModifyRRSet_W( _pCSet, \
|
||
_pNSet, \
|
||
_Options, \
|
||
_Servers ) \
|
||
( _Options & DNS_UPDATE_SHARED ) ? \
|
||
DnsModifyRecords_W( NULL, \
|
||
( _pCSet ), \
|
||
( _pNSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) ) \
|
||
: \
|
||
DnsModifyRecordSet_W( NULL, \
|
||
( _pCSet ), \
|
||
( _pNSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
|
||
#ifdef UNICODE
|
||
#define DnsModifyRRSet( _pCSet, \
|
||
_pNSet, \
|
||
_Options, \
|
||
_Servers ) \
|
||
( _Options & DNS_UPDATE_SHARED ) ? \
|
||
DnsModifyRecords_W( NULL, \
|
||
( _pCSet ), \
|
||
( _pNSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) ) \
|
||
: \
|
||
DnsModifyRecordSet_W( NULL, \
|
||
( _pCSet ), \
|
||
( _pNSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
#else
|
||
#define DnsModifyRRSet( _pCSet, \
|
||
_pNSet, \
|
||
_Options, \
|
||
_Servers ) \
|
||
( _Options & DNS_UPDATE_SHARED ) ? \
|
||
DnsModifyRecords_A( NULL, \
|
||
( _pCSet ), \
|
||
( _pNSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) ) \
|
||
: \
|
||
DnsModifyRecordSet_A( NULL, \
|
||
( _pCSet ), \
|
||
( _pNSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
#endif
|
||
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAddRecords_A(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pRRSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAddRecords_UTF8(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pRRSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAddRecords_W(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pRRSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsAddRecords DnsAddRecords_W
|
||
#else
|
||
#define DnsAddRecords DnsAddRecords_A
|
||
#endif
|
||
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAddRecordSet_A(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pRRSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAddRecordSet_UTF8(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pRRSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAddRecordSet_W(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pRRSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsAddRecordSet DnsAddRecordSet_W
|
||
#else
|
||
#define DnsAddRecordSet DnsAddRecordSet_A
|
||
#endif
|
||
|
||
|
||
#define DnsRegisterRRSet_A( _pRSet, \
|
||
_Options, \
|
||
_Servers ) \
|
||
( _Options & DNS_UPDATE_SHARED ) ? \
|
||
DnsAddRecords_A( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) ) \
|
||
: \
|
||
DnsAddRecordSet_A( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
|
||
#define DnsRegisterRRSet_W( _pRSet, \
|
||
_Options, \
|
||
_Servers ) \
|
||
( _Options & DNS_UPDATE_SHARED ) ? \
|
||
DnsAddRecords_W( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) ) \
|
||
: \
|
||
DnsAddRecordSet_W( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
|
||
#ifdef UNICODE
|
||
#define DnsRegisterRRSet( _pRSet, \
|
||
_Options, \
|
||
_Servers ) \
|
||
( _Options & DNS_UPDATE_SHARED ) ? \
|
||
DnsAddRecords_W( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) ) \
|
||
: \
|
||
DnsAddRecordSet_W( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
#else
|
||
#define DnsRegisterRRSet( _pRSet, \
|
||
_Options, \
|
||
_Servers ) \
|
||
( _Options & DNS_UPDATE_SHARED ) ? \
|
||
DnsAddRecords_A( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) ) \
|
||
: \
|
||
DnsAddRecordSet_A( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
#endif
|
||
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsRemoveRecords_A(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pRRSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsRemoveRecords_UTF8(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pRRSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsRemoveRecords_W(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pRRSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsRemoveRecords DnsRemoveRecords_W
|
||
#else
|
||
#define DnsRemoveRecords DnsRemoveRecords_A
|
||
#endif
|
||
|
||
|
||
#define DnsRemoveRRSet_A( _pRSet, \
|
||
_Servers ) \
|
||
DnsRemoveRecords_A( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
|
||
#define DnsRemoveRRSet_W( _pRSet, \
|
||
_Servers ) \
|
||
DnsRemoveRecords_W( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
|
||
#ifdef UNICODE
|
||
#define DnsRemoveRRSet( _pRSet, \
|
||
_Servers ) \
|
||
DnsRemoveRecords_W( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
#else
|
||
#define DnsRemoveRRSet( _pRSet, \
|
||
_Servers ) \
|
||
DnsRemoveRecords_A( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
#endif
|
||
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsReplaceRecordSet_A(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pRRSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsReplaceRecordSet_UTF8(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pRRSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsReplaceRecordSet_W(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN PDNS_RECORD pRRSet,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsReplaceRecordSet DnsReplaceRecordSet_W
|
||
#else
|
||
#define DnsReplaceRecordSet DnsReplaceRecordSet_A
|
||
#endif
|
||
|
||
|
||
#define DnsReplaceRRSet_A( _pRSet, \
|
||
_Servers ) \
|
||
DnsReplaceRecordSet_A( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
|
||
#define DnsReplaceRRSet_W( _pRSet, \
|
||
_Servers ) \
|
||
DnsReplaceRecordSet_W( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
|
||
#ifdef UNICODE
|
||
#define DnsReplaceRRSet( _pRSet, \
|
||
_Servers ) \
|
||
DnsReplaceRecordSet_W( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
#else
|
||
#define DnsReplaceRRSet( _pRSet, \
|
||
_Servers ) \
|
||
DnsReplaceRecordSet_A( NULL, \
|
||
( _pRSet ), \
|
||
DNS_UPDATE_SECURITY_USE_DEFAULT, \
|
||
( _Servers ) )
|
||
#endif
|
||
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsUpdateTest_A(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN LPSTR pszName,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsUpdateTest_UTF8(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN LPSTR pszName,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsUpdateTest_W(
|
||
IN HANDLE hContextHandle OPTIONAL,
|
||
IN LPWSTR pszName,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsUpdateTest DnsUpdateTest_W
|
||
#else
|
||
#define DnsUpdateTest DnsUpdateTest_A
|
||
#endif
|
||
|
||
|
||
IP_ADDRESS
|
||
WINAPI
|
||
DnsGetLastServerUpdateIP (
|
||
VOID
|
||
);
|
||
|
||
|
||
|
||
//
|
||
// DNS Query API
|
||
//
|
||
|
||
//
|
||
// Options for DnsQuery
|
||
//
|
||
|
||
#define DNS_QUERY_STANDARD 0x00000000
|
||
#define DNS_QUERY_ACCEPT_PARTIAL_UDP 0x00000001
|
||
#define DNS_QUERY_USE_TCP_ONLY 0x00000002
|
||
#define DNS_QUERY_NO_RECURSION 0x00000004
|
||
#define DNS_QUERY_BYPASS_CACHE 0x00000008
|
||
#define DNS_QUERY_CACHE_ONLY 0x00000010
|
||
#define DNS_QUERY_SOCKET_KEEPALIVE 0x00000100
|
||
#define DNS_QUERY_TREAT_AS_FQDN 0x00001000
|
||
#define DNS_QUERY_ALLOW_EMPTY_AUTH_RESP 0x00010000
|
||
#define DNS_QUERY_RESERVED 0xfff00000
|
||
|
||
#define DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE DNS_QUERY_ACCEPT_PARTIAL_UDP
|
||
|
||
|
||
DNS_STATUS WINAPI
|
||
DnsQuery_A(
|
||
IN LPSTR lpstrName,
|
||
IN WORD wType,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL,
|
||
IN OUT PDNS_RECORD * ppQueryResultsSet OPTIONAL,
|
||
IN OUT PVOID * pReserved OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS WINAPI
|
||
DnsQuery_UTF8(
|
||
IN LPSTR lpstrName,
|
||
IN WORD wType,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL,
|
||
IN OUT PDNS_RECORD * ppQueryResultsSet OPTIONAL,
|
||
IN OUT PVOID * pReserved OPTIONAL
|
||
);
|
||
|
||
DNS_STATUS WINAPI
|
||
DnsQuery_W(
|
||
IN LPWSTR lpstrName,
|
||
IN WORD wType,
|
||
IN DWORD fOptions,
|
||
IN PIP_ARRAY aipServers OPTIONAL,
|
||
IN OUT PDNS_RECORD * ppQueryResultsSet OPTIONAL,
|
||
IN OUT PVOID * pReserved OPTIONAL
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsQuery DnsQuery_W
|
||
#else
|
||
#define DnsQuery DnsQuery_A
|
||
#endif
|
||
|
||
|
||
//
|
||
// Options for DnsCheckNameCollision
|
||
//
|
||
|
||
#define DNS_CHECK_AGAINST_HOST_ANY 0x00000000
|
||
#define DNS_CHECK_AGAINST_HOST_ADDRESS 0x00000001
|
||
#define DNS_CHECK_AGAINST_HOST_DOMAIN_NAME 0x00000002
|
||
|
||
|
||
DNS_STATUS WINAPI
|
||
DnsCheckNameCollision_A (
|
||
IN LPSTR pszName,
|
||
IN DWORD fOptions
|
||
);
|
||
|
||
DNS_STATUS WINAPI
|
||
DnsCheckNameCollision_UTF8 (
|
||
IN LPSTR pszName,
|
||
IN DWORD fOptions
|
||
);
|
||
|
||
DNS_STATUS WINAPI
|
||
DnsCheckNameCollision_W (
|
||
IN LPWSTR pszName,
|
||
IN DWORD fOptions
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsDnsCheckNameCollision DnsCheckNameCollision_W
|
||
#else
|
||
#define DnsDnsCheckNameCollision DnsCheckNameCollision_A
|
||
#endif
|
||
|
||
|
||
LPSTR WINAPI
|
||
DnsGetHostName_A(
|
||
VOID
|
||
);
|
||
|
||
LPSTR WINAPI
|
||
DnsGetHostName_UTF8(
|
||
VOID
|
||
);
|
||
|
||
LPWSTR WINAPI
|
||
DnsGetHostName_W(
|
||
VOID
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsGetHostName DnsGetHostName_W
|
||
#else
|
||
#define DnsGetHostName DnsGetHostName_A
|
||
#endif
|
||
|
||
|
||
LPSTR WINAPI
|
||
DnsGetPrimaryDomainName_A(
|
||
VOID
|
||
);
|
||
|
||
LPSTR WINAPI
|
||
DnsGetPrimaryDomainName_UTF8(
|
||
VOID
|
||
);
|
||
|
||
LPWSTR WINAPI
|
||
DnsGetPrimaryDomainName_W(
|
||
VOID
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsGetPrimaryDomainName DnsGetPrimaryDomainName_W
|
||
#else
|
||
#define DnsGetPrimaryDomainName DnsGetPrimaryDomainName_A
|
||
#endif
|
||
|
||
|
||
|
||
//
|
||
// DNS Update API for DHCP client
|
||
//
|
||
|
||
typedef struct _REGISTER_HOST_ENTRY
|
||
{
|
||
union
|
||
{
|
||
IP_ADDRESS ipAddr;
|
||
IPV6_ADDRESS ipV6Addr;
|
||
} Addr;
|
||
DWORD dwOptions;
|
||
}
|
||
REGISTER_HOST_ENTRY, *PREGISTER_HOST_ENTRY;
|
||
|
||
//
|
||
// Options for above
|
||
//
|
||
|
||
#define REGISTER_HOST_A 0x00000001
|
||
#define REGISTER_HOST_PTR 0x00000002 // Used by DHCP server
|
||
#define REGISTER_HOST_TRANSIENT 0x00000004 // Don't use, use DYNDNS_REG_RAS
|
||
#define REGISTER_HOST_AAAA 0x00000008
|
||
#define REGISTER_HOST_RESERVED 0x80000000 // Not used
|
||
|
||
#define DYNDNS_REG_FWD 0x0
|
||
#define DYNDNS_REG_PTR 0x8
|
||
#define DYNDNS_REG_RAS 0x10
|
||
#define DYNDNS_DEL_ENTRY 0x20
|
||
|
||
|
||
typedef struct _REGISTER_HOST_STATUS
|
||
{
|
||
HANDLE hDoneEvent;
|
||
DWORD dwStatus;
|
||
}
|
||
REGISTER_HOST_STATUS, *PREGISTER_HOST_STATUS;
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAsyncRegisterInit(
|
||
LPSTR lpstrRootRegKey
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAsyncRegisterTerm(
|
||
VOID
|
||
);
|
||
|
||
DNS_STATUS WINAPI
|
||
DnsRemoveRegistrations(
|
||
VOID
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAsyncRegisterHostAddrs_W(
|
||
IN LPWSTR lpstrAdapterName,
|
||
IN LPWSTR lpstrHostName,
|
||
IN PREGISTER_HOST_ENTRY pHostAddrs,
|
||
IN DWORD dwHostAddrCount,
|
||
IN PIP_ADDRESS pipDnsServerList,
|
||
IN DWORD dwDnsServerCount,
|
||
IN LPWSTR lpstrDomainName,
|
||
IN PREGISTER_HOST_STATUS pRegisterStatus,
|
||
IN DWORD dwTTL,
|
||
IN DWORD dwFlags
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAsyncRegisterHostAddrs_UTF8(
|
||
IN LPSTR lpstrAdapterName,
|
||
IN LPSTR lpstrHostName,
|
||
IN PREGISTER_HOST_ENTRY pHostAddrs,
|
||
IN DWORD dwHostAddrCount,
|
||
IN PIP_ADDRESS pipDnsServerList,
|
||
IN DWORD dwDnsServerCount,
|
||
IN LPSTR lpstrDomainName,
|
||
IN PREGISTER_HOST_STATUS pRegisterStatus,
|
||
IN DWORD dwTTL,
|
||
IN DWORD dwFlags
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsAsyncRegisterHostAddrs_A(
|
||
IN LPSTR lpstrAdapterName,
|
||
IN LPSTR lpstrHostName,
|
||
IN PREGISTER_HOST_ENTRY pHostAddrs,
|
||
IN DWORD dwHostAddrCount,
|
||
IN PIP_ADDRESS pipDnsServerList,
|
||
IN DWORD dwDnsServerCount,
|
||
IN LPSTR lpstrDomainName,
|
||
IN PREGISTER_HOST_STATUS pRegisterStatus,
|
||
IN DWORD dwTTL,
|
||
IN DWORD dwFlags
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsAsyncRegisterHostAddrs DnsAsyncRegisterHostAddrs_W
|
||
#else
|
||
#define DnsAsyncRegisterHostAddrs DnsAsyncRegisterHostAddrs_A
|
||
#endif
|
||
|
||
|
||
//
|
||
// DNS Update API for DHCP server.
|
||
//
|
||
|
||
//
|
||
// Call back function. DHCP Server will pass a function to
|
||
// DnsDhcpRegisterHostName and this will be called on successful
|
||
// or unsuccessful completion of the task
|
||
// If we have a condition like server down/try again later etc we
|
||
// won't respond until we have an authoritative answer.
|
||
//
|
||
|
||
typedef VOID(*DHCP_CALLBACK_FN)(DWORD dwStatus, LPVOID pvData);
|
||
|
||
//
|
||
// Callback return codes
|
||
//
|
||
|
||
#define DNSDHCP_SUCCESS 0x0
|
||
#define DNSDHCP_FWD_FAILED 0x1
|
||
#define DNSDHCP_SUPERCEDED 0x2
|
||
|
||
#define DNSDHCP_FAILURE (DWORD)-1 //reverse failed
|
||
|
||
#define DYNDNS_DELETE_ENTRY 0x1
|
||
#define DYNDNS_ADD_ENTRY 0x2
|
||
#define DYNDNS_REG_FORWARD 0x4
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsDhcpSrvRegisterInit(
|
||
VOID
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsDhcpSrvRegisterTerm(
|
||
VOID
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsDhcpSrvRegisterHostName_A(
|
||
IN REGISTER_HOST_ENTRY HostAddr,
|
||
IN LPSTR pszName,
|
||
IN DWORD dwTTL,
|
||
IN DWORD dwFlags,
|
||
IN DHCP_CALLBACK_FN pfnDhcpCallBack,
|
||
IN PVOID pvData,
|
||
IN PIP_ADDRESS pipDnsServerList OPTIONAL,
|
||
IN DWORD dwDnsServerCount
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsDhcpSrvRegisterHostName_UTF8(
|
||
IN REGISTER_HOST_ENTRY HostAddr,
|
||
IN LPSTR pszName,
|
||
IN DWORD dwTTL,
|
||
IN DWORD dwFlags,
|
||
IN DHCP_CALLBACK_FN pfnDhcpCallBack,
|
||
IN PVOID pvData,
|
||
IN PIP_ADDRESS pipDnsServerList OPTIONAL,
|
||
IN DWORD dwDnsServerCount
|
||
);
|
||
|
||
DNS_STATUS
|
||
WINAPI
|
||
DnsDhcpSrvRegisterHostName_W(
|
||
IN REGISTER_HOST_ENTRY HostAddr,
|
||
IN LPWSTR pszName,
|
||
IN DWORD dwTTL,
|
||
IN DWORD dwFlags,
|
||
IN DHCP_CALLBACK_FN pfnDhcpCallBack,
|
||
IN PVOID pvData,
|
||
IN PIP_ADDRESS pipDnsServerList OPTIONAL,
|
||
IN DWORD dwDnsServerCount
|
||
);
|
||
|
||
#define DnsDhcpSrvRegisterHostName DnsDhcpSrvRegisterHostName_A
|
||
|
||
#define RETRY_TIME_SERVER_FAILURE 5*60 // 5 minutes
|
||
#define RETRY_TIME_TRY_AGAIN_LATER 5*60 // 5 minutes
|
||
#define RETRY_TIME_TIMEOUT 5*60 // 5 minutes
|
||
|
||
#define RETRY_TIME_MAX 10*60 // back off to 10 mins if
|
||
// repeated failures occur
|
||
|
||
|
||
|
||
|
||
//
|
||
// Memory allocation
|
||
//
|
||
// Many dnsapi.dll routines allocate memory.
|
||
// This memory allocation defaults to routines that use:
|
||
// - LocalAlloc,
|
||
// - LocalReAlloc,
|
||
// - LocalFree.
|
||
// If you desire alternative memory allocation mechanisms, use this
|
||
// function to override the DNS API defaults. All memory returned by dnsapi.dll
|
||
// can then be freed with the specified free function.
|
||
//
|
||
|
||
typedef PVOID (* DNS_ALLOC_FUNCTION)();
|
||
typedef PVOID (* DNS_REALLOC_FUNCTION)();
|
||
typedef VOID (* DNS_FREE_FUNCTION)();
|
||
|
||
VOID
|
||
DnsApiHeapReset(
|
||
IN DNS_ALLOC_FUNCTION pAlloc,
|
||
IN DNS_REALLOC_FUNCTION pRealloc,
|
||
IN DNS_FREE_FUNCTION pFree
|
||
);
|
||
|
||
//
|
||
// Modules using DNSAPI memory should use these routines if
|
||
// they are capable of being called by a process that resets
|
||
// the dnsapi.dll heap. (Example: the DNS server.)
|
||
//
|
||
|
||
PVOID
|
||
DnsApiAlloc(
|
||
IN INT iSize
|
||
);
|
||
|
||
PVOID
|
||
DnsApiRealloc(
|
||
IN OUT PVOID pMem,
|
||
IN INT iSize
|
||
);
|
||
|
||
VOID
|
||
DnsApiFree(
|
||
IN OUT PVOID pMem
|
||
);
|
||
|
||
|
||
//
|
||
// String utilities (string.c)
|
||
//
|
||
// Note some of these require memory allocation, see note
|
||
// on memory allocation below.
|
||
//
|
||
|
||
#define DNS_ALLOW_RFC_NAMES_ONLY (0)
|
||
#define DNS_ALLOW_NONRFC_NAMES (0x00000001)
|
||
#define DNS_ALLOW_MULTIBYTE_NAMES (0x00000002)
|
||
#define DNS_ALLOW_ALL_NAMES (0x00000003)
|
||
|
||
|
||
LPSTR
|
||
DnsCreateStringCopy(
|
||
IN PCHAR pchString,
|
||
IN DWORD cchString
|
||
);
|
||
|
||
DWORD
|
||
DnsGetBufferLengthForStringCopy(
|
||
IN PCHAR pchString,
|
||
IN DWORD cchString,
|
||
IN BOOL fUnicodeIn,
|
||
IN BOOL fUnicodeOut
|
||
);
|
||
|
||
PVOID
|
||
DnsCopyStringEx(
|
||
OUT PBYTE pBuffer,
|
||
IN PCHAR pchString,
|
||
IN DWORD cchString,
|
||
IN BOOL fUnicodeIn,
|
||
IN BOOL fUnicodeOut
|
||
);
|
||
|
||
PVOID
|
||
DnsStringCopyAllocateEx(
|
||
IN PCHAR pchString,
|
||
IN DWORD cchString,
|
||
IN BOOL fUnicodeIn,
|
||
IN BOOL fUnicodeOut
|
||
);
|
||
|
||
PCHAR
|
||
DnsWriteReverseNameStringForIpAddress(
|
||
OUT PCHAR pBuffer,
|
||
IN IP_ADDRESS ipAddress
|
||
);
|
||
|
||
PCHAR
|
||
DnsCreateReverseNameStringForIpAddress(
|
||
IN IP_ADDRESS ipAddress
|
||
);
|
||
|
||
|
||
|
||
//
|
||
// Name validation
|
||
//
|
||
|
||
typedef enum _DNS_NAME_FORMAT
|
||
{
|
||
DnsNameDomain,
|
||
DnsNameDomainLabel,
|
||
DnsNameHostnameFull,
|
||
DnsNameHostnameLabel,
|
||
DnsNameWildcard,
|
||
DnsNameSrvRecord
|
||
}
|
||
DNS_NAME_FORMAT;
|
||
|
||
|
||
DNS_STATUS
|
||
DnsValidateName_UTF8(
|
||
IN LPCSTR pszName,
|
||
IN DNS_NAME_FORMAT Format
|
||
);
|
||
|
||
DNS_STATUS
|
||
DnsValidateName_W(
|
||
IN LPCWSTR pwszName,
|
||
IN DNS_NAME_FORMAT Format
|
||
);
|
||
|
||
DNS_STATUS
|
||
DnsValidateName_A(
|
||
IN LPCSTR pszName,
|
||
IN DNS_NAME_FORMAT Format
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsValidateName(p,f) DnsValidateName_W( (p), (f) )
|
||
#else
|
||
#define DnsValidateName(p,f) DnsValidateName_A( (p), (f) )
|
||
#endif
|
||
|
||
|
||
//
|
||
// Macro away old routines
|
||
//
|
||
|
||
#define DnsValidateDnsName_UTF8(pname) \
|
||
DnsValidateName_UTF8( (pname), DnsNameDomain )
|
||
|
||
#define DnsValidateDnsName_W(pname) \
|
||
DnsValidateName_W( (pname), DnsNameDomain )
|
||
|
||
|
||
//
|
||
// Relational name compare result
|
||
//
|
||
typedef enum
|
||
{
|
||
DNS_RELATE_NEQ, // NOT EQUAL: name's in different name space.
|
||
DNS_RELATE_EQL, // EQUAL: name's are identical DNS names
|
||
DNS_RELATE_LGT, // LEFT GREATER THAN: left name is parent (contains) to right name
|
||
DNS_RELATE_RGT, // RIGHT GREATER THAN: right name is parent (contains) to left name
|
||
DNS_RELATE_INVALID // INVALID STATE: accompanied with DNS_STATUS return code
|
||
} DNS_RELATE_STATUS, *PDNS_RELATE_STATUS;
|
||
|
||
DNS_STATUS
|
||
DnsRelationalCompare_UTF8(
|
||
IN LPCSTR pszLeftName,
|
||
IN LPCSTR pszRightName,
|
||
IN DWORD dwReserved,
|
||
IN OUT DNS_RELATE_STATUS *pRelation
|
||
);
|
||
|
||
DNS_STATUS
|
||
DnsRelationalCompare_W(
|
||
IN LPCWSTR pszLeftName,
|
||
IN LPCWSTR pszRightName,
|
||
IN DWORD dwReserved,
|
||
IN OUT DNS_RELATE_STATUS *pRelation
|
||
);
|
||
|
||
DNS_STATUS
|
||
DnsValidateDnsString_UTF8(
|
||
IN LPCSTR pszName
|
||
);
|
||
|
||
DNS_STATUS
|
||
DnsValidateDnsString_W(
|
||
IN LPCWSTR pszName
|
||
);
|
||
|
||
LPSTR
|
||
DnsCreateStandardDnsNameCopy(
|
||
IN PCHAR pchName,
|
||
IN DWORD cchName,
|
||
IN DWORD dwFlag
|
||
);
|
||
|
||
DWORD
|
||
DnsDowncaseDnsNameLabel(
|
||
OUT PCHAR pchResult,
|
||
IN PCHAR pchLabel,
|
||
IN DWORD cchLabel,
|
||
IN DWORD dwFlags
|
||
);
|
||
|
||
DWORD
|
||
_fastcall
|
||
DnsUnicodeToUtf8(
|
||
IN PWCHAR pwUnicode,
|
||
IN DWORD cchUnicode,
|
||
OUT PCHAR pchResult,
|
||
IN DWORD cchResult
|
||
);
|
||
|
||
DWORD
|
||
_fastcall
|
||
DnsUtf8ToUnicode(
|
||
IN PCHAR pchUtf8,
|
||
IN DWORD cchUtf8,
|
||
OUT PWCHAR pwResult,
|
||
IN DWORD cwResult
|
||
);
|
||
|
||
DNS_STATUS
|
||
DnsValidateUtf8Byte(
|
||
IN BYTE chUtf8,
|
||
IN OUT PDWORD pdwTrailCount
|
||
);
|
||
|
||
|
||
//
|
||
// Routines for NT services to call to get a Service Control Manager
|
||
// control message, (i.e. SERVICE_CONTROL_PARAMCHANGE - 0x00000006, etc.), in
|
||
// the event of a PnP change that affects DNS related data.
|
||
//
|
||
|
||
BOOL WINAPI
|
||
DnsServiceNotificationRegister_W (
|
||
IN LPWSTR pszServiceName,
|
||
IN DWORD dwControl
|
||
);
|
||
|
||
BOOL WINAPI
|
||
DnsServiceNotificationRegister_UTF8 (
|
||
IN LPSTR pszServiceName,
|
||
IN DWORD dwControl
|
||
);
|
||
|
||
BOOL WINAPI
|
||
DnsServiceNotificationRegister_A (
|
||
IN LPSTR pszServiceName,
|
||
IN DWORD dwControl
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsServiceNotificationRegister DnsServiceNotificationRegister_W
|
||
#else
|
||
#define DnsServiceNotificationRegister DnsServiceNotificationRegister_A
|
||
#endif
|
||
|
||
BOOL WINAPI
|
||
DnsServiceNotificationDeregister_W (
|
||
IN LPWSTR pszServiceName
|
||
);
|
||
|
||
BOOL WINAPI
|
||
DnsServiceNotificationDeregister_UTF8 (
|
||
IN LPSTR pszServiceName
|
||
);
|
||
|
||
BOOL WINAPI
|
||
DnsServiceNotificationDeregister_A (
|
||
IN LPSTR pszServiceName
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsServiceNotificationDeregister DnsServiceNotificationDeregister_W
|
||
#else
|
||
#define DnsServiceNotificationDeregister DnsServiceNotificationDeregister_A
|
||
#endif
|
||
|
||
|
||
//
|
||
// Routines to clear all cached entries in the DNS Resolver Cache, this is
|
||
// called by ipconfig /flushdns, and add record sets to the cache.
|
||
//
|
||
|
||
BOOL WINAPI
|
||
DnsFlushResolverCache (
|
||
VOID
|
||
);
|
||
|
||
BOOL WINAPI
|
||
DnsFlushResolverCacheEntry_W (
|
||
IN LPWSTR pszName
|
||
);
|
||
|
||
BOOL WINAPI
|
||
DnsFlushResolverCacheEntry_UTF8 (
|
||
IN LPSTR pszName
|
||
);
|
||
|
||
BOOL WINAPI
|
||
DnsFlushResolverCacheEntry_A (
|
||
IN LPSTR pszName
|
||
);
|
||
|
||
#ifdef UNICODE
|
||
#define DnsFlushResolverCacheEntry DnsFlushResolverCacheEntry_W
|
||
#else
|
||
#define DnsFlushResolverCacheEntry DnsFlushResolverCacheEntry_A
|
||
#endif
|
||
|
||
|
||
DNS_STATUS WINAPI
|
||
DnsCacheRecordSet_W(
|
||
IN LPWSTR lpstrName,
|
||
IN WORD wType,
|
||
IN DWORD fOptions,
|
||
IN OUT PDNS_RECORD pRRSet
|
||
);
|
||
|
||
|
||
//
|
||
// Routines to enable or disable B-Node resolver service listening thread
|
||
//
|
||
|
||
VOID WINAPI
|
||
DnsEnableBNodeResolverThread (
|
||
VOID
|
||
);
|
||
|
||
VOID WINAPI
|
||
DnsDisableBNodeResolverThread (
|
||
VOID
|
||
);
|
||
|
||
|
||
//
|
||
// Routines to enable or disable dynamic DNS registrations on local machine
|
||
//
|
||
|
||
VOID WINAPI
|
||
DnsEnableDynamicRegistration (
|
||
LPWSTR szAdapterName OPTIONAL // If NULL, enables DDNS in general
|
||
);
|
||
|
||
VOID WINAPI
|
||
DnsDisableDynamicRegistration (
|
||
LPWSTR szAdapterName OPTIONAL // If NULL, disables DDNS in general
|
||
);
|
||
|
||
BOOL
|
||
DnsIsDynamicRegistrationEnabled (
|
||
LPWSTR szAdapterName OPTIONAL // If NULL, tells whether system has
|
||
); // DDNS enabled.
|
||
|
||
|
||
//
|
||
// Routines to enable or disable dynamic DNS registration of a given
|
||
// adapter's domain name on the local machine
|
||
//
|
||
|
||
VOID WINAPI
|
||
DnsEnableAdapterDomainNameRegistration (
|
||
LPWSTR szAdapterName
|
||
);
|
||
|
||
VOID WINAPI
|
||
DnsDisableAdapterDomainNameRegistration (
|
||
LPWSTR szAdapterName
|
||
);
|
||
|
||
BOOL
|
||
DnsIsAdapterDomainNameRegistrationEnabled (
|
||
LPWSTR szAdapterName
|
||
);
|
||
|
||
|
||
//
|
||
// Routines to write a DNS Query packet request question in a buffer and
|
||
// convert response packet buffer to DNS_RECORD structure list.
|
||
//
|
||
|
||
typedef struct _DNS_MESSAGE_BUFFER
|
||
{
|
||
DNS_HEADER MessageHead;
|
||
CHAR MessageBody[1];
|
||
}
|
||
DNS_MESSAGE_BUFFER, *PDNS_MESSAGE_BUFFER;
|
||
|
||
BOOL WINAPI
|
||
DnsWriteQuestionToBuffer_W (
|
||
IN OUT PDNS_MESSAGE_BUFFER pDnsBuffer,
|
||
IN OUT LPDWORD pdwBufferSize,
|
||
IN LPWSTR pszName,
|
||
IN WORD wType,
|
||
IN WORD Xid,
|
||
IN BOOL fRecursionDesired
|
||
);
|
||
|
||
BOOL WINAPI
|
||
DnsWriteQuestionToBuffer_UTF8 (
|
||
IN OUT PDNS_MESSAGE_BUFFER pDnsBuffer,
|
||
IN OUT LPDWORD pdwBufferSize,
|
||
IN LPSTR pszName,
|
||
IN WORD wType,
|
||
IN WORD Xid,
|
||
IN BOOL fRecursionDesired
|
||
);
|
||
|
||
|
||
DNS_STATUS WINAPI
|
||
DnsExtractRecordsFromMessage_W (
|
||
IN PDNS_MESSAGE_BUFFER pDnsBuffer,
|
||
IN WORD wMessageLength,
|
||
OUT PDNS_RECORD * ppRecord
|
||
);
|
||
|
||
DNS_STATUS WINAPI
|
||
DnsExtractRecordsFromMessage_UTF8 (
|
||
IN PDNS_MESSAGE_BUFFER pDnsBuffer,
|
||
IN WORD wMessageLength,
|
||
OUT PDNS_RECORD * ppRecord
|
||
);
|
||
|
||
|
||
//
|
||
// Routine to read the contents of the DNS Resolver Cache. The resulting
|
||
// table contains a list of record names and types stored in the cache.
|
||
// Each of these name/type records can be queried with DnsQuery with the
|
||
// option DNS_QUERY_CACHE_ONLY.
|
||
//
|
||
|
||
typedef struct _DNS_CACHE_TABLE_
|
||
{
|
||
struct _DNS_CACHE_TABLE_ * pNext;
|
||
LPWSTR Name;
|
||
WORD Type1;
|
||
WORD Type2;
|
||
WORD Type3;
|
||
}
|
||
DNS_CACHE_TABLE, *PDNS_CACHE_TABLE;
|
||
|
||
BOOL WINAPI
|
||
DnsGetCacheDataTable (
|
||
OUT PDNS_CACHE_TABLE * pTable
|
||
);
|
||
|
||
|
||
//
|
||
// Backward compatibility
|
||
//
|
||
// Previously exposed functions now macroed to new functions.
|
||
// Eventually need to clean this stuff out of build or
|
||
// separate these defs from public headers
|
||
//
|
||
|
||
#define DNSBACKCOMPAT 1
|
||
|
||
#ifdef DNSBACKCOMPAT
|
||
#ifdef UNICODE
|
||
#define DnsCompareName(p1,p2) DnsNameCompare_W( (p1), (p2) )
|
||
#else
|
||
#define DnsCompareName(p1,p2) DnsNameCompare( (p1), (p2) )
|
||
#endif
|
||
|
||
#define DnsCompareName_W(p1,p2) DnsNameCompare_W( (p1), (p2) )
|
||
#define DnsCompareName_A(p1,p2) DnsNameCompare( (p1), (p2) )
|
||
|
||
#ifdef UNICODE
|
||
#define DnsCopyRR(pRR) DnsRecordCopy( pRR, TRUE )
|
||
#else
|
||
#define DnsCopyRR(pRR) DnsRecordCopy( pRR, FALSE )
|
||
#endif
|
||
|
||
#ifdef UNICODE
|
||
#define DnsCopyRRSet(pRRSet) DnsRecordSetCopy( pRRSet, TRUE )
|
||
#else
|
||
#define DnsCopyRRSet(pRRSet) DnsRecordSetCopy( pRRSet, FALSE )
|
||
#endif
|
||
|
||
|
||
// Async registration only from DHCP client.
|
||
// Once it is cleanedup, these can be deleted.
|
||
|
||
#define DnsMHAsyncRegisterInit(a) DnsAsyncRegisterInit(a)
|
||
#define DnsMHAsyncRegisterTerm() DnsAsyncRegisterTerm()
|
||
#define DnsMHRemoveRegistrations() DnsRemoveRegistrations()
|
||
|
||
#define DnsMHAsyncRegisterHostAddrs_A(a,b,c,d,e,f,g,h,i,j) \
|
||
DnsAsyncRegisterHostAddrs_A(a,b,c,d,e,f,g,h,i,j)
|
||
|
||
#define DnsMHAsyncRegisterHostAddrs_W(a,b,c,d,e,f,g,h,i,j) \
|
||
DnsAsyncRegisterHostAddrs_W(a,b,c,d,e,f,g,h,i,j)
|
||
|
||
#define DnsMHAsyncRegisterHostAddrs_UTF8(a,b,c,d,e,f,g,h,i,j) \
|
||
DnsAsyncRegisterHostAddrs_UTF8(a,b,c,d,e,f,g,h,i,j)
|
||
|
||
// cleanup after clean build
|
||
|
||
#define DnsNameCompare(a,b) \
|
||
DnsNameCompare_A((a),(b))
|
||
|
||
#endif DNSBACKCOMPAT
|
||
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif // __cplusplus
|
||
|
||
#endif // _DNSAPI_INCLUDED_
|
||
|