add initial dnsserver dcerpc implementation

svn path=/trunk/; revision=25943
This commit is contained in:
Ronnie Sahlberg 2008-08-06 06:53:37 +00:00
parent d261400dea
commit 88d3b24a4e
2 changed files with 499 additions and 0 deletions

View File

@ -0,0 +1,97 @@
#
# DNS_RPC_NAME
#
MANUAL dnsserver_dissect_struct_DNS_RPC_NAME
HF_FIELD hf_dnsserver_DNS_RPC_NAME_name "Name" "dnsserver.DNS_RPC_NAME.name" FT_STRING BASE_NONE NULL 0 "" "" ""
#
# DNS_RPC_NODE
#
MANUAL dnsserver_dissect_element_DNS_RPC_NODE_RecordCount
MANUAL dnsserver_dissect_element_DNS_RPC_NODE_records
CODE START
#include "packet-smb-common.h"
int
dnsserver_dissect_struct_DNS_RPC_NAME(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *parent_tree _U_, guint8 *drep _U_, int hf_index _U_, guint32 param _U_)
{
proto_item *item = NULL;
proto_tree *tree = NULL;
int old_offset;
dcerpc_info *di = NULL;
guint8 len;
const char *dn;
int dn_len;
guint16 bc;
di=pinfo->private_data;
if(di->conformant_run){
/*just a run to handle conformant arrays, nothing to dissect */
return offset;
}
old_offset = offset;
if (parent_tree) {
item = proto_tree_add_item(parent_tree, hf_index, tvb, offset, -1, TRUE);
tree = proto_item_add_subtree(item, ett_dnsserver_DNS_RPC_NAME);
}
offset = dissect_ndr_uint8(tvb, offset, pinfo, tree, drep, hf_dnsserver_DNS_RPC_NAME_NameLength, &len);
bc = tvb_length_remaining(tvb, offset);
dn = get_unicode_or_ascii_string(tvb, &offset,
TRUE, &dn_len, TRUE, TRUE, &bc);
if (dn) {
proto_tree_add_string(tree, hf_dnsserver_DNS_RPC_NAME_name, tvb,
offset, dn_len,dn);
offset += dn_len;
}
proto_item_set_len(item, offset-old_offset);
return offset;
}
static guint16 node_record_count;
static int
dnsserver_dissect_element_DNS_RPC_NODE_RecordCount(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_)
{
dcerpc_info *di = NULL;
di=pinfo->private_data;
if(di->conformant_run){
/*just a run to handle conformant arrays, nothing to dissect */
return offset;
}
offset = dissect_ndr_uint16(tvb, offset, pinfo, tree, drep, hf_dnsserver_DNS_RPC_NODE_RecordCount, &node_record_count);
return offset;
}
static int
dnsserver_dissect_element_DNS_RPC_NODE_records(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, guint8 *drep _U_)
{
dcerpc_info *di = NULL;
di=pinfo->private_data;
if(di->conformant_run){
/*just a run to handle conformant arrays, nothing to dissect */
return offset;
}
while(node_record_count--){
offset = dnsserver_dissect_element_DNS_RPC_NODE_records_(tvb, offset, pinfo, tree, drep);
}
return offset;
}
CODE END

View File

