/* packet-dcerpc-fileexp.c
 *
 * Routines for DCE DFS File Exporter dissection
 * Copyright 2002, Jaime Fournier <Jaime.Fournier@hush.com>
 * This information is based off the released idl files from opengroup.
 * ftp://ftp.opengroup.org/pub/dce122/dce/src/file.tar.gz file/fsint/afs4int.idl
 *
 * $Id$
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#include "config.h"

#include <glib.h>

#include <epan/packet.h>
#include <epan/exceptions.h>

#include "packet-dcerpc.h"
#include "packet-dcerpc-dce122.h"

#define AFS_SETMODTIME  1
#define AFS_SETOWNER  2
#define AFS_SETGROUP  4
#define AFS_SETMODE  8
#define AFS_SETACCESSTIME  0x10
#define AFS_SETCHANGETIME  0x20
#define AFS_SETLENGTH  0x40
#define AFS_SETTYPEUUID  0x80
#define AFS_SETDEVNUM  0x100
#define AFS_SETMODEXACT  0x200
#define AFS_SETTRUNCLENGTH  0x400
#define AFS_SETCLIENTSPARE  0x800

#define TKN_LOCK_READ                   0x001
#define TKN_LOCK_WRITE                  0x002
#define TKN_DATA_READ                   0x004
#define TKN_DATA_WRITE                  0x008
#define TKN_OPEN_READ                   0x010
#define TKN_OPEN_WRITE                  0x020
#define TKN_OPEN_SHARED                 0x040
#define TKN_OPEN_EXCLUSIVE              0x080
#define TKN_OPEN_DELETE                 0x100
#define TKN_OPEN_PRESERVE               0x200
#define TKN_STATUS_READ                 0x400
#define TKN_STATUS_WRITE                0x800
#define TKN_OPEN_UNLINK                 0x1000
#define TKN_SPOT_HERE                   0x2000
#define TKN_SPOT_THERE                  0x4000
#define TKN_OPEN_NO_READ                0x8000
#define TKN_OPEN_NO_WRITE               0x10000
#define TKN_OPEN_NO_UNLINK              0x20000

#define AFS_CONN_PARAM_HOSTLIFE  0
#define AFS_CONN_PARAM_HOSTRPC  1
#define AFS_CONN_PARAM_DEADSERVER  2
#define AFS_CONN_PARAM_EPOCH 3
#define AFS_CONN_PARAM_MAXFILE_CLIENT  4
#define AFS_CONN_PARAM_MAXFILE_SERVER  5
#define AFS_CONN_PARAM_HOST_TYPE_CLIENT 6
#define AFS_CONN_PARAM_HOST_TYPE_SERVER 7
#define AFS_CONN_PARAM_FT_MASK_CLIENT 8
#define AFS_CONN_PARAM_FT_MASK_SERVER 9
#define AFS_CONN_PARAM_SUPPORTS_64BITS 0x10000
#define AFS_CONN_PARAM_512BYTE_BLOCKS 0x20000

#define AFS_FLAG_SEC_SERVICE             0x1
#define AFS_FLAG_CONTEXT_NEW_IF          0x2
#define AFS_FLAG_CONTEXT_DO_RESET        0x4
#define AFS_FLAG_CONTEXT_NEW_ACL_IF      0x8
#define AFS_FLAG_CONTEXT_NEW_TKN_TYPES  0x10

#define AFS_FLAG_RETURNTOKEN           1
#define AFS_FLAG_TOKENJUMPQUEUE        2
#define AFS_FLAG_SKIPTOKEN             4
#define AFS_FLAG_NOOPTIMISM           0x8
#define AFS_FLAG_TOKENID              0x10
#define AFS_FLAG_RETURNBLOCKER        0x20
#define AFS_FLAG_ASYNCGRANT           0x40
#define AFS_FLAG_NOREVOKE             0x80
#define AFS_FLAG_MOVE_REESTABLISH     0x100
#define AFS_FLAG_SERVER_REESTABLISH   0x200
#define AFS_FLAG_NO_NEW_EPOCH         0x400
#define AFS_FLAG_MOVE_SOURCE_OK       0x800
#define AFS_FLAG_SYNC                 0x1000
#define AFS_FLAG_ZERO                 0x2000
#define AFS_FLAG_SKIPSTATUS           0x4000
#define AFS_FLAG_FORCEREVOCATIONS     0x8000
#define AFS_FLAG_FORCEVOLQUIESCE      0x10000
#define AFS_FLAG_FORCEREVOCATIONDOWN  0x20000

static int hf_fileexp_opnum = -1;


static int hf_fileexp_afsFid_cell_high = -1;
static int hf_fileexp_afsuuid_uuid = -1;
static int hf_fileexp_fetchdata_pipe_t_size = -1;
static int hf_fileexp_afsNameString_t_principalName_string = -1;
static int hf_fileexp_afsFid_cell_low = -1;
static int hf_fileexp_afsFid_volume_high = -1;
static int hf_fileexp_afsFid_volume_low = -1;
static int hf_fileexp_afsFid_Vnode = -1;
static int hf_fileexp_afsFid_Unique = -1;
static int hf_fileexp_interfaceversion = -1;
static int hf_fileexp_filetype = -1;
static int hf_fileexp_linkcount = -1;
static int hf_fileexp_length_high = -1;
static int hf_fileexp_length_low = -1;
static int hf_fileexp_dataversion_high = -1;
static int hf_fileexp_dataversion_low = -1;
static int hf_fileexp_author = -1;
static int hf_fileexp_owner = -1;
static int hf_fileexp_group = -1;
static int hf_fileexp_calleraccess = -1;
static int hf_fileexp_anonymousaccess = -1;
static int hf_fileexp_aclexpirationtime = -1;
static int hf_fileexp_mode = -1;
static int hf_fileexp_parentvnode = -1;
static int hf_fileexp_parentunique = -1;
static int hf_fileexp_modtime_sec = -1;
static int hf_fileexp_modtime_msec = -1;
static int hf_fileexp_changetime_sec = -1;
static int hf_fileexp_changetime_msec = -1;
static int hf_fileexp_accesstime_sec = -1;
static int hf_fileexp_accesstime_msec = -1;
static int hf_fileexp_servermodtime_sec = -1;
static int hf_fileexp_servermodtime_msec = -1;
static int hf_fileexp_typeuuid = -1;
static int hf_fileexp_objectuuid = -1;
static int hf_fileexp_devicenumber = -1;
static int hf_fileexp_blocksused = -1;
static int hf_fileexp_clientspare1 = -1;
static int hf_fileexp_devicenumberhighbits = -1;
static int hf_fileexp_agtypeunique = -1;
static int hf_fileexp_himaxspare = -1;
static int hf_fileexp_lomaxspare = -1;
static int hf_fileexp_pathconfspare = -1;
static int hf_fileexp_spare4 = -1;
static int hf_fileexp_spare5 = -1;
static int hf_fileexp_spare6 = -1;
static int hf_fileexp_volid_hi = -1;
static int hf_fileexp_volid_low = -1;
static int hf_fileexp_vvage = -1;
static int hf_fileexp_vv_hi = -1;
static int hf_fileexp_vv_low = -1;
static int hf_fileexp_vvpingage = -1;
static int hf_fileexp_vvspare1 = -1;
static int hf_fileexp_vvspare2 = -1;
static int hf_fileexp_beginrange = -1;
static int hf_fileexp_beginrangeext = -1;
static int hf_fileexp_endrange = -1;
static int hf_fileexp_endrangeext = -1;
static int hf_fileexp_expirationtime = -1;
static int hf_fileexp_tokenid_hi = -1;
static int hf_fileexp_tokenid_low = -1;
static int hf_fileexp_type_hi = -1;
static int hf_fileexp_type_low = -1;
static int hf_fileexp_tn_length = -1;
static int hf_fileexp_storestatus_accesstime_sec = -1;
static int hf_fileexp_storestatus_accesstime_usec = -1;
static int hf_fileexp_storestatus_changetime_sec = -1;
static int hf_fileexp_storestatus_changetime_usec = -1;
static int hf_fileexp_storestatus_clientspare1 = -1;
static int hf_fileexp_storestatus_cmask = -1;
static int hf_fileexp_storestatus_devicenumber = -1;
static int hf_fileexp_storestatus_devicenumberhighbits = -1;
static int hf_fileexp_storestatus_devicetype = -1;
static int hf_fileexp_storestatus_group = -1;
static int hf_fileexp_storestatus_length_high = -1;
static int hf_fileexp_storestatus_length_low = -1;
static int hf_fileexp_storestatus_mask = -1;
static int hf_fileexp_storestatus_mode = -1;
static int hf_fileexp_storestatus_modtime_sec = -1;
static int hf_fileexp_storestatus_modtime_usec = -1;
static int hf_fileexp_storestatus_owner = -1;
static int hf_fileexp_storestatus_spare1 = -1;
static int hf_fileexp_storestatus_spare2 = -1;
static int hf_fileexp_storestatus_spare3 = -1;
static int hf_fileexp_storestatus_spare4 = -1;
static int hf_fileexp_storestatus_spare5 = -1;
static int hf_fileexp_storestatus_spare6 = -1;
static int hf_fileexp_storestatus_trunc_high = -1;
static int hf_afsconnparams_mask = -1;
static int hf_fileexp_storestatus_trunc_low = -1;
static int hf_fileexp_storestatus_typeuuid = -1;
static int hf_fileexp_l_end_pos = -1;
static int hf_fileexp_l_end_pos_ext = -1;
static int hf_fileexp_l_fstype = -1;
static int hf_fileexp_l_pid = -1;
static int hf_fileexp_l_start_pos = -1;
static int hf_fileexp_l_start_pos_ext = -1;
static int hf_fileexp_l_sysid = -1;
static int hf_fileexp_l_type = -1;
static int hf_fileexp_l_whence = -1;
static int hf_fileexp_acl_len = -1;
static int hf_fileexp_setcontext_rqst_epochtime = -1;
static int hf_fileexp_setcontext_rqst_clientsizesattrs = -1;
static int hf_fileexp_setcontext_rqst_parm7 = -1;
static int hf_fileexp_afsNetAddr_type = -1;
static int hf_fileexp_afsNetAddr_data = -1;
static int hf_fileexp_returntokenidp_high = -1;
static int hf_fileexp_minvvp_low = -1;
static int hf_fileexp_position_high = -1;
static int hf_fileexp_position_low = -1;
static int hf_fileexp_offsetp_high = -1;
static int hf_fileexp_nextoffsetp_low = -1;
static int hf_fileexp_cellidp_high = -1;
static int hf_afserrorstatus_st = -1;
static int hf_fileexp_length = -1;
static int hf_afsconnparams_values = -1;
static int hf_fileexp_acltype = -1;
static int hf_fileexp_afsTaggedPath_tp_chars = -1;
static int hf_fileexp_afsTaggedPath_tp_tag = -1;
static int hf_fileexp_afsacl_uuid1 = -1;
static int hf_fileexp_bulkfetchstatus_size = -1;
static int hf_fileexp_flags = -1;
static int hf_fileexp_afsreturndesc_tokenid_high = -1;
static int hf_fileexp_afsreturndesc_tokenid_low = -1;
static int hf_fileexp_afsreturndesc_type_high = -1;
static int hf_fileexp_afsreturndesc_type_low = -1;
static int hf_fileexp_returntokenidp_low = -1;
static int hf_fileexp_minvvp_high = -1;
static int hf_fileexp_offsetp_low = -1;
static int hf_fileexp_nextoffsetp_high = -1;
static int hf_fileexp_cellidp_low = -1;
static int hf_fileexp_tn_tag = -1;
static int hf_fileexp_tn_string = -1;
static int hf_fileexp_bulkfetchvv_numvols = -1;
static int hf_fileexp_bulkfetchvv_spare1 = -1;
static int hf_fileexp_bulkfetchvv_spare2 = -1;
static int hf_fileexp_bulkkeepalive_numexecfids = -1;
static int hf_fileexp_bulkkeepalive_spare4 = -1;
static int hf_fileexp_bulkkeepalive_spare2 = -1;
static int hf_fileexp_bulkkeepalive_spare1 = -1;
static int hf_fileexp_afsacl_defaultcell_uuid = -1;
static int hf_fileexp_gettime_syncdispersion = -1;
static int hf_fileexp_gettime_syncdistance = -1;
static int hf_fileexp_gettime_usecondsp = -1;
static int hf_fileexp_readdir_size = -1;
static int hf_fileexp_afsNameString_t_principalName_size = -1;
static int hf_fileexp_afsTaggedPath_tp_length = -1;
static int hf_fileexp_fstype = -1;
static int hf_fileexp_gettime_secondsp = -1;

static int proto_fileexp = -1;

static gint ett_fileexp = -1;
static gint ett_fileexp_afsFid = -1;
static gint ett_fileexp_afsReturnDesc = -1;
static gint ett_fileexp_afsNetAddr = -1;
static gint ett_fileexp_fetchstatus = -1;
static gint ett_fileexp_afsflags = -1;
static gint ett_fileexp_volsync = -1;
static gint ett_fileexp_minvvp = -1;
static gint ett_fileexp_afsfidtaggedname = -1;
static gint ett_fileexp_afstaggedname = -1;
static gint ett_fileexp_afstoken = -1;
static gint ett_fileexp_afsstorestatus = -1;
static gint ett_fileexp_afsRecordLock = -1;
static gint ett_fileexp_afsAcl = -1;
static gint ett_fileexp_afsNameString_t = -1;
static gint ett_fileexp_afsConnParams = -1;
static gint ett_fileexp_afsErrorStatus = -1;
static gint ett_fileexp_afsNetData = -1;
static gint ett_fileexp_afsTaggedPath = -1;
static gint ett_fileexp_afsBulkStat = -1;
static gint ett_fileexp_afsuuid = -1;
static gint ett_fileexp_offsetp = -1;
static gint ett_fileexp_returntokenidp = -1;
static gint ett_fileexp_afsbundled_stat = -1;


/* vars for our macro(s) */
static int hf_error_st = -1;

