/*++ Copyright (c) 2000-2001 Microsoft Corporation Module Name: resrpc.h Abstract: Domain Name System (DNS) Resolver Header for RPC interface to resolver. Author: Jim Gilroy (jamesg) July 2000 Revision History: --*/ #ifndef _RESRPC_INCLUDED_ #define _RESRPC_INCLUDED_ #ifndef _DNSAPI_INCLUDE_ #include #endif // // Resolver service info // // Note: this stuff is not required for MIDL pass generation // but it is a convenient place to put information // that will be used on both server and client sides. // #define DNS_RESOLVER_SERVICE L"dnscache" #define RESOLVER_DLL TEXT("dnsrslvr.dll") #define RESOLVER_INTERFACE_NAME_A "DNSResolver" #define RESOLVER_INTERFACE_NAME_W L"DNSResolver" #define RESOLVER_RPC_PIPE_NAME_W (L"\\PIPE\\DNSRESOLVER") #define RESOLVER_RPC_LPC_ENDPOINT_W (L"DNSResolver") #define RESOLVER_RPC_TCP_PORT_W (L"") #define RESOLVER_RPC_USE_LPC 0x1 #define RESOLVER_RPC_USE_NAMED_PIPE 0x2 #define RESOLVER_RPC_USE_TCPIP 0x4 #define RESOLVER_RPC_USE_ALL_PROTOCOLS 0xffffffff // // Resolver proxy name (NULL by default). // // This is used in client stuffs for binding and // referenced (and settable) in dnsapi.dll caller. // #ifndef MIDL_PASS extern LPWSTR NetworkAddress; #endif // // DNS_RECORD // // Note: defintion in windns.h is not MIDL_PASS compliant // because MIDL does not like union with variable lenght types // // // MIDL is not happy about unions // Define the union explicitly with the switch // #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; // // DCR_QUESTION: need default block in record data def? // //[default] ; } DNS_RECORD_DATA_TYPES; // // 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. // #undef PDNS_RECORD typedef struct _DnsRecord { struct _DnsRecord * pNext; LPTSTR pName; WORD wType; WORD wDataLength; // Not referenced for DNS record types // defined above. DWORD Flags; DWORD dwTtl; DWORD dwReserved; [switch_is(wType)] DNS_RECORD_DATA_TYPES Data; } DNS_RECORD, *PDNS_RECORD; // // Header or fixed size of DNS_RECORD // #define DNS_RECORD_FIXED_SIZE FIELD_OFFSET( DNS_RECORD, Data ) #define SIZEOF_DNS_RECORD_HEADER DNS_RECORD_FIXED_SIZE #endif // MIDL_PASS // // RPC-able DNS type definitions // // In addition to windns.h \ dnsapi.h types. // See note below, we do have some multiple definition // problems with dnslib.h types. // // // Net adapter list structures // #ifndef ADDR_INFO_DEFINED typedef struct _DnsAddrInfo { IP4_ADDRESS IpAddr; IP4_ADDRESS SubnetMask; } DNS_ADDR_INFO, *PDNS_ADDR_INFO; typedef struct _DnsAddrArray { DWORD AddrCount; #ifdef MIDL_PASS [size_is(AddrCount)] DNS_ADDR_INFO AddrArray[]; #else DNS_ADDR_INFO AddrArray[0]; #endif } DNS_ADDR_ARRAY, *PDNS_ADDR_ARRAY; #define ADDR_INFO_DEFINED 1 #endif #define SIZE_FOR_ADDR_ARRAY(count) \ (sizeof(DNS_ADDR_ARRAY) + (count * sizeof(DNS_ADDR_INFO))) // // IP union // typedef struct _RpcIpUnion { BOOL IsIp6; IP6_ADDRESS Addr; } RPC_IP_UNION, *PRPC_IP_UNION; // // Cache stuff -- left over from Glenn // typedef struct _DWORD_LIST_ITEM_ { struct _DWORD_LIST_ITEM_ * pNext; DWORD Value1; DWORD Value2; } DWORD_LIST_ITEM, *PDWORD_LIST_ITEM; typedef struct _DNS_STATS_TABLE_ { struct _DNS_STATS_TABLE_ * pNext; PDWORD_LIST_ITEM pListItem; } DNS_STATS_TABLE, *PDNS_STATS_TABLE; typedef struct _DNS_RPC_CACHE_TABLE_ { struct _DNS_RPC_CACHE_TABLE_ * pNext; LPWSTR Name; WORD Type1; WORD Type2; WORD Type3; } DNS_RPC_CACHE_TABLE, *PDNS_RPC_CACHE_TABLE; // // Most of the resolver interface is poorly designed or // useless. For instance there is NO reason to have // turned any of the above into linked lists. // // We simply need definitions that are MIDL_PASS aware. // This should sit in a common header and be picked up // by dnslib.h. This must wait until dnslib.h is // private again OR we separate out the private stuff // like this in some fashion. // // Note, taking this private should also involve rename, // the PUBLIC structs are obviously the one's that should // have the "DNS" tag. (Amazing.) // // // Network Info // // DCR: these merge with defs in dnslib.h (take private) // typedef struct _RpcDnsServerInfo { DNS_STATUS Status; DWORD Priority; IP_ADDRESS IpAddress; DWORD AddressPad[3]; } RPC_DNS_SERVER_INFO, *PRPC_DNS_SERVER_INFO; typedef struct _RpcDnsAdapter { PSTR pszAdapterGuidName; PSTR pszAdapterDomain; PIP_ARRAY pAdapterIPAddresses; PIP_ARRAY pAdapterIPSubnetMasks; DWORD InterfaceIndex; DWORD InfoFlags; DWORD Reserved; DWORD Status; DWORD RunFlags; DWORD ServerIndex; DWORD ServerCount; DWORD MaxServerCount; #ifdef MIDL_PASS [size_is(MaxServerCount)] RPC_DNS_SERVER_INFO ServerArray[]; #else RPC_DNS_SERVER_INFO ServerArray[1]; #endif } RPC_DNS_ADAPTER, *PRPC_DNS_ADAPTER; typedef struct _SearchName { PSTR pszName; DWORD Flags; } RPC_SEARCH_NAME, *PRPC_SEARCH_NAME; typedef struct _RpcSearchList { PSTR pszDomainOrZoneName; DWORD NameCount; // Zero for FindAuthoritativeZone DWORD MaxNameCount; // Zero for FindAuthoritativeZone DWORD CurrentNameIndex; // 0 for pszDomainOrZoneName // 1 for first name in array below // ... #ifdef MIDL_PASS [size_is(MaxNameCount)] RPC_SEARCH_NAME SearchNameArray[]; #else RPC_SEARCH_NAME SearchNameArray[1]; #endif } RPC_SEARCH_LIST, *PRPC_SEARCH_LIST; typedef struct _RpcDnsNetInfo { PSTR pszDomainName; PSTR pszHostName; PRPC_SEARCH_LIST pSearchList; DWORD TimeStamp; DWORD InfoFlags; DWORD Tag; DWORD ReturnFlags; DWORD AdapterCount; DWORD MaxAdapterCount; #ifdef MIDL_PASS [size_is(MaxAdapterCount)] PRPC_DNS_ADAPTER AdapterArray[]; #else PRPC_DNS_ADAPTER AdapterArray[1]; #endif } RPC_DNS_NETINFO, *PRPC_DNS_NETINFO; // // Environment variable reading (dnsapi\envar.c) // typedef struct _EnvarDwordInfo { DWORD Id; DWORD Value; BOOL fFound; } ENVAR_DWORD_INFO, *PENVAR_DWORD_INFO; // // Query blob // typedef struct _RpcQueryBlob { PWSTR pName; WORD wType; DWORD Flags; DNS_STATUS Status; PDNS_RECORD pRecords; } RPC_QUERY_BLOB, *PRPC_QUERY_BLOB; // // Cache Enumeration // typedef struct { DWORD EnumTag; DWORD MaxCount; WORD Type; DWORD Flags; PWSTR pName; PWSTR pNameFilter; } DNS_CACHE_ENUM_REQUEST, *PDNS_CACHE_ENUM_REQUEST; typedef struct _DnsCacheEntry { PWSTR pName; PDNS_RECORD pRecords; DWORD Flags; WORD wType; WORD wPad; } DNS_CACHE_ENTRY, *PDNS_CACHE_ENTRY; typedef struct _DnsCacheEnum { DWORD TotalCount; DWORD EnumTagStart; DWORD EnumTagStop; DWORD EnumCount; #ifdef MIDL_PASS [size_is(EnumCount)] DNS_CACHE_ENTRY EntryArray[]; #else DNS_CACHE_ENTRY EntryArray[1]; #endif } DNS_CACHE_ENUM, *PDNS_CACHE_ENUM; #endif // _RESRPC_INCLUDED_