/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
dnsapi.h
Abstract:
Domain Name System (DNS) Server
DNS Server API to support admin clients.
Author:
Jim Gilroy (jamesg) September 23, 1995
Revision History:
Dan Morin (t-danmo) 28-Nov-95 Changed LPSTR to LPCSTR on most APIs
--*/
#ifndef _DNSAPI_INCLUDED_
#define _DNSAPI_INCLUDED_
#ifdef __cplusplus
extern "C"
{
#endif // _cplusplus
//
// Use stdcall for our API conventions
//
// Explicitly state this as C++ compiler will otherwise
// assume cdecl.
//
#define DNS_API_FUNCTION __stdcall
//
// Basic DNS definitions
//
#define DNS_MAX_NAME_LENGTH (255)
//
// RPC interface
//
#define DNS_INTERFACE_NAME "DNSSERVER"
//
// RPC security
//
#define DNS_RPC_SECURITY "DnsServerApp"
#define DNS_RPC_SECURITY_AUTH_ID 10
//
// RPC transports
//
#define DNS_RPC_NAMED_PIPE "\\PIPE\\DNSSERVER"
#define DNS_RPC_SERVER_PORT ""
#define DNS_RPC_LPC_EP "DNSSERVERLPC"
#define DNS_RPC_USE_TCPIP 0x1
#define DNS_RPC_USE_NAMED_PIPE 0x2
#define DNS_RPC_USE_LPC 0x4
#define DNS_RPC_USE_ALL_PROTOCOLS 0xffffffff
//
// DNS public types
//
typedef LONG DNS_STATUS, *PDNS_STATUS;
typedef DWORD DNS_HANDLE, *PDNS_HANDLE;
typedef DWORD DNS_APIOP;
typedef DWORD IP_ADDRESS, *PIP_ADDRESS;
//
// IP Address Array type
//
#if defined(MIDL_PASS)
#define LPSTR [string] char *
#define LPCSTR [string] const char *
typedef struct _IP_ARRAY
{
DWORD cAddrCount;
[size_is( cAddrCount )] IP_ADDRESS aipAddrs[];
}
IP_ARRAY, *PIP_ARRAY;
#else
typedef struct _IP_ARRAY
{
DWORD cAddrCount;
IP_ADDRESS aipAddrs[];
}
IP_ARRAY, *PIP_ARRAY;
#endif
//
// DNS API Errors
//
#define DNS_ERROR_MASK 0xcc000000
#define DNS_ERROR_SERVER_FAILURE 0xcc000001
#define DNS_ERROR_NOT_YET_IMPLEMENTED 0xcc000002
#define DNS_ERROR_OLD_API 0xcc000003
#define DNS_ERROR_NAME_DOES_NOT_EXIST 0xcc000010
#define DNS_ERROR_INVALID_NAME 0xcc000011
#define DNS_ERROR_INVALID_IP_ADDRESS 0xcc000012
#define DNS_ERROR_INVALID_DATA 0xcc000013
//
// Packet format
//
#define DNS_INFO_NO_RECORDS 0x4c000030
#define DNS_INFO_NAME_ERROR 0x4c000031
#define DNS_ERROR_RCODE 0xcc000032
#define DNS_ERROR_MESSAGE_FORMAT 0xcc000033
#define DNS_ERROR_MESSAGE_HEADER_FORMAT 0xcc000034
//
// Zone errors
//
#define DNS_ERROR_ZONE_DOES_NOT_EXIST 0xcc000101
#define DNS_ERROR_NO_ZONE_INFO 0xcc000102
#define DNS_ERROR_INVALID_ZONE_OPERATION 0xcc000103
#define DNS_ERROR_ZONE_CONFIGURATION_ERROR 0xcc000104
#define DNS_ERROR_ZONE_HAS_NO_SOA_RECORD 0xcc000105
#define DNS_ERROR_ZONE_HAS_NO_NS_RECORDS 0xcc000106
#define DNS_ERROR_ZONE_LOCKED 0xcc000107
#define DNS_ERROR_ZONE_CREATION_FAILED 0xcc000110
#define DNS_ERROR_ZONE_ALREADY_EXISTS 0xcc000111
#define DNS_ERROR_AUTOZONE_ALREADY_EXISTS 0xcc000112
#define DNS_ERROR_INVALID_ZONE_TYPE 0xcc000113
#define DNS_ERROR_SECONDARY_REQUIRES_MASTER_IP 0xcc000114
#define DNS_ERROR_ZONE_NOT_SECONDARY 0xcc000120
#define DNS_ERROR_NEED_SECONDARY_ADDRESSES 0xcc000121
#define DNS_ERROR_WINS_INIT_FAILED 0xcc000122
#define DNS_ERROR_NEED_WINS_SERVERS 0xcc000123
#define DNS_ERROR_NBSTAT_INIT_FAILED 0xcc000124
#define DNS_ERROR_SOA_DELETE_INVALID 0xcc000125
//
// Datafile errors
//
#define DNS_ERROR_PRIMARY_REQUIRES_DATAFILE 0xcc000201
#define DNS_ERROR_INVALID_DATAFILE_NAME 0xcc000202
#define DNS_ERROR_DATAFILE_OPEN_FAILURE 0xcc000203
#define DNS_ERROR_FILE_WRITEBACK_FAILED 0xcc000204
#define DNS_ERROR_DATAFILE_PARSING 0xcc000205
//
// Database errors
//
#define DNS_ERROR_RECORD_DOES_NOT_EXIST 0xcc000300
#define DNS_ERROR_RECORD_FORMAT 0xcc000301
#define DNS_ERROR_NODE_CREATION_FAILED 0xcc000302
#define DNS_ERROR_UNKNOWN_RECORD_TYPE 0xcc000303
#define DNS_ERROR_RECORD_TIMED_OUT 0xcc000304
#define DNS_ERROR_NAME_NOT_IN_ZONE 0xcc000305
#define DNS_ERROR_CNAME_LOOP 0xcc000306
#define DNS_ERROR_NODE_IS_CNAME 0xcc000307
#define DNS_ERROR_CNAME_COLLISION 0xcc000308
#define DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOT 0xcc000309
#define DNS_ERROR_RECORD_ALREADY_EXISTS 0xcc000310
#define DNS_ERROR_SECONDARY_DATA 0xcc000311
#define DNS_ERROR_NO_CREATE_CACHE_DATA 0xcc000312
#define DNS_WARNING_PTR_CREATE_FAILED 0x8c000332
#define DNS_WARNING_DOMAIN_UNDELETED 0x8c000333
//
// Operation errors
//
#define DNS_INFO_AXFR_COMPLETE 0x4c000403
#define DNS_ERROR_AXFR 0xcc000404
#define DNS_INFO_ADDED_LOCAL_WINS 0x4c000405
//
// DNS Server information
//
typedef struct _DNS_SERVER_INFO
{
DWORD dwVersion;
LPSTR pszServerName;
// boot
DWORD fBootRegistry;
// IP interfaces
PIP_ARRAY aipServerAddrs;
PIP_ARRAY aipListenAddrs;
// recursion lookup timeout
DWORD dwRecursionTimeout;
// forwarders
PIP_ARRAY aipForwarders;
DWORD dwForwardTimeout;
DWORD fSlave;
// save some space, just in case
DWORD pvReserved1;
DWORD pvReserved2;
DWORD pvReserved3;
}
DNS_SERVER_INFO, *PDNS_SERVER_INFO;
//
// Server configuration API
//
DNS_STATUS
DNS_API_FUNCTION
DnsGetServerInfo(
IN LPCSTR pszServer,
OUT PDNS_SERVER_INFO * ppServerInfo
);
VOID
DNS_API_FUNCTION
DnsFreeServerInfo(
IN OUT PDNS_SERVER_INFO pServerInfo
);
DNS_STATUS
DNS_API_FUNCTION
DnsResetBootMethod(
IN LPCSTR pszServer,
IN DWORD fBootRegistry
);
DNS_STATUS
DNS_API_FUNCTION
DnsResetServerListenAddresses(
IN LPCSTR pszServer,
IN DWORD cListenAddrs,
IN PIP_ADDRESS aipListenAddrs
);
DNS_STATUS
DNS_API_FUNCTION
DnsResetForwarders(
IN LPCSTR pszServer,
IN DWORD cForwarders,
IN PIP_ADDRESS aipForwarders,
IN DWORD dwForwardTimeout,
IN DWORD fSlave
);
//
// DNS server statistics
//
typedef struct _DNS_SYSTEMTIME
{
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
}
DNS_SYSTEMTIME;
typedef struct _DNS_STATISTICS
{
//
// Queries and responses
//
DWORD UdpQueries;
DWORD UdpResponses;
DWORD UdpQueriesSent;
DWORD UdpResponsesReceived;
DWORD TcpClientConnections;
DWORD TcpQueries;
DWORD TcpResponses;
DWORD TcpQueriesSent;
DWORD TcpResponsesReceived;
//
// Recursion
//
DWORD RecurseLookups;
DWORD RecurseResponses;
DWORD RecursePasses;
DWORD RecurseQuestions;
DWORD RecurseForwards;
DWORD RecurseTimeouts;
DWORD RecurseFailures;
DWORD RecursePartialFailures;
DWORD RecurseRootQuery;
DWORD RecurseRootResponse;
DWORD RecurseTcpTry;
DWORD RecurseTcpQuery;
DWORD RecurseTcpResponse;
// Recursion Packets
DWORD RecursePacketUsed;
DWORD RecursePacketReturn;
//
// WINS lookup
//
DWORD WinsLookups;
DWORD WinsResponses;
DWORD WinsReverseLookups;
DWORD WinsReverseResponses;
// Zone transfer secondary
DWORD SecSoaQueries;
DWORD SecSoaResponses;
DWORD SecNotifyReceived;
DWORD SecAxfrRequested;
DWORD SecAxfrRejected;
DWORD SecAxfrFailed;
DWORD SecAxfrSuccessful;
// Zone transfer master
DWORD MasterNotifySent;
DWORD MasterAxfrReceived;
DWORD MasterAxfrInvalid;
DWORD MasterAxfrRefused;
DWORD MasterAxfrDenied;
DWORD MasterAxfrFailed;
DWORD MasterAxfrSuccessful;
//
// Database
//
DWORD DatabaseMemory;
//
// Nodes
//
DWORD NodeAlloc;
DWORD NodeFree;
DWORD NodeNetAllocs;
DWORD NodeMemory;
DWORD NodeInUse;
DWORD NodeUsed;
DWORD NodeReturn;
DWORD NodeStdAlloc;
DWORD NodeStdUsed;
DWORD NodeStdReturn;
DWORD NodeInFreeList;
//
// Resource Records
//
DWORD RecordAlloc;
DWORD RecordFree;
DWORD RecordNetAllocs;
DWORD RecordMemory;
DWORD RecordInUse;
DWORD RecordUsed;
DWORD RecordReturn;
DWORD RecordStdAlloc;
DWORD RecordStdUsed;
DWORD RecordStdReturn;
DWORD RecordInFreeList;
//
// RR caching
//
DWORD CacheRRTotal;
DWORD CacheRRCurrent;
DWORD CacheRRTimeouts;
//
// Packet memory
//
// UDP Packets
DWORD UdpAlloc;
DWORD UdpFree;
DWORD UdpNetAllocs;
DWORD UdpMemory;
DWORD UdpUsed;
DWORD UdpReturn;
DWORD UdpResponseReturn;
DWORD UdpQueryReturn;
DWORD UdpInUse;
DWORD UdpInFreeList;
// TCP Packets
DWORD TcpAlloc;
DWORD TcpRealloc;
DWORD TcpFree;
DWORD TcpNetAllocs;
DWORD TcpMemory;
//
// Nbstat Memory
//
DWORD NbstatAlloc;
DWORD NbstatFree;
DWORD NbstatNetAllocs;
DWORD NbstatMemory;
DWORD NbstatUsed;
DWORD NbstatReturn;
DWORD NbstatInUse;
DWORD NbstatInFreeList;
//
// stats since when
//
DWORD ServerStartTimeSeconds;
DWORD LastClearTimeSeconds;
DWORD SecondsSinceServerStart;
DWORD SecondsSinceLastClear;
DNS_SYSTEMTIME ServerStartTime;
DNS_SYSTEMTIME LastClearTime;
}
DNS_STATISTICS, *PDNS_STATISTICS;
//
// cover old stat fields
//
#define dwCurrentStartTime CurrentStartTime
#define dwUdpQueries UdpQueries
#define dwUdpResponses UdpResponses
#define dwTcpClientConnections TcpClientConnections
#define dwTcpQueries TcpQueries
#define dwTcpResponses TcpResponses
#define dwRecursiveLookups RecurseLookups
#define dwRecursiveResponses RecurseResponses
#define dwWinsForwardLookups WinsLookups
#define dwWinsForwardResponses WinsResponses
#define dwWinsReverseLookups WinsReverseLookups
#define dwWinsReverseResponses WinsReverseResponses
#define TimeOfLastClear LastClearTime
//
// Statistics API
//
DNS_STATUS
DNS_API_FUNCTION
DnsGetStatistics(
IN LPCSTR pszServer,
OUT PDNS_STATISTICS * ppStatistics
);
VOID
DNS_API_FUNCTION
DnsFreeStatistics(
IN OUT PDNS_STATISTICS pStatistics
);
DNS_STATUS
DNS_API_FUNCTION
DnsClearStatistics(
IN LPCSTR pszServer
);
//
// DNS Zone information
//
#define DNS_ZONE_TYPE_CACHE (0)
#define DNS_ZONE_TYPE_PRIMARY (1)
#define DNS_ZONE_TYPE_SECONDARY (2)
typedef struct _DNS_ZONE_INFO
{
DNS_HANDLE hZone;
LPSTR pszZoneName;
DWORD dwZoneType;
DWORD fReverse;
DWORD fPaused;
DWORD fShutdown;
DWORD fAutoCreated;
// Database info
DWORD fUseDatabase;
LPSTR pszDataFile;
// Masters
PIP_ARRAY aipMasters;
// Secondaries
PIP_ARRAY aipSecondaries;
DWORD fSecureSecondaries;
// WINS or Nbstat lookup
DWORD fUseWins;
DWORD fUseNbstat;
// save some space, just inase
// avoid versioning issues if possible
DWORD pvReserved1;
DWORD pvReserved2;
DWORD pvReserved3;
DWORD pvReserved4;
DWORD pvReserved5;
DWORD pvReserved6;
DWORD pvReserved7;
DWORD pvReserved8;
DWORD pvReserved9;
}
DNS_ZONE_INFO, *PDNS_ZONE_INFO;
//
// Zone configuration API
//
DNS_STATUS
DNS_API_FUNCTION
DnsEnumZoneHandles(
IN LPCSTR pszServer,
OUT PDWORD pZoneCount,
IN DWORD dwArrayLength,
OUT DNS_HANDLE ahZones[]
);
DNS_STATUS
DNS_API_FUNCTION
DnsGetZoneInfo(
IN LPCSTR pszServer,
IN DNS_HANDLE hZone,
OUT PDNS_ZONE_INFO * ppZoneInfo
);
VOID
DNS_API_FUNCTION
DnsFreeZoneInfo(
IN OUT PDNS_ZONE_INFO pZoneInfo
);
DNS_STATUS
DNS_API_FUNCTION
DnsEnumZoneInfo(
IN LPCSTR pszServer,
OUT PDWORD pdwZoneCount,
IN DWORD dwArrayLength,
OUT PDNS_ZONE_INFO apZones[]
);
DNS_STATUS
DNS_API_FUNCTION
DnsResetZoneType(
IN LPCSTR pszServer,
IN DNS_HANDLE hZone,
IN DWORD dwZoneType,
IN DWORD cMasters,
IN PIP_ADDRESS aipMasters
);
DNS_STATUS
DNS_API_FUNCTION
DnsResetZoneDatabase(
IN LPCSTR pszServer,
IN DNS_HANDLE hZone,
IN DWORD fUseDatabase,
IN LPCSTR pszDataFile
);
DNS_STATUS
DNS_API_FUNCTION
DnsResetZoneMasters(
IN LPCSTR pszServer,
IN DNS_HANDLE hZone,
IN DWORD cMasters,
IN PIP_ADDRESS aipMasters
);
DNS_STATUS
DNS_API_FUNCTION
DnsResetZoneSecondaries(
IN LPCSTR pszServer,
IN DNS_HANDLE hZone,
IN DWORD fSecureSecondaries,
IN DWORD cSecondaries,
IN PIP_ADDRESS aipSecondaries
);
//
// Zone management
//
DNS_STATUS
DNS_API_FUNCTION
DnsCreateZone(
IN LPCSTR pszServer,
OUT PDNS_HANDLE phZone,
IN LPCSTR pszZoneName,
IN DWORD dwZoneType,
IN LPCSTR pszAdminEmailName,
IN DWORD cMasters,
IN PIP_ADDRESS aipMasters,
IN DWORD dwUseDatabase,
IN LPCSTR pszDataFile
);
DNS_STATUS
DNS_API_FUNCTION
DnsDelegateSubZone(
IN LPCSTR pszServer,
IN DNS_HANDLE hZone,
IN LPCSTR pszSubZone,
IN LPCSTR pszNewServer,
IN IP_ADDRESS ipNewServerAddr
);
DNS_STATUS
DNS_API_FUNCTION
DnsIncrementZoneVersion(
IN LPCSTR pszServer,
IN DNS_HANDLE hZone
);
DNS_STATUS
DNS_API_FUNCTION
DnsDeleteZone(
IN LPCSTR pszServer,
IN DNS_HANDLE hZone
);
DNS_STATUS
DNS_API_FUNCTION
DnsPauseZone(
IN LPCSTR pszServer,
IN DNS_HANDLE hZone
);
DNS_STATUS
DNS_API_FUNCTION
DnsResumeZone(
IN LPCSTR pszServer,
IN DNS_HANDLE hZone
);
//
// DNS Resource Records
//
// RFC 1034/1035
#define DNS_TYPE_A 0x0001 // 1
#define DNS_TYPE_NS 0x0002 // 2
#define DNS_TYPE_MD 0x0003 // 3
#define DNS_TYPE_MF 0x0004 // 4
#define DNS_TYPE_CNAME 0x0005 // 5
#define DNS_TYPE_SOA 0x0006 // 6
#define DNS_TYPE_MB 0x0007 // 7
#define DNS_TYPE_MG 0x0008 // 8
#define DNS_TYPE_MR 0x0009 // 9
#define DNS_TYPE_NULL 0x000a // 10
#define DNS_TYPE_WKS 0x000b // 11
#define DNS_TYPE_PTR 0x000c // 12
#define DNS_TYPE_HINFO 0x000d // 13
#define DNS_TYPE_MINFO 0x000e // 14
#define DNS_TYPE_MX 0x000f // 15
#define DNS_TYPE_TEXT 0x0010 // 16
// RFC 1183
#define DNS_TYPE_RP 0x0011 // 17
#define DNS_TYPE_AFSDB 0x0012 // 18
#define DNS_TYPE_X25 0x0013 // 19
#define DNS_TYPE_ISDN 0x0014 // 20
#define DNS_TYPE_RT 0x0015 // 21
// RFC 1348
#define DNS_TYPE_NSAP 0x0016 // 22
#define DNS_TYPE_NSAPPTR 0x0017 // 23
// DNS security draft dnssec-secext
#define DNS_TYPE_SIG 0x0018 // 24
#define DNS_TYPE_KEY 0x0019 // 25
// RFC 1664 (X.400 mail)
#define DNS_TYPE_PX 0x001a // 26
//
#define DNS_TYPE_GPOS 0x001b // 27
// RFC 1886 (IPng Address)
#define DNS_TYPE_AAAA 0x001c // 28
//
// Query only types (1035, IXFR draft)
//
#define DNS_TYPE_IXFR 0x00fb // 251
#define DNS_TYPE_AXFR 0x00fc // 252
#define DNS_TYPE_MAILB 0x00fd // 253
#define DNS_TYPE_MAILA 0x00fe // 254
#define DNS_TYPE_ALL 0x00ff // 255
//
// Temp Microsoft types -- use until get IANA approval for real type
//
#define DNS_TYPE_WINS 0xff01 // 64K - 255
#define DNS_TYPE_NBSTAT 0xff02 // 64K - 254
//
// Node name structure for DNS names on the wire
//
typedef struct _DnsRpcName
{
UCHAR cchNameLength;
CHAR achName[];
}
DNS_RPC_NAME, *PDNS_RPC_NAME, DNS_STRING, *PDNS_STRING;
//
// Node flags
//
#define DNS_RPC_NODE_FLAG_COMPLETE 0x80000000
#define DNS_RPC_NODE_FLAG_STICKY 0x01000000
//
// DNS node structure for on the wire
//
typedef struct _DnsRpcNode
{
WORD wLength;
WORD wRecordCount;
DWORD dwFlags;
DWORD dwChildCount;
DNS_RPC_NAME dnsNodeName;
}
DNS_RPC_NODE, *PDNS_RPC_NODE;
#define SIZEOF_DNS_RPC_NODE_HEADER (3*sizeof(DWORD))
//
// Resource Record Flags
//
#define DNS_RPC_RECORD_FLAG_CACHE_DATA 0x80000000
#define DNS_RPC_RECORD_FLAG_ZONE_ROOT 0x40000000
#define DNS_RPC_RECORD_FLAG_AUTH_ZONE_ROOT 0x20000000
#define DNS_RPC_RECORD_FLAG_DEFAULT_TTL 0x08000000
#define DNS_RPC_RECORD_FLAG_TTL_CHANGE 0x04000000
#define DNS_RPC_RECORD_FLAG_CREATE_PTR 0x02000000
#define DNS_RPC_RECORD_FLAG_LOCAL_TYPE 0x01000000
//
// Resource record structure for passing records on the wire
//
// For efficiency, all these fields are aligned.
// When buffered for transmission, all RR should start on DWORD
// aligned boundary.
//
typedef struct _DnsRpcRecord
{
WORD wRecordLength;
WORD wType;
WORD wClass;
WORD wDataLength;
DNS_HANDLE hRecord;
DWORD dwFlags;
DWORD dwTtlSeconds;
union
{
struct
{
IP_ADDRESS ipAddress;
}
A;
struct
{
DWORD dwSerialNo;
DWORD dwRefresh;
DWORD dwRetry;
DWORD dwExpire;
DWORD dwMinimumTtl;
DNS_RPC_NAME namePrimaryServer;
// responsible party follows in buffer
}
SOA, Soa;
struct
{
DNS_RPC_NAME nameNode;
}
PTR, Ptr,
NS, Ns,
CNAME, Cname,
MB, Mb,
MD, Md,
MF, Mf,
MG, Mg,
MR, Mr;
struct
{
DNS_RPC_NAME nameMailBox;
// errors to mailbox follows in buffer
}
MINFO, Minfo,
RP, Rp;
struct
{
WORD wPreference;
DNS_RPC_NAME nameExchange;
}
MX, Mx,
AFSDB, Afsdb,
RT, Rt;
struct
{
DNS_STRING stringData;
// one or more strings may follow
}
AAAA,
HINFO, Hinfo,
ISDN, Isdn,
TXT, Txt,
X25;
struct
{
BYTE bData[];
}
Null;
struct
{
IP_ADDRESS ipAddress;
UCHAR chProtocol;
BYTE bBitMask[1];
}
WKS, Wks;
//
// MS types
//
struct
{
DWORD dwMappingFlag;
DWORD dwLookupTimeout;
DWORD dwCacheTimeout;
DWORD cWinsServerCount;
IP_ADDRESS aipWinsServers[];
}
WINS, Wins;
struct
{
DWORD dwMappingFlag;
DWORD dwLookupTimeout;
DWORD dwCacheTimeout;
DNS_RPC_NAME nameResultDomain;
}
NBSTAT, Nbstat;
} Data;
}
DNS_RPC_RECORD, *PDNS_RPC_RECORD;
#define SIZEOF_DNS_RPC_RECORD_HEADER \
(4*sizeof(WORD) + 2*sizeof(DWORD) + sizeof(DNS_HANDLE))
#if 0
#define SIZEOF_DNS_RPC_RECORD_FIXED_FIELD2 \
(sizeof(DNS_RPC_RECORD) - sizeof(struct _DnsRpcRecord.Data))
#define SIZEOF_DNS_RPC_RECORD_FIXED_FIELD3 \
(sizeof(DNS_RPC_RECORD) - sizeof(DNS_RPC_RECORD.Data))
#endif
//
// WINS + NBSTAT params
// - flags
// - default lookup timeout
// - default cache timeout
//
#define DNS_WINS_FLAG_SCOPE (0x80000000)
#define DNS_WINS_FLAG_LOCAL (0x00010000)
#define DNS_WINS_DEFAULT_LOOKUP_TIMEOUT (5) // 5 secs
#define DNS_WINS_DEFAULT_CACHE_TIMEOUT (600) // 10 minutes
//
// Helpful record macros
// - no side effects in arguments
//
#define DNS_GET_NEXT_NAME(pname) \
(PDNS_RPC_NAME) (pname->achName + pname->cchNameLength)
#define DNS_IS_NAME_IN_RECORD(pRecord, pname) \
( (PCHAR)pRecord + pRecord->wRecordLength \
>= \
pname->achName + pname->cchNameLength )
//
// Note, for simplicity/efficiency ALL structures are DWORD aligned in
// buffers on the wire.
//
// This macro returns DWORD aligned ptr at given ptr our next DWORD
// aligned postion. Set ptr immediately after record or name structure
// and this will return starting position of next structure.
//
#define DNS_NEXT_DWORD_PTR(ptr) ((PBYTE) ((DWORD)((PBYTE)ptr + 3) & ~(DWORD)3))
#define DNS_IS_DWORD_ALIGNED(p) ( !((DWORD)(p) & (DWORD)3) )
//
// Record viewing API
//
DNS_STATUS
DNS_API_FUNCTION
DnsEnumNodeRecords(
IN LPCSTR pszServer,
IN LPCSTR pszNodeName,
IN WORD wRecordType,
IN DWORD fNoCacheData,
IN OUT PDWORD pdwBufferLength,
OUT BYTE abBuffer[]
);
DNS_STATUS
DNS_API_FUNCTION
DnsEnumChildNodesAndRecords(
IN LPCSTR pszServer,
IN LPCSTR pszNodeName,
IN LPCSTR pszStartChild,
IN WORD wRecordType,
IN DWORD fNoCacheData,
IN OUT PDWORD pdwBufferLength,
OUT BYTE abBuffer[]
);
DNS_STATUS
DNS_API_FUNCTION
R_DnsGetZoneWinsInfo(
IN LPCSTR Server,
IN DNS_HANDLE hZone,
OUT PDWORD pfUsingWins,
IN OUT PDWORD pdwBufferLength,
OUT BYTE abBuffer[]
);
PCHAR
DNS_API_FUNCTION
DnsRecordTypeStringForType(
IN WORD wType
);
//
// Record management API
//
DNS_STATUS
DNS_API_FUNCTION
DnsUpdateRecord(
IN LPCSTR pszServer,
IN DNS_HANDLE hZone,
IN LPCSTR pszNodeName,
IN OUT PDNS_HANDLE hRecord,
IN DWORD dwDataLength,
IN BYTE abData[]
);
DNS_STATUS
DNS_API_FUNCTION
DnsDeleteRecord(
IN LPCSTR pszServer,
IN LPCSTR pszNodeName,
IN DNS_HANDLE hRecord
);
DNS_STATUS
DNS_API_FUNCTION
DnsDeleteName(
IN LPCSTR pszServer,
IN LPCSTR pszNodeName,
IN DWORD fDeleteSubtree
);
DNS_STATUS
DNS_API_FUNCTION
R_DnsUpdateWinsRecord(
IN LPCSTR Server,
IN DNS_HANDLE hZone,
IN DWORD dwDataLength,
IN BYTE abData[]
);
//
// Debug printing utils
//
VOID
DNS_API_FUNCTION
DnsInitializeDebug(
IN BOOL fFromConsole
);
#if 0
VOID
DNS_API_FUNCTION
DnsPrintf(
IN CHAR *Format,
...
);
VOID
DNS_API_FUNCTION
DnsEndDebug(
VOID
);
//
// Server info printing
//
VOID
DNS_API_FUNCTION
DnsPrintServerInfo(
IN VOID PrintRoutine( CHAR * Format, ... ),
IN LPSTR pszHeader,
IN PDNS_SERVER_INFO pServerInfo
);
VOID
DNS_API_FUNCTION
DnsPrintStatistics(
IN VOID PrintRoutine( CHAR * Format, ... ),
IN LPSTR pszHeader,
IN PDNS_STATISTICS pStatistics
);
//
// Zone info printing
//
VOID
DNS_API_FUNCTION
DnsPrintZoneHandleList(
IN VOID PrintRoutine( CHAR * Format, ... ),
IN LPSTR pszHeader,
IN DWORD dwZoneCount,
IN DNS_HANDLE ahZones[]
);
VOID
DNS_API_FUNCTION
DnsPrintZoneInfo(
IN VOID PrintRoutine( CHAR * Format, ... ),
IN LPSTR pszHeader,
IN PDNS_ZONE_INFO pZoneInfo
);
VOID
DNS_API_FUNCTION
DnsPrintZoneInfoList(
IN VOID PrintRoutine( CHAR * Format, ... ),
IN LPSTR pszHeader,
IN DWORD dwZoneCount,
IN PDNS_ZONE_INFO apZoneInfo[]
);
//
// Node and record buffer printing
//
VOID
DNS_API_FUNCTION
DnsPrintName(
IN VOID PrintRoutine( CHAR * Format, ... ),
IN LPSTR pszHeader,
IN PDNS_RPC_NAME pName,
IN LPSTR pszTrailer
);
VOID
DNS_API_FUNCTION
DnsPrintNode(
IN VOID PrintRoutine( CHAR * Format, ... ),
IN LPSTR pszHeader,
IN PDNS_RPC_NODE pNode
);
VOID
DNS_API_FUNCTION
DnsPrintRecord(
IN VOID PrintRoutine( CHAR * Format, ... ),
IN LPSTR pszHeader,
IN PDNS_RPC_RECORD pRecord
);
VOID
DNS_API_FUNCTION
DnsPrintRecordsInBuffer(
IN VOID PrintRoutine( CHAR * Format, ... ),
IN LPSTR pszHeader,
IN DWORD dwBufferLength,
IN BYTE abBuffer[]
);
//
// General print utility
//
VOID
DNS_API_FUNCTION
DnsPrintIpAddressArray(
IN VOID PrintRoutine( CHAR * Format, ... ),
IN LPSTR pszHeader,
IN LPSTR pszName,
IN DWORD dwIpAddrCount,
IN PIP_ADDRESS pIpAddrs
);
#endif
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // _DNSAPI_INCLUDED_