static e_uuid_t uuid_fileexp =
  { 0x4d37f2dd, 0xed93, 0x0000, {0x02, 0xc0, 0x37, 0xcf, 0x1e, 0x00, 0x00,
				 0x00}
};
static guint16 ver_fileexp = 4;

/* XXX the only macro that I could not find the right way to convert easily.
The reason is because we reset col_info if st is non zero for many rpcs.
This is because on error, many structures are filled with garbage.
We end up not knowing if data is valid until we get the st var at the very end of the stubdata..
We can not just jump to the end, because more often than not an extra buffer exists in payload
after st. Thus we have to advance on each item until we read in ST, then we clear col_info. on error
A good example is FetchStatus() on a file that returns ENOEXIST.
inode, volume, etc all will be garbage.
*/

#define MACRO_ST_CLEAR(name) \
  { \
    guint32 st; \
    const char *st_str; \
    offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, di, drep, hf_error_st, &st); \
    st_str = val_to_str_ext (st, &dce_error_vals_ext, "%u"); \
    if (st){ \
      col_add_fstr (pinfo->cinfo, COL_INFO, "%s st:%s ", name, st_str); \
    }else{ \
      col_append_fstr (pinfo->cinfo, COL_INFO, " st:%s ", st_str); \
    } \
  }

static int
dissect_afsFid (tvbuff_t * tvb, int offset,
		packet_info * pinfo, proto_tree * parent_tree, dcerpc_info *di, guint8 *drep)
{

/*
        afsHyper Cell;
        afsHyper Volume;
        unsigned32 Vnode;
        unsigned32 Unique;
*/


  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 volume_low, unique, vnode, inode;

  if (di->conformant_run)
    {
      return offset;
    }



  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1, "afsFid:");
      tree = proto_item_add_subtree (item, ett_fileexp_afsFid);
    }


  offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			       hf_fileexp_afsFid_cell_high, NULL);

  offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			       hf_fileexp_afsFid_cell_low, NULL);

  offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			       hf_fileexp_afsFid_volume_high, NULL);

  offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			       hf_fileexp_afsFid_volume_low, &volume_low);

  offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			       hf_fileexp_afsFid_Vnode, &vnode);

  offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			       hf_fileexp_afsFid_Unique, &unique);

  col_append_fstr (pinfo->cinfo, COL_INFO, " :FSID:%u ", volume_low);

  if ((vnode == 1) || (vnode == 2))
    {
      col_append_str (pinfo->cinfo, COL_INFO, " InFS ");
    }
  else
    {
      inode = ((volume_low << 16) + vnode) & 0x7fffffff;
      col_append_fstr (pinfo->cinfo, COL_INFO, " inode:%u ", inode);
    }

  proto_item_set_len (item, offset - old_offset);
  return offset;
}

static int
dissect_afsConnParams (tvbuff_t * tvb, int offset,
		       packet_info * pinfo, proto_tree * parent_tree,
		       dcerpc_info *di, guint8 *drep)
{

/*
        unsigned32 Mask;
        unsigned32 Values[20];
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 mask, Values[20];

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item =
	proto_tree_add_text (parent_tree, tvb, offset, -1,
			     "afsConnParams_t:");
      tree = proto_item_add_subtree (item, ett_fileexp_afsConnParams);
    }
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_mask, &mask);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[0]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[1]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[2]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[3]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[4]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[5]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[6]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[7]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[8]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[9]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[10]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[11]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[12]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[13]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[14]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[15]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[16]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[17]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[18]);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_afsconnparams_values, &Values[19]);
  if ((mask & AFS_CONN_PARAM_HOSTLIFE) == AFS_CONN_PARAM_HOSTLIFE)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":HOSTLIFE");
    }
  if ((mask & AFS_CONN_PARAM_HOSTRPC) == AFS_CONN_PARAM_HOSTRPC)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":HOSTRPC");
    }
  if ((mask & AFS_CONN_PARAM_DEADSERVER) == AFS_CONN_PARAM_DEADSERVER)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":DEADSERVER");
    }
  if ((mask & AFS_CONN_PARAM_EPOCH) == AFS_CONN_PARAM_EPOCH)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":EPOCH");
    }
  if ((mask & AFS_CONN_PARAM_MAXFILE_CLIENT) == AFS_CONN_PARAM_MAXFILE_CLIENT)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":MAXFILE_CLIENT");
    }
  if ((mask & AFS_CONN_PARAM_MAXFILE_SERVER) == AFS_CONN_PARAM_MAXFILE_SERVER)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":MAXFILE_SERVER");
    }
  if ((mask & AFS_CONN_PARAM_HOST_TYPE_CLIENT) ==
      AFS_CONN_PARAM_HOST_TYPE_CLIENT)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":HOST_TYPE_CLIENT");
    }
  if ((mask & AFS_CONN_PARAM_HOST_TYPE_SERVER) ==
      AFS_CONN_PARAM_HOST_TYPE_SERVER)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":HOST_TYPE_SERVER");
    }
  if ((mask & AFS_CONN_PARAM_FT_MASK_CLIENT) == AFS_CONN_PARAM_FT_MASK_CLIENT)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":FT_MASK_CLIENT");
    }
  if ((mask & AFS_CONN_PARAM_FT_MASK_SERVER) == AFS_CONN_PARAM_FT_MASK_SERVER)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":FT_MASK_SERVER");
    }
  if ((mask & AFS_CONN_PARAM_SUPPORTS_64BITS) ==
      AFS_CONN_PARAM_SUPPORTS_64BITS)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":SUPPORTS_64BITS");
    }
  if ((mask & AFS_CONN_PARAM_512BYTE_BLOCKS) == AFS_CONN_PARAM_512BYTE_BLOCKS)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":512BYTE_BLOCKS");
    }
  col_append_fstr (pinfo->cinfo, COL_INFO,
		     " Values:%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u",
		     Values[0], Values[1], Values[2], Values[3],
		     Values[4], Values[5], Values[6], Values[7], Values[8],
		     Values[9], Values[10], Values[11], Values[12],
		     Values[13], Values[14], Values[15], Values[16],
		     Values[17], Values[18], Values[19]);

  proto_item_set_len (item, offset - old_offset);
  return offset;
}

static int
dissect_afsNameString_t (tvbuff_t * tvb, int offset,
			 packet_info * pinfo, proto_tree * parent_tree,
			 dcerpc_info *di, guint8 *drep)
{

/*
typedef [string] byte   NameString_t[AFS_NAMEMAX];
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
#define AFS_NAMEMAX    256
  guint32 string_size;
  const guint8 *namestring;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item =
	proto_tree_add_text (parent_tree, tvb, offset, -1,
			     "afsNameString_t:");
      tree = proto_item_add_subtree (item, ett_fileexp_afsNameString_t);
    }

 offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_afsNameString_t_principalName_size,
			&string_size);
	col_append_fstr (pinfo->cinfo, COL_INFO, " String_size:%u", string_size);
  if (string_size < AFS_NAMEMAX)
    {
      proto_tree_add_item (tree, hf_fileexp_afsNameString_t_principalName_string, tvb, offset, string_size, ENC_ASCII|ENC_NA);
      namestring = tvb_get_string (wmem_packet_scope(), tvb, offset, string_size);
      offset += string_size;
	col_append_fstr (pinfo->cinfo, COL_INFO, " Principal:%s", namestring);
    }
  else
    {
	col_append_fstr (pinfo->cinfo, COL_INFO,
			 " :FIXME!: Invalid string length of  %u",
			 string_size);
    }

  proto_item_set_len (item, offset - old_offset);
  return offset;
}


static int
dissect_afsNetAddr (tvbuff_t * tvb, int offset,
		    packet_info * pinfo, proto_tree * parent_tree, dcerpc_info *di, guint8 *drep)
{

/*                 unsigned16 type;
                   unsigned8 data[14];
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint16 type;
  guint8 data;
  int i;

  if (di->conformant_run)
    {
      return offset;
    }

  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1,
				  "afsNetAddr:");
      tree = proto_item_add_subtree (item, ett_fileexp_afsNetAddr);
    }


  offset =
    dissect_ndr_uint16 (tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_afsNetAddr_type, &type);

  if (type)
    {
	col_append_fstr (pinfo->cinfo, COL_INFO, " Type:%u ", type);


      for (i = 0; i < 14; i++)
	{

	  offset =
	    dissect_ndr_uint8 (tvb, offset, pinfo, tree, di, drep,
			       hf_fileexp_afsNetAddr_data, &data);


	  switch (i)
	    {
	    case 1:
	      if (data)
		{
		    col_append_fstr (pinfo->cinfo, COL_INFO, " Port:%u",
				     data);
		}
	      break;
	    case 2:
		col_append_fstr (pinfo->cinfo, COL_INFO, " IP:%u.", data);
	      break;
	    case 3:
		col_append_fstr (pinfo->cinfo, COL_INFO, "%u.", data);
	      break;
	    case 4:
		col_append_fstr (pinfo->cinfo, COL_INFO, "%u.", data);
	      break;
	    case 5:
		col_append_fstr (pinfo->cinfo, COL_INFO, "%u", data);
	      break;
	    }

	}

    }
  else
    {

      offset += 14;		/* space left after reading in type for the array. */
    }


  proto_item_set_len (item, offset - old_offset);
  return offset;
}


static int
dissect_afsNetData (tvbuff_t * tvb, int offset,
		    packet_info * pinfo, proto_tree * parent_tree, dcerpc_info *di, guint8 *drep)
{
/*
	afsNetAddr sockAddr;
        NameString_t principalName;
*/
  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;

  if (di->conformant_run)
    {
      return offset;
    }

  if (parent_tree)
    {
      item =
	proto_tree_add_text (parent_tree, tvb, offset, -1, "afsNetData:");
      tree = proto_item_add_subtree (item, ett_fileexp_afsNetData);
    }


  offset = dissect_afsNetAddr ( tvb, offset, pinfo, tree, di, drep);
  offset += 4; /* buffer */
  offset = dissect_afsNameString_t ( tvb, offset, pinfo, tree, di, drep);

   proto_item_set_len (item, offset - old_offset);
  return offset;

}

static int
dissect_afsTaggedPath (tvbuff_t * tvb, int offset,
		       packet_info * pinfo, proto_tree * parent_tree,
		       dcerpc_info *di, guint8 *drep)
{

/*
        codesetTag      tp_tag;
        unsigned16      tp_length;
        byte            tp_chars[AFS_PATHMAX+1]; 1024+1
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 tp_tag;
  guint16 tp_length;
  const guint8 *tp_chars;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item =
	proto_tree_add_text (parent_tree, tvb, offset, -1, "afsTaggedPath");
      tree = proto_item_add_subtree (item, ett_fileexp_afsTaggedPath);
    }


  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_afsTaggedPath_tp_tag, &tp_tag);
  offset =
    dissect_ndr_uint16 (tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_afsTaggedPath_tp_length, &tp_length);
  proto_tree_add_item (tree, hf_fileexp_afsTaggedPath_tp_chars, tvb, offset,
		       tp_length, ENC_ASCII|ENC_NA);
  tp_chars = tvb_get_string (wmem_packet_scope(), tvb, offset, 1025);
  offset += 1025;
  col_append_fstr (pinfo->cinfo, COL_INFO, " :tp_chars %s", tp_chars);


  proto_item_set_len (item, offset - old_offset);
  return offset;
}

static int
dissect_afsAcl (tvbuff_t * tvb, int offset,
		packet_info * pinfo, proto_tree * parent_tree, dcerpc_info *di, guint8 *drep)
{
/*
        unsigned32 afsACL_len;
        [length_is(afsACL_len)] byte afsACL_val[AFS_ACLMAX];
*/



  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 acl_len;
  e_uuid_t uuid1, defaultcell;

  if (di->conformant_run)
    {
      return offset;
    }



  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1, "afsAcl");
      tree = proto_item_add_subtree (item, ett_fileexp_afsAcl);
    }


  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_acl_len,
			&acl_len);
  offset += 8;			/* bypass spare and duplicate acl_len */
  offset =
    dissect_ndr_uuid_t (tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_afsacl_uuid1, &uuid1);
  col_append_fstr (pinfo->cinfo, COL_INFO,
		     " - %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
		     uuid1.Data1, uuid1.Data2, uuid1.Data3, uuid1.Data4[0],
		     uuid1.Data4[1], uuid1.Data4[2], uuid1.Data4[3],
		     uuid1.Data4[4], uuid1.Data4[5], uuid1.Data4[6],
		     uuid1.Data4[7]);

  offset =
    dissect_ndr_uuid_t (tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_afsacl_defaultcell_uuid, &defaultcell);
  col_append_fstr (pinfo->cinfo, COL_INFO,
		     "  %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
		     defaultcell.Data1, defaultcell.Data2, defaultcell.Data3,
		     defaultcell.Data4[0], defaultcell.Data4[1],
		     defaultcell.Data4[2], defaultcell.Data4[3],
		     defaultcell.Data4[4], defaultcell.Data4[5],
		     defaultcell.Data4[6], defaultcell.Data4[7]);

  offset += (acl_len - 38);

  if (offset <= old_offset)
    THROW(ReportedBoundsError);

  proto_item_set_len(item, offset-old_offset);
  return offset;
}


