/*++ 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 #endif #endif #include #ifdef __cplusplus extern "C" { #endif // __cplusplus // // Definitions for testing // #ifdef DNS_INTERNAL #define DNSTEST_BUILD 1 #endif // // DCR: add to winerror.h // #define DNS_ERROR_REFFERAL_PACKET 9506L // // Handy IP string macro // #define IP_STRING( IpAddr ) inet_ntoa( *(struct in_addr *)&(IpAddr) ) #define IP4_STRING( IpAddr ) inet_ntoa( *(struct in_addr *)&(IpAddr) ) // // 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 ) // // DNS_ADDR -- IP4/6 sockaddr union // // DNS_ADDR allows compile and runtime IP4/6 union but also // carries sockaddr LENGTH, making it more "object-like" -- // an annoying ommission from winsock2. // // In addition, this allows the developer to pack in any other // desirable context to travel with the address. // #define DNS_ADDR_MAX_SOCKADDR_LENGTH (32) #ifdef MIDL_PASS typedef struct _DnsAddr { CHAR MaxSa[ DNS_ADDR_MAX_SOCKADDR_LENGTH ]; DWORD DnsAddrUserDword[8]; } DNS_ADDR, *PDNS_ADDR; #else typedef struct _DnsAddr { union { SOCKADDR Sockaddr; SOCKADDR_IN SockaddrIn; #ifdef _WS2TCPIP_H_ SOCKADDR_IN6 SockaddrIn6; #endif CHAR MaxSa[ DNS_ADDR_MAX_SOCKADDR_LENGTH ]; }; DWORD SockaddrLength; // // The remaining structure is user extensible // Define both common uses (some used internally by DNS) // and user extensions. // // At least one unique name is defined for every field so // that user can macro to an appropriate name for their application // to produce readable code. // union { struct { DWORD SubnetLength; DWORD Flags; DWORD Status; }; struct { DWORD DnsAddrUser0Dword2; DWORD DnsAddrUser0Dword3; DWORD DnsAddrUser0Dword4; }; }; // // Last 16 bytes setup with multiple unions to give // user choice of byte, DWORD and pointer fields. // // Note that pointer fields are setup to be both 32 and 64 bit // capable. (A loss of space, but necessary -- otherwise the // structure would balloon beyond 64 bytes in 64-bit architectures.) // // Note that obviously any use of pointers will not be "understood" // by MIDL compile or transmitted by RPC. // union { CHAR DnsAddrUserBytes[16]; struct { DWORD Priority; DWORD Weight; DWORD Tag; DWORD Reserved; }; struct { DWORD DnsAddrUser1Dword1; DWORD DnsAddrUser1Dword2; DWORD DnsAddrUser1Dword3; DWORD DnsAddrUser1Dword4; }; struct { DWORD DnsAddrUser2Dword1; DWORD DnsAddrUser2Dword2; UINT_PTR DnsAddrUser2Ptr1; }; struct { UINT_PTR DnsAddrUser3Ptr1; UINT_PTR DnsAddrUser3Ptr2; }; }; } DNS_ADDR, *PDNS_ADDR; #endif // // DNS_ADDR macros // #define SOCKADDR_IS_IP4( pSa ) ( (pSa)->sa_family == AF_INET ) #define SOCKADDR_IS_IP6( pSa ) ( (pSa)->sa_family == AF_INET6 ) #define SOCKADDR_IS_ATM( pSa ) ( (pSa)->sa_family == AF_ATM ) #define DNS_ADDR_IS_IP4( pA ) SOCKADDR_IS_IP4( &(pA)->Sockaddr ) #define DNS_ADDR_IS_IP6( pA ) SOCKADDR_IS_IP6( &(pA)->Sockaddr ) #define DNS_ADDR_IP4_STRING( p ) inet_ntoa( (p)->SockaddrIn.sin_addr ) #define DNS_ADDR_IP6_STRING( p ) IPADDR_STRING( (p)->SockaddrIn6.sin6_addr ) #define DNS_ADDR_IP_STRING_BUFFER_LENGTH (64) #define DNS_ADDR_STRING_BUFFER_LENGTH (128) // // DNS_ADDR_ARRAY // // This is a flat array of DNS_ADDRs // - MaxCount is the memory size count of DNS_ADDRs // - AddrCount is the in-use count of DNS_ADDRs // #ifdef MIDL_PASS typedef struct _DnsAddrArray { DWORD MaxCount; DWORD AddrCount; DWORD Tag; WORD Family; WORD WordReserved; DWORD Flags; DWORD MatchFlag; DWORD Reserved1; DWORD Reserved2; [size_is( AddrCount )] DNS_ADDR AddrArray[]; } DNS_ADDR_ARRAY, *PDNS_ADDR_ARRAY; #else typedef struct _DnsAddrArray { DWORD MaxCount; DWORD AddrCount; DWORD Tag; WORD Family; WORD WordReserved; DWORD Flags; DWORD MatchFlag; DWORD Reserved1; DWORD Reserved2; DNS_ADDR AddrArray[1]; } DNS_ADDR_ARRAY, *PDNS_ADDR_ARRAY; #endif // // 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 ); // // DNS network config structures // #define DNSINFO_FLAG_IS_WAN_ADAPTER (0x00000002) #define DNSINFO_FLAG_IS_AUTONET_ADAPTER (0x00000004) #define DNSINFO_FLAG_IS_DHCP_CFG_ADAPTER (0x00000008) #define DNSINFO_FLAG_REG_ADAPTER_DOMAIN_NAME (0x00000010) #define DNSINFO_FLAG_REG_ADAPTER_ADDRESSES (0x00000020) typedef struct { PSTR pszAdapterGuidName; PSTR pszAdapterDomain; PDNS_ADDR_ARRAY pIpAddrs; PDNS_ADDR_ARRAY pDnsAddrs; DWORD Flags; DWORD InterfaceIndex; } DNS_ADAPTER_INFOA, *PDNS_ADAPTER_INFOA; typedef struct { PWSTR pszAdapterGuidName; PWSTR pszAdapterDomain; PDNS_ADDR_ARRAY pIpAddrs; PDNS_ADDR_ARRAY pDnsAddrs; DWORD Flags; DWORD InterfaceIndex; } DNS_ADAPTER_INFOW, *PDNS_ADAPTER_INFOW; typedef struct { PSTR pszPrimaryDomainName; DWORD NameCount; PSTR SearchNameArray[1]; } DNS_SEARCH_LISTA, *PDNS_SEARCH_LISTA; typedef struct { PWSTR pszPrimaryDomainName; DWORD NameCount; PWSTR SearchNameArray[1]; } DNS_SEARCH_LISTW, *PDNS_SEARCH_LISTW; typedef struct { PSTR pszHostName; PSTR pszPrimaryDomainName; PDNS_SEARCH_LISTA pSearchList; DWORD Flags; DWORD AdapterCount; DNS_ADAPTER_INFOA AdapterArray[1]; } DNS_NETWORK_INFOA, *PDNS_NETWORK_INFOA; typedef struct { PWSTR pszHostName; PWSTR pszPrimaryDomainName; PDNS_SEARCH_LISTW pSearchList; DWORD Flags; DWORD AdapterCount; DNS_ADAPTER_INFOW AdapterArray[1]; } DNS_NETWORK_INFOW, *PDNS_NETWORK_INFOW; #ifdef UNICODE typedef DNS_ADAPTER_INFOW DNS_ADAPTER_INFO, *PDNS_ADAPTER_INFO; typedef DNS_SEARCH_LISTW DNS_SEARCH_LIST, *PDNS_SEARCH_LIST; typedef DNS_NETWORK_INFOW DNS_NETWORK_INFO, *PDNS_NETWORK_INFO; #else typedef DNS_ADAPTER_INFOW DNS_ADAPTER_INFO, *PDNS_ADAPTER_INFO; typedef DNS_SEARCH_LISTW DNS_SEARCH_LIST, *PDNS_SEARCH_LIST; typedef DNS_NETWORK_INFOW DNS_NETWORK_INFO, *PDNS_NETWORK_INFO; #endif // // Limit fixed search list (for network config dialogs) // #define DNS_MAX_SEARCH_LIST_ENTRIES (50) // // Old public structures // DNS_NETWORK_INFORMATION // DNS_SEARCH_INFORMATION // DNS_ADAPTER_INFORMATION // structures // // Do NOT code to these // //#ifdef DNSAPI_BACKCOMPAT #if 0 #define NETINFO_FLAG_IS_WAN_ADAPTER DNSINFO_FLAG_IS_WAN_ADAPTER #define NETINFO_FLAG_IS_AUTONET_ADAPTER DNSINFO_FLAG_IS_AUTONET_ADAPTER #define NETINFO_FLAG_IS_DHCP_CFG_ADAPTER DNSINFO_FLAG_IS_DHCP_CFG_ADAPTER #define NETINFO_FLAG_REG_ADAPTER_DOMAIN_NAME DNSINFO_FLAG_REG_ADAPTER_DOMAIN_NAME #define NETINFO_FLAG_REG_ADAPTER_ADDRESSES DNSINFO_FLAG_REG_ADAPTER_ADDRESSES #endif typedef struct { IP4_ADDRESS ipAddress; DWORD Priority; } DNS_SERVER_INFORMATION, *PDNS_SERVER_INFORMATION; typedef struct { PSTR pszAdapterGuidName; PSTR pszDomain; PIP4_ARRAY pIPAddresses; PIP4_ARRAY pIPSubnetMasks; DWORD InfoFlags; DWORD cServerCount; DNS_SERVER_INFORMATION aipServers[1]; } DNS_ADAPTER_INFORMATION, *PDNS_ADAPTER_INFORMATION; typedef struct { PSTR pszPrimaryDomainName; DWORD cNameCount; PSTR aSearchListNames[1]; } DNS_SEARCH_INFORMATION, *PDNS_SEARCH_INFORMATION; typedef struct { PDNS_SEARCH_INFORMATION pSearchInformation; DWORD cAdapterCount; PDNS_ADAPTER_INFORMATION aAdapterInfoList[1]; } DNS_NETWORK_INFORMATION, *PDNS_NETWORK_INFORMATION; #ifdef DNSAPI_BACKCOMPAT #define NAME_SERVER_INFORMATION DNS_SERVER_INFORMATION #define PNAME_SERVER_INFORMATION PDNS_SERVER_INFORMATION #define ADAPTER_INFORMATION DNS_ADAPTER_INFORMATION #define PADAPTER_INFORMATION PDNS_ADAPTER_INFORMATION #define SEARCH_INFORMATION DNS_SEARCH_INFORMATION #define PSEARCH_INFORMATION PDNS_SEARCH_INFORMATION #define NETWORK_INFORMATION DNS_NETWORK_INFORMATION #define PNETWORK_INFORMATION PDNS_NETWORK_INFORMATION #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 IP4_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 ); // // Extra info to query and update // // // Results in sockaddr format // #define DNS_MAX_ALIAS_COUNT (8) typedef struct _DnsSockaddrResults { PWSTR pName; PDNS_ADDR_ARRAY pAddrArray; PVOID pHostent; DWORD AliasCount; DWORD Reserved; PWSTR AliasArray[ DNS_MAX_ALIAS_COUNT ]; } DNS_SOCKADDR_RESULTS, *PDNS_SOCKADDR_RESULTS; // // Basic results for logging\eventing // typedef struct _DnsBasicResults { DNS_STATUS Status; WORD Rcode; DNS_ADDR ServerAddr; } DNS_RESULTS_BASIC, *PDNS_RESULTS_BASIC; // // Extra info format // #define DNS_MAX_PRIVATE_EXTRA_INFO_SIZE (72) typedef struct _DnsExtraInfo { PVOID pNext; DWORD Id; union { CHAR Flat[DNS_MAX_PRIVATE_EXTRA_INFO_SIZE]; // // results // struct { DNS_STATUS Status; WORD Rcode; IP4_ADDRESS ServerIp4; IP6_ADDRESS ServerIp6; } ResultsV1; DNS_RESULTS_BASIC ResultsBasic; DNS_SOCKADDR_RESULTS SaResults; // // server info inputs // PDNS_ADDR_ARRAY pServerList; PIP4_ARRAY pServerList4; }; } DNS_EXTRA_INFO, *PDNS_EXTRA_INFO; #define DNS_EXINFO_ID_RESULTS_V1 (1) #define DNS_EXINFO_ID_RESULTS_BASIC (2) #define DNS_EXINFO_ID_SOCKADDR_RESULTS (3) #define DNS_EXINFO_ID_SERVER_LIST (10) #define DNS_EXINFO_ID_SERVER_LIST_IP4 (11) // // 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_ALLOW_EMPTY_AUTH_RESP 0x00010000 // // Extended query // typedef struct _DnsQueryInfo { DWORD Size; DWORD Version; 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; PDNS_EXTRA_INFO pExtraInfo; PVOID pServerList; PIP4_ARRAY pServerListIp4; 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 // // // 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 PIP4_ARRAY aipServers OPTIONAL ); DNS_STATUS WINAPI DnsUpdateTest_UTF8( IN HANDLE hContextHandle OPTIONAL, IN PCSTR pszName, IN DWORD fOptions, IN PIP4_ARRAY aipServers OPTIONAL ); DNS_STATUS WINAPI DnsUpdateTest_W( IN HANDLE hContextHandle OPTIONAL, IN PCWSTR pszName, IN DWORD fOptions, IN PIP4_ARRAY aipServers OPTIONAL ); #ifdef UNICODE #define DnsUpdateTest DnsUpdateTest_W #else #define DnsUpdateTest DnsUpdateTest_A #endif // // DNS Update API for DHCP client // typedef struct _REGISTER_HOST_ENTRY { union { IP4_ADDRESS ipAddr; IP6_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 DnsDhcpRegisterInit( VOID ); DNS_STATUS WINAPI DnsDhcpRegisterTerm( VOID ); DNS_STATUS WINAPI DnsDhcpRemoveRegistrations( VOID ); DNS_STATUS WINAPI DnsDhcpRegisterHostAddrs( IN PWSTR pwsAdapterName, IN PWSTR pwsHostName, IN PREGISTER_HOST_ENTRY pHostAddrs, IN DWORD dwHostAddrCount, IN PIP4_ADDRESS pipDnsServerList, IN DWORD dwDnsServerCount, IN PWSTR pwsDomainName, IN PREGISTER_HOST_STATUS pRegisterStatus, IN DWORD dwTTL, IN DWORD dwFlags ); #ifdef XP_BACKCOMPAT #define DnsAsyncRegisterInit(p) DnsDhcpRegisterInit() #define DnsAsyncRegisterTerm() DnsDhcpRegisterTerm() #define DnsRemoveRegistrations() DnsDhcpRemoveRegistrations() #define DnsAsyncRegisterHostAddrs(a,b,c,d,e,f,g,h,i) \ DnsDhcpRegisterHostAddrs(a,b,c,d,e,f,g,h,i) #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 // // 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( IN PDNS_CREDENTIALS pCredentials, IN DWORD MaxQueueSize ); 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 PIP4_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 // // 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 IP4_ADDRESS IpAddress ); PCHAR DnsCreateReverseNameStringForIpAddress( IN IP4_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 IP4_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 // // These are simply hidden from public until ready #define DnsConfigDnsServers ((DNS_CONFIG_TYPE) 0x00001030) #define DnsConfigDnsServersIp4 ((DNS_CONFIG_TYPE) 0x00001031) #define DnsConfigDnsServersIp6 ((DNS_CONFIG_TYPE) 0x00001032) // Above SystemBase ID, they are unavailable to public routine #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 DnsConfigRegistrationEnabled ((DNS_CONFIG_TYPE) 0x00010010) #define DnsConfigWaitForNameErrorOnAll ((DNS_CONFIG_TYPE) 0x00010011) #define DnsConfigLocalAddrs ((DNS_CONFIG_TYPE) 0x00010020) #define DnsConfigLocalAddrsIp4 ((DNS_CONFIG_TYPE) 0x00010021) #define DnsConfigLocalAddrsIp6 ((DNS_CONFIG_TYPE) 0x00010022) #define DnsConfigNetworkInfoA ((DNS_CONFIG_TYPE) 0x00010031) #define DnsConfigAdapterInfoA ((DNS_CONFIG_TYPE) 0x00010032) #define DnsConfigSearchListA ((DNS_CONFIG_TYPE) 0x00010033) #define DnsConfigNetworkInfoW ((DNS_CONFIG_TYPE) 0x00010141) #define DnsConfigAdapterInfoW ((DNS_CONFIG_TYPE) 0x00010142) #define DnsConfigSearchListW ((DNS_CONFIG_TYPE) 0x00010143) #define DnsConfigDwordGlobals ((DNS_CONFIG_TYPE) 0x00010200) // backcompat // still get IP4_ARRAY in mswsock myhostent() routines #define DnsConfigIp4AddressArray ((DNS_CONFIG_TYPE) 0x00010004) // old network info definitions 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 ); // // End dnsapi.h // // // Backward compatibility // // This is all the crap we should be getting out of here, but // may still be called in the sytem somewhere. // // DO NOT USE!!!! // // These definitions are for backward compatibility only. They can be pulled at // any time and if you use them you may break. // #ifdef DNS_INTERNAL #define NO_DNSAPI_BACKCOMPAT 1 #endif #ifndef NO_DNSAPI_BACKCOMPAT #define DNSAPI_BACKCOMPAT 1 #endif #ifdef DNSAPI_BACKCOMPAT // // IP Address // typedef IP4_ADDRESS IP_ADDRESS, *PIP_ADDRESS; typedef IP4_ARRAY IP_ARRAY, *PIP_ARRAY; #define IP_ADDRESS_STRING_LENGTH IP4_ADDRESS_STRING_LENGTH #define SIZEOF_IP_ADDRESS SIZEOF_IP4_ADDRESS // // Config stuff // // Macro old routines // - system-public config allocator // - global free routine // - these were structure allocs so were not being freed with LocalFree // #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 // // // Machines IP address list (iplist.c) // // Routine to get the current IP addresses from all adapters // configured for the machine. // DWORD DnsGetIpAddressList( OUT PIP4_ARRAY * ppIpAddresses ); // // Routine to get the current IP addresses and subnet masks // from all adapters configured for the machine. // typedef struct _DNS_ADDRESS_INFO_ { IP4_ADDRESS ipAddress; IP4_ADDRESS subnetMask; } DNS_ADDRESS_INFO, *PDNS_ADDRESS_INFO; DWORD DnsGetIpAddressInfoList( OUT PDNS_ADDRESS_INFO * ppAddrInfo ); DWORD Dns_GetIpAddresses( IN OUT PDNS_ADDRESS_INFO IpAddressInfoList, IN DWORD ListCount ); #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) // // I've switched the DCPromo stuff. Need to verify with clean system // build that it's completely gone, then pull. // #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; #define DNS_UPDATE_INFO_ID_RESULT_INFO DNS_EXINFO_ID_RESULTS_V1 // // Update additional info // typedef struct _DnsUpdateExtraInfo { PVOID pNext; DWORD Id; union { struct { DNS_STATUS Status; WORD Rcode; IP4_ADDRESS ServerIp4; IP6_ADDRESS ServerIp6; } Results; } U; } DNS_UPDATE_EXTRA_INFO, *PDNS_UPDATE_EXTRA_INFO; // // Old failed update info // 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; #define DEFINED_DNS_FAILED_UPDATE_INFO 1 VOID DnsGetLastFailedUpdateInfo( OUT PDNS_FAILED_UPDATE_INFO pInfo ); #endif // DNSAPI_BACKCOMPAT #ifdef __cplusplus } #endif // __cplusplus #endif // _DNSAPI_INCLUDED_