/*++ Copyright (c) 1997-2001 Microsoft Corporation Module Name: local.h Abstract: Domain Name System (DNS) API Dns API local include file Author: Jim Gilroy (jamesg) May 1997 Revision History: --*/ #ifndef _DNSAPILOCAL_INCLUDED_ #define _DNSAPILOCAL_INCLUDED_ #define UNICODE 1 #define _UNICODE 1 #include // build for Win95 compatibility #include #include #include // headers are messed up // neither ntdef.h nor winnt.h brings in complete set, so depending // on whether you include nt.h or not you end up with different set #define MINCHAR 0x80 #define MAXCHAR 0x7f #define MINSHORT 0x8000 #define MAXSHORT 0x7fff #define MINLONG 0x80000000 #define MAXLONG 0x7fffffff #define MAXBYTE 0xff #define MAXUCHAR 0xff #define MAXWORD 0xffff #define MAXUSHORT 0xffff #define MAXDWORD 0xffffffff #define MAXULONG 0xffffffff #include #include #include #include #include #include #include #include // Alignment macros #include // SDK DNS definitions #define DNS_INTERNAL #define DNSAPI_INTERNAL #define DNSAPI_NETDIAG #include #include "dnsrslvr.h" // Resolver RPC definitions #include // Exception filter #include "dnslibp.h" // DNS library #include "registry.h" #include "message.h" // dnslib message def //#include "dnsrslvr.h" // Resolver RPC definitions #include "dnsapip.h" // Private DNS definitions #include "queue.h" #include "rtlstuff.h" // Handy macros from NT RTL #include "trace.h" #include "heapdbg.h" // dnslib debug heap // // Use winsock2 // #define DNS_WINSOCK_VERSION (0x0202) // Winsock 2.2 // // Dll instance handle // extern HINSTANCE g_hInstanceDll; // // General CS // protects initialization and available for other random needs // CRITICAL_SECTION g_GeneralCS; #define LOCK_GENERAL() EnterCriticalSection( &g_GeneralCS ) #define UNLOCK_GENERAL() LeaveCriticalSection( &g_GeneralCS ) // // Init Levels // #define INITLEVEL_ZERO (0) #define INITLEVEL_BASE (0x00000001) #define INITLEVEL_DEBUG (0x00000010) #define INITLEVEL_QUERY (0x00000100) #define INITLEVEL_REGISTRATION (0x00001000) #define INITLEVEL_SECURE_UPDATE (0x00010000) // Combined #define INITLEVEL_ALL (0xffffffff) // // Limit on update adapters // #define UPDATE_ADAPTER_LIMIT (100) // // Limit on search list entries // #define MAX_SEARCH_LIST_ENTRIES (50) // // Event logging // - currently set to disable in any code we pick up from server // VOID DnsLogEvent( IN DWORD MessageId, IN WORD EventType, IN DWORD NumberOfSubStrings, IN PWSTR * SubStrings, IN DWORD ErrorCode ); #define DNS_LOG_EVENT(a,b,c,d) // // Debug // #ifdef ASSERT #undef ASSERT #endif #define ASSERT(a) DNS_ASSERT(a) // standard -- unflagged ASSERT() // - defintion directly from ntrtl.h // this should have been plain vanilla ASSERT(), but // it is used too often #if DBG #define RTL_ASSERT(exp) \ ((!(exp)) ? \ (RtlAssert( #exp, __FILE__, __LINE__, NULL ),FALSE) : \ TRUE) #else #define RTL_ASSERT(exp) #endif // // IP6 support // #define RUNNING_IP6() (TRUE) // // Handy hack // #define SOCKADDR_IS_LOOPBACK(psa) DnsAddr_IsLoopback( (PDNS_ADDR)(psa), 0 ) // // Single async socket for internal use // // If want async socket i/o then can create single async socket, with // corresponding event and always use it. Requires winsock 2.2 // extern SOCKET DnsSocket; extern OVERLAPPED DnsSocketOverlapped; extern HANDLE hDnsSocketEvent; // // App shutdown flag // extern BOOLEAN fApplicationShutdown; // // Global config -- From DnsLib // -- set in DnsRegInit() // OR in DnsReadRegistryGlobals() // -- declaration in registry.h // // // Runtime globals (dnsapi.c) // extern DWORD g_NetFailureTime; extern DNS_STATUS g_NetFailureStatus; //extern IP4_ADDRESS g_LastDNSServerUpdated; // // Heap operations // #define ALLOCATE_HEAP(size) Dns_AllocZero( size ) #define ALLOCATE_HEAP_ZERO(size) Dns_AllocZero( size ) #define REALLOCATE_HEAP(p,size) Dns_Realloc( (p), (size) ) #define FREE_HEAP(p) Dns_Free( p ) // // RPC Exception filters // #define DNS_RPC_EXCEPTION_FILTER I_RpcExceptionFilter( RpcExceptionCode() ) // // During setup need to cleanup after winsock // #define GUI_MODE_SETUP_WS_CLEANUP( _mode ) \ { \ if ( _mode ) \ { \ Socket_CleanupWinsock(); \ } \ } // // Server status // #define SRVSTATUS_NEW ((DNS_STATUS)(-1)) #define TEST_SERVER_VALID_RECV(pserver) ((LONG)(pserver)->Status >= 0 ) // // Server state // // Note, server state is currently completely "per query", meaning // only pertaining to a particular name query. // // As such it has two components: // 1) query -- state for entire query // 2) retry -- state only valid for given retry // #define SRVFLAG_NEW (0x00000000) #define SRVFLAG_SENT (0x00000001) #define SRVFLAG_RECV (0x00000002) #define SRVFLAG_SENT_OPT (0x00000011) #define SRVFLAG_RECV_OPT (0x00000020) #define SRVFLAG_TIMEOUT_OPT (0x00000040) #define SRVFLAG_SENT_NON_OPT (0x00000101) #define SRVFLAG_RECV_NON_OPT (0x00000200) #define SRVFLAG_TIMEOUT_NON_OPT (0x00000400) #define SRVFLAG_QUERY_MASK (0x0000ffff) #define SRVFLAG_SENT_THIS_RETRY (0x00010000) #define SRVFLAG_RETRY_MASK (0x00010000) #define SRVFLAG_RUNTIME_MASK (0x000fffff) #define TEST_SERVER_STATE(pserver, state) (((pserver)->Flags & (state)) == (state)) #define SET_SERVER_STATE(pserver, state) ((pserver)->Flags |= state) #define CLEAR_SERVER_STATE(pserver, state) ((pserver)->Flags &= ~(state)) #define TEST_SERVER_NEW(pserver) ((pserver)->Flags == SRVFLAG_NEW) #define CLEAR_SERVER_RETRY_STATE( pserver ) CLEAR_SERVER_STATE( pserver, SRVFLAG_RETRY_MASK ) // // Server priority // // Note, these values are tuned to do the following // => loopback DNS keeps getting action through a fair amount of // timeouts, but is pushed aside if no DNS // => otherwise response priority beats default setup // => IP6 default DNS are assumed to be non-functional relative to // other DNS servers, several timeouts on other servers before they // go first // #define SRVPRI_LOOPBACK (200) #define SRVPRI_RESPONSE (10) #define SRVPRI_DEFAULT (0) #define SRVPRI_IP6_DEFAULT (-30) #define SRVPRI_NO_DNS (-200) #define SRVPRI_SERVFAIL_DROP (1) #define SRVPRI_TIMEOUT_DROP (10) #define SRVPRI_NO_DNS_DROP (200) // // Local Prototypes // // Routines shared between dnsapi.dll modules, but not exported // // Note, i've included some other functions in here because the external // definition seems help "encourage" the creation of symbols in retail // builds // // // Config stuff // BOOL DnsApiInit( IN DWORD InitLevel ); DWORD Reg_ReadRegistryGlobal( IN DNS_REGID GlobalId ); // // DHCP server (dynreg.c) // VOID DhcpSrv_Cleanup( VOID ); // // DHCP client (asyncreg.c) // VOID Dhcp_RegCleanupForUnload( VOID ); // // Query (query.c) // DNS_STATUS WINAPI Query_PrivateExW( IN PCWSTR pwsName, IN WORD wType, IN DWORD Options, IN PADDR_ARRAY pServerList OPTIONAL, IN PIP4_ARRAY pServerList4 OPTIONAL, OUT PDNS_RECORD * ppResultSet OPTIONAL, IN OUT PDNS_MSG_BUF * ppMessageResponse OPTIONAL ); DNS_STATUS WINAPI Query_Private( IN PCWSTR pszName, IN WORD wType, IN DWORD Options, IN PADDR_ARRAY pServerList OPTIONAL, OUT PDNS_RECORD * ppResultSet OPTIONAL ); BOOL IsEmptyDnsResponse( IN PDNS_RECORD pRecordList ); BOOL ValidateQueryTld( IN PWSTR pTld ); BOOL ValidateQueryName( IN PQUERY_BLOB pBlob, IN PWSTR pName, IN PWSTR pDomain ); PWSTR getNextQueryName( OUT PWSTR pNameBuffer, IN DWORD QueryCount, IN PWSTR pszName, IN DWORD NameLength, IN DWORD NameAttributes, IN PDNS_NETINFO pNetInfo, OUT PDWORD pSuffixFlags ); PWSTR Query_GetNextName( IN OUT PQUERY_BLOB pBlob ); // // FAZ (faz.c) // DNS_STATUS Faz_Private( IN PWSTR pszName, IN DWORD dwFlags, IN PADDR_ARRAY pServers, OPTIONAL OUT PDNS_NETINFO * ppNetworkInfo ); DNS_STATUS DoQuickFAZ( OUT PDNS_NETINFO * ppNetworkInfo, IN PWSTR pszName, IN PADDR_ARRAY pServers ); DWORD GetDnsServerListsForUpdate( IN OUT PADDR_ARRAY* DnsServerListArray, IN DWORD ArrayLength, IN DWORD Flags ); DNS_STATUS CollapseDnsServerListsForUpdate( IN OUT PADDR_ARRAY* DnsServerListArray, OUT PDNS_NETINFO * NetworkInfoArray, IN OUT PDWORD pNetCount, IN PWSTR pszUpdateName ); PADDR_ARRAY GetNameServersListForDomain( IN PWSTR pDomainName, IN PADDR_ARRAY pServerList ); BOOL ValidateZoneNameForUpdate( IN PWSTR pszZone ); BOOL WINAPI Faz_AreServerListsInSameNameSpace( IN PWSTR pszDomainName, IN PADDR_ARRAY pServerList1, IN PADDR_ARRAY pServerList2 ); BOOL WINAPI CompareMultiAdapterSOAQueries( IN PWSTR pszDomainName, IN PIP4_ARRAY pDnsServerList1, IN PIP4_ARRAY pDnsServerList2 ); BOOL WINAPI Faz_CompareTwoAdaptersForSameNameSpace( IN PADDR_ARRAY pDnsServerList1, IN PDNS_NETINFO pNetworkInfo1, IN OUT PDNS_RECORD * ppNsRecord1, IN PADDR_ARRAY pDnsServerList2, IN PDNS_NETINFO pNetworkInfo2, IN OUT PDNS_RECORD * ppNsRecord2, IN BOOL bDoNsCheck ); // // Status (dnsapi.c) // BOOL IsKnownNetFailure( VOID ); VOID SetKnownNetFailure( IN DNS_STATUS Status ); BOOL IsLocalIpAddress( IN IP4_ADDRESS IpAddress ); PDNS_NETINFO GetAdapterListFromCache( VOID ); // // IP Help API (iphelp.c) // VOID IpHelp_Cleanup( VOID ); PIP_ADAPTER_ADDRESSES IpHelp_GetAdaptersAddresses( IN ULONG Family, IN DWORD Flags ); DNS_STATUS IpHelp_ReadAddrsFromList( IN PVOID pAddrList, IN BOOL fUnicast, IN DWORD ScreenMask, OPTIONAL IN DWORD ScreenFlags, OPTIONAL OUT PDNS_ADDR_ARRAY * ppComboArray, OPTIONAL OUT PDNS_ADDR_ARRAY * pp6OnlyArray, OPTIONAL OUT PDNS_ADDR_ARRAY * pp4OnlyArray, OPTIONAL OUT PDWORD pCount6, OPTIONAL OUT PDWORD pCount4 OPTIONAL ); DNS_STATUS IpHelp_GetAdaptersInfo( OUT PIP_ADAPTER_INFO * ppAdapterInfo ); DNS_STATUS IpHelp_GetPerAdapterInfo( IN DWORD AdapterIndex, OUT PIP_PER_ADAPTER_INFO * ppPerAdapterInfo ); DNS_STATUS IpHelp_GetBestInterface( IN IP4_ADDRESS Ip4Addr, OUT PDWORD pdwInterfaceIndex ); DNS_STATUS IpHelp_ParseIpAddressString( IN OUT PIP4_ARRAY pIpArray, IN PIP_ADDR_STRING pIpAddrString, IN BOOL fGetSubnetMask, IN BOOL fReverse ); // // Private registry\config (regfig.c) // BOOL Reg_ReadDwordEnvar( IN DWORD dwFlag, OUT PENVAR_DWORD_INFO pEnvar ); DNS_STATUS Reg_DefaultAdapterInfo( OUT PREG_ADAPTER_INFO pBlob, IN PREG_GLOBAL_INFO pRegInfo, IN PIP_ADAPTER_ADDRESSES pIpAdapter ); // // Hosts file reading (hostfile.c) // BOOL HostsFile_Query( IN OUT PQUERY_BLOB pBlob ); // // Heap (memory.c) // DNS_STATUS Heap_Initialize( VOID ); VOID Heap_Cleanup( VOID ); // // Type specific config routines (config.c) // PADDR_ARRAY Config_GetDnsServerList( IN PWSTR pwsAdapterName, IN DWORD AddrFamily, IN BOOL fForce ); PIP4_ARRAY Config_GetDnsServerListIp4( IN PWSTR pwsAdapterName, IN BOOL fForce ); PDNS_GLOBALS_BLOB Config_GetDwordGlobals( IN DWORD Flag, IN DWORD AcceptLocalCacheTime OPTIONAL ); // // Network info (netinfo.c) // BOOL InitNetworkInfo( VOID ); VOID CleanupNetworkInfo( VOID ); PWSTR SearchList_GetNextName( IN OUT PSEARCH_LIST pSearchList, IN BOOL fReset, OUT PDWORD pdwSuffixFlags OPTIONAL ); PADDR_ARRAY NetInfo_ConvertToAddrArray( IN PDNS_NETINFO pNetInfo, IN PWSTR pwsAdapterName, IN DWORD Family OPTIONAL ); PDNS_NETINFO NetInfo_CreateForUpdate( IN PWSTR pszZone, IN PWSTR pszServerName, IN PDNS_ADDR_ARRAY pServerArray, IN DWORD dwFlags ); PDNS_NETINFO NetInfo_CreateFromAddrArray( IN PADDR_ARRAY pDnsServers, IN PDNS_ADDR pServerIp, IN BOOL fSearchInfo, IN PDNS_NETINFO pNetInfo OPTIONAL ); PWSTR NetInfo_UpdateZoneName( IN PDNS_NETINFO pNetInfo ); PWSTR NetInfo_UpdateServerName( IN PDNS_NETINFO pNetInfo ); BOOL NetInfo_IsForUpdate( IN PDNS_NETINFO pNetInfo ); VOID NetInfo_MarkDirty( VOID ); // // Adapter access // PDNS_ADAPTER NetInfo_GetNextAdapter( IN OUT PDNS_NETINFO pNetInfo ); #define NetInfo_AdapterLoopStart( pni ) ((pni)->AdapterIndex = 0) // // Netinfo_Get flags // #define NIFLAG_GET_LOCAL_ADDRS (0x10000000) #define NIFLAG_FORCE_REGISTRY_READ (0x00000001) #define NIFLAG_READ_RESOLVER_FIRST (0x00000010) #define NIFLAG_READ_RESOLVER (0x00000020) #define NIFLAG_READ_PROCESS_CACHE (0x00000100) PDNS_NETINFO NetInfo_Get( IN DWORD Flags, IN DWORD AcceptLocalCacheTime OPTIONAL ); // Default Use // - need local addrs // - accept from cache // - try resolver #define GetNetworkInfo() \ NetInfo_Get( \ NIFLAG_GET_LOCAL_ADDRS | \ NIFLAG_READ_RESOLVER | \ NIFLAG_READ_PROCESS_CACHE, \ 0 ) // Delete PIP4_ARRAY NetInfo_ConvertToIp4Array( IN PDNS_NETINFO pNetInfo ); // Delete PDNS_NETINFO NetInfo_CreateFromIp4Array( IN PIP4_ARRAY pDnsServers, IN IP4_ADDRESS ServerIp, IN BOOL fSearchInfo, IN PDNS_NETINFO pNetInfo OPTIONAL ); // Delete PDNS_NETINFO NetInfo_CreateForUpdateIp4( IN PWSTR pszZone, IN PWSTR pszServerName, IN PIP4_ARRAY pServ4Array, IN DWORD dwFlags ); // // Local address config from netinfo // #define DNS_CONFIG_FLAG_ADDR_PUBLIC (0x00000001) #define DNS_CONFIG_FLAG_ADDR_PRIVATE (0x00000002) #define DNS_CONFIG_FLAG_ADDR_CLUSTER (0x00000004) #define DNS_CONFIG_FLAG_ADDR_NON_CLUSTER (0x00000003) #define DNS_CONFIG_FLAG_ADDR_ALL (0x00000007) #define DNS_CONFIG_FLAG_READ_CLUSTER_ENVAR (0x00100000) PADDR_ARRAY NetInfo_CreateLocalAddrArray( IN PDNS_NETINFO pNetInfo, IN PWSTR pwsAdapterName, OPTIONAL IN PDNS_ADAPTER pAdapter, OPTIONAL IN DWORD Family, OPTIONAL IN DWORD AddrFlags OPTIONAL ); PDNS_ADDR_ARRAY NetInfo_GetLocalAddrArray( IN PDNS_NETINFO pNetInfo, IN PWSTR pwsAdapterName, OPTIONAL IN DWORD Family, OPTIONAL IN DWORD AddrFlags, OPTIONAL IN BOOL fForce ); PIP4_ARRAY NetInfo_GetLocalAddrArrayIp4( IN PWSTR pwsAdapterName, OPTIONAL IN DWORD AddrFlags, IN BOOL fForce ); // Private but used in servlist.c DNS_STATUS AdapterInfo_Copy( OUT PDNS_ADAPTER pCopy, IN PDNS_ADAPTER pAdapter ); PDNS_NETINFO NetInfo_Alloc( IN DWORD AdapterCount ); BOOL NetInfo_AddAdapter( IN OUT PDNS_NETINFO pNetInfo, IN PDNS_ADAPTER pAdapter ); // // Public config blob routines // VOID DnsSearchList_Free( IN PDNS_SEARCH_LIST pSearchList ); PDNS_SEARCH_LIST DnsSearchList_Get( IN DNS_CHARSET CharSet ); VOID DnsAdapterInfo_Free( IN OUT PDNS_ADAPTER_INFO pAdapter, IN BOOL fFreeAdapter ); VOID DnsNetworkInfo_Free( IN OUT PDNS_NETWORK_INFO pNetInfo ); PDNS_NETWORK_INFO DnsNetworkInfo_Get( IN DNS_CHARSET CharSet ); // // Routine for the old public structures: // DNS_NETWORK_INFORMATION // DNS_SEARCH_INFORMATION // DNS_ADAPTER_INFORMATION // VOID DnsSearchInformation_Free( IN PDNS_SEARCH_INFORMATION pSearchList ); PDNS_SEARCH_INFORMATION DnsSearchInformation_Get( VOID ); VOID DnsAdapterInformation_Free( IN OUT PDNS_ADAPTER_INFORMATION pAdapter ); VOID DnsNetworkInformation_Free( IN OUT PDNS_NETWORK_INFORMATION pNetInfo ); PDNS_NETWORK_INFORMATION DnsNetworkInformation_Get( VOID ); // // local IP info (localip.c) // PIP4_ARRAY LocalIp_GetIp4Array( VOID ); PADDR_ARRAY LocalIp_GetArray( VOID ); BOOL LocalIp_IsAddrLocal( IN PDNS_ADDR pAddr, IN PDNS_ADDR_ARRAY pLocalArray, OPTIONAL IN PDNS_NETINFO pNetInfo OPTIONAL ); // // send utils (send.c) // VOID Send_CleanupOptList( VOID ); // // socket utils (socket.c) // SOCKET Socket_CreateMessageSocket( IN OUT PDNS_MSG_BUF pMsg ); SOCKET Socket_GetUdp( IN INT Family ); VOID Socket_ReturnUdp( IN SOCKET Socket, IN INT Family ); // // Message parsing (packet.c) // VOID Dns_FreeParsedMessageFields( IN OUT PDNS_PARSED_MESSAGE pParse ); // // Extra info (util.c) // PDNS_EXTRA_INFO ExtraInfo_FindInList( IN OUT PDNS_EXTRA_INFO pExtraList, IN DWORD Id ); BOOL ExtraInfo_SetBasicResults( IN OUT PDNS_EXTRA_INFO pExtraList, IN PBASIC_RESULTS pResults ); PDNS_ADDR_ARRAY ExtraInfo_GetServerList( IN PDNS_EXTRA_INFO pExtraList ); PDNS_ADDR_ARRAY ExtraInfo_GetServerListPossiblyImbedded( IN PIP4_ARRAY pList ); VOID Util_SetBasicResults( OUT PBASIC_RESULTS pResults, IN DWORD Status, IN DWORD Rcode, IN PDNS_ADDR pServerAddr ); PDNS_ADDR_ARRAY Util_GetAddrArray( OUT PDWORD fCopy, IN PDNS_ADDR_ARRAY pServList, IN PIP4_ARRAY pServList4, IN PDNS_EXTRA_INFO pExtra ); VOID Util_GetActiveProtocols( OUT PBOOL pfRunning6, OUT PBOOL pfRunning4 ); #endif // _DNSAPILOCAL_INCLUDED_