static int
dissect_afsErrorStatus (tvbuff_t * tvb, int offset,
			packet_info * pinfo, proto_tree * parent_tree,
			dcerpc_info *di, guint8 *drep)
{
  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 st;
  const char *st_str;

  if (di->conformant_run)
    {
      return offset;
    }

  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1,
				  "afsErrorStatus");
      tree = proto_item_add_subtree (item, ett_fileexp_afsErrorStatus);
    }

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_afserrorstatus_st,
			&st);
  st_str = val_to_str_ext (st, &dce_error_vals_ext, "%u");

  col_append_fstr (pinfo->cinfo, COL_INFO, " st:%s ", st_str);

  proto_item_set_len (item, offset - old_offset);
  return offset;
}

static int
dissect_afsRecordLock (tvbuff_t * tvb, int offset,
		       packet_info * pinfo, proto_tree * parent_tree,
		       dcerpc_info *di, guint8 *drep)
{
/*
        signed16     l_type;
        signed16     l_whence;
        unsigned32   l_start_pos;
        unsigned32   l_end_pos;
        unsigned32   l_pid;
        unsigned32   l_sysid;
        unsigned32   l_fstype;
        unsigned32   l_start_pos_ext; was l_spare0: high 32b of l_start_pos
        unsigned32   l_end_pos_ext; was l_spare1: high 32b of l_end_pos
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint16 l_type, l_whence;
  guint32 l_start_pos, l_end_pos, l_pid, l_sysid, l_fstype, l_start_pos_ext,
    l_end_pos_ext;

  if (di->conformant_run)
    {
      return offset;
    }

  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1,
				  "afsRecordLock:");
      tree = proto_item_add_subtree (item, ett_fileexp_afsRecordLock);
    }

  offset =
    dissect_ndr_uint16 (tvb, offset, pinfo, tree, di, drep, hf_fileexp_l_type,
			&l_type);
  offset =
    dissect_ndr_uint16 (tvb, offset, pinfo, tree, di, drep, hf_fileexp_l_whence,
			&l_whence);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_l_start_pos, &l_start_pos);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_l_end_pos,
			&l_end_pos);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_l_pid,
			&l_pid);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_l_sysid,
			&l_sysid);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_l_fstype,
			&l_fstype);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_l_start_pos_ext, &l_start_pos_ext);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_l_end_pos_ext, &l_end_pos_ext);


  proto_item_set_len (item, offset - old_offset);
  return offset;
}

static int
dissect_afsstorestatus (tvbuff_t * tvb, int offset,
			packet_info * pinfo, proto_tree * parent_tree,
			dcerpc_info *di, guint8 *drep)
{
/*
        unsigned32              mask;
        afsTimeval              modTime;
        afsTimeval              accessTime;
        afsTimeval              changeTime;
        unsigned32              owner;
        unsigned32              group;
        unsigned32              mode;
        afsHyper                truncLength;     applied first
        afsHyper                length;
        afsUUID                 typeUUID;
        unsigned32              deviceType;      character or block
        unsigned32              deviceNumber;
        unsigned32              cmask;
        unsigned32              clientSpare1;    client-only attrs
        unsigned32              deviceNumberHighBits;
        unsigned32              spare1;
        unsigned32              spare2;
        unsigned32              spare3;
        unsigned32              spare4;
        unsigned32              spare5;
        unsigned32              spare6;
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 mask, modtime_sec, changetime_sec, accesstime_sec, devicenumber,
    clientspare1, devicenumberhighbits, spare1, spare2, spare3, spare4,
    spare5, spare6, accesstime_usec, changetime_usec, owner, group, mode,
    trunc_high, trunc_low, length_high, length_low, devicetype,
    cmask, modtime_usec;
  e_uuid_t typeuuid;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1,
				  "afsStoreStatus:");
      tree = proto_item_add_subtree (item, ett_fileexp_afsstorestatus);
    }

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_mask, &mask);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_modtime_sec, &modtime_sec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_modtime_usec, &modtime_usec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_accesstime_sec,
			&accesstime_sec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_accesstime_usec,
			&accesstime_usec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_changetime_sec,
			&changetime_sec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_changetime_usec,
			&changetime_usec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_owner, &owner);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_group, &group);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_mode, &mode);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_trunc_high, &trunc_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_trunc_low, &trunc_low);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_length_high, &length_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_length_low, &length_low);
  offset =
    dissect_ndr_uuid_t (tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_typeuuid, &typeuuid);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_devicetype, &devicetype);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_devicenumber, &devicenumber);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_cmask, &cmask);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_clientspare1, &clientspare1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_devicenumberhighbits,
			&devicenumberhighbits);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_spare1, &spare1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_spare2, &spare2);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_spare3, &spare3);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_spare4, &spare4);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_spare5, &spare5);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_storestatus_spare6, &spare6);

  col_append_str (pinfo->cinfo, COL_INFO, " Mask=");
  if ((mask & AFS_SETMODTIME) == AFS_SETMODTIME)
    {
	col_append_fstr (pinfo->cinfo, COL_INFO, ":SETMODTIME-%u.%u",
			 modtime_sec, modtime_usec);
    }
  if ((mask & AFS_SETOWNER) == AFS_SETOWNER)
    {
	col_append_fstr (pinfo->cinfo, COL_INFO, ":SETOWNER-%u", owner);
    }
  if ((mask & AFS_SETGROUP) == AFS_SETGROUP)
    {
	col_append_fstr (pinfo->cinfo, COL_INFO, ":SETGROUP-%u", group);
    }
  if ((mask & AFS_SETMODE) == AFS_SETMODE)
    {
	col_append_fstr (pinfo->cinfo, COL_INFO, ":SETMODE-%o", mode);
    }
  if ((mask & AFS_SETACCESSTIME) == AFS_SETACCESSTIME)
    {
	col_append_fstr (pinfo->cinfo, COL_INFO, ":SETACCESSTIME-%u.%u",
			 accesstime_sec, accesstime_usec);
    }
  if ((mask & AFS_SETCHANGETIME) == AFS_SETCHANGETIME)
    {
	col_append_fstr (pinfo->cinfo, COL_INFO, ":SETCHANGETIME-%u.%u",
			 changetime_sec, changetime_usec);
    }
  if ((mask & AFS_SETLENGTH) == AFS_SETLENGTH)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":SETLENGTH");
    }
  if ((mask & AFS_SETTYPEUUID) == AFS_SETTYPEUUID)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":SETTYPEUUID");
    }
  if ((mask & AFS_SETDEVNUM) == AFS_SETDEVNUM)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":SETDEVNUM");
    }
  if ((mask & AFS_SETMODEXACT) == AFS_SETMODEXACT)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":SETMODEXACT");
    }
  if ((mask & AFS_SETTRUNCLENGTH) == AFS_SETTRUNCLENGTH)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":SETTRUNCLENGTH");
    }
  if ((mask & AFS_SETCLIENTSPARE) == AFS_SETCLIENTSPARE)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":SETCLIENTSPARE");
    }

  proto_item_set_len (item, offset - old_offset);
  return offset;
}

static int
dissect_afstoken (tvbuff_t * tvb, int offset,
		  packet_info * pinfo, proto_tree * parent_tree, dcerpc_info *di, guint8 *drep)
{
/*
        afsHyper tokenID;
        unsigned32 expirationTime;
        afsHyper type;
        unsigned32 beginRange;
        unsigned32 endRange;
        unsigned32 beginRangeExt;
        unsigned32 endRangeExt;
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 tokenid_hi, tokenid_low, expirationtime, type_hi, type_low,
    beginrange, endrange, beginrangeext, endrangeext, type;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1, "afsToken:");
      tree = proto_item_add_subtree (item, ett_fileexp_afstoken);
    }

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_tokenid_hi,
			&tokenid_hi);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_tokenid_low, &tokenid_low);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_expirationtime, &expirationtime);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_type_hi,
			&type_hi);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_type_low,
			&type_low);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_beginrange,
			&beginrange);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_endrange,
			&endrange);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_beginrangeext, &beginrangeext);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_endrangeext, &endrangeext);
    col_append_fstr (pinfo->cinfo, COL_INFO,
		     "  :Tokenid:%u/%u ExpirationTime:%u beginrange:%u endrange:%u beginrangeext:%u endrangeext:%u",
		     tokenid_hi, tokenid_low, expirationtime, beginrange,
		     endrange, beginrangeext, endrangeext);
  type = type_low;

  col_append_str (pinfo->cinfo, COL_INFO, " Type=");

  if ((type & TKN_LOCK_READ) == TKN_LOCK_READ)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":LOCK_READ");
    }
  if ((type & TKN_LOCK_WRITE) == TKN_LOCK_WRITE)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":LOCK_WRITE");
    }
  if ((type & TKN_DATA_READ) == TKN_DATA_READ)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":DATA_READ");
    }
  if ((type & TKN_DATA_WRITE) == TKN_DATA_WRITE)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":DATA_WRITE");
    }
  if ((type & TKN_OPEN_READ) == TKN_OPEN_READ)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":OPEN_READ");
    }
  if ((type & TKN_OPEN_WRITE) == TKN_OPEN_WRITE)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":OPEN_WRITE");
    }
  if ((type & TKN_OPEN_SHARED) == TKN_OPEN_SHARED)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":OPEN_SHARED");
    }
  if ((type & TKN_OPEN_EXCLUSIVE) == TKN_OPEN_EXCLUSIVE)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":OPEN_EXCLUSIVE");
    }
  if ((type & TKN_OPEN_DELETE) == TKN_OPEN_DELETE)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":OPEN_DELETE");
    }
  if ((type & TKN_OPEN_PRESERVE) == TKN_OPEN_PRESERVE)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":OPEN_PRESERVE");
    }
  if ((type & TKN_STATUS_READ) == TKN_STATUS_READ)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":STATUS_READ");
    }
  if ((type & TKN_STATUS_WRITE) == TKN_STATUS_WRITE)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":STATUS_WRITE");
    }
  if ((type & TKN_OPEN_UNLINK) == TKN_OPEN_UNLINK)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":OPEN_UNLINK");
    }
  if ((type & TKN_SPOT_HERE) == TKN_SPOT_HERE)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":SPOT_HERE");
    }
  if ((type & TKN_SPOT_THERE) == TKN_SPOT_THERE)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":SPOT_THERE");
    }
  if ((type & TKN_OPEN_NO_READ) == TKN_OPEN_NO_READ)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":OPEN_NO_READ");
    }
  if ((type & TKN_OPEN_NO_WRITE) == TKN_OPEN_NO_WRITE)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":OPEN_NO_WRITE");
    }
  if ((type & TKN_OPEN_NO_UNLINK) == TKN_OPEN_NO_UNLINK)
    {
      col_append_str (pinfo->cinfo, COL_INFO, ":OPEN_NO_UNLINK");
    }

  proto_item_set_len (item, offset - old_offset);
  return offset;
}

static int
dissect_afstaggedname (tvbuff_t * tvb, int offset,
		       packet_info * pinfo, proto_tree * parent_tree,
		       dcerpc_info *di, guint8 *drep)
{

/*
        codesetTag      tn_tag;
        unsigned16      tn_length;
        byte            tn_chars[AFS_NAMEMAX+1];
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 tn_tag;
  guint16 tn_length;
  const guint8 *tn_string;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1,
				  "afsTaggedName:");
      tree = proto_item_add_subtree (item, ett_fileexp_afstaggedname);
    }

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_tn_tag,
			&tn_tag);
  offset =
    dissect_ndr_uint16 (tvb, offset, pinfo, tree, di, drep, hf_fileexp_tn_length,
			&tn_length);
  if (tn_length < 254)
    {
      proto_tree_add_item (tree, hf_fileexp_tn_string, tvb, offset,
			     tn_length, ENC_ASCII|ENC_NA);
      tn_string = tvb_get_string (wmem_packet_scope(), tvb, offset, 257);
      offset += 257;
	col_append_fstr (pinfo->cinfo, COL_INFO, " :tn_tag: %s", tn_string);
    }
  else
    {
	col_append_fstr (pinfo->cinfo, COL_INFO,
			 " :FIXME!: Invalid string length of  %u", tn_length);
    }

  proto_item_set_len (item, offset - old_offset);
  return offset;
}

static int
dissect_afsfidtaggedname (tvbuff_t * tvb, int offset,
			  packet_info * pinfo, proto_tree * parent_tree,
			  dcerpc_info *di, guint8 *drep)
{
/*
        afsFid fid;
        afsTaggedName name;
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1,
				  "FidTaggedName:");
      tree = proto_item_add_subtree (item, ett_fileexp_afsfidtaggedname);
    }
  offset = dissect_afsFid (tvb, offset, pinfo, tree, di, drep);
  offset = dissect_afstaggedname (tvb, offset, pinfo, tree, di, drep);

  proto_item_set_len (item, offset - old_offset);
  return offset;

}

static int
dissect_minvvp (tvbuff_t * tvb, int offset,
		packet_info * pinfo, proto_tree * parent_tree, dcerpc_info *di, guint8 *drep)
{

/* unsigned32 minvvp_high
   unsigned32 minvvp_low
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 minvvp_high, minvvp_low;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1, "minVVp:");
      tree = proto_item_add_subtree (item, ett_fileexp_minvvp);
    }
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_minvvp_high, &minvvp_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_minvvp_low,
			&minvvp_low);

    col_append_fstr (pinfo->cinfo, COL_INFO, " minVVp:%u/%u", minvvp_high,
		     minvvp_low);


  proto_item_set_len (item, offset - old_offset);
  return offset;
}


static int
dissect_afsuuid (tvbuff_t * tvb, int offset,
                packet_info * pinfo, proto_tree * parent_tree, dcerpc_info *di, guint8 *drep)
{

/* uuid  UUID
*/
/*HEREN*/

  e_uuid_t uuid1;

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1, "afsUUID:");
      tree = proto_item_add_subtree (item, ett_fileexp_afsuuid);
    }

  offset = dissect_ndr_uuid_t (tvb, offset, pinfo, tree, di, drep, hf_fileexp_afsuuid_uuid, &uuid1);

  col_append_fstr (pinfo->cinfo, COL_INFO, ":%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", uuid1.Data1, uuid1.Data2, uuid1.Data3, uuid1.Data4[0], uuid1.Data4[1], uuid1.Data4[2], uuid1.Data4[3], uuid1.Data4[4], uuid1.Data4[5], uuid1.Data4[6], uuid1.Data4[7]);

  proto_item_set_len (item, offset - old_offset);
  return offset;
}


