203 lines
5.1 KiB
C
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_
|