1 /* packet-mswsp.c
2  * Routines for Windows Search Protocol dissection
3  * Copyright 2012, Gregor Beck <gregor.beck@sernet.de>
4  * Copyright 2015, Noel Power <noel.power@suse.com>
5  *
6  * Wireshark - Network traffic analyzer
7  * By Gerald Combs <gerald@wireshark.org>
8  * Copyright 1998 Gerald Combs
9  *
10  * SPDX-License-Identifier: GPL-2.0-or-later
11  */
12 
13 # include "config.h"
14 
15 #include <epan/packet.h>
16 #include <epan/expert.h>
17 #include <epan/proto_data.h>
18 #include <epan/exceptions.h>
19 
20 #include "packet-smb.h"
21 #include "packet-smb2.h"
22 #include "packet-dcom.h" /* HRESULT */
23 #include "to_str.h"
24 #include "packet-dcerpc-nt.h"
25 
26 void proto_register_mswsp(void);
27 
28 #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
29 
30 enum vType {
31 	VT_EMPTY       = 0x00,
32 	VT_NULL        = 0x01,
33 	VT_I2          = 0x02,
34 	VT_I4          = 0x03,
35 	VT_R4          = 0x04,
36 	VT_R8          = 0x05,
37 	VT_CY          = 0x06,
38 	VT_DATE        = 0x07,
39 	VT_BSTR        = 0x08,
40 	VT_ERROR       = 0x0a,
41 	VT_BOOL        = 0x0b,
42 	VT_VARIANT     = 0x0c,
43 	VT_DECIMAL     = 0x0e,
44 	VT_I1          = 0x10,
45 	VT_UI1         = 0x11,
46 	VT_UI2         = 0x12,
47 	VT_UI4         = 0x13,
48 	VT_I8          = 0x14,
G_DEFINE_FINAL_TYPE(GbpShellcmdList,gbp_shellcmd_list,GTK_TYPE_FRAME)49 	VT_UI8         = 0x15,
50 	VT_INT         = 0x16,
51 	VT_UINT        = 0x17,
52 	VT_LPSTR       = 0x1e,
53 	VT_LPWSTR      = 0x1f,
54 	VT_COMPRESSED_LPWSTR = 0x23,
55 	VT_FILETIME    = 0x40,
56 	VT_BLOB        = 0x41,
57 	VT_BLOB_OBJECT = 0x46,
58 	VT_CLSID       = 0x48,
59 	VT_VECTOR      = 0x1000,
60 	VT_ARRAY       = 0x2000
61 };
62 
63 struct data_blob {
gbp_shellcmd_list_init(GbpShellcmdList * self)64 	guint8 *data;
65 	guint32 size;
66 };
67 
68 struct data_str {
on_row_activated_cb(GbpShellcmdList * self,GbpShellcmdCommandRow * row,GtkListBox * list_box)69 	const char *str;
70 	guint32 len;
71 };
72 
73 struct vt_decimal {
74 	guint32 hi, lo, mid;
75 };
76 
77 
78 struct vt_vector {
79 	guint32 len;
80 	union  {
81 		gint8 *vt_i1;
82 		guint8 *vt_ui1;
83 		gint16 *vt_i2;
84 		guint16 *vt_ui2, *vt_bool;
85 		gint32 *vt_i4;
create_row_func(gpointer item,gpointer user_data)86 		guint32 *vt_ui4, *vt_error;
87 		gint64 *vt_i8, *vt_cy, *vt_filetime;
88 		guint64 *vt_ui8;
89 		float *vt_r4;
90 		double *vt_r8, *vt_date;
91 		e_guid_t *vt_clsid;
92 		struct data_blob *vt_blob, *vt_blob_object;
on_add_new_row_cb(GbpShellcmdList * self,GtkListBoxRow * row,GtkListBox * list_box)93 		struct data_str *vt_lpstr, *vt_lpwstr, *vt_compressed_lpwstr, *vt_bstr;
94 	} u;
95 };
96 
97 struct SAFEARRAYBOUNDS {
98 	guint32 cElements, lLbound;
99 };
100 
101 struct vt_array {
102 	struct vt_vector vData;
103 	guint16 cDims, fFeature;
104 	guint32 cbElements;
105 
106 	struct SAFEARRAYBOUNDS *Rgsabound;
107 };
108 
109 union vt_single
110 {
111 	gint8 vt_i1;
112 	guint8 vt_ui1;
113 	gint16 vt_i2;
114 	guint16 vt_ui2, vt_bool;
115 	gint32 vt_i4, vt_int;
116 	guint32 vt_ui4, vt_uint, vt_error;
117 	gint64 vt_i8, vt_cy, vt_filetime;
118 	guint64 vt_ui8;
119 	double vt_r8, vt_date;
120 	e_guid_t vt_clsid;
121 	float vt_r4;
122 	struct vt_decimal vt_decimal;
123 	struct data_blob vt_blob, vt_blob_object;
gbp_shellcmd_list_new(GbpShellcmdCommandModel * model)124 	struct data_str vt_lpstr, vt_lpwstr, vt_compressed_lpwstr, vt_bstr;
125 };
126 
127 union vValue {
128 	union vt_single vt_single;
129 	struct vt_vector vt_vector;
130 	struct vt_array vt_array;
131 };
132 
133 struct vtype_data {
134 	enum vType tag; /* base type, high bits cleared */
135 	const char *str;  /* string rep of base type */
136 	int size;        /* -1 for variable length */
137 	int (*tvb_get)(tvbuff_t*, int, void*);/* read StorageVariant */
138 	int (*tvb_get_value_only)(tvbuff_t*, int, int, void*);/*read StorageVariant value*/
139 	void (*strbuf_append)(wmem_strbuf_t*, void*);
140 };
141 
142 /* 2.2.1.1 */
143 struct CBaseStorageVariant {
144 	guint16 vType; /* value enum vType */
145 	guint16 vData1;
146 	guint16 vData2;
147 	union vValue vValue;
148 
149 	struct vtype_data *type;
150 };
151 
152 /*****************************************************/
153 
154 
155 enum rType {
156 	RTNone = 0,
157 	RTAnd,
158 	RTOr,
159 	RTNot,
160 	RTContent,
161 	RTProperty,
162 	RTProximity,
163 	RTVector,
164 	RTNatLanguage,
165 	RTScope,
166 	RTCoerce_Add,
167 	RTCoerce_Multiply,
168 	RTCoerce_Absolute,
169 	RTProb,
170 	RTFeedback,
171 	RTReldoc,
172 	RTReuseWhere = 0x11,
173 	RTInternalProp = 0x00fffffa,
174 	RTPhrase = 0x00fffffd
175 };
176 
177 
178 struct CRestriction;
179 
180 enum relop {
181 	PRLT = 0,
182 	PRLE,
183 	PRGT,
184 	PRGE,
185 	PREQ,
186 	PRNE,
187 	PRRE,
188 	PRAllBits,
189 	PRSomeBits,
190 	PRAll = 0x100,
191 	PRAny = 0x200
192 };
193 
194 enum PRSPEC_Kind {
195 	PRSPEC_LPWSTR = 0,
196 	PRSPEC_PROPID
197 };
198 
199 /* 2.2.1.2 */
200 struct CFullPropSpec {
201 	e_guid_t guid;
202 	enum PRSPEC_Kind kind;
203 	union {
204 		guint32 propid;
205 		const guint8 *name;
206 	} u;
207 };
208 
209 /* 2.2.1.7 */
210 struct CPropertyRestriction {
211 	guint32 relop; /*with value enum relop*/
212 	struct CFullPropSpec property;
213 	struct CBaseStorageVariant prval;
214 	guint32 lcid;
215 };
216 
217 /* 2.2.1.6 */
218 struct CNodeRestriction {
219 	guint32 cNode;
220 	struct CRestriction *paNode;
221 };
222 
223 /* 2.2.1.17 */
224 struct CRestriction {
225 	enum rType ulType;
226 	guint32 Weight;
227 	union {
228 		struct CNodeRestriction *RTAnd, *RTOr, *RTProximity, *RTPhrase;
229 		struct CRestriction *RTNot;
230 		struct CContentRestriction *RTContent;
231 		struct CPropertyRestriction *RTProperty;
232 		struct CVectorRestriction *RTVector;
233 		struct CNatLanguageRestriction *RTNatLanguage;
234 		struct CScopeRestriction *RTScope;
235 		struct CReuseWhere *RTReuseWhere;
236 		struct CInternalPropertyRestriction *RTInternalProp;
237 		struct CCoercionRestriction *RTCoerce_Add, *RTCoerce_Multiply, *RTCoerce_Absolute;
238 	} u;
239 };
240 
241 
242 /* 2.2.1.12 */
243 struct CCoercionRestriction {
244 	float value;
245 	struct CRestriction child;
246 };
247 
248 /* 2.2.1.3 */
249 struct CContentRestriction {
250 	struct CFullPropSpec property;
251 	const guint8 *phrase;
252 	guint32 lcid;
253 	guint32 method;
254 };
255 
256 /* 2.2.1.8 */
257 struct CReuseWhere /*Restriction*/ {
258 	guint32 whereId;
259 };
260 
261 /* 2.2.1.5 */
262 struct CNatLanguageRestriction {
263 	struct CFullPropSpec property;
264 	const guint8 *phrase;
265 	guint32 lcid;
266 };
267 
268 #define PROP_LENGTH 255
269 
270 enum aggtype {
271 	DBAGGTTYPE_BYNONE = 0x0,
272 	DBAGGTTYPE_SUM,
273 	DBAGGTTYPE_MAX,
274 	DBAGGTTYPE_MIN,
275 	DBAGGTTYPE_AVG,
276 	DBAGGTTYPE_COUNT,
277 	DBAGGTTYPE_CHILDCOUNT,
278 	DBAGGTTYPE_BYFREQ,
279 	DBAGGTTYPE_FIRST,
280 	DBAGGTTYPE_DATERANGE,
281 	DBAGGTTYPE_REPRESENTATIVEOF,
282 	DBAGGTTYPE_EDITDISTANCE,
283 };
284 
285 static const value_string DBAGGTTYPE[] = {
286 	{DBAGGTTYPE_BYNONE, "DBAGGTTYPE_BYNONE"},
287 	{DBAGGTTYPE_SUM, "DBAGGTTYPE_SUM"},
288 	{DBAGGTTYPE_MAX, "DBAGGTTYPE_MAX"},
289 	{DBAGGTTYPE_MIN, "DBAGGTTYPE_MIN"},
290 	{DBAGGTTYPE_AVG, "DBAGGTTYPE_AVG"},
291 	{DBAGGTTYPE_COUNT, "DBAGGTTYPE_COUNT"},
292 	{DBAGGTTYPE_CHILDCOUNT, "DBAGGTTYPE_CHILDCOUNT"},
293 	{DBAGGTTYPE_BYFREQ, "DBAGGTTYPE_BYFREQ"},
294 	{DBAGGTTYPE_FIRST, "DBAGGTTYPE_FIRST"},
295 	{DBAGGTTYPE_DATERANGE, "DBAGGTTYPE_DATERANGE"},
296 	{DBAGGTTYPE_REPRESENTATIVEOF, "DBAGGTTYPE_REPRESENTATIVEOF"},
297 	{DBAGGTTYPE_EDITDISTANCE, "DBAGGTTYPE_EDITDISTANCE"},
298 	{0, NULL}
299 };
300 
301 /* 2.2.1.44 */
302 struct CTableColumn {
303 	/*struct CFullPropSpec propspec;*/
304 	guint32 vtype;
305 	guint8  aggregateused;
306 	guint8  aggregatetype;
307 	guint8  valueused;
308 	guint16 valueoffset;
309 	guint16 valuesize;
310 	guint8  statusused;
311 	guint16 statusoffset;
312 	guint8  lengthused;
313 	guint16 lengthoffset;
314 	char name[PROP_LENGTH];
315 };
316 /* Minimum size in bytes on the wire CTableColumn can be */
317 #define MIN_CTABLECOL_SIZE 32
318 /* Maximum sane size in bytes on the wire CTableColumn can be. Arbitrary. */
319 #define MAX_CTABLECOL_SIZE 5000
320 
321 /* 2.2.3.10 */
322 
323 struct CPMSetBindingsIn {
324 	guint32 hcursor;
325 	guint32 brow;
326 	guint32 bbindingdesc;
327 	guint32 dummy;
328 	guint32 ccolumns;
329 	struct CTableColumn *acolumns;
330 };
331 
332 struct vector_or_array_64 {
333 	guint64 count;
334 	guint64 array_address;
335 };
336 
337 struct vector_or_array_32 {
338 	guint32 count;
339 	guint32 array_address;
340 };
341 
342 /* 2.2.1.42 */
343 struct CRowVariant {
344 	guint16 vtype;
345 	guint16 reserved1;
346 	guint32 reserved2;
347 	union {
348 		guint8  byte;
349 		guint16 shortw;
350 		guint32 longw;
351 		guint64 hyperw;
352 		union {
353 		    struct vector_or_array_64 i64;
354 		    struct vector_or_array_32 i32;
355 		} array_vector;
356 	} content;
357 };
358 
359 static int SMB1 = 1;
360 static int SMB2 = 2;
361 
362 void proto_reg_handoff_mswsp(void);
363 
364 static expert_field ei_mswsp_invalid_variant_type = EI_INIT;
365 static expert_field ei_missing_msg_context = EI_INIT;
366 static expert_field ei_mswsp_msg_cpmsetbinding_ccolumns = EI_INIT;
367 
368 static int proto_mswsp = -1;
369 static int hf_mswsp_msg = -1;
370 static int hf_mswsp_hdr = -1;
371 static int hf_mswsp_hdr_msg = -1;
372 static int hf_mswsp_hdr_status = -1;
373 static int hf_mswsp_hdr_checksum = -1;
374 static int hf_mswsp_hdr_reserved = -1;
375 static int hf_mswsp_msg_Connect_Version = -1;
376 static int hf_mswsp_msg_ConnectIn_ClientIsRemote = -1;
377 static int hf_mswsp_msg_ConnectIn_Blob1 = -1;
378 static int hf_mswsp_msg_ConnectIn_MachineName = -1;
379 static int hf_mswsp_msg_ConnectIn_UserName = -1;
380 static int hf_mswsp_msg_ConnectIn_PropSets_num = -1;
381 static int hf_mswsp_bool_options = -1;
382 static int hf_mswsp_bool_options_cursor = -1;
383 static int hf_mswsp_bool_options_async = -1;
384 static int hf_mswsp_bool_options_firstrows = -1;
385 static int hf_mswsp_bool_options_holdrows = -1;
386 static int hf_mswsp_bool_options_chaptered = -1;
387 static int hf_mswsp_bool_options_useci = -1;
388 static int hf_mswsp_bool_options_defertrim = -1;
389 static int hf_mswsp_bool_options_rowsetevents = -1;
390 static int hf_mswsp_bool_options_dontcomputeexpensive = -1;
391 static int hf_mswsp_guid_time_low = -1;
392 static int hf_mswsp_guid_time_mid = -1;
393 static int hf_mswsp_guid_time_high = -1;
394 static int hf_mswsp_guid_time_clock_hi = -1;
395 static int hf_mswsp_guid_time_clock_low = -1;
396 static int hf_mswsp_guid_node = -1;
397 static int hf_mswsp_lcid = -1;
398 static int hf_mswsp_lcid_sortid = -1;
399 static int hf_mswsp_lcid_langid = -1;
400 static int hf_mswsp_cscort_column = -1;
401 static int hf_mswsp_cscort_order = -1;
402 static int hf_mswsp_cscort_individual = -1;
403 static int hf_mswsp_cscortset_count = -1;
404 static int hf_mswsp_ctablecolumn_vtype = -1;
405 static int hf_mswsp_ctablecolumn_aggused = -1;
406 static int hf_mswsp_ctablecolumn_aggtype = -1;
407 static int hf_mswsp_ctablecolumn_valused = -1;
408 static int hf_mswsp_ctablecolumn_valoffset = -1;
409 static int hf_mswsp_ctablecolumn_valsize = -1;
410 static int hf_mswsp_ctablecolumn_statused = -1;
411 static int hf_mswsp_ctablecolumn_statoffset = -1;
412 static int hf_mswsp_ctablecolumn_lenused = -1;
413 static int hf_mswsp_ctablecolumn_lenoffset = -1;
414 static int hf_mswsp_cfullpropspec_kind = -1;
415 static int hf_mswsp_cfullpropspec_propid = -1;
416 static int hf_mswsp_cfullpropspec_propname = -1;
417 static int hf_mswsp_cproprestrict_relop = -1;
418 static int hf_mswsp_ccoercerestrict_value = -1;
419 static int hf_mswsp_ccontentrestrict_cc = -1;
420 static int hf_mswsp_ccontentrestrict_phrase = -1;
421 static int hf_mswsp_ccontentrestrict_method = -1;
422 static int hf_mswsp_natlangrestrict_cc = -1;
423 static int hf_mswsp_natlangrestrict_phrase = -1;
424 static int hf_mswsp_crestrict_ultype = -1;
425 static int hf_mswsp_crestrict_weight = -1;
426 static int hf_mswsp_crestrictarray_count = -1;
427 static int hf_mswsp_crestrictarray_present = -1;
428 static int hf_mswsp_cnoderestrict_cnode = -1;
429 static int hf_mswsp_cbasestorvariant_vtype = -1;
430 static int hf_mswsp_cbasestorvariant_vvalue = -1;
431 static int hf_mswsp_cbasestorvariant_vdata1 = -1;
432 static int hf_mswsp_cbasestorvariant_vdata2 = -1;
433 static int hf_mswsp_cbasestorvariant_num = -1;
434 static int hf_mswsp_cbasestorvariant_cdims = -1;
435 static int hf_mswsp_cbasestorvariant_ffeatures = -1;
436 static int hf_mswsp_cbasestorvariant_cbelements = -1;
437 static int hf_mswsp_cbasestorvariant_rgsabound = -1;
438 static int hf_mswsp_cdbcolid_ekind = -1;
439 static int hf_mswsp_cdbcolid_ulid = -1;
440 static int hf_mswsp_cdbcolid_vstring = -1;
441 static int hf_mswsp_cdbprop_id = -1;
442 static int hf_mswsp_cdbprop_options = -1;
443 static int hf_mswsp_cdbprop_status = -1;
444 static int hf_mswsp_cdbpropset_cprops = -1;
445 static int hf_mswsp_rangeboundry_ultype = -1;
446 static int hf_mswsp_rangeboundry_labelpresent = -1;
447 static int hf_mswsp_rangeboundry_cclabel = -1;
448 static int hf_mswsp_rangeboundry_label = -1;
449 static int hf_mswsp_crangecategspec_crange = -1;
450 static int hf_mswsp_ccategspec_type = -1;
451 static int hf_mswsp_caggregspec_type = -1;
452 static int hf_mswsp_caggregspec_ccalias = -1;
453 static int hf_mswsp_caggregspec_alias = -1;
454 static int hf_mswsp_caggregspec_idcolumn = -1;
455 static int hf_mswsp_caggregspec_ulmaxnumtoreturn = -1;
456 static int hf_mswsp_caggregspec_idrepresentative = -1;
457 static int hf_mswsp_caggregset_count = -1;
458 static int hf_mswsp_caggregsortkey_order = -1;
459 static int hf_mswsp_csortaggregset_count = -1;
460 static int hf_mswsp_cingroupsortaggregset_type = -1;
461 static int hf_mswsp_cingroupsortaggregsets_count = -1;
462 static int hf_mswsp_categorizationspec_cmaxres= -1;
463 static int hf_mswsp_crowsetprops_ulmaxopenrows = -1;
464 static int hf_mswsp_crowsetprops_ulmemusage = -1;
465 static int hf_mswsp_crowsetprops_cmaxresults = -1;
466 static int hf_mswsp_crowsetprops_ccmdtimeout = -1;
467 static int hf_mswsp_cpidmapper_count = -1;
468 static int hf_mswsp_ccolumngroup_count = -1;
469 static int hf_mswsp_ccolumngroup_grouppid = -1;
470 static int hf_mswsp_ccolumngroup_pid = -1;
471 static int hf_mswsp_ccolumngrouparray_count = -1;
472 static int hf_mswsp_int32array_value = -1;
473 static int hf_mswsp_crowseeknext_cskip = -1;
474 static int hf_mswsp_crowseekat_bmkoffset = -1;
475 static int hf_mswsp_crowseekat_skip = -1;
476 static int hf_mswsp_crowseekat_hregion = -1;
477 static int hf_mswsp_crowseekatratio_ulnumerator = -1;
478 static int hf_mswsp_crowseekatratio_uldenominator = -1;
479 static int hf_mswsp_crowseekatratio_hregion = -1;
480 static int hf_mswsp_crowseekbybookmark_cbookmarks = -1;
481 static int hf_mswsp_crowseekbybookmark_maxret = -1;
482 static int hf_mswsp_crowvariantinfo_count64 = -1;
483 static int hf_mswsp_arrayvector_address64 = -1;
484 static int hf_mswsp_crowvariantinfo_count32 = -1;
485 static int hf_mswsp_arrayvector_address32 = -1;
486 static int hf_mswsp_rowvariant_item_address64 = -1;
487 static int hf_mswsp_rowvariant_item_address32 = -1;
488 static int hf_mswsp_rowvariant_item_value = -1;
489 static int hf_mswsp_rowvariant_vtype = -1;
490 static int hf_mswsp_rowvariant_reserved1 = -1;
491 static int hf_mswsp_rowvariant_reserved2 = -1;
492 static int hf_mswsp_ctablecolumn_status = -1;
493 static int hf_mswsp_ctablecolumn_length = -1;
494 static int hf_mswsp_msg_cpmcreatequery_size = -1;
495 static int hf_mswsp_msg_cpmcreatequery_ccolumnsetpresent = -1;
496 static int hf_mswsp_msg_cpmcreatequery_crestrictionpresent = -1;
497 static int hf_mswsp_msg_cpmcreatequery_csortpresent = -1;
498 static int hf_mswsp_msg_cpmcreatequery_ccategpresent = -1;
499 static int hf_mswsp_msg_cpmcreatequery_ccateg_count = -1;
500 static int hf_mswsp_msg_cpmcreatequery_trueseq = -1;
501 static int hf_mswsp_msg_cpmcreatequery_workid = -1;
502 static int hf_mswsp_msg_cpmcreatequery_cursors = -1;
503 static int hf_mswsp_msg_cpmgetrows_hcursor = -1;
504 static int hf_mswsp_msg_cpmgetrows_rowstotransfer = -1;
505 static int hf_mswsp_msg_cpmgetrows_rowwidth = -1;
506 static int hf_mswsp_msg_cpmgetrows_cbseek = -1;
507 static int hf_mswsp_msg_cpmgetrows_cbreserved = -1;
508 static int hf_mswsp_msg_cpmgetrows_cbreadbuffer = -1;
509 static int hf_mswsp_msg_cpmgetrows_ulclientbase = -1;
510 static int hf_mswsp_msg_cpmgetrows_fbwdfetch = -1;
511 static int hf_mswsp_msg_cpmgetrows_etype = -1;
512 static int hf_mswsp_msg_cpmgetrows_chapt = -1;
513 static int hf_mswsp_msg_cpmgetrows_crowsreturned = -1;
514 static int hf_mswsp_msg_cpmratiofinished_hcursor = -1;
515 static int hf_mswsp_msg_cpmratiofinished_fquick = -1;
516 static int hf_mswsp_msg_cpmratiofinished_ulnumerator = -1;
517 static int hf_mswsp_msg_cpmratiofinished_uldenominator = -1;
518 static int hf_mswsp_msg_cpmratiofinished_crows = -1;
519 static int hf_mswsp_msg_cpmratiofinished_fnewrows = -1;
520 static int hf_mswsp_msg_cpmcomparebmk_hcursor = -1;
521 static int hf_mswsp_msg_cpmcomparebmk_chapt = -1;
522 static int hf_mswsp_msg_cpmcomparebmk_bmkfirst = -1;
523 static int hf_mswsp_msg_cpmcomparebmk_bmksecond = -1;
524 static int hf_mswsp_msg_cpmcomparebmk_dwcomparison = -1;
525 static int hf_mswsp_msg_cpmgetapproxpos_hcursor = -1;
526 static int hf_mswsp_msg_cpmgetapproxpos_chapt = -1;
527 static int hf_mswsp_msg_cpmgetapproxpos_bmk = -1;
528 static int hf_mswsp_msg_cpmgetapproxpos_numerator = -1;
529 static int hf_mswsp_msg_cpmgetapproxpos_denominator = -1;
530 static int hf_mswsp_msg_cpmsetbinding_hcursor = -1;
531 static int hf_mswsp_msg_cpmsetbinding_cbrow = -1;
532 static int hf_mswsp_msg_cpmsetbinding_desc = -1;
533 static int hf_mswsp_msg_cpmsetbinding_dummy = -1;
534 static int hf_mswsp_msg_cpmsetbinding_ccolumns = -1;
535 static int hf_mswsp_msg_cpmsetbinding_acolumns = -1;
536 static int hf_mswsp_msg_cpmsendnotify_watchnotify = -1;
537 static int hf_mswsp_msg_cpmgetquerystatus_hcursor = -1;
538 static int hf_mswsp_msg_cpmgetquerystatus_qstatus = -1;
539 static int hf_mswsp_msg_cpmcistate_cbstruct = -1;
540 static int hf_mswsp_msg_cpmcistate_cwordlist = -1;
541 static int hf_mswsp_msg_cpmcistate_cpersistindex = -1;
542 static int hf_mswsp_msg_cpmcistate_cqueries = -1;
543 static int hf_mswsp_msg_cpmcistate_cfreshtest = -1;
544 static int hf_mswsp_msg_cpmcistate_dwmergeprogress = -1;
545 static int hf_mswsp_msg_cpmcistate_estate = -1;
546 static int hf_mswsp_msg_cpmcistate_cfiltereddocs = -1;
547 static int hf_mswsp_msg_cpmcistate_ctotaldocs = -1;
548 static int hf_mswsp_msg_cpmcistate_cpendingscans = -1;
549 static int hf_mswsp_msg_cpmcistate_dwindexsize = -1;
550 static int hf_mswsp_msg_cpmcistate_cuniquekeys = -1;
551 static int hf_mswsp_msg_cpmcistate_csecqdocuments = -1;
552 static int hf_mswsp_msg_cpmcistate_dwpropcachesize = -1;
553 static int hf_mswsp_msg_cpmfetchvalue_wid = -1;
554 static int hf_mswsp_msg_cpmfetchvalue_cbsofar = -1;
555 static int hf_mswsp_msg_cpmfetchvalue_cbpropspec = -1;
556 static int hf_mswsp_msg_cpmfetchvalue_cbchunk = -1;
557 static int hf_mswsp_msg_cpmfetchvalue_cbvalue = -1;
558 static int hf_mswsp_msg_cpmfetchvalue_fmoreexists = -1;
559 static int hf_mswsp_msg_cpmfetchvalue_fvalueexists = -1;
560 static int hf_mswsp_msg_cpmfetchvalue_vvalue = -1;
561 static int hf_mswsp_msg_cpmquerystatusex_hcursor = -1;
562 static int hf_mswsp_msg_cpmquerystatusex_bmk = -1;
563 static int hf_mswsp_msg_cpmquerystatusex_qstatus = -1;
564 static int hf_mswsp_msg_cpmquerystatusex_cfiltereddocs = -1;
565 static int hf_mswsp_msg_cpmquerystatusex_cdocstofilter = -1;
566 static int hf_mswsp_msg_cpmquerystatusex_dwratiodenom = -1;
567 static int hf_mswsp_msg_cpmquerystatusex_dwrationumer = -1;
568 static int hf_mswsp_msg_cpmquerystatusex_irowbmk = -1;
569 static int hf_mswsp_msg_cpmquerystatusex_crowstotal = -1;
570 static int hf_mswsp_msg_cpmquerystatusex_maxrank = -1;
571 static int hf_mswsp_msg_cpmquerystatusex_cresultsfound = -1;
572 static int hf_mswsp_msg_cpmquerystatusex_whereid = -1;
573 static int hf_mswsp_msg_cpmrestartposition_hcursor = -1;
574 static int hf_mswsp_msg_cpmrestartposition_chapt = -1;
575 static int hf_mswsp_msg_cpmgetrowsetnotify_wid = -1;
576 static int hf_mswsp_msg_cpmgetrowsetnotify_moreevents = -1;
577 static int hf_mswsp_msg_cpmgetrowsetnotify_eventtype = -1;
578 static int hf_mswsp_msg_cpmgetrowsetnotify_rowsetitemstate = -1;
579 static int hf_mswsp_msg_cpmgetrowsetnotify_changeditemstate = -1;
580 static int hf_mswsp_msg_cpmgetrowsetnotify_rowsetevent = -1;
581 static int hf_mswsp_msg_cpmgetrowsetnotify_rowseteventdata1 = -1;
582 static int hf_mswsp_msg_cpmgetrowsetnotify_rowseteventdata2 = -1;
583 static int hf_mswsp_msg_cpmfindindices_cwids = -1;
584 static int hf_mswsp_msg_cpmfindindices_cdepthprev = -1;
585 static int hf_mswsp_msg_cpmfindindices_cdepthnext = -1;
586 static int hf_mswsp_msg_cpmsetscopeprioritization_priority = -1;
587 static int hf_mswsp_msg_cpmsetscopeprioritization_eventfreq = -1;
588 static int hf_mswsp_msg_cpmsetscopestatisics_dwindexitems = -1;
589 static int hf_mswsp_msg_cpmsetscopestatisics_dwoutstandingadds = -1;
590 static int hf_mswsp_msg_cpmsetscopestatisics_dwoutstandingmodifies = -1;
591 
592 static gint ett_mswsp = -1;
593 static gint ett_mswsp_hdr = -1;
594 static gint ett_mswsp_msg = -1;
595 static gint ett_mswsp_pad = -1;
596 
597 static gint ett_mswsp_property_restriction = -1;
598 static gint ett_CRestrictionArray = -1;
599 static gint ett_CBaseStorageVariant = -1;
600 static gint ett_CBaseStorageVariant_Vector = -1;
601 static gint ett_CBaseStorageVariant_Array = -1;
602 static gint ett_CDbColId = -1;
603 static gint ett_GUID = -1;
604 static gint ett_CDbProp = -1;
605 static gint ett_CDbPropSet = -1;
606 static gint ett_CDbPropSet_Array = -1;
607 static gint ett_CRestriction = -1;
608 static gint ett_CNodeRestriction = -1;
609 static gint ett_CPropertyRestriction = -1;
610 static gint ett_CCoercionRestriction = -1;
611 static gint ett_CContentRestriction = -1;
612 static gint ett_RANGEBOUNDARY = -1;
613 static gint ett_CRangeCategSpec = -1;
614 static gint ett_CCategSpec = -1;
615 static gint ett_CAggregSpec = -1;
616 static gint ett_CAggregSet = -1;
617 static gint ett_CCategorizationSpec = -1;
618 static gint ett_CAggregSortKey = -1;
619 static gint ett_CSortAggregSet = -1;
620 static gint ett_CInGroupSortAggregSet = -1;
621 static gint ett_CInGroupSortAggregSets = -1;
622 static gint ett_CRowsetProperties = -1;
623 static gint ett_CFullPropSpec = -1;
624 static gint ett_CPidMapper = -1;
625 static gint ett_CSort = -1;
626 static gint ett_CSortSet = -1;
627 static gint ett_CNatLanguageRestriction = -1;
628 static gint ett_CColumnGroup = -1;
629 static gint ett_CColumnGroupArray = -1;
630 static gint ett_LCID = -1;
631 static gint ett_CTableColumn = -1;
632 static gint ett_Array = -1;
633 static gint ett_SeekDescription = -1;
634 static gint ett_CRowsSeekNext = -1;
635 static gint ett_CRowsSeekAt = -1;
636 static gint ett_CRowsSeekAtRatio = -1;
637 static gint ett_CRowsSeekByBookmark = -1;
638 static gint ett_GetRowsRow = -1;
639 static gint ett_GetRowsColumn = -1;
640 static gint ett_CRowVariant = -1;
641 static gint ett_CRowVariant_Vector = -1;
642 static gint ett_mswsp_bool_options = -1;
643 static gint ett_mswsp_uin32_array = -1;
644 static gint ett_mswsp_msg_padding = -1;
645 static gint ett_mswsp_msg_creusewhere = -1;
646 
647 static struct vtype_data *vType_get_type(guint16 t);
648 
649 /* converstation related data */
650 struct rows_data {
651 	guint32 ulclientbase;
652 	guint32 cbreserved;
653 };
654 
655 
656 struct message_data {
657 	guint32 fid;
658 	guint frame;
659 	guint16 msg_id;
660 	gboolean is_request;
661 	int smb_level;
662 	union {
663 		struct CPMSetBindingsIn bindingsin;/* CPMBindingIn request */
664 		struct rows_data rowsin; /*CPMGetRowsIn request*/
665 		guint32 version; /*CPMConnectIn requst/respose */
666 	} content;
667 };
668 
669 struct mswsp_ct {
670 	GSList *GSL_message_data;
671 };
672 
673 static gint msg_data_find(struct message_data *a, struct message_data *b)
674 {
675 	if (a->fid == b->fid
676 		&& a->frame == b->frame
677 		&& a->msg_id == b->msg_id
678 		&& a->smb_level == b->smb_level
679 		&& a->is_request == b->is_request) {
680 		return 0;
681 	}
682 	return 1;
683 }
684 static  smb_fid_info_t *find_fid_info(smb_info_t *si)
685 {
686 	smb_fid_info_t *fid_info = NULL;
687 	smb_transact_info_t *tri = (smb_transact_info_t *)((si->sip && (si->sip->extra_info_type == SMB_EI_TRI)) ? si->sip->extra_info : NULL);
688 	GSList *iter;
689 	guint32 fid = 0;
690 
691 	if (tri == NULL) {
692 		/* fallback to try search visited RWINFO (for AndX request/response) */
693 		if (si->sip && (si->sip->extra_info_type == SMB_EI_RWINFO)) {
694 			fid = si->sip->fid;
695 		}
696 	} else {
697 		fid = tri->fid;
698 	}
699 
700 
701 	if (!fid) {
702 		return NULL;
703 	}
704 	for (iter = si->ct->GSL_fid_info; iter; iter = iter->next) {
705 		smb_fid_info_t *info = (smb_fid_info_t *)iter->data;
706 		if ((info->tid == si->tid) && (info->fid == fid)) {
707 			fid_info = info;
708 			break;
709 		}
710 	}
711 	return fid_info;
712 }
713 
714 static gboolean get_fid_and_frame(packet_info *pinfo, guint32 *fid, guint *frame,
715 							  void *data)
716 {
717 	gboolean result = TRUE;
718 	int *p_smb_level = (int*)p_get_proto_data(wmem_file_scope(), pinfo, proto_mswsp, 0);
719 	if (!p_smb_level) {
720 		return FALSE;
721 	}
722 	*frame = pinfo->num;
723 	if (*p_smb_level == SMB1) {
724 		smb_info_t *si = (smb_info_t*)data;
725 		smb_fid_info_t *info;
726 		info = find_fid_info(si);
727 		if (!info) {
728 			return FALSE;
729 		}
730 		*fid = info->fid;
731 	} else {
732 		smb2_info_t *si2 = (smb2_info_t*)data;
733 		guint32     open_frame = 0, close_frame = 0;
734 		char       *fid_name = NULL;
735 		if (si2->saved) {
736 			dcerpc_fetch_polhnd_data(&si2->saved->policy_hnd, &fid_name, NULL, &open_frame, &close_frame, pinfo->num);
737 			*fid = open_frame;
738 		} else {
739 			result = FALSE;
740 		}
741 	}
742 	return result;
743 }
744 
745 static struct message_data *find_or_create_message_data(struct mswsp_ct *conv_data, packet_info *pinfo, guint16 msg_id, gboolean is_request, void *data)
746 {
747 	struct message_data to_find;
748 	struct message_data* msg_data = NULL;
749 	GSList *result = NULL;
750 	int *p_smb_level = (int*)p_get_proto_data(wmem_file_scope(), pinfo, proto_mswsp, 0);
751 	to_find.is_request = is_request;
752 	to_find.msg_id = msg_id;
753 	to_find.smb_level = *p_smb_level;
754 	if (!get_fid_and_frame(pinfo, &to_find.fid, &to_find.frame, data) || !conv_data) {
755 		return msg_data;
756 	}
757 	result = g_slist_find_custom(conv_data->GSL_message_data,
758 								 &to_find, (GCompareFunc)msg_data_find);
759 	if (!result) {
760 		msg_data = wmem_new(wmem_file_scope(), struct message_data);
761 		*msg_data = to_find;
762 		conv_data->GSL_message_data = g_slist_prepend(conv_data->GSL_message_data, msg_data);
763 	} else {
764 		msg_data = (struct message_data*)result->data;
765 	}
766 	return msg_data;
767 }
768 
769 static struct mswsp_ct *get_create_converstation_data(packet_info *pinfo)
770 {
771 	struct mswsp_ct *ct = NULL;
772 	conversation_t *conversation;
773 
774 	conversation = find_or_create_conversation(pinfo);
775 	if (!conversation) {
776 		return NULL;
777 	}
778 	ct = (struct mswsp_ct*)conversation_get_proto_data(conversation, proto_mswsp);
779 	if (!ct) {
780 		ct = wmem_new(wmem_file_scope(), struct mswsp_ct);
781 		ct->GSL_message_data = NULL;
782 		conversation_add_proto_data(conversation, proto_mswsp, ct);
783 	}
784 
785 	return ct;
786 }
787 
788 static struct message_data *
789 find_matching_request_by_fid(struct mswsp_ct *ct, packet_info *pinfo, guint32 msg, gboolean in, void *private_data)
790 {
791 	guint32 fid = 0;
792 	guint frame = 0;
793 	GSList *iter;
794 	int *p_smb_level = (int*)p_get_proto_data(wmem_file_scope(), pinfo, proto_mswsp, 0);
795 
796 	struct message_data *result = NULL;
797 	get_fid_and_frame(pinfo, &fid, &frame, private_data);
798 	for (iter = ct->GSL_message_data; iter; iter = iter->next) {
799 		struct message_data* data = (struct message_data*)iter->data;
800 		if (data->frame < frame && data->fid == fid && data->is_request == in
801 			&& data->msg_id == msg && data->smb_level == *p_smb_level) {
802 			result = data;
803 			break;
804 		}
805 	}
806 	return result;
807 }
808 
809 static struct CPMSetBindingsIn *
810 find_binding_msg_data(struct mswsp_ct *ct, packet_info *pinfo, void *private_data)
811 {
812 	struct CPMSetBindingsIn *result = NULL;
813 	struct message_data *data = find_matching_request_by_fid(ct, pinfo, 0xD0, TRUE, private_data);
814 	if (data) {
815 		result = &data->content.bindingsin;
816 	}
817 	return result;
818 }
819 
820 static struct rows_data *
821 find_rowsin_msg_data(struct mswsp_ct *ct, packet_info *pinfo, void *private_data)
822 {
823 	struct rows_data *result = NULL;
824 	struct message_data *data = find_matching_request_by_fid(ct, pinfo, 0xCC, TRUE, private_data);
825 	if (data) {
826 		result = &data->content.rowsin;
827 	}
828 	return result;
829 }
830 
831 static gboolean is_64bit_mode(struct mswsp_ct *ct, packet_info *pinfo, gboolean *result, void *private_data)
832 {
833 	guint32 client_ver = 0;
834 	guint32 server_ver = 0;
835 	struct message_data *data = find_matching_request_by_fid(ct, pinfo, 0xC8,
836 								TRUE, private_data);
837 	if (data) {
838 		client_ver = data->content.version;
839 		data = find_matching_request_by_fid(ct, pinfo, 0xC8, FALSE, private_data);
840 		if (data) {
841 			server_ver = data->content.version;
842 			*result = (server_ver & 0xffff0000) && (client_ver & 0xffff0000);
843 			return TRUE;
844 		}
845 	}
846 	return FALSE;
847 }
848 
849 #define eSequential			0x00000001
850 #define eLocateable			0x00000003
851 #define eScrollable			0x00000007
852 #define eAsynchronous			0x00000008
853 #define eFirstRows			0x00000080
854 #define eHoldRows			0x00000200
855 #define eChaptered			0x00000800
856 #define eUseCI				0x00001000
857 #define eDeferTrimming			0x00002000
858 #define eEnableRowsetEvents		0x00800000
859 #define eDoNotComputeExpensiveProps	0x00400000
860 
861 static const value_string cursor_vals[] = {
862 	{ eSequential, "eSequential" },
863 	{ eLocateable, "eLocateable" },
864 	{ eScrollable, "eScrollable" },
865 	{ 0, NULL }
866 };
867 
868 
869 
870 /******************************************************************************/
871 struct GuidPropertySet {
872 	e_guid_t guid;
873 	const char *def;
874 	const char *desc;
875 	const value_string *id_map;
876 };
877 
878 /* 2.2.1.31.1 */
879 static const value_string DBPROPSET_FSCIFRMWRK_EXT_IDS[] = {
880 	{0x02, "DBPROP_CI_CATALOG_NAME"},
881 	{0x03, "DBPROP_CI_INCLUDE_SCOPES"},
882 	{0x04, "DBPROP_CI_SCOPE_FLAGS"},
883 	{0x07, "DBPROP_CI_QUERY_TYPE"},
884 	{0, NULL}
885 };
886 
887 static const value_string DBPROPSET_QUERYEXT_IDS[] = {
888 	{0x02, "DBPROP_USECONTENTINDEX"},
889 	{0x03, "DBPROP_DEFERNONINDEXEDTRIMMING"},
890 	{0x04, "DBPROP_USEEXTENDEDDBTYPES"},
891 	{0x05, "DBPROP_IGNORENOISEONLYCLAUSES"},
892 	{0x06, "DBPROP_GENERICOPTIONS_STRING"},
893 	{0x07, "DBPROP_FIRSTROWS"},
894 	{0x08, "DBPROP_DEFERCATALOGVERIFICATION"},
895 	{0x0a, "DBPROP_GENERATEPARSETREE"},
896 	{0x0c, "DBPROP_FREETEXTANYTERM"},
897 	{0x0d, "DBPROP_FREETEXTUSESTEMMING"},
898 	{0x0e, "DBPROP_IGNORESBRI"},
899 	{0x10, "DBPROP_ENABLEROWSETEVENTS"},
900 	{0, NULL}
901 };
902 
903 static const value_string DBPROPSET_CIFRMWRKCORE_EXT_IDS[] = {
904 	{0x02, "DBPROP_MACHINE"},
905 	{0x03, "DBPROP_CLIENT_CLSID"},
906 	{0, NULL}
907 };
908 
909 static const value_string DBPROPSET_MSIDXS_ROWSETEXT_IDS[] = {
910 	{0x02, "MSIDXSPROP_ROWSETQUERYSTATUS"},
911 	{0x03, "MSIDXSPROP_COMMAND_LOCALE_STRING"},
912 	{0x04, "MSIDXSPROP_QUERY_RESTRICTION"},
913 	{0x05, "MSIDXSPROP_PARSE_TREE"},
914 	{0x06, "MSIDXSPROP_MAX_RANK"},
915 	{0x07, "MSIDXSPROP_RESULTS_FOUND"},
916 	{0, NULL}
917 };
918 
919 /* 2.2.5.1 */
920 static const value_string QueryGuid_IDS[] = {
921 	{0x02, "RankVector"},
922 	{0x03, "System.Search.Rank"},
923 	{0x04, "System.Search.HitCount"},
924 	{0x05, "System.Search.EntryID"},
925 	{0x06, "All"},
926 	{0x8, "System.Search.ReverseFileName"},
927 	{0x09, "System.ItemURL"},
928 	{0xa, "System.ContentUrl"},
929 	{0, NULL}
930 };
931 
932 /* 2.2.5.2 */
933 static const value_string StorageGuid_IDS[] = {
934 	{0x02, "System.ItemFolderNameDisplay"},
935 	{0x03, "ClassId"},
936 	{0x04, "System.ItemTypeText"},
937 	{0x08, "FileIndex"},
938 	{0x09, "USN"},
939 	{0x0a, "System.ItemNameDisplay"},
940 	{0x0b, "Path"},
941 	{0x0c, "System.Size"},
942 	{0x0d, "System.FileAttributes"},
943 	{0x0e, "System.DateModified"},
944 	{0x0f, "System.DateCreated"},
945 	{0x10, "System.DateAccessed"},
946 	{0x12, "AllocSize"},
947 	{0x13, "System.Search.Contents"},
948 	{0x14, "ShortFilename"},
949 	{0x15, "System.FileFRN"},
950 	{0x16, "Scope"},
951 	{0, NULL}
952 };
953 
954 static const value_string DocPropSetGuid_IDS[] = {
955 	{0x02, "System.Title"},
956 	{0x03, "System.Subject"},
957 	{0x04, "System.Author"},
958 	{0x05, "System.Keywords"},
959 	{0x06, "System.Comment"},
960 	{0x07, "DocTemplate"},
961 	{0x08, "System.Document.LastAuthor"},
962 	{0x09, "System.Document.RevisionNumber"},
963 	{0x0a, "System.Document.TotalEditTime"},
964 	{0x0b, "System.Document.DatePrinted"},
965 	{0x0c, "System.Document.DateCreated"},
966 	{0x0d, "System.Document.DateSaved"},
967 	{0x0e, "System.Document.PageCount"},
968 	{0x0f, "System.Document.WordCount"},
969 	{0x10, "System.Document.CharacterCount"},
970 	{0x11, "DocThumbnail"},
971 	{0x12, "System.ApplicationName"},
972 	{0, NULL}
973 };
974 
975 static const value_string ShellDetails_IDS[] = {
976 	{ 5, "System.ComputerName"},
977 	{ 8, "System.ItemPathDisplayNarrow"},
978 	{ 9, "PerceivedType"},
979 	{11, "System.ItemType"},
980 	{12, "FileCount"},
981 	{14, "TotalFileSize"},
982 	{24, "System.ParsingName"},
983 	{25, "System.SFGAOFlags"},
984 	{0, NULL}
985 };
986 
987 static const value_string PropSet1_IDS[] = {
988 	{100, "System.ThumbnailCacheId"},
989 	{0, NULL}
990 };
991 
992 static const value_string PropSet2_IDS[] = {
993 	{3, "System.Kind"},
994 	{0, NULL}
995 };
996 
997 static const value_string MusicGuid_IDS[] = {
998 	{0x2, "System.Music.Artist"},
999 	{0x4, "System.Music.AlbumTitle"},
1000 	{0x5, "System.Media.Year"},
1001 	{0x7, "System.Music.TrackNumber"},
1002 	{0xb, "System.Music.Genre"},
1003 	{0xc, "System.Music.Lyrics"},
1004 	{0xd, "System.Music.AlbumArtist"},
1005 	{0x21, "System.Music.ContentGroupDescription"},
1006 	{0x22, "System.Music.InitialKey"},
1007 	{0x23, "System.Music.BeatsPerMinute"},
1008 	{0x24, "System.Music.Conductor"},
1009 	{0x25, "System.Music.PartOfSet"},
1010 	{0x26, "System.Media.SubTitle"},
1011 	{0x27, "System.Music.Mood"},
1012 	{0x64, "System.Music.AlbumID"},
1013 	{0, NULL}
1014 };
1015 
1016 static const value_string PropSet3_IDS[] = {
1017 	{ 2, "System.Message.BccAddress"},
1018 	{ 3, "System.Message.BccName"},
1019 	{ 4, "System.Message.CcAddress"},
1020 	{ 5, "System.Message.CcName"},
1021 	{ 6, "System.ItemFolderPathDisplay"},
1022 	{ 7, "System.ItemPathDisplay"},
1023 	{ 9, "System.Communication.AccountName"},
1024 	{10, "System.IsRead"},
1025 	{11, "System.Importance"},
1026 	{12, "System.FlagStatus"},
1027 	{13, "System.Message.FromAddress"},
1028 	{14, "System.Message.FromName"},
1029 	{15, "System.Message.Store"},
1030 	{16, "System.Message.ToAddress"},
1031 	{17, "System.Message.ToName"},
1032 	{18, "System.Contact.WebPage"},
1033 	{19, "System.Message.DateSent"},
1034 	{20, "System.Message.DateReceived"},
1035 	{21, "System.Message.AttachmentNames"},
1036 	{0, NULL}
1037 };
1038 
1039 static const value_string PropSet4_IDS[] = {
1040 	{100, "System.ItemFolderPathDisplayNarrow"},
1041 	{0, NULL}
1042 };
1043 
1044 static const value_string PropSet5_IDS[] = {
1045 	{100, "System.Contact.FullName"},
1046 	{0, NULL}
1047 };
1048 
1049 static const value_string PropSet6_IDS[] = {
1050 	{100, "System.ItemAuthors"},
1051 	{0, NULL}
1052 };
1053 
1054 static const value_string PropSet7_IDS[] = {
1055 	{2, "System.Shell.OmitFromView"},
1056 	{0, NULL}
1057 };
1058 
1059 static const value_string PropSet8_IDS[] = {
1060 	{2, "System.Shell.SFGAOFlagsStrings"},
1061 	{3, "System.Link.TargetSFGAOFlagsStrings"},
1062 	{0, NULL}
1063 };
1064 
1065 static const value_string PropSet9_IDS[] = {
1066 	{100, "System.ItemDate"},
1067 	{0, NULL}
1068 };
1069 
1070 static const value_string PropSet10_IDS[] = {
1071 	{ 5, "System.MIMEType"},
1072 	{ 8, "System.Search.GatherTime"},
1073 	{ 9, "System.Search.AccessCount"},
1074 	{11, "System.Search.LastIndexedTotalTime"},
1075 	{0, NULL}
1076 };
1077 
1078 static const value_string PropSet11_IDS[] = {
1079 	{5, "System.Priority"},
1080 	{8, "System.Message.HasAttachments"},
1081 	{0, NULL}
1082 };
1083 
1084 static const value_string DocCharacter_IDS[] = {
1085 	{2, "System.Search.Autosummary"},
1086 	{0, NULL}
1087 };
1088 
1089 static const value_string PropSet12_IDS[] = {
1090 	{100, "System.IsDeleted"},
1091 	{0, NULL}
1092 };
1093 
1094 static const value_string PropSet13_IDS[] = {
1095 	{100, "System.IsAttachment"},
1096 	{0, NULL}
1097 };
1098 
1099 static const value_string PropSet14_IDS[] = {
1100 	{100, "System.Message.ConversationID"},
1101 	{101, "System.Message.ConversationIndex"},
1102 	{0, NULL}
1103 };
1104 
1105 static const value_string DocPropSetGuid2_IDS[] = {
1106 	{0x02, "System.Category"},
1107 	{0x03, "System.Document.PresentationFormat"},
1108 	{0x04, "System.Document.ByteCount"},
1109 	{0x05, "System.Document.LineCount"},
1110 	{0x06, "System.Document.ParagraphCount"},
1111 	{0x07, "System.Document.SlideCount"},
1112 	{0x08, "DocNoteCount"},
1113 	{0x09, "System.Document.HiddenSlideCount"},
1114 	{0x0D, "DocPartTitles"},
1115 	{0x0E, "System.Document.Manager"},
1116 	{0x0F, "System.Company"},
1117 	{0x1A, "System.ContentType"},
1118 	{0x1B, "System.ContentStatus"},
1119 	{0x1C, "System.Language"},
1120 	{0x1D, "System.Document.Version"},
1121 	{0, NULL}
1122 };
1123 
1124 static const value_string SystemContact_IDS[] = {
1125 	{ 6, "System.Contact.JobTitle"},
1126 	{ 7, "System.Contact.OfficeLocation"},
1127 	{20, "System.Contact.HomeTelephone"},
1128 	{25, "System.Contact.PrimaryTelephone"},
1129 	{35, "System.Contact.MobileTelephone"},
1130 	{47, "System.Contact.Birthday"},
1131 	{48, "System.Contact.PrimaryEmailAddress"},
1132 	{65, "System.Contact.HomeAddressCity"},
1133 	{69, "System.Contact.PersonalTitle"},
1134 	{71, "System.Contact.MiddleName"},
1135 	{73, "System.Contact.Suffix"},
1136 	{74, "System.Contact.NickName"},
1137 	{0, NULL}
1138 };
1139 
1140 static const value_string PropSet15_IDS[] = {
1141 	{0x64, "System.Calendar.IsOnline"},
1142 	{0,NULL}
1143 };
1144 
1145 static const value_string PropSet16_IDS[] = {
1146 	{0x64, "System.Contact.OtherAddressStreet"},
1147 	{0,NULL}
1148 };
1149 
1150 static const value_string PropSet17_IDS[] = {
1151 	{0x2, "System.DRM.IsProtected"},
1152 	{0,NULL}
1153 };
1154 
1155 static const value_string PropSet18_IDS[] = {
1156 	{0x64, "System.Calendar.OptionalAttendeeNames"},
1157 	{0,NULL}
1158 };
1159 
1160 static const value_string PropSet19_IDS[] = {
1161 	{0x64, "System.Calendar.ShowTimeAs"},
1162 	{0,NULL}
1163 };
1164 
1165 static const value_string PropSet20_IDS[] = {
1166 	{0x64, "System.ParentalRatingReason"},
1167 	{0,NULL}
1168 };
1169 
1170 static const value_string PropSet21_IDS[] = {
1171 	{0x64, "System.Project"},
1172 	{0,NULL}
1173 };
1174 
1175 static const value_string PropSet22_IDS[] = {
1176 	{0x64, "System.Contact.OtherAddressCountry"},
1177 	{0,NULL}
1178 };
1179 
1180 static const value_string PropSet23_IDS[] = {
1181 	{0x9, "System.Status"},
1182 	{0,NULL}
1183 };
1184 
1185 static const value_string PropSet24_IDS[] = {
1186 	{0x64, "System.DateArchived"},
1187 	{0,NULL}
1188 };
1189 
1190 static const value_string PropSet25_IDS[] = {
1191 	{0x64, "System.Contact.CarTelephone"},
1192 	{0,NULL}
1193 };
1194 
1195 static const value_string PropSet26_IDS[] = {
1196 	{0x64, "System.Calendar.ResponseStatus"},
1197 	{0,NULL}
1198 };
1199 
1200 static const value_string PropSet27_IDS[] = {
1201 	{0x64, "System.Task.BillingInformation"},
1202 	{0,NULL}
1203 };
1204 
1205 static const value_string PropSet28_IDS[] = {
1206 	{0x64, "System.Media.AverageLevel"},
1207 	{0,NULL}
1208 };
1209 
1210 static const value_string PropSet29_IDS[] = {
1211 	{0x64, "System.Contact.SpouseName"},
1212 	{0,NULL}
1213 };
1214 
1215 static const value_string PropSet30_IDS[] = {
1216 	{0x64, "System.Document.DocumentID"},
1217 	{0,NULL}
1218 };
1219 
1220 static const value_string PropSet31_IDS[] = {
1221 	{0x64, "System.RecordedTV.NetworkAffiliation"},
1222 	{0,NULL}
1223 };
1224 
1225 static const value_string PropSet32_IDS[] = {
1226 	{0x64, "System.PriorityText"},
1227 	{0,NULL}
1228 };
1229 
1230 static const value_string PropSet33_IDS[] = {
1231 	{0x64, "System.Contact.Children"},
1232 	{0,NULL}
1233 };
1234 
1235 static const value_string PropSet34_IDS[] = {
1236 	{0x64, "System.RecordedTV.RecordingTime"},
1237 	{0,NULL}
1238 };
1239 
1240 static const value_string PropSet35_IDS[] = {
1241 	{0x64, "System.FlagColorText"},
1242 	{0,NULL}
1243 };
1244 
1245 static const value_string PropSet36_IDS[] = {
1246 	{0x64, "System.Contact.OtherAddressPostalCode"},
1247 	{0,NULL}
1248 };
1249 
1250 static const value_string PropSet37_IDS[] = {
1251 	{0x64, "System.Photo.SharpnessText"},
1252 	{0,NULL}
1253 };
1254 
1255 static const value_string PropSet38_IDS[] = {
1256 	{0x64, "System.Contact.OtherAddress"},
1257 	{0,NULL}
1258 };
1259 
1260 static const value_string PropSet40_IDS[] = {
1261 	{0x64, "System.Contact.BusinessAddress"},
1262 	{0,NULL}
1263 };
1264 
1265 static const value_string PropSet41_IDS[] = {
1266 	{0x64, "System.IsIncomplete"},
1267 	{0,NULL}
1268 };
1269 
1270 static const value_string PropSet42_IDS[] = {
1271 	{0x64, "System.Contact.EmailAddress2"},
1272 	{0,NULL}
1273 };
1274 
1275 static const value_string PropSet43_IDS[] = {
1276 	{0x64, "System.Contact.BusinessTelephone"},
1277 	{0,NULL}
1278 };
1279 
1280 static const value_string PropSet45_IDS[] = {
1281 	{0x64, "System.Image.CompressionText"},
1282 	{0,NULL}
1283 };
1284 
1285 static const value_string PropSet46_IDS[] = {
1286 	{0x64, "System.Contact.HomeAddressState"},
1287 	{0,NULL}
1288 };
1289 
1290 static const value_string PropSet47_IDS[] = {
1291 	{0x64, "System.Contact.EmailAddress3"},
1292 	{0,NULL}
1293 };
1294 
1295 static const value_string PropSet48_IDS[] = {
1296 	{0x64, "System.Communication.FollowupIconIndex"},
1297 	{0,NULL}
1298 };
1299 
1300 static const value_string PropSet49_IDS[] = {
1301 	{0x64, "System.Photo.TagViewAggregate"},
1302 	{0,NULL}
1303 };
1304 
1305 static const value_string PropSet50_IDS[] = {
1306 	{0x64, "System.Search.Store"},
1307 	{0,NULL}
1308 };
1309 
1310 static const value_string PropSet51_IDS[] = {
1311 	{0x64, "System.FileName"},
1312 	{0,NULL}
1313 };
1314 
1315 static const value_string PropSet52_IDS[] = {
1316 	{0x64, "System.Contact.HomeAddressStreet"},
1317 	{0,NULL}
1318 };
1319 
1320 static const value_string PropSet53_IDS[] = {
1321 	{0x64, "System.Contact.HomeAddressPostalCode"},
1322 	{0,NULL}
1323 };
1324 
1325 static const value_string PropSet54_IDS[] = {
1326 	{0x64, "System.Contact.BusinessHomePage"},
1327 	{0,NULL}
1328 };
1329 
1330 static const value_string PropSet55_IDS[] = {
1331 	{0x64, "System.Calendar.RequiredAttendeeNames"},
1332 	{0,NULL}
1333 };
1334 
1335 static const value_string PropSet56_IDS[] = {
1336 	{0x64, "System.FlagColor"},
1337 	{0,NULL}
1338 };
1339 
1340 static const value_string PropSet57_IDS[] = {
1341 	{0x64, "System.Message.ProofInProgress"},
1342 	{0,NULL}
1343 };
1344 
1345 static const value_string PropSet58_IDS[] = {
1346 	{0x64, "System.Contact.PrimaryAddressPostOfficeBox"},
1347 	{0,NULL}
1348 };
1349 
1350 static const value_string PropSet59_IDS[] = {
1351 	{0x64, "System.Calendar.IsRecurring"},
1352 	{0,NULL}
1353 };
1354 
1355 static const value_string PropSet60_IDS[] = {
1356 	{0x64, "System.Contact.HomeAddress"},
1357 	{0,NULL}
1358 };
1359 
1360 static const value_string PropSet61_IDS[] = {
1361 	{0x64, "System.Photo.MaxAperture"},
1362 	{0,NULL}
1363 };
1364 
1365 static const value_string PropSet62_IDS[] = {
1366 	{0x64, "System.ItemParticipants"},
1367 	{0,NULL}
1368 };
1369 
1370 static const value_string PropSet63_IDS[] = {
1371 	{0x64, "System.Media.DateReleased"},
1372 	{0,NULL}
1373 };
1374 
1375 static const value_string PropSet64_IDS[] = {
1376 	{0x64, "System.Journal.Contacts"},
1377 	{0,NULL}
1378 };
1379 
1380 static const value_string PropSet65_IDS[] = {
1381 	{0x64, "System.Calendar.Resources"},
1382 	{0,NULL}
1383 };
1384 
1385 static const value_string PropSet66_IDS[] = {
1386 	{0x67, "System.Message.MessageClass"},
1387 	{0,NULL}
1388 };
1389 
1390 static const value_string PropSet67_IDS[] = {
1391 	{0x9, "System.Rating"},
1392 	{0xb, "System.Copyright"},
1393 	{0xd, "System.Media.ClassPrimaryID"},
1394 	{0xe, "System.Media.ClassSecondaryID"},
1395 	{0xf, "System.Media.DVDID"},
1396 	{0x10, "System.Media.MCDI"},
1397 	{0x11, "System.Media.MetadataContentProvider"},
1398 	{0x12, "System.Media.ContentDistributor"},
1399 	{0x13, "System.Music.Composer"},
1400 	{0x14, "System.Video.Director"},
1401 	{0x15, "System.ParentalRating"},
1402 	{0x16, "System.Media.Producer"},
1403 	{0x17, "System.Media.Writer"},
1404 	{0x18, "System.Media.CollectionGroupID"},
1405 	{0x19, "System.Media.CollectionID"},
1406 	{0x1a, "System.Media.ContentID"},
1407 	{0x1b, "System.Media.CreatorApplication"},
1408 	{0x1c, "System.Media.CreatorApplicationVersion"},
1409 	{0x1e, "System.Media.Publisher"},
1410 	{0x1f, "System.Music.Period"},
1411 	{0x22, "System.Media.UserWebUrl"},
1412 	{0x23, "System.Media.UniqueFileIdentifier"},
1413 	{0x24, "System.Media.EncodedBy"},
1414 	{0x26, "System.Media.ProtectionType"},
1415 	{0x27, "System.Media.ProviderRating"},
1416 	{0x28, "System.Media.ProviderStyle"},
1417 	{0x29, "System.Media.UserNoAutoInfo"},
1418 	{0,NULL}
1419 };
1420 
1421 static const value_string PropSet68_IDS[] = {
1422 	{0x64, "System.Calendar.OrganizerName"},
1423 	{0,NULL}
1424 };
1425 
1426 static const value_string PropSet69_IDS[] = {
1427 	{0x64, "System.Photo.PeopleNames"},
1428 	{0,NULL}
1429 };
1430 
1431 static const value_string PropSet70_IDS[] = {
1432 	{0x3, "System.Media.Duration"},
1433 	{0x4, "System.Audio.EncodingBitrate"},
1434 	{0x5, "System.Audio.SampleRate"},
1435 	{0x6, "System.Audio.SampleSize"},
1436 	{0x7, "System.Audio.ChannelCount"},
1437 	{0,NULL}
1438 };
1439 
1440 static const value_string PropSet71_IDS[] = {
1441 	{0x64, "System.FileExtension"},
1442 	{0,NULL}
1443 };
1444 
1445 static const value_string PropSet72_IDS[] = {
1446 	{0x103, "System.Image.Compression"},
1447 	{0x10f, "System.Photo.CameraManufacturer"},
1448 	{0x110, "System.Photo.CameraModel"},
1449 	{0x112, "System.Photo.Orientation"},
1450 	{0x131, "System.SoftwareUsed"},
1451 	{0x4748, "System.Photo.Event"},
1452 	{0x4752, "System.DateImported"},
1453 	{0x829a, "System.Photo.ExposureTime"},
1454 	{0x829d, "System.Photo.FNumber"},
1455 	{0x8822, "System.Photo.ExposureProgram"},
1456 	{0x8827, "System.Photo.ISOSpeed"},
1457 	{0x9003, "System.Photo.DateTaken"},
1458 	{0x9201, "System.Photo.ShutterSpeed"},
1459 	{0x9202, "System.Photo.Aperture"},
1460 	{0x9204, "System.Photo.ExposureBias"},
1461 	{0x9206, "System.Photo.SubjectDistance"},
1462 	{0x9207, "System.Photo.MeteringMode"},
1463 	{0x9208, "System.Photo.LightSource"},
1464 	{0x9209, "System.Photo.Flash"},
1465 	{0x920a, "System.Photo.FocalLength"},
1466 	{0,NULL}
1467 };
1468 
1469 static const value_string PropSet73_IDS[] = {
1470 	{0x64, "System.Contact.TTYTDDTelephone"},
1471 	{0,NULL}
1472 };
1473 
1474 static const value_string PropSet74_IDS[] = {
1475 	{0x64, "System.Photo.PhotometricInterpretationText"},
1476 	{0,NULL}
1477 };
1478 
1479 static const value_string PropSet75_IDS[] = {
1480 	{0x64, "System.Calendar.OptionalAttendeeAddresses"},
1481 	{0,NULL}
1482 };
1483 
1484 static const value_string PropSet76_IDS[] = {
1485 	{0x64, "System.Calendar.ReminderTime"},
1486 	{0,NULL}
1487 };
1488 
1489 static const value_string PropSet77_IDS[] = {
1490 	{0x64, "System.Calendar.RequiredAttendeeAddresses"},
1491 	{0,NULL}
1492 };
1493 
1494 static const value_string PropSet78_IDS[] = {
1495 	{0x64, "System.Calendar.OrganizerAddress"},
1496 	{0,NULL}
1497 };
1498 
1499 static const value_string PropSet79_IDS[] = {
1500 	{0x2, "System.Link.TargetParsingPath"},
1501 	{0x8, "System.Link.TargetSFGAOFlags"},
1502 	{0,NULL}
1503 };
1504 
1505 static const value_string PropSet80_IDS[] = {
1506 	{0x64, "System.Contact.Hobbies"},
1507 	{0,NULL}
1508 };
1509 
1510 static const value_string PropSet81_IDS[] = {
1511 	{0x64, "System.Contact.HomeAddressPostOfficeBox"},
1512 	{0,NULL}
1513 };
1514 
1515 static const value_string PropSet82_IDS[] = {
1516 	{0x64, "System.Contact.CompanyMainTelephone"},
1517 	{0,NULL}
1518 };
1519 
1520 static const value_string PropSet83_IDS[] = {
1521 	{0x64, "System.IsFlagged"},
1522 	{0,NULL}
1523 };
1524 
1525 static const value_string PropSet84_IDS[] = {
1526 	{0x64, "System.Contact.FirstName"},
1527 	{0,NULL}
1528 };
1529 
1530 static const value_string PropSet85_IDS[] = {
1531 	{0xa, "System.IsEncrypted"},
1532 	{0,NULL}
1533 };
1534 
1535 static const value_string PropSet86_IDS[] = {
1536 	{0x64, "System.Calendar.Duration"},
1537 	{0,NULL}
1538 };
1539 
1540 static const value_string PropSet87_IDS[] = {
1541 	{0x64, "System.Contact.PrimaryAddressCity"},
1542 	{0,NULL}
1543 };
1544 
1545 static const value_string PropSet88_IDS[] = {
1546 	{0x64, "System.Contact.OtherAddressPostOfficeBox"},
1547 	{0,NULL}
1548 };
1549 
1550 static const value_string PropSet89_IDS[] = {
1551 	{0x64, "System.ProviderItemID"},
1552 	{0,NULL}
1553 };
1554 
1555 static const value_string PropSet90_IDS[] = {
1556 	{0x64, "System.Contact.BusinessAddressCountry"},
1557 	{0,NULL}
1558 };
1559 
1560 static const value_string PropSet91_IDS[] = {
1561 	{0x64, "System.Contact.EmailName"},
1562 	{0,NULL}
1563 };
1564 
1565 static const value_string PropSet92_IDS[] = {
1566 	{0x64, "System.Photo.FocalLengthInFilm"},
1567 	{0,NULL}
1568 };
1569 
1570 static const value_string PropSet93_IDS[] = {
1571 	{0x64, "System.Contact.IMAddress"},
1572 	{0,NULL}
1573 };
1574 
1575 static const value_string PropSet94_IDS[] = {
1576 	{0x64, "System.DateAcquired"},
1577 	{0,NULL}
1578 };
1579 
1580 static const value_string PropSet95_IDS[] = {
1581 	{0x64, "System.DateCompleted"},
1582 	{0,NULL}
1583 };
1584 
1585 static const value_string PropSet96_IDS[] = {
1586 	{0x64, "System.ItemName"},
1587 	{0,NULL}
1588 };
1589 
1590 static const value_string PropSet97_IDS[] = {
1591 	{0x64, "System.Contact.PrimaryAddressPostalCode"},
1592 	{0,NULL}
1593 };
1594 
1595 static const value_string PropSet99_IDS[] = {
1596 	{0x64, "System.Document.ClientID"},
1597 	{0,NULL}
1598 };
1599 
1600 static const value_string PropSet100_IDS[] = {
1601 	{0x64, "System.Photo.ExposureProgramText"},
1602 	{0,NULL}
1603 };
1604 
1605 static const value_string PropSet101_IDS[] = {
1606 	{0x64, "System.Note.ColorText"},
1607 	{0,NULL}
1608 };
1609 
1610 static const value_string PropSet102_IDS[] = {
1611 	{0x64, "System.Photo.MeteringModeText"},
1612 	{0,NULL}
1613 };
1614 
1615 static const value_string PropSet103_IDS[] = {
1616 	{0x2, "System.Link.TargetExtension"},
1617 	{0,NULL}
1618 };
1619 
1620 static const value_string PropSet104_IDS[] = {
1621 	{0x64, "System.Contact.BusinessAddressState"},
1622 	{0,NULL}
1623 };
1624 
1625 static const value_string PropSet105_IDS[] = {
1626 	{0x64, "System.Photo.OrientationText"},
1627 	{0,NULL}
1628 };
1629 
1630 static const value_string PropSet106_IDS[] = {
1631 	{0x64, "System.Contact.Label"},
1632 	{0,NULL}
1633 };
1634 
1635 static const value_string PropSet107_IDS[] = {
1636 	{0x64, "System.Calendar.Location"},
1637 	{0,NULL}
1638 };
1639 
1640 static const value_string PropSet108_IDS[] = {
1641 	{0x64, "System.Photo.SaturationText"},
1642 	{0,NULL}
1643 };
1644 
1645 static const value_string PropSet109_IDS[] = {
1646 	{0x64, "System.Message.ToDoTitle"},
1647 	{0,NULL}
1648 };
1649 
1650 static const value_string PropSet110_IDS[] = {
1651 	{0x64, "System.Contact.Anniversary"},
1652 	{0,NULL}
1653 };
1654 
1655 static const value_string PropSet111_IDS[] = {
1656 	{0x64, "System.Contact.FileAsName"},
1657 	{0,NULL}
1658 };
1659 
1660 static const value_string PropSet112_IDS[] = {
1661 	{0x64, "System.GPS.Date"},
1662 	{0,NULL}
1663 };
1664 
1665 static const value_string PropSet113_IDS[] = {
1666 	{0x64, "System.IsFlaggedComplete"},
1667 	{0,NULL}
1668 };
1669 
1670 static const value_string PropSet114_IDS[] = {
1671 	{0x2, "System.Contact.JA.CompanyNamePhonetic"},
1672 	{0x3, "System.Contact.JA.FirstNamePhonetic"},
1673 	{0x4, "System.Contact.JA.LastNamePhonetic"},
1674 	{0,NULL}
1675 };
1676 
1677 static const value_string PropSet115_IDS[] = {
1678 	{0x64, "System.Communication.SecurityFlags"},
1679 	{0,NULL}
1680 };
1681 
1682 static const value_string PropSet116_IDS[] = {
1683 	{0x64, "System.Identity"},
1684 	{0,NULL}
1685 };
1686 
1687 static const value_string PropSet117_IDS[] = {
1688 	{0x64, "System.Contact.BusinessAddressPostOfficeBox"},
1689 	{0,NULL}
1690 };
1691 
1692 static const value_string PropSet118_IDS[] = {
1693 	{0x64, "System.AcquisitionID"},
1694 	{0,NULL}
1695 };
1696 
1697 static const value_string PropSet119_IDS[] = {
1698 	{0x64, "System.Contact.EmailAddresses"},
1699 	{0,NULL}
1700 };
1701 
1702 static const value_string PropSet120_IDS[] = {
1703 	{0x64, "System.Communication.TaskStatus"},
1704 	{0,NULL}
1705 };
1706 
1707 static const value_string PropSet121_IDS[] = {
1708 	{0x64, "System.Contact.LastName"},
1709 	{0,NULL}
1710 };
1711 
1712 static const value_string PropSet122_IDS[] = {
1713 	{0x64, "System.Communication.DateItemExpires"},
1714 	{0,NULL}
1715 };
1716 
1717 static const value_string PropSet123_IDS[] = {
1718 	{0x64, "System.ImportanceText"},
1719 	{0,NULL}
1720 };
1721 
1722 static const value_string PropSet124_IDS[] = {
1723 	{0x64, "System.Search.ContainerHash"},
1724 	{0,NULL}
1725 };
1726 
1727 static const value_string PropSet125_IDS[] = {
1728 	{0x64, "System.Contact.BusinessFaxNumber"},
1729 	{0,NULL}
1730 };
1731 
1732 static const value_string PropSet126_IDS[] = {
1733 	{0x2, "System.Link.TargetUrl"},
1734 	{0x1a, "System.IconIndex"},
1735 	{0,NULL}
1736 };
1737 
1738 static const value_string PropSet127_IDS[] = {
1739 	{0x64, "System.RecordedTV.StationName"},
1740 	{0,NULL}
1741 };
1742 
1743 static const value_string PropSet128_IDS[] = {
1744 	{0x64, "System.Task.Owner"},
1745 	{0,NULL}
1746 };
1747 
1748 static const value_string PropSet129_IDS[] = {
1749 	{0x64, "System.Photo.ProgramModeText"},
1750 	{0,NULL}
1751 };
1752 
1753 static const value_string PropSet130_IDS[] = {
1754 	{0x64, "System.Contact.PrimaryAddressCountry"},
1755 	{0,NULL}
1756 };
1757 
1758 static const value_string PropSet131_IDS[] = {
1759 	{0x64, "System.Note.Color"},
1760 	{0,NULL}
1761 };
1762 
1763 static const value_string PropSet132_IDS[] = {
1764 	{0x64, "System.Contact.OtherAddressState"},
1765 	{0,NULL}
1766 };
1767 
1768 static const value_string PropSet133_IDS[] = {
1769 	{0x64, "System.Message.AttachmentContents"},
1770 	{0,NULL}
1771 };
1772 
1773 static const value_string PropSet134_IDS[] = {
1774 	{0x64, "System.Communication.TaskStatusText"},
1775 	{0,NULL}
1776 };
1777 
1778 static const value_string PropSet135_IDS[] = {
1779 	{0x64, "System.Communication.HeaderItem"},
1780 	{0,NULL}
1781 };
1782 
1783 static const value_string PropSet136_IDS[] = {
1784 	{0x64, "System.Contact.EmailAddress"},
1785 	{0,NULL}
1786 };
1787 
1788 static const value_string PropSet137_IDS[] = {
1789 	{0x64, "System.Contact.Profession"},
1790 	{0,NULL}
1791 };
1792 
1793 static const value_string PropSet138_IDS[] = {
1794 	{0x64, "System.Contact.BusinessAddressPostalCode"},
1795 	{0,NULL}
1796 };
1797 
1798 static const value_string PropSet139_IDS[] = {
1799 	{0x64, "System.ItemNamePrefix"},
1800 	{0,NULL}
1801 };
1802 
1803 static const value_string PropSet140_IDS[] = {
1804 	{0x64, "System.Photo.DigitalZoom"},
1805 	{0,NULL}
1806 };
1807 
1808 static const value_string PropSet141_IDS[] = {
1809 	{0x64, "System.SourceItem"},
1810 	{0,NULL}
1811 };
1812 
1813 static const value_string PropSet142_IDS[] = {
1814 	{0x64, "System.Photo.WhiteBalance"},
1815 	{0,NULL}
1816 };
1817 
1818 static const value_string PropSet143_IDS[] = {
1819 	{0x64, "System.SensitivityText"},
1820 	{0,NULL}
1821 };
1822 
1823 static const value_string PropSet144_IDS[] = {
1824 	{0x64, "System.Contact.Gender"},
1825 	{0x65, "System.Contact.GenderValue"},
1826 	{0,NULL}
1827 };
1828 
1829 static const value_string PropSet145_IDS[] = {
1830 	{0x64, "System.Contact.OtherAddressCity"},
1831 	{0,NULL}
1832 };
1833 
1834 static const value_string PropSet146_IDS[] = {
1835 	{0x64, "System.Music.DisplayArtist"},
1836 	{0,NULL}
1837 };
1838 
1839 static const value_string PropSet147_IDS[] = {
1840 	{0x64, "System.Message.SenderAddress"},
1841 	{0,NULL}
1842 };
1843 
1844 static const value_string PropSet148_IDS[] = {
1845 	{0x64, "System.Contact.PrimaryAddressState"},
1846 	{0,NULL}
1847 };
1848 
1849 static const value_string PropSet149_IDS[] = {
1850 	{0x64, "System.Journal.EntryType"},
1851 	{0,NULL}
1852 };
1853 
1854 static const value_string PropSet150_IDS[] = {
1855 	{0x64, "System.Contact.BusinessAddressStreet"},
1856 	{0,NULL}
1857 };
1858 
1859 static const value_string PropSet151_IDS[] = {
1860 	{0x4, "System.FileOwner"},
1861 	{0,NULL}
1862 };
1863 
1864 static const value_string PropSet152_IDS[] = {
1865 	{0x64, "System.Contact.HomeAddressCountry"},
1866 	{0,NULL}
1867 };
1868 
1869 static const value_string PropSet153_IDS[] = {
1870 	{0x64, "System.Task.CompletionStatus"},
1871 	{0,NULL}
1872 };
1873 
1874 static const value_string PropSet154_IDS[] = {
1875 	{0x10, "System.Software.DateLastUsed"},
1876 	{0,NULL}
1877 };
1878 
1879 static const value_string PropSet155_IDS[] = {
1880 	{0x64, "System.Contact.Department"},
1881 	{0,NULL}
1882 };
1883 
1884 static const value_string PropSet156_IDS[] = {
1885 	{0x64, "System.Calendar.ShowTimeAsText"},
1886 	{0,NULL}
1887 };
1888 
1889 static const value_string PropSet157_IDS[] = {
1890 	{0x64, "System.Sensitivity"},
1891 	{0,NULL}
1892 };
1893 
1894 static const value_string PropSet158_IDS[] = {
1895 	{0x64, "System.RecordedTV.OriginalBroadcastDate"},
1896 	{0,NULL}
1897 };
1898 
1899 static const value_string PropSet159_IDS[] = {
1900 	{0x64, "System.Music.IsCompilation"},
1901 	{0,NULL}
1902 };
1903 
1904 static const value_string PropSet160_IDS[] = {
1905 	{0x64, "System.DueDate"},
1906 	{0,NULL}
1907 };
1908 
1909 static const value_string PropSet161_IDS[] = {
1910 	{0x3, "System.FileDescription"},
1911 	{0x6, "System.OriginalFileName"},
1912 	{0x7, "System.Software.ProductName"},
1913 	{0x8, "System.Software.ProductVersion"},
1914 	{0,NULL}
1915 };
1916 
1917 static const value_string PropSet162_IDS[] = {
1918 	{0x64, "System.MileageInformation"},
1919 	{0,NULL}
1920 };
1921 
1922 static const value_string PropSet163_IDS[] = {
1923 	{0x2, "System.RecordedTV.EpisodeName"},
1924 	{0x3, "System.RecordedTV.ProgramDescription"},
1925 	{0x5, "System.RecordedTV.StationCallSign"},
1926 	{0x7, "System.RecordedTV.ChannelNumber"},
1927 	{0xc, "System.RecordedTV.IsClosedCaptioningAvailable"},
1928 	{0xd, "System.RecordedTV.IsRepeatBroadcast"},
1929 	{0xe, "System.RecordedTV.IsSAP"},
1930 	{0xf, "System.RecordedTV.DateContentExpires"},
1931 	{0x10, "System.RecordedTV.IsATSCContent"},
1932 	{0x11, "System.RecordedTV.IsDTVContent"},
1933 	{0x12, "System.RecordedTV.IsHDContent"},
1934 	{0,NULL}
1935 };
1936 
1937 static const value_string PropSet164_IDS[] = {
1938 	{0x64, "System.Audio.PeakValue"},
1939 	{0,NULL}
1940 };
1941 
1942 static const value_string PropSet165_IDS[] = {
1943 	{0x64, "System.Contact.TelexNumber"},
1944 	{0,NULL}
1945 };
1946 
1947 static const value_string PropSet166_IDS[] = {
1948 	{0x64, "System.Message.SenderName"},
1949 	{0,NULL}
1950 };
1951 
1952 static const value_string PropSet167_IDS[] = {
1953 	{0x64, "System.Message.Flags"},
1954 	{0,NULL}
1955 };
1956 
1957 static const value_string PropSet168_IDS[] = {
1958 	{0x64, "System.IsFolder"},
1959 	{0,NULL}
1960 };
1961 
1962 static const value_string PropSet169_IDS[] = {
1963 	{0x64, "System.Contact.AssistantTelephone"},
1964 	{0,NULL}
1965 };
1966 
1967 static const value_string PropSet170_IDS[] = {
1968 	{0x64, "System.KindText"},
1969 	{0,NULL}
1970 };
1971 
1972 static const value_string PropSet171_IDS[] = {
1973 	{0x64, "System.Photo.ContrastText"},
1974 	{0,NULL}
1975 };
1976 
1977 static const value_string PropSet172_IDS[] = {
1978 	{0x3, "System.Image.HorizontalSize"},
1979 	{0x4, "System.Image.VerticalSize"},
1980 	{0x5, "System.Image.HorizontalResolution"},
1981 	{0x6, "System.Image.VerticalResolution"},
1982 	{0x7, "System.Image.BitDepth"},
1983 	{0xc, "System.Media.FrameCount"},
1984 	{0xd, "System.Image.Dimensions"},
1985 	{0,NULL}
1986 };
1987 
1988 static const value_string PropSet173_IDS[] = {
1989 	{0x64, "System.Message.IsFwdOrReply"},
1990 	{0,NULL}
1991 };
1992 
1993 static const value_string PropSet174_IDS[] = {
1994 	{0x64, "System.Photo.WhiteBalanceText"},
1995 	{0,NULL}
1996 };
1997 
1998 static const value_string PropSet175_IDS[] = {
1999 	{0x64, "System.Photo.GainControlText"},
2000 	{0,NULL}
2001 };
2002 
2003 static const value_string PropSet176_IDS[] = {
2004 	{0x64, "System.Communication.PolicyTag"},
2005 	{0,NULL}
2006 };
2007 
2008 static const value_string PropSet177_IDS[] = {
2009 	{0x64, "System.Contact.HomeFaxNumber"},
2010 	{0,NULL}
2011 };
2012 
2013 static const value_string PropSet178_IDS[] = {
2014 	{0x64, "System.FlagStatusText"},
2015 	{0,NULL}
2016 };
2017 
2018 static const value_string PropSet179_IDS[] = {
2019 	{0x64, "System.Contact.AssistantName"},
2020 	{0,NULL}
2021 };
2022 
2023 static const value_string PropSet180_IDS[] = {
2024 	{0x64, "System.Message.ToDoFlags"},
2025 	{0,NULL}
2026 };
2027 
2028 static const value_string PropSet181_IDS[] = {
2029 	{0x64, "System.RatingText"},
2030 	{0,NULL}
2031 };
2032 
2033 static const value_string PropSet182_IDS[] = {
2034 	{0x64, "System.Document.Contributor"},
2035 	{0,NULL}
2036 };
2037 
2038 static const value_string PropSet183_IDS[] = {
2039 	{0x64, "System.Contact.CallbackTelephone"},
2040 	{0,NULL}
2041 };
2042 
2043 static const value_string PropSet184_IDS[] = {
2044 	{0x64, "System.EndDate"},
2045 	{0,NULL}
2046 };
2047 
2048 static const value_string PropSet185_IDS[] = {
2049 	{0x64, "System.Media.DateEncoded"},
2050 	{0,NULL}
2051 };
2052 
2053 static const value_string PropSet186_IDS[] = {
2054 	{0x64, "System.Photo.FlashText"},
2055 	{0,NULL}
2056 };
2057 
2058 static const value_string PropSet187_IDS[] = {
2059 	{0x64, "System.Photo.FlashFired"},
2060 	{0,NULL}
2061 };
2062 
2063 static const value_string PropSet188_IDS[] = {
2064 	{0x64, "System.Document.Division"},
2065 	{0,NULL}
2066 };
2067 
2068 static const value_string PropSet189_IDS[] = {
2069 	{0x64, "System.Contact.PagerTelephone"},
2070 	{0,NULL}
2071 };
2072 
2073 static const value_string PropSet190_IDS[] = {
2074 	{0x64, "System.Contact.BusinessAddressCity"},
2075 	{0,NULL}
2076 };
2077 
2078 static const value_string PropSet191_IDS[] = {
2079 	{0x64, "System.Media.SubscriptionContentId"},
2080 	{0,NULL}
2081 };
2082 
2083 static const value_string PropSet192_IDS[] = {
2084 	{0x64, "System.Contact.PrimaryAddressStreet"},
2085 	{0,NULL}
2086 };
2087 
2088 static const value_string PropSet193_IDS[] = {
2089 	{0x64, "System.StartDate"},
2090 	{0,NULL}
2091 };
2092 
2093 static const value_string PropSet194_IDS[] = {
2094 	{0x2, "System.Video.StreamName"},
2095 	{0x3, "System.Video.FrameWidth"},
2096 	{0x4, "System.Video.FrameHeight"},
2097 	{0x6, "System.Video.FrameRate"},
2098 	{0x8, "System.Video.EncodingBitrate"},
2099 	{0x9, "System.Video.SampleSize"},
2100 	{0xa, "System.Video.Compression"},
2101 	{0x2a, "System.Video.HorizontalAspectRatio"},
2102 	{0x2b, "System.Video.TotalBitrate"},
2103 	{0x2c, "System.Video.FourCC"},
2104 	{0x2d, "System.Video.VerticalAspectRatio"},
2105 	{0,NULL}
2106 };
2107 
2108 static const value_string PropSet195_IDS[] = {
2109 	{0x64, "System.Contact.MailingAddress"},
2110 	{0,NULL}
2111 };
2112 
2113 static struct GuidPropertySet GuidPropertySet[] = {
2114 	{	{0xa9bd1526, 0x6a80, 0x11d0, {0x8c, 0x9d, 0x00, 0x20, 0xaf, 0x1d, 0x74, 0x0e}},
2115 		"DBPROPSET_FSCIFRMWRK_EXT", "File system content index framework",
2116 		DBPROPSET_FSCIFRMWRK_EXT_IDS
2117 	},
2118 	{	{0xa7ac77ed, 0xf8d7, 0x11ce, {0xa7, 0x98, 0x00, 0x20, 0xf8, 0x00, 0x80, 0x25}},
2119 		"DBPROPSET_QUERYEXT", "Query extension",
2120 		DBPROPSET_QUERYEXT_IDS
2121 	},
2122 	{	{0xafafaca5, 0xb5d1, 0x11d0, {0x8c, 0x62, 0x00, 0xc0, 0x4f, 0xc2, 0xdb, 0x8d}},
2123 		"DBPROPSET_CIFRMWRKCORE_EXT", "Content index framework core",
2124 		DBPROPSET_CIFRMWRKCORE_EXT_IDS
2125 	},
2126 	{	{0xAA6EE6B0, 0xE828, 0x11D0, {0xB2, 0x3E, 0x00, 0xAA, 0x00, 0x47, 0xFC, 0x01}},
2127 		"DBPROPSET_MSIDXS_ROWSETEXT", "???",
2128 		DBPROPSET_MSIDXS_ROWSETEXT_IDS
2129 	},
2130 	{	{0xB725F130, 0x47ef, 0x101a, {0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC}},
2131 		"Storage", "Storage Property Set",
2132 		StorageGuid_IDS
2133 	},
2134 	{	{0xF29F85E0, 0x4FF9, 0x1068, {0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9}},
2135 		"Document", "Document Property Set",
2136 		DocPropSetGuid_IDS
2137 	},
2138 	{	{0x49691C90, 0x7E17, 0x101A, {0xA9, 0x1C, 0x08, 0x00, 0x2B, 0x2E, 0xCD, 0xA9}},
2139 		"Query", "Query Property Set",
2140 		QueryGuid_IDS
2141 	},
2142 	{	{0x28636AA6, 0x953D, 0x11D2, {0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0}},
2143 		"ShellDetails", "Shell Details Property Set",
2144 		ShellDetails_IDS
2145 	},
2146 	{	{0x446D16B1, 0x8DAD, 0x4870, {0xA7, 0x48, 0x40, 0x2E, 0xA4, 0x3D, 0x78, 0x8C}},
2147 		"???", "Unspecified Property Set",
2148 		PropSet1_IDS
2149 	},
2150 	{	{0x1E3EE840, 0xBC2B, 0x476C, {0x82, 0x37, 0x2A, 0xCD, 0x1A, 0x83, 0x9B, 0x22}},
2151 		"???", "Unspecified Property Set",
2152 		PropSet2_IDS
2153 	},
2154 	{	{0x56A3372E, 0xCE9C, 0x11d2, {0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6}},
2155 		"Music", "Music Property Set",
2156 		MusicGuid_IDS
2157 	},
2158 	{	{0xE3E0584C, 0xB788, 0x4A5A, {0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD}},
2159 		"???", "Unspecified Property Set",
2160 		PropSet3_IDS
2161 	},
2162 	{	{0xDABD30ED, 0x0043, 0x4789, {0xA7, 0xF8, 0xD0, 0x13, 0xA4, 0x73, 0x66, 0x22}},
2163 		"???", "Unspecified Property Set",
2164 		PropSet4_IDS
2165 	},
2166 	{	{0x635E9051, 0x50A5, 0x4BA2, {0xB9, 0xDB, 0x4E, 0xD0, 0x56, 0xC7, 0x72, 0x96}},
2167 		"???", "Unspecified Property Set",
2168 		PropSet5_IDS
2169 	},
2170 	{	{0xD0A04F0A, 0x462A, 0x48A4, {0xBB, 0x2F, 0x37, 0x06, 0xE8, 0x8D, 0xBD, 0x7D}},
2171 		"???", "Unspecified Property Set",
2172 		PropSet6_IDS
2173 	},
2174 	{	{0xDE35258C, 0xC695, 0x4CBC, {0xB9, 0x82, 0x38, 0xB0, 0xAD, 0x24, 0xCE, 0xD0}},
2175 		"???", "Unspecified Property Set",
2176 		PropSet7_IDS
2177 	},
2178 	{	{0xD6942081, 0xD53B, 0x443D, {0xAD, 0x47, 0x5E, 0x05, 0x9D, 0x9C, 0xD2, 0x7A}},
2179 		"???", "Unspecified Property Set",
2180 		PropSet8_IDS
2181 	},
2182 	{	{0xF7DB74B4, 0x4287, 0x4103, {0xAF, 0xBA, 0xF1, 0xB1, 0x3D, 0xCD, 0x75, 0xCF}},
2183 		"???", "Unspecified Property Set",
2184 		PropSet9_IDS
2185 	},
2186 	{	{0x0B63E350, 0x9CCC, 0x11d0, {0xBC, 0xDB, 0x00, 0x80, 0x5F, 0xCC, 0xCE, 0x04}},
2187 		"???", "Unspecified Property Set",
2188 		PropSet10_IDS
2189 	},
2190 	{	{0x9C1FCF74, 0x2D97, 0x41BA, {0xB4, 0xAE, 0xCB, 0x2E, 0x36, 0x61, 0xA6, 0xE4}},
2191 		"???", "Unspecified Property Set",
2192 		PropSet11_IDS
2193 	},
2194 	{	{0x560C36C0, 0x503A, 0x11CF, {0xBA, 0xA1, 0x00, 0x00, 0x4C, 0x75, 0x2A, 0x9A}},
2195 		"DocCharacter", "Document characterization Property Set",
2196 		DocCharacter_IDS
2197 	},
2198 	{	{0x5CDA5FC8, 0x33EE, 0x4FF3, {0x90, 0x94, 0xAE, 0x7B, 0xD8, 0x86, 0x8C, 0x4D}},
2199 		"???", "Unspecified Property Set",
2200 		PropSet12_IDS
2201 	},
2202 	{	{0xF23F425C, 0x71A1, 0x4FA8, {0x92, 0x2F, 0x67, 0x8E, 0xA4, 0xA6, 0x04, 0x08}},
2203 		"???", "Unspecified Property Set",
2204 		PropSet13_IDS
2205 	},
2206 	{	{0xDC8F80BD, 0xAF1E, 0x4289, {0x85, 0xB6, 0x3D, 0xFC, 0x1B, 0x49, 0x39, 0x92}},
2207 		"???", "Unspecified Property Set",
2208 		PropSet14_IDS
2209 	},
2210 	{	{0xD5CDD502, 0x2E9C, 0x101B, {0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE}},
2211 		"DocPropSet2", "Document Property Set 2",
2212 		DocPropSetGuid2_IDS
2213 	},
2214 	{	{0x176DC63C, 0x2688, 0x4E89, {0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9}},
2215 		"System.Contact", "System Contact Property Set",
2216 		SystemContact_IDS
2217 	},
2218 	{	{0xBFEE9149, 0xE3E2, 0x49A7, {0xA8, 0x62, 0xC0, 0x59, 0x88, 0x14, 0x5C, 0xEC}},
2219 		"???","Unspecified Property Set",
2220 		PropSet15_IDS
2221 	},
2222 	{	{0xFF962609, 0xB7D6, 0x4999, {0x86, 0x2D, 0x95, 0x18, 0x0D, 0x52, 0x9A, 0xEA}},
2223 		"???","Unspecified Property Set",
2224 		PropSet16_IDS
2225 	},
2226 	{	{0xAEAC19E4, 0x89AE, 0x4508, {0xB9, 0xB7, 0xBB, 0x86, 0x7A, 0xBE, 0xE2, 0xED}},
2227 		"???","Unspecified Property Set",
2228 		PropSet17_IDS
2229 	},
2230 	{	{0x09429607, 0x582D, 0x437F, {0x84, 0xC3, 0xDE, 0x93, 0xA2, 0xB2, 0x4C, 0x3C}},
2231 		"???","Unspecified Property Set",
2232 		PropSet18_IDS
2233 	},
2234 	{	{0x5BF396D4, 0x5EB2, 0x466F, {0xBD, 0xE9, 0x2F, 0xB3, 0xF2, 0x36, 0x1D, 0x6E}},
2235 		"???","Unspecified Property Set",
2236 		PropSet19_IDS
2237 	},
2238 	{	{0x10984E0A, 0xF9F2, 0x4321, {0xB7, 0xEF, 0xBA, 0xF1, 0x95, 0xAF, 0x43, 0x19}},
2239 		"???","Unspecified Property Set",
2240 		PropSet20_IDS
2241 	},
2242 	{	{0x39A7F922, 0x477C, 0x48DE, {0x8B, 0xC8, 0xB2, 0x84, 0x41, 0xE3, 0x42, 0xE3}},
2243 		"???","Unspecified Property Set",
2244 		PropSet21_IDS
2245 	},
2246 	{	{0x8F167568, 0x0AAE, 0x4322, {0x8E, 0xD9, 0x60, 0x55, 0xB7, 0xB0, 0xE3, 0x98}},
2247 		"???","Unspecified Property Set",
2248 		PropSet22_IDS
2249 	},
2250 	{	{0x000214A1, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}},
2251 		"???","Unspecified Property Set",
2252 		PropSet23_IDS
2253 	},
2254 	{	{0x43F8D7B7, 0xA444, 0x4F87, {0x93, 0x83, 0x52, 0x27, 0x1C, 0x9B, 0x91, 0x5C}},
2255 		"???","Unspecified Property Set",
2256 		PropSet24_IDS
2257 	},
2258 	{	{0x8FDC6DEA, 0xB929, 0x412B, {0xBA, 0x90, 0x39, 0x7A, 0x25, 0x74, 0x65, 0xFE}},
2259 		"???","Unspecified Property Set",
2260 		PropSet25_IDS
2261 	},
2262 	{	{0x188C1F91, 0x3C40, 0x4132, {0x9E, 0xC5, 0xD8, 0xB0, 0x3B, 0x72, 0xA8, 0xA2}},
2263 		"???","Unspecified Property Set",
2264 		PropSet26_IDS
2265 	},
2266 	{	{0xD37D52C6, 0x261C, 0x4303, {0x82, 0xB3, 0x08, 0xB9, 0x26, 0xAC, 0x6F, 0x12}},
2267 		"???","Unspecified Property Set",
2268 		PropSet27_IDS
2269 	},
2270 	{	{0x09EDD5B6, 0xB301, 0x43C5, {0x99, 0x90, 0xD0, 0x03, 0x02, 0xEF, 0xFD, 0x46}},
2271 		"???","Unspecified Property Set",
2272 		PropSet28_IDS
2273 	},
2274 	{	{0x9D2408B6, 0x3167, 0x422B, {0x82, 0xB0, 0xF5, 0x83, 0xB7, 0xA7, 0xCF, 0xE3}},
2275 		"???","Unspecified Property Set",
2276 		PropSet29_IDS
2277 	},
2278 	{	{0xE08805C8, 0xE395, 0x40DF, {0x80, 0xD2, 0x54, 0xF0, 0xD6, 0xC4, 0x31, 0x54}},
2279 		"???","Unspecified Property Set",
2280 		PropSet30_IDS
2281 	},
2282 	{	{0x2C53C813, 0xFB63, 0x4E22, {0xA1, 0xAB, 0x0B, 0x33, 0x1C, 0xA1, 0xE2, 0x73}},
2283 		"???","Unspecified Property Set",
2284 		PropSet31_IDS
2285 	},
2286 	{	{0xD98BE98B, 0xB86B, 0x4095, {0xBF, 0x52, 0x9D, 0x23, 0xB2, 0xE0, 0xA7, 0x52}},
2287 		"???","Unspecified Property Set",
2288 		PropSet32_IDS
2289 	},
2290 	{	{0xD4729704, 0x8EF1, 0x43EF, {0x90, 0x24, 0x2B, 0xD3, 0x81, 0x18, 0x7F, 0xD5}},
2291 		"???","Unspecified Property Set",
2292 		PropSet33_IDS
2293 	},
2294 	{	{0xA5477F61, 0x7A82, 0x4ECA, {0x9D, 0xDE, 0x98, 0xB6, 0x9B, 0x24, 0x79, 0xB3}},
2295 		"???","Unspecified Property Set",
2296 		PropSet34_IDS
2297 	},
2298 	{	{0x45EAE747, 0x8E2A, 0x40AE, {0x8C, 0xBF, 0xCA, 0x52, 0xAB, 0xA6, 0x15, 0x2A}},
2299 		"???","Unspecified Property Set",
2300 		PropSet35_IDS
2301 	},
2302 	{	{0x95C656C1, 0x2ABF, 0x4148, {0x9E, 0xD3, 0x9E, 0xC6, 0x02, 0xE3, 0xB7, 0xCD}},
2303 		"???","Unspecified Property Set",
2304 		PropSet36_IDS
2305 	},
2306 	{	{0x51EC3F47, 0xDD50, 0x421D, {0x87, 0x69, 0x33, 0x4F, 0x50, 0x42, 0x4B, 0x1E}},
2307 		"???","Unspecified Property Set",
2308 		PropSet37_IDS
2309 	},
2310 	{	{0x508161FA, 0x313B, 0x43D5, {0x83, 0xA1, 0xC1, 0xAC, 0xCF, 0x68, 0x62, 0x2C}},
2311 		"???","Unspecified Property Set",
2312 		PropSet38_IDS
2313 	},
2314 	{	{0x730FB6DD, 0xCF7C, 0x426B, {0xA0, 0x3F, 0xBD, 0x16, 0x6C, 0xC9, 0xEE, 0x24}},
2315 		"???","Unspecified Property Set",
2316 		PropSet40_IDS
2317 	},
2318 	{	{0x346C8BD1, 0x2E6A, 0x4C45, {0x89, 0xA4, 0x61, 0xB7, 0x8E, 0x8E, 0x70, 0x0F}},
2319 		"???","Unspecified Property Set",
2320 		PropSet41_IDS
2321 	},
2322 	{	{0x38965063, 0xEDC8, 0x4268, {0x84, 0x91, 0xB7, 0x72, 0x31, 0x72, 0xCF, 0x29}},
2323 		"???","Unspecified Property Set",
2324 		PropSet42_IDS
2325 	},
2326 	{	{0x6A15E5A0, 0x0A1E, 0x4CD7, {0xBB, 0x8C, 0xD2, 0xF1, 0xB0, 0xC9, 0x29, 0xBC}},
2327 		"???","Unspecified Property Set",
2328 		PropSet43_IDS
2329 	},
2330 	{	{0x3F08E66F, 0x2F44, 0x4BB9, {0xA6, 0x82, 0xAC, 0x35, 0xD2, 0x56, 0x23, 0x22}},
2331 		"???","Unspecified Property Set",
2332 		PropSet45_IDS
2333 	},
2334 	{	{0xC89A23D0, 0x7D6D, 0x4EB8, {0x87, 0xD4, 0x77, 0x6A, 0x82, 0xD4, 0x93, 0xE5}},
2335 		"???","Unspecified Property Set",
2336 		PropSet46_IDS
2337 	},
2338 	{	{0x644D37B4, 0xE1B3, 0x4BAD, {0xB0, 0x99, 0x7E, 0x7C, 0x04, 0x96, 0x6A, 0xCA}},
2339 		"???","Unspecified Property Set",
2340 		PropSet47_IDS
2341 	},
2342 	{	{0x83A6347E, 0x6FE4, 0x4F40, {0xBA, 0x9C, 0xC4, 0x86, 0x52, 0x40, 0xD1, 0xF4}},
2343 		"???","Unspecified Property Set",
2344 		PropSet48_IDS
2345 	},
2346 	{	{0xB812F15D, 0xC2D8, 0x4BBF, {0xBA, 0xCD, 0x79, 0x74, 0x43, 0x46, 0x11, 0x3F}},
2347 		"???","Unspecified Property Set",
2348 		PropSet49_IDS
2349 	},
2350 	{	{0xA06992B3, 0x8CAF, 0x4ED7, {0xA5, 0x47, 0xB2, 0x59, 0xE3, 0x2A, 0xC9, 0xFC}},
2351 		"???","Unspecified Property Set",
2352 		PropSet50_IDS
2353 	},
2354 	{	{0x41CF5AE0, 0xF75A, 0x4806, {0xBD, 0x87, 0x59, 0xC7, 0xD9, 0x24, 0x8E, 0xB9}},
2355 		"???","Unspecified Property Set",
2356 		PropSet51_IDS
2357 	},
2358 	{	{0x0ADEF160, 0xDB3F, 0x4308, {0x9A, 0x21, 0x06, 0x23, 0x7B, 0x16, 0xFA, 0x2A}},
2359 		"???","Unspecified Property Set",
2360 		PropSet52_IDS
2361 	},
2362 	{	{0x8AFCC170, 0x8A46, 0x4B53, {0x9E, 0xEE, 0x90, 0xBA, 0xE7, 0x15, 0x1E, 0x62}},
2363 		"???","Unspecified Property Set",
2364 		PropSet53_IDS
2365 	},
2366 	{	{0x56310920, 0x2491, 0x4919, {0x99, 0xCE, 0xEA, 0xDB, 0x06, 0xFA, 0xFD, 0xB2}},
2367 		"???","Unspecified Property Set",
2368 		PropSet54_IDS
2369 	},
2370 	{	{0xB33AF30B, 0xF552, 0x4584, {0x93, 0x6C, 0xCB, 0x93, 0xE5, 0xCD, 0xA2, 0x9F}},
2371 		"???","Unspecified Property Set",
2372 		PropSet55_IDS
2373 	},
2374 	{	{0x67DF94DE, 0x0CA7, 0x4D6F, {0xB7, 0x92, 0x05, 0x3A, 0x3E, 0x4F, 0x03, 0xCF}},
2375 		"???","Unspecified Property Set",
2376 		PropSet56_IDS
2377 	},
2378 	{	{0x9098F33C, 0x9A7D, 0x48A8, {0x8D, 0xE5, 0x2E, 0x12, 0x27, 0xA6, 0x4E, 0x91}},
2379 		"???","Unspecified Property Set",
2380 		PropSet57_IDS
2381 	},
2382 	{	{0xDE5EF3C7, 0x46E1, 0x484E, {0x99, 0x99, 0x62, 0xC5, 0x30, 0x83, 0x94, 0xC1}},
2383 		"???","Unspecified Property Set",
2384 		PropSet58_IDS
2385 	},
2386 	{	{0x315B9C8D, 0x80A9, 0x4EF9, {0xAE, 0x16, 0x8E, 0x74, 0x6D, 0xA5, 0x1D, 0x70}},
2387 		"???","Unspecified Property Set",
2388 		PropSet59_IDS
2389 	},
2390 	{	{0x98F98354, 0x617A, 0x46B8, {0x85, 0x60, 0x5B, 0x1B, 0x64, 0xBF, 0x1F, 0x89}},
2391 		"???","Unspecified Property Set",
2392 		PropSet60_IDS
2393 	},
2394 	{	{0x08F6D7C2, 0xE3F2, 0x44FC, {0xAF, 0x1E, 0x5A, 0xA5, 0xC8, 0x1A, 0x2D, 0x3E}},
2395 		"???","Unspecified Property Set",
2396 		PropSet61_IDS
2397 	},
2398 	{	{0xD4D0AA16, 0x9948, 0x41A4, {0xAA, 0x85, 0xD9, 0x7F, 0xF9, 0x64, 0x69, 0x93}},
2399 		"???","Unspecified Property Set",
2400 		PropSet62_IDS
2401 	},
2402 	{	{0xDE41CC29, 0x6971, 0x4290, {0xB4, 0x72, 0xF5, 0x9F, 0x2E, 0x2F, 0x31, 0xE2}},
2403 		"???","Unspecified Property Set",
2404 		PropSet63_IDS
2405 	},
2406 	{	{0xDEA7C82C, 0x1D89, 0x4A66, {0x94, 0x27, 0xA4, 0xE3, 0xDE, 0xBA, 0xBC, 0xB1}},
2407 		"???","Unspecified Property Set",
2408 		PropSet64_IDS
2409 	},
2410 	{	{0x00F58A38, 0xC54B, 0x4C40, {0x86, 0x96, 0x97, 0x23, 0x59, 0x80, 0xEA, 0xE1}},
2411 		"???","Unspecified Property Set",
2412 		PropSet65_IDS
2413 	},
2414 	{	{0xCD9ED458, 0x08CE, 0x418F, {0xA7, 0x0E, 0xF9, 0x12, 0xC7, 0xBB, 0x9C, 0x5C}},
2415 		"???","Unspecified Property Set",
2416 		PropSet66_IDS
2417 	},
2418 	{	{0x64440492, 0x4C8B, 0x11D1, {0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03}},
2419 		"???","Unspecified Property Set",
2420 		PropSet67_IDS
2421 	},
2422 	{	{0xAAA660F9, 0x9865, 0x458E, {0xB4, 0x84, 0x01, 0xBC, 0x7F, 0xE3, 0x97, 0x3E}},
2423 		"???","Unspecified Property Set",
2424 		PropSet68_IDS
2425 	},
2426 	{	{0xE8309B6E, 0x084C, 0x49B4, {0xB1, 0xFC, 0x90, 0xA8, 0x03, 0x31, 0xB6, 0x38}},
2427 		"???","Unspecified Property Set",
2428 		PropSet69_IDS
2429 	},
2430 	{	{0x64440490, 0x4C8B, 0x11D1, {0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03}},
2431 		"???","Unspecified Property Set",
2432 		PropSet70_IDS
2433 	},
2434 	{	{0xE4F10A3C, 0x49E6, 0x405D, {0x82, 0x88, 0xA2, 0x3B, 0xD4, 0xEE, 0xAA, 0x6C}},
2435 		"???","Unspecified Property Set",
2436 		PropSet71_IDS
2437 	},
2438 	{	{0x14B81DA1, 0x0135, 0x4D31, {0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99}},
2439 		"???","Unspecified Property Set",
2440 		PropSet72_IDS
2441 	},
2442 	{	{0xAAF16BAC, 0x2B55, 0x45E6, {0x9F, 0x6D, 0x41, 0x5E, 0xB9, 0x49, 0x10, 0xDF}},
2443 		"???","Unspecified Property Set",
2444 		PropSet73_IDS
2445 	},
2446 	{	{0x821437D6, 0x9EAB, 0x4765, {0xA5, 0x89, 0x3B, 0x1C, 0xBB, 0xD2, 0x2A, 0x61}},
2447 		"???","Unspecified Property Set",
2448 		PropSet74_IDS
2449 	},
2450 	{	{0xD55BAE5A, 0x3892, 0x417A, {0xA6, 0x49, 0xC6, 0xAC, 0x5A, 0xAA, 0xEA, 0xB3}},
2451 		"???","Unspecified Property Set",
2452 		PropSet75_IDS
2453 	},
2454 	{	{0x72FC5BA4, 0x24F9, 0x4011, {0x9F, 0x3F, 0xAD, 0xD2, 0x7A, 0xFA, 0xD8, 0x18}},
2455 		"???","Unspecified Property Set",
2456 		PropSet76_IDS
2457 	},
2458 	{	{0x0BA7D6C3, 0x568D, 0x4159, {0xAB, 0x91, 0x78, 0x1A, 0x91, 0xFB, 0x71, 0xE5}},
2459 		"???","Unspecified Property Set",
2460 		PropSet77_IDS
2461 	},
2462 	{	{0x744C8242, 0x4DF5, 0x456C, {0xAB, 0x9E, 0x01, 0x4E, 0xFB, 0x90, 0x21, 0xE3}},
2463 		"???","Unspecified Property Set",
2464 		PropSet78_IDS
2465 	},
2466 	{	{0xB9B4B3FC, 0x2B51, 0x4A42, {0xB5, 0xD8, 0x32, 0x41, 0x46, 0xAF, 0xCF, 0x25}},
2467 		"???","Unspecified Property Set",
2468 		PropSet79_IDS
2469 	},
2470 	{	{0x5DC2253F, 0x5E11, 0x4ADF, {0x9C, 0xFE, 0x91, 0x0D, 0xD0, 0x1E, 0x3E, 0x70}},
2471 		"???","Unspecified Property Set",
2472 		PropSet80_IDS
2473 	},
2474 	{	{0x7B9F6399, 0x0A3F, 0x4B12, {0x89, 0xBD, 0x4A, 0xDC, 0x51, 0xC9, 0x18, 0xAF}},
2475 		"???","Unspecified Property Set",
2476 		PropSet81_IDS
2477 	},
2478 	{	{0x8589E481, 0x6040, 0x473D, {0xB1, 0x71, 0x7F, 0xA8, 0x9C, 0x27, 0x08, 0xED}},
2479 		"???","Unspecified Property Set",
2480 		PropSet82_IDS
2481 	},
2482 	{	{0x5DA84765, 0xE3FF, 0x4278, {0x86, 0xB0, 0xA2, 0x79, 0x67, 0xFB, 0xDD, 0x03}},
2483 		"???","Unspecified Property Set",
2484 		PropSet83_IDS
2485 	},
2486 	{	{0x14977844, 0x6B49, 0x4AAD, {0xA7, 0x14, 0xA4, 0x51, 0x3B, 0xF6, 0x04, 0x60}},
2487 		"???","Unspecified Property Set",
2488 		PropSet84_IDS
2489 	},
2490 	{	{0x90E5E14E, 0x648B, 0x4826, {0xB2, 0xAA, 0xAC, 0xAF, 0x79, 0x0E, 0x35, 0x13}},
2491 		"???","Unspecified Property Set",
2492 		PropSet85_IDS
2493 	},
2494 	{	{0x293CA35A, 0x09AA, 0x4DD2, {0xB1, 0x80, 0x1F, 0xE2, 0x45, 0x72, 0x8A, 0x52}},
2495 		"???","Unspecified Property Set",
2496 		PropSet86_IDS
2497 	},
2498 	{	{0xC8EA94F0, 0xA9E3, 0x4969, {0xA9, 0x4B, 0x9C, 0x62, 0xA9, 0x53, 0x24, 0xE0}},
2499 		"???","Unspecified Property Set",
2500 		PropSet87_IDS
2501 	},
2502 	{	{0x8B26EA41, 0x058F, 0x43F6, {0xAE, 0xCC, 0x40, 0x35, 0x68, 0x1C, 0xE9, 0x77}},
2503 		"???","Unspecified Property Set",
2504 		PropSet88_IDS
2505 	},
2506 	{	{0xF21D9941, 0x81F0, 0x471A, {0xAD, 0xEE, 0x4E, 0x74, 0xB4, 0x92, 0x17, 0xED}},
2507 		"???","Unspecified Property Set",
2508 		PropSet89_IDS
2509 	},
2510 	{	{0xB0B87314, 0xFCF6, 0x4FEB, {0x8D, 0xFF, 0xA5, 0x0D, 0xA6, 0xAF, 0x56, 0x1C}},
2511 		"???","Unspecified Property Set",
2512 		PropSet90_IDS
2513 	},
2514 	{	{0xCC6F4F24, 0x6083, 0x4BD4, {0x87, 0x54, 0x67, 0x4D, 0x0D, 0xE8, 0x7A, 0xB8}},
2515 		"???","Unspecified Property Set",
2516 		PropSet91_IDS
2517 	},
2518 	{	{0xA0E74609, 0xB84D, 0x4F49, {0xB8, 0x60, 0x46, 0x2B, 0xD9, 0x97, 0x1F, 0x98}},
2519 		"???","Unspecified Property Set",
2520 		PropSet92_IDS
2521 	},
2522 	{	{0xD68DBD8A, 0x3374, 0x4B81, {0x99, 0x72, 0x3E, 0xC3, 0x06, 0x82, 0xDB, 0x3D}},
2523 		"???","Unspecified Property Set",
2524 		PropSet93_IDS
2525 	},
2526 	{	{0x2CBAA8F5, 0xD81F, 0x47CA, {0xB1, 0x7A, 0xF8, 0xD8, 0x22, 0x30, 0x01, 0x31}},
2527 		"???","Unspecified Property Set",
2528 		PropSet94_IDS
2529 	},
2530 	{	{0x72FAB781, 0xACDA, 0x43E5, {0xB1, 0x55, 0xB2, 0x43, 0x4F, 0x85, 0xE6, 0x78}},
2531 		"???","Unspecified Property Set",
2532 		PropSet95_IDS
2533 	},
2534 	{	{0x6B8DA074, 0x3B5C, 0x43BC, {0x88, 0x6F, 0x0A, 0x2C, 0xDC, 0xE0, 0x0B, 0x6F}},
2535 		"???","Unspecified Property Set",
2536 		PropSet96_IDS
2537 	},
2538 	{	{0x18BBD425, 0xECFD, 0x46EF, {0xB6, 0x12, 0x7B, 0x4A, 0x60, 0x34, 0xED, 0xA0}},
2539 		"???","Unspecified Property Set",
2540 		PropSet97_IDS
2541 	},
2542 	{	{0x276D7BB0, 0x5B34, 0x4FB0, {0xAA, 0x4B, 0x15, 0x8E, 0xD1, 0x2A, 0x18, 0x09}},
2543 		"???","Unspecified Property Set",
2544 		PropSet99_IDS
2545 	},
2546 	{	{0xFEC690B7, 0x5F30, 0x4646, {0xAE, 0x47, 0x4C, 0xAA, 0xFB, 0xA8, 0x84, 0xA3}},
2547 		"???","Unspecified Property Set",
2548 		PropSet100_IDS
2549 	},
2550 	{	{0x46B4E8DE, 0xCDB2, 0x440D, {0x88, 0x5C, 0x16, 0x58, 0xEB, 0x65, 0xB9, 0x14}},
2551 		"???","Unspecified Property Set",
2552 		PropSet101_IDS
2553 	},
2554 	{	{0xF628FD8C, 0x7BA8, 0x465A, {0xA6, 0x5B, 0xC5, 0xAA, 0x79, 0x26, 0x3A, 0x9E}},
2555 		"???","Unspecified Property Set",
2556 		PropSet102_IDS
2557 	},
2558 	{	{0x7A7D76F4, 0xB630, 0x4BD7, {0x95, 0xFF, 0x37, 0xCC, 0x51, 0xA9, 0x75, 0xC9}},
2559 		"???","Unspecified Property Set",
2560 		PropSet103_IDS
2561 	},
2562 	{	{0x446F787F, 0x10C4, 0x41CB, {0xA6, 0xC4, 0x4D, 0x03, 0x43, 0x55, 0x15, 0x97}},
2563 		"???","Unspecified Property Set",
2564 		PropSet104_IDS
2565 	},
2566 	{	{0xA9EA193C, 0xC511, 0x498A, {0xA0, 0x6B, 0x58, 0xE2, 0x77, 0x6D, 0xCC, 0x28}},
2567 		"???","Unspecified Property Set",
2568 		PropSet105_IDS
2569 	},
2570 	{	{0x97B0AD89, 0xDF49, 0x49CC, {0x83, 0x4E, 0x66, 0x09, 0x74, 0xFD, 0x75, 0x5B}},
2571 		"???","Unspecified Property Set",
2572 		PropSet106_IDS
2573 	},
2574 	{	{0xF6272D18, 0xCECC, 0x40B1, {0xB2, 0x6A, 0x39, 0x11, 0x71, 0x7A, 0xA7, 0xBD}},
2575 		"???","Unspecified Property Set",
2576 		PropSet107_IDS
2577 	},
2578 	{	{0x61478C08, 0xB600, 0x4A84, {0xBB, 0xE4, 0xE9, 0x9C, 0x45, 0xF0, 0xA0, 0x72}},
2579 		"???","Unspecified Property Set",
2580 		PropSet108_IDS
2581 	},
2582 	{	{0xBCCC8A3C, 0x8CEF, 0x42E5, {0x9B, 0x1C, 0xC6, 0x90, 0x79, 0x39, 0x8B, 0xC7}},
2583 		"???","Unspecified Property Set",
2584 		PropSet109_IDS
2585 	},
2586 	{	{0x9AD5BADB, 0xCEA7, 0x4470, {0xA0, 0x3D, 0xB8, 0x4E, 0x51, 0xB9, 0x94, 0x9E}},
2587 		"???","Unspecified Property Set",
2588 		PropSet110_IDS
2589 	},
2590 	{	{0xF1A24AA7, 0x9CA7, 0x40F6, {0x89, 0xEC, 0x97, 0xDE, 0xF9, 0xFF, 0xE8, 0xDB}},
2591 		"???","Unspecified Property Set",
2592 		PropSet111_IDS
2593 	},
2594 	{	{0x3602C812, 0x0F3B, 0x45F0, {0x85, 0xAD, 0x60, 0x34, 0x68, 0xD6, 0x94, 0x23}},
2595 		"???","Unspecified Property Set",
2596 		PropSet112_IDS
2597 	},
2598 	{	{0xA6F360D2, 0x55F9, 0x48DE, {0xB9, 0x09, 0x62, 0x0E, 0x09, 0x0A, 0x64, 0x7C}},
2599 		"???","Unspecified Property Set",
2600 		PropSet113_IDS
2601 	},
2602 	{	{0x897B3694, 0xFE9E, 0x43E6, {0x80, 0x66, 0x26, 0x0F, 0x59, 0x0C, 0x01, 0x00}},
2603 		"???","Unspecified Property Set",
2604 		PropSet114_IDS
2605 	},
2606 	{	{0x8619A4B6, 0x9F4D, 0x4429, {0x8C, 0x0F, 0xB9, 0x96, 0xCA, 0x59, 0xE3, 0x35}},
2607 		"???","Unspecified Property Set",
2608 		PropSet115_IDS
2609 	},
2610 	{	{0xA26F4AFC, 0x7346, 0x4299, {0xBE, 0x47, 0xEB, 0x1A, 0xE6, 0x13, 0x13, 0x9F}},
2611 		"???","Unspecified Property Set",
2612 		PropSet116_IDS
2613 	},
2614 	{	{0xBC4E71CE, 0x17F9, 0x48D5, {0xBE, 0xE9, 0x02, 0x1D, 0xF0, 0xEA, 0x54, 0x09}},
2615 		"???","Unspecified Property Set",
2616 		PropSet117_IDS
2617 	},
2618 	{	{0x65A98875, 0x3C80, 0x40AB, {0xAB, 0xBC, 0xEF, 0xDA, 0xF7, 0x7D, 0xBE, 0xE2}},
2619 		"???","Unspecified Property Set",
2620 		PropSet118_IDS
2621 	},
2622 	{	{0x84D8F337, 0x981D, 0x44B3, {0x96, 0x15, 0xC7, 0x59, 0x6D, 0xBA, 0x17, 0xE3}},
2623 		"???","Unspecified Property Set",
2624 		PropSet119_IDS
2625 	},
2626 	{	{0xBE1A72C6, 0x9A1D, 0x46B7, {0xAF, 0xE7, 0xAF, 0xAF, 0x8C, 0xEF, 0x49, 0x99}},
2627 		"???","Unspecified Property Set",
2628 		PropSet120_IDS
2629 	},
2630 	{	{0x8F367200, 0xC270, 0x457C, {0xB1, 0xD4, 0xE0, 0x7C, 0x5B, 0xCD, 0x90, 0xC7}},
2631 		"???","Unspecified Property Set",
2632 		PropSet121_IDS
2633 	},
2634 	{	{0x428040AC, 0xA177, 0x4C8A, {0x97, 0x60, 0xF6, 0xF7, 0x61, 0x22, 0x7F, 0x9A}},
2635 		"???","Unspecified Property Set",
2636 		PropSet122_IDS
2637 	},
2638 	{	{0xA3B29791, 0x7713, 0x4E1D, {0xBB, 0x40, 0x17, 0xDB, 0x85, 0xF0, 0x18, 0x31}},
2639 		"???","Unspecified Property Set",
2640 		PropSet123_IDS
2641 	},
2642 	{	{0xBCEEE283, 0x35DF, 0x4D53, {0x82, 0x6A, 0xF3, 0x6A, 0x3E, 0xEF, 0xC6, 0xBE}},
2643 		"???","Unspecified Property Set",
2644 		PropSet124_IDS
2645 	},
2646 	{	{0x91EFF6F3, 0x2E27, 0x42CA, {0x93, 0x3E, 0x7C, 0x99, 0x9F, 0xBE, 0x31, 0x0B}},
2647 		"???","Unspecified Property Set",
2648 		PropSet125_IDS
2649 	},
2650 	{	{0x5CBF2787, 0x48CF, 0x4208, {0xB9, 0x0E, 0xEE, 0x5E, 0x5D, 0x42, 0x02, 0x94}},
2651 		"???","Unspecified Property Set",
2652 		PropSet126_IDS
2653 	},
2654 	{	{0x1B5439E7, 0xEBA1, 0x4AF8, {0xBD, 0xD7, 0x7A, 0xF1, 0xD4, 0x54, 0x94, 0x93}},
2655 		"???","Unspecified Property Set",
2656 		PropSet127_IDS
2657 	},
2658 	{	{0x08C7CC5F, 0x60F2, 0x4494, {0xAD, 0x75, 0x55, 0xE3, 0xE0, 0xB5, 0xAD, 0xD0}},
2659 		"???","Unspecified Property Set",
2660 		PropSet128_IDS
2661 	},
2662 	{	{0x7FE3AA27, 0x2648, 0x42F3, {0x89, 0xB0, 0x45, 0x4E, 0x5C, 0xB1, 0x50, 0xC3}},
2663 		"???","Unspecified Property Set",
2664 		PropSet129_IDS
2665 	},
2666 	{	{0xE53D799D, 0x0F3F, 0x466E, {0xB2, 0xFF, 0x74, 0x63, 0x4A, 0x3C, 0xB7, 0xA4}},
2667 		"???","Unspecified Property Set",
2668 		PropSet130_IDS
2669 	},
2670 	{	{0x4776CAFA, 0xBCE4, 0x4CB1, {0xA2, 0x3E, 0x26, 0x5E, 0x76, 0xD8, 0xEB, 0x11}},
2671 		"???","Unspecified Property Set",
2672 		PropSet131_IDS
2673 	},
2674 	{	{0x71B377D6, 0xE570, 0x425F, {0xA1, 0x70, 0x80, 0x9F, 0xAE, 0x73, 0xE5, 0x4E}},
2675 		"???","Unspecified Property Set",
2676 		PropSet132_IDS
2677 	},
2678 	{	{0x3143BF7C, 0x80A8, 0x4854, {0x88, 0x80, 0xE2, 0xE4, 0x01, 0x89, 0xBD, 0xD0}},
2679 		"???","Unspecified Property Set",
2680 		PropSet133_IDS
2681 	},
2682 	{	{0xA6744477, 0xC237, 0x475B, {0xA0, 0x75, 0x54, 0xF3, 0x44, 0x98, 0x29, 0x2A}},
2683 		"???","Unspecified Property Set",
2684 		PropSet134_IDS
2685 	},
2686 	{	{0xC9C34F84, 0x2241, 0x4401, {0xB6, 0x07, 0xBD, 0x20, 0xED, 0x75, 0xAE, 0x7F}},
2687 		"???","Unspecified Property Set",
2688 		PropSet135_IDS
2689 	},
2690 	{	{0xF8FA7FA3, 0xD12B, 0x4785, {0x8A, 0x4E, 0x69, 0x1A, 0x94, 0xF7, 0xA3, 0xE7}},
2691 		"???","Unspecified Property Set",
2692 		PropSet136_IDS
2693 	},
2694 	{	{0x7268AF55, 0x1CE4, 0x4F6E, {0xA4, 0x1F, 0xB6, 0xE4, 0xEF, 0x10, 0xE4, 0xA9}},
2695 		"???","Unspecified Property Set",
2696 		PropSet137_IDS
2697 	},
2698 	{	{0xE1D4A09E, 0xD758, 0x4CD1, {0xB6, 0xEC, 0x34, 0xA8, 0xB5, 0xA7, 0x3F, 0x80}},
2699 		"???","Unspecified Property Set",
2700 		PropSet138_IDS
2701 	},
2702 	{	{0xD7313FF1, 0xA77A, 0x401C, {0x8C, 0x99, 0x3D, 0xBD, 0xD6, 0x8A, 0xDD, 0x36}},
2703 		"???","Unspecified Property Set",
2704 		PropSet139_IDS
2705 	},
2706 	{	{0xF85BF840, 0xA925, 0x4BC2, {0xB0, 0xC4, 0x8E, 0x36, 0xB5, 0x98, 0x67, 0x9E}},
2707 		"???","Unspecified Property Set",
2708 		PropSet140_IDS
2709 	},
2710 	{	{0x668CDFA5, 0x7A1B, 0x4323, {0xAE, 0x4B, 0xE5, 0x27, 0x39, 0x3A, 0x1D, 0x81}},
2711 		"???","Unspecified Property Set",
2712 		PropSet141_IDS
2713 	},
2714 	{	{0xEE3D3D8A, 0x5381, 0x4CFA, {0xB1, 0x3B, 0xAA, 0xF6, 0x6B, 0x5F, 0x4E, 0xC9}},
2715 		"???","Unspecified Property Set",
2716 		PropSet142_IDS
2717 	},
2718 	{	{0xD0C7F054, 0x3F72, 0x4725, {0x85, 0x27, 0x12, 0x9A, 0x57, 0x7C, 0xB2, 0x69}},
2719 		"???","Unspecified Property Set",
2720 		PropSet143_IDS
2721 	},
2722 	{	{0x3C8CEE58, 0xD4F0, 0x4CF9, {0xB7, 0x56, 0x4E, 0x5D, 0x24, 0x44, 0x7B, 0xCD}},
2723 		"???","Unspecified Property Set",
2724 		PropSet144_IDS
2725 	},
2726 	{	{0x6E682923, 0x7F7B, 0x4F0C, {0xA3, 0x37, 0xCF, 0xCA, 0x29, 0x66, 0x87, 0xBF}},
2727 		"???","Unspecified Property Set",
2728 		PropSet145_IDS
2729 	},
2730 	{	{0xFD122953, 0xFA93, 0x4EF7, {0x92, 0xC3, 0x04, 0xC9, 0x46, 0xB2, 0xF7, 0xC8}},
2731 		"???","Unspecified Property Set",
2732 		PropSet146_IDS
2733 	},
2734 	{	{0x0BE1C8E7, 0x1981, 0x4676, {0xAE, 0x14, 0xFD, 0xD7, 0x8F, 0x05, 0xA6, 0xE7}},
2735 		"???","Unspecified Property Set",
2736 		PropSet147_IDS
2737 	},
2738 	{	{0xF1176DFE, 0x7138, 0x4640, {0x8B, 0x4C, 0xAE, 0x37, 0x5D, 0xC7, 0x0A, 0x6D}},
2739 		"???","Unspecified Property Set",
2740 		PropSet148_IDS
2741 	},
2742 	{	{0x95BEB1FC, 0x326D, 0x4644, {0xB3, 0x96, 0xCD, 0x3E, 0xD9, 0x0E, 0x6D, 0xDF}},
2743 		"???","Unspecified Property Set",
2744 		PropSet149_IDS
2745 	},
2746 	{	{0xDDD1460F, 0xC0BF, 0x4553, {0x8C, 0xE4, 0x10, 0x43, 0x3C, 0x90, 0x8F, 0xB0}},
2747 		"???","Unspecified Property Set",
2748 		PropSet150_IDS
2749 	},
2750 	{	{0x9B174B34, 0x40FF, 0x11D2, {0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71}},
2751 		"???","Unspecified Property Set",
2752 		PropSet151_IDS
2753 	},
2754 	{	{0x08A65AA1, 0xF4C9, 0x43DD, {0x9D, 0xDF, 0xA3, 0x3D, 0x8E, 0x7E, 0xAD, 0x85}},
2755 		"???","Unspecified Property Set",
2756 		PropSet152_IDS
2757 	},
2758 	{	{0x084D8A0A, 0xE6D5, 0x40DE, {0xBF, 0x1F, 0xC8, 0x82, 0x0E, 0x7C, 0x87, 0x7C}},
2759 		"???","Unspecified Property Set",
2760 		PropSet153_IDS
2761 	},
2762 	{	{0x841E4F90, 0xFF59, 0x4D16, {0x89, 0x47, 0xE8, 0x1B, 0xBF, 0xFA, 0xB3, 0x6D}},
2763 		"???","Unspecified Property Set",
2764 		PropSet154_IDS
2765 	},
2766 	{	{0xFC9F7306, 0xFF8F, 0x4D49, {0x9F, 0xB6, 0x3F, 0xFE, 0x5C, 0x09, 0x51, 0xEC}},
2767 		"???","Unspecified Property Set",
2768 		PropSet155_IDS
2769 	},
2770 	{	{0x53DA57CF, 0x62C0, 0x45C4, {0x81, 0xDE, 0x76, 0x10, 0xBC, 0xEF, 0xD7, 0xF5}},
2771 		"???","Unspecified Property Set",
2772 		PropSet156_IDS
2773 	},
2774 	{	{0xF8D3F6AC, 0x4874, 0x42CB, {0xBE, 0x59, 0xAB, 0x45, 0x4B, 0x30, 0x71, 0x6A}},
2775 		"???","Unspecified Property Set",
2776 		PropSet157_IDS
2777 	},
2778 	{	{0x4684FE97, 0x8765, 0x4842, {0x9C, 0x13, 0xF0, 0x06, 0x44, 0x7B, 0x17, 0x8C}},
2779 		"???","Unspecified Property Set",
2780 		PropSet158_IDS
2781 	},
2782 	{	{0xC449D5CB, 0x9EA4, 0x4809, {0x82, 0xE8, 0xAF, 0x9D, 0x59, 0xDE, 0xD6, 0xD1}},
2783 		"???","Unspecified Property Set",
2784 		PropSet159_IDS
2785 	},
2786 	{	{0x3F8472B5, 0xE0AF, 0x4DB2, {0x80, 0x71, 0xC5, 0x3F, 0xE7, 0x6A, 0xE7, 0xCE}},
2787 		"???","Unspecified Property Set",
2788 		PropSet160_IDS
2789 	},
2790 	{	{0x0CEF7D53, 0xFA64, 0x11D1, {0xA2, 0x03, 0x00, 0x00, 0xF8, 0x1F, 0xED, 0xEE}},
2791 		"???","Unspecified Property Set",
2792 		PropSet161_IDS
2793 	},
2794 	{	{0xFDF84370, 0x031A, 0x4ADD, {0x9E, 0x91, 0x0D, 0x77, 0x5F, 0x1C, 0x66, 0x05}},
2795 		"???","Unspecified Property Set",
2796 		PropSet162_IDS
2797 	},
2798 	{	{0x6D748DE2, 0x8D38, 0x4CC3, {0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57}},
2799 		"???","Unspecified Property Set",
2800 		PropSet163_IDS
2801 	},
2802 	{	{0x2579E5D0, 0x1116, 0x4084, {0xBD, 0x9A, 0x9B, 0x4F, 0x7C, 0xB4, 0xDF, 0x5E}},
2803 		"???","Unspecified Property Set",
2804 		PropSet164_IDS
2805 	},
2806 	{	{0xC554493C, 0xC1F7, 0x40C1, {0xA7, 0x6C, 0xEF, 0x8C, 0x06, 0x14, 0x00, 0x3E}},
2807 		"???","Unspecified Property Set",
2808 		PropSet165_IDS
2809 	},
2810 	{	{0x0DA41CFA, 0xD224, 0x4A18, {0xAE, 0x2F, 0x59, 0x61, 0x58, 0xDB, 0x4B, 0x3A}},
2811 		"???","Unspecified Property Set",
2812 		PropSet166_IDS
2813 	},
2814 	{	{0xA82D9EE7, 0xCA67, 0x4312, {0x96, 0x5E, 0x22, 0x6B, 0xCE, 0xA8, 0x50, 0x23}},
2815 		"???","Unspecified Property Set",
2816 		PropSet167_IDS
2817 	},
2818 	{	{0x09329B74, 0x40A3, 0x4C68, {0xBF, 0x07, 0xAF, 0x9A, 0x57, 0x2F, 0x60, 0x7C}},
2819 		"???","Unspecified Property Set",
2820 		PropSet168_IDS
2821 	},
2822 	{	{0x9A93244D, 0xA7AD, 0x4FF8, {0x9B, 0x99, 0x45, 0xEE, 0x4C, 0xC0, 0x9A, 0xF6}},
2823 		"???","Unspecified Property Set",
2824 		PropSet169_IDS
2825 	},
2826 	{	{0xF04BEF95, 0xC585, 0x4197, {0xA2, 0xB7, 0xDF, 0x46, 0xFD, 0xC9, 0xEE, 0x6D}},
2827 		"???","Unspecified Property Set",
2828 		PropSet170_IDS
2829 	},
2830 	{	{0x59DDE9F2, 0x5253, 0x40EA, {0x9A, 0x8B, 0x47, 0x9E, 0x96, 0xC6, 0x24, 0x9A}},
2831 		"???","Unspecified Property Set",
2832 		PropSet171_IDS
2833 	},
2834 	{	{0x6444048F, 0x4C8B, 0x11D1, {0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03}},
2835 		"???","Unspecified Property Set",
2836 		PropSet172_IDS
2837 	},
2838 	{	{0x9A9BC088, 0x4F6D, 0x469E, {0x99, 0x19, 0xE7, 0x05, 0x41, 0x20, 0x40, 0xF9}},
2839 		"???","Unspecified Property Set",
2840 		PropSet173_IDS
2841 	},
2842 	{	{0x6336B95E, 0xC7A7, 0x426D, {0x86, 0xFD, 0x7A, 0xE3, 0xD3, 0x9C, 0x84, 0xB4}},
2843 		"???","Unspecified Property Set",
2844 		PropSet174_IDS
2845 	},
2846 	{	{0xC06238B2, 0x0BF9, 0x4279, {0xA7, 0x23, 0x25, 0x85, 0x67, 0x15, 0xCB, 0x9D}},
2847 		"???","Unspecified Property Set",
2848 		PropSet175_IDS
2849 	},
2850 	{	{0xEC0B4191, 0xAB0B, 0x4C66, {0x90, 0xB6, 0xC6, 0x63, 0x7C, 0xDE, 0xBB, 0xAB}},
2851 		"???","Unspecified Property Set",
2852 		PropSet176_IDS
2853 	},
2854 	{	{0x660E04D6, 0x81AB, 0x4977, {0xA0, 0x9F, 0x82, 0x31, 0x31, 0x13, 0xAB, 0x26}},
2855 		"???","Unspecified Property Set",
2856 		PropSet177_IDS
2857 	},
2858 	{	{0xDC54FD2E, 0x189D, 0x4871, {0xAA, 0x01, 0x08, 0xC2, 0xF5, 0x7A, 0x4A, 0xBC}},
2859 		"???","Unspecified Property Set",
2860 		PropSet178_IDS
2861 	},
2862 	{	{0xCD102C9C, 0x5540, 0x4A88, {0xA6, 0xF6, 0x64, 0xE4, 0x98, 0x1C, 0x8C, 0xD1}},
2863 		"???","Unspecified Property Set",
2864 		PropSet179_IDS
2865 	},
2866 	{	{0x1F856A9F, 0x6900, 0x4ABA, {0x95, 0x05, 0x2D, 0x5F, 0x1B, 0x4D, 0x66, 0xCB}},
2867 		"???","Unspecified Property Set",
2868 		PropSet180_IDS
2869 	},
2870 	{	{0x90197CA7, 0xFD8F, 0x4E8C, {0x9D, 0xA3, 0xB5, 0x7E, 0x1E, 0x60, 0x92, 0x95}},
2871 		"???","Unspecified Property Set",
2872 		PropSet181_IDS
2873 	},
2874 	{	{0xF334115E, 0xDA1B, 0x4509, {0x9B, 0x3D, 0x11, 0x95, 0x04, 0xDC, 0x7A, 0xBB}},
2875 		"???","Unspecified Property Set",
2876 		PropSet182_IDS
2877 	},
2878 	{	{0xBF53D1C3, 0x49E0, 0x4F7F, {0x85, 0x67, 0x5A, 0x82, 0x1D, 0x8A, 0xC5, 0x42}},
2879 		"???","Unspecified Property Set",
2880 		PropSet183_IDS
2881 	},
2882 	{	{0xC75FAA05, 0x96FD, 0x49E7, {0x9C, 0xB4, 0x9F, 0x60, 0x10, 0x82, 0xD5, 0x53}},
2883 		"???","Unspecified Property Set",
2884 		PropSet184_IDS
2885 	},
2886 	{	{0x2E4B640D, 0x5019, 0x46D8, {0x88, 0x81, 0x55, 0x41, 0x4C, 0xC5, 0xCA, 0xA0}},
2887 		"???","Unspecified Property Set",
2888 		PropSet185_IDS
2889 	},
2890 	{	{0x6B8B68F6, 0x200B, 0x47EA, {0x8D, 0x25, 0xD8, 0x05, 0x0F, 0x57, 0x33, 0x9F}},
2891 		"???","Unspecified Property Set",
2892 		PropSet186_IDS
2893 	},
2894 	{	{0x2D152B40, 0xCA39, 0x40DB, {0xB2, 0xCC, 0x57, 0x37, 0x25, 0xB2, 0xFE, 0xC5}},
2895 		"???","Unspecified Property Set",
2896 		PropSet187_IDS
2897 	},
2898 	{	{0x1E005EE6, 0xBF27, 0x428B, {0xB0, 0x1C, 0x79, 0x67, 0x6A, 0xCD, 0x28, 0x70}},
2899 		"???","Unspecified Property Set",
2900 		PropSet188_IDS
2901 	},
2902 	{	{0xD6304E01, 0xF8F5, 0x4F45, {0x8B, 0x15, 0xD0, 0x24, 0xA6, 0x29, 0x67, 0x89}},
2903 		"???","Unspecified Property Set",
2904 		PropSet189_IDS
2905 	},
2906 	{	{0x402B5934, 0xEC5A, 0x48C3, {0x93, 0xE6, 0x85, 0xE8, 0x6A, 0x2D, 0x93, 0x4E}},
2907 		"???","Unspecified Property Set",
2908 		PropSet190_IDS
2909 	},
2910 	{	{0x9AEBAE7A, 0x9644, 0x487D, {0xA9, 0x2C, 0x65, 0x75, 0x85, 0xED, 0x75, 0x1A}},
2911 		"???","Unspecified Property Set",
2912 		PropSet191_IDS
2913 	},
2914 	{	{0x63C25B20, 0x96BE, 0x488F, {0x87, 0x88, 0xC0, 0x9C, 0x40, 0x7A, 0xD8, 0x12}},
2915 		"???","Unspecified Property Set",
2916 		PropSet192_IDS
2917 	},
2918 	{	{0x48FD6EC8, 0x8A12, 0x4CDF, {0xA0, 0x3E, 0x4E, 0xC5, 0xA5, 0x11, 0xED, 0xDE}},
2919 		"???","Unspecified Property Set",
2920 		PropSet193_IDS
2921 	},
2922 	{	{0x64440491, 0x4C8B, 0x11D1, {0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03}},
2923 		"???","Unspecified Property Set",
2924 		PropSet194_IDS
2925 	},
2926 	{	{0xC0AC206A, 0x827E, 0x4650, {0x95, 0xAE, 0x77, 0xE2, 0xBB, 0x74, 0xFC, 0xC9}},
2927 		"???","Unspecified Property Set",
2928 		PropSet195_IDS
2929 	}
2930 };
2931 
2932 static const value_string version_vals[] = {
2933 	{0x00000102, "Windows Vista or 2008"},
2934 	{0x00000109, "Windows XP or 2003 with Windows Search 4.0"},
2935 	{0x00000700, "Windows 7 or 2008 R2"},
2936 	{0x00010102, "Windows Vista or 2008 (64 bit)"},
2937 	{0x00010109, "Windows XP or 2003 with Windows Search 4.0 (64 bit)"},
2938 	{0x00010700, "Windows 7 or 2008 R2 (64 bit)"},
2939 	{0, NULL}
2940 };
2941 
2942 static struct GuidPropertySet *GuidPropertySet_find_guid(const e_guid_t *guid)
2943 {
2944 	unsigned i;
2945 	for (i=0; i<array_length(GuidPropertySet); i++) {
2946 		if (guid_cmp(&GuidPropertySet[i].guid, guid) == 0) {
2947 			return &GuidPropertySet[i];
2948 		}
2949 	}
2950 	return NULL;
2951 }
2952 
2953 static void get_name_from_fullpropspec(struct CFullPropSpec *v, char *out, int bufsize)
2954 {
2955 	struct GuidPropertySet *pset = GuidPropertySet_find_guid(&v->guid);
2956 	const char *id_str, *guid_str;
2957 	char *dest = out;
2958 	id_str = pset ? try_val_to_str(v->u.propid, pset->id_map) : NULL;
2959 
2960 	if (id_str) {
2961 		g_snprintf(dest, bufsize, "%s", id_str);
2962 	} else {
2963 		guid_str = guids_get_guid_name(&v->guid, wmem_packet_scope());
2964 		if (guid_str) {
2965 			g_snprintf(dest, bufsize, "\"%s\"", guid_str);
2966 		} else {
2967 			guid_str = guid_to_str(wmem_packet_scope(), &v->guid);
2968 			g_snprintf(dest, bufsize, "{%s}", guid_str);
2969 		}
2970 		if (v->kind == PRSPEC_LPWSTR) {
2971 			g_snprintf(dest, bufsize, "%s \"%s\"", guid_str, v->u.name);
2972 		} else if (v->kind == PRSPEC_PROPID) {
2973 			g_snprintf(dest, bufsize, "%s 0x%08x", guid_str, v->u.propid);
2974 		} else {
2975 			g_snprintf(dest, bufsize, "%s <INVALID>", dest);
2976 		}
2977 	}
2978 }
2979 
2980 /******************************************************************************/
2981 static int parse_uin32_array(tvbuff_t *tvb, int offset, proto_tree *tree, guint32 count, const char *fmt, ...)
2982 {
2983 	guint32 v, i;
2984 	proto_item *item;
2985 	const char *txt;
2986 	va_list ap;
2987 
2988 	va_start(ap, fmt);
2989 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
2990 	va_end(ap);
2991 	proto_tree_add_subtree(tree, tvb, offset, count * 4, ett_mswsp_uin32_array, &item, txt);
2992 	proto_item_append_text(item, " count %u [", count);
2993 	for (i=0; i<count; i++) {
2994 		v = tvb_get_letohl(tvb, offset);
2995 		offset += 4;
2996 		if (i>0) {
2997 			proto_item_append_text(item, ",%u", v);
2998 		} else {
2999 			proto_item_append_text(item, "%u", v);
3000 		}
3001 	}
3002 	proto_item_append_text(item, "]");
3003 	return offset;
3004 }
3005 
3006 static int parse_padding(tvbuff_t *tvb, int offset, int alignment, proto_tree *pad_tree, const char *fmt, ...)
3007 {
3008 	if (offset % alignment) {
3009 		const int padding = alignment - (offset % alignment);
3010 		const char *txt;
3011 		va_list ap;
3012 		proto_item *ti;
3013 		va_start(ap, fmt);
3014 		txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3015 		proto_tree_add_subtree(pad_tree, tvb, offset, padding, ett_mswsp_msg_padding, &ti, txt);
3016 		va_end(ap);
3017 
3018 		proto_item_append_text(ti, " (%d)", padding);
3019 		offset += padding;
3020 	}
3021 	DISSECTOR_ASSERT((offset % alignment) == 0);
3022 	return offset;
3023 }
3024 
3025 static int parse_guid(tvbuff_t *tvb, int offset, proto_tree *tree, e_guid_t *guid, const char *text)
3026 {
3027 	const char *guid_str, *name, *bytes;
3028 	proto_tree *tr;
3029 
3030 	tvb_get_letohguid(tvb, offset, guid);
3031 	guid_str =  guid_to_str(wmem_packet_scope(), guid);
3032 	name = guids_get_guid_name(guid, wmem_packet_scope());
3033 
3034 	tr = proto_tree_add_subtree_format(tree, tvb, offset, 16, ett_GUID, NULL, "%s: %s {%s}", text, name ? name : "", guid_str);
3035 
3036 
3037 	proto_tree_add_item(tr, hf_mswsp_guid_time_low, tvb, offset, 4, ENC_LITTLE_ENDIAN);
3038 	offset += 4;
3039 	proto_tree_add_item(tr, hf_mswsp_guid_time_mid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
3040 	offset += 2;
3041 	proto_tree_add_item(tr, hf_mswsp_guid_time_high, tvb, offset, 2, ENC_LITTLE_ENDIAN);
3042 	offset += 2;
3043 	proto_tree_add_item(tr, hf_mswsp_guid_time_clock_hi, tvb, offset, 1, ENC_LITTLE_ENDIAN);
3044 	offset += 1;
3045 	proto_tree_add_item(tr, hf_mswsp_guid_time_clock_low, tvb, offset, 1, ENC_LITTLE_ENDIAN);
3046 	offset += 1;
3047 	bytes = bytes_to_str_punct(wmem_packet_scope(), &guid->data4[2], 6, ':');
3048 	proto_tree_add_string(tr, hf_mswsp_guid_node, tvb, offset, 6, bytes);
3049 
3050 	offset += 6;
3051 
3052 	return offset;
3053 }
3054 
3055 /* Language Code ID - MS-LCID section 2.2 "LCID Structure":
3056  *
3057  *  https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/63d3d639-7fd2-4afb-abbe-0d5b5551eef8
3058  */
3059 static int parse_lcid(tvbuff_t *tvb, int offset, proto_tree *parent_tree, const char *text)
3060 {
3061 	proto_item *item;
3062 	proto_tree *tree;
3063 	guint32 lcid;
3064 
3065 	lcid = tvb_get_letohl(tvb, offset);
3066 	item = proto_tree_add_uint_format(parent_tree, hf_mswsp_lcid, tvb, offset, 4, lcid, "%s: 0x%x", text, lcid);
3067 	tree = proto_item_add_subtree(item, ett_LCID);
3068 
3069 	proto_tree_add_uint(tree, hf_mswsp_lcid_langid, tvb, offset + 2, 2, lcid);
3070 	proto_tree_add_uint(tree, hf_mswsp_lcid_sortid, tvb, offset + 1, 1, (lcid >> 16) & 0xF);
3071 	offset += 4;
3072 	return offset;
3073 }
3074 
3075 /*****************************************************************************************/
3076 /* 2.2.1.1 CBaseStorageVariant */
3077 static int parse_CBaseStorageVariant(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CBaseStorageVariant *value, const char *text);
3078 
3079 /* 2.2.1.2 CFullPropSpec */
3080 static int parse_CFullPropSpec(tvbuff_t *tvb, int offset, proto_tree *tree, proto_tree *pad_tree, struct CFullPropSpec *v, const char *fmt, ...);
3081 
3082 /* 2.2.1.3 CContentRestriction */
3083 static int parse_CContentRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CContentRestriction *v, const char *fmt, ...);
3084 
3085 /* 2.2.1.5 CNatLanguageRestriction */
3086 static int parse_CNatLanguageRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CNatLanguageRestriction *v, const char *fmt, ...);
3087 
3088 /* 2.2.1.6 CNodeRestriction */
3089 static int parse_CNodeRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *tree, proto_tree *pad_tree, struct CNodeRestriction *v, const char* fmt, ...);
3090 
3091 /* 2.2.1.7 CPropertyRestriction */
3092 static int parse_CPropertyRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CPropertyRestriction *v, const char *fmt, ...);
3093 
3094 /* 2.2.1.8 CReuseWhere */
3095 static int parse_CReuseWhere(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, struct CReuseWhere *v, const char *fmt, ...);
3096 
3097 /* 2.2.1.10 CSort */
3098 static int parse_CSort(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, const char *fmt, ...);
3099 
3100 /* 2.2.1.12 CCoercionRestriction */
3101 static int parse_CCoercionRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CCoercionRestriction *v, const char *fmt, ...);
3102 /* 2.2.1.16 CRestrictionArray */
3103 static int parse_CRestrictionArray(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3104 
3105 /* 2.2.1.17 CRestriction */
3106 static int parse_CRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CRestriction *v, const char *fmt, ...);
3107 
3108 /* 2.2.1.18 CColumnSet */
3109 static int parse_CColumnSet(tvbuff_t *tvb, int offset, proto_tree *tree, const char *fmt, ...);
3110 
3111 /* 2.2.1.20 CCategorizationSpec */
3112 static int parse_CCategorizationSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3113 
3114 /* 2.2.1.21 CCategSpec */
3115 static int parse_CCategSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3116 
3117 /* 2.2.1.22 CRangeCategSpec */
3118 static int parse_CRangeCategSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3119 
3120 /* 2.2.1.23 RANGEBOUNDARY */
3121 static int parse_RANGEBOUNDARY(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3122 
3123 /* 2.2.1.24 CAggregSet */
3124 static int parse_CAggregSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3125 
3126 /* 2.2.1.25 CAggregSpec */
3127 static int parse_CAggregSpec(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3128 
3129 /* 2.2.1.26 CSortAggregSet */
3130 static int parse_CSortAggregSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3131 
3132 /* 2.2.1.27 CAggregSortKey */
3133 static int parse_CAggregSortKey(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3134 
3135 /* 2.2.1.28 CInGroupSortAggregSets */
3136 static int parse_CInGroupSortAggregSets(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3137 
3138 /* 2.2.1.29 CInGroupSortAggregSet */
3139 static int parse_CInGroupSortAggregSet(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3140 
3141 /* 2.2.1.30 CDbColId */
3142 static int parse_CDbColId(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *text);
3143 
3144 /* 2.2.1.31 CDbProp */
3145 static int parse_CDbProp(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct GuidPropertySet *propset, const char *fmt, ...);
3146 
3147 /* 2.2.1.32 CDbPropSet */
3148 static int parse_CDbPropSet(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3149 
3150 /* 2.2.1.33 CPidMapper */
3151 static int parse_CPidMapper(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3152 
3153 /* 2.2.1.34 CColumnGroupArray */
3154 static int parse_CColumnGroupArray(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3155 
3156 /* 2.2.1.35 CColumnGroup */
3157 static int parse_CColumnGroup(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3158 
3159 /* 2.2.1.41 CRowsetProperties */
3160 static int parse_CRowsetProperties(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3161 
3162 /* 2.2.1.43 CSortSet */
3163 static int parse_CSortSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3164 
3165 /* 2.2.1.44 CTableColumn */
3166 static int parse_CTableColumn(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CTableColumn *col, const char *fmt, ...);
3167 
3168 
3169 /*
3170 2.2.1.4 CInternalPropertyRestriction
3171 2.2.1.9 CScopeRestriction
3172 2.2.1.11 CVectorRestriction
3173 2.2.1.13 CRelDocRestriction
3174 2.2.1.14 CProbRestriction
3175 2.2.1.15 CFeedbackRestriction
3176 2.2.1.19 CCategorizationSet
3177 2.2.1.45 SERIALIZEDPROPERTYVALUE
3178 2.2.1.46 CCompletionCategSp
3179 */
3180 
3181 static int parse_CSort(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, const char *fmt, ...)
3182 {
3183 	guint32 col, ord, ind;
3184 
3185 	proto_item *item;
3186 	proto_tree *tree;
3187 	const char *txt;
3188 	va_list ap;
3189 
3190 	va_start(ap, fmt);
3191 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3192 	va_end(ap);
3193 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CSort, &item, txt);
3194 
3195 	col = tvb_get_letohl(tvb, offset);
3196 	proto_tree_add_uint(tree, hf_mswsp_cscort_column, tvb, offset, 4, col);
3197 	offset += 4;
3198 
3199 	ord = tvb_get_letohl(tvb, offset);
3200 	proto_tree_add_uint(tree, hf_mswsp_cscort_order, tvb, offset, 4, ord);
3201 	offset += 4;
3202 
3203 	ind = tvb_get_letohl(tvb, offset);
3204 	proto_tree_add_uint(tree, hf_mswsp_cscort_individual, tvb, offset, 4, ind);
3205 	offset += 4;
3206 
3207 	offset = parse_lcid(tvb, offset, tree, "lcid");
3208 
3209 	proto_item_set_end(item, tvb, offset);
3210 	return offset;
3211 }
3212 
3213 static int parse_CSortSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
3214 {
3215 	guint32 count, i;
3216 
3217 	proto_item *item;
3218 	proto_tree *tree;
3219 	const char *txt;
3220 	va_list ap;
3221 
3222 	va_start(ap, fmt);
3223 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3224 	va_end(ap);
3225 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CSortSet, &item, txt);
3226 
3227 	count = tvb_get_letohl(tvb, offset);
3228 	proto_tree_add_uint(tree, hf_mswsp_cscortset_count, tvb, offset, 4, count);
3229 	offset += 4;
3230 
3231 	for (i=0; i<count; i++) {
3232 		offset = parse_padding(tvb, offset, 4, tree, "padding_sortArray[%u]", i);
3233 		offset = parse_CSort(tvb, offset, tree, pad_tree, "sortArray[%u]", i);
3234 	}
3235 
3236 	proto_item_set_end(item, tvb, offset);
3237 	return offset;
3238 }
3239 
3240 static int parse_CTableColumn(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CTableColumn *col, const char *fmt, ...)
3241 {
3242 
3243 
3244 	proto_item *item, *ti_type;
3245 	proto_tree *tree;
3246 	va_list ap;
3247 	struct vtype_data *type;
3248 	enum vType vtype_val = VT_EMPTY;
3249 	enum vType vtype_valhi = VT_EMPTY;
3250 	struct CFullPropSpec v;
3251 	const char *txt;
3252 	guint8 used;
3253 
3254 	const char *modifier = "";
3255 	va_start(ap, fmt);
3256 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3257 	va_end(ap);
3258 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CTableColumn, &item, txt);
3259 
3260 	offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &v, "PropSpec");
3261 	get_name_from_fullpropspec(&v, col->name, PROP_LENGTH);
3262 	col->vtype = tvb_get_letohl(tvb, offset);
3263 	vtype_val = (enum vType)col->vtype;
3264 	vtype_valhi = (enum vType)(col->vtype & 0xFF00);
3265 	if (vtype_valhi) {
3266 		if (vtype_valhi == VT_VECTOR) {
3267 			modifier = "|VT_VECTOR";
3268 		} else if (vtype_valhi == VT_ARRAY) {
3269 			modifier = "|VT_ARRAY";
3270 		} else {
3271 			modifier = "|(Unknown, possibly error)";
3272 		}
3273 	}
3274 	type = vType_get_type(vtype_val);
3275 	if (type == NULL) {
3276 		/*
3277 		 * Not a valid type.
3278 		 */
3279 		ti_type = proto_tree_add_string(tree, hf_mswsp_ctablecolumn_vtype, tvb, offset, 4, "Unknown CTableColumn type");
3280 		expert_add_info(pinfo, ti_type, &ei_mswsp_invalid_variant_type);
3281 	} else
3282 		proto_tree_add_string_format_value(tree, hf_mswsp_ctablecolumn_vtype, tvb, offset, 4, type->str, "%s%s", type->str, modifier);
3283 	offset += 4;
3284 
3285 	used = tvb_get_guint8(tvb, offset);
3286 	col->aggregateused = used;
3287 	proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_aggused, tvb, offset, 1, used);
3288 	offset += 1;
3289 
3290 	if (used) {
3291 		col->aggregatetype = tvb_get_guint8(tvb, offset);
3292 		proto_tree_add_string(tree, hf_mswsp_ctablecolumn_aggtype, tvb, offset, 1, val_to_str(col->aggregatetype, DBAGGTTYPE, "(Unknown: 0x%x)"));
3293 		offset += 1;
3294 	}
3295 	col->valueused = tvb_get_guint8(tvb, offset);
3296 	used = col->valueused;
3297 	proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_valused, tvb, offset, 1, used);
3298 	offset += 1;
3299 
3300 	if (used) {
3301 		offset = parse_padding(tvb, offset, 2, pad_tree, "padding_Value");
3302 
3303 		col->valueoffset = tvb_get_letohs(tvb, offset);
3304 		proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_valoffset, tvb, offset, 2,  col->valueoffset);
3305 		offset += 2;
3306 
3307 		col->valuesize = tvb_get_letohs(tvb, offset);
3308 		proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_valsize, tvb, offset, 2, col->valuesize);
3309 		offset += 2;
3310 	}
3311 
3312 	used = tvb_get_guint8(tvb, offset);
3313 	col->statusused = used;
3314 	proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_statused, tvb, offset, 1, used);
3315 	offset += 1;
3316 
3317 	if (used) {
3318 		offset = parse_padding(tvb, offset, 2, pad_tree, "padding_Status");
3319 
3320 		col->statusoffset = tvb_get_letohs(tvb, offset);
3321 		proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_statoffset, tvb, offset, 2, col->statusoffset);
3322 		offset += 2;
3323 	}
3324 
3325 	used = tvb_get_guint8(tvb, offset);
3326 	proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_lenused, tvb, offset, 1, used);
3327 	col->lengthused = used;
3328 	offset += 1;
3329 
3330 	if (used) {
3331 		offset = parse_padding(tvb, offset, 2, pad_tree, "padding_Length");
3332 
3333 		col->lengthoffset = tvb_get_letohs(tvb, offset);
3334 		proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_lenoffset, tvb, offset, 2, col->lengthoffset);
3335 		offset += 2;
3336 	}
3337 
3338 	proto_item_set_end(item, tvb, offset);
3339 	return offset;
3340 }
3341 
3342 static int parse_PRSPEC_Kind(tvbuff_t *tvb, int offset, proto_tree *tree, enum PRSPEC_Kind *prspec)
3343 {
3344 	static const value_string KIND[] = {
3345 		{0, "PRSPEC_LPWSTR"},
3346 		{1, "PRSPEC_PROPID"},
3347 		{0, NULL}
3348 	};
3349 
3350 	gint32 kind = tvb_get_letohl(tvb, offset);
3351 	DISSECTOR_ASSERT(kind < (PRSPEC_PROPID + 1));
3352 	if (kind) {
3353 		*prspec = PRSPEC_PROPID;
3354 	} else {
3355 		*prspec = PRSPEC_LPWSTR;
3356 	}
3357 	proto_tree_add_string(tree, hf_mswsp_cfullpropspec_kind, tvb, offset, 4, val_to_str(*prspec, KIND, "(Unknown: 0x%x)"));
3358 	offset += 4;
3359 	return offset;
3360 }
3361 
3362 static int parse_CFullPropSpec(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CFullPropSpec *v, const char *fmt, ...)
3363 {
3364 	struct GuidPropertySet *pset;
3365 	const char *id_str, *guid_str, *txt;
3366 
3367 	proto_item *item;
3368 	proto_tree *tree;
3369 	va_list ap;
3370 
3371 	va_start(ap, fmt);
3372 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3373 	va_end(ap);
3374 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CFullPropSpec, &item, txt);
3375 
3376 	offset = parse_padding(tvb, offset, 8, pad_tree, "paddingPropSet");
3377 
3378 	offset = parse_guid(tvb, offset, tree, &v->guid, "GUID");
3379 	pset = GuidPropertySet_find_guid(&v->guid);
3380 
3381 	offset = parse_PRSPEC_Kind(tvb, offset, tree, &v->kind);
3382 
3383 	v->u.propid = tvb_get_letohl(tvb, offset);
3384 	proto_tree_add_uint(tree, hf_mswsp_cfullpropspec_propid, tvb, offset, 4, v->u.propid);
3385 	offset += 4;
3386 
3387 	if (v->kind == PRSPEC_LPWSTR) {
3388 		int len = 2*v->u.propid;
3389 		proto_tree_add_item_ret_string(tree, hf_mswsp_cfullpropspec_propname, tvb, offset, len, ENC_LITTLE_ENDIAN | ENC_UCS_2, wmem_packet_scope(), &v->u.name);
3390 		offset += len;
3391 	}
3392 
3393 	id_str = pset ? try_val_to_str(v->u.propid, pset->id_map) : NULL;
3394 
3395 	if (id_str) {
3396 		proto_item_append_text(item, ": %s", id_str);
3397 	} else {
3398 		guid_str = guids_get_guid_name(&v->guid, wmem_packet_scope());
3399 		if (guid_str) {
3400 			proto_item_append_text(item, ": \"%s\"", guid_str);
3401 		} else {
3402 			guid_str = guid_to_str(wmem_packet_scope(), &v->guid);
3403 			proto_item_append_text(item, ": {%s}", guid_str);
3404 		}
3405 
3406 		if (v->kind == PRSPEC_LPWSTR) {
3407 			proto_item_append_text(item, " \"%s\"", v->u.name);
3408 		} else if (v->kind == PRSPEC_PROPID) {
3409 			proto_item_append_text(item, " 0x%08x", v->u.propid);
3410 		} else {
3411 			proto_item_append_text(item, " <INVALID>");
3412 		}
3413 	}
3414 
3415 	proto_item_set_end(item, tvb, offset);
3416 	return offset;
3417 }
3418 
3419 
3420 
3421 static const value_string PR_VALS[] = {
3422 	{PRLT, "PRLT"},
3423 	{PRLE, "PRLE"},
3424 	{PRGT, "PRGT"},
3425 	{PRGE, "PRGE"},
3426 	{PREQ, "PREQ"},
3427 	{PRNE, "PRNE"},
3428 	{PRRE, "PRRE"},
3429 	{PRAllBits, "PRAllBits"},
3430 	{PRSomeBits, "PRSomeBits"},
3431 	{PRAll, "PRAll"},
3432 	{PRAny, "PRAny"},
3433 	{0, NULL}
3434 };
3435 
3436 static int parse_relop(tvbuff_t *tvb, int offset,  proto_tree *tree, guint32 *relop, const char **str)
3437 {
3438 	const char *str1 = NULL, *str2 = NULL;
3439 	guint32 tmp = tvb_get_letohl(tvb, offset);
3440 	guint32 modifier = (tmp & 0xF00);
3441 	DISSECTOR_ASSERT((tmp & 0xf) < PRSomeBits +1);
3442 
3443 	switch(tmp & 0xf) {
3444 		case PRLT:
3445 			*relop = PRLT;
3446 			break;
3447 		case PRLE:
3448 			*relop = PRLE;
3449 			break;
3450 		case PRGT:
3451 			*relop = PRGT;
3452 			break;
3453 		case PRGE:
3454 			*relop = PRGE;
3455 			break;
3456 		case PREQ:
3457 			*relop = PREQ;
3458 			break;
3459 		case PRNE:
3460 			*relop = PRNE;
3461 			break;
3462 		case PRRE:
3463 			*relop = PRRE;
3464 			break;
3465 		case PRAllBits:
3466 			*relop = PRAllBits;
3467 			break;
3468 		case PRSomeBits:
3469 			*relop = PRSomeBits;
3470 			break;
3471 		default:
3472 			break;
3473 	}
3474 
3475 	str2 = val_to_str(*relop, PR_VALS, "0x%04x");
3476 
3477 	if (modifier) {
3478 		switch (modifier) {
3479 			case PRAll:
3480 				*relop = *relop | PRAll;
3481 				break;
3482 			case PRAny:
3483 				*relop |= PRAny;
3484 				break;
3485 			default:
3486 				DISSECTOR_ASSERT(FALSE);
3487 				break;
3488 		}
3489 		str1 = try_val_to_str((modifier), PR_VALS);
3490 		if (str1) {
3491 			str1 = wmem_strdup_printf(wmem_packet_scope(), "%s | ", str1);
3492 			str2 = wmem_strdup_printf(wmem_packet_scope(), "%s%s", str1, str2);
3493 		}
3494 	}
3495 	proto_tree_add_string_format_value(tree, hf_mswsp_cproprestrict_relop, tvb, offset, 4, str2, "%s (0x%04x)", str2[0]=='\0' ? "" : str2, *relop);
3496 
3497 	if (str) {
3498 		*str = str2;
3499 	}
3500 	return offset + 4;
3501 }
3502 static int parse_CPropertyRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CPropertyRestriction *v, const char *fmt, ...)
3503 {
3504 	proto_tree *tree;
3505 	proto_item *item;
3506 	const char *txt, *str = NULL;
3507 	va_list ap;
3508 
3509 	va_start(ap, fmt);
3510 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3511 	va_end(ap);
3512 
3513 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CPropertyRestriction, &item, txt);
3514 
3515 	offset = parse_relop(tvb, offset, tree, &v->relop, &str);
3516 	proto_item_append_text(item, " Op: %s", str);
3517 
3518 	offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &v->property, "Property");
3519 
3520 	offset = parse_CBaseStorageVariant(tvb, pinfo, offset, tree, pad_tree, &v->prval, "prval");
3521 
3522 	offset = parse_padding(tvb, offset, 4, pad_tree, "padding_lcid");
3523 
3524 	v->lcid = tvb_get_letohl(tvb, offset);
3525 	offset = parse_lcid(tvb, offset, tree, "lcid");
3526 
3527 	proto_item_set_end(item, tvb, offset);
3528 
3529 	return offset;
3530 }
3531 
3532 static int parse_CCoercionRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CCoercionRestriction *v, const char *fmt, ...)
3533 {
3534 	proto_tree *tree;
3535 	proto_item *item;
3536 	const char *txt;
3537 	va_list ap;
3538 
3539 	va_start(ap, fmt);
3540 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3541 	va_end(ap);
3542 
3543 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CCoercionRestriction, &item, txt);
3544 
3545 	v->value = tvb_get_letohieee_float(tvb, offset);
3546 	proto_tree_add_float(tree, hf_mswsp_ccoercerestrict_value, tvb, offset, 4, v->value);
3547 
3548 	offset += 4;
3549 
3550 	offset = parse_CRestriction(tvb, pinfo, offset, tree, pad_tree, &v->child, "child");
3551 
3552 	proto_item_set_end(item, tvb, offset);
3553 	return offset;
3554 }
3555 
3556 static int parse_CContentRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CContentRestriction *v, const char *fmt, ...)
3557 {
3558 	proto_tree *tree;
3559 	proto_item *item;
3560 	va_list ap;
3561 	guint32 cc;
3562 	const char *txt;
3563 
3564 
3565 	va_start(ap, fmt);
3566 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3567 	va_end(ap);
3568 
3569 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CContentRestriction, &item, txt);
3570 
3571 	offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &v->property, "Property");
3572 
3573 	offset = parse_padding(tvb, offset, 4, pad_tree, "Padding1");
3574 
3575 	cc = tvb_get_letohl(tvb, offset);
3576 	proto_tree_add_uint(tree, hf_mswsp_ccontentrestrict_cc, tvb, offset, 4, cc);
3577 	offset += 4;
3578 
3579 	proto_tree_add_item_ret_string(tree, hf_mswsp_ccontentrestrict_phrase, tvb, offset, 2*cc, ENC_LITTLE_ENDIAN | ENC_UCS_2, wmem_packet_scope(), &v->phrase);
3580 	offset += 2*cc;
3581 
3582 	offset = parse_padding(tvb, offset, 4, pad_tree, "Padding2");
3583 
3584 	v->lcid = tvb_get_letohl(tvb, offset);
3585 	offset = parse_lcid(tvb, offset, tree, "lcid");
3586 
3587 	v->method = tvb_get_letohl(tvb, offset);
3588 	proto_tree_add_uint(tree, hf_mswsp_ccontentrestrict_method, tvb, offset, 4, v->method);
3589 	offset += 4;
3590 
3591 	proto_item_set_end(item, tvb, offset);
3592 	return offset;
3593 }
3594 
3595 int parse_CNatLanguageRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CNatLanguageRestriction *v, const char *fmt, ...)
3596 {
3597 	proto_tree *tree;
3598 	proto_item *item;
3599 	va_list ap;
3600 	guint32 cc;
3601 	const char *txt;
3602 
3603 
3604 	va_start(ap, fmt);
3605 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3606 	va_end(ap);
3607 
3608 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CNatLanguageRestriction, &item, txt);
3609 
3610 	offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &v->property, "Property");
3611 
3612 	offset = parse_padding(tvb, offset, 4, pad_tree, "padding_cc");
3613 
3614 	cc = tvb_get_letohl(tvb, offset);
3615 	proto_tree_add_uint(tree, hf_mswsp_natlangrestrict_cc, tvb, offset, 4, cc);
3616 	offset += 4;
3617 
3618 	proto_tree_add_item_ret_string(tree, hf_mswsp_natlangrestrict_phrase, tvb, offset, 2*cc, ENC_LITTLE_ENDIAN | ENC_UCS_2, wmem_packet_scope(), &v->phrase);
3619 	offset += 2*cc;
3620 
3621 	offset = parse_padding(tvb, offset, 4, pad_tree, "padding_lcid");
3622 
3623 	v->lcid = tvb_get_letohl(tvb, offset);
3624 	offset = parse_lcid(tvb, offset, tree, "lcid");
3625 
3626 	proto_item_set_end(item, tvb, offset);
3627 	return offset;
3628 }
3629 
3630 
3631 static int parse_CReuseWhere(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, struct CReuseWhere *v, const char *fmt, ...)
3632 {
3633 	proto_item *item;
3634 	va_list ap;
3635 	const char *txt;
3636 
3637 	va_start(ap, fmt);
3638 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3639 	va_end(ap);
3640 
3641 	proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_mswsp_msg_creusewhere, &item, txt);
3642 	v->whereId = tvb_get_letohl(tvb, offset);
3643 	offset += 4;
3644 
3645 	proto_item_append_text(item, " Id: %u", v->whereId);
3646 
3647 	proto_item_set_end(item, tvb, offset);
3648 	return offset;
3649 }
3650 
3651 static const value_string RT_VALS[] =  {
3652 	{RTNone, "RTNone"},
3653 	{RTAnd, "RTAnd"},
3654 	{RTOr, "RTOr"},
3655 	{RTNot, "RTNot"},
3656 	{RTContent, "RTContent"},
3657 	{RTProperty, "RTProperty"},
3658 	{RTProximity, "RTProximity"},
3659 	{RTVector, ""},
3660 	{RTNatLanguage, "RTNatLanguage"},
3661 	{RTScope, "RTScope"},
3662 	{RTCoerce_Add, "RTCoerce_Add"},
3663 	{RTCoerce_Multiply, "RTCoerce_Multiply"},
3664 	{RTCoerce_Absolute, "RTCoerce_Absolute"},
3665 	{RTProb, "RTProb"},
3666 	{RTFeedback, "RTFeedback"},
3667 	{RTReldoc, "RTReldoc"},
3668 	{RTReuseWhere, "RTReuseWhere"},
3669 	{RTInternalProp, "RTInternalProp"},
3670 	{RTPhrase, "RTInternalProp"},
3671 	{0, NULL}
3672 };
3673 
3674 #define EP_ALLOC(T) wmem_new(wmem_packet_scope(), T)
3675 
3676 static int parse_rType(tvbuff_t *tvb, int offset, proto_tree *tree, enum rType *rtype, const char **str)
3677 {
3678 	const char *txt = NULL;
3679 	guint32 type = tvb_get_letohl(tvb, offset);
3680 	switch(type) {
3681 		case RTNone:
3682 			*rtype = RTNone;
3683 			break;
3684 		case RTAnd:
3685 			*rtype = RTAnd;
3686 			break;
3687 		case RTOr:
3688 			*rtype = RTOr;
3689 			break;
3690 		case RTNot:
3691 			*rtype = RTNot;
3692 			break;
3693 		case RTContent:
3694 			*rtype = RTContent;
3695 			break;
3696 		case RTProperty:
3697 			*rtype = RTProperty;
3698 			break;
3699 		case RTProximity:
3700 			*rtype = RTProximity;
3701 			break;
3702 		case RTVector:
3703 			*rtype = RTVector;
3704 			break;
3705 		case RTNatLanguage:
3706 			*rtype = RTNatLanguage;
3707 			break;
3708 		case RTScope:
3709 			*rtype = RTScope;
3710 			break;
3711 		case RTCoerce_Add:
3712 			*rtype = RTCoerce_Add;
3713 			break;
3714 		case RTCoerce_Multiply:
3715 			*rtype = RTCoerce_Multiply;
3716 			break;
3717 		case RTCoerce_Absolute:
3718 			*rtype = RTCoerce_Absolute;
3719 			break;
3720 		case RTProb:
3721 			*rtype = RTProb;
3722 			break;
3723 		case RTFeedback:
3724 			*rtype = RTFeedback;
3725 			break;
3726 		case RTReldoc:
3727 			*rtype = RTReldoc;
3728 			break;
3729 		case RTReuseWhere:
3730 			*rtype = RTReuseWhere;
3731 			break;
3732 		case RTInternalProp:
3733 			*rtype = RTInternalProp;
3734 			break;
3735 		default:
3736 			DISSECTOR_ASSERT(FALSE);
3737 			break;
3738 	}
3739 	txt = val_to_str(*rtype, RT_VALS, "0x%.8x");
3740 	proto_tree_add_string_format_value(tree, hf_mswsp_crestrict_ultype, tvb, offset, 4, txt, "%s (0x%.8x)",  txt[0] == '0' ? "" : txt, *rtype);
3741 	if (str) {
3742 		*str = txt;
3743 	}
3744 	return offset + 4;
3745 }
3746 
3747 static int parse_CRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CRestriction *v, const char *fmt, ...)
3748 {
3749 	proto_tree *tree;
3750 	proto_item *item;
3751 	const char *str, *txt;
3752 	va_list ap;
3753 
3754 	va_start(ap, fmt);
3755 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3756 	va_end(ap);
3757 
3758 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRestriction, &item, txt);
3759 
3760 
3761 	offset = parse_rType(tvb, offset, tree, &v->ulType, &str);
3762 	proto_item_append_text(item, " Type: %s", str);
3763 
3764 	v->Weight = tvb_get_letohl(tvb, offset);
3765 	proto_tree_add_uint(tree, hf_mswsp_crestrict_weight, tvb, offset, 4, v->Weight);
3766 	offset += 4;
3767 
3768 	switch(v->ulType) {
3769 	case RTNone:
3770 		break;
3771 	case RTAnd:
3772 	case RTOr:
3773 	case RTProximity:
3774 	case RTPhrase: {
3775 		v->u.RTAnd = EP_ALLOC(struct CNodeRestriction);
3776 		offset = parse_CNodeRestriction(tvb, pinfo, offset, tree, pad_tree, v->u.RTAnd, "CNodeRestriction");
3777 		break;
3778 	}
3779 	case RTNot: {
3780 		v->u.RTNot = EP_ALLOC(struct CRestriction);
3781 		offset = parse_CRestriction(tvb, pinfo, offset, tree, pad_tree,
3782 									v->u.RTNot, "CRestriction");
3783 		break;
3784 	}
3785 	case RTProperty: {
3786 		v->u.RTProperty = EP_ALLOC(struct CPropertyRestriction);
3787 		offset = parse_CPropertyRestriction(tvb, pinfo, offset, tree, pad_tree,
3788 											v->u.RTProperty, "CPropertyRestriction");
3789 		break;
3790 	}
3791 	case RTCoerce_Add:
3792 	case RTCoerce_Multiply:
3793 	case RTCoerce_Absolute: {
3794 		v->u.RTCoerce_Add = EP_ALLOC(struct CCoercionRestriction);
3795 		offset = parse_CCoercionRestriction(tvb, pinfo, offset, tree, pad_tree,
3796 											v->u.RTCoerce_Add, "CCoercionRestriction");
3797 		break;
3798 	}
3799 	case RTContent: {
3800 		v->u.RTContent = EP_ALLOC(struct CContentRestriction);
3801 		offset = parse_CContentRestriction(tvb, offset, tree, pad_tree,
3802 										   v->u.RTContent, "CContentRestriction");
3803 		break;
3804 	}
3805 	case RTReuseWhere: {
3806 		v->u.RTReuseWhere = EP_ALLOC(struct CReuseWhere);
3807 		offset = parse_CReuseWhere(tvb, offset, tree, pad_tree,
3808 								   v->u.RTReuseWhere, "CReuseWhere");
3809 		break;
3810 	}
3811 	case RTNatLanguage: {
3812 		v->u.RTNatLanguage = EP_ALLOC(struct CNatLanguageRestriction);
3813 		offset = parse_CNatLanguageRestriction(tvb, offset, tree, pad_tree,
3814 											   v->u.RTNatLanguage, "CNatLanguageRestriction");
3815 		break;
3816 	}
3817 	default:
3818 		proto_item_append_text(item, " Not supported!");
3819 	}
3820 
3821 	proto_item_set_end(item, tvb, offset);
3822 	return offset;
3823 }
3824 
3825 static int parse_CRestrictionArray(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
3826 {
3827 	guint8 present, count;
3828 
3829 	proto_tree *tree;
3830 	proto_item *item;
3831 	const char *txt;
3832 	va_list ap;
3833 
3834 	va_start(ap, fmt);
3835 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3836 	va_end(ap);
3837 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRestrictionArray, &item, txt);
3838 
3839 	pad_tree = tree;
3840 
3841 	count = tvb_get_guint8(tvb, offset);
3842 	proto_tree_add_uint(tree, hf_mswsp_crestrictarray_count, tvb, offset, 1, count);
3843 	offset += 1;
3844 
3845 	present = tvb_get_guint8(tvb, offset);
3846 	proto_tree_add_uint(tree, hf_mswsp_crestrictarray_present, tvb, offset, 1, present);
3847 	offset += 1;
3848 
3849 	if (present) {
3850 		unsigned i;
3851 		offset = parse_padding(tvb, offset, 4, pad_tree, "paddingCRestrictionPresent");
3852 
3853 		for (i=0; i<count; i++) {
3854 			struct CRestriction r;
3855 			offset = parse_CRestriction(tvb, pinfo, offset, tree, pad_tree, &r, "Restriction[%d]", i);
3856 		}
3857 	}
3858 	proto_item_set_end(item, tvb, offset);
3859 	return offset;
3860 }
3861 
3862 static int parse_CNodeRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CNodeRestriction *v, const char *fmt, ...)
3863 {
3864 	proto_tree *tree;
3865 	proto_item *item;
3866 	unsigned i;
3867 	const char *txt;
3868 	va_list ap;
3869 
3870 	va_start(ap, fmt);
3871 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3872 	va_end(ap);
3873 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CNodeRestriction, &item, txt);
3874 
3875 	v->cNode = tvb_get_letohl(tvb, offset);
3876 	proto_tree_add_uint(tree, hf_mswsp_cnoderestrict_cnode, tvb, offset, 4, v->cNode);
3877 	offset += 4;
3878 
3879 	for (i=0; i<v->cNode; i++) {
3880 		struct CRestriction r;
3881 		ZERO_STRUCT(r);
3882 		offset = parse_CRestriction(tvb, pinfo, offset, tree, pad_tree, &r, "paNode[%u]", i);
3883 		offset = parse_padding(tvb, offset, 4, tree, "padding_paNode[%u]", i); /*at begin or end of loop ????*/
3884 
3885 	}
3886 
3887 	proto_item_set_end(item, tvb, offset);
3888 	return offset;
3889 }
3890 
3891 
3892 /*****************************************************************************************/
3893 
3894 static int vvalue_tvb_get0(tvbuff_t *tvb _U_, int offset _U_, void *val _U_)
3895 {
3896 	return 0;
3897 }
3898 
3899 static int vvalue_tvb_get1(tvbuff_t *tvb, int offset, void *val)
3900 {
3901 	guint8 *ui1 = (guint8*)val;
3902 	*ui1 = tvb_get_guint8(tvb, offset);
3903 	return 1;
3904 }
3905 
3906 static int vvalue_tvb_get2(tvbuff_t *tvb, int offset, void *val)
3907 {
3908 	guint16 *ui2 = (guint16*)val;
3909 	*ui2 = tvb_get_letohs(tvb, offset);
3910 	return 2;
3911 }
3912 
3913 static int vvalue_tvb_get4(tvbuff_t *tvb, int offset, void *val)
3914 {
3915 	guint32 *ui4 = (guint32*)val;
3916 	*ui4 = tvb_get_letohl(tvb, offset);
3917 	return 4;
3918 }
3919 
3920 static int vvalue_tvb_get8(tvbuff_t *tvb, int offset, void *val)
3921 {
3922 	guint64 *ui8 = (guint64*)val;
3923 	*ui8 = tvb_get_letoh64(tvb, offset);
3924 	return 8;
3925 }
3926 
3927 static int vvalue_tvb_blob(tvbuff_t *tvb, int offset, void *val)
3928 {
3929 	struct data_blob *blob = (struct data_blob*)val;
3930 	guint32 len = tvb_get_letohl(tvb, offset);
3931 
3932 	blob->size = len;
3933 	blob->data = (guint8*)tvb_memdup(wmem_packet_scope(), tvb, offset + 4, len);
3934 
3935 	return 4 + len;
3936 }
3937 
3938 static int vvalue_tvb_lpstr(tvbuff_t *tvb, int offset, void *val)
3939 {
3940 	struct data_str *str = (struct data_str*)val;
3941 	gint len;
3942 
3943 	str->len = tvb_get_letohl(tvb, offset);
3944 	str->str = tvb_get_stringz_enc(wmem_packet_scope(), tvb, offset + 4, &len,
3945 								   ENC_ASCII|ENC_LITTLE_ENDIAN);
3946 	/* XXX test str->len == len */
3947 	return 4 + len;
3948 }
3949 
3950 static int vvalue_tvb_lpwstr_len(tvbuff_t *tvb, int offset, int length, void *val)
3951 {
3952 	struct data_str *str = (struct data_str*)val;
3953 	const gchar *ptr;
3954 	int len;
3955 
3956 	if (length == 0) {
3957 		/* we don't know the length */
3958 		ptr = tvb_get_stringz_enc(wmem_packet_scope(), tvb, offset, &len,
3959 								  ENC_UTF_16|ENC_LITTLE_ENDIAN);
3960 	} else {
3961 		ptr =  tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length,
3962 								  ENC_UTF_16|ENC_LITTLE_ENDIAN);
3963 		len = length;
3964 	}
3965 	str->str = ptr;
3966 	return len;
3967 }
3968 
3969 static int vvalue_tvb_lpwstr(tvbuff_t *tvb, int offset, void *val)
3970 {
3971 	struct data_str *str = (struct data_str*)val;
3972 
3973 	str->len = tvb_get_letohl(tvb, offset);
3974 
3975 	return 4 + vvalue_tvb_lpwstr_len(tvb, offset + 4, 0, val);
3976 }
3977 
3978 /* Maximum sane vector size. Arbitrary. */
3979 #define MAX_VT_VECTOR_SIZE 5000
3980 static int vvalue_tvb_vector_internal(tvbuff_t *tvb, int offset, struct vt_vector *val, struct vtype_data *type, guint num)
3981 {
3982 	const int offset_in = offset;
3983 	const gboolean varsize = (type->size == -1);
3984 	const guint elsize = varsize ? (guint)sizeof(struct data_blob) : (guint)type->size;
3985 	guint8 *data;
3986 	int len;
3987 	guint i;
3988 
3989 	/*
3990 	 * Make sure we actually *have* the data we're going to fetch
3991 	 * here, before making a possibly-doomed attempt to allocate
3992 	 * memory for it.
3993 	 *
3994 	 * First, check for sane values.
3995 	 */
3996 	if (num > MAX_VT_VECTOR_SIZE) {
3997 		THROW(ReportedBoundsError);
3998 	}
3999 
4000 	/*
4001 	 * No huge numbers from the wire; now make sure we at least have that data.
4002 	 */
4003 	tvb_ensure_bytes_exist(tvb, offset, elsize * num);
4004 
4005 	/*
4006 	 * OK, it exists; allocate a buffer into which to fetch it.
4007 	 */
4008 	data = (guint8*)wmem_alloc(wmem_packet_scope(), elsize * num);
4009 
4010 	val->len = num;
4011 	val->u.vt_ui1 = data;
4012 	DISSECTOR_ASSERT((void*)&val->u == ((void*)&val->u.vt_ui1));
4013 
4014 	for (i=0; i<num; i++) {
4015 		DISSECTOR_ASSERT_HINT(type->tvb_get != 0,
4016 				      "type that we don't know yet how to handle, please submit a bug with trace");
4017 		len = type->tvb_get(tvb, offset, data);
4018 		data += elsize;
4019 		offset += len;
4020 		if (varsize && (offset % 4) ) { /* at begin or end of loop ??? */
4021 			int padding = 4 - (offset % 4);
4022 			offset += padding;
4023 		}
4024 	}
4025 	return offset - offset_in;
4026 }
4027 
4028 static int vvalue_tvb_vector(tvbuff_t *tvb, int offset, struct vt_vector *val, struct vtype_data *type)
4029 {
4030 	const guint num = tvb_get_letohl(tvb, offset);
4031 	return 4 + vvalue_tvb_vector_internal(tvb, offset+4, val, type, num);
4032 }
4033 
4034 static void vvalue_strbuf_append_null(wmem_strbuf_t *strbuf _U_, void *ptr _U_)
4035 {}
4036 
4037 static void vvalue_strbuf_append_i1(wmem_strbuf_t *strbuf, void *ptr)
4038 {
4039 	gint8 i1 = *(gint8*)ptr;
4040 	wmem_strbuf_append_printf(strbuf, "%d", (int)i1);
4041 }
4042 
4043 static void vvalue_strbuf_append_i2(wmem_strbuf_t *strbuf, void *ptr)
4044 {
4045 	gint16 i2 = *(gint16*)ptr;
4046 	wmem_strbuf_append_printf(strbuf, "%d", (int)i2);
4047 }
4048 
4049 static void vvalue_strbuf_append_i4(wmem_strbuf_t *strbuf, void *ptr)
4050 {
4051 	gint32 i4 = *(gint32*)ptr;
4052 	wmem_strbuf_append_printf(strbuf, "%d", i4);
4053 }
4054 
4055 static void vvalue_strbuf_append_i8(wmem_strbuf_t *strbuf, void *ptr)
4056 {
4057 	gint64 i8 = *(gint64*)ptr;
4058 	wmem_strbuf_append_printf(strbuf, "%" G_GINT64_MODIFIER "d", i8);
4059 }
4060 
4061 static void vvalue_strbuf_append_ui1(wmem_strbuf_t *strbuf, void *ptr)
4062 {
4063 	guint8 ui1 = *(guint8*)ptr;
4064 	wmem_strbuf_append_printf(strbuf, "%u", (unsigned)ui1);
4065 }
4066 
4067 static void vvalue_strbuf_append_ui2(wmem_strbuf_t *strbuf, void *ptr)
4068 {
4069 	guint16 ui2 = *(guint16*)ptr;
4070 	wmem_strbuf_append_printf(strbuf, "%u", (unsigned)ui2);
4071 }
4072 
4073 static void vvalue_strbuf_append_ui4(wmem_strbuf_t *strbuf, void *ptr)
4074 {
4075 	guint32 ui4 = *(guint32*)ptr;
4076 	wmem_strbuf_append_printf(strbuf, "%d", ui4);
4077 }
4078 
4079 static void vvalue_strbuf_append_ui8(wmem_strbuf_t *strbuf, void *ptr)
4080 {
4081 	guint64 ui8 = *(guint64*)ptr;
4082 	wmem_strbuf_append_printf(strbuf, "%" G_GINT64_MODIFIER "u", ui8);
4083 }
4084 
4085 static void vvalue_strbuf_append_r4(wmem_strbuf_t *strbuf, void *ptr)
4086 {
4087 	float r4 = *(float*)ptr;
4088 	wmem_strbuf_append_printf(strbuf, "%g", (double)r4);
4089 }
4090 
4091 static void vvalue_strbuf_append_r8(wmem_strbuf_t *strbuf, void *ptr)
4092 {
4093 	double r8 = *(double*)ptr;
4094 	wmem_strbuf_append_printf(strbuf, "%g", r8);
4095 }
4096 
4097 static void vvalue_strbuf_append_str(wmem_strbuf_t *strbuf, void *ptr)
4098 {
4099 	struct data_str *str = (struct data_str*)ptr;
4100 	wmem_strbuf_append_printf(strbuf, "\"%s\"", str->str);
4101 }
4102 
4103 static void vvalue_strbuf_append_blob(wmem_strbuf_t *strbuf, void *ptr)
4104 {
4105 	struct data_blob *blob = (struct data_blob*)ptr;
4106 	wmem_strbuf_append_printf(strbuf, "size: %d", (int)blob->size);
4107 }
4108 
4109 static void vvalue_strbuf_append_bool(wmem_strbuf_t *strbuf, void *ptr)
4110 {
4111 	guint16 val = *(guint*)ptr;
4112 	switch (val) {
4113 	case 0:
4114 		wmem_strbuf_append(strbuf, "False");
4115 		break;
4116 	case 0xffff:
4117 		wmem_strbuf_append(strbuf, "True");
4118 		break;
4119 	default:
4120 		wmem_strbuf_append_printf(strbuf, "Invalid (0x%4x)", val);
4121 	}
4122 }
4123 
4124 static void vvalue_strbuf_append_vector(wmem_strbuf_t *strbuf, struct vt_vector val, struct vtype_data *type)
4125 {
4126 	const int elsize = (type->size == -1) ? (int)sizeof(struct data_blob) : type->size;
4127 	unsigned i;
4128 	guint8 *data = val.u.vt_ui1;
4129 	wmem_strbuf_append_c(strbuf, '[');
4130 	for (i=0; i<val.len; i++) {
4131 		if (i>0) {
4132 			wmem_strbuf_append_c(strbuf, ',');
4133 		}
4134 		type->strbuf_append(strbuf, data);
4135 		data += elsize;
4136 	}
4137 	wmem_strbuf_append_c(strbuf, ']');
4138 }
4139 
4140 static struct vtype_data VT_TYPE[] = {
4141 	{VT_EMPTY,             "VT_EMPTY",              0, vvalue_tvb_get0, NULL, vvalue_strbuf_append_null},
4142 	{VT_NULL,              "VT_NULL",               0, vvalue_tvb_get0, NULL, vvalue_strbuf_append_null},
4143 	{VT_I2,                "VT_I2",                 2, vvalue_tvb_get2, NULL, vvalue_strbuf_append_i2},
4144 	{VT_I4,                "VT_I4",                 4, vvalue_tvb_get4, NULL, vvalue_strbuf_append_i4},
4145 	{VT_R4,                "VT_R4",                 4, vvalue_tvb_get4, NULL, vvalue_strbuf_append_r4},
4146 	{VT_R8,                "VT_R8",                 8, vvalue_tvb_get8, NULL, vvalue_strbuf_append_r8},
4147 	{VT_CY,                "VT_CY",                 8, vvalue_tvb_get8, NULL, vvalue_strbuf_append_i8},
4148 	{VT_DATE,              "VT_DATE",               8, vvalue_tvb_get8, NULL, vvalue_strbuf_append_r8},
4149 	{VT_BSTR,              "VT_BSTR",              -1, vvalue_tvb_lpwstr, vvalue_tvb_lpwstr_len, vvalue_strbuf_append_str},
4150 	{VT_ERROR,             "VT_ERROR",              4, vvalue_tvb_get4, NULL, vvalue_strbuf_append_ui4},
4151 	{VT_BOOL,              "VT_BOOL",               2, vvalue_tvb_get2, NULL, vvalue_strbuf_append_bool},
4152 	{VT_VARIANT,           "VT_VARIANT",           -1, NULL, NULL, NULL},
4153 	{VT_DECIMAL,           "VT_DECIMAL",           16, NULL, NULL, NULL},
4154 	{VT_I1,                "VT_I1",                 1, vvalue_tvb_get1, NULL, vvalue_strbuf_append_i1},
4155 	{VT_UI1,               "VT_UI1",                1, vvalue_tvb_get1, NULL, vvalue_strbuf_append_ui1},
4156 	{VT_UI2,               "VT_UI2",                2, vvalue_tvb_get2, NULL, vvalue_strbuf_append_ui2},
4157 	{VT_UI4,               "VT_UI4",                4, vvalue_tvb_get4, NULL, vvalue_strbuf_append_ui4},
4158 	{VT_I8,                "VT_I8",                 8, vvalue_tvb_get8, NULL, vvalue_strbuf_append_i8},
4159 	{VT_UI8,               "VT_UI8",                8, vvalue_tvb_get8, NULL, vvalue_strbuf_append_ui8},
4160 	{VT_INT,               "VT_INT",                4, vvalue_tvb_get4, NULL, vvalue_strbuf_append_i4},
4161 	{VT_UINT,              "VT_UINT",               4, vvalue_tvb_get4, NULL, vvalue_strbuf_append_ui4},
4162 	{VT_LPSTR,             "VT_LPSTR",             -1, vvalue_tvb_lpstr, NULL, vvalue_strbuf_append_str},
4163 	{VT_LPWSTR,            "VT_LPWSTR",            -1, vvalue_tvb_lpwstr, vvalue_tvb_lpwstr_len, vvalue_strbuf_append_str},
4164 	{VT_COMPRESSED_LPWSTR, "VT_COMPRESSED_LPWSTR", -1, NULL, NULL, vvalue_strbuf_append_str},
4165 	{VT_FILETIME,          "VT_FILETIME",           8, vvalue_tvb_get8, NULL, vvalue_strbuf_append_i8},
4166 	{VT_BLOB,              "VT_BLOB",              -1, vvalue_tvb_blob, NULL, vvalue_strbuf_append_blob},
4167 	{VT_BLOB_OBJECT,       "VT_BLOB_OBJECT",       -1, vvalue_tvb_blob, NULL, vvalue_strbuf_append_blob},
4168 	{VT_CLSID,             "VT_CLSID",             16, NULL, NULL, NULL}
4169 };
4170 
4171 static struct vtype_data *vType_get_type(guint16 t)
4172 {
4173 	unsigned i;
4174 	t = (t & 0xFF);
4175 	for (i=0; i<array_length(VT_TYPE); i++) {
4176 		if (t == VT_TYPE[i].tag) {
4177 			return &VT_TYPE[i];
4178 		}
4179 	}
4180 	return NULL;
4181 }
4182 
4183 static const char *str_CBaseStorageVariant(struct CBaseStorageVariant *value, gboolean print_type)
4184 {
4185 
4186 	wmem_strbuf_t *strbuf = wmem_strbuf_new(wmem_packet_scope(), "");
4187 	if (value == NULL) {
4188 		return "<NULL>";
4189 	}
4190 
4191 	if (value->type == NULL) {
4192 		return "<??""?>";
4193 	}
4194 
4195 	if (print_type) {
4196 		wmem_strbuf_append(strbuf, value->type->str);
4197 
4198 		if (value->vType & 0xFF00) {
4199 			wmem_strbuf_append_printf(strbuf, "[%d]", value->vValue.vt_vector.len);
4200 		}
4201 		wmem_strbuf_append(strbuf, ": ");
4202 	}
4203 
4204 	switch (value->vType & 0xFF00) {
4205 	case 0:
4206 		value->type->strbuf_append(strbuf, &value->vValue);
4207 		break;
4208 	case VT_ARRAY:
4209 		vvalue_strbuf_append_vector(strbuf, value->vValue.vt_array.vData, value->type);
4210 		break;
4211 	case VT_VECTOR:
4212 		vvalue_strbuf_append_vector(strbuf, value->vValue.vt_vector, value->type);
4213 		break;
4214 	default:
4215 		wmem_strbuf_append(strbuf, "Invalid");
4216 	}
4217 
4218 	return wmem_strbuf_get_str(strbuf);
4219 }
4220 
4221 static int parse_CBaseStorageVariant(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, struct CBaseStorageVariant *value, const char *text)
4222 {
4223 	int i, len;
4224 	proto_item *ti, *ti_type, *ti_val;
4225 	proto_tree *tree, *tr;
4226 	enum vType highType;
4227 
4228 	ZERO_STRUCT(*value);
4229 
4230 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CBaseStorageVariant, &ti, text);
4231 
4232 	value->vType = tvb_get_letohs(tvb, offset);
4233 	value->type = vType_get_type(value->vType & 0xFF);
4234 	if (value->type == NULL) {
4235 		/*
4236 		 * Not a valid type.
4237 		 */
4238 		ti_type = proto_tree_add_string(tree, hf_mswsp_cbasestorvariant_vtype, tvb, offset, 2, "Unknown CBaseStorageVariant type");
4239 		expert_add_info(pinfo, ti_type, &ei_mswsp_invalid_variant_type);
4240 
4241 		THROW_MESSAGE(ReportedBoundsError, "Unknown CBaseStorageVariant type");
4242 		return offset;
4243 	}
4244 
4245 	ti_type = proto_tree_add_string(tree, hf_mswsp_cbasestorvariant_vtype, tvb, offset, 2, value->type->str);
4246 	offset += 2;
4247 
4248 	value->vData1 = tvb_get_guint8(tvb, offset);
4249 	proto_tree_add_uint(tree, hf_mswsp_cbasestorvariant_vdata1, tvb, offset, 1, value->vData1);
4250 	offset += 1;
4251 
4252 	value->vData2 = tvb_get_guint8(tvb, offset);
4253 	proto_tree_add_uint(tree, hf_mswsp_cbasestorvariant_vdata2, tvb, offset, 1, value->vData2);
4254 	offset += 1;
4255 
4256 	highType = (enum vType)(value->vType & 0xFF00);
4257 
4258 	ti_val = proto_tree_add_string(tree, hf_mswsp_cbasestorvariant_vvalue, tvb, offset, 0, "");
4259 
4260 	switch (highType) {
4261 	case VT_EMPTY:
4262 		DISSECTOR_ASSERT_HINT(value->type->tvb_get != 0,
4263 				      "type that we don't know yet how to handle, please submit a bug with trace");
4264 		len = value->type->tvb_get(tvb, offset, &value->vValue.vt_single);
4265 		offset += len;
4266 		break;
4267 	case VT_VECTOR:
4268 		proto_item_append_text(ti_type, "|VT_VECTOR");
4269 		tr = proto_item_add_subtree(ti_val, ett_CBaseStorageVariant_Vector);
4270 
4271 		len = vvalue_tvb_vector(tvb, offset, &value->vValue.vt_vector, value->type);
4272 		proto_tree_add_uint(tr, hf_mswsp_cbasestorvariant_num, tvb, offset, 4, value->vValue.vt_vector.len);
4273 		offset += len;
4274 		break;
4275 	case VT_ARRAY: {
4276 		guint16 cDims, fFeatures;
4277 		guint32 cbElements, cElements, lLbound;
4278 		int num = 1;
4279 
4280 		proto_item_append_text(ti_type, "|VT_ARRAY");
4281 		tr = proto_item_add_subtree(ti_val, ett_CBaseStorageVariant_Array);
4282 
4283 		cDims = tvb_get_letohs(tvb, offset);
4284 		proto_tree_add_uint(tr, hf_mswsp_cbasestorvariant_cdims, tvb, offset, 2, cDims);
4285 		offset += 2;
4286 
4287 		fFeatures = tvb_get_letohs(tvb, offset);
4288 		proto_tree_add_uint(tr, hf_mswsp_cbasestorvariant_ffeatures, tvb, offset, 2, fFeatures);
4289 		offset += 2;
4290 
4291 		cbElements = tvb_get_letohl(tvb, offset);
4292 		proto_tree_add_uint(tr, hf_mswsp_cbasestorvariant_cbelements, tvb, offset, 4, cbElements);
4293 		offset += 4;
4294 		for (i=0; i<cDims; i++) {
4295 			cElements = tvb_get_letohl(tvb, offset);
4296 			lLbound =  tvb_get_letohl(tvb, offset + 4);
4297 			proto_tree_add_string_format(tr, hf_mswsp_cbasestorvariant_rgsabound, tvb, offset, 8, "", "Rgsabound[%d]: (%d:%d)", i, cElements, lLbound);
4298 			offset += 8;
4299 			num *= cElements;
4300 		}
4301 
4302 		len = vvalue_tvb_vector_internal(tvb, offset, &value->vValue.vt_array.vData, value->type, num);
4303 		offset += len;
4304 		break;
4305 	}
4306 	default:
4307 		proto_item_append_text(ti_type, "|0x%x", highType);
4308 	}
4309 	proto_item_set_end(ti, tvb, offset);
4310 	proto_item_set_end(ti_val, tvb, offset);
4311 
4312 	proto_item_append_text(ti_val, " %s", str_CBaseStorageVariant(value, FALSE));
4313 	proto_item_append_text(ti, " %s", str_CBaseStorageVariant(value, TRUE));
4314 
4315 	return offset;
4316 }
4317 
4318 enum {
4319 	DBKIND_GUID_NAME = 0,
4320 	DBKIND_GUID_PROPID = 1
4321 };
4322 
4323 static int parse_CDbColId(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *text)
4324 {
4325 	guint32 eKind, ulId;
4326 	e_guid_t guid;
4327 	const char *str;
4328 	static const char *KIND[] = {"DBKIND_GUID_NAME", "DBKIND_GUID_PROPID"};
4329 
4330 	proto_item *tree_item;
4331 	proto_tree *tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CDbColId, &tree_item, text);
4332 
4333 	eKind = tvb_get_letohl(tvb, offset);
4334 	str = (eKind < 2 ? KIND[eKind] : "???");
4335 	proto_tree_add_string_format_value(tree, hf_mswsp_cdbcolid_ekind, tvb, offset, 4,  str, "%s (%u)", str, eKind);
4336 	offset += 4;
4337 
4338 	offset = parse_padding(tvb, offset, 8, pad_tree, "paddingGuidAlign");
4339 
4340 	offset = parse_guid(tvb, offset, tree, &guid, "GUID");
4341 
4342 	ulId = tvb_get_letohl(tvb, offset);
4343 	proto_tree_add_uint(tree, hf_mswsp_cdbcolid_ulid, tvb, offset, 4, ulId);
4344 	offset += 4;
4345 
4346 	if (eKind == DBKIND_GUID_NAME) {
4347 		char *name;
4348 		int len = ulId;
4349 		name = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, len, ENC_LITTLE_ENDIAN | ENC_UCS_2);
4350 		proto_item_append_text(tree_item, " \"%s\"", name);
4351 		proto_tree_add_string_format_value(tree, hf_mswsp_cdbcolid_vstring, tvb, offset, len, name, "\"%s\"", name);
4352 		offset += len;
4353 	} else if (eKind == DBKIND_GUID_PROPID) {
4354 		proto_item_append_text(tree_item, " %08x", ulId);
4355 	} else {
4356 		proto_item_append_text(tree_item, "<INVALID>");
4357 	}
4358 
4359 	proto_item_set_end(tree_item, tvb, offset);
4360 
4361 	return offset;
4362 }
4363 
4364 static int parse_CDbProp(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct GuidPropertySet *propset, const char *fmt, ...)
4365 {
4366 	static const value_string EMPTY_VS[] = {{0, NULL}};
4367 	const value_string *vs = (propset && propset->id_map) ? propset->id_map : EMPTY_VS;
4368 	guint32 id, opt, status;
4369 	struct CBaseStorageVariant value;
4370 	proto_item *item;
4371 	proto_tree *tree;
4372 	const char *str, *txt;
4373 	va_list ap;
4374 
4375 	va_start(ap, fmt);
4376 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4377 	va_end(ap);
4378 
4379 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CDbProp, &item, txt);
4380 
4381 	id = tvb_get_letohl(tvb, offset);
4382 	str = val_to_str(id, vs, "0x%08x");
4383 	proto_tree_add_string_format_value(tree, hf_mswsp_cdbprop_id, tvb, offset, 4, str, "%s (0x%08x)", (str[0] == '0' ? "" : str), id);
4384 	offset += 4;
4385 	proto_item_append_text(item, " Id: %s", str);
4386 
4387 	opt = tvb_get_letohl(tvb, offset);
4388 	proto_tree_add_uint(tree, hf_mswsp_cdbprop_options, tvb, offset, 4, opt);
4389 	offset += 4;
4390 
4391 	status = tvb_get_letohl(tvb, offset);
4392 	proto_tree_add_uint(tree, hf_mswsp_cdbprop_status, tvb, offset, 4, status);
4393 	offset += 4;
4394 
4395 	offset = parse_CDbColId(tvb, offset, tree, pad_tree, "colid");
4396 
4397 	offset = parse_CBaseStorageVariant(tvb, pinfo, offset, tree, pad_tree, &value, "vValue");
4398 
4399 	str = str_CBaseStorageVariant(&value, TRUE);
4400 	proto_item_append_text(item, " %s", str);
4401 	proto_item_set_end(item, tvb, offset);
4402 
4403 	return offset;
4404 }
4405 
4406 static int parse_CDbPropSet(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4407 {
4408 	int i, num;
4409 	e_guid_t guid;
4410 	struct GuidPropertySet *pset;
4411 	proto_item *item;
4412 	proto_tree *tree;
4413 	const char *txt;
4414 	va_list ap;
4415 
4416 	va_start(ap, fmt);
4417 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4418 	va_end(ap);
4419 
4420 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CDbPropSet, &item, txt);
4421 
4422 	offset = parse_guid(tvb, offset, tree, &guid, "guidPropertySet");
4423 
4424 	pset = GuidPropertySet_find_guid(&guid);
4425 
4426 	if (pset) {
4427 		proto_item_append_text(item, " \"%s\" (%s)", pset->desc, pset->def);
4428 	} else {
4429 		const char *guid_str = guid_to_str(wmem_packet_scope(), &guid);
4430 		proto_item_append_text(item, " {%s}", guid_str);
4431 	}
4432 
4433 	offset = parse_padding(tvb, offset, 4, pad_tree, "guidPropertySet");
4434 
4435 	num = tvb_get_letohl(tvb, offset);
4436 	proto_tree_add_uint(tree, hf_mswsp_cdbpropset_cprops, tvb, offset, 4,  num);
4437 	offset += 4;
4438 	proto_item_append_text(item, " Num: %d", num);
4439 
4440 	for (i = 0; i<num; i++) {
4441 		offset = parse_padding(tvb, offset, 4, pad_tree, "aProp[%d]", i);
4442 		offset = parse_CDbProp(tvb, pinfo, offset, tree, pad_tree, pset, "aProp[%d]", i);
4443 	}
4444 
4445 	proto_item_set_end(item, tvb, offset);
4446 	return offset;
4447 }
4448 
4449 static int parse_PropertySetArray(tvbuff_t *tvb, packet_info *pinfo, int offset, int size_offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4450 {
4451 	const int offset_in = offset;
4452 	guint32 size, num;
4453 	int i;
4454 	proto_tree *tree;
4455 	proto_item *item;
4456 	const char *txt;
4457 	va_list ap;
4458 
4459 	va_start(ap, fmt);
4460 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4461 	va_end(ap);
4462 
4463 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CDbPropSet_Array, &item, txt);
4464 
4465 	size = tvb_get_letohl(tvb, size_offset);
4466 	proto_tree_add_item(tree, hf_mswsp_msg_ConnectIn_Blob1, tvb,
4467 						size_offset, 4, ENC_LITTLE_ENDIAN);
4468 
4469 	num = tvb_get_letohl(tvb, offset);
4470 	proto_tree_add_item(tree, hf_mswsp_msg_ConnectIn_PropSets_num, tvb,
4471 						offset, 4, ENC_LITTLE_ENDIAN);
4472 	offset += 4;
4473 
4474 	for (i = 0; i < (int)num; i++) {
4475 		offset = parse_CDbPropSet(tvb, pinfo, offset, tree, pad_tree, "PropertySet[%d]", i);
4476 	}
4477 
4478 	proto_item_set_end(item, tvb, offset);
4479 	DISSECTOR_ASSERT(offset - offset_in == (int)size);
4480 	return offset;
4481 }
4482 
4483 int parse_CColumnSet(tvbuff_t *tvb, int offset, proto_tree *tree, const char *fmt, ...)
4484 {
4485 	guint32 count, v, i;
4486 	proto_item *item;
4487 	const char *txt;
4488 	va_list ap;
4489 
4490 	va_start(ap, fmt);
4491 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4492 	va_end(ap);
4493 
4494 	count = tvb_get_letohl(tvb, offset);
4495 	offset += 4;
4496 	proto_tree_add_subtree(tree, tvb, offset, count * 4, ett_mswsp_uin32_array, &item, txt);
4497 	proto_item_append_text(item, " Count %u [", count);
4498 
4499 	for (i=0; i<count; i++) {
4500 		v = tvb_get_letohl(tvb, offset);
4501 		offset += 4;
4502 		if (i>0) {
4503 			proto_item_append_text(item, ",%u", v);
4504 		} else {
4505 			proto_item_append_text(item, "%u", v);
4506 		}
4507 	}
4508 	proto_item_append_text(item, "]");
4509 	return offset;
4510 }
4511 
4512 /* 2.2.1.23 RANGEBOUNDARY */
4513 int parse_RANGEBOUNDARY(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4514 {
4515 	guint32 ulType;
4516 	guint8 labelPresent;
4517 	proto_item *item;
4518 	proto_tree *tree;
4519 	const char *txt;
4520 	struct CBaseStorageVariant prval;
4521 	va_list ap;
4522 
4523 	va_start(ap, fmt);
4524 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4525 	va_end(ap);
4526 	tree =proto_tree_add_subtree (parent_tree, tvb, offset, 0, ett_RANGEBOUNDARY, &item, txt);
4527 
4528 	ulType = tvb_get_letohl(tvb, offset);
4529 	proto_tree_add_item(tree, hf_mswsp_rangeboundry_ultype, tvb, offset, 4, ENC_LITTLE_ENDIAN);
4530 	proto_item_append_text(item, ": Type 0x%08x", ulType);
4531 	offset += 4;
4532 
4533 	ZERO_STRUCT(prval);
4534 	offset = parse_CBaseStorageVariant(tvb, pinfo, offset, tree, pad_tree, &prval, "prVal");
4535 
4536 	labelPresent = tvb_get_guint8(tvb, offset);
4537 	proto_tree_add_item(tree, hf_mswsp_rangeboundry_labelpresent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
4538 	offset += 1;
4539 
4540 	if (labelPresent) {
4541 		guint32 ccLabel;
4542 		const guint8* label;
4543 		offset = parse_padding(tvb, offset, 4, pad_tree, "paddingLabelPresent");
4544 
4545 		ccLabel = tvb_get_letohl(tvb, offset);
4546 		proto_tree_add_item_ret_uint(tree, hf_mswsp_rangeboundry_cclabel, tvb, offset, 4, ENC_LITTLE_ENDIAN, &ccLabel);
4547 		offset += 4;
4548 
4549 		proto_tree_add_item_ret_string(tree, hf_mswsp_rangeboundry_label, tvb, offset, 2*ccLabel, ENC_LITTLE_ENDIAN | ENC_UCS_2, wmem_packet_scope(), &label);
4550 		proto_item_append_text(item, " Label: \"%s\"", label);
4551 		offset += 2*ccLabel;
4552 	}
4553 
4554 	proto_item_append_text(item, " Val: %s", str_CBaseStorageVariant(&prval, TRUE));
4555 
4556 	proto_item_set_end(item, tvb, offset);
4557 	return offset;
4558 }
4559 
4560 
4561 /* 2.2.1.22 CRangeCategSpec */
4562 int parse_CRangeCategSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4563 {
4564 	proto_item *item;
4565 	proto_tree *tree;
4566 	va_list ap;
4567 	unsigned i;
4568 	const char *txt;
4569 	guint32 cRange;
4570 
4571 	va_start(ap, fmt);
4572 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4573 	va_end(ap);
4574 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRangeCategSpec, &item, txt);
4575 
4576 	offset = parse_lcid(tvb, offset, tree, "lcid");
4577 
4578 	cRange = tvb_get_letohl(tvb, offset);
4579 	proto_tree_add_uint(tree, hf_mswsp_crangecategspec_crange, tvb, offset, 4, cRange);
4580 	offset += 4;
4581 
4582 	for (i=0; i<cRange; i++) {
4583 		offset = parse_RANGEBOUNDARY(tvb, pinfo, offset, tree, pad_tree, "aRangeBegin[%u]", i);
4584 
4585 	}
4586 
4587 	proto_item_set_end(item, tvb, offset);
4588 	return offset;
4589 }
4590 
4591 /* 2.2.1.21 CCategSpec */
4592 int parse_CCategSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4593 {
4594 	proto_item *item;
4595 	proto_tree *tree;
4596 
4597 	va_list ap;
4598 	guint32 type;
4599 	const char *txt;
4600 	va_start(ap, fmt);
4601 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4602 	va_end(ap);
4603 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CCategSpec, &item, txt);
4604 
4605 	type = tvb_get_letohl(tvb, offset);
4606 	proto_tree_add_uint(tree, hf_mswsp_ccategspec_type, tvb, offset, 4, type);
4607 	proto_item_append_text(item, " Type %u", type);
4608 	offset += 4;
4609 
4610 	offset = parse_CSort(tvb, offset, tree, pad_tree, "CSort");
4611 
4612 	/*
4613 	 * A CRangeCategSpec structure specifying the range values.
4614 	 * This field MUST be omitted if _ulCategType is set to
4615 	 * CATEGORIZE_UNIQUE e.g. '0' otherwise it MUST be present.
4616 	 */
4617 	if (type != 0) {
4618 		offset = parse_CRangeCategSpec(tvb, pinfo, offset, tree, pad_tree, "CRangeCategSpec");
4619 	}
4620 
4621 	proto_item_set_end(item, tvb, offset);
4622 	return offset;
4623 }
4624 
4625 /* 2.2.1.25 CAggregSpec */
4626 static int parse_CAggregSpec(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4627 {
4628 	proto_item *item;
4629 	proto_tree *tree;
4630 	va_list ap;
4631 	guint32 type, ccAlias, idColumn;
4632 	const char *txt;
4633 
4634 	va_start(ap, fmt);
4635 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4636 	va_end(ap);
4637 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CAggregSpec, &item, txt);
4638 
4639 	proto_tree_add_item_ret_uint(tree, hf_mswsp_caggregspec_type, tvb, offset, 1, ENC_LITTLE_ENDIAN, &type);
4640 	offset += 1;
4641 
4642 	offset = parse_padding(tvb, offset, 4, pad_tree, "padding");
4643 
4644 	proto_tree_add_item_ret_uint(tree, hf_mswsp_caggregspec_ccalias, tvb, offset, 4, ENC_LITTLE_ENDIAN, &ccAlias);
4645 	offset += 4;
4646 
4647 	proto_tree_add_item(tree, hf_mswsp_caggregspec_alias, tvb, offset, 2*ccAlias, ENC_LITTLE_ENDIAN | ENC_UCS_2);
4648 	offset += 2*ccAlias;
4649 
4650 	proto_tree_add_item_ret_uint(tree, hf_mswsp_caggregspec_idcolumn, tvb, offset, 4, ENC_LITTLE_ENDIAN, &idColumn);
4651 	offset += 4;
4652 	if (type == DBAGGTTYPE_REPRESENTATIVEOF
4653 	    || type == DBAGGTTYPE_BYFREQ
4654 	    || type == DBAGGTTYPE_FIRST) {
4655 		proto_tree_add_uint(tree,
4656 				    hf_mswsp_caggregspec_ulmaxnumtoreturn,
4657 				    tvb, offset, 4, idColumn);
4658 		offset += 4;
4659 		if (type == DBAGGTTYPE_REPRESENTATIVEOF) {
4660 			proto_tree_add_uint(tree,
4661 				    hf_mswsp_caggregspec_idrepresentative,
4662 				    tvb, offset, 4, idColumn);
4663 		}
4664 	}
4665 	/* Optional ???
4666 	   ulMaxNumToReturn, idRepresentative;
4667 	*/
4668 
4669 	proto_item_set_end(item, tvb, offset);
4670 	return offset;
4671 }
4672 
4673 /* 2.2.1.24 CAggregSet */
4674 static int parse_CAggregSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4675 {
4676 	guint32 cCount, i;
4677 	proto_item *item;
4678 	proto_tree *tree;
4679 	const char *txt;
4680 
4681 	va_list ap;
4682 
4683 	va_start(ap, fmt);
4684 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4685 	va_end(ap);
4686 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CAggregSet, &item, txt);
4687 
4688 	cCount = tvb_get_letohl(tvb, offset);
4689 	proto_tree_add_uint(tree, hf_mswsp_caggregset_count, tvb, offset, 4, cCount);
4690 	offset += 4;
4691 
4692 	for (i=0; i<cCount; i++) {
4693 		/* 2.2.1.25 CAggregSpec */
4694 		offset = parse_CAggregSpec(tvb, offset, tree, pad_tree, "AggregSpecs[%u]", i);
4695 	}
4696 
4697 	proto_item_set_end(item, tvb, offset);
4698 	return offset;
4699 }
4700 
4701 /* 2.2.1.27 CAggregSortKey */
4702 static int parse_CAggregSortKey(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4703 {
4704 	guint32 order;
4705 	proto_item *item;
4706 	proto_tree *tree;
4707 	const char *txt;
4708 
4709 	va_list ap;
4710 
4711 	va_start(ap, fmt);
4712 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4713 	va_end(ap);
4714 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CAggregSortKey, &item, txt);
4715 
4716 	order = tvb_get_letohl(tvb, offset);
4717 	proto_tree_add_uint(tree, hf_mswsp_caggregsortkey_order, tvb, offset, 4, order);
4718 	offset += 4;
4719 
4720 	offset = parse_CAggregSpec(tvb, offset, tree, pad_tree, "ColumnSpec");
4721 
4722 	proto_item_set_end(item, tvb, offset);
4723 	return offset;
4724 }
4725 
4726 
4727 /* 2.2.1.26 CSortAggregSet */
4728 static int parse_CSortAggregSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4729 {
4730 	guint32 cCount, i;
4731 	proto_item *item;
4732 	proto_tree *tree;
4733 	const char *txt;
4734 	va_list ap;
4735 
4736 	va_start(ap, fmt);
4737 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4738 	va_end(ap);
4739 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CSortAggregSet, &item, txt);
4740 
4741 	cCount = tvb_get_letohl(tvb, offset);
4742 	proto_tree_add_uint(tree, hf_mswsp_csortaggregset_count, tvb, offset, 4, cCount);
4743 	offset += 4;
4744 
4745 	for (i=0; i<cCount; i++) {
4746 		/* 2.2.1.27 CAggregSortKey */
4747 		offset = parse_CAggregSortKey(tvb, offset, tree, pad_tree, "SortKeys[%u]", i);
4748 	}
4749 
4750 	proto_item_set_end(item, tvb, offset);
4751 	return offset;
4752 }
4753 
4754 enum CInGroupSortAggregSet_type {
4755 	GroupIdDefault = 0x00, /* The default for all ranges. */
4756 	GroupIdMinValue = 0x01, /*The first range in the parent's group.*/
4757 	GroupIdNull = 0x02, /*The last range in the parent's group.*/
4758 	GroupIdValue = 0x03
4759 };
4760 
4761 static int parse_CInGroupSortAggregSet_type(tvbuff_t *tvb, int offset, proto_tree *tree, enum CInGroupSortAggregSet_type *type)
4762 {
4763 	guint8 tmp = tvb_get_guint8(tvb, offset);
4764 	switch(tmp) {
4765 		case GroupIdDefault:
4766 			*type = GroupIdDefault;
4767 			break;
4768 		case GroupIdMinValue:
4769 			*type = GroupIdMinValue;
4770 			break;
4771 		case GroupIdNull:
4772 			*type = GroupIdNull;
4773 			break;
4774 		case GroupIdValue:
4775 			*type = GroupIdValue;
4776 			break;
4777 		default:
4778 			DISSECTOR_ASSERT(FALSE);
4779 			break;
4780 	}
4781 	proto_tree_add_uint(tree, hf_mswsp_cingroupsortaggregset_type, tvb, offset, 1, *type);
4782 	return offset + 1;
4783 }
4784 
4785 /* 2.2.1.29 CInGroupSortAggregSet */
4786 static int parse_CInGroupSortAggregSet(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4787 {
4788 	proto_item *item;
4789 	proto_tree *tree;
4790 	va_list ap;
4791 	enum CInGroupSortAggregSet_type type;
4792 	const char *txt;
4793 
4794 	va_start(ap, fmt);
4795 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4796 	va_end(ap);
4797 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CInGroupSortAggregSet, &item, txt);
4798 
4799 	offset = parse_CInGroupSortAggregSet_type(tvb, offset, tree, &type);
4800 	offset = parse_padding(tvb, offset, 4, pad_tree, "CInGroupSortAggregSet");
4801 
4802 	if (type == GroupIdValue) {
4803 		struct CBaseStorageVariant id;
4804 		offset = parse_CBaseStorageVariant(tvb, pinfo, offset, tree, pad_tree, &id, "inGroupId");
4805 	}
4806 
4807 	offset = parse_CSortSet(tvb, offset, tree, pad_tree, "SortSet");
4808 
4809 	proto_item_set_end(item, tvb, offset);
4810 	return offset;
4811 }
4812 
4813 
4814 /* 2.2.1.28 CInGroupSortAggregSets */
4815 static int parse_CInGroupSortAggregSets(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4816 {
4817 	guint32 cCount, i;
4818 	proto_item *item;
4819 	proto_tree *tree;
4820 	const char *txt;
4821 	va_list ap;
4822 
4823 	va_start(ap, fmt);
4824 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4825 	va_end(ap);
4826 
4827 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CInGroupSortAggregSets, &item, txt);
4828 
4829 	cCount = tvb_get_letohl(tvb, offset);
4830 	proto_tree_add_uint(tree, hf_mswsp_cingroupsortaggregsets_count, tvb, offset, 4, cCount);
4831 	offset += 4;
4832 
4833 	for (i=0; i<cCount; i++) {
4834 		/* 2.2.1.29 CInGroupSortAggregSet */
4835 		offset = parse_CInGroupSortAggregSet(tvb, pinfo, offset, tree, pad_tree, "SortSets[%u]", i);
4836 	}
4837 
4838 	proto_item_set_end(item, tvb, offset);
4839 	return offset;
4840 }
4841 
4842 /* 2.2.1.20 CCategorizationSpec */
4843 int parse_CCategorizationSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4844 {
4845 	proto_item *item;
4846 	proto_tree *tree;
4847 	const char *txt;
4848 
4849 	va_list ap;
4850 
4851 	va_start(ap, fmt);
4852 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4853 	va_end(ap);
4854 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CCategorizationSpec, &item, txt);
4855 
4856 	/* 2.2.1.18  CColumnSet */
4857 	offset = parse_CColumnSet(tvb, offset, tree, "csColumns");
4858 
4859 	/* 2.2.1.21 CCategSpec */
4860 	offset = parse_CCategSpec(tvb, pinfo, offset, tree, pad_tree, "Spec");
4861 
4862 	/* 2.2.1.24 CAggregSet */
4863 	offset = parse_CAggregSet(tvb, offset, tree, pad_tree, "AggregSet");
4864 
4865 	/* 2.2.1.26 CSortAggregSet */
4866 	offset = parse_CSortAggregSet(tvb, offset, tree, pad_tree, "SortAggregSet");
4867 
4868 	/* 2.2.1.28 CInGroupSortAggregSets */
4869 	offset = parse_CInGroupSortAggregSets(tvb, pinfo, offset, tree, pad_tree, "InGroupSortAggregSets");
4870 
4871 	proto_tree_add_item(tree, hf_mswsp_categorizationspec_cmaxres, tvb, offset, 4, ENC_LITTLE_ENDIAN);
4872 	offset += 4;
4873 
4874 	proto_item_set_end(item, tvb, offset);
4875 	return offset;
4876 }
4877 
4878 static int * const mswsp_bool_options[] = {
4879 	&hf_mswsp_bool_options_cursor,
4880 	&hf_mswsp_bool_options_async,
4881 	&hf_mswsp_bool_options_firstrows,
4882 	&hf_mswsp_bool_options_holdrows,
4883 	&hf_mswsp_bool_options_chaptered,
4884 	&hf_mswsp_bool_options_useci,
4885 	&hf_mswsp_bool_options_defertrim,
4886 	&hf_mswsp_bool_options_rowsetevents,
4887 	&hf_mswsp_bool_options_dontcomputeexpensive,
4888 	NULL
4889 };
4890 
4891 int parse_CRowsetProperties(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, const char *fmt, ...)
4892 {
4893 	proto_item *item;
4894 	proto_tree *tree;
4895 	const char *txt;
4896 
4897 	va_list ap;
4898 
4899 	va_start(ap, fmt);
4900 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4901 
4902 	va_end(ap);
4903 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRowsetProperties, &item, txt);
4904 
4905 	proto_tree_add_bitmask_with_flags(tree, tvb, offset,
4906 hf_mswsp_bool_options, ett_mswsp_bool_options, mswsp_bool_options, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
4907 
4908 	offset += 4;
4909 
4910 	proto_tree_add_item(tree, hf_mswsp_crowsetprops_ulmaxopenrows, tvb, offset, 4, ENC_LITTLE_ENDIAN);
4911 	offset += 4;
4912 
4913 	proto_tree_add_item(tree, hf_mswsp_crowsetprops_ulmemusage, tvb, offset, 4, ENC_LITTLE_ENDIAN);
4914 	offset += 4;
4915 
4916 	proto_tree_add_item(tree, hf_mswsp_crowsetprops_cmaxresults, tvb, offset, 4, ENC_LITTLE_ENDIAN);
4917 	offset += 4;
4918 
4919 	proto_tree_add_item(tree, hf_mswsp_crowsetprops_ccmdtimeout, tvb, offset, 4, ENC_LITTLE_ENDIAN);
4920 	offset += 4;
4921 
4922 	proto_item_set_end(item, tvb, offset);
4923 	return offset;
4924 }
4925 
4926 int parse_CPidMapper(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4927 {
4928 	proto_item *item;
4929 	proto_tree *tree;
4930 	va_list ap;
4931 	guint32 count, i;
4932 	const char *txt;
4933 
4934 	va_start(ap, fmt);
4935 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4936 	va_end(ap);
4937 
4938 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CPidMapper, &item, txt);
4939 
4940 	count = tvb_get_letohl(tvb, offset);
4941 	proto_tree_add_uint(tree, hf_mswsp_cpidmapper_count, tvb, offset, 4, count);
4942 	offset += 4;
4943 
4944 	offset = parse_padding(tvb, offset, 8, pad_tree, "CPidMapper_PropSpec");
4945 
4946 	for (i=0; i<count; i++) {
4947 		struct CFullPropSpec v;
4948 		ZERO_STRUCT(v);
4949 		/*at begin or end of loop???*/
4950 		offset = parse_padding(tvb, offset, 4, pad_tree,
4951 							   "CPidMapper_PropSpec[%u]", i);
4952 		offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &v, "PropSpec[%u]", i);
4953 	}
4954 
4955 	proto_item_set_end(item, tvb, offset);
4956 	return offset;
4957 }
4958 
4959 /* 2.2.1.35 CColumnGroup */
4960 int parse_CColumnGroup(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, const char *fmt, ...)
4961 {
4962 	proto_tree *tree;
4963 	proto_item *item, *ti;
4964 	va_list ap;
4965 	const char *txt;
4966 	guint32 count, groupPid, i;
4967 
4968 	va_start(ap, fmt);
4969 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4970 	va_end(ap);
4971 
4972 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CColumnGroup, &item, txt);
4973 
4974 	count = tvb_get_letohl(tvb, offset);
4975 	proto_tree_add_uint(tree, hf_mswsp_ccolumngroup_count, tvb, offset, 4, count);
4976 	offset += 4;
4977 
4978 	groupPid = tvb_get_letohl(tvb, offset);
4979 	ti = proto_tree_add_uint(tree, hf_mswsp_ccolumngroup_grouppid, tvb, offset, 4, groupPid);
4980 	if ((0xFFFF0000 & groupPid) == 0x7FFF0000) {
4981 		proto_item_append_text(ti, " Idx: %u", groupPid & 0xFFFF);
4982 	} else {
4983 		proto_item_append_text(ti, "<Invalid>");
4984 	}
4985 	offset += 4;
4986 
4987 	for (i=0; i<count; i++) {
4988 		/* 2.2.1.36 SProperty */
4989 		guint32 pid, weight;
4990 		pid = tvb_get_letohl(tvb, offset);
4991 		weight = tvb_get_letohl(tvb, offset + 4);
4992 		proto_tree_add_uint_format(tree, hf_mswsp_ccolumngroup_pid, tvb, offset, 8, pid, "Props[%u]: pid: %u weight: %u", i, pid, weight);
4993 		offset += 8;
4994 	}
4995 
4996 	proto_item_set_end(item, tvb, offset);
4997 	return offset;
4998 }
4999 
5000 /* 2.2.1.34 CColumnGroupArray */
5001 int parse_CColumnGroupArray(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
5002 {
5003 	proto_tree *tree;
5004 	proto_item *item;
5005 	va_list ap;
5006 	const char *txt;
5007 
5008 	guint32 count, i;
5009 
5010 	va_start(ap, fmt);
5011 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5012 	va_end(ap);
5013 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CColumnGroupArray, &item, txt);
5014 
5015 	count = tvb_get_letohl(tvb, offset);
5016 	proto_tree_add_uint(tree, hf_mswsp_ccolumngrouparray_count, tvb, offset, 4, count);
5017 	offset += 4;
5018 
5019 	for (i=0; i<count; i++) {
5020 		offset = parse_padding(tvb, offset, 4, pad_tree, "aGroupArray[%u]", i);
5021 		offset = parse_CColumnGroup(tvb, offset, tree, pad_tree, "aGroupArray[%u]", i);
5022 	}
5023 
5024 	proto_item_set_end(item, tvb, offset);
5025 	return offset;
5026 }
5027 
5028 static int parse_UInt32Array(tvbuff_t *tvb, int offset, proto_tree *parent_tree, guint32 count, const char *item_name, const char *fmt, ...)
5029 {
5030 	guint32 v, i;
5031 	proto_tree *tree;
5032 	proto_item *item;
5033 	const char *txt;
5034 
5035 	va_list ap;
5036 
5037 	va_start(ap, fmt);
5038 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5039 	va_end(ap);
5040 
5041 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_Array, &item, txt);
5042 
5043 	for (i=0; i<count; i++) {
5044 		v = tvb_get_letohl(tvb, offset);
5045 		proto_tree_add_uint_format(tree, hf_mswsp_int32array_value, tvb, offset, 4, v, "%s[%u] = %u", item_name,i, v);
5046 		offset += 4;
5047 	}
5048 	proto_item_set_end(item, tvb, offset);
5049 	return offset;
5050 }
5051 
5052 /* 2.2.1.40 CRowSeekNext */
5053 static int parse_CRowSeekNext(tvbuff_t *tvb, int offset, proto_tree *parent_tree, const char *fmt, ...)
5054 {
5055 	proto_tree *tree;
5056 	proto_item *item;
5057 	const char *txt;
5058 	va_list ap;
5059 
5060 	va_start(ap, fmt);
5061 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5062 	va_end(ap);
5063 
5064 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRowsSeekNext, &item, txt);
5065 
5066 	proto_tree_add_item(tree, hf_mswsp_crowseeknext_cskip, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5067 	offset += 4;
5068 	proto_item_set_end(item, tvb, offset);
5069 	return offset;
5070 }
5071 
5072 
5073 /* 2.2.1.37 CRowSeekAt */
5074 static int parse_CRowSeekAt(tvbuff_t *tvb, int offset, proto_tree *parent_tree, const char *fmt, ...)
5075 {
5076 	proto_tree *tree;
5077 	proto_item *item;
5078 	va_list ap;
5079 	const char *txt;
5080 
5081 	va_start(ap, fmt);
5082 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5083 	va_end(ap);
5084 
5085 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRowsSeekAt, &item, txt);
5086 
5087 	proto_tree_add_item(tree, hf_mswsp_crowseekat_bmkoffset, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5088 	offset += 4;
5089 
5090 
5091 	proto_tree_add_item(tree, hf_mswsp_crowseekat_skip, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5092 	offset += 4;
5093 
5094 	proto_tree_add_item(tree, hf_mswsp_crowseekat_hregion, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5095 	offset += 4;
5096 
5097 	proto_item_set_end(item, tvb, offset);
5098 	return offset;
5099 }
5100 
5101 /* 2.2.1.38 CRowSeekAtRatio */
5102 static int parse_CRowSeekAtRatio(tvbuff_t *tvb, int offset, proto_tree *parent_tree, const char *fmt, ...)
5103 {
5104 	proto_tree *tree;
5105 	proto_item *item;
5106 	va_list ap;
5107 	const char *txt;
5108 
5109 	va_start(ap, fmt);
5110 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5111 	va_end(ap);
5112 
5113 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRowsSeekAtRatio, &item, txt);
5114 
5115 	proto_tree_add_item(tree, hf_mswsp_crowseekatratio_ulnumerator, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5116 	offset += 4;
5117 
5118 
5119 	proto_tree_add_item(tree, hf_mswsp_crowseekatratio_uldenominator, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5120 	offset += 4;
5121 
5122 	proto_tree_add_item(tree, hf_mswsp_crowseekatratio_hregion, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5123 	offset += 4;
5124 
5125 	proto_item_set_end(item, tvb, offset);
5126 	return offset;
5127 }
5128 
5129 /* 2.2.1.39 CRowSeekByBookmark */
5130 static int parse_CRowSeekByBookmark(tvbuff_t *tvb, int offset, proto_tree *parent_tree, const char *fmt, ...)
5131 {
5132 	proto_tree *tree;
5133 	proto_item *item;
5134 	guint32 num;
5135 	const char *txt;
5136 	va_list ap;
5137 
5138 	va_start(ap, fmt);
5139 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5140 	va_end(ap);
5141 
5142 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRowsSeekByBookmark, &item, txt);
5143 
5144 	num =  tvb_get_letohl(tvb,offset);
5145 	proto_tree_add_item(tree, hf_mswsp_crowseekbybookmark_cbookmarks, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5146 	offset += 4;
5147 
5148 	offset = parse_UInt32Array(tvb, offset, tree, num, "abookmark", "abookmarks");
5149 
5150 	num =  tvb_get_letohl(tvb,offset);
5151 	proto_tree_add_item(tree, hf_mswsp_crowseekbybookmark_maxret, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5152 	offset += 4;
5153 
5154 	offset = parse_UInt32Array(tvb, offset, tree, num, "ascret", "ascret");
5155 
5156 	proto_item_set_end(item, tvb, offset);
5157 	return offset;
5158 }
5159 
5160 static int get_fixed_vtype_dataize(enum vType vtype)
5161 {
5162 	struct vtype_data *vt_type = vType_get_type(vtype);
5163 	if (vt_type) {
5164 		return vt_type->size;
5165 	}
5166 	return -1;
5167 }
5168 
5169 static int parse_CRowVariantArrayInfo(tvbuff_t *tvb, int offset, proto_tree *tree, gboolean is_64bit, struct CRowVariant *variant)
5170 {
5171 	if (is_64bit) {
5172 		variant->content.array_vector.i64.count =
5173 					tvb_get_letoh64(tvb, offset);
5174 		proto_tree_add_uint64(tree, hf_mswsp_crowvariantinfo_count64, tvb, offset, 8, variant->content.array_vector.i64.count);
5175 		offset += 8;
5176 		variant->content.array_vector.i64.array_address = tvb_get_letoh64(tvb, offset);
5177 		proto_tree_add_uint64(tree, hf_mswsp_arrayvector_address64, tvb, offset, 8, variant->content.array_vector.i64.array_address);
5178 		offset += 8;
5179 
5180 	} else {
5181 		variant->content.array_vector.i32.count =
5182 					tvb_get_letohl(tvb, offset);
5183 		proto_tree_add_uint(tree, hf_mswsp_crowvariantinfo_count32, tvb, offset, 4, variant->content.array_vector.i32.count );
5184 		offset += 4;
5185 		variant->content.array_vector.i32.array_address = tvb_get_letohl(tvb, offset);
5186 		proto_tree_add_uint(tree, hf_mswsp_arrayvector_address32, tvb, offset, 4, variant->content.array_vector.i32.array_address);
5187 		offset += 4;
5188 	}
5189 	return offset;
5190 }
5191 
5192 static int parse_VariantColVector(tvbuff_t *tvb, int offset, proto_tree *tree, guint64 base_address, gboolean is_64bit, struct CRowVariant *variant, struct vtype_data *vt_list_type)
5193 {
5194 	guint32 i = 0;
5195 	guint64 count = 0;
5196 	int buf_offset = 0;
5197 	proto_tree *sub_tree;
5198 	wmem_strbuf_t *strbuf;
5199 
5200 	offset = parse_CRowVariantArrayInfo(tvb, offset, tree, is_64bit, variant);
5201 	if (is_64bit) {
5202 		buf_offset =
5203 			(int)(variant->content.array_vector.i64.array_address - base_address);
5204 		count = variant->content.array_vector.i64.count;
5205 	} else {
5206 		buf_offset =
5207 			(int)(variant->content.array_vector.i32.array_address - base_address);
5208 		count = variant->content.array_vector.i32.count;
5209 	}
5210 	sub_tree = proto_tree_add_subtree(tree, tvb, buf_offset, 0, ett_CRowVariant_Vector, NULL, "values");
5211 	for (i = 0; i < count; i++) {
5212 		guint64 item_address = 0;
5213 		gint address_of_address = 0;
5214 		int size;
5215 		union vt_single value;
5216 		int len;
5217 		if (is_64bit) {
5218 			size = 8;
5219 			address_of_address = buf_offset + (i * size);
5220 			item_address = tvb_get_letoh64(tvb, address_of_address);
5221 			proto_tree_add_uint64_format(sub_tree, hf_mswsp_rowvariant_item_address64, tvb, address_of_address, size, item_address, "address[%d] 0x%" G_GINT64_MODIFIER "x", i, item_address);
5222 		} else {
5223 			size = 4;
5224 			item_address = tvb_get_letohl(tvb, buf_offset + (i * size));
5225 			proto_tree_add_uint_format(sub_tree, hf_mswsp_rowvariant_item_address32, tvb, address_of_address, size, (guint32)item_address, "address[%d] 0x%x", i, (guint32)item_address);
5226 		}
5227 		strbuf = wmem_strbuf_new(wmem_packet_scope(), "");
5228 		if (vt_list_type->size == -1) {
5229 			/* dynamic type */
5230 			DISSECTOR_ASSERT_HINT(vt_list_type->tvb_get_value_only != 0,
5231 								  "appears this is a vector of dynamic types that we don't know yet how to handle, please submit a bug with trace");
5232 			len = vt_list_type->tvb_get_value_only(tvb, (int)(item_address - base_address), 0, &value);
5233 			vt_list_type->strbuf_append(strbuf, &value);
5234 		} else {
5235 			/*
5236 			 * assume non dynamic size types are stored directly.
5237 			 * Note: not test as not seen in the wild.
5238 			 */
5239 			len = vt_list_type->size;
5240 			DISSECTOR_ASSERT_HINT(vt_list_type->tvb_get != 0,
5241 					      "appears this is a vector of fixed types that we don't know yet how to handle, please submit a bug with trace");
5242 
5243 			vt_list_type->tvb_get(tvb, (int)(item_address - base_address), &value);
5244 			vt_list_type->strbuf_append(strbuf, &value);
5245 		}
5246 		proto_tree_add_string(sub_tree, hf_mswsp_rowvariant_item_value, tvb, (gint)(item_address - base_address), len, wmem_strbuf_get_str(strbuf));
5247 	}
5248 	return offset;
5249 }
5250 
5251 static int parse_VariantCol(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, guint64 base_address, guint32 length _U_, gboolean is_64bit, struct CRowVariant *variant, const char *fmt, ...)
5252 {
5253 	proto_tree *tree;
5254 	proto_item *item, *ti_type;
5255 
5256 	va_list ap;
5257 	struct vtype_data *vt_type;
5258 	const char *modifier = "", *txt;
5259 	int size;
5260 	guint16 vtype_high;
5261 
5262 	va_start(ap, fmt);
5263 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5264 	va_end(ap);
5265 
5266 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRowVariant, &item, txt);
5267 
5268 	variant->vtype = tvb_get_letohs(tvb, offset);
5269 	vt_type = vType_get_type((enum vType)variant->vtype);
5270 	vtype_high = (variant->vtype & 0xFF00);
5271 	if (vtype_high) {
5272 		if (vtype_high == VT_VECTOR) {
5273 			modifier = "|VT_VECTOR";
5274 		} else if (vtype_high == VT_ARRAY) {
5275 			modifier = "|VT_ARRAY";
5276 		} else {
5277 			modifier = "|Unknown, possibly error";
5278 		}
5279 	}
5280 
5281 	if (vt_type == NULL) {
5282 		/*
5283 		 * Not a valid type.
5284 		 */
5285 		ti_type = proto_tree_add_string(tree, hf_mswsp_ctablecolumn_vtype, tvb, offset, 4, "Unknown variant column type");
5286 		expert_add_info(pinfo, ti_type, &ei_mswsp_invalid_variant_type);
5287 
5288 		THROW_FORMATTED(ReportedBoundsError, "Unknown variant column type%s", modifier);
5289 		return offset;
5290 	}
5291 	proto_tree_add_string_format_value(tree, hf_mswsp_rowvariant_vtype, tvb, offset, 2, vt_type->str, "%s%s", vt_type->str, modifier);
5292 	offset += 2;
5293 
5294 	proto_tree_add_item(tree, hf_mswsp_rowvariant_reserved1, tvb, offset, 2, ENC_LITTLE_ENDIAN);
5295 	variant->reserved1 = tvb_get_letohs(tvb, offset);
5296 
5297 	offset += 2;
5298 	proto_tree_add_item(tree, hf_mswsp_rowvariant_reserved2, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5299 	variant->reserved2 = tvb_get_letohl(tvb, offset);
5300 	offset += 4;
5301 
5302 	size = get_fixed_vtype_dataize((enum vType)(variant->vtype & 0x00FF));
5303 
5304 	if (vtype_high == VT_VECTOR || vtype_high == VT_ARRAY) {
5305 		offset = parse_VariantColVector(tvb, offset, tree, base_address,
5306 										is_64bit, variant, vt_type);
5307 	} else {
5308 		wmem_strbuf_t *strbuf = wmem_strbuf_new(wmem_packet_scope(), "");
5309 		if (size != -1) {
5310 			/* single fixed size value type */
5311 			const char* desc = vt_type->str;
5312 
5313 			DISSECTOR_ASSERT_HINT(vt_type->tvb_get != 0,
5314 					      "appears fixed type that we don't know yet how to handle, please submit a bug with trace");
5315 			vt_type->tvb_get(tvb, offset, &variant->content);
5316 			vt_type->strbuf_append(strbuf, &variant->content);
5317 			proto_tree_add_string_format_value(tree, hf_mswsp_rowvariant_item_value, tvb, offset, size, desc, "%s: %s", desc, wmem_strbuf_get_str(strbuf));
5318 		} else {
5319 			gint64 value_address;
5320 			int buf_offset = offset;
5321 			int len;
5322 			union vt_single non_fixed_size_val;
5323 			DISSECTOR_ASSERT_HINT(vt_type->tvb_get_value_only != 0, "appears this is a dynamic type that we don't know yet how to handle, please submit a bug with network trace");
5324 			if (is_64bit) {
5325 				variant->content.hyperw = tvb_get_letoh64(tvb, offset);
5326 				offset += 8;
5327 				value_address = variant->content.hyperw;
5328 				proto_tree_add_uint64(tree, hf_mswsp_rowvariant_item_address64, tvb, buf_offset, 8, value_address);
5329 			} else {
5330 				variant->content.longw = tvb_get_letohl(tvb, offset);
5331 				offset += 4;
5332 				value_address = variant->content.longw;
5333 				proto_tree_add_uint(tree, hf_mswsp_rowvariant_item_address32, tvb, buf_offset, 4, (guint32)value_address);
5334 			}
5335 
5336 			len = vt_type->tvb_get_value_only(tvb, (int)(value_address - base_address), 0, &non_fixed_size_val);
5337 			vt_type->strbuf_append(strbuf, &non_fixed_size_val);
5338 			proto_tree_add_string(tree, hf_mswsp_rowvariant_item_value, tvb, (gint)(value_address - base_address), len, wmem_strbuf_get_str(strbuf));
5339 		}
5340 	}
5341 
5342 	return offset;
5343 }
5344 
5345 static int parse_RowsBufferCol(tvbuff_t *tvb, packet_info *pinfo, int offset, guint32 row, guint32 col, struct CPMSetBindingsIn *bindingsin, struct rows_data *rowsin, gboolean b_is_64bit, proto_tree *parent_tree, const char *fmt, ...)
5346 {
5347 	proto_tree *tree;
5348 	proto_item *item;
5349 	guint32 buf_start = offset;
5350 	guint32 buf_offset = buf_start + (row * bindingsin->brow);
5351 	struct CTableColumn *pcol = &bindingsin->acolumns[col];
5352 
5353 	static const value_string STATUS[] = {
5354 		{0, "StoreStatusOk"},
5355 		{1, "StoreStatusDeferred"},
5356 		{2, "StoreStatusNull"},
5357 		{0, NULL}
5358 	};
5359 
5360 	const char *txt;
5361 	va_list ap;
5362 
5363 	va_start(ap, fmt);
5364 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5365 	va_end(ap);
5366 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_GetRowsColumn, &item, txt);
5367     proto_item_append_text(item, " (%s)", pcol->name);
5368 	if (pcol->statusused) {
5369 		int tmp_offset = buf_offset + pcol->statusoffset;
5370 		proto_tree_add_string(tree, hf_mswsp_ctablecolumn_status, tvb, tmp_offset, 1, val_to_str(tvb_get_guint8(tvb, tmp_offset), STATUS, "(Invalid: 0x%x)"));
5371 	}
5372 	if (pcol->lengthused) {
5373 		int tmp_offset = buf_offset + pcol->lengthoffset;
5374 		proto_tree_add_item(tree, hf_mswsp_ctablecolumn_length, tvb, tmp_offset, 1, ENC_LITTLE_ENDIAN);
5375 	}
5376 	if (pcol->valueused) {
5377 		int tmp_offset = buf_offset + pcol->valueoffset;
5378 		struct CRowVariant variant;
5379 		guint32 len = pcol->valuesize;
5380 		guint64 base_address = rowsin->ulclientbase;/*( + rowsin->cbreserved;*/
5381 		ZERO_STRUCT(variant);
5382 
5383 		if (pcol->lengthused) {
5384 			len = tvb_get_letohs(tvb, buf_offset + pcol->lengthoffset) - pcol->valuesize;
5385 		}
5386 		if (pcol->vtype == VT_VARIANT) {
5387 			parse_VariantCol(tvb, pinfo, tmp_offset, tree, base_address, len, b_is_64bit, &variant, "CRowVariant");
5388 		}
5389 	}
5390 	return offset;
5391 }
5392 
5393 static int parse_RowsBuffer(tvbuff_t *tvb, packet_info *pinfo, int offset, guint32 num_rows, struct CPMSetBindingsIn *bindingsin, struct rows_data *rowsin, gboolean is64bit, proto_tree *parent_tree, const char *fmt, ...)
5394 {
5395 	proto_tree *tree;
5396 	proto_item *item;
5397 	guint32 num;
5398 	const char *txt;
5399 	va_list ap;
5400 
5401 	va_start(ap, fmt);
5402 	txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5403 	va_end(ap);
5404 
5405 	tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_GetRowsRow, &item, txt);
5406 
5407 	for (num = 0; num < num_rows; ++num) {
5408 		guint32 col;
5409 		proto_tree *row_tree;
5410 		row_tree = proto_tree_add_subtree_format(tree, tvb, offset, 0, ett_GetRowsRow, NULL, "Row[%d]", num);
5411 		for (col = 0; col < bindingsin->ccolumns; col++) {
5412 			parse_RowsBufferCol(tvb, pinfo, offset, num, col, bindingsin, rowsin, is64bit, row_tree, "Col[%d]", col);
5413 		}
5414 	}
5415 	return offset;
5416 }
5417 /* Code to actually dissect the packets */
5418 
5419 static int dissect_CPMConnect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *private_data)
5420 {
5421 	proto_item *ti;
5422 	proto_tree *tree;
5423 	gint offset = 16;
5424 	guint len;
5425 	guint32 version;
5426 	struct message_data *data = NULL;
5427 	struct mswsp_ct *ct = NULL;
5428 
5429 	ti = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5430 	tree = proto_item_add_subtree(ti, ett_mswsp_msg);
5431 	proto_item_set_text(ti, "CPMConnect%s", in ? "In" : "Out");
5432 	col_append_str(pinfo->cinfo, COL_INFO, "Connect");
5433 
5434 	ti = proto_tree_add_item_ret_uint(tree, hf_mswsp_msg_Connect_Version, tvb,
5435 							 offset, 4, ENC_LITTLE_ENDIAN, &version);
5436 
5437 	ct = get_create_converstation_data(pinfo);
5438 
5439 	if (ct) {
5440 		data = find_or_create_message_data(ct, pinfo, 0xC8, in, private_data);
5441 		if (data) {
5442 			data->content.version = version;
5443 		}
5444 	}
5445 	offset += 4;
5446 
5447 	if (in) {
5448 		guint32 blob_size1_off, blob_size2_off;
5449 		proto_tree *pad_tree;
5450 
5451 		pad_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_mswsp_pad, &ti, "Padding");
5452 
5453 		proto_tree_add_item(tree, hf_mswsp_msg_ConnectIn_ClientIsRemote, tvb,
5454 							offset, 4, ENC_LITTLE_ENDIAN);
5455 		offset += 4;
5456 
5457 		/* _cbBlob1 */
5458 		blob_size1_off = offset;
5459 		offset += 4;
5460 
5461 		offset = parse_padding(tvb, offset, 8, pad_tree, "_paddingcbBlob2");
5462 
5463 		/* _cbBlob2 */
5464 		blob_size2_off = offset;
5465 		offset += 4;
5466 
5467 		offset = parse_padding(tvb, offset, 16, pad_tree, "_padding");
5468 
5469 		len = tvb_unicode_strsize(tvb, offset);
5470 		proto_tree_add_item(tree, hf_mswsp_msg_ConnectIn_MachineName, tvb,
5471 								 offset, len, ENC_LITTLE_ENDIAN | ENC_UCS_2);
5472 		offset += len;
5473 
5474 		len = tvb_unicode_strsize(tvb, offset);
5475 		ti = proto_tree_add_item(tree, hf_mswsp_msg_ConnectIn_UserName, tvb,
5476 								 offset, len, ENC_LITTLE_ENDIAN | ENC_UCS_2);
5477 		offset += len;
5478 
5479 		offset = parse_padding(tvb, offset, 8, pad_tree, "_paddingcPropSets");
5480 
5481 		offset = parse_PropertySetArray(tvb, pinfo, offset, blob_size1_off, tree, pad_tree, "PropSets");
5482 
5483 		offset = parse_padding(tvb, offset, 8, pad_tree, "paddingExtPropset");
5484 
5485 		offset = parse_PropertySetArray(tvb, pinfo, offset, blob_size2_off, tree, pad_tree, "ExtPropset");
5486 
5487 		offset = parse_padding(tvb, offset, 8, pad_tree, "???");
5488 
5489 		DISSECTOR_ASSERT(offset == (int)tvb_reported_length(tvb));
5490 
5491 		/* make "Padding" the last item */
5492 		proto_tree_move_item(tree, ti, proto_tree_get_parent(pad_tree));
5493 	} else {
5494 
5495 	}
5496 	return tvb_reported_length(tvb);
5497 }
5498 
5499 static int dissect_CPMDisconnect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, gboolean in _U_, void *data _U_)
5500 {
5501 	col_append_str(pinfo->cinfo, COL_INFO, "Disconnect");
5502 	return tvb_reported_length(tvb);
5503 }
5504 
5505 static int dissect_CPMCreateQuery(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
5506 {
5507 	gint offset = 16;
5508 	proto_item *item;
5509 	proto_tree *tree;
5510 
5511 	item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5512 	tree = proto_item_add_subtree(item, ett_mswsp_msg);
5513 
5514 	proto_item_set_text(item, "CPMCreateQuery%s", in ? "In" : "Out");
5515 	col_append_str(pinfo->cinfo, COL_INFO, "CreateQuery");
5516 
5517 	if (in) {
5518 		proto_item *ti;
5519 		proto_tree *pad_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_mswsp_pad, &ti, "Padding");
5520 		guint8 CColumnSetPresent, CRestrictionPresent, CSortSetPresent, CCategorizationSetPresent;
5521 		guint32 size = tvb_get_letohl(tvb, offset);
5522 		proto_tree_add_uint(tree, hf_mswsp_msg_cpmcreatequery_size, tvb, offset, 4, size);
5523 		offset += 4;
5524 
5525 		CColumnSetPresent = tvb_get_guint8(tvb, offset);
5526 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_ccolumnsetpresent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
5527 		offset += 1;
5528 
5529 		if (CColumnSetPresent) {
5530 			offset = parse_padding(tvb, offset, 4, pad_tree, "paddingCColumnSetPresent");
5531 			offset = parse_padding(tvb, offset, 4, pad_tree, "paddingCColumnSetPresent");
5532 			offset = parse_CColumnSet(tvb, offset, tree, "CColumnSet");
5533 		}
5534 
5535 		CRestrictionPresent = tvb_get_guint8(tvb, offset);
5536 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_crestrictionpresent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
5537 		offset += 1;
5538 
5539 		if (CRestrictionPresent) {
5540 			offset = parse_CRestrictionArray(tvb, pinfo, offset, tree, pad_tree, "RestrictionArray");
5541 		}
5542 
5543 		CSortSetPresent = tvb_get_guint8(tvb, offset);
5544 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_csortpresent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
5545 		offset += 1;
5546 
5547 		if (CSortSetPresent) {
5548 			offset = parse_padding(tvb, offset, 4, tree, "paddingCSortSetPresent");
5549 			offset = parse_CInGroupSortAggregSets(tvb, pinfo, offset, tree, pad_tree, "GroupSortAggregSets");
5550 
5551 		}
5552 
5553 		CCategorizationSetPresent = tvb_get_guint8(tvb, offset);
5554 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_ccategpresent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
5555 		offset += 1;
5556 
5557 		if (CCategorizationSetPresent) {
5558 			guint32 count, i;
5559 			offset = parse_padding(tvb, offset, 4, pad_tree, "paddingCCategorizationSetPresent");
5560 			/* 2.2.1.19 CCategorizationSet */
5561 			count = tvb_get_letohl(tvb, offset);
5562 			proto_tree_add_uint(tree, hf_mswsp_msg_cpmcreatequery_ccateg_count, tvb, offset, 4, count);
5563 			offset += 4;
5564 			for (i=0; i<count; i++) {
5565 				offset = parse_CCategorizationSpec(tvb, pinfo, offset, tree, pad_tree, "categories[%u]", i);
5566 			}
5567 		}
5568 
5569 		offset = parse_padding(tvb, offset, 4, tree, "XXXX");
5570 
5571 		offset = parse_CRowsetProperties(tvb, offset, tree, pad_tree, "RowSetProperties");
5572 
5573 		offset = parse_CPidMapper(tvb, offset, tree, pad_tree, "PidMapper");
5574 
5575 		parse_CColumnGroupArray(tvb, offset, tree, pad_tree, "GroupArray");
5576 	} else { /* out */
5577 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_trueseq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5578 		offset += 4;
5579 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_workid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5580 		offset += 4;
5581 		/*
5582 		     * #FIXME Cursors is an array of uint32 where the size of the array is
5583 		     * determined by categories in the CategorizationSet in the CPMQuery
5584 		     * request message.
5585 		     */
5586 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_cursors, tvb, offset, -1, ENC_NA);
5587 	}
5588 
5589 	return tvb_reported_length(tvb);
5590 }
5591 
5592 static int dissect_CPMFreeCursor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, gboolean in _U_, void *data _U_)
5593 {
5594 	col_append_str(pinfo->cinfo, COL_INFO, "FreeCursor");
5595 	return tvb_reported_length(tvb);
5596 }
5597 
5598 static int dissect_CPMGetRows(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *private_data)
5599 {
5600 	struct mswsp_ct *ct = NULL;
5601 	gint offset = 16;
5602 	proto_item *item;
5603 	proto_tree *tree;
5604 	proto_tree *seek_tree;
5605 	guint32 eType = 0;
5606 
5607 	item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, in ? 0 : -1, ENC_NA);
5608 	tree = proto_item_add_subtree(item, ett_mswsp_msg);
5609 
5610 	proto_item_set_text(item, "GetRows%s", in ? "In" : "Out");
5611 	col_append_str(pinfo->cinfo, COL_INFO, "GetRows");
5612 
5613 	ct = get_create_converstation_data(pinfo);
5614 	if (in) {
5615 		/* 2.2.3.11 */
5616 		struct message_data *data = NULL;
5617 
5618 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5619 		offset += 4;
5620 
5621 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_rowstotransfer, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5622 		offset += 4;
5623 
5624 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_rowwidth, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5625 		offset += 4;
5626 
5627 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_cbseek, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5628 		offset += 4;
5629 
5630 		data = find_or_create_message_data(ct, pinfo, 0xCC, in, private_data);
5631 		if (data) {
5632 			data->content.rowsin.cbreserved = tvb_get_letohl(tvb, offset);
5633 		}
5634 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_cbreserved, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5635 		offset += 4;
5636 
5637 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_cbreadbuffer, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5638 		offset += 4;
5639 
5640 		if (data) {
5641 			data->content.rowsin.ulclientbase = tvb_get_letohl(tvb, offset);
5642 		}
5643 
5644 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_ulclientbase, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5645 		offset += 4;
5646 
5647 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_fbwdfetch, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5648 		offset += 4;
5649 
5650 		eType = tvb_get_letohl(tvb, offset);
5651 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_etype, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5652 		offset += 4;
5653 
5654 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_chapt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5655 		offset += 4;
5656 
5657 		seek_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_SeekDescription, NULL, "SeekDescription");
5658 		switch (eType) {
5659 		case 0: /* eRowSeekNone */
5660 			break;
5661 		case 1: /* eRowSeekNext */
5662 			parse_CRowSeekNext(tvb, offset, seek_tree, "CRowSeekNext");
5663 			break;
5664 		case 2: /* eRowSeekAt */
5665 			parse_CRowSeekAt(tvb, offset, seek_tree, "CRowSeekAt");
5666 
5667 			break;
5668 		case 3: /* eRowSeekAtRatio */
5669 			parse_CRowSeekAtRatio(tvb, offset, seek_tree, "CRowSeekAtRatio");
5670 			break;
5671 		case 4: /* eRowSeekByBookmark */
5672 			parse_CRowSeekByBookmark(tvb, offset, seek_tree, "CRowSeekByRatio");
5673 			break;
5674 		default: /*error*/
5675 			break;
5676 		}
5677 	} else {
5678 		/* 2.2.3.12 */
5679 		/*
5680 		 * GetRows response needs information from GetRow & SetBindings
5681 		 * requests
5682 		 */
5683 		/* find the preceeding SetBinding data */
5684 		guint32 num_rows = 0;
5685 		proto_item *ti;
5686 		proto_tree *pad_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_mswsp_pad, &ti, "Padding");
5687 		struct CPMSetBindingsIn *bindingsin = find_binding_msg_data(ct, pinfo,
5688 											  private_data);
5689 		struct rows_data *rowsin = find_rowsin_msg_data(ct, pinfo, private_data);
5690 		gboolean b_64bit_mode = FALSE;
5691 		gboolean b_has_arch = is_64bit_mode(ct, pinfo, &b_64bit_mode, private_data);
5692 		num_rows = tvb_get_letohl(tvb, offset);
5693 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_crowsreturned, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5694 		offset += 4;
5695 
5696 		eType = tvb_get_letohl(tvb, offset);
5697 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_etype, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5698 		offset += 4;
5699 
5700 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_chapt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5701 		offset += 4;
5702 
5703 		seek_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_SeekDescription, NULL, "SeekDescription");
5704 		switch (eType) {
5705 		case 0: /* eRowSeekNone */
5706 			break;
5707 		case 1: /* eRowSeekNext */
5708 			parse_CRowSeekNext(tvb, offset, seek_tree, "CRowSeekNext");
5709 			break;
5710 		case 2: /* eRowSeekAt */
5711 			parse_CRowSeekAt(tvb, offset, seek_tree, "CRowSeekAt");
5712 
5713 			break;
5714 		case 3: /* eRowSeekAtRatio */
5715 			parse_CRowSeekAtRatio(tvb, offset, seek_tree, "CRowSeekAtRatio");
5716 			break;
5717 		case 4: /* eRowSeekByBookmark */
5718 			parse_CRowSeekByBookmark(tvb, offset, seek_tree, "CRowSeekByRatio");
5719 			break;
5720 		default: /*error*/
5721 			break;
5722 		}
5723 
5724 		if (b_has_arch && bindingsin && rowsin) {
5725 			offset = parse_padding(tvb, offset, rowsin->cbreserved, pad_tree,
5726 								   "paddingRows");
5727 			parse_RowsBuffer(tvb, pinfo, offset, num_rows, bindingsin, rowsin, b_64bit_mode, tree, "Rows");
5728 		} else {
5729 			gint nbytes = tvb_reported_length_remaining(tvb, offset);
5730 			proto_tree_add_expert_format(tree, pinfo, &ei_missing_msg_context, tvb, offset, nbytes, "Undissected %d bytes (due to missing preceding msg(s))", nbytes);
5731 		}
5732 	}
5733 
5734 	return tvb_reported_length(tvb);
5735 
5736 }
5737 
5738 static int dissect_CPMRatioFinished(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
5739 {
5740 	gint offset = 16;
5741 	proto_item *item;
5742 	proto_tree *tree;
5743 	col_append_str(pinfo->cinfo, COL_INFO, "RatioFinished");
5744 	item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5745 	tree = proto_item_add_subtree(item, ett_mswsp_msg);
5746 	proto_item_set_text(item, "RationFinised%s", in ? "In" : "Out");
5747 	if (in) {
5748 		proto_tree_add_item(tree, hf_mswsp_msg_cpmratiofinished_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5749 		offset += 4;
5750 		proto_tree_add_item(tree, hf_mswsp_msg_cpmratiofinished_fquick, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5751 	} else {
5752 		proto_tree_add_item(tree, hf_mswsp_msg_cpmratiofinished_ulnumerator, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5753 		offset += 4;
5754 		proto_tree_add_item(tree, hf_mswsp_msg_cpmratiofinished_uldenominator, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5755 		offset += 4;
5756 		proto_tree_add_item(tree, hf_mswsp_msg_cpmratiofinished_crows, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5757 		offset += 4;
5758 		proto_tree_add_item(tree, hf_mswsp_msg_cpmratiofinished_fnewrows, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5759 	}
5760 
5761 	return tvb_reported_length(tvb);
5762 }
5763 
5764 static int dissect_CPMCompareBmk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
5765 {
5766 	gint offset = 16;
5767 	proto_item *item;
5768 	proto_tree *tree;
5769 
5770 	item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, in ? 0 : -1, ENC_NA);
5771 	tree = proto_item_add_subtree(item, ett_mswsp_msg);
5772 
5773 	proto_item_set_text(item, "CompareBmk%s", in ? "In" : "Out");
5774 	col_append_str(pinfo->cinfo, COL_INFO, "CompareBmk");
5775 	if (in) {
5776 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcomparebmk_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5777 		offset += 4;
5778 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcomparebmk_chapt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5779 		offset += 4;
5780 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcomparebmk_bmkfirst, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5781 		offset += 4;
5782 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcomparebmk_bmksecond, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5783 	} else {
5784 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcomparebmk_dwcomparison, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5785 	}
5786 	return tvb_reported_length(tvb);
5787 }
5788 
5789 static int dissect_CPMGetApproximatePosition(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
5790 {
5791 	gint offset = 16;
5792 	proto_item *item;
5793 	proto_tree *tree;
5794 
5795 	item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, in ? 0 : -1, ENC_NA);
5796 	tree = proto_item_add_subtree(item, ett_mswsp_msg);
5797 
5798 	proto_item_set_text(item, "GetApproximatePosition%s", in ? "In" : "Out");
5799 	col_append_str(pinfo->cinfo, COL_INFO, "GetApproximatePosition");
5800 	if (in) {
5801 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetapproxpos_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5802 		offset += 4;
5803 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetapproxpos_chapt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5804 		offset += 4;
5805 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetapproxpos_bmk, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5806 	} else {
5807 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetapproxpos_numerator, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5808 		offset += 4;
5809 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetapproxpos_denominator, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5810 	}
5811 	return tvb_reported_length(tvb);
5812 }
5813 
5814 /* 2.2.3.10 */
5815 static int dissect_CPMSetBindings(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *private_data)
5816 {
5817 	gint offset = 16;
5818 	struct CPMSetBindingsIn request;
5819 
5820 	col_append_str(pinfo->cinfo, COL_INFO, "SetBindings");
5821 	if (in) {
5822 
5823 		struct mswsp_ct *ct = NULL;
5824 		struct message_data *data = NULL;
5825 		proto_item *ti;
5826 		proto_tree *tree, *pad_tree;
5827 		guint32 size, num, n;
5828 		gint64 column_size;
5829 
5830 		ti = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5831 		tree = proto_item_add_subtree(ti, ett_mswsp_msg);
5832 
5833 		proto_item_set_text(ti, "SetBindingsIn");
5834 
5835 		pad_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_mswsp_pad, &ti, "Padding");
5836 
5837 		proto_tree_add_item(tree, hf_mswsp_msg_cpmsetbinding_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5838 		request.hcursor = tvb_get_letohl(tvb, offset);
5839 		offset += 4;
5840 		request.brow = tvb_get_letohl(tvb, offset);
5841 		proto_tree_add_item(tree, hf_mswsp_msg_cpmsetbinding_cbrow, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5842 		offset += 4;
5843 
5844 		size = tvb_get_letohl(tvb, offset);
5845 		request.bbindingdesc = size;
5846 		proto_tree_add_item(tree, hf_mswsp_msg_cpmsetbinding_desc, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5847 		offset += 4;
5848 
5849 		request.dummy = tvb_get_letohl(tvb, offset);
5850 		proto_tree_add_item(tree, hf_mswsp_msg_cpmsetbinding_dummy, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5851 		offset += 4;
5852 
5853 		num = tvb_get_letohl(tvb, offset);
5854 		request.ccolumns = num;
5855 		ti = proto_tree_add_item(tree, hf_mswsp_msg_cpmsetbinding_ccolumns, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5856 		offset += 4;
5857 
5858 		proto_tree_add_item(tree, hf_mswsp_msg_cpmsetbinding_acolumns, tvb, offset, size-4, ENC_NA);
5859 
5860 		/* Sanity check size value */
5861 		column_size = num*MIN_CTABLECOL_SIZE;
5862 		if (num > MAX_CTABLECOL_SIZE || column_size > tvb_reported_length_remaining(tvb, offset))
5863 		{
5864 			expert_add_info(pinfo, ti, &ei_mswsp_msg_cpmsetbinding_ccolumns);
5865 			return tvb_reported_length(tvb);
5866 		}
5867 
5868 		ct = get_create_converstation_data(pinfo);
5869 
5870 		request.acolumns = (struct CTableColumn*)wmem_alloc(wmem_file_scope(),
5871 						   sizeof(struct CTableColumn) * num);
5872 		for (n=0; n<num; n++) {
5873 			offset = parse_padding(tvb, offset, 4, pad_tree, "padding_aColumns[%u]", n);
5874 			offset = parse_CTableColumn(tvb, pinfo, offset, tree, pad_tree, &request.acolumns[n],"aColumns[%u]", n);
5875 		}
5876 		data = find_or_create_message_data(ct, pinfo,0xD0,in, private_data);
5877 		if (data) {
5878 			data->content.bindingsin = request;
5879 		}
5880 
5881 	} else { /* server only returns status with header */
5882 	}
5883 
5884 	return tvb_reported_length(tvb);
5885 }
5886 
5887 static int dissect_CPMGetNotify(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, gboolean in _U_, void *data _U_)
5888 {
5889 	col_append_str(pinfo->cinfo, COL_INFO, "GetNotify");
5890 	return tvb_reported_length(tvb);
5891 }
5892 
5893 static int dissect_CPMSendNotifyOut(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in _U_, void *data _U_)
5894 {
5895 	gint offset = 16;
5896 	proto_item *item;
5897 	proto_tree *tree;
5898 
5899 	col_append_str(pinfo->cinfo, COL_INFO, "SendNotify");
5900 	item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5901 	tree = proto_item_add_subtree(item, ett_mswsp_msg);
5902 	proto_item_set_text(item, "GetSendNotifyOut");
5903 	proto_tree_add_item(tree, hf_mswsp_msg_cpmsendnotify_watchnotify, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5904 	return tvb_reported_length(tvb);
5905 }
5906 
5907 static int dissect_CPMGetQueryStatus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
5908 {
5909 	gint offset = 16;
5910 	proto_item *item;
5911 	proto_tree *tree;
5912 
5913 	item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5914 	tree = proto_item_add_subtree(item, ett_mswsp_msg);
5915 
5916 	proto_item_set_text(item, "GetQueryStatus%s", in ? "In" : "Out");
5917 	col_append_str(pinfo->cinfo, COL_INFO, "GetQueryStatus");
5918 
5919 	if (in) {
5920 		/* 2.2.3.7 */
5921 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetquerystatus_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5922 	} else {
5923 		/* 2.2.3.7 */
5924 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetquerystatus_qstatus, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5925 	}
5926 
5927 	return tvb_reported_length(tvb);
5928 }
5929 
5930 static int dissect_CPMCiState(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
5931 {
5932 	gint offset = 16;
5933 	proto_item *item;
5934 	proto_tree *tree;
5935 
5936 	col_append_str(pinfo->cinfo, COL_INFO, "CiState");
5937 
5938 	if (!in) {
5939 		item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5940 		tree = proto_item_add_subtree(item, ett_mswsp_msg);
5941 		proto_item_set_text(item, "CiStateOut");
5942 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cbstruct, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5943 		offset += 4;
5944 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cwordlist, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5945 		offset += 4;
5946 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cpersistindex, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5947 		offset += 4;
5948 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cqueries, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5949 		offset += 4;
5950 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cfreshtest, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5951 		offset += 4;
5952 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cfreshtest, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5953 		offset += 4;
5954 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_dwmergeprogress, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5955 		offset += 4;
5956 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_estate, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5957 		offset += 4;
5958 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cfiltereddocs, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5959 		offset += 4;
5960 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_ctotaldocs, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5961 		offset += 4;
5962 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cpendingscans, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5963 		offset += 4;
5964 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_dwindexsize, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5965 		offset += 4;
5966 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cuniquekeys, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5967 		offset += 4;
5968 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_csecqdocuments, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5969 		offset += 4;
5970 		proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_dwpropcachesize, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5971 	}
5972 	return tvb_reported_length(tvb);
5973 }
5974 
5975 static int dissect_CPMFetchValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
5976 {
5977 	gint offset = 16;
5978 	proto_item *item;
5979 	proto_tree *tree, *pad_tree;
5980 	col_append_str(pinfo->cinfo, COL_INFO, "FetchValue");
5981 
5982 	item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5983 	tree = proto_tree_add_subtree_format(parent_tree, tvb, offset, 0, ett_mswsp_msg, &item, "FetchValue%s", in ? "In" : "Out");
5984 	pad_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_mswsp_pad, NULL, "Padding");
5985 	if (in) {
5986 		struct CFullPropSpec prop;
5987 		proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_wid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5988 		offset += 4;
5989 		proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_cbsofar, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5990 		offset += 4;
5991 		proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_cbpropspec, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5992 		offset += 4;
5993 		proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_cbchunk, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5994 		offset += 4;
5995 		offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &prop,
5996 									 "PropSpec");
5997 		parse_padding(tvb, offset, 4, pad_tree,"_padding");
5998 	} else {
5999 		guint32 cbValue = tvb_get_letohl(tvb, offset);
6000 		proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_cbvalue, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6001 		offset += 4;
6002 		proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_fmoreexists, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6003 		offset += 4;
6004 		proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_fvalueexists, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6005 		offset += 4;
6006 		proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_vvalue, tvb, offset, cbValue, ENC_NA);
6007 	}
6008 	return tvb_reported_length(tvb);
6009 }
6010 
6011 static int dissect_CPMGetQueryStatusEx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
6012 {
6013 	gint offset = 16;
6014 	proto_item *item;
6015 	proto_tree *tree;
6016 
6017 	item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
6018 	tree = proto_item_add_subtree(item, ett_mswsp_msg);
6019 
6020 	proto_item_set_text(item, "GetQueryStatusEx%s", in ? "In" : "Out");
6021 	col_append_str(pinfo->cinfo, COL_INFO, "GetQueryStatusEx");
6022 
6023 	if (in) {
6024 		/* 2.2.3.8 */
6025 		proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6026 		offset += 4;
6027 		proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_bmk, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6028 	} else {
6029 		/* 2.2.3.9 */
6030 		proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_qstatus, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6031 		offset += 4;
6032 		proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_cfiltereddocs, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6033 		offset += 4;
6034 		proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_cdocstofilter, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6035 		offset += 4;
6036 		proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_dwratiodenom, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6037 		offset += 4;
6038 		proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_dwrationumer, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6039 		offset += 4;
6040 		proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_irowbmk, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6041 		offset += 4;
6042 		proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_crowstotal, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6043 		offset += 4;
6044 		proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_maxrank, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6045 		offset += 4;
6046 		proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_cresultsfound, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6047 		offset += 4;
6048 		proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_whereid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6049 	}
6050 	return tvb_reported_length(tvb);
6051 }
6052 
6053 static int dissect_CPMRestartPosition(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
6054 {
6055 	gint offset = 16;
6056 	proto_item *item;
6057 	proto_tree *tree;
6058 
6059 	col_append_str(pinfo->cinfo, COL_INFO, "CPMRestartPosition");
6060 
6061 	if (in) {
6062 		item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
6063 		tree = proto_item_add_subtree(item, ett_mswsp_msg);
6064 		proto_item_set_text(item, "CPMRestartPosition");
6065 		proto_tree_add_item(tree, hf_mswsp_msg_cpmrestartposition_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6066 		offset += 4;
6067 		proto_tree_add_item(tree, hf_mswsp_msg_cpmrestartposition_chapt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6068 	}
6069 
6070 	col_append_str(pinfo->cinfo, COL_INFO, "RestartPosition");
6071 	return tvb_reported_length(tvb);
6072 }
6073 
6074 static int dissect_CPMSetCatState(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, gboolean in _U_, void *data _U_)
6075 {
6076 	col_append_str(pinfo->cinfo, COL_INFO, "SetCatState");
6077 	return tvb_reported_length(tvb);
6078 }
6079 
6080 static int dissect_CPMGetRowsetNotify(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
6081 {
6082 	gint offset = 16;
6083 	proto_item *item;
6084 	proto_tree *tree;
6085 	col_append_str(pinfo->cinfo, COL_INFO, "GetRowsetNotify");
6086 	if (!in) {
6087 		item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
6088 		tree = proto_item_add_subtree(item, ett_mswsp_msg);
6089 		proto_item_set_text(item, "GetRowsetNotifyOut");
6090 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_wid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6091 		offset += 4;
6092 
6093 		/* moveevents */
6094 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_moreevents, tvb, offset, 1, ENC_LITTLE_ENDIAN);
6095 		/*  eventType */
6096 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_eventtype, tvb, offset, 1, ENC_LITTLE_ENDIAN);
6097 		offset += 1;
6098 
6099 		/* rowSetItemState */
6100 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_rowsetitemstate, tvb, offset, 1, ENC_LITTLE_ENDIAN);
6101 		offset += 1;
6102 
6103 		/* changedItemState */
6104 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_changeditemstate, tvb, offset, 1, ENC_LITTLE_ENDIAN);
6105 		offset += 1;
6106 
6107 		/* rowSetEvent */
6108 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_rowsetevent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
6109 		offset += 1;
6110 
6111 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_rowseteventdata1, tvb, offset, 8, ENC_LITTLE_ENDIAN);
6112 		offset += 8;
6113 		proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_rowseteventdata2, tvb, offset, 8, ENC_LITTLE_ENDIAN);
6114 		/* it seems there is an extra unknown 8 bytes following */
6115 	}
6116 	return tvb_reported_length(tvb);
6117 }
6118 
6119 static int dissect_CPMFindIndices(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
6120 {
6121 	gint offset = 16;
6122 	proto_item *item;
6123 	proto_tree *tree;
6124 	col_append_str(pinfo->cinfo, COL_INFO, "FindIndices");
6125 	item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
6126 	tree = proto_item_add_subtree(item, ett_mswsp_msg);
6127 	proto_item_set_text(item, "FindIndices%s", in ? "In" : "Out");
6128 
6129 	if (in) {
6130 		guint32 cWids;
6131 		guint32 cDepthPrev;
6132 		cWids = tvb_get_letohl(tvb, offset);
6133 		proto_tree_add_uint(tree, hf_mswsp_msg_cpmfindindices_cwids, tvb, offset, 4, cWids);
6134 		offset += 4;
6135 		cDepthPrev = tvb_get_letohl(tvb, offset);
6136 		proto_tree_add_uint(tree, hf_mswsp_msg_cpmfindindices_cdepthprev, tvb, offset, 4, cDepthPrev);
6137 		offset += 4;
6138 		offset = parse_uin32_array(tvb, offset, tree, cWids, "pwids");
6139 		parse_uin32_array(tvb, offset, tree, cDepthPrev, "prgiRowPrev");
6140 	} else {
6141 		guint32 cDepthNext;
6142 		cDepthNext = tvb_get_letohl(tvb, offset);
6143 		proto_tree_add_uint(tree, hf_mswsp_msg_cpmfindindices_cdepthnext, tvb, offset, 4, cDepthNext);
6144 		offset += 4;
6145 		parse_uin32_array(tvb, offset, tree, cDepthNext, "prgiRowNext");
6146 	}
6147 	return tvb_reported_length(tvb);
6148 }
6149 
6150 static int dissect_CPMSetScopePrioritization(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
6151 {
6152 	gint offset = 16;
6153 	proto_item *item;
6154 	proto_tree *tree;
6155 
6156 	col_append_str(pinfo->cinfo, COL_INFO, "SetScopePrioritization");
6157 
6158 	if (in) {
6159 		item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
6160 		tree = proto_item_add_subtree(item, ett_mswsp_msg);
6161 		proto_item_set_text(item, "SetScopePrioritizationIn");
6162 		proto_tree_add_item(tree, hf_mswsp_msg_cpmsetscopeprioritization_priority, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6163 		offset += 4;
6164 		proto_tree_add_item(tree, hf_mswsp_msg_cpmsetscopeprioritization_eventfreq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6165 	}
6166 	return tvb_reported_length(tvb);
6167 }
6168 
6169 static int dissect_CPMGetScopeStatistics(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolean in, void *data _U_)
6170 {
6171 
6172 	gint offset = 16;
6173 	proto_item *item;
6174 	proto_tree *tree;
6175 
6176 	item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, in ? 0 : -1, ENC_NA);
6177 	tree = proto_item_add_subtree(item, ett_mswsp_msg);
6178 
6179 	proto_item_set_text(item, "GetScopeStatistics%s", in ? "In" : "Out");
6180 	col_append_str(pinfo->cinfo, COL_INFO, "GetScopeStatistics");
6181 
6182 	if (in) {
6183 		/* 2.2.3.33 */
6184 	} else {
6185 		/* 2.2.3.34 */
6186 		proto_tree_add_item(tree, hf_mswsp_msg_cpmsetscopestatisics_dwindexitems, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6187 		offset += 4;
6188 		proto_tree_add_item(tree, hf_mswsp_msg_cpmsetscopestatisics_dwoutstandingadds, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6189 		offset += 4;
6190 		proto_tree_add_item(tree, hf_mswsp_msg_cpmsetscopestatisics_dwoutstandingmodifies, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6191 	}
6192 
6193 	return tvb_reported_length(tvb);
6194 }
6195 
6196 
6197 static const value_string msg_ids[] = {
6198 	{0x000000C8, "CPMConnect"},                /* In/Out */
6199 	{0x000000C9, "CPMDisconnect"},
6200 	{0x000000CA, "CPMCreateQuery"},            /* In/Out */
6201 	{0x000000CB, "CPMFreeCursor"},             /* In/Out */
6202 	{0x000000CC, "CPMGetRows"},                /* In/Out */
6203 	{0x000000CD, "CPMRatioFinished"},          /* In/Out */
6204 	{0x000000CE, "CPMCompareBmk"},             /* In/Out */
6205 	{0x000000CF, "CPMGetApproximatePosition"}, /* In/Out */
6206 	{0x000000D0, "CPMSetBindingsIn"},
6207 	{0x000000D1, "CPMGetNotify"},
6208 	{0x000000D2, "CPMSendNotifyOut"},
6209 	{0x000000D7, "CPMGetQueryStatusIn"},       /* In/Out */
6210 	{0x000000D9, "CPMCiStateInOut"},
6211 	{0x000000E4, "CPMFetchValue"},             /* In/Out */
6212 	{0x000000E7, "CPMGetQueryStatusEx"},       /* In/Out */
6213 	{0x000000E8, "CPMRestartPositionIn"},
6214 	{0x000000EC, "CPMSetCatStateIn"},          /* (not supported) */
6215 	{0x000000F1, "CPMGetRowsetNotify"},        /* In/Out */
6216 	{0x000000F2, "CPMFindIndices"},            /* In/Out */
6217 	{0x000000F3, "CPMSetScopePrioritization"}, /* In/Out */
6218 	{0x000000F4, "CPMGetScopeStatistics"},     /* In/Out */
6219 	{0, NULL}
6220 };
6221 
6222 
6223 static int
6224 dissect_mswsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean in, void *data)
6225 {
6226 	proto_tree *mswsp_tree = NULL;
6227 	proto_tree *hdr_tree;
6228 	proto_item *ti, *hti;
6229 	guint32 msg;
6230 	guint32 status;
6231 
6232 
6233 	if (tvb_reported_length(tvb) < 16) {
6234 		return 0;
6235 	}
6236 
6237 	/* col_set_str(pinfo->cinfo, COL_PROTOCOL, "MS-WSP"); */
6238 	col_append_str(pinfo->cinfo, COL_PROTOCOL, " WSP");
6239 	/*    col_clear(pinfo->cinfo, COL_INFO); */
6240 
6241 	col_set_str(pinfo->cinfo, COL_INFO, "WSP ");
6242 	col_append_str(pinfo->cinfo, COL_INFO, in ? "Request: " : "Response: ");
6243 
6244 	ti = proto_tree_add_item(tree, proto_mswsp, tvb, 0, -1, ENC_NA);
6245 	mswsp_tree = proto_item_add_subtree(ti, ett_mswsp);
6246 
6247 	hti = proto_tree_add_item(mswsp_tree, hf_mswsp_hdr, tvb, 0, 16, ENC_NA);
6248 	hdr_tree = proto_item_add_subtree(hti, ett_mswsp_hdr);
6249 
6250 	proto_tree_add_item_ret_uint(hdr_tree, hf_mswsp_hdr_msg, tvb,
6251 						0, 4, ENC_LITTLE_ENDIAN, &msg);
6252 	proto_item_append_text(hti, " %s", val_to_str(msg, VALS(msg_ids),
6253 						   "(Unknown: 0x%x)"));
6254 
6255 	proto_tree_add_item_ret_uint(hdr_tree, hf_mswsp_hdr_status, tvb,
6256 						4, 4, ENC_LITTLE_ENDIAN, &status);
6257 	if (!in || status != 0) {
6258 		proto_item_append_text(hti, " %s",
6259 							   val_to_str(status, VALS(dcom_hresult_vals),
6260 										  "(Unknown: 0x%x)"));
6261 	}
6262 
6263 	proto_tree_add_checksum(hdr_tree, tvb, 8, hf_mswsp_hdr_checksum, -1, NULL, pinfo, 0, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_NO_FLAGS);
6264 	/* todo: validate checksum */
6265 
6266 	proto_tree_add_item(hdr_tree, hf_mswsp_hdr_reserved, tvb,
6267 						12, 4, ENC_LITTLE_ENDIAN);
6268 
6269 
6270 	switch(msg) {
6271 	case 0xC8:
6272 		dissect_CPMConnect(tvb, pinfo, tree, in, data);
6273 		break;
6274 	case 0xC9:
6275 		dissect_CPMDisconnect(tvb, pinfo, tree, in, data);
6276 		break;
6277 	case 0xCA:
6278 		dissect_CPMCreateQuery(tvb, pinfo, tree, in, data);
6279 		break;
6280 	case 0xCB:
6281 		dissect_CPMFreeCursor(tvb, pinfo, tree, in, data);
6282 		break;
6283 	case 0xCC:
6284 		dissect_CPMGetRows(tvb, pinfo, tree, in, data);
6285 		break;
6286 	case 0xCD:
6287 		dissect_CPMRatioFinished(tvb, pinfo, tree, in, data);
6288 		break;
6289 	case 0xCE:
6290 		dissect_CPMCompareBmk(tvb, pinfo, tree, in, data);
6291 		break;
6292 	case 0xCF:
6293 		dissect_CPMGetApproximatePosition(tvb, pinfo, tree, in, data);
6294 		break;
6295 	case 0xD0:
6296 		dissect_CPMSetBindings(tvb, pinfo, tree, in, data);
6297 		break;
6298 	case 0xD1:
6299 		dissect_CPMGetNotify(tvb, pinfo, tree, in, data);
6300 		break;
6301 	case 0xD2:
6302 		dissect_CPMSendNotifyOut(tvb, pinfo, tree, in, data);
6303 		break;
6304 	case  0xD7:
6305 		dissect_CPMGetQueryStatus(tvb, pinfo, tree, in, data);
6306 		break;
6307 	case  0xD9:
6308 		dissect_CPMCiState(tvb, pinfo, tree, in, data);
6309 		break;
6310 	case  0xE4:
6311 		dissect_CPMFetchValue(tvb, pinfo, tree, in, data);
6312 		break;
6313 	case  0xE7:
6314 		dissect_CPMGetQueryStatusEx(tvb, pinfo, tree, in, data);
6315 		break;
6316 	case  0xE8:
6317 		dissect_CPMRestartPosition(tvb, pinfo, tree, in, data);
6318 		break;
6319 	case  0xEC:
6320 		 dissect_CPMSetCatState(tvb, pinfo, tree, in, data);
6321 		break;
6322 	case  0xF1:
6323 		dissect_CPMGetRowsetNotify(tvb, pinfo, tree, in, data);
6324 		break;
6325 	case  0xF2:
6326 		dissect_CPMFindIndices(tvb, pinfo, tree, in, data);
6327 		break;
6328 	case  0xF3:
6329 		dissect_CPMSetScopePrioritization(tvb, pinfo, tree, in, data);
6330 		break;
6331 	case  0xF4:
6332 		dissect_CPMGetScopeStatistics(tvb, pinfo, tree, in, data);
6333 		break;
6334 	default:
6335 		return 0;
6336 	}
6337 
6338 	/* Return the amount of data this dissector was able to dissect */
6339 	return tvb_reported_length(tvb);
6340 }
6341 
6342 
6343 void
6344 proto_register_mswsp(void)
6345 {
6346 	expert_module_t* expert_mswsp = NULL;
6347 	static hf_register_info hf[] = {
6348 		{
6349 			&hf_mswsp_hdr,
6350 			{
6351 				"Header", "mswsp.hdr",
6352 				FT_NONE, BASE_NONE, NULL, 0,
6353 				"Message header", HFILL
6354 			}
6355 		},
6356 		{
6357 			&hf_mswsp_hdr_msg,
6358 			{
6359 				"Msg id", "mswsp.hdr.id",
6360 				FT_UINT32, BASE_HEX, VALS(msg_ids), 0,
6361 				"Message id", HFILL
6362 			}
6363 		},
6364 		{
6365 			&hf_mswsp_hdr_status,
6366 			{
6367 				"Status", "mswsp.hdr.status",
6368 				FT_UINT32, BASE_HEX, VALS(dcom_hresult_vals), 0,
6369 				"Message Status", HFILL
6370 			}
6371 		},
6372 		{
6373 			&hf_mswsp_hdr_checksum,
6374 			{
6375 				"checksum", "mswsp.hdr.checksum",
6376 				FT_UINT32, BASE_HEX, NULL, 0,
6377 				"Message Checksum", HFILL
6378 			}
6379 		},
6380 		{
6381 			&hf_mswsp_hdr_reserved,
6382 			{
6383 				"Reserved", "mswsp.hdr.reserved",
6384 				FT_UINT32, BASE_HEX, NULL, 0,
6385 				"Reserved bytes", HFILL
6386 			}
6387 		},
6388 		{
6389 			&hf_mswsp_msg,
6390 			{
6391 				"msg", "mswsp.msg",
6392 				FT_NONE, BASE_NONE, NULL, 0,
6393 				"Message", HFILL
6394 			}
6395 		},
6396 		{
6397 			&hf_mswsp_msg_Connect_Version,
6398 			{
6399 				"Version", "mswsp.Connect.version",
6400 				FT_UINT32, BASE_HEX, VALS(version_vals), 0,
6401 				"OS Version", HFILL
6402 			}
6403 		},
6404 		{
6405 			&hf_mswsp_msg_ConnectIn_ClientIsRemote,
6406 			{
6407 				"Remote", "mswsp.ConnectIn.isRemote",
6408 				FT_BOOLEAN, BASE_HEX, NULL, 0,
6409 				"Client is remote",HFILL
6410 			}
6411 		},
6412 		{
6413 			&hf_mswsp_msg_ConnectIn_Blob1,
6414 			{
6415 				"Size", "mswsp.ConnectIn.propset.size",
6416 				FT_UINT32, BASE_DEC, NULL, 0,
6417 				"Size of PropSet fields",HFILL
6418 			}
6419 		},
6420 		{
6421 			&hf_mswsp_msg_ConnectIn_MachineName,
6422 			{
6423 				"Remote machine", "mswsp.ConnectIn.machine",
6424 				FT_STRINGZ, BASE_NONE, NULL, 0,
6425 				"Name of remote machine",HFILL
6426 			}
6427 		},
6428 		{
6429 			&hf_mswsp_msg_ConnectIn_UserName,
6430 			{
6431 				"User", "mswsp.ConnectIn.user",
6432 				FT_STRINGZ, BASE_NONE, NULL, 0,
6433 				"Name of remote user",HFILL
6434 			}
6435 		},
6436 		{
6437 			&hf_mswsp_msg_ConnectIn_PropSets_num,
6438 			{
6439 				"Num", "mswsp.ConnectIn.propset.num",
6440 				FT_UINT32, BASE_DEC, NULL, 0,
6441 				"Number of Property Sets", HFILL
6442 			}
6443 		},
6444 		{
6445 			&hf_mswsp_bool_options,
6446 			{
6447 				"uBooleanOptions", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions",
6448 				FT_UINT32, BASE_HEX, NULL, 0, "Boolean options", HFILL
6449 			}
6450 		},
6451 		{
6452 			&hf_mswsp_bool_options_cursor,
6453 			{
6454 				"Cursor", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.cursor", FT_UINT32,
6455 				BASE_HEX, VALS(cursor_vals), 0x00000007, "Cursor Type", HFILL
6456 			}
6457 		},
6458 		{
6459 			&hf_mswsp_bool_options_async,
6460 			{
6461 				"eAsynchronous", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eAsynchronous",
6462 				FT_BOOLEAN, 32, NULL, eAsynchronous, "The client will not wait for execution completion", HFILL
6463 			}
6464 		},
6465 		{
6466 			&hf_mswsp_bool_options_firstrows,
6467 			{
6468 				"eFirstRows", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eFirstRows",
6469 				FT_BOOLEAN, 32, NULL, eFirstRows, "Return the first rows encountered, not the best matches.", HFILL
6470 			}
6471 		},
6472 		{
6473 			&hf_mswsp_bool_options_holdrows,
6474 			{
6475 				"eHoldRows", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eHoldRows",
6476 				FT_BOOLEAN, 32, NULL, eHoldRows, "The server MUST NOT discard rows until the client is done with a query.", HFILL
6477 			}
6478 		},
6479 		{
6480 			&hf_mswsp_bool_options_chaptered,
6481 			{
6482 				"eChaptered", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eChaptered",
6483 				FT_BOOLEAN, 32, NULL, eChaptered, "The rowset supports chapters.", HFILL
6484 			}
6485 		},
6486 		{
6487 			&hf_mswsp_bool_options_useci,
6488 			{
6489 				"eUseCI", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eUseCI",
6490 				FT_BOOLEAN, 32, NULL, eUseCI, "Use the inverted index to evaluate content restrictions even if it is out of date.", HFILL
6491 			}
6492 		},
6493 		{
6494 			&hf_mswsp_bool_options_defertrim,
6495 			{
6496 				"eDeferTrimming", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eDeferTrimming",
6497 				FT_BOOLEAN, 32, NULL, eDeferTrimming, "Defer Non-indexed trimming operations like scoping or security checking which can be expensive.", HFILL
6498 			}
6499 		},
6500 		{
6501 			&hf_mswsp_bool_options_rowsetevents,
6502 			{
6503 				"eEnableRowsetEvents", "mswsp.RowSetProperties.CPMCreateQuery.uBooleanOptions.eEnableRowsetEvents",
6504 				FT_BOOLEAN, 32, NULL, eEnableRowsetEvents, "Enables storage of rowset events on the server side.", HFILL
6505 			}
6506 		},
6507 		{
6508 			&hf_mswsp_bool_options_dontcomputeexpensive,
6509 			{
6510 				"eDoNotComputeExpensiveProps", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eDoNotComputeExpensiveProps",
6511 				FT_BOOLEAN, 32, NULL, eDoNotComputeExpensiveProps, "Prevents computation of expensive properties.", HFILL
6512 			}
6513 		},
6514 		{
6515 			&hf_mswsp_guid_time_low,
6516 			{
6517 				"time-low", "mswsp.guid.time_low",
6518 				FT_UINT32, BASE_HEX, NULL, 0, "time low value", HFILL
6519 			}
6520 		},
6521 		{
6522 			&hf_mswsp_guid_time_mid,
6523 			{
6524 				"time-mid", "mswsp.guid.time_mid",
6525 				FT_UINT16, BASE_HEX, NULL, 0, "time mid value", HFILL
6526 			}
6527 		},
6528 		{
6529 			&hf_mswsp_guid_time_high,
6530 			{
6531 				"time-high", "mswsp.guid.time_high",
6532 				FT_UINT16, BASE_HEX, NULL, 0, "time high value", HFILL
6533 			}
6534 		},
6535 		{
6536 			&hf_mswsp_guid_time_clock_hi,
6537 			{
6538 				"clock_seq_hi_and_reserved", "mswsp.guid.time_clock_high",
6539 				FT_UINT8, BASE_HEX, NULL, 0, "time clock high value", HFILL
6540 			}
6541 		},
6542 		{
6543 			&hf_mswsp_guid_time_clock_low,
6544 			{
6545 				"clock_seq_low", "mswsp.guid.time_clock_low",
6546 				FT_UINT8, BASE_HEX, NULL, 0, "time clock high low", HFILL
6547 			}
6548 		},
6549 		{
6550 			&hf_mswsp_guid_node,
6551 			{
6552 				"node", "mswsp.guid.node",
6553 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6554 			}
6555 		},
6556 		{
6557 			&hf_mswsp_lcid,
6558 			{
6559 				"lcid", "mswsp.lcid",
6560 				FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6561 			}
6562 		},
6563 		{
6564 			&hf_mswsp_lcid_sortid,
6565 			{
6566 				"Sort ID", "mswsp.lcid.sortid",
6567 				FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
6568 			}
6569 		},
6570 		{
6571 			&hf_mswsp_lcid_langid,
6572 			{
6573 				"Language ID", "mswsp.lcid.langid",
6574 				FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
6575 			}
6576 		},
6577 		{
6578 			&hf_mswsp_cscort_column,
6579 			{
6580 				"column", "mswsp.csort.column",
6581 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6582 			}
6583 		},
6584 		{
6585 			&hf_mswsp_cscort_order,
6586 			{
6587 				"order", "mswsp.csort.order",
6588 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6589 			}
6590 		},
6591 		{
6592 			&hf_mswsp_cscort_individual,
6593 			{
6594 				"individual", "mswsp.csort.individual",
6595 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6596 			}
6597 		},
6598 		{
6599 			&hf_mswsp_cscortset_count,
6600 			{
6601 				"count", "mswsp.csortset.count",
6602 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6603 			}
6604 		},
6605 		{
6606 			&hf_mswsp_ctablecolumn_vtype,
6607 			{
6608 				"vType", "mswsp.ctablecolumn.vtype",
6609 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6610 			}
6611 		},
6612 		{
6613 			&hf_mswsp_ctablecolumn_aggused,
6614 			{
6615 				"AggregateUsed", "mswsp.ctablecolumn.aggused",
6616 				FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
6617 			}
6618 		},
6619 		{
6620 			&hf_mswsp_ctablecolumn_aggtype,
6621 			{
6622 				"AggregateType", "mswsp.ctablecolumn.aggtype",
6623 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6624 			}
6625 		},
6626 		{
6627 			&hf_mswsp_ctablecolumn_valused,
6628 			{
6629 				"ValueUsed", "mswsp.ctablecolumn.valused",
6630 				FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
6631 			}
6632 		},
6633 		{
6634 			&hf_mswsp_ctablecolumn_valoffset,
6635 			{
6636 				"ValueOffset", "mswsp.ctablecolumn.valoffset",
6637 				FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
6638 			}
6639 		},
6640 		{
6641 			&hf_mswsp_ctablecolumn_valsize,
6642 			{
6643 				"ValueSize", "mswsp.ctablecolumn.valsize",
6644 				FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
6645 			}
6646 		},
6647 		{
6648 			&hf_mswsp_ctablecolumn_statused,
6649 			{
6650 				"StatusUsed", "mswsp.ctablecolumn.statused",
6651 				FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
6652 			}
6653 		},
6654 		{
6655 			&hf_mswsp_ctablecolumn_statoffset,
6656 			{
6657 				"StatusOffset", "mswsp.ctablecolumn.statoffset",
6658 				FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
6659 			}
6660 		},
6661 		{
6662 			&hf_mswsp_ctablecolumn_lenused,
6663 			{
6664 				"LengthUsed", "mswsp.ctablecolumn.lenused",
6665 				FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
6666 			}
6667 		},
6668 		{
6669 			&hf_mswsp_ctablecolumn_lenoffset,
6670 			{
6671 				"LengthOffset", "mswsp.ctablecolumn.lenoffset",
6672 				FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
6673 			}
6674 		},
6675 		{
6676 			&hf_mswsp_cfullpropspec_kind,
6677 			{
6678 				"ulKind", "mswsp.cfullpropspec.kind",
6679 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6680 			}
6681 		},
6682 		{
6683 			&hf_mswsp_cfullpropspec_propid,
6684 			{
6685 				"propid", "mswsp.cfullpropspec.propid",
6686 				FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6687 			}
6688 		},
6689 		{
6690 			&hf_mswsp_cfullpropspec_propname,
6691 			{
6692 				"propname", "mswsp.cfullpropspec.propname",
6693 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6694 			}
6695 		},
6696 		{
6697 			&hf_mswsp_cproprestrict_relop,
6698 			{
6699 				"relop", "mswsp.cproprestrict.relop",
6700 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6701 			}
6702 		},
6703 		{
6704 			&hf_mswsp_ccoercerestrict_value,
6705 			{
6706 				"value", "mswsp.ccoercerestrict.value",
6707 				FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL
6708 			}
6709 		},
6710 		{
6711 			&hf_mswsp_ccontentrestrict_cc,
6712 			{
6713 				"cc", "mswsp.ccontentrestrict.cc",
6714 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6715 			}
6716 		},
6717 		{
6718 			&hf_mswsp_ccontentrestrict_phrase,
6719 			{
6720 				"phrase", "mswsp.ccontentrestrict.phrase",
6721 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6722 			}
6723 		},
6724 		{
6725 			&hf_mswsp_ccontentrestrict_method,
6726 			{
6727 				"method", "mswsp.ccontentrestrict.method",
6728 				FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6729 			}
6730 		},
6731 		{
6732 			&hf_mswsp_natlangrestrict_cc,
6733 			{
6734 				"cc", "mswsp.ccontentrestrict.cc",
6735 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6736 			}
6737 		},
6738 		{
6739 			&hf_mswsp_natlangrestrict_phrase,
6740 			{
6741 				"phrase", "mswsp.ccontentrestrict.phrase",
6742 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6743 			}
6744 		},
6745 		{
6746 			&hf_mswsp_crestrict_ultype,
6747 			{
6748 				"ulType", "mswsp.crestrict.ultype",
6749 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6750 			}
6751 		},
6752 		{
6753 			&hf_mswsp_crestrict_weight,
6754 			{
6755 				"Weight", "mswsp.crestrict.weight",
6756 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6757 			}
6758 		},
6759 		{
6760 			&hf_mswsp_crestrictarray_count,
6761 			{
6762 				"count", "mswsp.crestrictarray.count",
6763 				FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
6764 			}
6765 		},
6766 		{
6767 			&hf_mswsp_crestrictarray_present,
6768 			{
6769 				"present", "mswsp.crestrictarray.present",
6770 				FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
6771 			}
6772 		},
6773 		{
6774 			&hf_mswsp_cnoderestrict_cnode,
6775 			{
6776 				"Weight", "mswsp.cnoderestrict.cnode",
6777 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6778 			}
6779 		},
6780 		{
6781 			&hf_mswsp_cbasestorvariant_vtype,
6782 			{
6783 				"vType", "mswsp.cbasestorvariant.vtype",
6784 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6785 			}
6786 		},
6787 		{
6788 			&hf_mswsp_cbasestorvariant_vvalue,
6789 			{
6790 				"vValue", "mswsp.cbasestorvariant.vvalue",
6791 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6792 			}
6793 		},
6794 		{
6795 			&hf_mswsp_cbasestorvariant_vdata1,
6796 			{
6797 				"vData1", "mswsp.cbasestorvariant.vdata1",
6798 				FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
6799 			}
6800 		},
6801 		{
6802 			&hf_mswsp_cbasestorvariant_vdata2,
6803 			{
6804 				"vData2", "mswsp.cbasestorvariant.vdata2",
6805 				FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
6806 			}
6807 		},
6808 		{
6809 			&hf_mswsp_cbasestorvariant_num,
6810 			{
6811 				"num", "mswsp.cbasestorvariant.num",
6812 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6813 			}
6814 		},
6815 		{
6816 			&hf_mswsp_cbasestorvariant_cdims,
6817 			{
6818 				"cDims", "mswsp.cbasestorvariant.cdims",
6819 				FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL
6820 			}
6821 		},
6822 		{
6823 			&hf_mswsp_cbasestorvariant_ffeatures,
6824 			{
6825 				"fFeatures", "mswsp.cbasestorvariant.ffeatures",
6826 				FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL
6827 			}
6828 		},
6829 		{
6830 			&hf_mswsp_cbasestorvariant_cbelements,
6831 			{
6832 				"cbElements", "mswsp.cbasestorvariant.cbelements",
6833 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6834 			}
6835 		},
6836 		{
6837 			&hf_mswsp_cbasestorvariant_rgsabound,
6838 			{
6839 				"Rgsabound", "mswsp.cbasestorvariant.rgsabound",
6840 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6841 			}
6842 		},
6843 		{
6844 			&hf_mswsp_cdbcolid_ekind,
6845 			{
6846 				"eKind", "mswsp.cdbcolid.ekind",
6847 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6848 			}
6849 		},
6850 		{
6851 			&hf_mswsp_cdbcolid_ulid,
6852 			{
6853 				"ulId", "mswsp.cdbcolid.ulid",
6854 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6855 			}
6856 		},
6857 		{
6858 			&hf_mswsp_cdbcolid_vstring,
6859 			{
6860 				"vString", "mswsp.cdbcolid.vstring",
6861 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6862 			}
6863 		},
6864 		{
6865 			&hf_mswsp_cdbprop_id,
6866 			{
6867 				"Id", "mswsp.cdbprop.id",
6868 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6869 			}
6870 		},
6871 		{
6872 			&hf_mswsp_cdbprop_options,
6873 			{
6874 				"Options", "mswsp.cdbprop.options",
6875 				FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6876 			}
6877 		},
6878 		{
6879 			&hf_mswsp_cdbprop_status,
6880 			{
6881 				"Status", "mswsp.cdbprop.status",
6882 				FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6883 			}
6884 		},
6885 		{
6886 			&hf_mswsp_cdbpropset_cprops,
6887 			{
6888 				"cProperties", "mswsp.cdbpropset.cprops",
6889 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6890 			}
6891 		},
6892 		{
6893 			&hf_mswsp_rangeboundry_ultype,
6894 			{
6895 				"ulType", "mswsp.rangeboundry.ultype",
6896 				FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6897 			}
6898 		},
6899 		{
6900 			&hf_mswsp_rangeboundry_labelpresent,
6901 			{
6902 				"labelPresent", "mswsp.rangeboundry.labelpresent",
6903 				FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL
6904 			}
6905 		},
6906 		{
6907 			&hf_mswsp_rangeboundry_cclabel,
6908 			{
6909 				"ccLabel", "mswsp.rangeboundry.cclabel",
6910 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6911 			}
6912 		},
6913 		{
6914 			&hf_mswsp_rangeboundry_label,
6915 			{
6916 				"Label", "mswsp.rangeboundry.label",
6917 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6918 			}
6919 		},
6920 		{
6921 			&hf_mswsp_crangecategspec_crange,
6922 			{
6923 				"cRange", "mswsp.crangecategspec.crange",
6924 				FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6925 			}
6926 		},
6927 		{
6928 			&hf_mswsp_ccategspec_type,
6929 			{
6930 				"type", "mswsp.ccategspec.type",
6931 				FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
6932 			}
6933 		},
6934 		{
6935 			&hf_mswsp_caggregspec_type,
6936 			{
6937 				"type", "mswsp.caggregspec.type",
6938 				FT_UINT8, BASE_DEC, VALS(DBAGGTTYPE), 0, NULL, HFILL
6939 			}
6940 		},
6941 		{
6942 			&hf_mswsp_caggregspec_ccalias,
6943 			{
6944 				"ccAlias", "mswsp.caggregspec.ccalias",
6945 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6946 			}
6947 		},
6948 		{
6949 			&hf_mswsp_caggregspec_alias,
6950 			{
6951 				"Alias", "mswsp.caggregspec.alias",
6952 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6953 			}
6954 		},
6955 		{
6956 			&hf_mswsp_caggregspec_idcolumn,
6957 			{
6958 				"idColumn", "mswsp.caggregspec.idcolumn",
6959 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6960 			}
6961 		},
6962 		{
6963 			&hf_mswsp_caggregspec_ulmaxnumtoreturn,
6964 			{
6965 				"ulMaxNumToReturn",
6966 				"mswsp.caggregspec.ulmaxnumtoreturn",
6967 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6968 			}
6969 		},
6970 		{
6971 			&hf_mswsp_caggregspec_idrepresentative,
6972 			{
6973 				"idRepresentative",
6974 				"mswsp.caggregspec.idrepresentative",
6975 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6976 			}
6977 		},
6978 		{
6979 			&hf_mswsp_caggregset_count,
6980 			{
6981 				"count", "mswsp.caggregset.count",
6982 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6983 			}
6984 		},
6985 		{
6986 			&hf_mswsp_caggregsortkey_order,
6987 			{
6988 				"order", "mswsp.caggregsortkey.order",
6989 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6990 			}
6991 		},
6992 		{
6993 			&hf_mswsp_csortaggregset_count,
6994 			{
6995 				"count", "mswsp.csortaggregset.count",
6996 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6997 			}
6998 		},
6999 		{
7000 			&hf_mswsp_cingroupsortaggregset_type,
7001 			{
7002 				"Type", "mswsp.cingroupsortaggregset.type",
7003 				FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
7004 			}
7005 		},
7006 		{
7007 			&hf_mswsp_cingroupsortaggregsets_count,
7008 			{
7009 				"count", "mswsp.cingroupsortaggregsets.count",
7010 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7011 			}
7012 		},
7013 		{
7014 			&hf_mswsp_categorizationspec_cmaxres,
7015 			{
7016 				"cMaxResults", "mswsp.categorizationspec.cmaxres",
7017 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7018 			}
7019 		},
7020 		{
7021 			&hf_mswsp_crowsetprops_ulmaxopenrows,
7022 			{
7023 				"ulMaxOpenRows (ignored)", "mswsp.crowsetprops.ulmaxopenrows",
7024 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7025 			}
7026 		},
7027 		{
7028 			&hf_mswsp_crowsetprops_ulmemusage,
7029 			{
7030 				"ulMemUsage (ignored)", "mswsp.crowsetprops.ulmemusage",
7031 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7032 			}
7033 		},
7034 		{
7035 			&hf_mswsp_crowsetprops_cmaxresults,
7036 			{
7037 				"cMaxResults", "mswsp.crowsetprops.cmaxresults",
7038 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7039 			}
7040 		},
7041 		{
7042 			&hf_mswsp_crowsetprops_ccmdtimeout,
7043 			{
7044 				"cCmdTimeout", "mswsp.crowsetprops.ccmdtimeout",
7045 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7046 			}
7047 		},
7048 		{
7049 			&hf_mswsp_cpidmapper_count,
7050 			{
7051 				"count", "mswsp.cpidmapper.count",
7052 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7053 			}
7054 		},
7055 		{
7056 			&hf_mswsp_ccolumngroup_count,
7057 			{
7058 				"count", "mswsp.ccolumngroup.count",
7059 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7060 			}
7061 		},
7062 		{
7063 			&hf_mswsp_ccolumngroup_grouppid,
7064 			{
7065 				"groupPid", "mswsp.ccolumngroup.grouppid",
7066 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7067 			}
7068 		},
7069 		{
7070 			&hf_mswsp_ccolumngroup_pid,
7071 			{
7072 				"pid", "mswsp.ccolumngroup.pid",
7073 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7074 			}
7075 		},
7076 		{
7077 			&hf_mswsp_ccolumngrouparray_count,
7078 			{
7079 				"count", "mswsp.ccolumngrouparray.count",
7080 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7081 			}
7082 		},
7083 		{
7084 			&hf_mswsp_int32array_value,
7085 			{
7086 				"value", "mswsp.int32array.value",
7087 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7088 			}
7089 		},
7090 		{
7091 			&hf_mswsp_crowseeknext_cskip,
7092 			{
7093 				"cskip", "mswsp.crowseeknext.cskip",
7094 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7095 			}
7096 		},
7097 		{
7098 			&hf_mswsp_crowseekat_bmkoffset,
7099 			{
7100 				"bmkoffset", "mswsp.crowseekat.bmkoffset",
7101 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7102 			}
7103 		},
7104 		{
7105 			&hf_mswsp_crowseekat_skip,
7106 			{
7107 				"skip", "mswsp.crowseekat.skip",
7108 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7109 			}
7110 		},
7111 		{
7112 			&hf_mswsp_crowseekat_hregion,
7113 			{
7114 				"hregion", "mswsp.crowseekat.hregion",
7115 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7116 			}
7117 		},
7118 		{
7119 			&hf_mswsp_crowseekatratio_ulnumerator,
7120 			{
7121 				"ulnumerator", "mswsp.crowseekatratio.ulnumerator",
7122 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7123 			}
7124 		},
7125 		{
7126 			&hf_mswsp_crowseekatratio_uldenominator,
7127 			{
7128 				"uldenominator", "mswsp.crowseekatratio.uldenominator",
7129 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7130 			}
7131 		},
7132 		{
7133 			&hf_mswsp_crowseekatratio_hregion,
7134 			{
7135 				"hregion", "mswsp.crowseekatratio.hregion",
7136 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7137 			}
7138 		},
7139 		{
7140 			&hf_mswsp_crowseekbybookmark_cbookmarks,
7141 			{
7142 				"cbookmarks", "mswsp.crowseekbybookmark.cbookmarks",
7143 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7144 			}
7145 		},
7146 		{
7147 			&hf_mswsp_crowseekbybookmark_maxret,
7148 			{
7149 				"maxret", "mswsp.crowseekbybookmark.maxret",
7150 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7151 			}
7152 		},
7153 		{
7154 			&hf_mswsp_crowvariantinfo_count64,
7155 			{
7156 				"count", "mswsp.crowvariantinfo.count64",
7157 				FT_UINT64, BASE_DEC, NULL, 0, NULL, HFILL
7158 			}
7159 		},
7160 		{
7161 			&hf_mswsp_arrayvector_address64,
7162 			{
7163 				"address of array", "mswsp.arrayvector.address64",
7164 				FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL
7165 			}
7166 		},
7167 		{
7168 			&hf_mswsp_crowvariantinfo_count32,
7169 			{
7170 				"count", "mswsp.crowvariantinfo.count32",
7171 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7172 			}
7173 		},
7174 		{
7175 			&hf_mswsp_arrayvector_address32,
7176 			{
7177 				"address of array", "mswsp.arrayvector.address",
7178 				FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
7179 			}
7180 		},
7181 		{
7182 			&hf_mswsp_rowvariant_item_address64,
7183 			{
7184 				"address", "mswsp.rowvariant.item.address64",
7185 				FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL
7186 			}
7187 		},
7188 		{
7189 			&hf_mswsp_rowvariant_item_address32,
7190 			{
7191 				"address", "mswsp.rowvariant.item.address32",
7192 				FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
7193 			}
7194 		},
7195 		{
7196 			&hf_mswsp_rowvariant_item_value,
7197 			{
7198 				"value", "mswsp.rowvariant.item.value",
7199 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
7200 			}
7201 		},
7202 		{
7203 			&hf_mswsp_rowvariant_vtype,
7204 			{
7205 				"vtype", "mswsp.rowvariant.vtype",
7206 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
7207 			}
7208 		},
7209 		{
7210 			&hf_mswsp_rowvariant_reserved1,
7211 			{
7212 				"reserved1", "mswsp.rowvariant.reserved1",
7213 				FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
7214 			}
7215 		},
7216 		{
7217 			&hf_mswsp_rowvariant_reserved2,
7218 			{
7219 				"reserved2", "mswsp.rowvariant.reserved2",
7220 				FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
7221 			}
7222 		},
7223 		{
7224 			&hf_mswsp_ctablecolumn_status,
7225 			{
7226 				"status", "mswsp.ctablecolumn.name",
7227 				FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
7228 			}
7229 		},
7230 		{
7231 			&hf_mswsp_ctablecolumn_length,
7232 			{
7233 				"length", "mswsp.ctablecolumn.length",
7234 				FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
7235 			}
7236 		},
7237 		{
7238 			&hf_mswsp_msg_cpmcreatequery_size,
7239 			{
7240 				"size", "mswsp.cpmcreatequery.size",
7241 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7242 			}
7243 		},
7244 		{
7245 			&hf_mswsp_msg_cpmcreatequery_ccolumnsetpresent,
7246 			{
7247 				"CColumnSetPresent", "mswsp.cpmcreatequery.ccolumnsetpresent",
7248 				FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL
7249 			}
7250 		},
7251 		{
7252 			&hf_mswsp_msg_cpmcreatequery_crestrictionpresent,
7253 			{
7254 				"CRestrictionPresent", "mswsp.cpmcreatequery.crestrictionpresent",
7255 				FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL
7256 			}
7257 		},
7258 		{
7259 			&hf_mswsp_msg_cpmcreatequery_csortpresent,
7260 			{
7261 				"CSortPresent", "mswsp.cpmcreatequery.csortpresent",
7262 				FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL
7263 			}
7264 		},
7265 		{
7266 			&hf_mswsp_msg_cpmcreatequery_ccategpresent,
7267 			{
7268 				"CCategorizationSetPresent", "mswsp.cpmcreatequery.ccategpresent",
7269 				FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL
7270 			}
7271 		},
7272 		{
7273 			&hf_mswsp_msg_cpmcreatequery_ccateg_count,
7274 			{
7275 				"count", "mswsp.cpmcreatequery.ccateg.count",
7276 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7277 			}
7278 		},
7279 		{
7280 			&hf_mswsp_msg_cpmcreatequery_trueseq,
7281 			{
7282 				"TrueSequential", "mswsp.cpmcreatequery.trueseq",
7283 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7284 			}
7285 		},
7286 		{
7287 			&hf_mswsp_msg_cpmcreatequery_workid,
7288 			{
7289 				"WorkId", "mswsp.cpmcreatequery.workid",
7290 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7291 			}
7292 		},
7293 		{
7294 			&hf_mswsp_msg_cpmcreatequery_cursors,
7295 			{
7296 				"Cursors", "mswsp.cpmcreatequery.cursors",
7297 				FT_BYTES, SEP_SPACE, NULL, 0, NULL, HFILL
7298 			}
7299 		},
7300 		{
7301 			&hf_mswsp_msg_cpmgetrows_hcursor,
7302 			{
7303 				"hCursor", "mswsp.msg.cpmgetrows.hcursor",
7304 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7305 			}
7306 		},
7307 		{
7308 			&hf_mswsp_msg_cpmgetrows_rowstotransfer,
7309 			{
7310 				"cRowsToTransfer", "mswsp.msg.cpmgetrows.rowstotransfer",
7311 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7312 			}
7313 		},
7314 		{
7315 			&hf_mswsp_msg_cpmgetrows_rowwidth,
7316 			{
7317 				"cbRowWidth", "mswsp.msg.cpmgetrows.rowswidth",
7318 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7319 			}
7320 		},
7321 		{
7322 			&hf_mswsp_msg_cpmgetrows_cbseek,
7323 			{
7324 				"cbSeek", "mswsp.msg.cpmgetrows.cbseek",
7325 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7326 			}
7327 		},
7328 		{
7329 			&hf_mswsp_msg_cpmgetrows_cbreserved,
7330 			{
7331 				"cbReserved", "mswsp.msg.cpmgetrows.cbreserved",
7332 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7333 			}
7334 		},
7335 		{
7336 			&hf_mswsp_msg_cpmgetrows_cbreadbuffer,
7337 			{
7338 				"cbReadBuffer", "mswsp.msg.cpmgetrows.cbreadbuffer",
7339 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7340 			}
7341 		},
7342 		{
7343 			&hf_mswsp_msg_cpmgetrows_ulclientbase,
7344 			{
7345 				"ulClientBase", "mswsp.msg.cpmgetrows.ulclientbase",
7346 				FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
7347 			}
7348 		},
7349 		{
7350 			&hf_mswsp_msg_cpmgetrows_fbwdfetch,
7351 			{
7352 				"fBwdFetch", "mswsp.msg.cpmgetrows.fbwdfetch",
7353 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7354 			}
7355 		},
7356 		{
7357 			&hf_mswsp_msg_cpmgetrows_etype,
7358 			{
7359 				"eType", "mswsp.msg.cpmgetrows.etype",
7360 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7361 			}
7362 		},
7363 		{
7364 			&hf_mswsp_msg_cpmgetrows_chapt,
7365 			{
7366 				"chapt", "mswsp.msg.cpmgetrows.chapt",
7367 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7368 			}
7369 		},
7370 		{
7371 			&hf_mswsp_msg_cpmgetrows_crowsreturned,
7372 			{
7373 				"cRowsReturned", "mswsp.msg.cpmgetrows.crowsreturned",
7374 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7375 			}
7376 		},
7377 		{
7378 			&hf_mswsp_msg_cpmratiofinished_hcursor,
7379 			{
7380 				"hCursor", "mswsp.msg.cpmratiofinished_hcursor",
7381 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7382 			}
7383 		},
7384 		{
7385 			&hf_mswsp_msg_cpmratiofinished_fquick,
7386 			{
7387 				"fQuick", "mswsp.msg.cpmratiofinished_fquick",
7388 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7389 			}
7390 		},
7391 		{
7392 			&hf_mswsp_msg_cpmratiofinished_ulnumerator,
7393 			{
7394 				"ulNumerator", "mswsp.msg.cpmratiofinished_ulnumerator",
7395 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7396 			}
7397 		},
7398 		{
7399 			&hf_mswsp_msg_cpmratiofinished_uldenominator,
7400 			{
7401 				"ulDenominator", "mswsp.msg.cpmratiofinished_uldenominator",
7402 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7403 			}
7404 		},
7405 		{
7406 			&hf_mswsp_msg_cpmratiofinished_crows,
7407 			{
7408 				"cRows", "mswsp.msg.cpmratiofinished_crows",
7409 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7410 			}
7411 		},
7412 		{
7413 			&hf_mswsp_msg_cpmratiofinished_fnewrows,
7414 			{
7415 				"fNewRows", "mswsp.msg.cpmratiofinished_fnewrows",
7416 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7417 			}
7418 		},
7419 		{
7420 			&hf_mswsp_msg_cpmcomparebmk_hcursor,
7421 			{
7422 				"hCursor", "mswsp.msg.cpmcomparebmk.hcursor",
7423 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7424 			}
7425 		},
7426 		{
7427 			&hf_mswsp_msg_cpmcomparebmk_chapt,
7428 			{
7429 				"chapt", "mswsp.msg.cpmcomparebmk.chapt",
7430 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7431 			}
7432 		},
7433 		{
7434 			&hf_mswsp_msg_cpmcomparebmk_bmkfirst,
7435 			{
7436 				"bmkFirst", "mswsp.msg.cpmcomparebmk.bmkfirst",
7437 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7438 			}
7439 		},
7440 		{
7441 			&hf_mswsp_msg_cpmcomparebmk_bmksecond,
7442 			{
7443 				"bmkSecond", "mswsp.msg.cpmcomparebmk.bmksecond",
7444 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7445 			}
7446 		},
7447 		{
7448 			&hf_mswsp_msg_cpmcomparebmk_dwcomparison,
7449 			{
7450 				"dwComparison", "mswsp.msg.cpmcomparebmk.dwcomparison",
7451 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7452 			}
7453 		},
7454 		{
7455 			&hf_mswsp_msg_cpmgetapproxpos_hcursor,
7456 			{
7457 				"hCursor", "mswsp.msg.cpmgetapproxpos.hcursor",
7458 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7459 			}
7460 		},
7461 		{
7462 			&hf_mswsp_msg_cpmgetapproxpos_chapt,
7463 			{
7464 				"chapt", "mswsp.msg.cpmgetapproxpos.chapt",
7465 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7466 			}
7467 		},
7468 		{
7469 			&hf_mswsp_msg_cpmgetapproxpos_bmk,
7470 			{
7471 				"bmk", "mswsp.msg.cpmgetapproxpos.bmk",
7472 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7473 			}
7474 		},
7475 		{
7476 			&hf_mswsp_msg_cpmgetapproxpos_numerator,
7477 			{
7478 				"numerator", "mswsp.msg.cpmgetapproxpos.numerator",
7479 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7480 			}
7481 		},
7482 		{
7483 			&hf_mswsp_msg_cpmgetapproxpos_denominator,
7484 			{
7485 				"denominator", "mswsp.msg.cpmgetapproxpos.denominator",
7486 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7487 			}
7488 		},
7489 		{
7490 			&hf_mswsp_msg_cpmsetbinding_hcursor,
7491 			{
7492 				"hCursor", "mswsp.msg.cpmsetbinding.hcursor",
7493 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7494 			}
7495 		},
7496 		{
7497 			&hf_mswsp_msg_cpmsetbinding_cbrow,
7498 			{
7499 				"cBrow", "mswsp.msg.cpmsetbinding.cbrow",
7500 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7501 			}
7502 		},
7503 		{
7504 			&hf_mswsp_msg_cpmsetbinding_desc,
7505 			{
7506 				"cbBindingDesc", "mswsp.msg.cpmsetbinding.desc",
7507 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7508 			}
7509 		},
7510 		{
7511 			&hf_mswsp_msg_cpmsetbinding_dummy,
7512 			{
7513 				"dummy", "mswsp.msg.cpmsetbinding.dummy",
7514 				FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
7515 			}
7516 		},
7517 		{
7518 			&hf_mswsp_msg_cpmsetbinding_ccolumns,
7519 			{
7520 				"cColumns", "mswsp.msg.cpmsetbinding.ccolumns",
7521 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7522 			}
7523 		},
7524 		{
7525 			&hf_mswsp_msg_cpmsetbinding_acolumns,
7526 			{
7527 				"aColumns", "mswsp.msg.cpmsetbinding.acolumns",
7528 				FT_BYTES, SEP_DOT, NULL, 0, NULL, HFILL
7529 			}
7530 		},
7531 		{
7532 			&hf_mswsp_msg_cpmsendnotify_watchnotify,
7533 			{
7534 				"watchNotify", "mswsp.msg.cpmsendnotify.watchnotify",
7535 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7536 			}
7537 		},
7538 		{
7539 			&hf_mswsp_msg_cpmgetquerystatus_hcursor,
7540 			{
7541 				"hCursor", "mswsp.msg.cpmquerystatus.hcursor",
7542 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7543 			}
7544 		},
7545 		{
7546 			&hf_mswsp_msg_cpmgetquerystatus_qstatus,
7547 			{
7548 				"QStatus", "mswsp.msg.cpmquerystatus.qstatus",
7549 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7550 			}
7551 		},
7552 		{
7553 			&hf_mswsp_msg_cpmcistate_cbstruct,
7554 			{
7555 				"cbStruct", "mswsp.msg.cpmcistate.cbstruct",
7556 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7557 			}
7558 		},
7559 		{
7560 			&hf_mswsp_msg_cpmcistate_cwordlist,
7561 			{
7562 				"cbWordList", "mswsp.msg.cpmcistate.cbwordlist",
7563 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7564 			}
7565 		},
7566 		{
7567 			&hf_mswsp_msg_cpmcistate_cpersistindex,
7568 			{
7569 				"cbPersistentIndex", "mswsp.msg.cpmcistate.cbpersistindex",
7570 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7571 			}
7572 		},
7573 		{
7574 			&hf_mswsp_msg_cpmcistate_cqueries,
7575 			{
7576 				"cQueries", "mswsp.msg.cpmcistate.cqueries",
7577 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7578 			}
7579 		},
7580 		{
7581 			&hf_mswsp_msg_cpmcistate_cfreshtest,
7582 			{
7583 				"cFreshTest", "mswsp.msg.cpmcistate.cfreshtest",
7584 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7585 			}
7586 		},
7587 		{
7588 			&hf_mswsp_msg_cpmcistate_dwmergeprogress,
7589 			{
7590 				"dwMergeProgress", "mswsp.msg.cpmcistate.dwmergeprogress",
7591 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7592 			}
7593 		},
7594 		{
7595 			&hf_mswsp_msg_cpmcistate_estate,
7596 			{
7597 				"eState", "mswsp.msg.cpmcistate.estate",
7598 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7599 			}
7600 		},
7601 		{
7602 			&hf_mswsp_msg_cpmcistate_cfiltereddocs,
7603 			{
7604 				"cFilteredDocuments", "mswsp.msg.cpmcistate.cfiltereddocs",
7605 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7606 			}
7607 		},
7608 		{
7609 			&hf_mswsp_msg_cpmcistate_ctotaldocs,
7610 			{
7611 				"cTotalDocuments", "mswsp.msg.cpmcistate.ctotaldocs",
7612 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7613 			}
7614 		},
7615 		{
7616 			&hf_mswsp_msg_cpmcistate_cpendingscans,
7617 			{
7618 				"cPendingScans", "mswsp.msg.cpmcistate.cpendingscans",
7619 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7620 			}
7621 		},
7622 		{
7623 			&hf_mswsp_msg_cpmcistate_dwindexsize,
7624 			{
7625 				"dwIndexSize", "mswsp.msg.cpmcistate.dwindexsize",
7626 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7627 			}
7628 		},
7629 		{
7630 			&hf_mswsp_msg_cpmcistate_cuniquekeys,
7631 			{
7632 				"cUniqueKeys", "mswsp.msg.cpmcistate.cuniquekeys",
7633 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7634 			}
7635 		},
7636 		{
7637 			&hf_mswsp_msg_cpmcistate_csecqdocuments,
7638 			{
7639 				"cSecQDocuments", "mswsp.msg.cpmcistate.csecqdocuments",
7640 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7641 			}
7642 		},
7643 		{
7644 			&hf_mswsp_msg_cpmcistate_dwpropcachesize,
7645 			{
7646 				"dwPropCacheSize", "mswsp.msg.cpmcistate.dwpropcachesize",
7647 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7648 			}
7649 		},
7650 		{
7651 			&hf_mswsp_msg_cpmfetchvalue_wid,
7652 			{
7653 				"wid", "mswsp.msg.cpmfetchvalue.wid",
7654 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7655 			}
7656 		},
7657 		{
7658 			&hf_mswsp_msg_cpmfetchvalue_cbsofar,
7659 			{
7660 				"cbSoFar", "mswsp.msg.cpmfetchvalue.cbsofar",
7661 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7662 			}
7663 		},
7664 		{
7665 			&hf_mswsp_msg_cpmfetchvalue_cbpropspec,
7666 			{
7667 				"cbPropSpec", "mswsp.msg.cpmfetchvalue.cbpropspec",
7668 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7669 			}
7670 		},
7671 		{
7672 			&hf_mswsp_msg_cpmfetchvalue_cbchunk,
7673 			{
7674 				"cbChunk", "mswsp.msg.cpmfetchvalue.chunk",
7675 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7676 			}
7677 		},
7678 		{
7679 			&hf_mswsp_msg_cpmfetchvalue_cbvalue,
7680 			{
7681 				"cbValue", "mswsp.msg.cpmfetchvalue.cbvalue",
7682 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7683 			}
7684 		},
7685 		{
7686 			&hf_mswsp_msg_cpmfetchvalue_fmoreexists,
7687 			{
7688 				"fMoreExists", "mswsp.msg.cpmfetchvalue.fmoreexists",
7689 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7690 			}
7691 		},
7692 		{
7693 			&hf_mswsp_msg_cpmfetchvalue_fvalueexists,
7694 			{
7695 				"fValueExists", "mswsp.msg.cpmfetchvalue.fvalueexists",
7696 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7697 			}
7698 		},
7699 		{
7700 			&hf_mswsp_msg_cpmfetchvalue_vvalue,
7701 			{
7702 				"vvalue", "mswsp.msg.cpmfetchvalue.vvalue",
7703 				FT_BYTES, SEP_SPACE, NULL, 0, NULL, HFILL
7704 			}
7705 		},
7706 		{
7707 			&hf_mswsp_msg_cpmquerystatusex_qstatus,
7708 			{
7709 				"qStatus", "mswsp.msg.cpmquerystatusex.qstatus",
7710 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7711 			}
7712 		},
7713 		{
7714 			&hf_mswsp_msg_cpmquerystatusex_hcursor,
7715 			{
7716 				"hCursor", "mswsp.msg.cpmquerystatusex.hcursor",
7717 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7718 			}
7719 		},
7720 		{
7721 			&hf_mswsp_msg_cpmquerystatusex_bmk,
7722 			{
7723 				"bmk", "mswsp.msg.cpmquerystatusex.bmk",
7724 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7725 			}
7726 		},
7727 		{
7728 			&hf_mswsp_msg_cpmquerystatusex_cfiltereddocs,
7729 			{
7730 				"cFilteredDocuments", "mswsp.msg.cpmquerystatusex.cfiltereddocs",
7731 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7732 			}
7733 		},
7734 		{
7735 			&hf_mswsp_msg_cpmquerystatusex_cdocstofilter,
7736 			{
7737 				"cDocumentsToFilter", "mswsp.msg.cpmquerystatusex.cdocstofilter",
7738 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7739 			}
7740 		},
7741 		{
7742 			&hf_mswsp_msg_cpmquerystatusex_dwratiodenom,
7743 			{
7744 				"dwRatioFinishedDenominator", "mswsp.msg.cpmquerystatusex.dwratiodenom",
7745 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7746 			}
7747 		},
7748 		{
7749 			&hf_mswsp_msg_cpmquerystatusex_dwrationumer,
7750 			{
7751 				"dwRatioFinishedNumerator", "mswsp.msg.cpmquerystatusex.dwrationumer",
7752 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7753 			}
7754 		},
7755 		{
7756 			&hf_mswsp_msg_cpmquerystatusex_irowbmk,
7757 			{
7758 				"iRowBmk", "mswsp.msg.cpmquerystatusex.irowbmk",
7759 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7760 			}
7761 		},
7762 		{
7763 			&hf_mswsp_msg_cpmquerystatusex_crowstotal,
7764 			{
7765 				"cRowsTotal", "mswsp.msg.cpmquerystatusex.crowstotal",
7766 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7767 			}
7768 		},
7769 		{
7770 			&hf_mswsp_msg_cpmquerystatusex_maxrank,
7771 			{
7772 				"maxRank", "mswsp.msg.cpmquerystatusex.maxrank",
7773 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7774 			}
7775 		},
7776 		{
7777 			&hf_mswsp_msg_cpmquerystatusex_cresultsfound,
7778 			{
7779 				"cResultsFound", "mswsp.msg.cpmquerystatusex.cresultsfound",
7780 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7781 			}
7782 		},
7783 		{
7784 			&hf_mswsp_msg_cpmquerystatusex_whereid,
7785 			{
7786 				"whereId", "mswsp.msg.cpmquerystatusex.whereid",
7787 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7788 			}
7789 		},
7790 		{
7791 			&hf_mswsp_msg_cpmrestartposition_hcursor,
7792 			{
7793 				"hCursor", "mswsp.msg.cpmrestartposition.hcursor",
7794 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7795 			}
7796 		},
7797 		{
7798 			&hf_mswsp_msg_cpmrestartposition_chapt,
7799 			{
7800 				"chapt", "mswsp.msg.cpmrestartposition.chapt",
7801 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7802 			}
7803 		},
7804 		{
7805 			&hf_mswsp_msg_cpmgetrowsetnotify_wid,
7806 			{
7807 				"wid", "mswsp.msg.cpmgetrowsetnotify.wid",
7808 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7809 			}
7810 		},
7811 		{
7812 			&hf_mswsp_msg_cpmgetrowsetnotify_moreevents,
7813 			{
7814 				"moreEvents", "mswsp.msg.cpmgetrowsetnotify.moreevents",
7815 				FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL
7816 			}
7817 		},
7818 		{
7819 			&hf_mswsp_msg_cpmgetrowsetnotify_eventtype,
7820 			{
7821 				"eventType", "mswsp.msg.cpmgetrowsetnotify.eventType",
7822 				FT_UINT8, BASE_DEC, NULL, 0xFE, NULL, HFILL
7823 			}
7824 		},
7825 		{
7826 			&hf_mswsp_msg_cpmgetrowsetnotify_rowsetitemstate,
7827 			{
7828 				"rowSetItemState", "mswsp.msg.cpmgetrowsetnotify.rowsetitemstate",
7829 				FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
7830 			}
7831 		},
7832 		{
7833 			&hf_mswsp_msg_cpmgetrowsetnotify_changeditemstate,
7834 			{
7835 				"changedItemState", "mswsp.msg.cpmgetrowsetnotify.changeditemState",
7836 				FT_UINT8, BASE_DEC, NULL, 0, 0, HFILL
7837 			}
7838 		},
7839 		{
7840 			&hf_mswsp_msg_cpmgetrowsetnotify_rowsetevent,
7841 			{
7842 				"rowSetEvent", "mswsp.msg.cpmgetrowsetnotify.rowsetevent",
7843 				FT_UINT8, BASE_DEC, NULL, 0, 0, HFILL
7844 			}
7845 		},
7846 		{
7847 			&hf_mswsp_msg_cpmgetrowsetnotify_rowseteventdata1,
7848 			{
7849 				"rowSetEventdata1", "mswsp.msg.cpmgetrowsetnotify.rowseteventdata1",
7850 				FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL
7851 			}
7852 		},
7853 		{
7854 			&hf_mswsp_msg_cpmgetrowsetnotify_rowseteventdata2,
7855 			{
7856 				"rowSetEventdata2", "mswsp.msg.cpmgetrowsetnotify.rowseteventdata2",
7857 				FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL
7858 			}
7859 		},
7860 		{
7861 			&hf_mswsp_msg_cpmfindindices_cwids,
7862 			{
7863 				"cWids", "mswsp.msg.cpmfindindices.cwids",
7864 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7865 			}
7866 		},
7867 		{
7868 			&hf_mswsp_msg_cpmfindindices_cdepthprev,
7869 			{
7870 				"cDepthPrev", "mswsp.msg.cpmfindindices.cdepthprev",
7871 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7872 			}
7873 		},
7874 		{
7875 			&hf_mswsp_msg_cpmfindindices_cdepthnext,
7876 			{
7877 				"cDepthNext", "mswsp.msg.cpmfindindices.cdepthnext",
7878 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7879 			}
7880 		},
7881 		{
7882 			&hf_mswsp_msg_cpmsetscopeprioritization_priority,
7883 			{
7884 				"priority", "mswsp.msg.cpmsetscopeprioritization.priority",
7885 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7886 			}
7887 		},
7888 		{
7889 			&hf_mswsp_msg_cpmsetscopeprioritization_eventfreq,
7890 			{
7891 				"eventFrequency", "mswsp.msg.cpmsetscopeprioritization.eventfreq",
7892 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7893 			}
7894 		},
7895 		{
7896 			&hf_mswsp_msg_cpmsetscopestatisics_dwindexitems,
7897 			{
7898 				"dwIndexedItems", "mswsp.msg.cpmsetscopestatistics.dwindexitems",
7899 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7900 			}
7901 		},
7902 		{
7903 			&hf_mswsp_msg_cpmsetscopestatisics_dwoutstandingadds,
7904 			{
7905 				"dwOutstandingAdds", "mswsp.msg.cpmsetscopestatistics.dwoutstandingadds",
7906 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7907 			}
7908 		},
7909 		{
7910 			&hf_mswsp_msg_cpmsetscopestatisics_dwoutstandingmodifies,
7911 			{
7912 				"dwOutstandingModifies", "mswsp.msg.cpmsetscopestatistics.dwoutstandingmodifies",
7913 				FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7914 			}
7915 		}
7916 	};
7917 
7918 	static gint *ett[] = {
7919 		&ett_mswsp,
7920 		&ett_mswsp_hdr,
7921 		&ett_mswsp_msg,
7922 		&ett_mswsp_pad,
7923 		&ett_mswsp_property_restriction,
7924 		&ett_CRestrictionArray,
7925 		&ett_CBaseStorageVariant,
7926 		&ett_CBaseStorageVariant_Vector,
7927 		&ett_CBaseStorageVariant_Array,
7928 		&ett_CDbColId,
7929 		&ett_GUID,
7930 		&ett_CDbProp,
7931 		&ett_CDbPropSet,
7932 		&ett_CDbPropSet_Array,
7933 		&ett_CRestriction,
7934 		&ett_CNodeRestriction,
7935 		&ett_CPropertyRestriction,
7936 		&ett_CCoercionRestriction,
7937 		&ett_CContentRestriction,
7938 		&ett_RANGEBOUNDARY,
7939 		&ett_CRangeCategSpec,
7940 		&ett_CCategSpec,
7941 		&ett_CAggregSpec,
7942 		&ett_CAggregSet,
7943 		&ett_CCategorizationSpec,
7944 		&ett_CAggregSortKey,
7945 		&ett_CSortAggregSet,
7946 		&ett_CInGroupSortAggregSet,
7947 		&ett_CInGroupSortAggregSets,
7948 		&ett_CRowsetProperties,
7949 		&ett_CFullPropSpec,
7950 		&ett_CPidMapper,
7951 		&ett_CSort,
7952 		&ett_CSortSet,
7953 		&ett_CNatLanguageRestriction,
7954 		&ett_CColumnGroup,
7955 		&ett_CColumnGroupArray,
7956 		&ett_LCID,
7957 		&ett_CTableColumn,
7958 		&ett_Array,
7959 		&ett_SeekDescription,
7960 		&ett_CRowsSeekNext,
7961 		&ett_CRowsSeekAt,
7962 		&ett_CRowsSeekAtRatio,
7963 		&ett_CRowsSeekByBookmark,
7964 		&ett_GetRowsRow,
7965 		&ett_GetRowsColumn,
7966 		&ett_CRowVariant,
7967 		&ett_CRowVariant_Vector,
7968 		&ett_mswsp_bool_options,
7969 		&ett_mswsp_uin32_array,
7970 		&ett_mswsp_msg_padding,
7971 		&ett_mswsp_msg_creusewhere
7972 	};
7973 
7974 	static ei_register_info ei[] = {
7975 		{ &ei_mswsp_invalid_variant_type, { "mswsp.invalid_variant_type", PI_PROTOCOL, PI_ERROR, "Invalid variant type", EXPFILL }},
7976 		{ &ei_missing_msg_context, { "mswsp.msg.cpmgetrows.missing_msg_context", PI_SEQUENCE, PI_WARN, "previous messages needed for context not captured", EXPFILL }},
7977 		{ &ei_mswsp_msg_cpmsetbinding_ccolumns, { "mswsp.msg.cpmsetbinding.ccolumns.invalude", PI_PROTOCOL, PI_WARN, "Invalid number of cColumns for packet", EXPFILL }}
7978 	};
7979 	int i;
7980 
7981 	proto_mswsp = proto_register_protocol("Windows Search Protocol",
7982 										  "MS-WSP", "mswsp");
7983 
7984 	proto_register_field_array(proto_mswsp, hf, array_length(hf));
7985 	proto_register_subtree_array(ett, array_length(ett));
7986 	expert_mswsp = expert_register_protocol(proto_mswsp);
7987 	expert_register_field_array(expert_mswsp, ei, array_length(ei));
7988 	for (i=0; i<(int)array_length(GuidPropertySet); i++) {
7989 		guids_add_guid(&GuidPropertySet[i].guid, GuidPropertySet[i].def);
7990 	}
7991 }
7992 
7993 static int dissect_mswsp_smb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
7994 {
7995 	smb_info_t *si = (smb_info_t*)data;
7996 	gboolean in = si->request;
7997 
7998 	smb_fid_info_t *fid_info = NULL;
7999 	fid_info = find_fid_info(si);
8000 
8001 	if (!fid_info || !fid_info->fsi || !fid_info->fsi->filename) {
8002 		return 0;
8003 	}
8004 
8005 
8006 	if (g_ascii_strcasecmp(fid_info->fsi->filename, "\\MsFteWds") != 0) {
8007 		return 0;
8008 	}
8009 	p_add_proto_data(wmem_file_scope(), pinfo, proto_mswsp, 0, (void*)&SMB1);
8010 	return dissect_mswsp(tvb, pinfo, tree, in, data);
8011 }
8012 
8013 
8014 static int dissect_mswsp_smb2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
8015 {
8016 	smb2_info_t *si = (smb2_info_t*)data;
8017 	gboolean in;
8018 	char* fid_name = NULL;
8019 	guint32     open_frame = 0, close_frame = 0;
8020 
8021 	if (!si) {
8022 		return 0;
8023 	}
8024 
8025 	if (si->saved) {
8026 		dcerpc_fetch_polhnd_data(&si->saved->policy_hnd, &fid_name, NULL, &open_frame, &close_frame, pinfo->num);
8027 	}
8028 
8029 	if (!fid_name || g_ascii_strcasecmp(fid_name, "File: MsFteWds") != 0) {
8030 		return 0;
8031 	}
8032 
8033 	in = !(si->flags & SMB2_FLAGS_RESPONSE);
8034 	p_add_proto_data(wmem_file_scope(), pinfo, proto_mswsp, 0, (void*)&SMB2);
8035 	return dissect_mswsp(tvb, pinfo, tree, in, data);
8036 }
8037 
8038 void
8039 proto_reg_handoff_mswsp(void)
8040 {
8041 	heur_dissector_add("smb_transact", dissect_mswsp_smb, "WSP over SMB1", "smb1_wsp", proto_mswsp, HEURISTIC_ENABLE);
8042 	heur_dissector_add("smb2_pipe_subdissectors", dissect_mswsp_smb2, "WSP over SMB2", "smb2_wsp", proto_mswsp, HEURISTIC_ENABLE);
8043 }
8044 
8045 
8046 /*
8047  * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
8048  *
8049  * Local variables:
8050  * c-basic-offset: 4
8051  * tab-width: 8
8052  * indent-tabs-mode: t
8053  * End:
8054  *
8055  * vi: set shiftwidth=4 tabstop=8 noexpandtab:
8056  * :indentSize=4:tabSize=8:noTabs=false:
8057  */
8058