static int
dissect_offsetp (tvbuff_t * tvb, int offset,
                packet_info * pinfo, proto_tree * parent_tree, dcerpc_info *di, guint8 *drep)
{

/* unsigned32 offsetp_high
   unsigned32 offsetp_low
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 offsetp_high, offsetp_low;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1, "minVVp:");
      tree = proto_item_add_subtree (item, ett_fileexp_offsetp);
    }
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
                        hf_fileexp_offsetp_high, &offsetp_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_offsetp_low,
                        &offsetp_low);

    col_append_fstr (pinfo->cinfo, COL_INFO, " offsetp:%u/%u", offsetp_high,
                     offsetp_low);


  proto_item_set_len (item, offset - old_offset);
  return offset;
}


static int
dissect_returntokenidp (tvbuff_t * tvb, int offset,
                packet_info * pinfo, proto_tree * parent_tree, dcerpc_info *di, guint8 *drep)
{

/* unsigned32 returntokenidp_high
   unsigned32 returntokenidp_low
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 returntokenidp_high, returntokenidp_low;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1, "returnTokenIDp:");
      tree = proto_item_add_subtree (item, ett_fileexp_returntokenidp);
    }
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
                        hf_fileexp_returntokenidp_high, &returntokenidp_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_returntokenidp_low,
                        &returntokenidp_low);

  col_append_fstr (pinfo->cinfo, COL_INFO, " returnTokenIDp:%u/%u", returntokenidp_high,
                     returntokenidp_low);


  proto_item_set_len (item, offset - old_offset);
  return offset;
}


static int
dissect_volsync (tvbuff_t * tvb, int offset,
		 packet_info * pinfo, proto_tree * parent_tree, dcerpc_info *di, guint8 *drep)
{
/*
        afsHyper VolID;
        afsHyper VV;             volume's version
        unsigned32 VVAge;        age, in seconds, of the knowledge that the
                                        given VolVers is current
        unsigned32 VVPingAge; age, in seconds, of the last probe from
                                   the callee (the secondary) to the primary
        unsigned32 vv_spare1;
        unsigned32 vv_spare2;
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 volid_hi, volid_low, vv_hi, vv_low, vvage, vvpingage, vvspare1,
    vvspare2;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1,
				  "AfsVolSync:");
      tree = proto_item_add_subtree (item, ett_fileexp_volsync);
    }

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_volid_hi,
			&volid_hi);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_volid_low,
			&volid_low);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_vv_hi,
			&vv_hi);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_vv_low,
			&vv_low);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_vvage,
			&vvage);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_vvpingage,
			&vvpingage);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_vvspare1,
			&vvspare1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_vvspare2,
			&vvspare2);

  col_append_fstr (pinfo->cinfo, COL_INFO,
		     " volid_hi:%u volid_low:%u vv_hi:%u vv_low:%u vvage:%u vvpingage:%u vvpspare1:%u vvspare2:%u",
		     volid_hi, volid_low, vv_hi, vv_low, vvage, vvpingage,
		     vvspare1, vvspare2);


  proto_item_set_len (item, offset - old_offset);
  return offset;

}

static int
dissect_afsFlags (tvbuff_t * tvb, int offset,
		  packet_info * pinfo, proto_tree * parent_tree, dcerpc_info *di, guint8 *drep)
{


/*
  unsigned32 flags
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 flags;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1, "AfsFlags:");
      tree = proto_item_add_subtree (item, ett_fileexp_afsflags);
    }

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_flags,
			&flags);

  if (flags)
    {
      col_append_str (pinfo->cinfo, COL_INFO, " Flags=");
      if ((flags & AFS_FLAG_RETURNTOKEN) == AFS_FLAG_RETURNTOKEN)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":RETURNTOKEN");
	}
      if ((flags & AFS_FLAG_TOKENJUMPQUEUE) == AFS_FLAG_TOKENJUMPQUEUE)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":TOKENJUMPQUEUE");
	}
      if ((flags & AFS_FLAG_SKIPTOKEN) == AFS_FLAG_SKIPTOKEN)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":SKIPTOKEN");
	}
      if ((flags & AFS_FLAG_NOOPTIMISM) == AFS_FLAG_NOOPTIMISM)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":NOOPTIMISM");
	}
      if ((flags & AFS_FLAG_TOKENID) == AFS_FLAG_TOKENID)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":TOKENID");
	}
      if ((flags & AFS_FLAG_RETURNBLOCKER) == AFS_FLAG_RETURNBLOCKER)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":RETURNBLOCKER");
	}
      if ((flags & AFS_FLAG_ASYNCGRANT) == AFS_FLAG_ASYNCGRANT)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":ASYNCGRANT");
	}
      if ((flags & AFS_FLAG_NOREVOKE) == AFS_FLAG_NOREVOKE)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":NOREVOKE");
	}
      if ((flags & AFS_FLAG_MOVE_REESTABLISH) == AFS_FLAG_MOVE_REESTABLISH)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":MOVE_REESTABLISH");
	}
      if ((flags & AFS_FLAG_SERVER_REESTABLISH) ==
	  AFS_FLAG_SERVER_REESTABLISH)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":SERVER_REESTABLISH");
	}
      if ((flags & AFS_FLAG_NO_NEW_EPOCH) == AFS_FLAG_NO_NEW_EPOCH)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":NO_NEW_EPOCH");
	}
      if ((flags & AFS_FLAG_MOVE_SOURCE_OK) == AFS_FLAG_MOVE_SOURCE_OK)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":MOVE_SOURCE_OK");
	}
      if ((flags & AFS_FLAG_SYNC) == AFS_FLAG_SYNC)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":SYNC");
	}
      if ((flags & AFS_FLAG_ZERO) == AFS_FLAG_ZERO)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":ZERO");
	}
      if ((flags & AFS_FLAG_SKIPSTATUS) == AFS_FLAG_SKIPSTATUS)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":SKIPSTATUS");
	}
      if ((flags & AFS_FLAG_FORCEREVOCATIONS) == AFS_FLAG_FORCEREVOCATIONS)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":FORCEREVOCATIONS");
	}
      if ((flags & AFS_FLAG_FORCEVOLQUIESCE) == AFS_FLAG_FORCEVOLQUIESCE)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":FORCEVOLQUIESCE");
	}
      if ((flags & AFS_FLAG_SEC_SERVICE) == AFS_FLAG_SEC_SERVICE)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":SEC_SERVICE");
	}
      if ((flags & AFS_FLAG_CONTEXT_NEW_ACL_IF) ==
	  AFS_FLAG_CONTEXT_NEW_ACL_IF)
	{
	  col_append_str (pinfo->cinfo, COL_INFO, ":CONTEXT_NEW_ACL_IF");
	}
    }


  proto_item_set_len (item, offset - old_offset);
  return offset;
}

static int
dissect_fetchstatus (tvbuff_t * tvb, int offset,
		     packet_info * pinfo, proto_tree * parent_tree,
		     dcerpc_info *di, guint8 *drep)
{

/*
        unsigned32              interfaceVersion;
        unsigned32              fileType;
        unsigned32              linkCount;
        afsHyper                length;
        afsHyper                dataVersion;
        unsigned32              author;
        unsigned32              owner;
        unsigned32              group;
        unsigned32              callerAccess;
        unsigned32              anonymousAccess;
        unsigned32              aclExpirationTime;
        unsigned32              mode;
        unsigned32              parentVnode;
        unsigned32              parentUnique;
        afsTimeval              modTime;
        afsTimeval              changeTime;
        afsTimeval              accessTime;
        afsTimeval              serverModTime;
        afsUUID                 typeUUID;
        afsUUID                 objectUUID;
        unsigned32              deviceNumber;
        unsigned32              blocksUsed;
        unsigned32              clientSpare1;   * client-only attrs *
        unsigned32              deviceNumberHighBits;
        unsigned32              spare0;
        unsigned32              spare1;
        unsigned32              spare2;
        unsigned32              spare3;
        unsigned32              spare4;
        unsigned32              spare5;
        unsigned32              spare6;
*/
  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 interfaceversion, filetype, linkcount, length_high, length_low,
    dataversion_high, dataversion_low, author, owner, group, calleraccess,
    anonymousaccess, aclexpirationtime, mode, parentvnode, parentunique,
    modtime_sec, modtime_msec, changetime_sec, changetime_msec,
    accesstime_sec, accesstime_msec, servermodtime_msec, servermodtime_sec,
    devicenumber, blocksused, clientspare1, devicenumberhighbits,
    agtypeunique, himaxspare, lomaxspare, pathconfspare, spare4, spare5,
    spare6;
  e_uuid_t typeuuid, objectuuid;

  if (di->conformant_run)
    {
      return offset;
    }



  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1,
				  "FetchStatus:");
      tree = proto_item_add_subtree (item, ett_fileexp_fetchstatus);
    }

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_interfaceversion, &interfaceversion);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_filetype,
			&filetype);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_linkcount,
			&linkcount);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_length_high, &length_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_length_low,
			&length_low);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_dataversion_high, &dataversion_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_dataversion_low, &dataversion_low);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_author,
			&author);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_owner,
			&owner);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_group,
			&group);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_calleraccess, &calleraccess);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_anonymousaccess, &anonymousaccess);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_aclexpirationtime, &aclexpirationtime);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_mode,
			&mode);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_parentvnode, &parentvnode);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_parentunique, &parentunique);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_modtime_sec, &modtime_sec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_modtime_msec, &modtime_msec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_changetime_sec, &changetime_sec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_changetime_msec, &changetime_msec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_accesstime_sec, &accesstime_sec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_accesstime_msec, &accesstime_msec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_servermodtime_sec, &servermodtime_sec);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_servermodtime_msec, &servermodtime_msec);
  offset =
    dissect_ndr_uuid_t (tvb, offset, pinfo, tree, di, drep, hf_fileexp_typeuuid,
			&typeuuid);
  offset =
    dissect_ndr_uuid_t (tvb, offset, pinfo, tree, di, drep, hf_fileexp_objectuuid,
			&objectuuid);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_devicenumber, &devicenumber);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_blocksused,
			&blocksused);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_clientspare1, &clientspare1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_devicenumberhighbits,
			&devicenumberhighbits);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_agtypeunique, &agtypeunique);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_himaxspare,
			&himaxspare);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_lomaxspare,
			&lomaxspare);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_pathconfspare, &pathconfspare);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_spare4,
			&spare4);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_spare5,
			&spare5);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_spare6,
			&spare6);


  col_append_fstr (pinfo->cinfo, COL_INFO,
		     " :interfacever:%u filetype:%u linkcount:%u length:%u dataver:%u author:%u owner:%u group:%u calleraccess:%u anonaccess:%u aclexpire:%u mode:%u parentvnode:%u parentunique:%u modtimesec:%u changetime_sec:%u accesstime_sec:%u servermodtimesec:%u devicenumber:%u blocksused:%u clientspare:%u devicehighbits:%u agtypeunique:%u",
		     interfaceversion, filetype, linkcount, length_low,
		     dataversion_low, author, owner, group, calleraccess,
		     anonymousaccess, aclexpirationtime, mode, parentvnode,
		     parentunique, modtime_sec, changetime_sec,
		     accesstime_sec, servermodtime_sec, devicenumber,
		     blocksused, clientspare1, devicenumberhighbits,
		     agtypeunique);


  proto_item_set_len (item, offset - old_offset);
  return offset;
}