@ -0,0 +1,402 @@
/*
dnsserver interface definition
*/
[ uuid("50abc2a4-574d-40b3-9d66-ee4fd5fba076"),
version(5.0),
pointer_default(unique),
helpstring("DNS Server")
] interface dnsserver
{
typedef [v1_enum] enum {
DNS_CLIENT_VERSION_W2K = 0x00000000,
DNS_CLIENT_VERSION_DOTNET = 0x00000006,
DNS_CLIENT_VERSION_LONGHORN = 0x00000007
} DNS_RPC_CLIENT_VERSION;
typedef [flag(NDR_ALIGN4)] struct {
uint8 OSMajorVersion;
uint8 OSMinorVersion;
uint16 ServicePackVersion;
} DNS_RPC_VERSION;
typedef [enum8bit] enum {
DNS_RPC_BOOT_METHOD_FILE = 0x01,
DNS_RPC_BOOT_METHOD_REGISTRY = 0x02,
DNS_RPC_BOOT_METHOD_DIRECTORY = 0x03
} DNS_RPC_BOOT_METHOD;
const uint32 DNS_LOG_LEVEL_ALL_PACKETS = 0x0000ffff;
const uint32 DNS_LOG_LEVEL_NON_QUERY = 0x000000fe;
typedef [bitmap32bit] bitmap {
DNS_LOG_LEVEL_QUERY = 0x00000001,
DNS_LOG_LEVEL_NOTIFY = 0x00000010,
DNS_LOG_LEVEL_UPDATE = 0x00000020,
DNS_LOG_LEVEL_QUESTIONS = 0x00000100,
DNS_LOG_LEVEL_ANSWERS = 0x00000200,
DNS_LOG_LEVEL_SEND = 0x00001000,
DNS_LOG_LEVEL_RECV = 0x00002000,
DNS_LOG_LEVEL_UDP = 0x00004000,
DNS_LOG_LEVEL_TCP = 0x00008000,
DNS_LOG_LEVEL_FULL_PACKETS = 0x01000000,
DNS_LOG_LEVEL_WRITE_THROUGH = 0x80000000
} DNS_LOG_LEVELS;
const uint32 DNS_RPC_USE_ALL_PROTOCOLS = 0xffffffff;
typedef [bitmap32bit] bitmap {
DNS_RPC_USE_TCPIP = 0x00000001,
DNS_RPC_USE_NAMED_PIPE = 0x00000002,
DNS_RPC_USE_LPC = 0x00000004
} DNS_RPC_PROTOCOLS;
typedef [v1_enum] enum {
DNS_ALLOW_RFC_NAMES_ONLY = 0x00000000,
DNS_ALLOW_NONRFC_NAMES = 0x00000001,
DNS_ALLOW_MULTIBYTE_NAMES = 0x00000002,
DNS_ALLOW_ALL_NAMES = 0x00000003
} DNS_NAME_CHECK_FLAGS;
typedef [enum16bit] enum {
DNS_TYPE_ZERO = 0x0000,
DNS_TYPE_A = 0x0001,
DNS_TYPE_NS = 0x0002,
DNS_TYPE_MD = 0x0003,
DNS_TYPE_MF = 0x0004,
DNS_TYPE_CNAME = 0x0005,
DNS_TYPE_SOA = 0x0006,
DNS_TYPE_MB = 0x0007,
DNS_TYPE_MG = 0x0008,
DNS_TYPE_MR = 0x0009,
DNS_TYPE_NULL = 0x000a,
DNS_TYPE_WKS = 0x000b,
DNS_TYPE_PTR = 0x000c,
DNS_TYPE_HINFO = 0x000d,
DNS_TYPE_MINFO = 0x000e,
DNS_TYPE_MX = 0x000f,
DNS_TYPE_TXT = 0x0010,
DNS_TYPE_RP = 0x0011,
DNS_TYPE_AFSDB = 0x0012,
DNS_TYPE_X25 = 0x0013,
DNS_TYPE_ISDN = 0x0014,
DNS_TYPE_RT = 0x0015,
DNS_TYPE_NSAP = 0x0016,
DNS_TYPE_NSAPPTR = 0x0017,
DNS_TYPE_SIG = 0x0018,
DNS_TYPE_KEY = 0x0019,
DNS_TYPE_PX = 0x001a,
DNS_TYPE_GPOS = 0x001b,
DNS_TYPE_AAAA = 0x001c,
DNS_TYPE_LOC = 0x001d,
DNS_TYPE_NXT = 0x001e,
DNS_TYPE_SRV = 0x0021,
DNS_TYPE_ATMA = 0x0022,
DNS_TYPE_NAPTR = 0x0023,
DNS_TYPE_DNAME = 0x0024,
DNS_TYPE_ALL = 0x00ff,
DNS_TYPE_WINS = 0xff01,
DNS_TYPE_WINSR = 0xff02
} DNS_RECORD_TYPE;
typedef [bitmap32bit] bitmap {
DNS_RPC_VIEW_AUTHORITY_DATA = 0x00000001,
DNS_RPC_VIEW_CACHE_DATA = 0x00000002,
DNS_RPC_VIEW_GLUE_DATA = 0x00000004,
DNS_RPC_VIEW_ROOT_HINT_DATA = 0x00000008,
DNS_RPC_VIEW_ADDITIONAL_DATA = 0x00000010,
DNS_RPC_VIEW_NO_CHILDREN = 0x00010000,
DNS_RPC_VIEW_ONLY_CHILDREN = 0x00020000
} DNS_SELECT_FLAGS;
typedef [bitmap32bit] bitmap {
DNS_RPC_FLAG_CACHE_DATA = 0x80000000,
DNS_RPC_FLAG_ZONE_ROOT = 0x40000000,
DNS_RPC_FLAG_AUTH_ZONE_ROOT = 0x20000000,
DNS_RPC_FLAG_ZONE_DELEGATION = 0x10000000,
DNS_RPC_FLAG_RECOR_DEFAULT_TTL = 0x08000000,
DNS_RPC_FLAG_RECORD_TTL_CHANGE = 0x04000000,
DNS_RPC_FLAG_RECORD_CREATE_PTR = 0x02000000,
DNS_RPC_FLAG_NODE_STICKY = 0x01000000,
DNS_RPC_FLAG_NODE_COMPLETE = 0x00800000,
DNS_RPC_FLAG_OPEN_ACL = 0x00040000,
DNS_RPC_FLAG_AGING_ON = 0x00020000,
DNS_RPC_FLAG_SUPPRESS_NOTIFY = 0x00010000
} DNS_RPC_NODE_FLAGS;
/* 2.2.2.2.1 this cant really be described in IDL :-( */
typedef struct {
uint8 NameLength;
uint8 Name[NameLength];
} DNS_RPC_NAME;
typedef struct {
DNS_RPC_NAME Name;
} DNS_RPC_RECORD_NODE_NAME;
// typedef [nodiscriminant] union {
typedef union {
[case(2)] DNS_RPC_RECORD_NODE_NAME NodeName;
} DNS_RPC_RECORD_UNION;
typedef struct {
uint16 DataLength; // size of
DNS_RECORD_TYPE Type;
uint32 Flags;
uint32 Serial;
uint32 TtlSeconds;
uint32 TimeStamp;
uint32 reserved;
[switch_is(Type)] DNS_RPC_RECORD_UNION record;
} DNS_RPC_RECORD;
typedef struct {
uint16 Length;
uint16 RecordCount;
DNS_RPC_NODE_FLAGS Flags;
uint32 Childcount;
DNS_RPC_NAME NodeName;
DNS_RPC_RECORD records[RecordCount];
} DNS_RPC_NODE;
/* XXX */
typedef struct {
uint32 AddrCount;
[size_is(AddrCount)] uint32 AddrArray[];
} IP4_ARRAY;
/* XXX */
typedef struct {
uint32 RpcStructureVersion;
uint32 reserved0;
DNS_RPC_VERSION Version;
DNS_RPC_BOOT_METHOD BootMethod;
boolean8 AdminConfigured;
boolean8 AllowUpdate;
boolean8 DsAvailable;
[unique, string] uint8 *ServerName;
[unique, string, charset(UTF16)] uint16 *DsContainer;
[unique] IP4_ARRAY *ServerAddrs;
[unique] IP4_ARRAY *ListenAddrs;
[unique] IP4_ARRAY *Forwarders;
[unique] IP4_ARRAY *LogFilter;
[unique, string, charset(UTF16)] uint16 *LogFilePath;
[unique, string] uint8 *DomainName;
[unique, string] uint8 *ForestName;
[unique, string] uint8 *DomainDirectoryPartition;
[unique, string] uint8 *ForestDirectoryPartition;
[unique, string] uint8 *extension0;
[unique, string] uint8 *extension1;
[unique, string] uint8 *extension2;
[unique, string] uint8 *extension3;
[unique, string] uint8 *extension4;
[unique, string] uint8 *extension5;
DNS_LOG_LEVELS LogLevel;
uint32 DebugLevel;
uint32 ForwardTimeout;
DNS_RPC_PROTOCOLS RpcProtocol;
DNS_NAME_CHECK_FLAGS NameCheckFlag;
uint32 AddressAnswerLimit;
uint32 RecursionRetry;
uint32 RecursionTimeout;
uint32 MaxCacheTtl;
uint32 DsPollingInterval;
uint32 LocalNetPriorityNetmask;
uint32 ScavengingInterval;
uint32 DefaultRefreshInterval;
uint32 DefaultNoRefreshInterval;
uint32 LastScavengeTime;
uint32 EventLogLevel;
uint32 LogFileMaxSize;
uint32 DsForestVersion;
uint32 DsDomainVersion;
uint32 DsDsaVersion;
uint32 reserve_array[4];
boolean8 AutoReverseZones;
boolean8 AutoCacheUpdate;
boolean8 RecurseAfterForwarding;
boolean8 ForwardDelegations;
boolean8 NoRecursion;
boolean8 SecureResponses;
boolean8 RoundRobin;
boolean8 LocalNetPriority;
boolean8 BindSecondaries;
boolean8 WriteAuthorityNs;
boolean8 StrictFileParsing;
boolean8 LooseWildcarding;
boolean8 DefaultAgingState;
boolean8 reserve_array2[15];
} DNS_RPC_SERVER_INFO_DOTNET;
/* XXX */
typedef [v1_enum, flag(NDR_PAHEX)] enum {
DNSSRV_TYPEID_NULL = 0,
DNSSRV_TYPEID_DWORD = 1,
DNSSRV_TYPEID_LPSTR = 2,
DNSSRV_TYPEID_LPWSTR = 3,
DNSSRV_TYPEID_IPARRAY = 4,
DNSSRV_TYPEID_BUFFER = 5,
DNSSRV_TYPEID_SERVER_INFO_W2K = 6,
DNSSRV_TYPEID_STATS = 7,
DNSSRV_TYPEID_FORWARDERS_W2K = 8,
DNSSRV_TYPEID_ZONE_W2K = 9,
DNSSRV_TYPEID_ZONE_INFO_W2K = 10,
DNSSRV_TYPEID_ZONE_SECONDARIES_W2K = 11,
DNSSRV_TYPEID_ZONE_DATABASE_W2K = 12,
DNSSRV_TYPEID_ZONE_TYPE_RESET_W2K = 13,
DNSSRV_TYPEID_ZONE_CREATE_W2K = 14,
DNSSRV_TYPEID_NAME_AND_PARAM = 15,
DNSSRV_TYPEID_ZONE_LIST_W2K = 16,
DNSSRV_TYPEID_ZONE_RENAME = 17,
DNSSRV_TYPEID_ZONE_EXPORT = 18,
DNSSRV_TYPEID_SERVER_INFO_DOTNET = 19,
DNSSRV_TYPEID_FORWARDERS_DOTNET = 20,
DNSSRV_TYPEID_ZONE = 21,
DNSSRV_TYPEID_ZONE_INFO_DOTNET = 22,
DNSSRV_TYPEID_ZONE_SECONDARIES_DOTNET = 23,
DNSSRV_TYPEID_ZONE_DATABASE = 24,
DNSSRV_TYPEID_ZONE_TYPE_RESET_DOTNET = 25,
DNSSRV_TYPEID_ZONE_CREATE_DOTNET = 26,
DNSSRV_TYPEID_ZONE_LIST = 27,
DNSSRV_TYPEID_DP_ENUM = 28,
DNSSRV_TYPEID_DP_INFO = 29,
DNSSRV_TYPEID_DP_LIST = 30,
DNSSRV_TYPEID_ENLIST_DP = 31,
DNSSRV_TYPEID_ZONE_CHANGE_DP = 32,
DNSSRV_TYPEID_ENUM_ZONES_FILTER = 33,
DNSSRV_TYPEID_ADDARRAY = 34,
DNSSRV_TYPEID_SERVER_INFO = 35,
DNSSRV_TYPEID_ZONE_INFO = 36,
DNSSRV_TYPEID_FORWARDERS = 37,
DNSSRV_TYPEID_ZONE_SECONDARIES = 38,
DNSSRV_TYPEID_ZONE_TYPE_RESET = 39,
DNSSRV_TYPEID_ZONE_CREATE = 40,
DNSSRV_TYPEID_IP_VALIDATE = 41,
DNSSRV_TYPEID_AUTOCONFIGURE = 42,
DNSSRV_TYPEID_UTF8_STRING_LIST = 43,
DNSSRV_TYPEID_UNICODE_STRING_LIST = 44
} DnssrvRpcTypeId;
typedef union {
[case(DNSSRV_TYPEID_NULL)] uint8 *null;
[case(DNSSRV_TYPEID_DWORD)] uint32 dword;
/* DNSSRV_TYPEID_LPSTR = 2,*/
/* DNSSRV_TYPEID_LPWSTR = 3,*/
/* DNSSRV_TYPEID_IPARRAY = 4,*/
/* DNSSRV_TYPEID_BUFFER = 5,*/
/* DNSSRV_TYPEID_SERVER_INFO_W2K = 6,*/
/* DNSSRV_TYPEID_STATS = 7,*/
/* DNSSRV_TYPEID_FORWARDERS_W2K = 8,*/
/* DNSSRV_TYPEID_ZONE_W2K = 9,*/
/* DNSSRV_TYPEID_ZONE_INFO_W2K = 10,*/
/* DNSSRV_TYPEID_ZONE_SECONDARIES_W2K = 11,*/
/* DNSSRV_TYPEID_ZONE_DATABASE_W2K = 12,*/
/* DNSSRV_TYPEID_ZONE_TYPE_RESET_W2K = 13,*/
/* DNSSRV_TYPEID_ZONE_CREATE_W2K = 14,*/
/* DNSSRV_TYPEID_NAME_AND_PARAM = 15,*/
/* DNSSRV_TYPEID_ZONE_LIST_W2K = 16,*/
/* DNSSRV_TYPEID_ZONE_RENAME = 17,*/
/* DNSSRV_TYPEID_ZONE_EXPORT = 18,*/
[case(DNSSRV_TYPEID_SERVER_INFO_DOTNET)] DNS_RPC_SERVER_INFO_DOTNET *ServerInfoDotnet;
/* DNSSRV_TYPEID_FORWARDERS_DOTNET = 20,*/
/* DNSSRV_TYPEID_ZONE = 21,*/
/* DNSSRV_TYPEID_ZONE_INFO_DOTNET = 22,*/
/* DNSSRV_TYPEID_ZONE_SECONDARIES_DOTNET = 23,*/
/* DNSSRV_TYPEID_ZONE_DATABASE = 24,*/
/* DNSSRV_TYPEID_ZONE_TYPE_RESET_DOTNET = 25,*/
/* DNSSRV_TYPEID_ZONE_CREATE_DOTNET = 26,*/
/* DNSSRV_TYPEID_ZONE_LIST = 27,*/
/* DNSSRV_TYPEID_DP_ENUM = 28,*/
/* DNSSRV_TYPEID_DP_INFO = 29,*/
/* DNSSRV_TYPEID_DP_LIST = 30,*/
/* DNSSRV_TYPEID_ENLIST_DP = 31,*/
/* DNSSRV_TYPEID_ZONE_CHANGE_DP = 32,*/
/* DNSSRV_TYPEID_ENUM_ZONES_FILTER = 33,*/
/* DNSSRV_TYPEID_ADDARRAY = 34,*/
/* DNSSRV_TYPEID_SERVER_INFO = 35,*/
/* DNSSRV_TYPEID_ZONE_INFO = 36,*/
/* DNSSRV_TYPEID_FORWARDERS = 37,*/
/* DNSSRV_TYPEID_ZONE_SECONDARIES = 38,*/
/* DNSSRV_TYPEID_ZONE_TYPE_RESET = 39,*/
/* DNSSRV_TYPEID_ZONE_CREATE = 40,*/
/* DNSSRV_TYPEID_IP_VALIDATE = 41,*/
/* DNSSRV_TYPEID_AUTOCONFIGURE = 42,*/
/* DNSSRV_TYPEID_UTF8_STRING_LIST = 43,*/
/* DNSSRV_TYPEID_UNICODE_STRING_LIST = 44*/
} DNSSRV_RPC_UNION;
/******************/
/* Function: 0x00 */
NTSTATUS DnssrvOperation (
);
/******************/
/* Function: 0x01 */
NTSTATUS DnssrvQuery (
);
/******************/
/* Function: 0x02 */
NTSTATUS DnssrvComplexOperation (
);
/******************/
/* Function: 0x03 */
NTSTATUS DnssrvEnumRecords (
);
/******************/
/* Function: 0x04 */
NTSTATUS DnssrvUpdateRecord (
);
/******************/
/* Function: 0x05 */
NTSTATUS DnssrvOperation2 (
);
/******************/
/* Function: 0x06 */
NTSTATUS DnssrvQuery2 (
[in] DNS_RPC_CLIENT_VERSION client_version,
[in] uint32 setting_flags,
[in, unique, string, charset(UTF16)] uint16 *server_name,
[in, unique, string] uint8 *zone,
[in, unique, string] uint8 *operation,
[out, ref] DnssrvRpcTypeId *type_id,
[out, ref, switch_is(*type_id)] DNSSRV_RPC_UNION *data
);
/******************/
/* Function: 0x07 */
NTSTATUS DnssrvComplexOperation2 (
);
typedef struct {
DNS_RPC_NODE rpc_node;
} DNS_RECORD_BUFFER;
/******************/
/* Function: 0x08 */
NTSTATUS DnssrvEnumRecords2 (
[in] DNS_RPC_CLIENT_VERSION client_version,
[in] uint32 setting_flags,
[in, unique, string, charset(UTF16)] uint16 *server_name,
[in, unique, string] uint8 *zone,
[in, unique, string] uint8 *node_name,
[in, unique, string] uint8 *start_child,
[in] DNS_RECORD_TYPE record_type,
[in] DNS_SELECT_FLAGS select_flag,
[in, unique, string] uint8 *filter_start,
[in, unique, string] uint8 *filter_stop,
[out,ref] uint32 *buffer_length,
[out, unique, subcontext(4)] DNS_RPC_NODE *record_buffer
);
/******************/
/* Function: 0x09 */
NTSTATUS DnssrvUpdateRecord2 (
);
}