windows-nt/Source/XPSP1/NT/ds/published/inc/dnsapi.w
2020-09-26 16:20:57 +08:00

1436 lines
30 KiB
OpenEdge ABL
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1997-2001 Microsoft Corporation
Module Name:
dnsapi.h
Abstract:
Domain Name System (DNS)
DNS Client API Library
Author:
Jim Gilroy (jamesg) December 7, 1996
Revision History:
--*/
#ifndef _DNSAPI_INCLUDED_
#define _DNSAPI_INCLUDED_
#ifndef _WINSOCK2API_
#ifndef _WINSOCKAPI_
#include <winsock2.h>
#endif
#endif
#include <windns.h>
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
//
// do backward compat?
//
#define BACKCOMPAT 1
//
// DCR: add to winerror.h
//
#define DNS_ERROR_REFFERAL_PACKET 9506L
//
// NOTE: DO NOT USE these IP definitions.
//
// They are for backward compatibility only.
// Use the definitions in windns.h instead.
//
//
// IP Address
//
typedef IP4_ADDRESS IP_ADDRESS, *PIP_ADDRESS;
#define SIZEOF_IP_ADDRESS (4)
#define IP_ADDRESS_STRING_LENGTH (15)
#define IP_STRING( IpAddress ) inet_ntoa( *(struct in_addr *)&(IpAddress) )
//
// IP Address Array type
//
typedef IP4_ARRAY IP_ARRAY, *PIP_ARRAY;
//
// IPv6 Address
//
// DCR: remove IPV6_ADDRESS when clean
//
typedef DNS_IP6_ADDRESS IPV6_ADDRESS, *PIPV6_ADDRESS;
//
// Byte flipping macros
//
#define FlipUnalignedDword( pDword ) \
(DWORD)ntohl( *(UNALIGNED DWORD *)(pDword) )
#define FlipUnalignedWord( pWord ) \
(WORD)ntohs( *(UNALIGNED WORD *)(pWord) )
// Inline is faster, but NO side effects allowed in marco argument
#define InlineFlipUnaligned48Bits( pch ) \
( ( *(PUCHAR)(pch) << 40 ) | \
( *((PUCHAR)(pch) + 1) << 32 ) | \
( *((PUCHAR)(pch) + 2) << 24 ) | \
( *((PUCHAR)(pch) + 3) << 16 ) | \
( *((PUCHAR)(pch) + 4) << 8 ) | \
( *((PUCHAR)(pch) + 5) ) )
#define InlineFlipUnalignedDword( pch ) \
( ( *(PUCHAR)(pch) << 24 ) | \
( *((PUCHAR)(pch) + 1) << 16 ) | \
( *((PUCHAR)(pch) + 2) << 8 ) | \
( *((PUCHAR)(pch) + 3) ) )
#define InlineFlipUnalignedWord( pch ) \
( ((WORD)*((PUCHAR)(pch)) << 8) + (WORD)*((PUCHAR)(pch) + 1) )
//
// Unaligned write without flipping
//
#define WRITE_UNALIGNED_WORD( pout, word ) \
( *(UNALIGNED WORD *)(pout) = word )
#define WRITE_UNALIGNED_DWORD( pout, dword ) \
( *(UNALIGNED DWORD *)(pout) = dword )
//
// Non-wrapping seconds timer (timer.c)
//
DWORD
GetCurrentTimeInSeconds(
VOID
);
//
// General DNS utilities (dnsutil.c)
//
PSTR
_fastcall
DnsGetDomainName(
IN PSTR pszName
);
PSTR
_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
);
//
// 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)
#define NETINFO_FLAG_REG_ADAPTER_DOMAIN_NAME (0x00000010)
#define NETINFO_FLAG_REG_ADAPTER_ADDRESSES (0x00000020)
typedef struct
{
IP_ADDRESS ipAddress;
DWORD Priority;
}
DNS_SERVER_INFORMATION, *PDNS_SERVER_INFORMATION;
// backcompat
#define NAME_SERVER_INFORMATION DNS_SERVER_INFORMATION
#define PNAME_SERVER_INFORMATION PDNS_SERVER_INFORMATION
typedef struct
{
PSTR pszAdapterGuidName;
PSTR pszDomain;
PIP_ARRAY pIPAddresses;
PIP_ARRAY pIPSubnetMasks;
DWORD InfoFlags;
DWORD cServerCount;
DNS_SERVER_INFORMATION aipServers[1];
}
DNS_ADAPTER_INFORMATION, *PDNS_ADAPTER_INFORMATION;
// backcompat
#define ADAPTER_INFORMATION DNS_ADAPTER_INFORMATION
#define PADAPTER_INFORMATION PDNS_ADAPTER_INFORMATION
typedef struct
{
PSTR pszPrimaryDomainName;
DWORD cNameCount;
PSTR aSearchListNames[1];
}
DNS_SEARCH_INFORMATION, *PDNS_SEARCH_INFORMATION;
// backcompat
#define SEARCH_INFORMATION DNS_SEARCH_INFORMATION
#define PSEARCH_INFORMATION PDNS_SEARCH_INFORMATION
typedef struct
{
PDNS_SEARCH_INFORMATION pSearchInformation;
DWORD cAdapterCount;
PDNS_ADAPTER_INFORMATION aAdapterInfoList[1];
}
DNS_NETWORK_INFORMATION, *PDNS_NETWORK_INFORMATION;
// backcompat
#define NETWORK_INFORMATION DNS_NETWORK_INFORMATION
#define PNETWORK_INFORMATION PDNS_NETWORK_INFORMATION
#if 0
// these are replaced by the DnsQueryConfigAlloc()
// and DnsFreeConfigStructure()
PDNS_NETWORK_INFORMATION
WINAPI
DnsGetNetworkInformation(
void
);
PDNS_SEARCH_INFORMATION
WINAPI
DnsGetSearchInformation(
void
);
//
// DCR: should expose only a single "type free" routine
//
VOID
WINAPI
DnsFreeAdapterInformation(
IN PDNS_ADAPTER_INFORMATION pAdapterInformation
);
VOID
WINAPI
DnsFreeSearchInformation(
IN PDNS_SEARCH_INFORMATION pSearchInformation
);
VOID
WINAPI
DnsFreeNetworkInformation(
IN PDNS_NETWORK_INFORMATION pNetworkInformation
);
#endif
//
// 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 PIP6_ADDRESS pAddress,
IN PCHAR pchString,
IN DWORD dwStringLength
);
VOID
DnsIpv6AddressToString(
OUT PCHAR pchString,
IN PIP6_ADDRESS pAddress
);
//
// Record building (rralloc.c)
//
PDNS_RECORD
WINAPI
DnsAllocateRecord(
IN WORD wBufferLength
);
PDNS_RECORD
DnsCreatePtrRecord(
IN IP_ADDRESS IpAddress,
IN LPTSTR pszHostName,
IN BOOL fUnicodeName
);
//
// Record build from data strings (rrbuild.c)
//
PDNS_RECORD
DnsRecordBuild_UTF8(
IN OUT PDNS_RRSET pRRSet,
IN PSTR 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 PWSTR pszOwner,
IN WORD wType,
IN BOOL fAdd,
IN UCHAR Section,
IN INT Argc,
IN PWCHAR * Argv
);
//
// Parsing
//
#ifdef PDNS_PARSED_MESSAGE
#undef PDNS_PARSED_MESSAGE
#endif
typedef struct _DnsParseMessage
{
DNS_STATUS Status;
DNS_CHARSET CharSet;
DNS_HEADER Header;
WORD QuestionType;
WORD QuestionClass;
PTSTR pQuestionName;
PDNS_RECORD pAnswerRecords;
PDNS_RECORD pAliasRecords;
PDNS_RECORD pAuthorityRecords;
PDNS_RECORD pAdditionalRecords;
PDNS_RECORD pSigRecords;
}
DNS_PARSED_MESSAGE, *PDNS_PARSED_MESSAGE;
#define DNS_PARSE_FLAG_NO_QUESTION (0x00000001)
#define DNS_PARSE_FLAG_NO_ANSWER (0x00000002)
#define DNS_PARSE_FLAG_NO_AUTHORITY (0x00000004)
#define DNS_PARSE_FLAG_NO_ADDITIONAL (0x00000008)
#define DNS_PARSE_FLAG_NO_SIG (0x00000100)
#define DNS_PARSE_FLAG_NO_KEY (0x00000200)
#define DNS_PARSE_FLAG_NO_DATA (0x0000030f)
#define DNS_PARSE_FLAG_NO_RECORDS (0x0000030e)
#define DNS_PARSE_FLAG_NO_DNSSEC (0x00000300)
#define DNS_PARSE_FLAG_ONLY_QUESTION (0x01000000)
#define DNS_PARSE_FLAG_RCODE_ALL (0x02000000)
DNS_STATUS
Dns_ParseMessage(
OUT PDNS_PARSED_MESSAGE pParse,
IN PDNS_MESSAGE_BUFFER pDnsBuffer,
IN WORD wMessageLength,
IN DWORD Flags,
IN DNS_CHARSET CharSet
);
//
// Query
//
//
// Flags NOT in windns.h
//
#define DNS_QUERY_ACCEPT_PARTIAL_UDP DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE
#define DNS_QUERY_MULTICAST_ONLY 0x00040000
#define DNS_QUERY_USE_QUICK_TIMEOUTS 0x00080000
// Exposed in Win2K SDK -- deprecated
//#define DNS_QUERY_SOCKET_KEEPALIVE 0x00000100
#define DNS_QUERY_ALLOW_EMPTY_AUTH_RESP 0x00010000
//
// Extended query
//
typedef struct _DnsQueryInfo
{
LPTSTR pName;
WORD Type;
WORD Rcode;
DWORD Flags;
DNS_STATUS Status;
DNS_CHARSET CharSet;
PDNS_RECORD pAnswerRecords;
PDNS_RECORD pAliasRecords;
PDNS_RECORD pAdditionalRecords;
PDNS_RECORD pAuthorityRecords;
HANDLE hEvent;
PIP4_ARRAY pDnsServers;
PVOID pMessage;
PVOID pReservedName;
}
DNS_QUERY_INFO, *PDNS_QUERY_INFO;
DNS_STATUS
WINAPI
DnsQueryExW(
IN OUT PDNS_QUERY_INFO pQueryInfo
);
DNS_STATUS
WINAPI
DnsQueryExA(
IN OUT PDNS_QUERY_INFO pQueryInfo
);
DNS_STATUS
WINAPI
DnsQueryExUTF8(
IN OUT PDNS_QUERY_INFO pQueryInfo
);
#ifdef UNICODE
#define DnsQueryEx DnsQueryExW
#else
#define DnsQueryEx DnsQueryExA
#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 PCSTR pszName,
IN DWORD fOptions
);
DNS_STATUS WINAPI
DnsCheckNameCollision_UTF8(
IN PCSTR pszName,
IN DWORD fOptions
);
DNS_STATUS WINAPI
DnsCheckNameCollision_W(
IN PCWSTR pszName,
IN DWORD fOptions
);
#ifdef UNICODE
#define DnsDnsCheckNameCollision DnsCheckNameCollision_W
#else
#define DnsDnsCheckNameCollision DnsCheckNameCollision_A
#endif
//
// DNS Update API
//
// DnsAcquireContextHandle
// DnsReleaseContextHandle
// DnsModifyRecordsInSet
// DnsReplaceRecordSet
//
//
// Update flags NOT in windns.h
//
#define DNS_UPDATE_SECURITY_CHOICE_MASK 0x000001ff
DNS_STATUS
WINAPI
DnsUpdateTest_A(
IN HANDLE hContextHandle OPTIONAL,
IN PCSTR pszName,
IN DWORD fOptions,
IN PIP_ARRAY aipServers OPTIONAL
);
DNS_STATUS
WINAPI
DnsUpdateTest_UTF8(
IN HANDLE hContextHandle OPTIONAL,
IN PCSTR pszName,
IN DWORD fOptions,
IN PIP_ARRAY aipServers OPTIONAL
);
DNS_STATUS
WINAPI
DnsUpdateTest_W(
IN HANDLE hContextHandle OPTIONAL,
IN PCWSTR 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
);
typedef struct _DnsFailedUpdateInfo
{
IP4_ADDRESS Ip4Address;
IP6_ADDRESS Ip6Address;
DNS_STATUS Status;
DWORD Rcode;
}
DNS_FAILED_UPDATE_INFO, *PDNS_FAILED_UPDATE_INFO;
VOID
DnsGetLastFailedUpdateInfo(
OUT PDNS_FAILED_UPDATE_INFO pInfo
);
//
// 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
#define REGISTER_HOST_AAAA 0x00000008
#define REGISTER_HOST_RESERVED 0x80000000 // Not used
//
// DNS DHCP Client registration flags
//
#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(
PSTR lpstrRootRegKey
);
DNS_STATUS
WINAPI
DnsAsyncRegisterTerm(
VOID
);
DNS_STATUS WINAPI
DnsRemoveRegistrations(
VOID
);
DNS_STATUS
WINAPI
DnsAsyncRegisterHostAddrs(
IN PWSTR pwsAdapterName,
IN PWSTR pwsHostName,
IN PREGISTER_HOST_ENTRY pHostAddrs,
IN DWORD dwHostAddrCount,
IN PIP_ADDRESS pipDnsServerList,
IN DWORD dwDnsServerCount,
IN PWSTR pwsDomainName,
IN PREGISTER_HOST_STATUS pRegisterStatus,
IN DWORD dwTTL,
IN DWORD dwFlags
);
#define DnsAsyncRegisterHostAddrs_W DnsAsyncRegisterHostAddrs
//
// 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
//
// DNS DHCP Server registration function flags
//
#define DYNDNS_DELETE_ENTRY 0x1
#define DYNDNS_ADD_ENTRY 0x2
#define DYNDNS_REG_FORWARD 0x4
typedef struct _DnsCredentials
{
PWSTR pUserName;
PWSTR pDomain;
PWSTR pPassword;
}
DNS_CREDENTIALS, *PDNS_CREDENTIALS;
DNS_STATUS
WINAPI
DnsDhcpSrvRegisterInit(
VOID
);
DNS_STATUS
WINAPI
DnsDhcpSrvRegisterInitialize(
IN PDNS_CREDENTIALS pCredentials
);
DNS_STATUS
WINAPI
DnsDhcpSrvRegisterTerm(
VOID
);
DNS_STATUS
WINAPI
DnsDhcpSrvRegisterHostName(
IN REGISTER_HOST_ENTRY HostAddr,
IN PWSTR pwsName,
IN DWORD dwTTL,
IN DWORD dwFlags,
IN DHCP_CALLBACK_FN pfnDhcpCallBack,
IN PVOID pvData,
IN PIP_ADDRESS pipDnsServerList OPTIONAL,
IN DWORD dwDnsServerCount
);
#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
#define DnsDhcpSrvRegisterHostName_W DnsDhcpSrvRegisterHostName
//
// 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.
//
PSTR
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
);
DWORD
DnsNameCopy(
OUT PBYTE pBuffer,
IN OUT PDWORD pdwBufLength,
IN PCHAR pchString,
IN DWORD cchString,
IN DNS_CHARSET CharSetIn,
IN DNS_CHARSET CharSetOut
);
PVOID
DnsNameCopyAllocate(
IN PCHAR pchString,
IN DWORD cchString,
IN DNS_CHARSET CharSetIn,
IN DNS_CHARSET CharSetOut
);
PCHAR
DnsWriteReverseNameStringForIpAddress(
OUT PCHAR pBuffer,
IN IP_ADDRESS ipAddress
);
PCHAR
DnsCreateReverseNameStringForIpAddress(
IN IP_ADDRESS ipAddress
);
//
// Name validation
//
// Routines are in windns.h
//
//
// Macro away old routines
//
#define DnsValidateDnsName_UTF8(pname) \
DnsValidateName_UTF8( (pname), DnsNameDomain )
#define DnsValidateDnsName_W(pname) \
DnsValidateName_W( (pname), DnsNameDomain )
//
// Name checking -- server name checking levels
//
// DCR_CLEANUP: server name checking levels move to dnsrpc.h?
// but server will need to convert to some flag
// ammenable to downcase\validate routine
//
// DCR: server name checking: perhaps lay out additional detail now?
// or limit to RFC, MS-extended, ALL-binary
//
// DCR: server name checking: perhaps convert to enum type;
// I don't think we should do bitfields here, rather
// have enum type map to bitfields if that's the best
// way to implement underlying check.
//
#define DNS_ALLOW_RFC_NAMES_ONLY (0)
#define DNS_ALLOW_NONRFC_NAMES (1)
#define DNS_ALLOW_MULTIBYTE_NAMES (2)
#define DNS_ALLOW_ALL_NAMES (3)
//
// DNS Name compare
//
// ANSI and unicode names compare routines are in windns.h.
//
BOOL
WINAPI
DnsNameCompare_UTF8(
IN PSTR pName1,
IN PSTR pName2
);
//
// Extended name compare
// Includes determination of name heirarchy.
//
// Note: once sort out RelationalCompare issue,
// better to make Equal == 0;
// this simplifies macroing regular NameCompare
// into a single function;
//
typedef enum _DnsNameCompareStatus
{
DnsNameCompareNotEqual,
DnsNameCompareEqual,
DnsNameCompareLeftParent,
DnsNameCompareRightParent,
DnsNameCompareInvalid
}
DNS_NAME_COMPARE_STATUS, *PDNS_NAME_COMPARE_STATUS;
DNS_NAME_COMPARE_STATUS
DnsNameCompareEx_W(
IN LPCWSTR pszLeftName,
IN LPCWSTR pszRightName,
IN DWORD dwReserved
);
DNS_NAME_COMPARE_STATUS
DnsNameCompareEx_A(
IN LPCSTR pszLeftName,
IN LPCSTR pszRightName,
IN DWORD dwReserved
);
DNS_NAME_COMPARE_STATUS
DnsNameCompareEx_UTF8(
IN LPCSTR pszLeftName,
IN LPCSTR pszRightName,
IN DWORD dwReserved
);
//
// Other string routines
//
DNS_STATUS
DnsValidateDnsString_UTF8(
IN LPCSTR pszName
);
DNS_STATUS
DnsValidateDnsString_W(
IN LPCWSTR pszName
);
PSTR
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
);
//
// Service control
//
//
// DNS server startup service control event.
//
// Services (ex. netlogon) that want notification of DNS server start
// need to register to get notification of this user defined control code.
//
#define SERVICE_CONTROL_DNS_SERVER_START (200)
//
// Resolver service
//
// General "wake-up-something-has-changed" call.
// This was put in for cluster team to alert us to plumbing new
// addresses. Later we will move to model of picking up
// these changes ourselves.
//
VOID
DnsNotifyResolver(
IN DWORD Flag,
IN PVOID pReserved
);
VOID
DnsNotifyResolverEx(
IN DWORD Id,
IN DWORD Flag,
IN DWORD Cookie,
IN PVOID pReserved
);
//
// Cluster mappings
//
#define DNS_CLUSTER_ADD (0)
#define DNS_CLUSTER_DELETE_NAME (1)
#define DNS_CLUSTER_DELETE_IP (2)
DNS_STATUS
DnsRegisterClusterAddress(
IN DWORD Tag,
IN PWSTR pwsName,
IN PSOCKADDR pSockaddr,
IN DWORD Flag
);
// Remove once cluster upgraded
VOID
DnsNotifyResolverClusterIp(
IN IP_ADDRESS ClusterIp,
IN BOOL fAdd
);
//
// 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 PWSTR pszName
);
BOOL WINAPI
DnsFlushResolverCacheEntry_UTF8(
IN PSTR pszName
);
BOOL WINAPI
DnsFlushResolverCacheEntry_A(
IN PSTR pszName
);
#ifdef UNICODE
#define DnsFlushResolverCacheEntry DnsFlushResolverCacheEntry_W
#else
#define DnsFlushResolverCacheEntry DnsFlushResolverCacheEntry_A
#endif
DNS_STATUS WINAPI
DnsCacheRecordSet_W(
IN PWSTR lpstrName,
IN WORD wType,
IN DWORD fOptions,
IN OUT PDNS_RECORD pRRSet
);
//
// DO NOT USE!!! -- This is weak, i just haven't tested the replacement yet.
//
// 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.
//
// Note: this is used in ipconfig for /displaydns. Can not pull until fixed.
//
typedef struct _DNS_CACHE_TABLE_
{
struct _DNS_CACHE_TABLE_ * pNext;
PWSTR Name;
WORD Type1;
WORD Type2;
WORD Type3;
}
DNS_CACHE_TABLE, *PDNS_CACHE_TABLE;
BOOL
WINAPI
DnsGetCacheDataTable(
OUT PDNS_CACHE_TABLE * pTable
);
//
// Config info
//
//
// Alloc flag types for DnsQueryConfig()
//
// DCR: move to windns.h if supported
//
#define DNS_CONFIG_FLAG_LOCAL_ALLOC (DNS_CONFIG_FLAG_ALLOC)
#define DNS_CONFIG_FLAG_DNSAPI_ALLOC (DNS_CONFIG_FLAG_ALLOC+1)
//
// System public config -- not available in SDK
// This is stuff for
// - config UI
// - ipconfig
// - test code
//
#define DnsConfigSystemBase ((DNS_CONFIG_TYPE) 0x00010000)
#define DnsConfigNetworkInformation ((DNS_CONFIG_TYPE) 0x00010001)
#define DnsConfigAdapterInformation ((DNS_CONFIG_TYPE) 0x00010002)
#define DnsConfigSearchInformation ((DNS_CONFIG_TYPE) 0x00010003)
#define DnsConfigIp4AddressArray ((DNS_CONFIG_TYPE) 0x00010004)
#define DnsConfigRegistrationEnabled ((DNS_CONFIG_TYPE) 0x00010010)
#define DnsConfigWaitForNameErrorOnAll ((DNS_CONFIG_TYPE) 0x00010011)
// these completely backpat -- shouldn't even be public
#define DnsConfigNetInfo ((DNS_CONFIG_TYPE) 0x00020001)
PVOID
WINAPI
DnsQueryConfigAllocEx(
IN DNS_CONFIG_TYPE Config,
IN PWSTR pwsAdapterName,
IN BOOL fLocalAlloc
);
// Desired routine has dnsapi.dll alloc
#define DnsQueryConfigAlloc( Id, pAN ) \
DnsQueryConfigAllocEx( Id, pAN, FALSE )
VOID
WINAPI
DnsFreeConfigStructure(
IN OUT PVOID pData,
IN DNS_CONFIG_TYPE ConfigId
);
//
// DWORD config get\set
//
DWORD
WINAPI
DnsQueryConfigDword(
IN DNS_CONFIG_TYPE Config,
IN PWSTR pwsAdapterName
);
DNS_STATUS
WINAPI
DnsSetConfigDword(
IN DNS_CONFIG_TYPE Config,
IN PWSTR pwsAdapterName,
IN DWORD NewValue
);
//
// Macro old routines
// - system-public config allocator
// - global free routine
// - these were structure allocs so were not being freed with LocalFree
//
#ifdef BACKCOMPAT
#define DnsGetNetworkInformation() DnsQueryConfigAlloc( DnsConfigNetworkInformation, NULL )
#define DnsGetSearchInformation() DnsQueryConfigAlloc( DnsConfigSearchInformation, NULL )
#define Dns_GetDnsNetworkInfo(f,g) DnsQueryConfigAlloc( DnsConfigNetInfo, NULL )
#define DnsFreeNetworkInformation(p) DnsFreeConfigStructure( p, DnsConfigNetworkInformation )
#define DnsFreeSearchInformation(p) DnsFreeConfigStructure( p, DnsConfigSearchInformation )
#define DnsFreeAdapterInformation(p) DnsFreeConfigStructure( p, DnsConfigAdapterInformation )
#define Dns_FreeNetworkInfo(p) DnsFreeConfigStructure( p, DnsConfigNetInfo )
//
// Macro old config string allocating routines
// - no adapter name
// - allocating from dnsapi heap as main caller -- RnR -- seems to be
// using DnsApiFree
//
#define BackpatAlloc( Id ) DnsQueryConfigAllocEx( Id, NULL, FALSE )
// Public structures
#define DnsGetHostName_A() BackpatAlloc( DnsConfigHostName_A )
#define DnsGetHostName_UTF8() BackpatAlloc( DnsConfigHostName_UTF8 )
#define DnsGetHostName_W() ((PWSTR)BackpatAlloc( DnsConfigHostName_W ))
#ifdef UNICODE
#define DnsGetHostName DnsGetHostName_W
#else
#define DnsGetHostName DnsGetHostName_A
#endif
#define DnsGetPrimaryDomainName_A() BackpatAlloc( DnsConfigPrimaryDomainName_A )
#define DnsGetPrimaryDomainName_UTF8() BackpatAlloc( DnsConfigPrimaryDomainName_UTF8 )
#define DnsGetPrimaryDomainName_W() ((PWSTR)BackpatAlloc( DnsConfigPrimaryDomainName_W ))
#ifdef UNICODE
#define DnsGetPrimaryDomainName DnsGetPrimaryDomainName_W
#else
#define DnsGetPrimaryDomainName DnsGetPrimaryDomainName_A
#endif
//
// DWORD get\set backcompat
//
//
// DCR: there is a possible problem with these mappings handles generic\adapter
// difference -- not sure the mapping is complete
// may need switches -- see which are even in use with BACKCOMPAT off
//
#define DnsIsDynamicRegistrationEnabled(pA) \
(BOOL)DnsQueryConfigDword( DnsConfigRegistrationEnabled, (pA) )
#define DnsIsAdapterDomainNameRegistrationEnabled(pA) \
(BOOL)DnsQueryConfigDword( DnsConfigAdapterHostNameRegistrationEnabled, (pA) )
#define DnsGetMaxNumberOfAddressesToRegister(pA) \
DnsQueryConfigDword( DnsConfigAddressRegistrationMaxCount, (pA) )
// DWORD reg value set
#define DnsEnableDynamicRegistration(pA) \
DnsSetConfigDword( DnsConfigRegistrationEnabled, pA, (DWORD)TRUE )
#define DnsDisableDynamicRegistration(pA) \
DnsSetConfigDword( DnsConfigRegistrationEnabled, pA, (DWORD)FALSE )
#define DnsEnableAdapterDomainNameRegistration(pA) \
DnsSetConfigDword( DnsConfigAdapterHostNameRegistrationEnabled, pA, (DWORD)TRUE )
#define DnsDisableAdapterDomainNameRegistration(pA) \
DnsSetConfigDword( DnsConfigAdapterHostNameRegistrationEnabled, pA, (DWORD)FALSE )
#define DnsSetMaxNumberOfAddressesToRegister(pA, MaxCount) \
(NO_ERROR == DnsSetConfigDword( DnsConfigAddressRegistrationMaxCount, pA, MaxCount ))
//
// DNS server list backcompat
//
#define Dns_GetDnsServerList(flag) ((PIP4_ARRAY)BackpatAlloc( DnsConfigDnsServerList ))
#ifndef MIDL_PASS
__inline
DWORD
inline_DnsGetDnsServerList(
OUT PIP4_ARRAY * ppDnsArray
)
{
*ppDnsArray = Dns_GetDnsServerList( TRUE );
return ( *ppDnsArray ? (*ppDnsArray)->AddrCount : 0 );
}
#endif // MIDL
#define DnsGetDnsServerList(p) inline_DnsGetDnsServerList(p)
//
// IP list backcompat
//
#ifndef MIDL_PASS
__inline
DWORD
inline_DnsGetIpAddressList(
OUT PIP4_ARRAY * ppIpArray
)
{
*ppIpArray = (PIP4_ARRAY) BackpatAlloc( DnsConfigIp4AddressArray );
return( *ppIpArray ? (*ppIpArray)->AddrCount : 0 );
}
#endif // MIDL
#define DnsGetIpAddressList(p) inline_DnsGetIpAddressList(p)
//
// For netdiag
//
#define Dns_IsUpdateNetworkInfo(pni) NetInfo_IsForUpdate( pni )
//
// DO NOT USE!!!!
//
// This is backward compatibility only.
// I've switched the DCPromo stuff. Need to verify with clean system
// build that it's completely gone, then pull.
//
#ifdef BACKCOMPAT
#define DNS_RELATE_NEQ DnsNameCompareNotEqual
#define DNS_RELATE_EQL DnsNameCompareEqual
#define DNS_RELATE_LGT DnsNameCompareLeftParent
#define DNS_RELATE_RGT DnsNameCompareRightParent
#define DNS_RELATE_INVALID DnsNameCompareInvalid
typedef DNS_NAME_COMPARE_STATUS DNS_RELATE_STATUS, *PDNS_RELATE_STATUS;
#endif
#endif // BACKCOMPAT
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // _DNSAPI_INCLUDED_