static int
dissect_afsReturnDesc (tvbuff_t * tvb, int offset,
		       packet_info * pinfo, proto_tree * parent_tree,
		       dcerpc_info *di, guint8 *drep)
{
/*
        afsFid fid;             * useful hint *
        afsHyper tokenID;
        afsHyper type;          * mask *
        unsigned32 flags;       * just in case *
*/

  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;
  guint32 tokenid_high, tokenid_low, type_high, type_low;

  if (di->conformant_run)
    {
      return offset;
    }


  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1,
				  "afsReturnDesc:");
      tree = proto_item_add_subtree (item, ett_fileexp_afsReturnDesc);
    }


  offset = dissect_afsFid ( tvb, offset, pinfo, tree, di, drep);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_afsreturndesc_tokenid_high, &tokenid_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_afsreturndesc_tokenid_low, &tokenid_low);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_afsreturndesc_type_high, &type_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_afsreturndesc_type_low, &type_low);
  col_append_fstr (pinfo->cinfo, COL_INFO, " TokenId:%u/%u Type:%u/%u",
		     tokenid_high, tokenid_low, type_high, type_low);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags: ", -1);

  proto_item_set_len (item, offset - old_offset);
  return offset;
}



static int
dissect_afsReturns (tvbuff_t * tvb, int offset,
		    packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{

/*
        long afsReturns_len;
        [length_is(afsReturns_len)] afsReturnDesc afsReturns_val[AFS_BULKMAX];
*/

  /* this is not really a ucvarray, but with the initial len, we can
     cheat and pretend it is */
  if (di->conformant_run)
    {
      return offset;
    }

  offset =
    dissect_ndr_ucvarray (tvb, offset, pinfo, tree, di, drep,
			  dissect_afsReturnDesc);

  return offset;
}

#if 0 /* not used */

static int
dissect_afsbundled_stat (tvbuff_t * tvb, int offset,
                packet_info * pinfo, proto_tree * parent_tree, dcerpc_info *di, guint8 *drep _U_)
{


  proto_item *item = NULL;
  proto_tree *tree = NULL;
  int old_offset = offset;

  if (di->conformant_run)
    {
      return offset;
    }

  if (parent_tree)
    {
      item = proto_tree_add_text (parent_tree, tvb, offset, -1, "afsbundled_stat:");
      tree = proto_item_add_subtree (item, ett_fileexp_afsbundled_stat);
    }

/*  bundled_stat

        afsFid fid;
        afsFetchStatus stat;
        afsToken token;
        error_status_t error;
*/

/*
        offset = dissect_afsFid(tvb, offset, pinfo, tree, di, drep);
*/
/* SKIPTOKEN/STAT?
        offset = dissect_fetchstatus(tvb, offset, pinfo, tree, di, drep);
        offset = dissect_afstoken(tvb, offset, pinfo, tree, di, drep);
*/
/* This is currently under construction as I figure out the reverse layout of the packet. */
/*
        offset = dissect_afsErrorStatus (tvb, offset, pinfo, tree, di, drep);
*/




  proto_item_set_len (item, offset - old_offset);
return offset;

}

#endif /* not used */

static int
dissect_afsBulkStat (tvbuff_t * tvb _U_, int offset,
                                  packet_info * pinfo _U_, proto_tree * tree _U_,
                                  dcerpc_info *di _U_, guint8 *drep _U_)
{
/*
        unsigned32 BulkStat_len;
        [length_is(BulkStat_len)] bundled_stat BulkStat_val[AFS_BULKMAX];
*/
        /* this is not really a ucvarray, but with the initial len, we can
           cheat and pretend it is */
	   /*
        offset = dissect_ndr_ucvarray(tvb, offset, pinfo, tree, drep,
                dissect_afsbundled_stat);
		*/

        return offset;
}




static int
fileexp_dissect_removefile_rqst (tvbuff_t * tvb, int offset,
				 packet_info * pinfo, proto_tree * tree,
				 dcerpc_info *di, guint8 *drep)
{


  if (di->conformant_run)
    {
      return offset;
    }


/*
        [in]    afsFid          *DirFidp,
        [in]    afsFidTaggedName        *Namep,
        [in]    afsHyper        *returnTokenIDp,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/


  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsfidtaggedname, NDR_POINTER_REF,
			 "afsFidTaggedName: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_returntokenidp,
			 NDR_POINTER_REF, "afsReturnTokenIDp:", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "afsMinVVp:", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags:", -1);

  return offset;
}

static int
fileexp_dissect_storedata_rqst (tvbuff_t * tvb, int offset,
				packet_info * pinfo, proto_tree * tree,
				dcerpc_info *di, guint8 *drep)
{
  guint32 position_high, position_low, length;

  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    afsFid          *Fidp,
        [in]    afsStoreStatus  *InStatusp,
        [in]    afsHyper        *Position,
        [in]    signed32        Length,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
        [in]    pipe_t          *storeStream,
*/


  /* afsFid */
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsstorestatus, NDR_POINTER_REF,
			 "afsStoreStatus:", -1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_position_high, &position_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_position_low, &position_low);

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_length, &length);

  col_append_fstr (pinfo->cinfo, COL_INFO, " Position:%u/%u Length:%u",
		     position_high, position_low, length);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags:", -1);

/* XXX need to decode pipe_t still here */

  return offset;
}

static int
fileexp_dissect_gettoken_rqst (tvbuff_t * tvb, int offset,
			       packet_info * pinfo, proto_tree * tree,
			       dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }


/*
        [in]    afsFid          *Fidp,
        [in]    afsToken        *MinTokenp,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/

  /* afsFid */
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afstoken,
			 NDR_POINTER_REF, "afsToken: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags:", -1);

  return offset;
}
static int
fileexp_dissect_gettoken_resp (tvbuff_t * tvb, int offset,
			       packet_info * pinfo, proto_tree * tree,
			       dcerpc_info *di, guint8 *drep)
{

  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsToken        *OutTokenp,
        [out]   afsRecordLock   *OutBlockerp,
        [out]   afsFetchStatus  *OutStatusp,
        [out]   afsVolSync      *Syncp
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afstoken,
			 NDR_POINTER_REF, "afsToken: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsRecordLock, NDR_POINTER_REF,
			 "afsRecordLock: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "afsFetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsErrorStatus, NDR_POINTER_REF,
			 "afsErrorStatus: ", -1);

  return offset;
}

static int
fileexp_dissect_lookuproot_rqst (tvbuff_t * tvb, int offset,
				 packet_info * pinfo, proto_tree * tree,
				 dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }


/*
 *         [in]    afsFid          *InFidp,
 *         [in]    afsHyper        *minVVp,
 *         [in]    unsigned32   Flags,
 */

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags:", -1);

  return offset;
}

static int
fileexp_dissect_fetchdata_rqst (tvbuff_t * tvb, int offset,
				packet_info * pinfo, proto_tree * tree,
				dcerpc_info *di, guint8 *drep)
{
  guint32 position_high, position_low, length;

  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    afsFid          *Fidp,
        [in]    afsHyper        *minVVp,
        [in]    afsHyper        *Position,
        [in]    signed32                Length,
        [in]    unsigned32      Flags,
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_position_high, &position_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_position_low, &position_low);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_length, &length);
  col_append_fstr (pinfo->cinfo, COL_INFO, " Position:%u/%u Length:%u",
		     position_high, position_low, length);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags:", -1);

  return offset;
}

static int
fileexp_dissect_fetchacl_rqst (tvbuff_t * tvb, int offset,
			       packet_info * pinfo, proto_tree * tree,
			       dcerpc_info *di, guint8 *drep)
{

  guint32 acltype;

  if (di->conformant_run)
    {
      return offset;
    }


/*
        [in]    afsFid          *Fidp,
        [in]    unsigned32      aclType,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/

  /* afsFid */
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_acltype,
			&acltype);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags:", -1);

  if (acltype)
    {
      col_append_str (pinfo->cinfo, COL_INFO,
			" :copy the ACL from specified fid:");
    }


  return offset;
}
static int
fileexp_dissect_fetchstatus_rqst (tvbuff_t * tvb, int offset,
				  packet_info * pinfo, proto_tree * tree,
				  dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }


/*
        [in]    afsFid          *Fidp,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags:", -1);

  return offset;
}
static int
fileexp_dissect_storeacl_rqst (tvbuff_t * tvb, int offset,
			       packet_info * pinfo, proto_tree * tree,
			       dcerpc_info *di, guint8 *drep)
{
  guint32 acltype;

  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    afsFid          *Fidp,
        [in]    afsACL          *AccessListp,
        [in]    unsigned32      aclType,
        [in]    afsFid          *aclFidp,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/


  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsAcl,
			 NDR_POINTER_REF, "afsAcl: ", -1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_fileexp_acltype,
			&acltype);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags:", -1);

  col_append_fstr (pinfo->cinfo, COL_INFO, " aclType:%u",acltype);

  return offset;
}

static int
fileexp_dissect_storestatus_rqst (tvbuff_t * tvb, int offset,
				  packet_info * pinfo, proto_tree * tree,
				  dcerpc_info *di, guint8 *drep)
{

  if (di->conformant_run)
    {
      return offset;
    }


/*
        [in]    afsFid          *Fidp,
        [in]    afsStoreStatus  *InStatusp,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsstorestatus, NDR_POINTER_REF,
			 "afsStoreStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags:", -1);


  return offset;
}

static int
fileexp_dissect_createfile_rqst (tvbuff_t * tvb, int offset,
				 packet_info * pinfo, proto_tree * tree,
				 dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }


/*
        [in]    afsFid          *DirFidp,
        [in]    afsTaggedName   *Namep,
        [in]    afsStoreStatus  *InStatusp,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afstaggedname, NDR_POINTER_REF,
			 "afsTaggedName: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsstorestatus, NDR_POINTER_REF,
			 "afsStoreStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags:", -1);

  return offset;
}

static int
fileexp_dissect_rename_rqst (tvbuff_t * tvb, int offset,
			     packet_info * pinfo, proto_tree * tree,
		     dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    afsFid          *OldDirFidp,
        [in]    afsFidTaggedName        *OldNamep,
        [in]    afsFid          *NewDirFidp,
        [in]    afsFidTaggedName        *NewNamep,
        [in]    afsHyper        *returnTokenIDp,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/

  /* afsFid */
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsfidtaggedname, NDR_POINTER_REF,
			 "afsFidTaggedName: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afstaggedname, NDR_POINTER_REF,
			 "afsFidTaggedName: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_returntokenidp, NDR_POINTER_REF,
			 "afsReturnTokenIDp: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_minvvp, NDR_POINTER_REF,
			 "afsminVVp: ", -1);

  offset = dissect_afsFlags(tvb, offset, pinfo, tree, di, drep);

  return offset;
}

static int
fileexp_dissect_symlink_rqst (tvbuff_t * tvb, int offset,
			      packet_info * pinfo, proto_tree * tree,
			      dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    afsFid          *DirFidp,
        [in]    afsTaggedName   *Namep,
        [in]    afsTaggedPath   *LinkContentsp,
        [in]    afsStoreStatus  *InStatusp,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/


  /* afsFid */
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afstaggedname, NDR_POINTER_REF,
			 "afsTaggedName: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsTaggedPath, NDR_POINTER_REF,
			 "afsTaggedPath: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsstorestatus, NDR_POINTER_REF,
			 "afsStoreStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);
    offset = dissect_afsFlags (tvb, offset, pinfo, tree, di, drep);

  return offset;
}

static int
fileexp_dissect_readdir_rqst (tvbuff_t * tvb, int offset,
			      packet_info * pinfo, proto_tree * tree,
			      dcerpc_info *di, guint8 *drep)
{
  guint32 size;

  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    afsFid          *DirFidp,
        [in]    afsHyper        *Offsetp,
        [in]    unsigned32      Size,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_offsetp,
			 NDR_POINTER_REF, "Offsetp: ", -1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_readdir_size, &size);

  col_append_fstr (pinfo->cinfo, COL_INFO, " Size:%u", size);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);
   offset = dissect_afsFlags ( tvb, offset, pinfo, tree, di, drep);

  return offset;
}

static int
fileexp_dissect_makedir_rqst (tvbuff_t * tvb, int offset,
			      packet_info * pinfo, proto_tree * tree,
			      dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    afsFid          *DirFidp,
        [in]    afsTaggedName   *Namep,
        [in]    afsStoreStatus  *InStatusp,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afstaggedname, NDR_POINTER_REF,
			 "afsTaggedName: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsstorestatus, NDR_POINTER_REF,
			 "afsStoreStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);
  offset = dissect_afsFlags ( tvb, offset, pinfo, tree, di, drep);

  return offset;
}

