windows-nt/Source/XPSP1/NT/ds/dns/dnslib/message.h
2020-09-26 16:20:57 +08:00

203 lines
5.1 KiB
C

/*++
Copyright (c) 1997-2000 Microsoft Corporation
Module Name:
message.h
Abstract:
Domain Name System (DNS) Library
DNS message and associated info buffer
Author:
Jim Gilroy (jamesg) January 1997
Revision History:
--*/
#ifndef _DNS_MESSAGE_INCLUDED_
#define _DNS_MESSAGE_INCLUDED_
#ifndef DNSSRV
//
// Define size of allocations, beyond message buffer itself
//
// - size of message info struct, outside of header
//
// Note: the lookname buffer is placed AFTER the message buffer.
//
// This allows us to avoid STRICT overwrite checking for small
// items writing RR to buffer:
// - compressed name
// - RR (or Question) struct
// - IP address (MX preference, SOA fixed fields)
//
// After RR write, we check whether we are over the end of the buffer
// and if so, we send and do not use lookup name info again anyway.
// Cool.
//
#define DNS_MESSAGE_INCLUDED_HEADER_LENGTH \
( sizeof(DNS_MSG_BUF) \
- sizeof(DNS_HEADER) \
- 1 )
//
// UDP allocation
//
#define DNS_UDP_ALLOC_LENGTH \
( DNS_MESSAGE_INCLUDED_HEADER_LENGTH + DNS_UDP_MAX_PACKET_LENGTH )
//
// DNS TCP allocation.
//
// Key point, is this is used almost entirely for zone transfer.
//
// - 16K is maximum compression offset (14bits) so a
// good default size for sending AXFR packets
//
// - realloc to get 64K message maximum.
//
// Note: Critical that packet lengths are DWORD aligned, as
// lookname buffer follows message at packet length.
//
#define DNS_TCP_DEFAULT_PACKET_LENGTH (0x4000)
#define DNS_TCP_DEFAULT_ALLOC_LENGTH (0x4000 + \
DNS_MESSAGE_INCLUDED_HEADER_LENGTH)
#define DNS_TCP_REALLOC_PACKET_LENGTH (0xfffc)
#define DNS_TCP_REALLOC_LENGTH (0xfffc + \
DNS_MESSAGE_INCLUDED_HEADER_LENGTH)
//
// Set fields for new query
//
// Always clear suballocation ptr fields that are deallocated
// by query free:
// - pRecurse
//
// Always default to deleting on send -- fDelete set TRUE.
//
// For debugging purposes dwQueuingTime serves as flag to
// indicate ON or OFF a packet queue.
//
// Lookup name buffer follows message buffer. See note above
// for explanation of this.
//
#define SET_MESSAGE_FOR_UDP_RECV( pMsg ) \
{ \
(pMsg)->fTcp = FALSE; \
(pMsg)->fSwapped = FALSE; \
(pMsg)->Timeout = 0; \
}
#define SET_MESSAGE_FOR_TCP_RECV( pMsg ) \
{ \
(pMsg)->fTcp = TRUE; \
(pMsg)->fSwapped = FALSE; \
(pMsg)->Timeout = 0; \
(pMsg)->fMessageComplete = FALSE; \
(pMsg)->MessageLength = 0; \
(pMsg)->pchRecv = NULL; \
}
//
// RR count writing
//
#define CURRENT_RR_COUNT_FIELD( pMsg ) \
(*(pMsg)->pCurrentCountField)
#define SET_CURRENT_RR_COUNT_SECTION( pMsg, section ) \
(pMsg)->pCurrentCountField = \
&(pMsg)->MessageHead.QuestionCount + (section);
#define SET_TO_WRITE_QUESTION_RECORDS(pMsg) \
(pMsg)->pCurrentCountField = &(pMsg)->MessageHead.QuestionCount;
#define SET_TO_WRITE_ANSWER_RECORDS(pMsg) \
(pMsg)->pCurrentCountField = &(pMsg)->MessageHead.AnswerCount;
#define SET_TO_WRITE_NAME_SERVER_RECORDS(pMsg) \
(pMsg)->pCurrentCountField = &(pMsg)->MessageHead.NameServerCount;
#define SET_TO_WRITE_AUTHORITY_RECORDS(pMsg) \
SET_TO_WRITE_NAME_SERVER_RECORDS(pMsg)
#define SET_TO_WRITE_ADDITIONAL_RECORDS(pMsg) \
(pMsg)->pCurrentCountField = &(pMsg)->MessageHead.AdditionalCount;
#define IS_SET_TO_WRITE_ANSWER_RECORDS(pMsg) \
((pMsg)->pCurrentCountField == &(pMsg)->MessageHead.AnswerCount)
#define IS_SET_TO_WRITE_AUTHORITY_RECORDS(pMsg) \
((pMsg)->pCurrentCountField == &(pMsg)->MessageHead.NameServerCount)
#define IS_SET_TO_WRITE_ADDITIONAL_RECORDS(pMsg) \
((pMsg)->pCurrentCountField == &(pMsg)->MessageHead.AdditionalCount)
#endif // no DNSSRV
//
// DNS Query info blob
//
typedef struct _QueryInfo
{
PSTR pName;
WORD wType;
WORD wRcode;
DWORD Flags;
DNS_STATUS Status;
DWORD MessageLength;
PBYTE pMessage;
PDNS_RECORD pRecordsAnswer;
PDNS_RECORD pRecordsAuthority;
PDNS_RECORD pRecordsAdditional;
PIP_ARRAY pDnsServerArray;
// private
PDNS_MSG_BUF pMsgSend;
PDNS_MSG_BUF pMsgRecv;
PDNS_NETINFO pNetworkInfo;
PVOID pfnGetIpAddressInfo;
SOCKET Socket;
DWORD ReturnFlags;
// maybe fold into Status
DNS_STATUS NetFailureStatus;
// maybe fold into ReturnFlags
BOOL CacheNegativeResponse;
}
QUERY_INFO; *PQUERY_INFO;
#endif // _DNS_MESSAGE_INCLUDED_