static int
fileexp_dissect_removedir_rqst (tvbuff_t * tvb, int offset,
				packet_info * pinfo, proto_tree * tree,
				dcerpc_info *di, guint8 *drep)
{
  guint32 returntokenidp_high, returntokenidp_low;

  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    afsFid          *DirFidp,
        [in]    afsFidTaggedName        *Namep,
        [in]    afsHyper        *returnTokenIDp,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsfidtaggedname, NDR_POINTER_REF,
			 "afsFidTaggedName: ", -1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_returntokenidp_high, &returntokenidp_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_returntokenidp_low, &returntokenidp_low);

  col_append_fstr (pinfo->cinfo, COL_INFO, " returnTokenIDp:%u/%u",
		     returntokenidp_high, returntokenidp_low);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);
  offset = dissect_afsFlags ( tvb, offset, pinfo, tree, di, drep );

  return offset;
}

static int
fileexp_dissect_lookup_rqst (tvbuff_t * tvb, int offset,
			     packet_info * pinfo, proto_tree * tree,
			     dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    afsFid          *DirFidp,
        [in]    afsTaggedName   *Namep,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afstaggedname, NDR_POINTER_REF,
			 "afsTaggedName: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);
   offset = dissect_afsFlags ( tvb, offset, pinfo, tree, di, drep);

  return offset;
}
static int
fileexp_dissect_lookup_resp (tvbuff_t * tvb, int offset,
			     packet_info * pinfo, proto_tree * tree,
			     dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFid          *OutFidp,
        [out]   afsFetchStatus  *OutFidStatusp,
        [out]   afsFetchStatus  *OutDirStatusp,
        [out]   afsToken        *OutTokenp,
        [out]   afsVolSync      *Syncp
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afstoken,
			 NDR_POINTER_REF, "afsToken: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("Lookup reply");

  return offset;

}

static int
fileexp_dissect_makemountpoint_rqst (tvbuff_t * tvb, int offset,
				     packet_info * pinfo, proto_tree * tree,
				     dcerpc_info *di, guint8 *drep)
{
  guint16 type;

  if (di->conformant_run)
    {
      return offset;
    }


/*
        [in]    afsFid          *DirFidp,
        [in]    afsTaggedName   *Namep,
        [in]    afsTaggedName   *cellNamep,
        [in]    afsFStype       Type,
        [in]    afsTaggedName   *volumeNamep,
        [in]    afsStoreStatus  *InStatusp,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/

  /* afsFid */
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afstaggedname, NDR_POINTER_REF,
			 "afsTaggedName: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afstaggedname, NDR_POINTER_REF,
			 "afsTaggedName: ", -1);
  offset =
    dissect_ndr_uint16 (tvb, offset, pinfo, tree, di, drep, hf_fileexp_fstype,
			&type);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afstaggedname, NDR_POINTER_REF,
			 "afsTaggedName: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsstorestatus, NDR_POINTER_REF,
			 "afsStoreStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);

  offset = dissect_afsFlags (tvb, offset, pinfo, tree, di, drep);

  col_append_fstr (pinfo->cinfo, COL_INFO, " Type:%u", type);

  return offset;

}

static int
fileexp_dissect_setcontext_rqst (tvbuff_t * tvb, int offset,
				 packet_info * pinfo, proto_tree * tree,
				 dcerpc_info *di, guint8 *drep)
{
  guint32 epochtime, clientsizesattrs, parm7;

  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    unsigned32      epochTime,
        [in]    afsNetData      *callbackAddr,
        [in]    unsigned32      Flags,
        [in]    afsUUID         *secObjectID,
        [in]    unsigned32      clientSizesAttrs,
        [in]    unsigned32      parm7
*/


  offset =
    dissect_dcerpc_time_t (tvb, offset, pinfo, tree, drep,
			   hf_fileexp_setcontext_rqst_epochtime, &epochtime);

  offset =  dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsNetData,
			 NDR_POINTER_REF, "afsNetData:", -1);

  offset = dissect_afsFlags (tvb, offset, pinfo, tree, di, drep);

col_append_str (pinfo->cinfo, COL_INFO, " setObjectID");

  offset =  dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsuuid,
			 NDR_POINTER_REF, "afsUUID:", -1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_setcontext_rqst_clientsizesattrs,
			&clientsizesattrs);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_setcontext_rqst_parm7, &parm7);

  col_append_fstr (pinfo->cinfo, COL_INFO, " epochTime:%u clientSizesAttrs:%u parm7:%u", epochtime, clientsizesattrs, parm7);

  return offset;
}

static int
fileexp_dissect_setcontext_resp (tvbuff_t * tvb, int offset,
				 packet_info * pinfo, proto_tree * tree,
				 dcerpc_info *di, guint8 *drep)
{
/* nothing but error code */

  if (di->conformant_run)
    {
      return offset;
    }

  MACRO_ST_CLEAR ("SetContext reply");
  return offset;
}

static int
  fileexp_dissect_lookuproot_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

  /*
   *        [out]   afsFid          *OutFidp,
   *        [out]   afsFetchStatus  *OutFidStatusp,
   *        [out]   afsToken        *OutTokenp,
   *        [out]   afsVolSync      *Syncp
   */
  /* afsFid */
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afstoken,
			 NDR_POINTER_REF, "afsToken: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("LookupRoot reply");
  return offset;
}

static int
  fileexp_dissect_fetchdata_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  guint32 pipe_t_size;

  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFetchStatus  *OutStatusp,
        [out]   afsToken        *OutTokenp,
        [out]   afsVolSync      *Syncp,
        [out]   pipe_t          *fetchStream
*/
/* The SkipToken/SkipStatus flags are always used in every fetchdata request I have seen.
There is also not sign of the afsVolSync structure... Just size, and data string... aka pipe_t */

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_fetchdata_pipe_t_size, &pipe_t_size);

  return offset;
}

static int
  fileexp_dissect_fetchacl_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }


/*
        [out]   afsACL          *AccessListp,
        [out]   afsFetchStatus  *OutStatusp,
        [out]   afsVolSync      *Syncp
*/
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsAcl,
			 NDR_POINTER_REF, "afsAcl: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("FetchAcl reply");
  return offset;
}

static int
  fileexp_dissect_fetchstatus_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFetchStatus  *OutStatusp,
        [out]   afsToken        *OutTokenp,
        [out]   afsVolSync      *Syncp
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afstoken,
			 NDR_POINTER_REF, "afsToken: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("FetchStatus reply");
  return offset;
}

static int
  fileexp_dissect_storedata_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFetchStatus  *OutStatusp,
        [out]   afsVolSync      *Syncp
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("StoreData reply");
  return offset;
}

static int
  fileexp_dissect_storeacl_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFetchStatus  *OutStatusp,
        [out]   afsVolSync      *Syncp
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("StoreAcl reply");
  return offset;
}

static int
  fileexp_dissect_storestatus_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFetchStatus  *OutStatusp,
        [out]   afsVolSync      *Syncp
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("StoreStatus reply");
  return offset;
}

static int
  fileexp_dissect_removefile_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFetchStatus  *OutDirStatusp,
        [out]   afsFetchStatus  *OutFileStatusp,
        [out]   afsFid          *OutFileFidp,
        [out]   afsVolSync      *Syncp
*/
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("RemoveFile reply");
  return offset;
}

static int
  fileexp_dissect_createfile_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFid          *OutFidp,
        [out]   afsFetchStatus  *OutFidStatusp,
        [out]   afsFetchStatus  *OutDirStatusp,
        [out]   afsToken        *OutTokenp,
        [out]   afsVolSync      *Syncp
*/

  /* afsFid */
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afstoken,
			 NDR_POINTER_REF, "afsToken: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("CreateFile reply");

  return offset;
}
static int
  fileexp_dissect_rename_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFetchStatus  *OutOldDirStatusp,
        [out]   afsFetchStatus  *OutNewDirStatusp,
        [out]   afsFid          *OutOldFileFidp,
        [out]   afsFetchStatus  *OutOldFileStatusp,
        [out]   afsFid          *OutNewFileFidp,
        [out]   afsFetchStatus  *OutNewFileStatusp,
        [out]   afsVolSync      *Syncp
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR("Rename reply");
  return offset;
}

static int
  fileexp_dissect_symlink_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFid          *OutFidp,
        [out]   afsFetchStatus  *OutFidStatusp,
        [out]   afsFetchStatus  *OutDirStatusp,
        [out]   afsToken        *OutTokenp,
        [out]   afsVolSync      *Syncp
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afstoken,
			 NDR_POINTER_REF, "afsToken: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("Symlink reply");

  return offset;
}

static int
  fileexp_dissect_hardlink_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFetchStatus  *OutFidStatusp,
        [out]   afsFetchStatus  *OutDirStatusp,
        [out]   afsVolSync      *Syncp
*/


  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("Hardlink reply");

  return offset;
}
static int
  fileexp_dissect_hardlink_rqst
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    afsFid          *DirFidp,
        [in]    afsTaggedName   *Namep,
        [in]    afsFid          *ExistingFidp,
        [in]    afsHyper        *minVVp,
        [in]    unsigned32      Flags,
*/

  /* afsFid */
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afstaggedname, NDR_POINTER_REF,
			 "afsTaggedName: ", -1);
  /* afsFid */
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);

  offset = dissect_afsFlags ( tvb, offset, pinfo, tree, di, drep);

  return offset;
}

static int
  fileexp_dissect_makedir_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFid          *OutFidp,
        [out]   afsFetchStatus  *OutFidStatusp,
        [out]   afsFetchStatus  *OutDirStatusp,
        [out]   afsToken        *OutTokenp,
        [out]   afsVolSync      *Syncp
*/
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afstoken,
			 NDR_POINTER_REF, "afsToken: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);

  MACRO_ST_CLEAR ("MakeDir reply");

  return offset;
}

static int
  fileexp_dissect_removedir_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFetchStatus  *OutDirStatusp,
        [out]   afsFid          *OutFidp,
        [out]   afsFetchStatus  *OutDelStatusp,
        [out]   afsVolSync      *Syncp
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("RemoveDir reply");

  return offset;

}

static int
  fileexp_dissect_readdir_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  guint32 nextoffsetp_high, nextoffsetp_low;

  if (di->conformant_run)
    {
      return offset;
    }


/*
        [out]   afsHyper        *NextOffsetp,
        [out]   afsFetchStatus  *OutDirStatusp,
        [out]   afsToken        *OutTokenp,
        [out]   afsVolSync      *Syncp,
        [out]   pipe_t          *dirStream
*/

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_nextoffsetp_high, &nextoffsetp_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_nextoffsetp_low, &nextoffsetp_low);

  col_append_fstr (pinfo->cinfo, COL_INFO, " NextOffsetp:%u/%u",
		     nextoffsetp_high, nextoffsetp_low);

  /* all packets seem to have SKIPTOKEN/SKIPSTATUS sent, and thus these structures are missing on calls holding tokens. */

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  /* XXX need to add pipe_t here, once figured out. */

  return offset;
}

static int
  fileexp_dissect_releasetokens_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

  /* no out */
  MACRO_ST_CLEAR ("ReleaseTokens reply");
  return offset;
}

static int
  fileexp_dissect_releasetokens_rqst
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }


/*
        [in]    afsReturns      *Tokens_Arrayp,
        [in]    unsigned32      Flags
*/
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsReturns,
			 NDR_POINTER_REF, "afsReturns: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags: ", -1);
  return offset;
}

static int
  fileexp_dissect_gettime_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{

  guint32 secondsp, usecondsp, syncdistance, syncdispersion;

  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   unsigned32      *Secondsp,
        [out]   unsigned32      *USecondsp,
        [out]   unsigned32      *SyncDistance,
        [out]   unsigned32      *SyncDispersion
*/

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_gettime_secondsp, &secondsp);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_gettime_usecondsp, &usecondsp);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_gettime_syncdistance, &syncdistance);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_gettime_syncdispersion, &syncdispersion);

  col_append_fstr (pinfo->cinfo, COL_INFO, " Secondsp:%u  Usecondsp:%u SyncDistance:/%u SyncDispersion:%u", secondsp, usecondsp, syncdistance, syncdispersion);

  MACRO_ST_CLEAR ("GetTime reply");

  return offset;

}

static int
  fileexp_dissect_gettime_rqst
  (tvbuff_t *
   tvb _U_, int offset, packet_info * pinfo _U_, proto_tree * tree _U_, dcerpc_info *di, guint8 *drep _U_)
{
  if (di->conformant_run)
    {
      return offset;
    }

  /* nothing */

  return offset;
}

static int
  fileexp_dissect_processquota_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in,out]        afsQuota        *quotaListp,
        [out]           afsFetchStatus  *OutStatusp,
        [out]           afsVolSync      *Syncp
*/

  /* XXX need afsQuota */
  offset += 92;
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("ProcessQuota reply");

  return offset;
}

static int
  fileexp_dissect_processquota_rqst
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]            afsFid          *Fidp,
        [in]            afsHyper        *minVVp,
        [in]            unsigned32      Flags,
        [in,out]        afsQuota        *quotaListp,
*/

  /* afsFid */
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);
  offset = dissect_afsFlags ( tvb, offset, pinfo, tree, di, drep);

  /* XXX need to figure out afsQuota here */
  return offset;
}

static int
  fileexp_dissect_getserverinterfaces_rqst
  (tvbuff_t *
   tvb _U_, int offset, packet_info * pinfo _U_, proto_tree * tree _U_, dcerpc_info *di, guint8 *drep _U_)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in, out]               dfs_interfaceList *serverInterfacesP
*/
  /* XXX figure out dfs_interfacelist */
  return offset;
}

static int
  fileexp_dissect_getserverinterfaces_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in, out]               dfs_interfaceList *serverInterfacesP
*/
  /* XXX figure out dfs_interfacelist */

  MACRO_ST_CLEAR ("GetServerInterfaces reply");
  return offset;
}

static int
  fileexp_dissect_setparams_rqst
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]            unsigned32      Flags,
        [in, out]       afsConnParams   *paramsP
*/
  offset = dissect_afsFlags( tvb, offset, pinfo, tree, di, drep);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsConnParams, NDR_POINTER_REF,
			 "afsConnParams:", -1);
  return offset;
}

static int
  fileexp_dissect_setparams_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in, out]       afsConnParams   *paramsP
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep,
			 dissect_afsConnParams, NDR_POINTER_REF,
			 "afsConnParams:", -1);
  MACRO_ST_CLEAR ("SetParams reply");
  return offset;
}

static int
  fileexp_dissect_makemountpoint_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsFid          *OutFidp,
        [out]   afsFetchStatus  *OutFidStatusp,
        [out]   afsFetchStatus  *OutDirStatusp,
        [out]   afsVolSync      *Syncp
*/
  /* afsFid */
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
  MACRO_ST_CLEAR ("MakeMountPoint reply");
  return offset;
}

static int
  fileexp_dissect_getstatistics_rqst
  (tvbuff_t *
   tvb _U_, int offset, packet_info * pinfo _U_, proto_tree * tree _U_, dcerpc_info *di, guint8 *drep _U_)
{
  if (di->conformant_run)
    {
      return offset;
    }

  /* nothing for request */
  return offset;
}

static int
  fileexp_dissect_getstatistics_resp
  (tvbuff_t *
   tvb _U_, int offset, packet_info * pinfo _U_, proto_tree * tree _U_, dcerpc_info *di, guint8 *drep _U_)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsStatistics   *Statisticsp
*/
  /* XXX figure out afsStatistics */
  return offset;
}

static int
  fileexp_dissect_bulkfetchvv_rqst
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{

  guint32 cellidp_high, cellidp_low, numvols, spare1, spare2;

  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    afsHyper        *cellIdp,
        [in]    afsBulkVolIDs   *VolIDsp,
        [in]    unsigned32      NumVols,
        [in]    unsigned32      Flags,
        [in]    unsigned32      spare1,
        [in]    unsigned32      spare2,
*/
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_cellidp_high, &cellidp_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_cellidp_low, &cellidp_low);

  col_append_fstr (pinfo->cinfo, COL_INFO, " CellIDp:%u/%u", cellidp_high,
		     cellidp_low);

  /* XXX figure out the afsBulkVolIDS */
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_bulkfetchvv_numvols, &numvols);

  offset = dissect_afsFlags (tvb, offset, pinfo, tree, di, drep);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_bulkfetchvv_spare1, &spare1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_bulkfetchvv_spare2, &spare2);
  return offset;
}

static int
  fileexp_dissect_bulkfetchvv_resp
  (tvbuff_t *
   tvb _U_, int offset, packet_info * pinfo _U_, proto_tree * tree _U_, dcerpc_info *di, guint8 *drep _U_)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   afsBulkVVs      *VolVVsp,
        [out]   unsigned32      *spare4
*/
  /* XXX need to figure out afsBulkVVs  ; */
  return offset;
}

static int
  fileexp_dissect_bulkkeepalive_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  guint32 spare4;

  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]   unsigned32      *spare4
*/

  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_bulkkeepalive_spare4, &spare4);
  MACRO_ST_CLEAR ("BulkKeepAlive reply");
  return offset;
}

static int
  fileexp_dissect_bulkkeepalive_rqst
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  guint32 numexecfids, spare1, spare2;

  if (di->conformant_run)
    {
      return offset;
    }

/*
        [in]    afsBulkFEX      *KAFEXp,
        [in]    unsigned32      numExecFids,
        [in]    unsigned32      Flags,
        [in]    unsigned32      spare1,
        [in]    unsigned32      spare2,
*/
  /* XXX figure out afsBulkFEX */
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_bulkkeepalive_numexecfids, &numexecfids);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFlags,
			 NDR_POINTER_REF, "afsFlags:", -1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_bulkkeepalive_spare1, &spare1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_bulkkeepalive_spare2, &spare2);
  return offset;
}

static int
  fileexp_dissect_bulkfetchstatus_rqst
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  guint32 offsetp_high, offsetp_low, size;

  if (di->conformant_run)
    {
      return offset;
    }


/*
        [in]            afsFid          *DirFidp,
        [in]            afsHyper        *Offsetp,
        [in]            unsigned32      Size,
        [in]            afsHyper        *minVVp,
        [in]            unsigned32      Flags,
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsFid,
			 NDR_POINTER_REF, "afsFid: ", -1);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_offsetp_high, &offsetp_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_offsetp_low, &offsetp_low);

  col_append_fstr (pinfo->cinfo, COL_INFO, " Offsetp:%u/%u", offsetp_high,
		     offsetp_low);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_bulkfetchstatus_size, &size);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_minvvp,
			 NDR_POINTER_REF, "MinVVp:", -1);
  offset = dissect_afsFlags(tvb, offset, pinfo, tree, di, drep);

  return offset;
}

static int
  fileexp_dissect_bulkfetchstatus_resp
  (tvbuff_t *
   tvb, int offset, packet_info * pinfo, proto_tree * tree, dcerpc_info *di, guint8 *drep)
{
  if (di->conformant_run)
    {
      return offset;
    }

/*
        [out]           BulkStat        *bulkstats,
        [out]           afsHyper        *NextOffsetp,
        [out]           afsFetchStatus  *OutDirStatusp,
        [out]           afsToken        *OutTokenp,
        [out]           afsVolSync      *Syncp,
        [out]           pipe_t          *dirStream
*/

  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afsBulkStat,
			 NDR_POINTER_REF, "BulkStat: ", -1);
/* Under construction. The packet seems to have the pipe_t before the rest of the data listed in idl. */

/*
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_nextoffsetp_high, &nextoffsetp_high);
  offset =
    dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep,
			hf_fileexp_nextoffsetp_low, &nextoffsetp_low);

  col_append_fstr (pinfo->cinfo, COL_INFO, " NextOffsetp:%u/%u",
		     nextoffsetp_high, nextoffsetp_low);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_fetchstatus,
			 NDR_POINTER_REF, "FetchStatus: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_afstoken,
			 NDR_POINTER_REF, "afsToken: ", -1);
  offset =
    dissect_ndr_pointer (tvb, offset, pinfo, tree, di, drep, dissect_volsync,
			 NDR_POINTER_REF, "VolSync: ", -1);
*/
  /* XXX figure out pipe_t */

  return offset;
}

static dcerpc_sub_dissector fileexp_dissectors[] = {
  { 0, "SetContext", fileexp_dissect_setcontext_rqst, fileexp_dissect_setcontext_resp} ,
  { 1, "LookupRoot", fileexp_dissect_lookuproot_rqst, fileexp_dissect_lookuproot_resp} ,
  { 2, "FetchData", fileexp_dissect_fetchdata_rqst, fileexp_dissect_fetchdata_resp} ,
  { 3, "FetchAcl", fileexp_dissect_fetchacl_rqst, fileexp_dissect_fetchacl_resp} ,
  { 4, "FetchStatus", fileexp_dissect_fetchstatus_rqst, fileexp_dissect_fetchstatus_resp} ,
  { 5, "StoreData", fileexp_dissect_storedata_rqst, fileexp_dissect_storedata_resp} ,
  { 6, "StoreAcl", fileexp_dissect_storeacl_rqst, fileexp_dissect_storeacl_resp} ,
  { 7, "StoreStatus", fileexp_dissect_storestatus_rqst, fileexp_dissect_storestatus_resp} ,
  { 8, "RemoveFile", fileexp_dissect_removefile_rqst, fileexp_dissect_removefile_resp} ,
  { 9, "CreateFile", fileexp_dissect_createfile_rqst, fileexp_dissect_createfile_resp} ,
  { 10, "Rename", fileexp_dissect_rename_rqst, fileexp_dissect_rename_resp} ,
  { 11, "Symlink", fileexp_dissect_symlink_rqst, fileexp_dissect_symlink_resp} ,
  { 12, "HardLink", fileexp_dissect_hardlink_rqst, fileexp_dissect_hardlink_resp} ,
  { 13, "MakeDir", fileexp_dissect_makedir_rqst, fileexp_dissect_makedir_resp} ,
  { 14, "RemoveDir", fileexp_dissect_removedir_rqst, fileexp_dissect_removedir_resp} ,
  { 15, "Readdir", fileexp_dissect_readdir_rqst, fileexp_dissect_readdir_resp} ,
  { 16, "Lookup", fileexp_dissect_lookup_rqst, fileexp_dissect_lookup_resp} ,
  { 17, "GetToken", fileexp_dissect_gettoken_rqst, fileexp_dissect_gettoken_resp} ,
  { 18, "ReleaseTokens", fileexp_dissect_releasetokens_rqst, fileexp_dissect_releasetokens_resp} ,
  { 19, "GetTime", fileexp_dissect_gettime_rqst, fileexp_dissect_gettime_resp} ,
  { 20, "MakeMountPoint", fileexp_dissect_makemountpoint_rqst, fileexp_dissect_makemountpoint_resp} ,
  { 21, "GetStatistics", fileexp_dissect_getstatistics_rqst, fileexp_dissect_getstatistics_resp} ,
  { 22, "BulkFetchVV", fileexp_dissect_bulkfetchvv_rqst, fileexp_dissect_bulkfetchvv_resp} ,
  { 23, "BulkKeepAlive", fileexp_dissect_bulkkeepalive_rqst, fileexp_dissect_bulkkeepalive_resp} ,
  { 24, "ProcessQuota", fileexp_dissect_processquota_rqst, fileexp_dissect_processquota_resp} ,
  { 25, "GetServerInterfaces", fileexp_dissect_getserverinterfaces_rqst, fileexp_dissect_getserverinterfaces_resp} ,
  { 26, "SetParams", fileexp_dissect_setparams_rqst, fileexp_dissect_setparams_resp} ,
  { 27, "BulkFetchStatus", fileexp_dissect_bulkfetchstatus_rqst, fileexp_dissect_bulkfetchstatus_resp} ,
  { 0, NULL, NULL, NULL}
  ,
};
void
proto_register_fileexp (void)
{

  static hf_register_info hf[] = {
    { &hf_error_st, {"AFS4Int Error Status Code", "fileexp.st", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
    { &hf_fileexp_flags, {"DFS Flags", "fileexp.flags", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
    { &hf_fileexp_tn_string, {"String", "fileexp.string", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
    { &hf_fileexp_opnum, {"Operation", "fileexp.opnum", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
    { &hf_fileexp_setcontext_rqst_epochtime, {"EpochTime:", "fileexp.setcontext_rqst_epochtime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL}},
    { &hf_fileexp_setcontext_rqst_clientsizesattrs, { "ClientSizeAttrs:", "fileexp.setcontext_clientsizesattrs", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_setcontext_rqst_parm7, { "Parm7:", "fileexp.setcontext.parm7", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_acl_len, {"Acl Length", "fileexp.acl_len", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
    { &hf_fileexp_acltype, {"Acl type", "fileexp.acltype", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
    { &hf_fileexp_minvvp_high, {"minVVp high", "fileexp.minvvp_high", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
    { &hf_fileexp_minvvp_low, {"minVVp low", "fileexp.minvvp_low", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
    { &hf_fileexp_accesstime_msec, { "Access time (msec)", "fileexp.accesstime_msec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_accesstime_sec, { "Access time (sec)", "fileexp.accesstime_sec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_aclexpirationtime, { "Acl expiration time", "fileexp.aclexpirationtime", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_agtypeunique, { "agtypeunique", "fileexp.agtypeunique", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_anonymousaccess, { "Anonymous Access", "fileexp.anonymousaccess", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_author, { "Author", "fileexp.author", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_blocksused, { "Blocks used", "fileexp.blocksused", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} },
    { &hf_fileexp_calleraccess, { "Caller access", "fileexp.calleraccess", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_changetime_msec, { "Change time (msec)", "fileexp.changetime_msec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_changetime_sec, { "Change time (sec)", "fileexp.changetime_sec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_clientspare1, { "Client spare1", "fileexp.clientspare1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_dataversion_high, { "Data version (high)", "fileexp.dataversion_high", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_dataversion_low, { "Data version (low)", "fileexp.dataversion_low", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_devicenumber, { "Device number", "fileexp.devicenumber", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_devicenumberhighbits, { "Device number high bits", "fileexp.devicenumberhighbits", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_filetype, { "File type", "fileexp.filetype", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_group, { "Group", "fileexp.group", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_himaxspare, { "Hi max spare", "fileexp.himaxspare", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_interfaceversion, { "Interface version", "fileexp.interfaceversion", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_length_high, { "Length high", "fileexp.length_high", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_length_low, { "Length low", "fileexp.length_low", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_linkcount, { "Link count", "fileexp.linkcount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_lomaxspare, { "Lo max spare", "fileexp.lomaxspare", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_mode, { "Mode", "fileexp.mode", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_modtime_msec, { "Modify time (msec)", "fileexp.modtime_msec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_modtime_sec, { "Modify time (sec)", "fileexp.modtime_sec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_objectuuid, { "Object uuid", "fileexp.objectuuid", FT_GUID, BASE_NONE, NULL, 0x0, "UUID", HFILL} } ,
    { &hf_fileexp_owner, { "Owner", "fileexp.owner", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_parentunique, { "Parent unique", "fileexp.parentunique", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_parentvnode, { "Parent vnode", "fileexp.parentvnode", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_pathconfspare, { "Path conf spare", "fileexp.pathconfspare", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_servermodtime_msec, { "Server modify time (msec)", "fileexp.servermodtime_msec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_servermodtime_sec, { "Server modify time (sec)", "fileexp.servermodtime_sec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_spare4, { "Spare4", "fileexp.spare4", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_spare5, { "Spare5", "fileexp.spare5", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_spare6, { "Spare6", "fileexp.spare6", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_typeuuid, { "Type uuid", "fileexp.typeuuid", FT_GUID, BASE_NONE, NULL, 0x0, "UUID", HFILL} } ,
    { &hf_fileexp_volid_hi, { "Vol id hi", "fileexp.volid_hi", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_volid_low, { "Vol id low", "fileexp.volid_low", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_vvage, { "Vvage", "fileexp.vvage", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_vv_hi, { "Vv hi", "fileexp.vv_hi", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_vv_low, { "Vv low", "fileexp.vv_low", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_vvpingage, { "Vv pingage", "fileexp.vvpingage", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_vvspare1, { "Vv spare1", "fileexp.vvspare1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_vvspare2, { "Vv spare2", "fileexp.vvspare2", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_beginrange, { "Begin range", "fileexp.beginrange", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_beginrangeext, { "Begin range ext", "fileexp.beginrangeext", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_endrange, { "End range", "fileexp.endrange", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_endrangeext, { "End range ext", "fileexp.endrangeext", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_expirationtime, { "Expiration time", "fileexp.expirationtime", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_tokenid_hi, { "Tokenid hi", "fileexp.tokenid_hi", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_tokenid_low, { "Tokenid low", "fileexp.tokenid_low", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_type_hi, { "Type hi", "fileexp.type_hi", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_type_low, { "Type low", "fileexp.type_low", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_tn_length, { "Tn length", "fileexp.tn_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_tn_tag, { "Tn tag", "fileexp.tn_tag", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_accesstime_sec, { "Store status access time (sec)", "fileexp.storestatus_accesstime_sec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_accesstime_usec, { "Store status access time (usec)", "fileexp.storestatus_accesstime_usec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_changetime_sec, { "Store status change time (sec)", "fileexp.storestatus_changetime_sec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_changetime_usec, { "Store status change time (usec)", "fileexp.storestatus_changetime_usec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_clientspare1, { "Store Status client spare1", "fileexp.storestatus_clientspare1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_cmask, { "Store status cmask", "fileexp.storestatus_cmask", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_devicenumber, { "Store status device number", "fileexp.storestatus_devicenumber", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_devicenumberhighbits, { "Store status device number high bits", "fileexp.storestatus_devicenumberhighbits", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_devicetype, { "Store status device type", "fileexp.storestatus_devicetype", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_group, { "Store status group", "fileexp.storestatus_group", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_length_high, { "Store status length high", "fileexp.storestatus_length_high", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_length_low, { "Store status length low", "fileexp.storestatus_length_low", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_mask, { "Store status mask", "fileexp.storestatus_mask", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_mode, { "Store status mode", "fileexp.storestatus_mode", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_modtime_sec, { "Store status modify time (sec)", "fileexp.storestatus_modtime_sec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_modtime_usec, { "Store status modify time (usec)", "fileexp.storestatus_modtime_usec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_owner, { "Store status owner", "fileexp.storestatus_owner", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_spare1, { "Store status spare1", "fileexp.storestatus_spare1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_spare2, { "Store status spare2", "fileexp.storestatus_spare2", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_spare3, { "Store status spare3", "fileexp.storestatus_spare3", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_spare4, { "Store status spare4", "fileexp.storestatus_spare4", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_spare5, { "Store status spare5", "fileexp.storestatus_spare5", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_spare6, { "Store status spare6", "fileexp.storestatus_spare6", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_trunc_high, { "Store status trunc high", "fileexp.storestatus_trunc_high", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_trunc_low, { "Store status trunc low", "fileexp.storestatus_trunc_low", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_storestatus_typeuuid, { "Store status type uuid", "fileexp.storestatus_typeuuid", FT_GUID, BASE_NONE, NULL, 0x0, "UUID", HFILL} } ,
    { &hf_fileexp_l_end_pos, { "l_end_pos", "fileexp.l_end_pos", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_l_end_pos_ext, { "l_end_pos_ext", "fileexp.l_end_pos_ext", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_l_fstype, { "l_fstype", "fileexp.l_fstype", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_l_pid, { "l_pid", "fileexp.l_pid", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_l_start_pos, { "l_start_pos", "fileexp.l_start_pos", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_l_start_pos_ext, { "l_start_pos_ext", "fileexp.l_start_pos_ext", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_l_sysid, { "l_sysid", "fileexp.l_sysid", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_l_type, { "l_type", "fileexp.l_type", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    { &hf_fileexp_l_whence, { "l_whence", "fileexp.l_whence", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} } ,
    {&hf_afsconnparams_mask, {"afs conn params mask", "fileexp.afs_connparams_mask", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
    {&hf_afsconnparams_values, {"afs conn params values", "fileexp.afs_connparams_values", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsFid_cell_high, {"Cell High", "fileexp.afsFid.cell_high", FT_UINT32, BASE_HEX, NULL, 0x0, "afsFid Cell High", HFILL}},
    {&hf_fileexp_afsFid_cell_low, {"Cell Low", "fileexp.afsFid.cell_low", FT_UINT32, BASE_HEX, NULL, 0x0, "afsFid Cell Low", HFILL}},
    {&hf_fileexp_afsFid_volume_high, {"Volume High", "fileexp.afsFid.volume_high", FT_UINT32, BASE_HEX, NULL, 0x0, "afsFid Volume High", HFILL}},
    {&hf_fileexp_afsFid_volume_low, {"Volume Low", "fileexp.afsFid.volume_low", FT_UINT32, BASE_HEX, NULL, 0x0, "afsFid Volume Low", HFILL}},
    {&hf_fileexp_afsFid_Vnode, {"Vnode", "fileexp.afsFid.Vnode", FT_UINT32, BASE_HEX, NULL, 0x0, "afsFid Vnode", HFILL}},
    {&hf_fileexp_afsFid_Unique, {"Unique", "fileexp.afsFid.Unique", FT_UINT32, BASE_HEX, NULL, 0x0, "afsFid Unique", HFILL}},
    {&hf_fileexp_afsNetAddr_type, {"Type", "fileexp.afsNetAddr.type", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsNetAddr_data, {"IP Data", "fileexp.afsNetAddr.data", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_position_high, {"Position High", "fileexp.position_high", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_position_low, {"Position Low", "fileexp.position_low", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsreturndesc_tokenid_high, {"Token id High", "fileexp.afsreturndesc_tokenid_high", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsreturndesc_tokenid_low, {"Token id low", "fileexp.afsreturndesc_tokenid_low", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsreturndesc_type_high, {"Type high", "fileexp.type_high", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsreturndesc_type_low, {"Type low", "fileexp.type_low", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_offsetp_high, {"offset high", "fileexp.offset_high", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_offsetp_low, {"offset high", "fileexp.offset_high", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_nextoffsetp_high, {"next offset high", "fileexp.nextoffset_high", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_nextoffsetp_low, {"next offset low", "fileexp.nextoffset_low", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_returntokenidp_high, {"return token idp high", "fileexp.returntokenidp_high", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_returntokenidp_low, {"return token idp low", "fileexp.returntokenidp_low", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_cellidp_high, {"cellidp high", "fileexp.cellidp_high", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_cellidp_low, {"cellidp low", "fileexp.cellidp_low", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_afserrorstatus_st, {"AFS Error Code", "fileexp.afserrortstatus_st", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_length, {"Length", "fileexp.length", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsTaggedPath_tp_chars, {"AFS Tagged Path", "fileexp.TaggedPath_tp_chars", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsTaggedPath_tp_tag, {"AFS Tagged Path Name", "fileexp.TaggedPath_tp_tag", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsacl_uuid1, {"AFS ACL UUID1", "fileexp.afsacl_uuid1", FT_GUID, BASE_NONE, NULL, 0x0, "UUID", HFILL}},
    {&hf_fileexp_bulkfetchstatus_size, {"BulkFetchStatus Size", "fileexp.bulkfetchstatus_size", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_bulkfetchvv_numvols, {"BulkFetchVv num vols", "fileexp.bulkfetchvv_numvols", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_bulkfetchvv_spare1, {"BulkFetchVv spare1", "fileexp.bulkfetchvv_spare1", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_bulkfetchvv_spare2, {"BulkFetchVv spare2", "fileexp.bulkfetchvv_spare2", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_bulkkeepalive_numexecfids, {"BulkKeepAlive numexecfids", "fileexp.bulkkeepalive_numexecfids", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_bulkkeepalive_spare4, {"BulkKeepAlive spare4", "fileexp.bulkfetchkeepalive_spare2", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_bulkkeepalive_spare2, {"BulkKeepAlive spare2", "fileexp.bulkfetchkeepalive_spare2", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_bulkkeepalive_spare1, {"BulkFetch KeepAlive spare1", "fileexp.bulkfetchkeepalive_spare1", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsacl_defaultcell_uuid, {"Default Cell UUID", "fileexp.defaultcell_uuid", FT_GUID, BASE_NONE, NULL, 0x0, "UUID", HFILL}},
    {&hf_fileexp_afsuuid_uuid, {"AFS UUID", "fileexp.uuid", FT_GUID, BASE_NONE, NULL, 0x0, "UUID", HFILL}},
    {&hf_fileexp_gettime_syncdispersion, {"GetTime Syncdispersion", "fileexp.gettime_syncdispersion", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_gettime_syncdistance, {"SyncDistance", "fileexp.gettime.syncdistance", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_gettime_usecondsp, {"GetTime usecondsp", "fileexp.gettime_usecondsp", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_readdir_size, {"Readdir Size", "fileexp.readdir.size", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsNameString_t_principalName_size, {"Principal Name Size", "fileexp.principalName_size", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsTaggedPath_tp_length, {"Tagged Path Length", "fileexp.afsTaggedPath_length", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_fstype, {"Filetype", "fileexp.fstype", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_gettime_secondsp, {"GetTime secondsp", "fileexp.gettime_secondsp", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_afsNameString_t_principalName_string, {"Principal Name", "fileexp.NameString_principal", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
    {&hf_fileexp_fetchdata_pipe_t_size, {"FetchData Pipe_t size", "fileexp.fetchdata_pipe_t_size", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
  };

  static gint *ett[] = {
    &ett_fileexp,
    &ett_fileexp_afsReturnDesc,
    &ett_fileexp_afsFid,
    &ett_fileexp_afsNetAddr,
    &ett_fileexp_fetchstatus,
    &ett_fileexp_afsflags,
    &ett_fileexp_volsync,
    &ett_fileexp_minvvp,
    &ett_fileexp_afsfidtaggedname,
    &ett_fileexp_afstaggedname,
    &ett_fileexp_afstoken,
    &ett_fileexp_afsstorestatus,
    &ett_fileexp_afsRecordLock,
    &ett_fileexp_afsAcl,
    &ett_fileexp_afsNameString_t,
    &ett_fileexp_afsConnParams,
    &ett_fileexp_afsErrorStatus,
    &ett_fileexp_afsTaggedPath,
    &ett_fileexp_afsNetData,
    &ett_fileexp_afsBulkStat,
    &ett_fileexp_afsuuid,
    &ett_fileexp_offsetp,
    &ett_fileexp_returntokenidp,
    &ett_fileexp_afsbundled_stat,
  };

  proto_fileexp = proto_register_protocol ("DCE DFS File Exporter", "FILEEXP", "fileexp");
  proto_register_field_array (proto_fileexp, hf, array_length (hf));
  proto_register_subtree_array (ett, array_length (ett));
}

void
proto_reg_handoff_fileexp (void)
{
  /*
   * Register the protocol as dcerpc
   */
  dcerpc_init_uuid (proto_fileexp, ett_fileexp, &uuid_fileexp, ver_fileexp,
		    fileexp_dissectors, hf_fileexp_opnum);
}
