epan/dissectors/pidl/ C99 drsuapi
[wireshark-sm.git] / epan / dissectors / packet-mswsp.c
blobf35b6bdbedaf106455f139e1c2491a41b967527d
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>
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * SPDX-License-Identifier: GPL-2.0-or-later
13 # include "config.h"
15 #include <epan/packet.h>
16 #include <epan/expert.h>
17 #include <epan/proto_data.h>
18 #include <epan/exceptions.h>
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"
26 void proto_register_mswsp(void);
28 #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
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,
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
63 struct data_blob {
64 uint8_t *data;
65 uint32_t size;
68 struct data_str {
69 const char *str;
70 uint32_t len;
73 struct vt_decimal {
74 uint32_t hi, lo, mid;
78 struct vt_vector {
79 uint32_t len;
80 union {
81 int8_t *vt_i1;
82 uint8_t *vt_ui1;
83 int16_t *vt_i2;
84 uint16_t *vt_ui2, *vt_bool;
85 int32_t *vt_i4;
86 uint32_t *vt_ui4, *vt_error;
87 int64_t *vt_i8, *vt_cy, *vt_filetime;
88 uint64_t *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;
93 struct data_str *vt_lpstr, *vt_lpwstr, *vt_compressed_lpwstr, *vt_bstr;
94 } u;
97 struct SAFEARRAYBOUNDS {
98 uint32_t cElements, lLbound;
101 struct vt_array {
102 struct vt_vector vData;
103 uint16_t cDims, fFeature;
104 uint32_t cbElements;
106 struct SAFEARRAYBOUNDS *Rgsabound;
109 union vt_single
111 int8_t vt_i1;
112 uint8_t vt_ui1;
113 int16_t vt_i2;
114 uint16_t vt_ui2, vt_bool;
115 int32_t vt_i4, vt_int;
116 uint32_t vt_ui4, vt_uint, vt_error;
117 int64_t vt_i8, vt_cy, vt_filetime;
118 uint64_t 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;
124 struct data_str vt_lpstr, vt_lpwstr, vt_compressed_lpwstr, vt_bstr;
127 union vValue {
128 union vt_single vt_single;
129 struct vt_vector vt_vector;
130 struct vt_array vt_array;
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*);
142 /* 2.2.1.1 */
143 struct CBaseStorageVariant {
144 uint16_t vType; /* value enum vType */
145 uint16_t vData1;
146 uint16_t vData2;
147 union vValue vValue;
149 struct vtype_data *type;
152 /*****************************************************/
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
178 struct CRestriction;
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
194 enum PRSPEC_Kind {
195 PRSPEC_LPWSTR = 0,
196 PRSPEC_PROPID
199 /* 2.2.1.2 */
200 struct CFullPropSpec {
201 e_guid_t guid;
202 enum PRSPEC_Kind kind;
203 union {
204 uint32_t propid;
205 const uint8_t *name;
206 } u;
209 /* 2.2.1.7 */
210 struct CPropertyRestriction {
211 uint32_t relop; /*with value enum relop*/
212 struct CFullPropSpec property;
213 struct CBaseStorageVariant prval;
214 uint32_t lcid;
217 /* 2.2.1.6 */
218 struct CNodeRestriction {
219 uint32_t cNode;
220 struct CRestriction *paNode;
223 /* 2.2.1.17 */
224 struct CRestriction {
225 enum rType ulType;
226 uint32_t 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;
242 /* 2.2.1.12 */
243 struct CCoercionRestriction {
244 float value;
245 struct CRestriction child;
248 /* 2.2.1.3 */
249 struct CContentRestriction {
250 struct CFullPropSpec property;
251 const uint8_t *phrase;
252 uint32_t lcid;
253 uint32_t method;
256 /* 2.2.1.8 */
257 struct CReuseWhere /*Restriction*/ {
258 uint32_t whereId;
261 /* 2.2.1.5 */
262 struct CNatLanguageRestriction {
263 struct CFullPropSpec property;
264 const uint8_t *phrase;
265 uint32_t lcid;
268 #define PROP_LENGTH 255
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,
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}
301 /* 2.2.1.44 */
302 struct CTableColumn {
303 /*struct CFullPropSpec propspec;*/
304 uint32_t vtype;
305 uint8_t aggregateused;
306 uint8_t aggregatetype;
307 uint8_t valueused;
308 uint16_t valueoffset;
309 uint16_t valuesize;
310 uint8_t statusused;
311 uint16_t statusoffset;
312 uint8_t lengthused;
313 uint16_t lengthoffset;
314 char name[PROP_LENGTH];
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
321 /* 2.2.3.10 */
323 struct CPMSetBindingsIn {
324 uint32_t hcursor;
325 uint32_t brow;
326 uint32_t bbindingdesc;
327 uint32_t dummy;
328 uint32_t ccolumns;
329 struct CTableColumn *acolumns;
332 struct vector_or_array_64 {
333 uint64_t count;
334 uint64_t array_address;
337 struct vector_or_array_32 {
338 uint32_t count;
339 uint32_t array_address;
342 /* 2.2.1.42 */
343 struct CRowVariant {
344 uint16_t vtype;
345 uint16_t reserved1;
346 uint32_t reserved2;
347 union {
348 uint8_t byte;
349 uint16_t shortw;
350 uint32_t longw;
351 uint64_t hyperw;
352 union {
353 struct vector_or_array_64 i64;
354 struct vector_or_array_32 i32;
355 } array_vector;
356 } content;
359 static int SMB1 = 1;
360 static int SMB2 = 2;
362 void proto_reg_handoff_mswsp(void);
364 static expert_field ei_mswsp_invalid_variant_type;
365 static expert_field ei_missing_msg_context;
366 static expert_field ei_mswsp_msg_cpmsetbinding_ccolumns;
368 static int proto_mswsp;
369 static int hf_mswsp_msg;
370 static int hf_mswsp_hdr;
371 static int hf_mswsp_hdr_msg;
372 static int hf_mswsp_hdr_status;
373 static int hf_mswsp_hdr_checksum;
374 static int hf_mswsp_hdr_reserved;
375 static int hf_mswsp_msg_Connect_Version;
376 static int hf_mswsp_msg_ConnectIn_ClientIsRemote;
377 static int hf_mswsp_msg_ConnectIn_Blob1;
378 static int hf_mswsp_msg_ConnectIn_MachineName;
379 static int hf_mswsp_msg_ConnectIn_UserName;
380 static int hf_mswsp_msg_ConnectIn_PropSets_num;
381 static int hf_mswsp_bool_options;
382 static int hf_mswsp_bool_options_cursor;
383 static int hf_mswsp_bool_options_async;
384 static int hf_mswsp_bool_options_firstrows;
385 static int hf_mswsp_bool_options_holdrows;
386 static int hf_mswsp_bool_options_chaptered;
387 static int hf_mswsp_bool_options_useci;
388 static int hf_mswsp_bool_options_defertrim;
389 static int hf_mswsp_bool_options_rowsetevents;
390 static int hf_mswsp_bool_options_dontcomputeexpensive;
391 static int hf_mswsp_guid_time_low;
392 static int hf_mswsp_guid_time_mid;
393 static int hf_mswsp_guid_time_high;
394 static int hf_mswsp_guid_time_clock_hi;
395 static int hf_mswsp_guid_time_clock_low;
396 static int hf_mswsp_guid_node;
397 static int hf_mswsp_lcid;
398 static int hf_mswsp_lcid_sortid;
399 static int hf_mswsp_lcid_langid;
400 static int hf_mswsp_cscort_column;
401 static int hf_mswsp_cscort_order;
402 static int hf_mswsp_cscort_individual;
403 static int hf_mswsp_cscortset_count;
404 static int hf_mswsp_ctablecolumn_vtype;
405 static int hf_mswsp_ctablecolumn_aggused;
406 static int hf_mswsp_ctablecolumn_aggtype;
407 static int hf_mswsp_ctablecolumn_valused;
408 static int hf_mswsp_ctablecolumn_valoffset;
409 static int hf_mswsp_ctablecolumn_valsize;
410 static int hf_mswsp_ctablecolumn_statused;
411 static int hf_mswsp_ctablecolumn_statoffset;
412 static int hf_mswsp_ctablecolumn_lenused;
413 static int hf_mswsp_ctablecolumn_lenoffset;
414 static int hf_mswsp_cfullpropspec_kind;
415 static int hf_mswsp_cfullpropspec_propid;
416 static int hf_mswsp_cfullpropspec_propname;
417 static int hf_mswsp_cproprestrict_relop;
418 static int hf_mswsp_ccoercerestrict_value;
419 static int hf_mswsp_ccontentrestrict_cc;
420 static int hf_mswsp_ccontentrestrict_phrase;
421 static int hf_mswsp_ccontentrestrict_method;
422 static int hf_mswsp_natlangrestrict_cc;
423 static int hf_mswsp_natlangrestrict_phrase;
424 static int hf_mswsp_crestrict_ultype;
425 static int hf_mswsp_crestrict_weight;
426 static int hf_mswsp_crestrictarray_count;
427 static int hf_mswsp_crestrictarray_present;
428 static int hf_mswsp_cnoderestrict_cnode;
429 static int hf_mswsp_cbasestorvariant_vtype;
430 static int hf_mswsp_cbasestorvariant_vvalue;
431 static int hf_mswsp_cbasestorvariant_vdata1;
432 static int hf_mswsp_cbasestorvariant_vdata2;
433 static int hf_mswsp_cbasestorvariant_num;
434 static int hf_mswsp_cbasestorvariant_cdims;
435 static int hf_mswsp_cbasestorvariant_ffeatures;
436 static int hf_mswsp_cbasestorvariant_cbelements;
437 static int hf_mswsp_cbasestorvariant_rgsabound;
438 static int hf_mswsp_cdbcolid_ekind;
439 static int hf_mswsp_cdbcolid_ulid;
440 static int hf_mswsp_cdbcolid_vstring;
441 static int hf_mswsp_cdbprop_id;
442 static int hf_mswsp_cdbprop_options;
443 static int hf_mswsp_cdbprop_status;
444 static int hf_mswsp_cdbpropset_cprops;
445 static int hf_mswsp_rangeboundry_ultype;
446 static int hf_mswsp_rangeboundry_labelpresent;
447 static int hf_mswsp_rangeboundry_cclabel;
448 static int hf_mswsp_rangeboundry_label;
449 static int hf_mswsp_crangecategspec_crange;
450 static int hf_mswsp_ccategspec_type;
451 static int hf_mswsp_caggregspec_type;
452 static int hf_mswsp_caggregspec_ccalias;
453 static int hf_mswsp_caggregspec_alias;
454 static int hf_mswsp_caggregspec_idcolumn;
455 static int hf_mswsp_caggregspec_ulmaxnumtoreturn;
456 static int hf_mswsp_caggregspec_idrepresentative;
457 static int hf_mswsp_caggregset_count;
458 static int hf_mswsp_caggregsortkey_order;
459 static int hf_mswsp_csortaggregset_count;
460 static int hf_mswsp_cingroupsortaggregset_type;
461 static int hf_mswsp_cingroupsortaggregsets_count;
462 static int hf_mswsp_categorizationspec_cmaxres;
463 static int hf_mswsp_crowsetprops_ulmaxopenrows;
464 static int hf_mswsp_crowsetprops_ulmemusage;
465 static int hf_mswsp_crowsetprops_cmaxresults;
466 static int hf_mswsp_crowsetprops_ccmdtimeout;
467 static int hf_mswsp_cpidmapper_count;
468 static int hf_mswsp_ccolumngroup_count;
469 static int hf_mswsp_ccolumngroup_grouppid;
470 static int hf_mswsp_ccolumngroup_pid;
471 static int hf_mswsp_ccolumngrouparray_count;
472 static int hf_mswsp_int32array_value;
473 static int hf_mswsp_crowseeknext_cskip;
474 static int hf_mswsp_crowseekat_bmkoffset;
475 static int hf_mswsp_crowseekat_skip;
476 static int hf_mswsp_crowseekat_hregion;
477 static int hf_mswsp_crowseekatratio_ulnumerator;
478 static int hf_mswsp_crowseekatratio_uldenominator;
479 static int hf_mswsp_crowseekatratio_hregion;
480 static int hf_mswsp_crowseekbybookmark_cbookmarks;
481 static int hf_mswsp_crowseekbybookmark_maxret;
482 static int hf_mswsp_crowvariantinfo_count64;
483 static int hf_mswsp_arrayvector_address64;
484 static int hf_mswsp_crowvariantinfo_count32;
485 static int hf_mswsp_arrayvector_address32;
486 static int hf_mswsp_rowvariant_item_address64;
487 static int hf_mswsp_rowvariant_item_address32;
488 static int hf_mswsp_rowvariant_item_value;
489 static int hf_mswsp_rowvariant_vtype;
490 static int hf_mswsp_rowvariant_reserved1;
491 static int hf_mswsp_rowvariant_reserved2;
492 static int hf_mswsp_ctablecolumn_status;
493 static int hf_mswsp_ctablecolumn_length;
494 static int hf_mswsp_msg_cpmcreatequery_size;
495 static int hf_mswsp_msg_cpmcreatequery_ccolumnsetpresent;
496 static int hf_mswsp_msg_cpmcreatequery_crestrictionpresent;
497 static int hf_mswsp_msg_cpmcreatequery_csortpresent;
498 static int hf_mswsp_msg_cpmcreatequery_ccategpresent;
499 static int hf_mswsp_msg_cpmcreatequery_ccateg_count;
500 static int hf_mswsp_msg_cpmcreatequery_trueseq;
501 static int hf_mswsp_msg_cpmcreatequery_workid;
502 static int hf_mswsp_msg_cpmcreatequery_cursors;
503 static int hf_mswsp_msg_cpmgetrows_hcursor;
504 static int hf_mswsp_msg_cpmgetrows_rowstotransfer;
505 static int hf_mswsp_msg_cpmgetrows_rowwidth;
506 static int hf_mswsp_msg_cpmgetrows_cbseek;
507 static int hf_mswsp_msg_cpmgetrows_cbreserved;
508 static int hf_mswsp_msg_cpmgetrows_cbreadbuffer;
509 static int hf_mswsp_msg_cpmgetrows_ulclientbase;
510 static int hf_mswsp_msg_cpmgetrows_fbwdfetch;
511 static int hf_mswsp_msg_cpmgetrows_etype;
512 static int hf_mswsp_msg_cpmgetrows_chapt;
513 static int hf_mswsp_msg_cpmgetrows_crowsreturned;
514 static int hf_mswsp_msg_cpmratiofinished_hcursor;
515 static int hf_mswsp_msg_cpmratiofinished_fquick;
516 static int hf_mswsp_msg_cpmratiofinished_ulnumerator;
517 static int hf_mswsp_msg_cpmratiofinished_uldenominator;
518 static int hf_mswsp_msg_cpmratiofinished_crows;
519 static int hf_mswsp_msg_cpmratiofinished_fnewrows;
520 static int hf_mswsp_msg_cpmcomparebmk_hcursor;
521 static int hf_mswsp_msg_cpmcomparebmk_chapt;
522 static int hf_mswsp_msg_cpmcomparebmk_bmkfirst;
523 static int hf_mswsp_msg_cpmcomparebmk_bmksecond;
524 static int hf_mswsp_msg_cpmcomparebmk_dwcomparison;
525 static int hf_mswsp_msg_cpmgetapproxpos_hcursor;
526 static int hf_mswsp_msg_cpmgetapproxpos_chapt;
527 static int hf_mswsp_msg_cpmgetapproxpos_bmk;
528 static int hf_mswsp_msg_cpmgetapproxpos_numerator;
529 static int hf_mswsp_msg_cpmgetapproxpos_denominator;
530 static int hf_mswsp_msg_cpmsetbinding_hcursor;
531 static int hf_mswsp_msg_cpmsetbinding_cbrow;
532 static int hf_mswsp_msg_cpmsetbinding_desc;
533 static int hf_mswsp_msg_cpmsetbinding_dummy;
534 static int hf_mswsp_msg_cpmsetbinding_ccolumns;
535 static int hf_mswsp_msg_cpmsetbinding_acolumns;
536 static int hf_mswsp_msg_cpmsendnotify_watchnotify;
537 static int hf_mswsp_msg_cpmgetquerystatus_hcursor;
538 static int hf_mswsp_msg_cpmgetquerystatus_qstatus;
539 static int hf_mswsp_msg_cpmcistate_cbstruct;
540 static int hf_mswsp_msg_cpmcistate_cwordlist;
541 static int hf_mswsp_msg_cpmcistate_cpersistindex;
542 static int hf_mswsp_msg_cpmcistate_cqueries;
543 static int hf_mswsp_msg_cpmcistate_cfreshtest;
544 static int hf_mswsp_msg_cpmcistate_dwmergeprogress;
545 static int hf_mswsp_msg_cpmcistate_estate;
546 static int hf_mswsp_msg_cpmcistate_cfiltereddocs;
547 static int hf_mswsp_msg_cpmcistate_ctotaldocs;
548 static int hf_mswsp_msg_cpmcistate_cpendingscans;
549 static int hf_mswsp_msg_cpmcistate_dwindexsize;
550 static int hf_mswsp_msg_cpmcistate_cuniquekeys;
551 static int hf_mswsp_msg_cpmcistate_csecqdocuments;
552 static int hf_mswsp_msg_cpmcistate_dwpropcachesize;
553 static int hf_mswsp_msg_cpmfetchvalue_wid;
554 static int hf_mswsp_msg_cpmfetchvalue_cbsofar;
555 static int hf_mswsp_msg_cpmfetchvalue_cbpropspec;
556 static int hf_mswsp_msg_cpmfetchvalue_cbchunk;
557 static int hf_mswsp_msg_cpmfetchvalue_cbvalue;
558 static int hf_mswsp_msg_cpmfetchvalue_fmoreexists;
559 static int hf_mswsp_msg_cpmfetchvalue_fvalueexists;
560 static int hf_mswsp_msg_cpmfetchvalue_vvalue;
561 static int hf_mswsp_msg_cpmquerystatusex_hcursor;
562 static int hf_mswsp_msg_cpmquerystatusex_bmk;
563 static int hf_mswsp_msg_cpmquerystatusex_qstatus;
564 static int hf_mswsp_msg_cpmquerystatusex_cfiltereddocs;
565 static int hf_mswsp_msg_cpmquerystatusex_cdocstofilter;
566 static int hf_mswsp_msg_cpmquerystatusex_dwratiodenom;
567 static int hf_mswsp_msg_cpmquerystatusex_dwrationumer;
568 static int hf_mswsp_msg_cpmquerystatusex_irowbmk;
569 static int hf_mswsp_msg_cpmquerystatusex_crowstotal;
570 static int hf_mswsp_msg_cpmquerystatusex_maxrank;
571 static int hf_mswsp_msg_cpmquerystatusex_cresultsfound;
572 static int hf_mswsp_msg_cpmquerystatusex_whereid;
573 static int hf_mswsp_msg_cpmrestartposition_hcursor;
574 static int hf_mswsp_msg_cpmrestartposition_chapt;
575 static int hf_mswsp_msg_cpmgetrowsetnotify_wid;
576 static int hf_mswsp_msg_cpmgetrowsetnotify_moreevents;
577 static int hf_mswsp_msg_cpmgetrowsetnotify_eventtype;
578 static int hf_mswsp_msg_cpmgetrowsetnotify_rowsetitemstate;
579 static int hf_mswsp_msg_cpmgetrowsetnotify_changeditemstate;
580 static int hf_mswsp_msg_cpmgetrowsetnotify_rowsetevent;
581 static int hf_mswsp_msg_cpmgetrowsetnotify_rowseteventdata1;
582 static int hf_mswsp_msg_cpmgetrowsetnotify_rowseteventdata2;
583 static int hf_mswsp_msg_cpmfindindices_cwids;
584 static int hf_mswsp_msg_cpmfindindices_cdepthprev;
585 static int hf_mswsp_msg_cpmfindindices_cdepthnext;
586 static int hf_mswsp_msg_cpmsetscopeprioritization_priority;
587 static int hf_mswsp_msg_cpmsetscopeprioritization_eventfreq;
588 static int hf_mswsp_msg_cpmsetscopestatisics_dwindexitems;
589 static int hf_mswsp_msg_cpmsetscopestatisics_dwoutstandingadds;
590 static int hf_mswsp_msg_cpmsetscopestatisics_dwoutstandingmodifies;
592 static int ett_mswsp;
593 static int ett_mswsp_hdr;
594 static int ett_mswsp_msg;
595 static int ett_mswsp_pad;
597 static int ett_mswsp_property_restriction;
598 static int ett_CRestrictionArray;
599 static int ett_CBaseStorageVariant;
600 static int ett_CBaseStorageVariant_Vector;
601 static int ett_CBaseStorageVariant_Array;
602 static int ett_CDbColId;
603 static int ett_GUID;
604 static int ett_CDbProp;
605 static int ett_CDbPropSet;
606 static int ett_CDbPropSet_Array;
607 static int ett_CRestriction;
608 static int ett_CNodeRestriction;
609 static int ett_CPropertyRestriction;
610 static int ett_CCoercionRestriction;
611 static int ett_CContentRestriction;
612 static int ett_RANGEBOUNDARY;
613 static int ett_CRangeCategSpec;
614 static int ett_CCategSpec;
615 static int ett_CAggregSpec;
616 static int ett_CAggregSet;
617 static int ett_CCategorizationSpec;
618 static int ett_CAggregSortKey;
619 static int ett_CSortAggregSet;
620 static int ett_CInGroupSortAggregSet;
621 static int ett_CInGroupSortAggregSets;
622 static int ett_CRowsetProperties;
623 static int ett_CFullPropSpec;
624 static int ett_CPidMapper;
625 static int ett_CSort;
626 static int ett_CSortSet;
627 static int ett_CNatLanguageRestriction;
628 static int ett_CColumnGroup;
629 static int ett_CColumnGroupArray;
630 static int ett_LCID;
631 static int ett_CTableColumn;
632 static int ett_Array;
633 static int ett_SeekDescription;
634 static int ett_CRowsSeekNext;
635 static int ett_CRowsSeekAt;
636 static int ett_CRowsSeekAtRatio;
637 static int ett_CRowsSeekByBookmark;
638 static int ett_GetRowsRow;
639 static int ett_GetRowsColumn;
640 static int ett_CRowVariant;
641 static int ett_CRowVariant_Vector;
642 static int ett_mswsp_bool_options;
643 static int ett_mswsp_uin32_array;
644 static int ett_mswsp_msg_padding;
645 static int ett_mswsp_msg_creusewhere;
647 static struct vtype_data *vType_get_type(uint16_t t);
649 /* conversation related data */
650 struct rows_data {
651 uint32_t ulclientbase;
652 uint32_t cbreserved;
656 struct message_data {
657 uint32_t fid;
658 unsigned frame;
659 uint16_t msg_id;
660 bool is_request;
661 int smb_level;
662 union {
663 struct CPMSetBindingsIn bindingsin;/* CPMBindingIn request */
664 struct rows_data rowsin; /*CPMGetRowsIn request*/
665 uint32_t version; /*CPMConnectIn request/response */
666 } content;
669 struct mswsp_ct {
670 GSList *GSL_message_data;
673 static int msg_data_find(struct message_data *a, struct message_data *b)
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;
682 return 1;
684 static smb_fid_info_t *find_fid_info(smb_info_t *si)
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 uint32_t fid = 0;
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;
696 } else {
697 fid = tri->fid;
701 if (!fid) {
702 return NULL;
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;
711 return fid_info;
714 static bool get_fid_and_frame(packet_info *pinfo, uint32_t *fid, unsigned *frame,
715 void *data)
717 bool 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;
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;
730 *fid = info->fid;
731 } else {
732 smb2_info_t *si2 = (smb2_info_t*)data;
733 uint32_t 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;
742 return result;
745 static struct message_data *find_or_create_message_data(struct mswsp_ct *conv_data, packet_info *pinfo, uint16_t msg_id, bool is_request, void *data)
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;
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;
766 return msg_data;
769 static struct mswsp_ct *get_create_converstation_data(packet_info *pinfo)
771 struct mswsp_ct *ct = NULL;
772 conversation_t *conversation;
774 conversation = find_or_create_conversation(pinfo);
775 if (!conversation) {
776 return NULL;
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);
785 return ct;
788 static struct message_data *
789 find_matching_request_by_fid(struct mswsp_ct *ct, packet_info *pinfo, uint32_t msg, bool in, void *private_data)
791 uint32_t fid = 0;
792 unsigned frame = 0;
793 GSList *iter;
794 int *p_smb_level = (int*)p_get_proto_data(wmem_file_scope(), pinfo, proto_mswsp, 0);
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;
806 return result;
809 static struct CPMSetBindingsIn *
810 find_binding_msg_data(struct mswsp_ct *ct, packet_info *pinfo, void *private_data)
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;
817 return result;
820 static struct rows_data *
821 find_rowsin_msg_data(struct mswsp_ct *ct, packet_info *pinfo, void *private_data)
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;
828 return result;
831 static bool is_64bit_mode(struct mswsp_ct *ct, packet_info *pinfo, bool *result, void *private_data)
833 uint32_t client_ver = 0;
834 uint32_t 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;
846 return false;
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
861 static const value_string cursor_vals[] = {
862 { eSequential, "eSequential" },
863 { eLocateable, "eLocateable" },
864 { eScrollable, "eScrollable" },
865 { 0, NULL }
870 /******************************************************************************/
871 struct GuidPropertySet {
872 e_guid_t guid;
873 const char *def;
874 const char *desc;
875 const value_string *id_map;
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}
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}
903 static const value_string DBPROPSET_CIFRMWRKCORE_EXT_IDS[] = {
904 {0x02, "DBPROP_MACHINE"},
905 {0x03, "DBPROP_CLIENT_CLSID"},
906 {0, NULL}
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}
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 {0x08, "System.Search.ReverseFileName"},
927 {0x09, "System.ItemURL"},
928 {0x0a, "System.ContentUrl"},
929 {0, NULL}
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}
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}
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}
987 static const value_string PropSet1_IDS[] = {
988 {100, "System.ThumbnailCacheId"},
989 {0, NULL}
992 static const value_string PropSet2_IDS[] = {
993 {3, "System.Kind"},
994 {0, NULL}
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}
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}
1039 static const value_string PropSet4_IDS[] = {
1040 {100, "System.ItemFolderPathDisplayNarrow"},
1041 {0, NULL}
1044 static const value_string PropSet5_IDS[] = {
1045 {100, "System.Contact.FullName"},
1046 {0, NULL}
1049 static const value_string PropSet6_IDS[] = {
1050 {100, "System.ItemAuthors"},
1051 {0, NULL}
1054 static const value_string PropSet7_IDS[] = {
1055 {2, "System.Shell.OmitFromView"},
1056 {0, NULL}
1059 static const value_string PropSet8_IDS[] = {
1060 {2, "System.Shell.SFGAOFlagsStrings"},
1061 {3, "System.Link.TargetSFGAOFlagsStrings"},
1062 {0, NULL}
1065 static const value_string PropSet9_IDS[] = {
1066 {100, "System.ItemDate"},
1067 {0, NULL}
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}
1078 static const value_string PropSet11_IDS[] = {
1079 {5, "System.Priority"},
1080 {8, "System.Message.HasAttachments"},
1081 {0, NULL}
1084 static const value_string DocCharacter_IDS[] = {
1085 {2, "System.Search.Autosummary"},
1086 {0, NULL}
1089 static const value_string PropSet12_IDS[] = {
1090 {100, "System.IsDeleted"},
1091 {0, NULL}
1094 static const value_string PropSet13_IDS[] = {
1095 {100, "System.IsAttachment"},
1096 {0, NULL}
1099 static const value_string PropSet14_IDS[] = {
1100 {100, "System.Message.ConversationID"},
1101 {101, "System.Message.ConversationIndex"},
1102 {0, NULL}
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}
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}
1140 static const value_string PropSet15_IDS[] = {
1141 {0x64, "System.Calendar.IsOnline"},
1142 {0,NULL}
1145 static const value_string PropSet16_IDS[] = {
1146 {0x64, "System.Contact.OtherAddressStreet"},
1147 {0,NULL}
1150 static const value_string PropSet17_IDS[] = {
1151 {0x2, "System.DRM.IsProtected"},
1152 {0,NULL}
1155 static const value_string PropSet18_IDS[] = {
1156 {0x64, "System.Calendar.OptionalAttendeeNames"},
1157 {0,NULL}
1160 static const value_string PropSet19_IDS[] = {
1161 {0x64, "System.Calendar.ShowTimeAs"},
1162 {0,NULL}
1165 static const value_string PropSet20_IDS[] = {
1166 {0x64, "System.ParentalRatingReason"},
1167 {0,NULL}
1170 static const value_string PropSet21_IDS[] = {
1171 {0x64, "System.Project"},
1172 {0,NULL}
1175 static const value_string PropSet22_IDS[] = {
1176 {0x64, "System.Contact.OtherAddressCountry"},
1177 {0,NULL}
1180 static const value_string PropSet23_IDS[] = {
1181 {0x9, "System.Status"},
1182 {0,NULL}
1185 static const value_string PropSet24_IDS[] = {
1186 {0x64, "System.DateArchived"},
1187 {0,NULL}
1190 static const value_string PropSet25_IDS[] = {
1191 {0x64, "System.Contact.CarTelephone"},
1192 {0,NULL}
1195 static const value_string PropSet26_IDS[] = {
1196 {0x64, "System.Calendar.ResponseStatus"},
1197 {0,NULL}
1200 static const value_string PropSet27_IDS[] = {
1201 {0x64, "System.Task.BillingInformation"},
1202 {0,NULL}
1205 static const value_string PropSet28_IDS[] = {
1206 {0x64, "System.Media.AverageLevel"},
1207 {0,NULL}
1210 static const value_string PropSet29_IDS[] = {
1211 {0x64, "System.Contact.SpouseName"},
1212 {0,NULL}
1215 static const value_string PropSet30_IDS[] = {
1216 {0x64, "System.Document.DocumentID"},
1217 {0,NULL}
1220 static const value_string PropSet31_IDS[] = {
1221 {0x64, "System.RecordedTV.NetworkAffiliation"},
1222 {0,NULL}
1225 static const value_string PropSet32_IDS[] = {
1226 {0x64, "System.PriorityText"},
1227 {0,NULL}
1230 static const value_string PropSet33_IDS[] = {
1231 {0x64, "System.Contact.Children"},
1232 {0,NULL}
1235 static const value_string PropSet34_IDS[] = {
1236 {0x64, "System.RecordedTV.RecordingTime"},
1237 {0,NULL}
1240 static const value_string PropSet35_IDS[] = {
1241 {0x64, "System.FlagColorText"},
1242 {0,NULL}
1245 static const value_string PropSet36_IDS[] = {
1246 {0x64, "System.Contact.OtherAddressPostalCode"},
1247 {0,NULL}
1250 static const value_string PropSet37_IDS[] = {
1251 {0x64, "System.Photo.SharpnessText"},
1252 {0,NULL}
1255 static const value_string PropSet38_IDS[] = {
1256 {0x64, "System.Contact.OtherAddress"},
1257 {0,NULL}
1260 static const value_string PropSet40_IDS[] = {
1261 {0x64, "System.Contact.BusinessAddress"},
1262 {0,NULL}
1265 static const value_string PropSet41_IDS[] = {
1266 {0x64, "System.IsIncomplete"},
1267 {0,NULL}
1270 static const value_string PropSet42_IDS[] = {
1271 {0x64, "System.Contact.EmailAddress2"},
1272 {0,NULL}
1275 static const value_string PropSet43_IDS[] = {
1276 {0x64, "System.Contact.BusinessTelephone"},
1277 {0,NULL}
1280 static const value_string PropSet45_IDS[] = {
1281 {0x64, "System.Image.CompressionText"},
1282 {0,NULL}
1285 static const value_string PropSet46_IDS[] = {
1286 {0x64, "System.Contact.HomeAddressState"},
1287 {0,NULL}
1290 static const value_string PropSet47_IDS[] = {
1291 {0x64, "System.Contact.EmailAddress3"},
1292 {0,NULL}
1295 static const value_string PropSet48_IDS[] = {
1296 {0x64, "System.Communication.FollowupIconIndex"},
1297 {0,NULL}
1300 static const value_string PropSet49_IDS[] = {
1301 {0x64, "System.Photo.TagViewAggregate"},
1302 {0,NULL}
1305 static const value_string PropSet50_IDS[] = {
1306 {0x64, "System.Search.Store"},
1307 {0,NULL}
1310 static const value_string PropSet51_IDS[] = {
1311 {0x64, "System.FileName"},
1312 {0,NULL}
1315 static const value_string PropSet52_IDS[] = {
1316 {0x64, "System.Contact.HomeAddressStreet"},
1317 {0,NULL}
1320 static const value_string PropSet53_IDS[] = {
1321 {0x64, "System.Contact.HomeAddressPostalCode"},
1322 {0,NULL}
1325 static const value_string PropSet54_IDS[] = {
1326 {0x64, "System.Contact.BusinessHomePage"},
1327 {0,NULL}
1330 static const value_string PropSet55_IDS[] = {
1331 {0x64, "System.Calendar.RequiredAttendeeNames"},
1332 {0,NULL}
1335 static const value_string PropSet56_IDS[] = {
1336 {0x64, "System.FlagColor"},
1337 {0,NULL}
1340 static const value_string PropSet57_IDS[] = {
1341 {0x64, "System.Message.ProofInProgress"},
1342 {0,NULL}
1345 static const value_string PropSet58_IDS[] = {
1346 {0x64, "System.Contact.PrimaryAddressPostOfficeBox"},
1347 {0,NULL}
1350 static const value_string PropSet59_IDS[] = {
1351 {0x64, "System.Calendar.IsRecurring"},
1352 {0,NULL}
1355 static const value_string PropSet60_IDS[] = {
1356 {0x64, "System.Contact.HomeAddress"},
1357 {0,NULL}
1360 static const value_string PropSet61_IDS[] = {
1361 {0x64, "System.Photo.MaxAperture"},
1362 {0,NULL}
1365 static const value_string PropSet62_IDS[] = {
1366 {0x64, "System.ItemParticipants"},
1367 {0,NULL}
1370 static const value_string PropSet63_IDS[] = {
1371 {0x64, "System.Media.DateReleased"},
1372 {0,NULL}
1375 static const value_string PropSet64_IDS[] = {
1376 {0x64, "System.Journal.Contacts"},
1377 {0,NULL}
1380 static const value_string PropSet65_IDS[] = {
1381 {0x64, "System.Calendar.Resources"},
1382 {0,NULL}
1385 static const value_string PropSet66_IDS[] = {
1386 {0x67, "System.Message.MessageClass"},
1387 {0,NULL}
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}
1421 static const value_string PropSet68_IDS[] = {
1422 {0x64, "System.Calendar.OrganizerName"},
1423 {0,NULL}
1426 static const value_string PropSet69_IDS[] = {
1427 {0x64, "System.Photo.PeopleNames"},
1428 {0,NULL}
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}
1440 static const value_string PropSet71_IDS[] = {
1441 {0x64, "System.FileExtension"},
1442 {0,NULL}
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}
1469 static const value_string PropSet73_IDS[] = {
1470 {0x64, "System.Contact.TTYTDDTelephone"},
1471 {0,NULL}
1474 static const value_string PropSet74_IDS[] = {
1475 {0x64, "System.Photo.PhotometricInterpretationText"},
1476 {0,NULL}
1479 static const value_string PropSet75_IDS[] = {
1480 {0x64, "System.Calendar.OptionalAttendeeAddresses"},
1481 {0,NULL}
1484 static const value_string PropSet76_IDS[] = {
1485 {0x64, "System.Calendar.ReminderTime"},
1486 {0,NULL}
1489 static const value_string PropSet77_IDS[] = {
1490 {0x64, "System.Calendar.RequiredAttendeeAddresses"},
1491 {0,NULL}
1494 static const value_string PropSet78_IDS[] = {
1495 {0x64, "System.Calendar.OrganizerAddress"},
1496 {0,NULL}
1499 static const value_string PropSet79_IDS[] = {
1500 {0x2, "System.Link.TargetParsingPath"},
1501 {0x8, "System.Link.TargetSFGAOFlags"},
1502 {0,NULL}
1505 static const value_string PropSet80_IDS[] = {
1506 {0x64, "System.Contact.Hobbies"},
1507 {0,NULL}
1510 static const value_string PropSet81_IDS[] = {
1511 {0x64, "System.Contact.HomeAddressPostOfficeBox"},
1512 {0,NULL}
1515 static const value_string PropSet82_IDS[] = {
1516 {0x64, "System.Contact.CompanyMainTelephone"},
1517 {0,NULL}
1520 static const value_string PropSet83_IDS[] = {
1521 {0x64, "System.IsFlagged"},
1522 {0,NULL}
1525 static const value_string PropSet84_IDS[] = {
1526 {0x64, "System.Contact.FirstName"},
1527 {0,NULL}
1530 static const value_string PropSet85_IDS[] = {
1531 {0xa, "System.IsEncrypted"},
1532 {0,NULL}
1535 static const value_string PropSet86_IDS[] = {
1536 {0x64, "System.Calendar.Duration"},
1537 {0,NULL}
1540 static const value_string PropSet87_IDS[] = {
1541 {0x64, "System.Contact.PrimaryAddressCity"},
1542 {0,NULL}
1545 static const value_string PropSet88_IDS[] = {
1546 {0x64, "System.Contact.OtherAddressPostOfficeBox"},
1547 {0,NULL}
1550 static const value_string PropSet89_IDS[] = {
1551 {0x64, "System.ProviderItemID"},
1552 {0,NULL}
1555 static const value_string PropSet90_IDS[] = {
1556 {0x64, "System.Contact.BusinessAddressCountry"},
1557 {0,NULL}
1560 static const value_string PropSet91_IDS[] = {
1561 {0x64, "System.Contact.EmailName"},
1562 {0,NULL}
1565 static const value_string PropSet92_IDS[] = {
1566 {0x64, "System.Photo.FocalLengthInFilm"},
1567 {0,NULL}
1570 static const value_string PropSet93_IDS[] = {
1571 {0x64, "System.Contact.IMAddress"},
1572 {0,NULL}
1575 static const value_string PropSet94_IDS[] = {
1576 {0x64, "System.DateAcquired"},
1577 {0,NULL}
1580 static const value_string PropSet95_IDS[] = {
1581 {0x64, "System.DateCompleted"},
1582 {0,NULL}
1585 static const value_string PropSet96_IDS[] = {
1586 {0x64, "System.ItemName"},
1587 {0,NULL}
1590 static const value_string PropSet97_IDS[] = {
1591 {0x64, "System.Contact.PrimaryAddressPostalCode"},
1592 {0,NULL}
1595 static const value_string PropSet99_IDS[] = {
1596 {0x64, "System.Document.ClientID"},
1597 {0,NULL}
1600 static const value_string PropSet100_IDS[] = {
1601 {0x64, "System.Photo.ExposureProgramText"},
1602 {0,NULL}
1605 static const value_string PropSet101_IDS[] = {
1606 {0x64, "System.Note.ColorText"},
1607 {0,NULL}
1610 static const value_string PropSet102_IDS[] = {
1611 {0x64, "System.Photo.MeteringModeText"},
1612 {0,NULL}
1615 static const value_string PropSet103_IDS[] = {
1616 {0x2, "System.Link.TargetExtension"},
1617 {0,NULL}
1620 static const value_string PropSet104_IDS[] = {
1621 {0x64, "System.Contact.BusinessAddressState"},
1622 {0,NULL}
1625 static const value_string PropSet105_IDS[] = {
1626 {0x64, "System.Photo.OrientationText"},
1627 {0,NULL}
1630 static const value_string PropSet106_IDS[] = {
1631 {0x64, "System.Contact.Label"},
1632 {0,NULL}
1635 static const value_string PropSet107_IDS[] = {
1636 {0x64, "System.Calendar.Location"},
1637 {0,NULL}
1640 static const value_string PropSet108_IDS[] = {
1641 {0x64, "System.Photo.SaturationText"},
1642 {0,NULL}
1645 static const value_string PropSet109_IDS[] = {
1646 {0x64, "System.Message.ToDoTitle"},
1647 {0,NULL}
1650 static const value_string PropSet110_IDS[] = {
1651 {0x64, "System.Contact.Anniversary"},
1652 {0,NULL}
1655 static const value_string PropSet111_IDS[] = {
1656 {0x64, "System.Contact.FileAsName"},
1657 {0,NULL}
1660 static const value_string PropSet112_IDS[] = {
1661 {0x64, "System.GPS.Date"},
1662 {0,NULL}
1665 static const value_string PropSet113_IDS[] = {
1666 {0x64, "System.IsFlaggedComplete"},
1667 {0,NULL}
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}
1677 static const value_string PropSet115_IDS[] = {
1678 {0x64, "System.Communication.SecurityFlags"},
1679 {0,NULL}
1682 static const value_string PropSet116_IDS[] = {
1683 {0x64, "System.Identity"},
1684 {0,NULL}
1687 static const value_string PropSet117_IDS[] = {
1688 {0x64, "System.Contact.BusinessAddressPostOfficeBox"},
1689 {0,NULL}
1692 static const value_string PropSet118_IDS[] = {
1693 {0x64, "System.AcquisitionID"},
1694 {0,NULL}
1697 static const value_string PropSet119_IDS[] = {
1698 {0x64, "System.Contact.EmailAddresses"},
1699 {0,NULL}
1702 static const value_string PropSet120_IDS[] = {
1703 {0x64, "System.Communication.TaskStatus"},
1704 {0,NULL}
1707 static const value_string PropSet121_IDS[] = {
1708 {0x64, "System.Contact.LastName"},
1709 {0,NULL}
1712 static const value_string PropSet122_IDS[] = {
1713 {0x64, "System.Communication.DateItemExpires"},
1714 {0,NULL}
1717 static const value_string PropSet123_IDS[] = {
1718 {0x64, "System.ImportanceText"},
1719 {0,NULL}
1722 static const value_string PropSet124_IDS[] = {
1723 {0x64, "System.Search.ContainerHash"},
1724 {0,NULL}
1727 static const value_string PropSet125_IDS[] = {
1728 {0x64, "System.Contact.BusinessFaxNumber"},
1729 {0,NULL}
1732 static const value_string PropSet126_IDS[] = {
1733 {0x2, "System.Link.TargetUrl"},
1734 {0x1a, "System.IconIndex"},
1735 {0,NULL}
1738 static const value_string PropSet127_IDS[] = {
1739 {0x64, "System.RecordedTV.StationName"},
1740 {0,NULL}
1743 static const value_string PropSet128_IDS[] = {
1744 {0x64, "System.Task.Owner"},
1745 {0,NULL}
1748 static const value_string PropSet129_IDS[] = {
1749 {0x64, "System.Photo.ProgramModeText"},
1750 {0,NULL}
1753 static const value_string PropSet130_IDS[] = {
1754 {0x64, "System.Contact.PrimaryAddressCountry"},
1755 {0,NULL}
1758 static const value_string PropSet131_IDS[] = {
1759 {0x64, "System.Note.Color"},
1760 {0,NULL}
1763 static const value_string PropSet132_IDS[] = {
1764 {0x64, "System.Contact.OtherAddressState"},
1765 {0,NULL}
1768 static const value_string PropSet133_IDS[] = {
1769 {0x64, "System.Message.AttachmentContents"},
1770 {0,NULL}
1773 static const value_string PropSet134_IDS[] = {
1774 {0x64, "System.Communication.TaskStatusText"},
1775 {0,NULL}
1778 static const value_string PropSet135_IDS[] = {
1779 {0x64, "System.Communication.HeaderItem"},
1780 {0,NULL}
1783 static const value_string PropSet136_IDS[] = {
1784 {0x64, "System.Contact.EmailAddress"},
1785 {0,NULL}
1788 static const value_string PropSet137_IDS[] = {
1789 {0x64, "System.Contact.Profession"},
1790 {0,NULL}
1793 static const value_string PropSet138_IDS[] = {
1794 {0x64, "System.Contact.BusinessAddressPostalCode"},
1795 {0,NULL}
1798 static const value_string PropSet139_IDS[] = {
1799 {0x64, "System.ItemNamePrefix"},
1800 {0,NULL}
1803 static const value_string PropSet140_IDS[] = {
1804 {0x64, "System.Photo.DigitalZoom"},
1805 {0,NULL}
1808 static const value_string PropSet141_IDS[] = {
1809 {0x64, "System.SourceItem"},
1810 {0,NULL}
1813 static const value_string PropSet142_IDS[] = {
1814 {0x64, "System.Photo.WhiteBalance"},
1815 {0,NULL}
1818 static const value_string PropSet143_IDS[] = {
1819 {0x64, "System.SensitivityText"},
1820 {0,NULL}
1823 static const value_string PropSet144_IDS[] = {
1824 {0x64, "System.Contact.Gender"},
1825 {0x65, "System.Contact.GenderValue"},
1826 {0,NULL}
1829 static const value_string PropSet145_IDS[] = {
1830 {0x64, "System.Contact.OtherAddressCity"},
1831 {0,NULL}
1834 static const value_string PropSet146_IDS[] = {
1835 {0x64, "System.Music.DisplayArtist"},
1836 {0,NULL}
1839 static const value_string PropSet147_IDS[] = {
1840 {0x64, "System.Message.SenderAddress"},
1841 {0,NULL}
1844 static const value_string PropSet148_IDS[] = {
1845 {0x64, "System.Contact.PrimaryAddressState"},
1846 {0,NULL}
1849 static const value_string PropSet149_IDS[] = {
1850 {0x64, "System.Journal.EntryType"},
1851 {0,NULL}
1854 static const value_string PropSet150_IDS[] = {
1855 {0x64, "System.Contact.BusinessAddressStreet"},
1856 {0,NULL}
1859 static const value_string PropSet151_IDS[] = {
1860 {0x4, "System.FileOwner"},
1861 {0,NULL}
1864 static const value_string PropSet152_IDS[] = {
1865 {0x64, "System.Contact.HomeAddressCountry"},
1866 {0,NULL}
1869 static const value_string PropSet153_IDS[] = {
1870 {0x64, "System.Task.CompletionStatus"},
1871 {0,NULL}
1874 static const value_string PropSet154_IDS[] = {
1875 {0x10, "System.Software.DateLastUsed"},
1876 {0,NULL}
1879 static const value_string PropSet155_IDS[] = {
1880 {0x64, "System.Contact.Department"},
1881 {0,NULL}
1884 static const value_string PropSet156_IDS[] = {
1885 {0x64, "System.Calendar.ShowTimeAsText"},
1886 {0,NULL}
1889 static const value_string PropSet157_IDS[] = {
1890 {0x64, "System.Sensitivity"},
1891 {0,NULL}
1894 static const value_string PropSet158_IDS[] = {
1895 {0x64, "System.RecordedTV.OriginalBroadcastDate"},
1896 {0,NULL}
1899 static const value_string PropSet159_IDS[] = {
1900 {0x64, "System.Music.IsCompilation"},
1901 {0,NULL}
1904 static const value_string PropSet160_IDS[] = {
1905 {0x64, "System.DueDate"},
1906 {0,NULL}
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}
1917 static const value_string PropSet162_IDS[] = {
1918 {0x64, "System.MileageInformation"},
1919 {0,NULL}
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}
1937 static const value_string PropSet164_IDS[] = {
1938 {0x64, "System.Audio.PeakValue"},
1939 {0,NULL}
1942 static const value_string PropSet165_IDS[] = {
1943 {0x64, "System.Contact.TelexNumber"},
1944 {0,NULL}
1947 static const value_string PropSet166_IDS[] = {
1948 {0x64, "System.Message.SenderName"},
1949 {0,NULL}
1952 static const value_string PropSet167_IDS[] = {
1953 {0x64, "System.Message.Flags"},
1954 {0,NULL}
1957 static const value_string PropSet168_IDS[] = {
1958 {0x64, "System.IsFolder"},
1959 {0,NULL}
1962 static const value_string PropSet169_IDS[] = {
1963 {0x64, "System.Contact.AssistantTelephone"},
1964 {0,NULL}
1967 static const value_string PropSet170_IDS[] = {
1968 {0x64, "System.KindText"},
1969 {0,NULL}
1972 static const value_string PropSet171_IDS[] = {
1973 {0x64, "System.Photo.ContrastText"},
1974 {0,NULL}
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}
1988 static const value_string PropSet173_IDS[] = {
1989 {0x64, "System.Message.IsFwdOrReply"},
1990 {0,NULL}
1993 static const value_string PropSet174_IDS[] = {
1994 {0x64, "System.Photo.WhiteBalanceText"},
1995 {0,NULL}
1998 static const value_string PropSet175_IDS[] = {
1999 {0x64, "System.Photo.GainControlText"},
2000 {0,NULL}
2003 static const value_string PropSet176_IDS[] = {
2004 {0x64, "System.Communication.PolicyTag"},
2005 {0,NULL}
2008 static const value_string PropSet177_IDS[] = {
2009 {0x64, "System.Contact.HomeFaxNumber"},
2010 {0,NULL}
2013 static const value_string PropSet178_IDS[] = {
2014 {0x64, "System.FlagStatusText"},
2015 {0,NULL}
2018 static const value_string PropSet179_IDS[] = {
2019 {0x64, "System.Contact.AssistantName"},
2020 {0,NULL}
2023 static const value_string PropSet180_IDS[] = {
2024 {0x64, "System.Message.ToDoFlags"},
2025 {0,NULL}
2028 static const value_string PropSet181_IDS[] = {
2029 {0x64, "System.RatingText"},
2030 {0,NULL}
2033 static const value_string PropSet182_IDS[] = {
2034 {0x64, "System.Document.Contributor"},
2035 {0,NULL}
2038 static const value_string PropSet183_IDS[] = {
2039 {0x64, "System.Contact.CallbackTelephone"},
2040 {0,NULL}
2043 static const value_string PropSet184_IDS[] = {
2044 {0x64, "System.EndDate"},
2045 {0,NULL}
2048 static const value_string PropSet185_IDS[] = {
2049 {0x64, "System.Media.DateEncoded"},
2050 {0,NULL}
2053 static const value_string PropSet186_IDS[] = {
2054 {0x64, "System.Photo.FlashText"},
2055 {0,NULL}
2058 static const value_string PropSet187_IDS[] = {
2059 {0x64, "System.Photo.FlashFired"},
2060 {0,NULL}
2063 static const value_string PropSet188_IDS[] = {
2064 {0x64, "System.Document.Division"},
2065 {0,NULL}
2068 static const value_string PropSet189_IDS[] = {
2069 {0x64, "System.Contact.PagerTelephone"},
2070 {0,NULL}
2073 static const value_string PropSet190_IDS[] = {
2074 {0x64, "System.Contact.BusinessAddressCity"},
2075 {0,NULL}
2078 static const value_string PropSet191_IDS[] = {
2079 {0x64, "System.Media.SubscriptionContentId"},
2080 {0,NULL}
2083 static const value_string PropSet192_IDS[] = {
2084 {0x64, "System.Contact.PrimaryAddressStreet"},
2085 {0,NULL}
2088 static const value_string PropSet193_IDS[] = {
2089 {0x64, "System.StartDate"},
2090 {0,NULL}
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}
2108 static const value_string PropSet195_IDS[] = {
2109 {0x64, "System.Contact.MailingAddress"},
2110 {0,NULL}
2113 static const 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
2118 { {0xa7ac77ed, 0xf8d7, 0x11ce, {0xa7, 0x98, 0x00, 0x20, 0xf8, 0x00, 0x80, 0x25}},
2119 "DBPROPSET_QUERYEXT", "Query extension",
2120 DBPROPSET_QUERYEXT_IDS
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
2126 { {0xAA6EE6B0, 0xE828, 0x11D0, {0xB2, 0x3E, 0x00, 0xAA, 0x00, 0x47, 0xFC, 0x01}},
2127 "DBPROPSET_MSIDXS_ROWSETEXT", "???",
2128 DBPROPSET_MSIDXS_ROWSETEXT_IDS
2130 { {0xB725F130, 0x47ef, 0x101a, {0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC}},
2131 "Storage", "Storage Property Set",
2132 StorageGuid_IDS
2134 { {0xF29F85E0, 0x4FF9, 0x1068, {0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9}},
2135 "Document", "Document Property Set",
2136 DocPropSetGuid_IDS
2138 { {0x49691C90, 0x7E17, 0x101A, {0xA9, 0x1C, 0x08, 0x00, 0x2B, 0x2E, 0xCD, 0xA9}},
2139 "Query", "Query Property Set",
2140 QueryGuid_IDS
2142 { {0x28636AA6, 0x953D, 0x11D2, {0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0}},
2143 "ShellDetails", "Shell Details Property Set",
2144 ShellDetails_IDS
2146 { {0x446D16B1, 0x8DAD, 0x4870, {0xA7, 0x48, 0x40, 0x2E, 0xA4, 0x3D, 0x78, 0x8C}},
2147 "???", "Unspecified Property Set",
2148 PropSet1_IDS
2150 { {0x1E3EE840, 0xBC2B, 0x476C, {0x82, 0x37, 0x2A, 0xCD, 0x1A, 0x83, 0x9B, 0x22}},
2151 "???", "Unspecified Property Set",
2152 PropSet2_IDS
2154 { {0x56A3372E, 0xCE9C, 0x11d2, {0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6}},
2155 "Music", "Music Property Set",
2156 MusicGuid_IDS
2158 { {0xE3E0584C, 0xB788, 0x4A5A, {0xBB, 0x20, 0x7F, 0x5A, 0x44, 0xC9, 0xAC, 0xDD}},
2159 "???", "Unspecified Property Set",
2160 PropSet3_IDS
2162 { {0xDABD30ED, 0x0043, 0x4789, {0xA7, 0xF8, 0xD0, 0x13, 0xA4, 0x73, 0x66, 0x22}},
2163 "???", "Unspecified Property Set",
2164 PropSet4_IDS
2166 { {0x635E9051, 0x50A5, 0x4BA2, {0xB9, 0xDB, 0x4E, 0xD0, 0x56, 0xC7, 0x72, 0x96}},
2167 "???", "Unspecified Property Set",
2168 PropSet5_IDS
2170 { {0xD0A04F0A, 0x462A, 0x48A4, {0xBB, 0x2F, 0x37, 0x06, 0xE8, 0x8D, 0xBD, 0x7D}},
2171 "???", "Unspecified Property Set",
2172 PropSet6_IDS
2174 { {0xDE35258C, 0xC695, 0x4CBC, {0xB9, 0x82, 0x38, 0xB0, 0xAD, 0x24, 0xCE, 0xD0}},
2175 "???", "Unspecified Property Set",
2176 PropSet7_IDS
2178 { {0xD6942081, 0xD53B, 0x443D, {0xAD, 0x47, 0x5E, 0x05, 0x9D, 0x9C, 0xD2, 0x7A}},
2179 "???", "Unspecified Property Set",
2180 PropSet8_IDS
2182 { {0xF7DB74B4, 0x4287, 0x4103, {0xAF, 0xBA, 0xF1, 0xB1, 0x3D, 0xCD, 0x75, 0xCF}},
2183 "???", "Unspecified Property Set",
2184 PropSet9_IDS
2186 { {0x0B63E350, 0x9CCC, 0x11d0, {0xBC, 0xDB, 0x00, 0x80, 0x5F, 0xCC, 0xCE, 0x04}},
2187 "???", "Unspecified Property Set",
2188 PropSet10_IDS
2190 { {0x9C1FCF74, 0x2D97, 0x41BA, {0xB4, 0xAE, 0xCB, 0x2E, 0x36, 0x61, 0xA6, 0xE4}},
2191 "???", "Unspecified Property Set",
2192 PropSet11_IDS
2194 { {0x560C36C0, 0x503A, 0x11CF, {0xBA, 0xA1, 0x00, 0x00, 0x4C, 0x75, 0x2A, 0x9A}},
2195 "DocCharacter", "Document characterization Property Set",
2196 DocCharacter_IDS
2198 { {0x5CDA5FC8, 0x33EE, 0x4FF3, {0x90, 0x94, 0xAE, 0x7B, 0xD8, 0x86, 0x8C, 0x4D}},
2199 "???", "Unspecified Property Set",
2200 PropSet12_IDS
2202 { {0xF23F425C, 0x71A1, 0x4FA8, {0x92, 0x2F, 0x67, 0x8E, 0xA4, 0xA6, 0x04, 0x08}},
2203 "???", "Unspecified Property Set",
2204 PropSet13_IDS
2206 { {0xDC8F80BD, 0xAF1E, 0x4289, {0x85, 0xB6, 0x3D, 0xFC, 0x1B, 0x49, 0x39, 0x92}},
2207 "???", "Unspecified Property Set",
2208 PropSet14_IDS
2210 { {0xD5CDD502, 0x2E9C, 0x101B, {0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE}},
2211 "DocPropSet2", "Document Property Set 2",
2212 DocPropSetGuid2_IDS
2214 { {0x176DC63C, 0x2688, 0x4E89, {0x81, 0x43, 0xA3, 0x47, 0x80, 0x0F, 0x25, 0xE9}},
2215 "System.Contact", "System Contact Property Set",
2216 SystemContact_IDS
2218 { {0xBFEE9149, 0xE3E2, 0x49A7, {0xA8, 0x62, 0xC0, 0x59, 0x88, 0x14, 0x5C, 0xEC}},
2219 "???","Unspecified Property Set",
2220 PropSet15_IDS
2222 { {0xFF962609, 0xB7D6, 0x4999, {0x86, 0x2D, 0x95, 0x18, 0x0D, 0x52, 0x9A, 0xEA}},
2223 "???","Unspecified Property Set",
2224 PropSet16_IDS
2226 { {0xAEAC19E4, 0x89AE, 0x4508, {0xB9, 0xB7, 0xBB, 0x86, 0x7A, 0xBE, 0xE2, 0xED}},
2227 "???","Unspecified Property Set",
2228 PropSet17_IDS
2230 { {0x09429607, 0x582D, 0x437F, {0x84, 0xC3, 0xDE, 0x93, 0xA2, 0xB2, 0x4C, 0x3C}},
2231 "???","Unspecified Property Set",
2232 PropSet18_IDS
2234 { {0x5BF396D4, 0x5EB2, 0x466F, {0xBD, 0xE9, 0x2F, 0xB3, 0xF2, 0x36, 0x1D, 0x6E}},
2235 "???","Unspecified Property Set",
2236 PropSet19_IDS
2238 { {0x10984E0A, 0xF9F2, 0x4321, {0xB7, 0xEF, 0xBA, 0xF1, 0x95, 0xAF, 0x43, 0x19}},
2239 "???","Unspecified Property Set",
2240 PropSet20_IDS
2242 { {0x39A7F922, 0x477C, 0x48DE, {0x8B, 0xC8, 0xB2, 0x84, 0x41, 0xE3, 0x42, 0xE3}},
2243 "???","Unspecified Property Set",
2244 PropSet21_IDS
2246 { {0x8F167568, 0x0AAE, 0x4322, {0x8E, 0xD9, 0x60, 0x55, 0xB7, 0xB0, 0xE3, 0x98}},
2247 "???","Unspecified Property Set",
2248 PropSet22_IDS
2250 { {0x000214A1, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}},
2251 "???","Unspecified Property Set",
2252 PropSet23_IDS
2254 { {0x43F8D7B7, 0xA444, 0x4F87, {0x93, 0x83, 0x52, 0x27, 0x1C, 0x9B, 0x91, 0x5C}},
2255 "???","Unspecified Property Set",
2256 PropSet24_IDS
2258 { {0x8FDC6DEA, 0xB929, 0x412B, {0xBA, 0x90, 0x39, 0x7A, 0x25, 0x74, 0x65, 0xFE}},
2259 "???","Unspecified Property Set",
2260 PropSet25_IDS
2262 { {0x188C1F91, 0x3C40, 0x4132, {0x9E, 0xC5, 0xD8, 0xB0, 0x3B, 0x72, 0xA8, 0xA2}},
2263 "???","Unspecified Property Set",
2264 PropSet26_IDS
2266 { {0xD37D52C6, 0x261C, 0x4303, {0x82, 0xB3, 0x08, 0xB9, 0x26, 0xAC, 0x6F, 0x12}},
2267 "???","Unspecified Property Set",
2268 PropSet27_IDS
2270 { {0x09EDD5B6, 0xB301, 0x43C5, {0x99, 0x90, 0xD0, 0x03, 0x02, 0xEF, 0xFD, 0x46}},
2271 "???","Unspecified Property Set",
2272 PropSet28_IDS
2274 { {0x9D2408B6, 0x3167, 0x422B, {0x82, 0xB0, 0xF5, 0x83, 0xB7, 0xA7, 0xCF, 0xE3}},
2275 "???","Unspecified Property Set",
2276 PropSet29_IDS
2278 { {0xE08805C8, 0xE395, 0x40DF, {0x80, 0xD2, 0x54, 0xF0, 0xD6, 0xC4, 0x31, 0x54}},
2279 "???","Unspecified Property Set",
2280 PropSet30_IDS
2282 { {0x2C53C813, 0xFB63, 0x4E22, {0xA1, 0xAB, 0x0B, 0x33, 0x1C, 0xA1, 0xE2, 0x73}},
2283 "???","Unspecified Property Set",
2284 PropSet31_IDS
2286 { {0xD98BE98B, 0xB86B, 0x4095, {0xBF, 0x52, 0x9D, 0x23, 0xB2, 0xE0, 0xA7, 0x52}},
2287 "???","Unspecified Property Set",
2288 PropSet32_IDS
2290 { {0xD4729704, 0x8EF1, 0x43EF, {0x90, 0x24, 0x2B, 0xD3, 0x81, 0x18, 0x7F, 0xD5}},
2291 "???","Unspecified Property Set",
2292 PropSet33_IDS
2294 { {0xA5477F61, 0x7A82, 0x4ECA, {0x9D, 0xDE, 0x98, 0xB6, 0x9B, 0x24, 0x79, 0xB3}},
2295 "???","Unspecified Property Set",
2296 PropSet34_IDS
2298 { {0x45EAE747, 0x8E2A, 0x40AE, {0x8C, 0xBF, 0xCA, 0x52, 0xAB, 0xA6, 0x15, 0x2A}},
2299 "???","Unspecified Property Set",
2300 PropSet35_IDS
2302 { {0x95C656C1, 0x2ABF, 0x4148, {0x9E, 0xD3, 0x9E, 0xC6, 0x02, 0xE3, 0xB7, 0xCD}},
2303 "???","Unspecified Property Set",
2304 PropSet36_IDS
2306 { {0x51EC3F47, 0xDD50, 0x421D, {0x87, 0x69, 0x33, 0x4F, 0x50, 0x42, 0x4B, 0x1E}},
2307 "???","Unspecified Property Set",
2308 PropSet37_IDS
2310 { {0x508161FA, 0x313B, 0x43D5, {0x83, 0xA1, 0xC1, 0xAC, 0xCF, 0x68, 0x62, 0x2C}},
2311 "???","Unspecified Property Set",
2312 PropSet38_IDS
2314 { {0x730FB6DD, 0xCF7C, 0x426B, {0xA0, 0x3F, 0xBD, 0x16, 0x6C, 0xC9, 0xEE, 0x24}},
2315 "???","Unspecified Property Set",
2316 PropSet40_IDS
2318 { {0x346C8BD1, 0x2E6A, 0x4C45, {0x89, 0xA4, 0x61, 0xB7, 0x8E, 0x8E, 0x70, 0x0F}},
2319 "???","Unspecified Property Set",
2320 PropSet41_IDS
2322 { {0x38965063, 0xEDC8, 0x4268, {0x84, 0x91, 0xB7, 0x72, 0x31, 0x72, 0xCF, 0x29}},
2323 "???","Unspecified Property Set",
2324 PropSet42_IDS
2326 { {0x6A15E5A0, 0x0A1E, 0x4CD7, {0xBB, 0x8C, 0xD2, 0xF1, 0xB0, 0xC9, 0x29, 0xBC}},
2327 "???","Unspecified Property Set",
2328 PropSet43_IDS
2330 { {0x3F08E66F, 0x2F44, 0x4BB9, {0xA6, 0x82, 0xAC, 0x35, 0xD2, 0x56, 0x23, 0x22}},
2331 "???","Unspecified Property Set",
2332 PropSet45_IDS
2334 { {0xC89A23D0, 0x7D6D, 0x4EB8, {0x87, 0xD4, 0x77, 0x6A, 0x82, 0xD4, 0x93, 0xE5}},
2335 "???","Unspecified Property Set",
2336 PropSet46_IDS
2338 { {0x644D37B4, 0xE1B3, 0x4BAD, {0xB0, 0x99, 0x7E, 0x7C, 0x04, 0x96, 0x6A, 0xCA}},
2339 "???","Unspecified Property Set",
2340 PropSet47_IDS
2342 { {0x83A6347E, 0x6FE4, 0x4F40, {0xBA, 0x9C, 0xC4, 0x86, 0x52, 0x40, 0xD1, 0xF4}},
2343 "???","Unspecified Property Set",
2344 PropSet48_IDS
2346 { {0xB812F15D, 0xC2D8, 0x4BBF, {0xBA, 0xCD, 0x79, 0x74, 0x43, 0x46, 0x11, 0x3F}},
2347 "???","Unspecified Property Set",
2348 PropSet49_IDS
2350 { {0xA06992B3, 0x8CAF, 0x4ED7, {0xA5, 0x47, 0xB2, 0x59, 0xE3, 0x2A, 0xC9, 0xFC}},
2351 "???","Unspecified Property Set",
2352 PropSet50_IDS
2354 { {0x41CF5AE0, 0xF75A, 0x4806, {0xBD, 0x87, 0x59, 0xC7, 0xD9, 0x24, 0x8E, 0xB9}},
2355 "???","Unspecified Property Set",
2356 PropSet51_IDS
2358 { {0x0ADEF160, 0xDB3F, 0x4308, {0x9A, 0x21, 0x06, 0x23, 0x7B, 0x16, 0xFA, 0x2A}},
2359 "???","Unspecified Property Set",
2360 PropSet52_IDS
2362 { {0x8AFCC170, 0x8A46, 0x4B53, {0x9E, 0xEE, 0x90, 0xBA, 0xE7, 0x15, 0x1E, 0x62}},
2363 "???","Unspecified Property Set",
2364 PropSet53_IDS
2366 { {0x56310920, 0x2491, 0x4919, {0x99, 0xCE, 0xEA, 0xDB, 0x06, 0xFA, 0xFD, 0xB2}},
2367 "???","Unspecified Property Set",
2368 PropSet54_IDS
2370 { {0xB33AF30B, 0xF552, 0x4584, {0x93, 0x6C, 0xCB, 0x93, 0xE5, 0xCD, 0xA2, 0x9F}},
2371 "???","Unspecified Property Set",
2372 PropSet55_IDS
2374 { {0x67DF94DE, 0x0CA7, 0x4D6F, {0xB7, 0x92, 0x05, 0x3A, 0x3E, 0x4F, 0x03, 0xCF}},
2375 "???","Unspecified Property Set",
2376 PropSet56_IDS
2378 { {0x9098F33C, 0x9A7D, 0x48A8, {0x8D, 0xE5, 0x2E, 0x12, 0x27, 0xA6, 0x4E, 0x91}},
2379 "???","Unspecified Property Set",
2380 PropSet57_IDS
2382 { {0xDE5EF3C7, 0x46E1, 0x484E, {0x99, 0x99, 0x62, 0xC5, 0x30, 0x83, 0x94, 0xC1}},
2383 "???","Unspecified Property Set",
2384 PropSet58_IDS
2386 { {0x315B9C8D, 0x80A9, 0x4EF9, {0xAE, 0x16, 0x8E, 0x74, 0x6D, 0xA5, 0x1D, 0x70}},
2387 "???","Unspecified Property Set",
2388 PropSet59_IDS
2390 { {0x98F98354, 0x617A, 0x46B8, {0x85, 0x60, 0x5B, 0x1B, 0x64, 0xBF, 0x1F, 0x89}},
2391 "???","Unspecified Property Set",
2392 PropSet60_IDS
2394 { {0x08F6D7C2, 0xE3F2, 0x44FC, {0xAF, 0x1E, 0x5A, 0xA5, 0xC8, 0x1A, 0x2D, 0x3E}},
2395 "???","Unspecified Property Set",
2396 PropSet61_IDS
2398 { {0xD4D0AA16, 0x9948, 0x41A4, {0xAA, 0x85, 0xD9, 0x7F, 0xF9, 0x64, 0x69, 0x93}},
2399 "???","Unspecified Property Set",
2400 PropSet62_IDS
2402 { {0xDE41CC29, 0x6971, 0x4290, {0xB4, 0x72, 0xF5, 0x9F, 0x2E, 0x2F, 0x31, 0xE2}},
2403 "???","Unspecified Property Set",
2404 PropSet63_IDS
2406 { {0xDEA7C82C, 0x1D89, 0x4A66, {0x94, 0x27, 0xA4, 0xE3, 0xDE, 0xBA, 0xBC, 0xB1}},
2407 "???","Unspecified Property Set",
2408 PropSet64_IDS
2410 { {0x00F58A38, 0xC54B, 0x4C40, {0x86, 0x96, 0x97, 0x23, 0x59, 0x80, 0xEA, 0xE1}},
2411 "???","Unspecified Property Set",
2412 PropSet65_IDS
2414 { {0xCD9ED458, 0x08CE, 0x418F, {0xA7, 0x0E, 0xF9, 0x12, 0xC7, 0xBB, 0x9C, 0x5C}},
2415 "???","Unspecified Property Set",
2416 PropSet66_IDS
2418 { {0x64440492, 0x4C8B, 0x11D1, {0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03}},
2419 "???","Unspecified Property Set",
2420 PropSet67_IDS
2422 { {0xAAA660F9, 0x9865, 0x458E, {0xB4, 0x84, 0x01, 0xBC, 0x7F, 0xE3, 0x97, 0x3E}},
2423 "???","Unspecified Property Set",
2424 PropSet68_IDS
2426 { {0xE8309B6E, 0x084C, 0x49B4, {0xB1, 0xFC, 0x90, 0xA8, 0x03, 0x31, 0xB6, 0x38}},
2427 "???","Unspecified Property Set",
2428 PropSet69_IDS
2430 { {0x64440490, 0x4C8B, 0x11D1, {0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03}},
2431 "???","Unspecified Property Set",
2432 PropSet70_IDS
2434 { {0xE4F10A3C, 0x49E6, 0x405D, {0x82, 0x88, 0xA2, 0x3B, 0xD4, 0xEE, 0xAA, 0x6C}},
2435 "???","Unspecified Property Set",
2436 PropSet71_IDS
2438 { {0x14B81DA1, 0x0135, 0x4D31, {0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99}},
2439 "???","Unspecified Property Set",
2440 PropSet72_IDS
2442 { {0xAAF16BAC, 0x2B55, 0x45E6, {0x9F, 0x6D, 0x41, 0x5E, 0xB9, 0x49, 0x10, 0xDF}},
2443 "???","Unspecified Property Set",
2444 PropSet73_IDS
2446 { {0x821437D6, 0x9EAB, 0x4765, {0xA5, 0x89, 0x3B, 0x1C, 0xBB, 0xD2, 0x2A, 0x61}},
2447 "???","Unspecified Property Set",
2448 PropSet74_IDS
2450 { {0xD55BAE5A, 0x3892, 0x417A, {0xA6, 0x49, 0xC6, 0xAC, 0x5A, 0xAA, 0xEA, 0xB3}},
2451 "???","Unspecified Property Set",
2452 PropSet75_IDS
2454 { {0x72FC5BA4, 0x24F9, 0x4011, {0x9F, 0x3F, 0xAD, 0xD2, 0x7A, 0xFA, 0xD8, 0x18}},
2455 "???","Unspecified Property Set",
2456 PropSet76_IDS
2458 { {0x0BA7D6C3, 0x568D, 0x4159, {0xAB, 0x91, 0x78, 0x1A, 0x91, 0xFB, 0x71, 0xE5}},
2459 "???","Unspecified Property Set",
2460 PropSet77_IDS
2462 { {0x744C8242, 0x4DF5, 0x456C, {0xAB, 0x9E, 0x01, 0x4E, 0xFB, 0x90, 0x21, 0xE3}},
2463 "???","Unspecified Property Set",
2464 PropSet78_IDS
2466 { {0xB9B4B3FC, 0x2B51, 0x4A42, {0xB5, 0xD8, 0x32, 0x41, 0x46, 0xAF, 0xCF, 0x25}},
2467 "???","Unspecified Property Set",
2468 PropSet79_IDS
2470 { {0x5DC2253F, 0x5E11, 0x4ADF, {0x9C, 0xFE, 0x91, 0x0D, 0xD0, 0x1E, 0x3E, 0x70}},
2471 "???","Unspecified Property Set",
2472 PropSet80_IDS
2474 { {0x7B9F6399, 0x0A3F, 0x4B12, {0x89, 0xBD, 0x4A, 0xDC, 0x51, 0xC9, 0x18, 0xAF}},
2475 "???","Unspecified Property Set",
2476 PropSet81_IDS
2478 { {0x8589E481, 0x6040, 0x473D, {0xB1, 0x71, 0x7F, 0xA8, 0x9C, 0x27, 0x08, 0xED}},
2479 "???","Unspecified Property Set",
2480 PropSet82_IDS
2482 { {0x5DA84765, 0xE3FF, 0x4278, {0x86, 0xB0, 0xA2, 0x79, 0x67, 0xFB, 0xDD, 0x03}},
2483 "???","Unspecified Property Set",
2484 PropSet83_IDS
2486 { {0x14977844, 0x6B49, 0x4AAD, {0xA7, 0x14, 0xA4, 0x51, 0x3B, 0xF6, 0x04, 0x60}},
2487 "???","Unspecified Property Set",
2488 PropSet84_IDS
2490 { {0x90E5E14E, 0x648B, 0x4826, {0xB2, 0xAA, 0xAC, 0xAF, 0x79, 0x0E, 0x35, 0x13}},
2491 "???","Unspecified Property Set",
2492 PropSet85_IDS
2494 { {0x293CA35A, 0x09AA, 0x4DD2, {0xB1, 0x80, 0x1F, 0xE2, 0x45, 0x72, 0x8A, 0x52}},
2495 "???","Unspecified Property Set",
2496 PropSet86_IDS
2498 { {0xC8EA94F0, 0xA9E3, 0x4969, {0xA9, 0x4B, 0x9C, 0x62, 0xA9, 0x53, 0x24, 0xE0}},
2499 "???","Unspecified Property Set",
2500 PropSet87_IDS
2502 { {0x8B26EA41, 0x058F, 0x43F6, {0xAE, 0xCC, 0x40, 0x35, 0x68, 0x1C, 0xE9, 0x77}},
2503 "???","Unspecified Property Set",
2504 PropSet88_IDS
2506 { {0xF21D9941, 0x81F0, 0x471A, {0xAD, 0xEE, 0x4E, 0x74, 0xB4, 0x92, 0x17, 0xED}},
2507 "???","Unspecified Property Set",
2508 PropSet89_IDS
2510 { {0xB0B87314, 0xFCF6, 0x4FEB, {0x8D, 0xFF, 0xA5, 0x0D, 0xA6, 0xAF, 0x56, 0x1C}},
2511 "???","Unspecified Property Set",
2512 PropSet90_IDS
2514 { {0xCC6F4F24, 0x6083, 0x4BD4, {0x87, 0x54, 0x67, 0x4D, 0x0D, 0xE8, 0x7A, 0xB8}},
2515 "???","Unspecified Property Set",
2516 PropSet91_IDS
2518 { {0xA0E74609, 0xB84D, 0x4F49, {0xB8, 0x60, 0x46, 0x2B, 0xD9, 0x97, 0x1F, 0x98}},
2519 "???","Unspecified Property Set",
2520 PropSet92_IDS
2522 { {0xD68DBD8A, 0x3374, 0x4B81, {0x99, 0x72, 0x3E, 0xC3, 0x06, 0x82, 0xDB, 0x3D}},
2523 "???","Unspecified Property Set",
2524 PropSet93_IDS
2526 { {0x2CBAA8F5, 0xD81F, 0x47CA, {0xB1, 0x7A, 0xF8, 0xD8, 0x22, 0x30, 0x01, 0x31}},
2527 "???","Unspecified Property Set",
2528 PropSet94_IDS
2530 { {0x72FAB781, 0xACDA, 0x43E5, {0xB1, 0x55, 0xB2, 0x43, 0x4F, 0x85, 0xE6, 0x78}},
2531 "???","Unspecified Property Set",
2532 PropSet95_IDS
2534 { {0x6B8DA074, 0x3B5C, 0x43BC, {0x88, 0x6F, 0x0A, 0x2C, 0xDC, 0xE0, 0x0B, 0x6F}},
2535 "???","Unspecified Property Set",
2536 PropSet96_IDS
2538 { {0x18BBD425, 0xECFD, 0x46EF, {0xB6, 0x12, 0x7B, 0x4A, 0x60, 0x34, 0xED, 0xA0}},
2539 "???","Unspecified Property Set",
2540 PropSet97_IDS
2542 { {0x276D7BB0, 0x5B34, 0x4FB0, {0xAA, 0x4B, 0x15, 0x8E, 0xD1, 0x2A, 0x18, 0x09}},
2543 "???","Unspecified Property Set",
2544 PropSet99_IDS
2546 { {0xFEC690B7, 0x5F30, 0x4646, {0xAE, 0x47, 0x4C, 0xAA, 0xFB, 0xA8, 0x84, 0xA3}},
2547 "???","Unspecified Property Set",
2548 PropSet100_IDS
2550 { {0x46B4E8DE, 0xCDB2, 0x440D, {0x88, 0x5C, 0x16, 0x58, 0xEB, 0x65, 0xB9, 0x14}},
2551 "???","Unspecified Property Set",
2552 PropSet101_IDS
2554 { {0xF628FD8C, 0x7BA8, 0x465A, {0xA6, 0x5B, 0xC5, 0xAA, 0x79, 0x26, 0x3A, 0x9E}},
2555 "???","Unspecified Property Set",
2556 PropSet102_IDS
2558 { {0x7A7D76F4, 0xB630, 0x4BD7, {0x95, 0xFF, 0x37, 0xCC, 0x51, 0xA9, 0x75, 0xC9}},
2559 "???","Unspecified Property Set",
2560 PropSet103_IDS
2562 { {0x446F787F, 0x10C4, 0x41CB, {0xA6, 0xC4, 0x4D, 0x03, 0x43, 0x55, 0x15, 0x97}},
2563 "???","Unspecified Property Set",
2564 PropSet104_IDS
2566 { {0xA9EA193C, 0xC511, 0x498A, {0xA0, 0x6B, 0x58, 0xE2, 0x77, 0x6D, 0xCC, 0x28}},
2567 "???","Unspecified Property Set",
2568 PropSet105_IDS
2570 { {0x97B0AD89, 0xDF49, 0x49CC, {0x83, 0x4E, 0x66, 0x09, 0x74, 0xFD, 0x75, 0x5B}},
2571 "???","Unspecified Property Set",
2572 PropSet106_IDS
2574 { {0xF6272D18, 0xCECC, 0x40B1, {0xB2, 0x6A, 0x39, 0x11, 0x71, 0x7A, 0xA7, 0xBD}},
2575 "???","Unspecified Property Set",
2576 PropSet107_IDS
2578 { {0x61478C08, 0xB600, 0x4A84, {0xBB, 0xE4, 0xE9, 0x9C, 0x45, 0xF0, 0xA0, 0x72}},
2579 "???","Unspecified Property Set",
2580 PropSet108_IDS
2582 { {0xBCCC8A3C, 0x8CEF, 0x42E5, {0x9B, 0x1C, 0xC6, 0x90, 0x79, 0x39, 0x8B, 0xC7}},
2583 "???","Unspecified Property Set",
2584 PropSet109_IDS
2586 { {0x9AD5BADB, 0xCEA7, 0x4470, {0xA0, 0x3D, 0xB8, 0x4E, 0x51, 0xB9, 0x94, 0x9E}},
2587 "???","Unspecified Property Set",
2588 PropSet110_IDS
2590 { {0xF1A24AA7, 0x9CA7, 0x40F6, {0x89, 0xEC, 0x97, 0xDE, 0xF9, 0xFF, 0xE8, 0xDB}},
2591 "???","Unspecified Property Set",
2592 PropSet111_IDS
2594 { {0x3602C812, 0x0F3B, 0x45F0, {0x85, 0xAD, 0x60, 0x34, 0x68, 0xD6, 0x94, 0x23}},
2595 "???","Unspecified Property Set",
2596 PropSet112_IDS
2598 { {0xA6F360D2, 0x55F9, 0x48DE, {0xB9, 0x09, 0x62, 0x0E, 0x09, 0x0A, 0x64, 0x7C}},
2599 "???","Unspecified Property Set",
2600 PropSet113_IDS
2602 { {0x897B3694, 0xFE9E, 0x43E6, {0x80, 0x66, 0x26, 0x0F, 0x59, 0x0C, 0x01, 0x00}},
2603 "???","Unspecified Property Set",
2604 PropSet114_IDS
2606 { {0x8619A4B6, 0x9F4D, 0x4429, {0x8C, 0x0F, 0xB9, 0x96, 0xCA, 0x59, 0xE3, 0x35}},
2607 "???","Unspecified Property Set",
2608 PropSet115_IDS
2610 { {0xA26F4AFC, 0x7346, 0x4299, {0xBE, 0x47, 0xEB, 0x1A, 0xE6, 0x13, 0x13, 0x9F}},
2611 "???","Unspecified Property Set",
2612 PropSet116_IDS
2614 { {0xBC4E71CE, 0x17F9, 0x48D5, {0xBE, 0xE9, 0x02, 0x1D, 0xF0, 0xEA, 0x54, 0x09}},
2615 "???","Unspecified Property Set",
2616 PropSet117_IDS
2618 { {0x65A98875, 0x3C80, 0x40AB, {0xAB, 0xBC, 0xEF, 0xDA, 0xF7, 0x7D, 0xBE, 0xE2}},
2619 "???","Unspecified Property Set",
2620 PropSet118_IDS
2622 { {0x84D8F337, 0x981D, 0x44B3, {0x96, 0x15, 0xC7, 0x59, 0x6D, 0xBA, 0x17, 0xE3}},
2623 "???","Unspecified Property Set",
2624 PropSet119_IDS
2626 { {0xBE1A72C6, 0x9A1D, 0x46B7, {0xAF, 0xE7, 0xAF, 0xAF, 0x8C, 0xEF, 0x49, 0x99}},
2627 "???","Unspecified Property Set",
2628 PropSet120_IDS
2630 { {0x8F367200, 0xC270, 0x457C, {0xB1, 0xD4, 0xE0, 0x7C, 0x5B, 0xCD, 0x90, 0xC7}},
2631 "???","Unspecified Property Set",
2632 PropSet121_IDS
2634 { {0x428040AC, 0xA177, 0x4C8A, {0x97, 0x60, 0xF6, 0xF7, 0x61, 0x22, 0x7F, 0x9A}},
2635 "???","Unspecified Property Set",
2636 PropSet122_IDS
2638 { {0xA3B29791, 0x7713, 0x4E1D, {0xBB, 0x40, 0x17, 0xDB, 0x85, 0xF0, 0x18, 0x31}},
2639 "???","Unspecified Property Set",
2640 PropSet123_IDS
2642 { {0xBCEEE283, 0x35DF, 0x4D53, {0x82, 0x6A, 0xF3, 0x6A, 0x3E, 0xEF, 0xC6, 0xBE}},
2643 "???","Unspecified Property Set",
2644 PropSet124_IDS
2646 { {0x91EFF6F3, 0x2E27, 0x42CA, {0x93, 0x3E, 0x7C, 0x99, 0x9F, 0xBE, 0x31, 0x0B}},
2647 "???","Unspecified Property Set",
2648 PropSet125_IDS
2650 { {0x5CBF2787, 0x48CF, 0x4208, {0xB9, 0x0E, 0xEE, 0x5E, 0x5D, 0x42, 0x02, 0x94}},
2651 "???","Unspecified Property Set",
2652 PropSet126_IDS
2654 { {0x1B5439E7, 0xEBA1, 0x4AF8, {0xBD, 0xD7, 0x7A, 0xF1, 0xD4, 0x54, 0x94, 0x93}},
2655 "???","Unspecified Property Set",
2656 PropSet127_IDS
2658 { {0x08C7CC5F, 0x60F2, 0x4494, {0xAD, 0x75, 0x55, 0xE3, 0xE0, 0xB5, 0xAD, 0xD0}},
2659 "???","Unspecified Property Set",
2660 PropSet128_IDS
2662 { {0x7FE3AA27, 0x2648, 0x42F3, {0x89, 0xB0, 0x45, 0x4E, 0x5C, 0xB1, 0x50, 0xC3}},
2663 "???","Unspecified Property Set",
2664 PropSet129_IDS
2666 { {0xE53D799D, 0x0F3F, 0x466E, {0xB2, 0xFF, 0x74, 0x63, 0x4A, 0x3C, 0xB7, 0xA4}},
2667 "???","Unspecified Property Set",
2668 PropSet130_IDS
2670 { {0x4776CAFA, 0xBCE4, 0x4CB1, {0xA2, 0x3E, 0x26, 0x5E, 0x76, 0xD8, 0xEB, 0x11}},
2671 "???","Unspecified Property Set",
2672 PropSet131_IDS
2674 { {0x71B377D6, 0xE570, 0x425F, {0xA1, 0x70, 0x80, 0x9F, 0xAE, 0x73, 0xE5, 0x4E}},
2675 "???","Unspecified Property Set",
2676 PropSet132_IDS
2678 { {0x3143BF7C, 0x80A8, 0x4854, {0x88, 0x80, 0xE2, 0xE4, 0x01, 0x89, 0xBD, 0xD0}},
2679 "???","Unspecified Property Set",
2680 PropSet133_IDS
2682 { {0xA6744477, 0xC237, 0x475B, {0xA0, 0x75, 0x54, 0xF3, 0x44, 0x98, 0x29, 0x2A}},
2683 "???","Unspecified Property Set",
2684 PropSet134_IDS
2686 { {0xC9C34F84, 0x2241, 0x4401, {0xB6, 0x07, 0xBD, 0x20, 0xED, 0x75, 0xAE, 0x7F}},
2687 "???","Unspecified Property Set",
2688 PropSet135_IDS
2690 { {0xF8FA7FA3, 0xD12B, 0x4785, {0x8A, 0x4E, 0x69, 0x1A, 0x94, 0xF7, 0xA3, 0xE7}},
2691 "???","Unspecified Property Set",
2692 PropSet136_IDS
2694 { {0x7268AF55, 0x1CE4, 0x4F6E, {0xA4, 0x1F, 0xB6, 0xE4, 0xEF, 0x10, 0xE4, 0xA9}},
2695 "???","Unspecified Property Set",
2696 PropSet137_IDS
2698 { {0xE1D4A09E, 0xD758, 0x4CD1, {0xB6, 0xEC, 0x34, 0xA8, 0xB5, 0xA7, 0x3F, 0x80}},
2699 "???","Unspecified Property Set",
2700 PropSet138_IDS
2702 { {0xD7313FF1, 0xA77A, 0x401C, {0x8C, 0x99, 0x3D, 0xBD, 0xD6, 0x8A, 0xDD, 0x36}},
2703 "???","Unspecified Property Set",
2704 PropSet139_IDS
2706 { {0xF85BF840, 0xA925, 0x4BC2, {0xB0, 0xC4, 0x8E, 0x36, 0xB5, 0x98, 0x67, 0x9E}},
2707 "???","Unspecified Property Set",
2708 PropSet140_IDS
2710 { {0x668CDFA5, 0x7A1B, 0x4323, {0xAE, 0x4B, 0xE5, 0x27, 0x39, 0x3A, 0x1D, 0x81}},
2711 "???","Unspecified Property Set",
2712 PropSet141_IDS
2714 { {0xEE3D3D8A, 0x5381, 0x4CFA, {0xB1, 0x3B, 0xAA, 0xF6, 0x6B, 0x5F, 0x4E, 0xC9}},
2715 "???","Unspecified Property Set",
2716 PropSet142_IDS
2718 { {0xD0C7F054, 0x3F72, 0x4725, {0x85, 0x27, 0x12, 0x9A, 0x57, 0x7C, 0xB2, 0x69}},
2719 "???","Unspecified Property Set",
2720 PropSet143_IDS
2722 { {0x3C8CEE58, 0xD4F0, 0x4CF9, {0xB7, 0x56, 0x4E, 0x5D, 0x24, 0x44, 0x7B, 0xCD}},
2723 "???","Unspecified Property Set",
2724 PropSet144_IDS
2726 { {0x6E682923, 0x7F7B, 0x4F0C, {0xA3, 0x37, 0xCF, 0xCA, 0x29, 0x66, 0x87, 0xBF}},
2727 "???","Unspecified Property Set",
2728 PropSet145_IDS
2730 { {0xFD122953, 0xFA93, 0x4EF7, {0x92, 0xC3, 0x04, 0xC9, 0x46, 0xB2, 0xF7, 0xC8}},
2731 "???","Unspecified Property Set",
2732 PropSet146_IDS
2734 { {0x0BE1C8E7, 0x1981, 0x4676, {0xAE, 0x14, 0xFD, 0xD7, 0x8F, 0x05, 0xA6, 0xE7}},
2735 "???","Unspecified Property Set",
2736 PropSet147_IDS
2738 { {0xF1176DFE, 0x7138, 0x4640, {0x8B, 0x4C, 0xAE, 0x37, 0x5D, 0xC7, 0x0A, 0x6D}},
2739 "???","Unspecified Property Set",
2740 PropSet148_IDS
2742 { {0x95BEB1FC, 0x326D, 0x4644, {0xB3, 0x96, 0xCD, 0x3E, 0xD9, 0x0E, 0x6D, 0xDF}},
2743 "???","Unspecified Property Set",
2744 PropSet149_IDS
2746 { {0xDDD1460F, 0xC0BF, 0x4553, {0x8C, 0xE4, 0x10, 0x43, 0x3C, 0x90, 0x8F, 0xB0}},
2747 "???","Unspecified Property Set",
2748 PropSet150_IDS
2750 { {0x9B174B34, 0x40FF, 0x11D2, {0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71}},
2751 "???","Unspecified Property Set",
2752 PropSet151_IDS
2754 { {0x08A65AA1, 0xF4C9, 0x43DD, {0x9D, 0xDF, 0xA3, 0x3D, 0x8E, 0x7E, 0xAD, 0x85}},
2755 "???","Unspecified Property Set",
2756 PropSet152_IDS
2758 { {0x084D8A0A, 0xE6D5, 0x40DE, {0xBF, 0x1F, 0xC8, 0x82, 0x0E, 0x7C, 0x87, 0x7C}},
2759 "???","Unspecified Property Set",
2760 PropSet153_IDS
2762 { {0x841E4F90, 0xFF59, 0x4D16, {0x89, 0x47, 0xE8, 0x1B, 0xBF, 0xFA, 0xB3, 0x6D}},
2763 "???","Unspecified Property Set",
2764 PropSet154_IDS
2766 { {0xFC9F7306, 0xFF8F, 0x4D49, {0x9F, 0xB6, 0x3F, 0xFE, 0x5C, 0x09, 0x51, 0xEC}},
2767 "???","Unspecified Property Set",
2768 PropSet155_IDS
2770 { {0x53DA57CF, 0x62C0, 0x45C4, {0x81, 0xDE, 0x76, 0x10, 0xBC, 0xEF, 0xD7, 0xF5}},
2771 "???","Unspecified Property Set",
2772 PropSet156_IDS
2774 { {0xF8D3F6AC, 0x4874, 0x42CB, {0xBE, 0x59, 0xAB, 0x45, 0x4B, 0x30, 0x71, 0x6A}},
2775 "???","Unspecified Property Set",
2776 PropSet157_IDS
2778 { {0x4684FE97, 0x8765, 0x4842, {0x9C, 0x13, 0xF0, 0x06, 0x44, 0x7B, 0x17, 0x8C}},
2779 "???","Unspecified Property Set",
2780 PropSet158_IDS
2782 { {0xC449D5CB, 0x9EA4, 0x4809, {0x82, 0xE8, 0xAF, 0x9D, 0x59, 0xDE, 0xD6, 0xD1}},
2783 "???","Unspecified Property Set",
2784 PropSet159_IDS
2786 { {0x3F8472B5, 0xE0AF, 0x4DB2, {0x80, 0x71, 0xC5, 0x3F, 0xE7, 0x6A, 0xE7, 0xCE}},
2787 "???","Unspecified Property Set",
2788 PropSet160_IDS
2790 { {0x0CEF7D53, 0xFA64, 0x11D1, {0xA2, 0x03, 0x00, 0x00, 0xF8, 0x1F, 0xED, 0xEE}},
2791 "???","Unspecified Property Set",
2792 PropSet161_IDS
2794 { {0xFDF84370, 0x031A, 0x4ADD, {0x9E, 0x91, 0x0D, 0x77, 0x5F, 0x1C, 0x66, 0x05}},
2795 "???","Unspecified Property Set",
2796 PropSet162_IDS
2798 { {0x6D748DE2, 0x8D38, 0x4CC3, {0xAC, 0x60, 0xF0, 0x09, 0xB0, 0x57, 0xC5, 0x57}},
2799 "???","Unspecified Property Set",
2800 PropSet163_IDS
2802 { {0x2579E5D0, 0x1116, 0x4084, {0xBD, 0x9A, 0x9B, 0x4F, 0x7C, 0xB4, 0xDF, 0x5E}},
2803 "???","Unspecified Property Set",
2804 PropSet164_IDS
2806 { {0xC554493C, 0xC1F7, 0x40C1, {0xA7, 0x6C, 0xEF, 0x8C, 0x06, 0x14, 0x00, 0x3E}},
2807 "???","Unspecified Property Set",
2808 PropSet165_IDS
2810 { {0x0DA41CFA, 0xD224, 0x4A18, {0xAE, 0x2F, 0x59, 0x61, 0x58, 0xDB, 0x4B, 0x3A}},
2811 "???","Unspecified Property Set",
2812 PropSet166_IDS
2814 { {0xA82D9EE7, 0xCA67, 0x4312, {0x96, 0x5E, 0x22, 0x6B, 0xCE, 0xA8, 0x50, 0x23}},
2815 "???","Unspecified Property Set",
2816 PropSet167_IDS
2818 { {0x09329B74, 0x40A3, 0x4C68, {0xBF, 0x07, 0xAF, 0x9A, 0x57, 0x2F, 0x60, 0x7C}},
2819 "???","Unspecified Property Set",
2820 PropSet168_IDS
2822 { {0x9A93244D, 0xA7AD, 0x4FF8, {0x9B, 0x99, 0x45, 0xEE, 0x4C, 0xC0, 0x9A, 0xF6}},
2823 "???","Unspecified Property Set",
2824 PropSet169_IDS
2826 { {0xF04BEF95, 0xC585, 0x4197, {0xA2, 0xB7, 0xDF, 0x46, 0xFD, 0xC9, 0xEE, 0x6D}},
2827 "???","Unspecified Property Set",
2828 PropSet170_IDS
2830 { {0x59DDE9F2, 0x5253, 0x40EA, {0x9A, 0x8B, 0x47, 0x9E, 0x96, 0xC6, 0x24, 0x9A}},
2831 "???","Unspecified Property Set",
2832 PropSet171_IDS
2834 { {0x6444048F, 0x4C8B, 0x11D1, {0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03}},
2835 "???","Unspecified Property Set",
2836 PropSet172_IDS
2838 { {0x9A9BC088, 0x4F6D, 0x469E, {0x99, 0x19, 0xE7, 0x05, 0x41, 0x20, 0x40, 0xF9}},
2839 "???","Unspecified Property Set",
2840 PropSet173_IDS
2842 { {0x6336B95E, 0xC7A7, 0x426D, {0x86, 0xFD, 0x7A, 0xE3, 0xD3, 0x9C, 0x84, 0xB4}},
2843 "???","Unspecified Property Set",
2844 PropSet174_IDS
2846 { {0xC06238B2, 0x0BF9, 0x4279, {0xA7, 0x23, 0x25, 0x85, 0x67, 0x15, 0xCB, 0x9D}},
2847 "???","Unspecified Property Set",
2848 PropSet175_IDS
2850 { {0xEC0B4191, 0xAB0B, 0x4C66, {0x90, 0xB6, 0xC6, 0x63, 0x7C, 0xDE, 0xBB, 0xAB}},
2851 "???","Unspecified Property Set",
2852 PropSet176_IDS
2854 { {0x660E04D6, 0x81AB, 0x4977, {0xA0, 0x9F, 0x82, 0x31, 0x31, 0x13, 0xAB, 0x26}},
2855 "???","Unspecified Property Set",
2856 PropSet177_IDS
2858 { {0xDC54FD2E, 0x189D, 0x4871, {0xAA, 0x01, 0x08, 0xC2, 0xF5, 0x7A, 0x4A, 0xBC}},
2859 "???","Unspecified Property Set",
2860 PropSet178_IDS
2862 { {0xCD102C9C, 0x5540, 0x4A88, {0xA6, 0xF6, 0x64, 0xE4, 0x98, 0x1C, 0x8C, 0xD1}},
2863 "???","Unspecified Property Set",
2864 PropSet179_IDS
2866 { {0x1F856A9F, 0x6900, 0x4ABA, {0x95, 0x05, 0x2D, 0x5F, 0x1B, 0x4D, 0x66, 0xCB}},
2867 "???","Unspecified Property Set",
2868 PropSet180_IDS
2870 { {0x90197CA7, 0xFD8F, 0x4E8C, {0x9D, 0xA3, 0xB5, 0x7E, 0x1E, 0x60, 0x92, 0x95}},
2871 "???","Unspecified Property Set",
2872 PropSet181_IDS
2874 { {0xF334115E, 0xDA1B, 0x4509, {0x9B, 0x3D, 0x11, 0x95, 0x04, 0xDC, 0x7A, 0xBB}},
2875 "???","Unspecified Property Set",
2876 PropSet182_IDS
2878 { {0xBF53D1C3, 0x49E0, 0x4F7F, {0x85, 0x67, 0x5A, 0x82, 0x1D, 0x8A, 0xC5, 0x42}},
2879 "???","Unspecified Property Set",
2880 PropSet183_IDS
2882 { {0xC75FAA05, 0x96FD, 0x49E7, {0x9C, 0xB4, 0x9F, 0x60, 0x10, 0x82, 0xD5, 0x53}},
2883 "???","Unspecified Property Set",
2884 PropSet184_IDS
2886 { {0x2E4B640D, 0x5019, 0x46D8, {0x88, 0x81, 0x55, 0x41, 0x4C, 0xC5, 0xCA, 0xA0}},
2887 "???","Unspecified Property Set",
2888 PropSet185_IDS
2890 { {0x6B8B68F6, 0x200B, 0x47EA, {0x8D, 0x25, 0xD8, 0x05, 0x0F, 0x57, 0x33, 0x9F}},
2891 "???","Unspecified Property Set",
2892 PropSet186_IDS
2894 { {0x2D152B40, 0xCA39, 0x40DB, {0xB2, 0xCC, 0x57, 0x37, 0x25, 0xB2, 0xFE, 0xC5}},
2895 "???","Unspecified Property Set",
2896 PropSet187_IDS
2898 { {0x1E005EE6, 0xBF27, 0x428B, {0xB0, 0x1C, 0x79, 0x67, 0x6A, 0xCD, 0x28, 0x70}},
2899 "???","Unspecified Property Set",
2900 PropSet188_IDS
2902 { {0xD6304E01, 0xF8F5, 0x4F45, {0x8B, 0x15, 0xD0, 0x24, 0xA6, 0x29, 0x67, 0x89}},
2903 "???","Unspecified Property Set",
2904 PropSet189_IDS
2906 { {0x402B5934, 0xEC5A, 0x48C3, {0x93, 0xE6, 0x85, 0xE8, 0x6A, 0x2D, 0x93, 0x4E}},
2907 "???","Unspecified Property Set",
2908 PropSet190_IDS
2910 { {0x9AEBAE7A, 0x9644, 0x487D, {0xA9, 0x2C, 0x65, 0x75, 0x85, 0xED, 0x75, 0x1A}},
2911 "???","Unspecified Property Set",
2912 PropSet191_IDS
2914 { {0x63C25B20, 0x96BE, 0x488F, {0x87, 0x88, 0xC0, 0x9C, 0x40, 0x7A, 0xD8, 0x12}},
2915 "???","Unspecified Property Set",
2916 PropSet192_IDS
2918 { {0x48FD6EC8, 0x8A12, 0x4CDF, {0xA0, 0x3E, 0x4E, 0xC5, 0xA5, 0x11, 0xED, 0xDE}},
2919 "???","Unspecified Property Set",
2920 PropSet193_IDS
2922 { {0x64440491, 0x4C8B, 0x11D1, {0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03}},
2923 "???","Unspecified Property Set",
2924 PropSet194_IDS
2926 { {0xC0AC206A, 0x827E, 0x4650, {0x95, 0xAE, 0x77, 0xE2, 0xBB, 0x74, 0xFC, 0xC9}},
2927 "???","Unspecified Property Set",
2928 PropSet195_IDS
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}
2942 static const struct GuidPropertySet *GuidPropertySet_find_guid(const e_guid_t *guid)
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];
2950 return NULL;
2953 static void get_name_from_fullpropspec(struct CFullPropSpec *v, char *out, int bufsize)
2955 const 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;
2960 if (id_str) {
2961 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 snprintf(dest, bufsize, "\"%s\"", guid_str);
2966 } else {
2967 guid_str = guid_to_str(wmem_packet_scope(), &v->guid);
2968 snprintf(dest, bufsize, "{%s}", guid_str);
2970 if (v->kind == PRSPEC_LPWSTR) {
2971 snprintf(dest, bufsize, "%s \"%s\"", guid_str, v->u.name);
2972 } else if (v->kind == PRSPEC_PROPID) {
2973 snprintf(dest, bufsize, "%s 0x%08x", guid_str, v->u.propid);
2974 } else {
2975 char *str = ws_strdup_printf("%s <INVALID>", dest);
2976 g_strlcpy(dest, str, bufsize);
2977 g_free(str);
2982 /******************************************************************************/
2983 static int parse_uin32_array(tvbuff_t *tvb, int offset, proto_tree *tree, uint32_t count, const char *fmt, ...)
2985 uint32_t v, i;
2986 proto_item *item;
2987 const char *txt;
2988 va_list ap;
2990 va_start(ap, fmt);
2991 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
2992 va_end(ap);
2993 proto_tree_add_subtree(tree, tvb, offset, count * 4, ett_mswsp_uin32_array, &item, txt);
2994 proto_item_append_text(item, " count %u [", count);
2995 for (i=0; i<count; i++) {
2996 v = tvb_get_letohl(tvb, offset);
2997 offset += 4;
2998 if (i>0) {
2999 proto_item_append_text(item, ",%u", v);
3000 } else {
3001 proto_item_append_text(item, "%u", v);
3004 proto_item_append_text(item, "]");
3005 return offset;
3008 static int parse_padding(tvbuff_t *tvb, int offset, int alignment, proto_tree *pad_tree, const char *fmt, ...)
3010 if (offset % alignment) {
3011 const int padding = alignment - (offset % alignment);
3012 const char *txt;
3013 va_list ap;
3014 proto_item *ti;
3015 va_start(ap, fmt);
3016 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3017 proto_tree_add_subtree(pad_tree, tvb, offset, padding, ett_mswsp_msg_padding, &ti, txt);
3018 va_end(ap);
3020 proto_item_append_text(ti, " (%d)", padding);
3021 offset += padding;
3023 DISSECTOR_ASSERT((offset % alignment) == 0);
3024 return offset;
3027 static int parse_guid(tvbuff_t *tvb, int offset, proto_tree *tree, e_guid_t *guid, const char *text)
3029 const char *guid_str, *name, *bytes;
3030 proto_tree *tr;
3032 tvb_get_letohguid(tvb, offset, guid);
3033 guid_str = guid_to_str(wmem_packet_scope(), guid);
3034 name = guids_get_guid_name(guid, wmem_packet_scope());
3036 tr = proto_tree_add_subtree_format(tree, tvb, offset, 16, ett_GUID, NULL, "%s: %s {%s}", text, name ? name : "", guid_str);
3039 proto_tree_add_item(tr, hf_mswsp_guid_time_low, tvb, offset, 4, ENC_LITTLE_ENDIAN);
3040 offset += 4;
3041 proto_tree_add_item(tr, hf_mswsp_guid_time_mid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
3042 offset += 2;
3043 proto_tree_add_item(tr, hf_mswsp_guid_time_high, tvb, offset, 2, ENC_LITTLE_ENDIAN);
3044 offset += 2;
3045 proto_tree_add_item(tr, hf_mswsp_guid_time_clock_hi, tvb, offset, 1, ENC_LITTLE_ENDIAN);
3046 offset += 1;
3047 proto_tree_add_item(tr, hf_mswsp_guid_time_clock_low, tvb, offset, 1, ENC_LITTLE_ENDIAN);
3048 offset += 1;
3049 bytes = bytes_to_str_punct(wmem_packet_scope(), &guid->data4[2], 6, ':');
3050 proto_tree_add_string(tr, hf_mswsp_guid_node, tvb, offset, 6, bytes);
3052 offset += 6;
3054 return offset;
3057 /* Language Code ID - MS-LCID section 2.2 "LCID Structure":
3059 * https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/63d3d639-7fd2-4afb-abbe-0d5b5551eef8
3061 static int parse_lcid(tvbuff_t *tvb, int offset, proto_tree *parent_tree, const char *text)
3063 proto_item *item;
3064 proto_tree *tree;
3065 uint32_t lcid;
3067 lcid = tvb_get_letohl(tvb, offset);
3068 item = proto_tree_add_uint_format(parent_tree, hf_mswsp_lcid, tvb, offset, 4, lcid, "%s: 0x%x", text, lcid);
3069 tree = proto_item_add_subtree(item, ett_LCID);
3071 proto_tree_add_uint(tree, hf_mswsp_lcid_langid, tvb, offset + 2, 2, lcid);
3072 proto_tree_add_uint(tree, hf_mswsp_lcid_sortid, tvb, offset + 1, 1, (lcid >> 16) & 0xF);
3073 offset += 4;
3074 return offset;
3077 /*****************************************************************************************/
3078 /* 2.2.1.1 CBaseStorageVariant */
3079 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);
3081 /* 2.2.1.2 CFullPropSpec */
3082 static int parse_CFullPropSpec(tvbuff_t *tvb, int offset, proto_tree *tree, proto_tree *pad_tree, struct CFullPropSpec *v, const char *fmt, ...);
3084 /* 2.2.1.3 CContentRestriction */
3085 static int parse_CContentRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CContentRestriction *v, const char *fmt, ...);
3087 /* 2.2.1.5 CNatLanguageRestriction */
3088 static int parse_CNatLanguageRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CNatLanguageRestriction *v, const char *fmt, ...);
3090 /* 2.2.1.6 CNodeRestriction */
3091 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, ...);
3093 /* 2.2.1.7 CPropertyRestriction */
3094 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, ...);
3096 /* 2.2.1.8 CReuseWhere */
3097 static int parse_CReuseWhere(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, struct CReuseWhere *v, const char *fmt, ...);
3099 /* 2.2.1.10 CSort */
3100 static int parse_CSort(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, const char *fmt, ...);
3102 /* 2.2.1.12 CCoercionRestriction */
3103 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, ...);
3104 /* 2.2.1.16 CRestrictionArray */
3105 static int parse_CRestrictionArray(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3107 /* 2.2.1.17 CRestriction */
3108 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, ...);
3110 /* 2.2.1.18 CColumnSet */
3111 static int parse_CColumnSet(tvbuff_t *tvb, int offset, proto_tree *tree, const char *fmt, ...);
3113 /* 2.2.1.20 CCategorizationSpec */
3114 static int parse_CCategorizationSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3116 /* 2.2.1.21 CCategSpec */
3117 static int parse_CCategSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3119 /* 2.2.1.22 CRangeCategSpec */
3120 static int parse_CRangeCategSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3122 /* 2.2.1.23 RANGEBOUNDARY */
3123 static int parse_RANGEBOUNDARY(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3125 /* 2.2.1.24 CAggregSet */
3126 static int parse_CAggregSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3128 /* 2.2.1.25 CAggregSpec */
3129 static int parse_CAggregSpec(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3131 /* 2.2.1.26 CSortAggregSet */
3132 static int parse_CSortAggregSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3134 /* 2.2.1.27 CAggregSortKey */
3135 static int parse_CAggregSortKey(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3137 /* 2.2.1.28 CInGroupSortAggregSets */
3138 static int parse_CInGroupSortAggregSets(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3140 /* 2.2.1.29 CInGroupSortAggregSet */
3141 static int parse_CInGroupSortAggregSet(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3143 /* 2.2.1.30 CDbColId */
3144 static int parse_CDbColId(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *text);
3146 /* 2.2.1.31 CDbProp */
3147 static int parse_CDbProp(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const struct GuidPropertySet *propset, const char *fmt, ...);
3149 /* 2.2.1.32 CDbPropSet */
3150 static int parse_CDbPropSet(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3152 /* 2.2.1.33 CPidMapper */
3153 static int parse_CPidMapper(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3155 /* 2.2.1.34 CColumnGroupArray */
3156 static int parse_CColumnGroupArray(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3158 /* 2.2.1.35 CColumnGroup */
3159 static int parse_CColumnGroup(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3161 /* 2.2.1.41 CRowsetProperties */
3162 static int parse_CRowsetProperties(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3164 /* 2.2.1.43 CSortSet */
3165 static int parse_CSortSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...);
3167 /* 2.2.1.44 CTableColumn */
3168 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, ...);
3172 2.2.1.4 CInternalPropertyRestriction
3173 2.2.1.9 CScopeRestriction
3174 2.2.1.11 CVectorRestriction
3175 2.2.1.13 CRelDocRestriction
3176 2.2.1.14 CProbRestriction
3177 2.2.1.15 CFeedbackRestriction
3178 2.2.1.19 CCategorizationSet
3179 2.2.1.45 SERIALIZEDPROPERTYVALUE
3180 2.2.1.46 CCompletionCategSp
3183 static int parse_CSort(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, const char *fmt, ...)
3185 uint32_t col, ord, ind;
3187 proto_item *item;
3188 proto_tree *tree;
3189 const char *txt;
3190 va_list ap;
3192 va_start(ap, fmt);
3193 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3194 va_end(ap);
3195 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CSort, &item, txt);
3197 col = tvb_get_letohl(tvb, offset);
3198 proto_tree_add_uint(tree, hf_mswsp_cscort_column, tvb, offset, 4, col);
3199 offset += 4;
3201 ord = tvb_get_letohl(tvb, offset);
3202 proto_tree_add_uint(tree, hf_mswsp_cscort_order, tvb, offset, 4, ord);
3203 offset += 4;
3205 ind = tvb_get_letohl(tvb, offset);
3206 proto_tree_add_uint(tree, hf_mswsp_cscort_individual, tvb, offset, 4, ind);
3207 offset += 4;
3209 offset = parse_lcid(tvb, offset, tree, "lcid");
3211 proto_item_set_end(item, tvb, offset);
3212 return offset;
3215 static int parse_CSortSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
3217 uint32_t count, i;
3219 proto_item *item;
3220 proto_tree *tree;
3221 const char *txt;
3222 va_list ap;
3224 va_start(ap, fmt);
3225 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3226 va_end(ap);
3227 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CSortSet, &item, txt);
3229 count = tvb_get_letohl(tvb, offset);
3230 proto_tree_add_uint(tree, hf_mswsp_cscortset_count, tvb, offset, 4, count);
3231 offset += 4;
3233 for (i=0; i<count; i++) {
3234 offset = parse_padding(tvb, offset, 4, tree, "padding_sortArray[%u]", i);
3235 offset = parse_CSort(tvb, offset, tree, pad_tree, "sortArray[%u]", i);
3238 proto_item_set_end(item, tvb, offset);
3239 return offset;
3242 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, ...)
3246 proto_item *item, *ti_type;
3247 proto_tree *tree;
3248 va_list ap;
3249 struct vtype_data *type;
3250 enum vType vtype_val = VT_EMPTY;
3251 enum vType vtype_valhi = VT_EMPTY;
3252 struct CFullPropSpec v;
3253 const char *txt;
3254 uint8_t used;
3256 const char *modifier = "";
3257 va_start(ap, fmt);
3258 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3259 va_end(ap);
3260 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CTableColumn, &item, txt);
3262 offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &v, "PropSpec");
3263 get_name_from_fullpropspec(&v, col->name, PROP_LENGTH);
3264 col->vtype = tvb_get_letohl(tvb, offset);
3265 vtype_val = (enum vType)col->vtype;
3266 vtype_valhi = (enum vType)(col->vtype & 0xFF00);
3267 if (vtype_valhi) {
3268 if (vtype_valhi == VT_VECTOR) {
3269 modifier = "|VT_VECTOR";
3270 } else if (vtype_valhi == VT_ARRAY) {
3271 modifier = "|VT_ARRAY";
3272 } else {
3273 modifier = "|(Unknown, possibly error)";
3276 type = vType_get_type(vtype_val);
3277 if (type == NULL) {
3279 * Not a valid type.
3281 ti_type = proto_tree_add_string(tree, hf_mswsp_ctablecolumn_vtype, tvb, offset, 4, "Unknown CTableColumn type");
3282 expert_add_info(pinfo, ti_type, &ei_mswsp_invalid_variant_type);
3283 } else
3284 proto_tree_add_string_format_value(tree, hf_mswsp_ctablecolumn_vtype, tvb, offset, 4, type->str, "%s%s", type->str, modifier);
3285 offset += 4;
3287 used = tvb_get_uint8(tvb, offset);
3288 col->aggregateused = used;
3289 proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_aggused, tvb, offset, 1, used);
3290 offset += 1;
3292 if (used) {
3293 col->aggregatetype = tvb_get_uint8(tvb, offset);
3294 proto_tree_add_string(tree, hf_mswsp_ctablecolumn_aggtype, tvb, offset, 1, val_to_str(col->aggregatetype, DBAGGTTYPE, "(Unknown: 0x%x)"));
3295 offset += 1;
3297 col->valueused = tvb_get_uint8(tvb, offset);
3298 used = col->valueused;
3299 proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_valused, tvb, offset, 1, used);
3300 offset += 1;
3302 if (used) {
3303 offset = parse_padding(tvb, offset, 2, pad_tree, "padding_Value");
3305 col->valueoffset = tvb_get_letohs(tvb, offset);
3306 proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_valoffset, tvb, offset, 2, col->valueoffset);
3307 offset += 2;
3309 col->valuesize = tvb_get_letohs(tvb, offset);
3310 proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_valsize, tvb, offset, 2, col->valuesize);
3311 offset += 2;
3314 used = tvb_get_uint8(tvb, offset);
3315 col->statusused = used;
3316 proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_statused, tvb, offset, 1, used);
3317 offset += 1;
3319 if (used) {
3320 offset = parse_padding(tvb, offset, 2, pad_tree, "padding_Status");
3322 col->statusoffset = tvb_get_letohs(tvb, offset);
3323 proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_statoffset, tvb, offset, 2, col->statusoffset);
3324 offset += 2;
3327 used = tvb_get_uint8(tvb, offset);
3328 proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_lenused, tvb, offset, 1, used);
3329 col->lengthused = used;
3330 offset += 1;
3332 if (used) {
3333 offset = parse_padding(tvb, offset, 2, pad_tree, "padding_Length");
3335 col->lengthoffset = tvb_get_letohs(tvb, offset);
3336 proto_tree_add_uint(tree, hf_mswsp_ctablecolumn_lenoffset, tvb, offset, 2, col->lengthoffset);
3337 offset += 2;
3340 proto_item_set_end(item, tvb, offset);
3341 return offset;
3344 static int parse_PRSPEC_Kind(tvbuff_t *tvb, int offset, proto_tree *tree, enum PRSPEC_Kind *prspec)
3346 static const value_string KIND[] = {
3347 {0, "PRSPEC_LPWSTR"},
3348 {1, "PRSPEC_PROPID"},
3349 {0, NULL}
3352 int32_t kind = tvb_get_letohl(tvb, offset);
3353 DISSECTOR_ASSERT(kind < (PRSPEC_PROPID + 1));
3354 if (kind) {
3355 *prspec = PRSPEC_PROPID;
3356 } else {
3357 *prspec = PRSPEC_LPWSTR;
3359 proto_tree_add_string(tree, hf_mswsp_cfullpropspec_kind, tvb, offset, 4, val_to_str(*prspec, KIND, "(Unknown: 0x%x)"));
3360 offset += 4;
3361 return offset;
3364 static int parse_CFullPropSpec(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CFullPropSpec *v, const char *fmt, ...)
3366 const struct GuidPropertySet *pset;
3367 const char *id_str, *guid_str, *txt;
3369 proto_item *item;
3370 proto_tree *tree;
3371 va_list ap;
3373 va_start(ap, fmt);
3374 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3375 va_end(ap);
3376 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CFullPropSpec, &item, txt);
3378 offset = parse_padding(tvb, offset, 8, pad_tree, "paddingPropSet");
3380 offset = parse_guid(tvb, offset, tree, &v->guid, "GUID");
3381 pset = GuidPropertySet_find_guid(&v->guid);
3383 offset = parse_PRSPEC_Kind(tvb, offset, tree, &v->kind);
3385 v->u.propid = tvb_get_letohl(tvb, offset);
3386 proto_tree_add_uint(tree, hf_mswsp_cfullpropspec_propid, tvb, offset, 4, v->u.propid);
3387 offset += 4;
3389 if (v->kind == PRSPEC_LPWSTR) {
3390 int len = 2*v->u.propid;
3391 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);
3392 offset += len;
3395 id_str = pset ? try_val_to_str(v->u.propid, pset->id_map) : NULL;
3397 if (id_str) {
3398 proto_item_append_text(item, ": %s", id_str);
3399 } else {
3400 guid_str = guids_get_guid_name(&v->guid, wmem_packet_scope());
3401 if (guid_str) {
3402 proto_item_append_text(item, ": \"%s\"", guid_str);
3403 } else {
3404 guid_str = guid_to_str(wmem_packet_scope(), &v->guid);
3405 proto_item_append_text(item, ": {%s}", guid_str);
3408 if (v->kind == PRSPEC_LPWSTR) {
3409 proto_item_append_text(item, " \"%s\"", v->u.name);
3410 } else if (v->kind == PRSPEC_PROPID) {
3411 proto_item_append_text(item, " 0x%08x", v->u.propid);
3412 } else {
3413 proto_item_append_text(item, " <INVALID>");
3417 proto_item_set_end(item, tvb, offset);
3418 return offset;
3423 static const value_string PR_VALS[] = {
3424 {PRLT, "PRLT"},
3425 {PRLE, "PRLE"},
3426 {PRGT, "PRGT"},
3427 {PRGE, "PRGE"},
3428 {PREQ, "PREQ"},
3429 {PRNE, "PRNE"},
3430 {PRRE, "PRRE"},
3431 {PRAllBits, "PRAllBits"},
3432 {PRSomeBits, "PRSomeBits"},
3433 {PRAll, "PRAll"},
3434 {PRAny, "PRAny"},
3435 {0, NULL}
3438 static int parse_relop(tvbuff_t *tvb, int offset, proto_tree *tree, uint32_t *relop, const char **str)
3440 const char *str1 = NULL, *str2 = NULL;
3441 uint32_t tmp = tvb_get_letohl(tvb, offset);
3442 uint32_t modifier = (tmp & 0xF00);
3443 DISSECTOR_ASSERT((tmp & 0xf) < PRSomeBits +1);
3445 switch(tmp & 0xf) {
3446 case PRLT:
3447 *relop = PRLT;
3448 break;
3449 case PRLE:
3450 *relop = PRLE;
3451 break;
3452 case PRGT:
3453 *relop = PRGT;
3454 break;
3455 case PRGE:
3456 *relop = PRGE;
3457 break;
3458 case PREQ:
3459 *relop = PREQ;
3460 break;
3461 case PRNE:
3462 *relop = PRNE;
3463 break;
3464 case PRRE:
3465 *relop = PRRE;
3466 break;
3467 case PRAllBits:
3468 *relop = PRAllBits;
3469 break;
3470 case PRSomeBits:
3471 *relop = PRSomeBits;
3472 break;
3473 default:
3474 break;
3477 str2 = val_to_str(*relop, PR_VALS, "0x%04x");
3479 if (modifier) {
3480 switch (modifier) {
3481 case PRAll:
3482 *relop = *relop | PRAll;
3483 break;
3484 case PRAny:
3485 *relop |= PRAny;
3486 break;
3487 default:
3488 DISSECTOR_ASSERT(false);
3489 break;
3491 str1 = try_val_to_str((modifier), PR_VALS);
3492 if (str1) {
3493 str1 = wmem_strdup_printf(wmem_packet_scope(), "%s | ", str1);
3494 str2 = wmem_strdup_printf(wmem_packet_scope(), "%s%s", str1, str2);
3497 proto_tree_add_string_format_value(tree, hf_mswsp_cproprestrict_relop, tvb, offset, 4, str2, "%s (0x%04x)", str2[0]=='\0' ? "" : str2, *relop);
3499 if (str) {
3500 *str = str2;
3502 return offset + 4;
3504 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, ...)
3506 proto_tree *tree;
3507 proto_item *item;
3508 const char *txt, *str = NULL;
3509 va_list ap;
3511 va_start(ap, fmt);
3512 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3513 va_end(ap);
3515 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CPropertyRestriction, &item, txt);
3517 offset = parse_relop(tvb, offset, tree, &v->relop, &str);
3518 proto_item_append_text(item, " Op: %s", str);
3520 offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &v->property, "Property");
3522 offset = parse_CBaseStorageVariant(tvb, pinfo, offset, tree, pad_tree, &v->prval, "prval");
3524 offset = parse_padding(tvb, offset, 4, pad_tree, "padding_lcid");
3526 v->lcid = tvb_get_letohl(tvb, offset);
3527 offset = parse_lcid(tvb, offset, tree, "lcid");
3529 proto_item_set_end(item, tvb, offset);
3531 return offset;
3534 // NOLINTNEXTLINE(misc-no-recursion)
3535 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, ...)
3537 proto_tree *tree;
3538 proto_item *item;
3539 const char *txt;
3540 va_list ap;
3542 va_start(ap, fmt);
3543 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3544 va_end(ap);
3546 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CCoercionRestriction, &item, txt);
3548 v->value = tvb_get_letohieee_float(tvb, offset);
3549 proto_tree_add_float(tree, hf_mswsp_ccoercerestrict_value, tvb, offset, 4, v->value);
3551 offset += 4;
3553 offset = parse_CRestriction(tvb, pinfo, offset, tree, pad_tree, &v->child, "child");
3555 proto_item_set_end(item, tvb, offset);
3556 return offset;
3559 static int parse_CContentRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CContentRestriction *v, const char *fmt, ...)
3561 proto_tree *tree;
3562 proto_item *item;
3563 va_list ap;
3564 uint32_t cc;
3565 const char *txt;
3568 va_start(ap, fmt);
3569 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3570 va_end(ap);
3572 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CContentRestriction, &item, txt);
3574 offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &v->property, "Property");
3576 offset = parse_padding(tvb, offset, 4, pad_tree, "Padding1");
3578 cc = tvb_get_letohl(tvb, offset);
3579 proto_tree_add_uint(tree, hf_mswsp_ccontentrestrict_cc, tvb, offset, 4, cc);
3580 offset += 4;
3582 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);
3583 offset += 2*cc;
3585 offset = parse_padding(tvb, offset, 4, pad_tree, "Padding2");
3587 v->lcid = tvb_get_letohl(tvb, offset);
3588 offset = parse_lcid(tvb, offset, tree, "lcid");
3590 v->method = tvb_get_letohl(tvb, offset);
3591 proto_tree_add_uint(tree, hf_mswsp_ccontentrestrict_method, tvb, offset, 4, v->method);
3592 offset += 4;
3594 proto_item_set_end(item, tvb, offset);
3595 return offset;
3598 int parse_CNatLanguageRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CNatLanguageRestriction *v, const char *fmt, ...)
3600 proto_tree *tree;
3601 proto_item *item;
3602 va_list ap;
3603 uint32_t cc;
3604 const char *txt;
3607 va_start(ap, fmt);
3608 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3609 va_end(ap);
3611 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CNatLanguageRestriction, &item, txt);
3613 offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &v->property, "Property");
3615 offset = parse_padding(tvb, offset, 4, pad_tree, "padding_cc");
3617 cc = tvb_get_letohl(tvb, offset);
3618 proto_tree_add_uint(tree, hf_mswsp_natlangrestrict_cc, tvb, offset, 4, cc);
3619 offset += 4;
3621 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);
3622 offset += 2*cc;
3624 offset = parse_padding(tvb, offset, 4, pad_tree, "padding_lcid");
3626 v->lcid = tvb_get_letohl(tvb, offset);
3627 offset = parse_lcid(tvb, offset, tree, "lcid");
3629 proto_item_set_end(item, tvb, offset);
3630 return offset;
3634 static int parse_CReuseWhere(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, struct CReuseWhere *v, const char *fmt, ...)
3636 proto_item *item;
3637 va_list ap;
3638 const char *txt;
3640 va_start(ap, fmt);
3641 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3642 va_end(ap);
3644 proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_mswsp_msg_creusewhere, &item, txt);
3645 v->whereId = tvb_get_letohl(tvb, offset);
3646 offset += 4;
3648 proto_item_append_text(item, " Id: %u", v->whereId);
3650 proto_item_set_end(item, tvb, offset);
3651 return offset;
3654 static const value_string RT_VALS[] = {
3655 {RTNone, "RTNone"},
3656 {RTAnd, "RTAnd"},
3657 {RTOr, "RTOr"},
3658 {RTNot, "RTNot"},
3659 {RTContent, "RTContent"},
3660 {RTProperty, "RTProperty"},
3661 {RTProximity, "RTProximity"},
3662 {RTVector, ""},
3663 {RTNatLanguage, "RTNatLanguage"},
3664 {RTScope, "RTScope"},
3665 {RTCoerce_Add, "RTCoerce_Add"},
3666 {RTCoerce_Multiply, "RTCoerce_Multiply"},
3667 {RTCoerce_Absolute, "RTCoerce_Absolute"},
3668 {RTProb, "RTProb"},
3669 {RTFeedback, "RTFeedback"},
3670 {RTReldoc, "RTReldoc"},
3671 {RTReuseWhere, "RTReuseWhere"},
3672 {RTInternalProp, "RTInternalProp"},
3673 {RTPhrase, "RTInternalProp"},
3674 {0, NULL}
3677 #define EP_ALLOC(T) wmem_new(wmem_packet_scope(), T)
3679 static int parse_rType(tvbuff_t *tvb, int offset, proto_tree *tree, enum rType *rtype, const char **str)
3681 const char *txt = NULL;
3682 uint32_t type = tvb_get_letohl(tvb, offset);
3683 switch(type) {
3684 case RTNone:
3685 *rtype = RTNone;
3686 break;
3687 case RTAnd:
3688 *rtype = RTAnd;
3689 break;
3690 case RTOr:
3691 *rtype = RTOr;
3692 break;
3693 case RTNot:
3694 *rtype = RTNot;
3695 break;
3696 case RTContent:
3697 *rtype = RTContent;
3698 break;
3699 case RTProperty:
3700 *rtype = RTProperty;
3701 break;
3702 case RTProximity:
3703 *rtype = RTProximity;
3704 break;
3705 case RTVector:
3706 *rtype = RTVector;
3707 break;
3708 case RTNatLanguage:
3709 *rtype = RTNatLanguage;
3710 break;
3711 case RTScope:
3712 *rtype = RTScope;
3713 break;
3714 case RTCoerce_Add:
3715 *rtype = RTCoerce_Add;
3716 break;
3717 case RTCoerce_Multiply:
3718 *rtype = RTCoerce_Multiply;
3719 break;
3720 case RTCoerce_Absolute:
3721 *rtype = RTCoerce_Absolute;
3722 break;
3723 case RTProb:
3724 *rtype = RTProb;
3725 break;
3726 case RTFeedback:
3727 *rtype = RTFeedback;
3728 break;
3729 case RTReldoc:
3730 *rtype = RTReldoc;
3731 break;
3732 case RTReuseWhere:
3733 *rtype = RTReuseWhere;
3734 break;
3735 case RTInternalProp:
3736 *rtype = RTInternalProp;
3737 break;
3738 default:
3739 DISSECTOR_ASSERT(false);
3740 break;
3742 txt = val_to_str(*rtype, RT_VALS, "0x%.8x");
3743 proto_tree_add_string_format_value(tree, hf_mswsp_crestrict_ultype, tvb, offset, 4, txt, "%s (0x%.8x)", txt[0] == '0' ? "" : txt, *rtype);
3744 if (str) {
3745 *str = txt;
3747 return offset + 4;
3750 // NOLINTNEXTLINE(misc-no-recursion)
3751 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, ...)
3753 proto_tree *tree;
3754 proto_item *item;
3755 const char *str, *txt;
3756 va_list ap;
3758 va_start(ap, fmt);
3759 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3760 va_end(ap);
3762 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRestriction, &item, txt);
3765 offset = parse_rType(tvb, offset, tree, &v->ulType, &str);
3766 proto_item_append_text(item, " Type: %s", str);
3768 v->Weight = tvb_get_letohl(tvb, offset);
3769 proto_tree_add_uint(tree, hf_mswsp_crestrict_weight, tvb, offset, 4, v->Weight);
3770 offset += 4;
3772 increment_dissection_depth(pinfo);
3773 switch(v->ulType) {
3774 case RTNone:
3775 break;
3776 case RTAnd:
3777 case RTOr:
3778 case RTProximity:
3779 case RTPhrase: {
3780 v->u.RTAnd = EP_ALLOC(struct CNodeRestriction);
3781 offset = parse_CNodeRestriction(tvb, pinfo, offset, tree, pad_tree, v->u.RTAnd, "CNodeRestriction");
3782 break;
3784 case RTNot: {
3785 v->u.RTNot = EP_ALLOC(struct CRestriction);
3786 offset = parse_CRestriction(tvb, pinfo, offset, tree, pad_tree,
3787 v->u.RTNot, "CRestriction");
3788 break;
3790 case RTProperty: {
3791 v->u.RTProperty = EP_ALLOC(struct CPropertyRestriction);
3792 offset = parse_CPropertyRestriction(tvb, pinfo, offset, tree, pad_tree,
3793 v->u.RTProperty, "CPropertyRestriction");
3794 break;
3796 case RTCoerce_Add:
3797 case RTCoerce_Multiply:
3798 case RTCoerce_Absolute: {
3799 v->u.RTCoerce_Add = EP_ALLOC(struct CCoercionRestriction);
3800 offset = parse_CCoercionRestriction(tvb, pinfo, offset, tree, pad_tree,
3801 v->u.RTCoerce_Add, "CCoercionRestriction");
3802 break;
3804 case RTContent: {
3805 v->u.RTContent = EP_ALLOC(struct CContentRestriction);
3806 offset = parse_CContentRestriction(tvb, offset, tree, pad_tree,
3807 v->u.RTContent, "CContentRestriction");
3808 break;
3810 case RTReuseWhere: {
3811 v->u.RTReuseWhere = EP_ALLOC(struct CReuseWhere);
3812 offset = parse_CReuseWhere(tvb, offset, tree, pad_tree,
3813 v->u.RTReuseWhere, "CReuseWhere");
3814 break;
3816 case RTNatLanguage: {
3817 v->u.RTNatLanguage = EP_ALLOC(struct CNatLanguageRestriction);
3818 offset = parse_CNatLanguageRestriction(tvb, offset, tree, pad_tree,
3819 v->u.RTNatLanguage, "CNatLanguageRestriction");
3820 break;
3822 default:
3823 proto_item_append_text(item, " Not supported!");
3825 decrement_dissection_depth(pinfo);
3827 proto_item_set_end(item, tvb, offset);
3828 return offset;
3831 static int parse_CRestrictionArray(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
3833 uint8_t present, count;
3835 proto_tree *tree;
3836 proto_item *item;
3837 const char *txt;
3838 va_list ap;
3840 va_start(ap, fmt);
3841 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3842 va_end(ap);
3843 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRestrictionArray, &item, txt);
3845 pad_tree = tree;
3847 count = tvb_get_uint8(tvb, offset);
3848 proto_tree_add_uint(tree, hf_mswsp_crestrictarray_count, tvb, offset, 1, count);
3849 offset += 1;
3851 present = tvb_get_uint8(tvb, offset);
3852 proto_tree_add_uint(tree, hf_mswsp_crestrictarray_present, tvb, offset, 1, present);
3853 offset += 1;
3855 if (present) {
3856 unsigned i;
3857 offset = parse_padding(tvb, offset, 4, pad_tree, "paddingCRestrictionPresent");
3859 for (i=0; i<count; i++) {
3860 struct CRestriction r;
3861 offset = parse_CRestriction(tvb, pinfo, offset, tree, pad_tree, &r, "Restriction[%d]", i);
3864 proto_item_set_end(item, tvb, offset);
3865 return offset;
3868 // NOLINTNEXTLINE(misc-no-recursion)
3869 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, ...)
3871 proto_tree *tree;
3872 proto_item *item;
3873 unsigned i;
3874 const char *txt;
3875 va_list ap;
3877 va_start(ap, fmt);
3878 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
3879 va_end(ap);
3880 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CNodeRestriction, &item, txt);
3882 v->cNode = tvb_get_letohl(tvb, offset);
3883 proto_tree_add_uint(tree, hf_mswsp_cnoderestrict_cnode, tvb, offset, 4, v->cNode);
3884 offset += 4;
3886 for (i=0; i<v->cNode; i++) {
3887 struct CRestriction r;
3888 ZERO_STRUCT(r);
3889 offset = parse_CRestriction(tvb, pinfo, offset, tree, pad_tree, &r, "paNode[%u]", i);
3890 offset = parse_padding(tvb, offset, 4, tree, "padding_paNode[%u]", i); /*at begin or end of loop ????*/
3894 proto_item_set_end(item, tvb, offset);
3895 return offset;
3899 /*****************************************************************************************/
3901 static int vvalue_tvb_get0(tvbuff_t *tvb _U_, int offset _U_, void *val _U_)
3903 return 0;
3906 static int vvalue_tvb_get1(tvbuff_t *tvb, int offset, void *val)
3908 uint8_t *ui1 = (uint8_t*)val;
3909 *ui1 = tvb_get_uint8(tvb, offset);
3910 return 1;
3913 static int vvalue_tvb_get2(tvbuff_t *tvb, int offset, void *val)
3915 uint16_t *ui2 = (uint16_t*)val;
3916 *ui2 = tvb_get_letohs(tvb, offset);
3917 return 2;
3920 static int vvalue_tvb_get4(tvbuff_t *tvb, int offset, void *val)
3922 uint32_t *ui4 = (uint32_t*)val;
3923 *ui4 = tvb_get_letohl(tvb, offset);
3924 return 4;
3927 static int vvalue_tvb_get8(tvbuff_t *tvb, int offset, void *val)
3929 uint64_t *ui8 = (uint64_t*)val;
3930 *ui8 = tvb_get_letoh64(tvb, offset);
3931 return 8;
3934 static int vvalue_tvb_blob(tvbuff_t *tvb, int offset, void *val)
3936 struct data_blob *blob = (struct data_blob*)val;
3937 uint32_t len = tvb_get_letohl(tvb, offset);
3939 blob->size = len;
3940 blob->data = (uint8_t*)tvb_memdup(wmem_packet_scope(), tvb, offset + 4, len);
3942 return 4 + len;
3945 static int vvalue_tvb_lpstr(tvbuff_t *tvb, int offset, void *val)
3947 struct data_str *str = (struct data_str*)val;
3948 int len;
3950 str->len = tvb_get_letohl(tvb, offset);
3951 str->str = tvb_get_stringz_enc(wmem_packet_scope(), tvb, offset + 4, &len,
3952 ENC_ASCII|ENC_LITTLE_ENDIAN);
3953 /* XXX test str->len == len */
3954 return 4 + len;
3957 static int vvalue_tvb_lpwstr_len(tvbuff_t *tvb, int offset, int length, void *val)
3959 struct data_str *str = (struct data_str*)val;
3960 const char *ptr;
3961 int len;
3963 if (length == 0) {
3964 /* we don't know the length */
3965 ptr = tvb_get_stringz_enc(wmem_packet_scope(), tvb, offset, &len,
3966 ENC_UTF_16|ENC_LITTLE_ENDIAN);
3967 } else {
3968 ptr = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length,
3969 ENC_UTF_16|ENC_LITTLE_ENDIAN);
3970 len = length;
3972 str->str = ptr;
3973 return len;
3976 static int vvalue_tvb_lpwstr(tvbuff_t *tvb, int offset, void *val)
3978 struct data_str *str = (struct data_str*)val;
3980 str->len = tvb_get_letohl(tvb, offset);
3982 return 4 + vvalue_tvb_lpwstr_len(tvb, offset + 4, 0, val);
3985 /* Maximum sane vector size. Arbitrary. */
3986 #define MAX_VT_VECTOR_SIZE 5000
3987 static int vvalue_tvb_vector_internal(tvbuff_t *tvb, int offset, struct vt_vector *val, struct vtype_data *type, unsigned num)
3989 const int offset_in = offset;
3990 const bool varsize = (type->size == -1);
3991 const unsigned elsize = varsize ? (unsigned)sizeof(struct data_blob) : (unsigned)type->size;
3992 uint8_t *data;
3993 int len;
3994 unsigned i;
3997 * Make sure we actually *have* the data we're going to fetch
3998 * here, before making a possibly-doomed attempt to allocate
3999 * memory for it.
4001 * First, check for sane values.
4003 if (num > MAX_VT_VECTOR_SIZE) {
4004 THROW(ReportedBoundsError);
4008 * No huge numbers from the wire; now make sure we at least have that data.
4010 tvb_ensure_bytes_exist(tvb, offset, elsize * num);
4013 * OK, it exists; allocate a buffer into which to fetch it.
4015 data = (uint8_t*)wmem_alloc(wmem_packet_scope(), elsize * num);
4017 val->len = num;
4018 val->u.vt_ui1 = data;
4019 DISSECTOR_ASSERT((void*)&val->u == ((void*)&val->u.vt_ui1));
4021 for (i=0; i<num; i++) {
4022 DISSECTOR_ASSERT_HINT(type->tvb_get != 0,
4023 "type that we don't know yet how to handle, please submit a bug with trace");
4024 len = type->tvb_get(tvb, offset, data);
4025 data += elsize;
4026 offset += len;
4027 if (varsize && (offset % 4) ) { /* at begin or end of loop ??? */
4028 int padding = 4 - (offset % 4);
4029 offset += padding;
4032 return offset - offset_in;
4035 static int vvalue_tvb_vector(tvbuff_t *tvb, int offset, struct vt_vector *val, struct vtype_data *type)
4037 const unsigned num = tvb_get_letohl(tvb, offset);
4038 return 4 + vvalue_tvb_vector_internal(tvb, offset+4, val, type, num);
4041 static void vvalue_strbuf_append_null(wmem_strbuf_t *strbuf _U_, void *ptr _U_)
4044 static void vvalue_strbuf_append_i1(wmem_strbuf_t *strbuf, void *ptr)
4046 int8_t i1 = *(int8_t*)ptr;
4047 wmem_strbuf_append_printf(strbuf, "%d", (int)i1);
4050 static void vvalue_strbuf_append_i2(wmem_strbuf_t *strbuf, void *ptr)
4052 int16_t i2 = *(int16_t*)ptr;
4053 wmem_strbuf_append_printf(strbuf, "%d", (int)i2);
4056 static void vvalue_strbuf_append_i4(wmem_strbuf_t *strbuf, void *ptr)
4058 int32_t i4 = *(int32_t*)ptr;
4059 wmem_strbuf_append_printf(strbuf, "%d", i4);
4062 static void vvalue_strbuf_append_i8(wmem_strbuf_t *strbuf, void *ptr)
4064 int64_t i8 = *(int64_t*)ptr;
4065 wmem_strbuf_append_printf(strbuf, "%" PRId64, i8);
4068 static void vvalue_strbuf_append_ui1(wmem_strbuf_t *strbuf, void *ptr)
4070 uint8_t ui1 = *(uint8_t*)ptr;
4071 wmem_strbuf_append_printf(strbuf, "%u", (unsigned)ui1);
4074 static void vvalue_strbuf_append_ui2(wmem_strbuf_t *strbuf, void *ptr)
4076 uint16_t ui2 = *(uint16_t*)ptr;
4077 wmem_strbuf_append_printf(strbuf, "%u", (unsigned)ui2);
4080 static void vvalue_strbuf_append_ui4(wmem_strbuf_t *strbuf, void *ptr)
4082 uint32_t ui4 = *(uint32_t*)ptr;
4083 wmem_strbuf_append_printf(strbuf, "%d", ui4);
4086 static void vvalue_strbuf_append_ui8(wmem_strbuf_t *strbuf, void *ptr)
4088 uint64_t ui8 = *(uint64_t*)ptr;
4089 wmem_strbuf_append_printf(strbuf, "%" PRIu64, ui8);
4092 static void vvalue_strbuf_append_r4(wmem_strbuf_t *strbuf, void *ptr)
4094 float r4 = *(float*)ptr;
4095 wmem_strbuf_append_printf(strbuf, "%g", (double)r4);
4098 static void vvalue_strbuf_append_r8(wmem_strbuf_t *strbuf, void *ptr)
4100 double r8 = *(double*)ptr;
4101 wmem_strbuf_append_printf(strbuf, "%g", r8);
4104 static void vvalue_strbuf_append_str(wmem_strbuf_t *strbuf, void *ptr)
4106 struct data_str *str = (struct data_str*)ptr;
4107 wmem_strbuf_append_printf(strbuf, "\"%s\"", str->str);
4110 static void vvalue_strbuf_append_blob(wmem_strbuf_t *strbuf, void *ptr)
4112 struct data_blob *blob = (struct data_blob*)ptr;
4113 wmem_strbuf_append_printf(strbuf, "size: %d", (int)blob->size);
4116 static void vvalue_strbuf_append_bool(wmem_strbuf_t *strbuf, void *ptr)
4118 uint16_t val = *(unsigned*)ptr;
4119 switch (val) {
4120 case 0:
4121 wmem_strbuf_append(strbuf, "False");
4122 break;
4123 case 0xffff:
4124 wmem_strbuf_append(strbuf, "True");
4125 break;
4126 default:
4127 wmem_strbuf_append_printf(strbuf, "Invalid (0x%4x)", val);
4131 static void vvalue_strbuf_append_vector(wmem_strbuf_t *strbuf, struct vt_vector val, struct vtype_data *type)
4133 const int elsize = (type->size == -1) ? (int)sizeof(struct data_blob) : type->size;
4134 unsigned i;
4135 uint8_t *data = val.u.vt_ui1;
4136 wmem_strbuf_append_c(strbuf, '[');
4137 for (i=0; i<val.len; i++) {
4138 if (i>0) {
4139 wmem_strbuf_append_c(strbuf, ',');
4141 type->strbuf_append(strbuf, data);
4142 data += elsize;
4144 wmem_strbuf_append_c(strbuf, ']');
4147 static struct vtype_data VT_TYPE[] = {
4148 {VT_EMPTY, "VT_EMPTY", 0, vvalue_tvb_get0, NULL, vvalue_strbuf_append_null},
4149 {VT_NULL, "VT_NULL", 0, vvalue_tvb_get0, NULL, vvalue_strbuf_append_null},
4150 {VT_I2, "VT_I2", 2, vvalue_tvb_get2, NULL, vvalue_strbuf_append_i2},
4151 {VT_I4, "VT_I4", 4, vvalue_tvb_get4, NULL, vvalue_strbuf_append_i4},
4152 {VT_R4, "VT_R4", 4, vvalue_tvb_get4, NULL, vvalue_strbuf_append_r4},
4153 {VT_R8, "VT_R8", 8, vvalue_tvb_get8, NULL, vvalue_strbuf_append_r8},
4154 {VT_CY, "VT_CY", 8, vvalue_tvb_get8, NULL, vvalue_strbuf_append_i8},
4155 {VT_DATE, "VT_DATE", 8, vvalue_tvb_get8, NULL, vvalue_strbuf_append_r8},
4156 {VT_BSTR, "VT_BSTR", -1, vvalue_tvb_lpwstr, vvalue_tvb_lpwstr_len, vvalue_strbuf_append_str},
4157 {VT_ERROR, "VT_ERROR", 4, vvalue_tvb_get4, NULL, vvalue_strbuf_append_ui4},
4158 {VT_BOOL, "VT_BOOL", 2, vvalue_tvb_get2, NULL, vvalue_strbuf_append_bool},
4159 {VT_VARIANT, "VT_VARIANT", -1, NULL, NULL, NULL},
4160 {VT_DECIMAL, "VT_DECIMAL", 16, NULL, NULL, NULL},
4161 {VT_I1, "VT_I1", 1, vvalue_tvb_get1, NULL, vvalue_strbuf_append_i1},
4162 {VT_UI1, "VT_UI1", 1, vvalue_tvb_get1, NULL, vvalue_strbuf_append_ui1},
4163 {VT_UI2, "VT_UI2", 2, vvalue_tvb_get2, NULL, vvalue_strbuf_append_ui2},
4164 {VT_UI4, "VT_UI4", 4, vvalue_tvb_get4, NULL, vvalue_strbuf_append_ui4},
4165 {VT_I8, "VT_I8", 8, vvalue_tvb_get8, NULL, vvalue_strbuf_append_i8},
4166 {VT_UI8, "VT_UI8", 8, vvalue_tvb_get8, NULL, vvalue_strbuf_append_ui8},
4167 {VT_INT, "VT_INT", 4, vvalue_tvb_get4, NULL, vvalue_strbuf_append_i4},
4168 {VT_UINT, "VT_UINT", 4, vvalue_tvb_get4, NULL, vvalue_strbuf_append_ui4},
4169 {VT_LPSTR, "VT_LPSTR", -1, vvalue_tvb_lpstr, NULL, vvalue_strbuf_append_str},
4170 {VT_LPWSTR, "VT_LPWSTR", -1, vvalue_tvb_lpwstr, vvalue_tvb_lpwstr_len, vvalue_strbuf_append_str},
4171 {VT_COMPRESSED_LPWSTR, "VT_COMPRESSED_LPWSTR", -1, NULL, NULL, vvalue_strbuf_append_str},
4172 {VT_FILETIME, "VT_FILETIME", 8, vvalue_tvb_get8, NULL, vvalue_strbuf_append_i8},
4173 {VT_BLOB, "VT_BLOB", -1, vvalue_tvb_blob, NULL, vvalue_strbuf_append_blob},
4174 {VT_BLOB_OBJECT, "VT_BLOB_OBJECT", -1, vvalue_tvb_blob, NULL, vvalue_strbuf_append_blob},
4175 {VT_CLSID, "VT_CLSID", 16, NULL, NULL, NULL}
4178 static struct vtype_data *vType_get_type(uint16_t t)
4180 unsigned i;
4181 t = (t & 0xFF);
4182 for (i=0; i<array_length(VT_TYPE); i++) {
4183 if (t == VT_TYPE[i].tag) {
4184 return &VT_TYPE[i];
4187 return NULL;
4190 static const char *str_CBaseStorageVariant(struct CBaseStorageVariant *value, bool print_type)
4193 wmem_strbuf_t *strbuf = wmem_strbuf_new(wmem_packet_scope(), "");
4194 if (value == NULL) {
4195 return "<NULL>";
4198 if (value->type == NULL) {
4199 return "<??""?>";
4202 if (print_type) {
4203 wmem_strbuf_append(strbuf, value->type->str);
4205 if (value->vType & 0xFF00) {
4206 wmem_strbuf_append_printf(strbuf, "[%d]", value->vValue.vt_vector.len);
4208 wmem_strbuf_append(strbuf, ": ");
4211 switch (value->vType & 0xFF00) {
4212 case 0:
4213 value->type->strbuf_append(strbuf, &value->vValue);
4214 break;
4215 case VT_ARRAY:
4216 vvalue_strbuf_append_vector(strbuf, value->vValue.vt_array.vData, value->type);
4217 break;
4218 case VT_VECTOR:
4219 vvalue_strbuf_append_vector(strbuf, value->vValue.vt_vector, value->type);
4220 break;
4221 default:
4222 wmem_strbuf_append(strbuf, "Invalid");
4225 return wmem_strbuf_get_str(strbuf);
4228 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)
4230 int i, len;
4231 proto_item *ti, *ti_type, *ti_val;
4232 proto_tree *tree, *tr;
4233 enum vType highType;
4235 ZERO_STRUCT(*value);
4237 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CBaseStorageVariant, &ti, text);
4239 value->vType = tvb_get_letohs(tvb, offset);
4240 value->type = vType_get_type(value->vType & 0xFF);
4241 if (value->type == NULL) {
4243 * Not a valid type.
4245 ti_type = proto_tree_add_string(tree, hf_mswsp_cbasestorvariant_vtype, tvb, offset, 2, "Unknown CBaseStorageVariant type");
4246 expert_add_info(pinfo, ti_type, &ei_mswsp_invalid_variant_type);
4248 THROW_MESSAGE(ReportedBoundsError, "Unknown CBaseStorageVariant type");
4249 return offset;
4252 ti_type = proto_tree_add_string(tree, hf_mswsp_cbasestorvariant_vtype, tvb, offset, 2, value->type->str);
4253 offset += 2;
4255 value->vData1 = tvb_get_uint8(tvb, offset);
4256 proto_tree_add_uint(tree, hf_mswsp_cbasestorvariant_vdata1, tvb, offset, 1, value->vData1);
4257 offset += 1;
4259 value->vData2 = tvb_get_uint8(tvb, offset);
4260 proto_tree_add_uint(tree, hf_mswsp_cbasestorvariant_vdata2, tvb, offset, 1, value->vData2);
4261 offset += 1;
4263 highType = (enum vType)(value->vType & 0xFF00);
4265 ti_val = proto_tree_add_string(tree, hf_mswsp_cbasestorvariant_vvalue, tvb, offset, 0, "");
4267 switch (highType) {
4268 case VT_EMPTY:
4269 DISSECTOR_ASSERT_HINT(value->type->tvb_get != 0,
4270 "type that we don't know yet how to handle, please submit a bug with trace");
4271 len = value->type->tvb_get(tvb, offset, &value->vValue.vt_single);
4272 offset += len;
4273 break;
4274 case VT_VECTOR:
4275 proto_item_append_text(ti_type, "|VT_VECTOR");
4276 tr = proto_item_add_subtree(ti_val, ett_CBaseStorageVariant_Vector);
4278 len = vvalue_tvb_vector(tvb, offset, &value->vValue.vt_vector, value->type);
4279 proto_tree_add_uint(tr, hf_mswsp_cbasestorvariant_num, tvb, offset, 4, value->vValue.vt_vector.len);
4280 offset += len;
4281 break;
4282 case VT_ARRAY: {
4283 uint16_t cDims, fFeatures;
4284 uint32_t cbElements, cElements, lLbound;
4285 int num = 1;
4287 proto_item_append_text(ti_type, "|VT_ARRAY");
4288 tr = proto_item_add_subtree(ti_val, ett_CBaseStorageVariant_Array);
4290 cDims = tvb_get_letohs(tvb, offset);
4291 proto_tree_add_uint(tr, hf_mswsp_cbasestorvariant_cdims, tvb, offset, 2, cDims);
4292 offset += 2;
4294 fFeatures = tvb_get_letohs(tvb, offset);
4295 proto_tree_add_uint(tr, hf_mswsp_cbasestorvariant_ffeatures, tvb, offset, 2, fFeatures);
4296 offset += 2;
4298 cbElements = tvb_get_letohl(tvb, offset);
4299 proto_tree_add_uint(tr, hf_mswsp_cbasestorvariant_cbelements, tvb, offset, 4, cbElements);
4300 offset += 4;
4301 for (i=0; i<cDims; i++) {
4302 cElements = tvb_get_letohl(tvb, offset);
4303 lLbound = tvb_get_letohl(tvb, offset + 4);
4304 proto_tree_add_string_format(tr, hf_mswsp_cbasestorvariant_rgsabound, tvb, offset, 8, "", "Rgsabound[%d]: (%d:%d)", i, cElements, lLbound);
4305 offset += 8;
4306 num *= cElements;
4309 len = vvalue_tvb_vector_internal(tvb, offset, &value->vValue.vt_array.vData, value->type, num);
4310 offset += len;
4311 break;
4313 default:
4314 proto_item_append_text(ti_type, "|0x%x", highType);
4316 proto_item_set_end(ti, tvb, offset);
4317 proto_item_set_end(ti_val, tvb, offset);
4319 proto_item_append_text(ti_val, " %s", str_CBaseStorageVariant(value, false));
4320 proto_item_append_text(ti, " %s", str_CBaseStorageVariant(value, true));
4322 return offset;
4325 enum {
4326 DBKIND_GUID_NAME = 0,
4327 DBKIND_GUID_PROPID = 1
4330 static int parse_CDbColId(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *text)
4332 uint32_t eKind, ulId;
4333 e_guid_t guid;
4334 const char *str;
4335 static const char *KIND[] = {"DBKIND_GUID_NAME", "DBKIND_GUID_PROPID"};
4337 proto_item *tree_item;
4338 proto_tree *tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CDbColId, &tree_item, text);
4340 eKind = tvb_get_letohl(tvb, offset);
4341 str = (eKind < 2 ? KIND[eKind] : "???");
4342 proto_tree_add_string_format_value(tree, hf_mswsp_cdbcolid_ekind, tvb, offset, 4, str, "%s (%u)", str, eKind);
4343 offset += 4;
4345 offset = parse_padding(tvb, offset, 8, pad_tree, "paddingGuidAlign");
4347 offset = parse_guid(tvb, offset, tree, &guid, "GUID");
4349 ulId = tvb_get_letohl(tvb, offset);
4350 proto_tree_add_uint(tree, hf_mswsp_cdbcolid_ulid, tvb, offset, 4, ulId);
4351 offset += 4;
4353 if (eKind == DBKIND_GUID_NAME) {
4354 char *name;
4355 int len = ulId;
4356 name = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, len, ENC_LITTLE_ENDIAN | ENC_UCS_2);
4357 proto_item_append_text(tree_item, " \"%s\"", name);
4358 proto_tree_add_string_format_value(tree, hf_mswsp_cdbcolid_vstring, tvb, offset, len, name, "\"%s\"", name);
4359 offset += len;
4360 } else if (eKind == DBKIND_GUID_PROPID) {
4361 proto_item_append_text(tree_item, " %08x", ulId);
4362 } else {
4363 proto_item_append_text(tree_item, "<INVALID>");
4366 proto_item_set_end(tree_item, tvb, offset);
4368 return offset;
4371 static int parse_CDbProp(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const struct GuidPropertySet *propset, const char *fmt, ...)
4373 static const value_string EMPTY_VS[] = {{0, NULL}};
4374 const value_string *vs = (propset && propset->id_map) ? propset->id_map : EMPTY_VS;
4375 uint32_t id, opt, status;
4376 struct CBaseStorageVariant value;
4377 proto_item *item;
4378 proto_tree *tree;
4379 const char *str, *txt;
4380 va_list ap;
4382 va_start(ap, fmt);
4383 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4384 va_end(ap);
4386 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CDbProp, &item, txt);
4388 id = tvb_get_letohl(tvb, offset);
4389 str = val_to_str(id, vs, "0x%08x");
4390 proto_tree_add_string_format_value(tree, hf_mswsp_cdbprop_id, tvb, offset, 4, str, "%s (0x%08x)", (str[0] == '0' ? "" : str), id);
4391 offset += 4;
4392 proto_item_append_text(item, " Id: %s", str);
4394 opt = tvb_get_letohl(tvb, offset);
4395 proto_tree_add_uint(tree, hf_mswsp_cdbprop_options, tvb, offset, 4, opt);
4396 offset += 4;
4398 status = tvb_get_letohl(tvb, offset);
4399 proto_tree_add_uint(tree, hf_mswsp_cdbprop_status, tvb, offset, 4, status);
4400 offset += 4;
4402 offset = parse_CDbColId(tvb, offset, tree, pad_tree, "colid");
4404 offset = parse_CBaseStorageVariant(tvb, pinfo, offset, tree, pad_tree, &value, "vValue");
4406 str = str_CBaseStorageVariant(&value, true);
4407 proto_item_append_text(item, " %s", str);
4408 proto_item_set_end(item, tvb, offset);
4410 return offset;
4413 static int parse_CDbPropSet(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4415 int i, num;
4416 e_guid_t guid;
4417 const struct GuidPropertySet *pset;
4418 proto_item *item;
4419 proto_tree *tree;
4420 const char *txt;
4421 va_list ap;
4423 va_start(ap, fmt);
4424 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4425 va_end(ap);
4427 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CDbPropSet, &item, txt);
4429 offset = parse_guid(tvb, offset, tree, &guid, "guidPropertySet");
4431 pset = GuidPropertySet_find_guid(&guid);
4433 if (pset) {
4434 proto_item_append_text(item, " \"%s\" (%s)", pset->desc, pset->def);
4435 } else {
4436 const char *guid_str = guid_to_str(wmem_packet_scope(), &guid);
4437 proto_item_append_text(item, " {%s}", guid_str);
4440 offset = parse_padding(tvb, offset, 4, pad_tree, "guidPropertySet");
4442 num = tvb_get_letohl(tvb, offset);
4443 proto_tree_add_uint(tree, hf_mswsp_cdbpropset_cprops, tvb, offset, 4, num);
4444 offset += 4;
4445 proto_item_append_text(item, " Num: %d", num);
4447 for (i = 0; i<num; i++) {
4448 offset = parse_padding(tvb, offset, 4, pad_tree, "aProp[%d]", i);
4449 offset = parse_CDbProp(tvb, pinfo, offset, tree, pad_tree, pset, "aProp[%d]", i);
4452 proto_item_set_end(item, tvb, offset);
4453 return offset;
4456 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, ...)
4458 const int offset_in = offset;
4459 uint32_t size, num;
4460 int i;
4461 proto_tree *tree;
4462 proto_item *item;
4463 const char *txt;
4464 va_list ap;
4466 va_start(ap, fmt);
4467 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4468 va_end(ap);
4470 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CDbPropSet_Array, &item, txt);
4472 size = tvb_get_letohl(tvb, size_offset);
4473 proto_tree_add_item(tree, hf_mswsp_msg_ConnectIn_Blob1, tvb,
4474 size_offset, 4, ENC_LITTLE_ENDIAN);
4476 num = tvb_get_letohl(tvb, offset);
4477 proto_tree_add_item(tree, hf_mswsp_msg_ConnectIn_PropSets_num, tvb,
4478 offset, 4, ENC_LITTLE_ENDIAN);
4479 offset += 4;
4481 for (i = 0; i < (int)num; i++) {
4482 offset = parse_CDbPropSet(tvb, pinfo, offset, tree, pad_tree, "PropertySet[%d]", i);
4485 proto_item_set_end(item, tvb, offset);
4486 DISSECTOR_ASSERT(offset - offset_in == (int)size);
4487 return offset;
4490 int parse_CColumnSet(tvbuff_t *tvb, int offset, proto_tree *tree, const char *fmt, ...)
4492 uint32_t count, v, i;
4493 proto_item *item;
4494 const char *txt;
4495 va_list ap;
4497 va_start(ap, fmt);
4498 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4499 va_end(ap);
4501 count = tvb_get_letohl(tvb, offset);
4502 offset += 4;
4503 proto_tree_add_subtree(tree, tvb, offset, count * 4, ett_mswsp_uin32_array, &item, txt);
4504 proto_item_append_text(item, " Count %u [", count);
4506 for (i=0; i<count; i++) {
4507 v = tvb_get_letohl(tvb, offset);
4508 offset += 4;
4509 if (i>0) {
4510 proto_item_append_text(item, ",%u", v);
4511 } else {
4512 proto_item_append_text(item, "%u", v);
4515 proto_item_append_text(item, "]");
4516 return offset;
4519 /* 2.2.1.23 RANGEBOUNDARY */
4520 int parse_RANGEBOUNDARY(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4522 uint32_t ulType;
4523 uint8_t labelPresent;
4524 proto_item *item;
4525 proto_tree *tree;
4526 const char *txt;
4527 struct CBaseStorageVariant prval;
4528 va_list ap;
4530 va_start(ap, fmt);
4531 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4532 va_end(ap);
4533 tree =proto_tree_add_subtree (parent_tree, tvb, offset, 0, ett_RANGEBOUNDARY, &item, txt);
4535 ulType = tvb_get_letohl(tvb, offset);
4536 proto_tree_add_item(tree, hf_mswsp_rangeboundry_ultype, tvb, offset, 4, ENC_LITTLE_ENDIAN);
4537 proto_item_append_text(item, ": Type 0x%08x", ulType);
4538 offset += 4;
4540 ZERO_STRUCT(prval);
4541 offset = parse_CBaseStorageVariant(tvb, pinfo, offset, tree, pad_tree, &prval, "prVal");
4543 labelPresent = tvb_get_uint8(tvb, offset);
4544 proto_tree_add_item(tree, hf_mswsp_rangeboundry_labelpresent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
4545 offset += 1;
4547 if (labelPresent) {
4548 uint32_t ccLabel;
4549 const uint8_t* label;
4550 offset = parse_padding(tvb, offset, 4, pad_tree, "paddingLabelPresent");
4552 ccLabel = tvb_get_letohl(tvb, offset);
4553 proto_tree_add_item_ret_uint(tree, hf_mswsp_rangeboundry_cclabel, tvb, offset, 4, ENC_LITTLE_ENDIAN, &ccLabel);
4554 offset += 4;
4556 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);
4557 proto_item_append_text(item, " Label: \"%s\"", label);
4558 offset += 2*ccLabel;
4561 proto_item_append_text(item, " Val: %s", str_CBaseStorageVariant(&prval, true));
4563 proto_item_set_end(item, tvb, offset);
4564 return offset;
4568 /* 2.2.1.22 CRangeCategSpec */
4569 int parse_CRangeCategSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4571 proto_item *item;
4572 proto_tree *tree;
4573 va_list ap;
4574 unsigned i;
4575 const char *txt;
4576 uint32_t cRange;
4578 va_start(ap, fmt);
4579 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4580 va_end(ap);
4581 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRangeCategSpec, &item, txt);
4583 offset = parse_lcid(tvb, offset, tree, "lcid");
4585 cRange = tvb_get_letohl(tvb, offset);
4586 proto_tree_add_uint(tree, hf_mswsp_crangecategspec_crange, tvb, offset, 4, cRange);
4587 offset += 4;
4589 for (i=0; i<cRange; i++) {
4590 offset = parse_RANGEBOUNDARY(tvb, pinfo, offset, tree, pad_tree, "aRangeBegin[%u]", i);
4594 proto_item_set_end(item, tvb, offset);
4595 return offset;
4598 /* 2.2.1.21 CCategSpec */
4599 int parse_CCategSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4601 proto_item *item;
4602 proto_tree *tree;
4604 va_list ap;
4605 uint32_t type;
4606 const char *txt;
4607 va_start(ap, fmt);
4608 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4609 va_end(ap);
4610 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CCategSpec, &item, txt);
4612 type = tvb_get_letohl(tvb, offset);
4613 proto_tree_add_uint(tree, hf_mswsp_ccategspec_type, tvb, offset, 4, type);
4614 proto_item_append_text(item, " Type %u", type);
4615 offset += 4;
4617 offset = parse_CSort(tvb, offset, tree, pad_tree, "CSort");
4620 * A CRangeCategSpec structure specifying the range values.
4621 * This field MUST be omitted if _ulCategType is set to
4622 * CATEGORIZE_UNIQUE e.g. '0' otherwise it MUST be present.
4624 if (type != 0) {
4625 offset = parse_CRangeCategSpec(tvb, pinfo, offset, tree, pad_tree, "CRangeCategSpec");
4628 proto_item_set_end(item, tvb, offset);
4629 return offset;
4632 /* 2.2.1.25 CAggregSpec */
4633 static int parse_CAggregSpec(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4635 proto_item *item;
4636 proto_tree *tree;
4637 va_list ap;
4638 uint32_t type, ccAlias, idColumn;
4639 const char *txt;
4641 va_start(ap, fmt);
4642 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4643 va_end(ap);
4644 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CAggregSpec, &item, txt);
4646 proto_tree_add_item_ret_uint(tree, hf_mswsp_caggregspec_type, tvb, offset, 1, ENC_LITTLE_ENDIAN, &type);
4647 offset += 1;
4649 offset = parse_padding(tvb, offset, 4, pad_tree, "padding");
4651 proto_tree_add_item_ret_uint(tree, hf_mswsp_caggregspec_ccalias, tvb, offset, 4, ENC_LITTLE_ENDIAN, &ccAlias);
4652 offset += 4;
4654 proto_tree_add_item(tree, hf_mswsp_caggregspec_alias, tvb, offset, 2*ccAlias, ENC_LITTLE_ENDIAN | ENC_UCS_2);
4655 offset += 2*ccAlias;
4657 proto_tree_add_item_ret_uint(tree, hf_mswsp_caggregspec_idcolumn, tvb, offset, 4, ENC_LITTLE_ENDIAN, &idColumn);
4658 offset += 4;
4659 if (type == DBAGGTTYPE_REPRESENTATIVEOF
4660 || type == DBAGGTTYPE_BYFREQ
4661 || type == DBAGGTTYPE_FIRST) {
4662 proto_tree_add_uint(tree,
4663 hf_mswsp_caggregspec_ulmaxnumtoreturn,
4664 tvb, offset, 4, idColumn);
4665 offset += 4;
4666 if (type == DBAGGTTYPE_REPRESENTATIVEOF) {
4667 proto_tree_add_uint(tree,
4668 hf_mswsp_caggregspec_idrepresentative,
4669 tvb, offset, 4, idColumn);
4672 /* Optional ???
4673 ulMaxNumToReturn, idRepresentative;
4676 proto_item_set_end(item, tvb, offset);
4677 return offset;
4680 /* 2.2.1.24 CAggregSet */
4681 static int parse_CAggregSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4683 uint32_t cCount, i;
4684 proto_item *item;
4685 proto_tree *tree;
4686 const char *txt;
4688 va_list ap;
4690 va_start(ap, fmt);
4691 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4692 va_end(ap);
4693 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CAggregSet, &item, txt);
4695 cCount = tvb_get_letohl(tvb, offset);
4696 proto_tree_add_uint(tree, hf_mswsp_caggregset_count, tvb, offset, 4, cCount);
4697 offset += 4;
4699 for (i=0; i<cCount; i++) {
4700 /* 2.2.1.25 CAggregSpec */
4701 offset = parse_CAggregSpec(tvb, offset, tree, pad_tree, "AggregSpecs[%u]", i);
4704 proto_item_set_end(item, tvb, offset);
4705 return offset;
4708 /* 2.2.1.27 CAggregSortKey */
4709 static int parse_CAggregSortKey(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4711 uint32_t order;
4712 proto_item *item;
4713 proto_tree *tree;
4714 const char *txt;
4716 va_list ap;
4718 va_start(ap, fmt);
4719 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4720 va_end(ap);
4721 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CAggregSortKey, &item, txt);
4723 order = tvb_get_letohl(tvb, offset);
4724 proto_tree_add_uint(tree, hf_mswsp_caggregsortkey_order, tvb, offset, 4, order);
4725 offset += 4;
4727 offset = parse_CAggregSpec(tvb, offset, tree, pad_tree, "ColumnSpec");
4729 proto_item_set_end(item, tvb, offset);
4730 return offset;
4734 /* 2.2.1.26 CSortAggregSet */
4735 static int parse_CSortAggregSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4737 uint32_t cCount, i;
4738 proto_item *item;
4739 proto_tree *tree;
4740 const char *txt;
4741 va_list ap;
4743 va_start(ap, fmt);
4744 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4745 va_end(ap);
4746 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CSortAggregSet, &item, txt);
4748 cCount = tvb_get_letohl(tvb, offset);
4749 proto_tree_add_uint(tree, hf_mswsp_csortaggregset_count, tvb, offset, 4, cCount);
4750 offset += 4;
4752 for (i=0; i<cCount; i++) {
4753 /* 2.2.1.27 CAggregSortKey */
4754 offset = parse_CAggregSortKey(tvb, offset, tree, pad_tree, "SortKeys[%u]", i);
4757 proto_item_set_end(item, tvb, offset);
4758 return offset;
4761 enum CInGroupSortAggregSet_type {
4762 GroupIdDefault = 0x00, /* The default for all ranges. */
4763 GroupIdMinValue = 0x01, /*The first range in the parent's group.*/
4764 GroupIdNull = 0x02, /*The last range in the parent's group.*/
4765 GroupIdValue = 0x03
4768 static int parse_CInGroupSortAggregSet_type(tvbuff_t *tvb, int offset, proto_tree *tree, enum CInGroupSortAggregSet_type *type)
4770 uint8_t tmp = tvb_get_uint8(tvb, offset);
4771 switch(tmp) {
4772 case GroupIdDefault:
4773 *type = GroupIdDefault;
4774 break;
4775 case GroupIdMinValue:
4776 *type = GroupIdMinValue;
4777 break;
4778 case GroupIdNull:
4779 *type = GroupIdNull;
4780 break;
4781 case GroupIdValue:
4782 *type = GroupIdValue;
4783 break;
4784 default:
4785 DISSECTOR_ASSERT(false);
4786 break;
4788 proto_tree_add_uint(tree, hf_mswsp_cingroupsortaggregset_type, tvb, offset, 1, *type);
4789 return offset + 1;
4792 /* 2.2.1.29 CInGroupSortAggregSet */
4793 static int parse_CInGroupSortAggregSet(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4795 proto_item *item;
4796 proto_tree *tree;
4797 va_list ap;
4798 enum CInGroupSortAggregSet_type type;
4799 const char *txt;
4801 va_start(ap, fmt);
4802 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4803 va_end(ap);
4804 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CInGroupSortAggregSet, &item, txt);
4806 offset = parse_CInGroupSortAggregSet_type(tvb, offset, tree, &type);
4807 offset = parse_padding(tvb, offset, 4, pad_tree, "CInGroupSortAggregSet");
4809 if (type == GroupIdValue) {
4810 struct CBaseStorageVariant id;
4811 offset = parse_CBaseStorageVariant(tvb, pinfo, offset, tree, pad_tree, &id, "inGroupId");
4814 offset = parse_CSortSet(tvb, offset, tree, pad_tree, "SortSet");
4816 proto_item_set_end(item, tvb, offset);
4817 return offset;
4821 /* 2.2.1.28 CInGroupSortAggregSets */
4822 static int parse_CInGroupSortAggregSets(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4824 uint32_t cCount, i;
4825 proto_item *item;
4826 proto_tree *tree;
4827 const char *txt;
4828 va_list ap;
4830 va_start(ap, fmt);
4831 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4832 va_end(ap);
4834 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CInGroupSortAggregSets, &item, txt);
4836 cCount = tvb_get_letohl(tvb, offset);
4837 proto_tree_add_uint(tree, hf_mswsp_cingroupsortaggregsets_count, tvb, offset, 4, cCount);
4838 offset += 4;
4840 for (i=0; i<cCount; i++) {
4841 /* 2.2.1.29 CInGroupSortAggregSet */
4842 offset = parse_CInGroupSortAggregSet(tvb, pinfo, offset, tree, pad_tree, "SortSets[%u]", i);
4845 proto_item_set_end(item, tvb, offset);
4846 return offset;
4849 /* 2.2.1.20 CCategorizationSpec */
4850 int parse_CCategorizationSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4852 proto_item *item;
4853 proto_tree *tree;
4854 const char *txt;
4856 va_list ap;
4858 va_start(ap, fmt);
4859 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4860 va_end(ap);
4861 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CCategorizationSpec, &item, txt);
4863 /* 2.2.1.18 CColumnSet */
4864 offset = parse_CColumnSet(tvb, offset, tree, "csColumns");
4866 /* 2.2.1.21 CCategSpec */
4867 offset = parse_CCategSpec(tvb, pinfo, offset, tree, pad_tree, "Spec");
4869 /* 2.2.1.24 CAggregSet */
4870 offset = parse_CAggregSet(tvb, offset, tree, pad_tree, "AggregSet");
4872 /* 2.2.1.26 CSortAggregSet */
4873 offset = parse_CSortAggregSet(tvb, offset, tree, pad_tree, "SortAggregSet");
4875 /* 2.2.1.28 CInGroupSortAggregSets */
4876 offset = parse_CInGroupSortAggregSets(tvb, pinfo, offset, tree, pad_tree, "InGroupSortAggregSets");
4878 proto_tree_add_item(tree, hf_mswsp_categorizationspec_cmaxres, tvb, offset, 4, ENC_LITTLE_ENDIAN);
4879 offset += 4;
4881 proto_item_set_end(item, tvb, offset);
4882 return offset;
4885 static int * const mswsp_bool_options[] = {
4886 &hf_mswsp_bool_options_cursor,
4887 &hf_mswsp_bool_options_async,
4888 &hf_mswsp_bool_options_firstrows,
4889 &hf_mswsp_bool_options_holdrows,
4890 &hf_mswsp_bool_options_chaptered,
4891 &hf_mswsp_bool_options_useci,
4892 &hf_mswsp_bool_options_defertrim,
4893 &hf_mswsp_bool_options_rowsetevents,
4894 &hf_mswsp_bool_options_dontcomputeexpensive,
4895 NULL
4898 int parse_CRowsetProperties(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, const char *fmt, ...)
4900 proto_item *item;
4901 proto_tree *tree;
4902 const char *txt;
4904 va_list ap;
4906 va_start(ap, fmt);
4907 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4909 va_end(ap);
4910 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRowsetProperties, &item, txt);
4912 proto_tree_add_bitmask_with_flags(tree, tvb, offset,
4913 hf_mswsp_bool_options, ett_mswsp_bool_options, mswsp_bool_options, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
4915 offset += 4;
4917 proto_tree_add_item(tree, hf_mswsp_crowsetprops_ulmaxopenrows, tvb, offset, 4, ENC_LITTLE_ENDIAN);
4918 offset += 4;
4920 proto_tree_add_item(tree, hf_mswsp_crowsetprops_ulmemusage, tvb, offset, 4, ENC_LITTLE_ENDIAN);
4921 offset += 4;
4923 proto_tree_add_item(tree, hf_mswsp_crowsetprops_cmaxresults, tvb, offset, 4, ENC_LITTLE_ENDIAN);
4924 offset += 4;
4926 proto_tree_add_item(tree, hf_mswsp_crowsetprops_ccmdtimeout, tvb, offset, 4, ENC_LITTLE_ENDIAN);
4927 offset += 4;
4929 proto_item_set_end(item, tvb, offset);
4930 return offset;
4933 int parse_CPidMapper(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
4935 proto_item *item;
4936 proto_tree *tree;
4937 va_list ap;
4938 uint32_t count, i;
4939 const char *txt;
4941 va_start(ap, fmt);
4942 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4943 va_end(ap);
4945 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CPidMapper, &item, txt);
4947 count = tvb_get_letohl(tvb, offset);
4948 proto_tree_add_uint(tree, hf_mswsp_cpidmapper_count, tvb, offset, 4, count);
4949 offset += 4;
4951 offset = parse_padding(tvb, offset, 8, pad_tree, "CPidMapper_PropSpec");
4953 for (i=0; i<count; i++) {
4954 struct CFullPropSpec v;
4955 ZERO_STRUCT(v);
4956 /*at begin or end of loop???*/
4957 offset = parse_padding(tvb, offset, 4, pad_tree,
4958 "CPidMapper_PropSpec[%u]", i);
4959 offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &v, "PropSpec[%u]", i);
4962 proto_item_set_end(item, tvb, offset);
4963 return offset;
4966 /* 2.2.1.35 CColumnGroup */
4967 int parse_CColumnGroup(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, const char *fmt, ...)
4969 proto_tree *tree;
4970 proto_item *item, *ti;
4971 va_list ap;
4972 const char *txt;
4973 uint32_t count, groupPid, i;
4975 va_start(ap, fmt);
4976 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
4977 va_end(ap);
4979 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CColumnGroup, &item, txt);
4981 count = tvb_get_letohl(tvb, offset);
4982 proto_tree_add_uint(tree, hf_mswsp_ccolumngroup_count, tvb, offset, 4, count);
4983 offset += 4;
4985 groupPid = tvb_get_letohl(tvb, offset);
4986 ti = proto_tree_add_uint(tree, hf_mswsp_ccolumngroup_grouppid, tvb, offset, 4, groupPid);
4987 if ((0xFFFF0000 & groupPid) == 0x7FFF0000) {
4988 proto_item_append_text(ti, " Idx: %u", groupPid & 0xFFFF);
4989 } else {
4990 proto_item_append_text(ti, "<Invalid>");
4992 offset += 4;
4994 for (i=0; i<count; i++) {
4995 /* 2.2.1.36 SProperty */
4996 uint32_t pid, weight;
4997 pid = tvb_get_letohl(tvb, offset);
4998 weight = tvb_get_letohl(tvb, offset + 4);
4999 proto_tree_add_uint_format(tree, hf_mswsp_ccolumngroup_pid, tvb, offset, 8, pid, "Props[%u]: pid: %u weight: %u", i, pid, weight);
5000 offset += 8;
5003 proto_item_set_end(item, tvb, offset);
5004 return offset;
5007 /* 2.2.1.34 CColumnGroupArray */
5008 int parse_CColumnGroupArray(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...)
5010 proto_tree *tree;
5011 proto_item *item;
5012 va_list ap;
5013 const char *txt;
5015 uint32_t count, i;
5017 va_start(ap, fmt);
5018 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5019 va_end(ap);
5020 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CColumnGroupArray, &item, txt);
5022 count = tvb_get_letohl(tvb, offset);
5023 proto_tree_add_uint(tree, hf_mswsp_ccolumngrouparray_count, tvb, offset, 4, count);
5024 offset += 4;
5026 for (i=0; i<count; i++) {
5027 offset = parse_padding(tvb, offset, 4, pad_tree, "aGroupArray[%u]", i);
5028 offset = parse_CColumnGroup(tvb, offset, tree, pad_tree, "aGroupArray[%u]", i);
5031 proto_item_set_end(item, tvb, offset);
5032 return offset;
5035 static int parse_UInt32Array(tvbuff_t *tvb, int offset, proto_tree *parent_tree, uint32_t count, const char *item_name, const char *fmt, ...)
5037 uint32_t v, i;
5038 proto_tree *tree;
5039 proto_item *item;
5040 const char *txt;
5042 va_list ap;
5044 va_start(ap, fmt);
5045 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5046 va_end(ap);
5048 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_Array, &item, txt);
5050 for (i=0; i<count; i++) {
5051 v = tvb_get_letohl(tvb, offset);
5052 proto_tree_add_uint_format(tree, hf_mswsp_int32array_value, tvb, offset, 4, v, "%s[%u] = %u", item_name,i, v);
5053 offset += 4;
5055 proto_item_set_end(item, tvb, offset);
5056 return offset;
5059 /* 2.2.1.40 CRowSeekNext */
5060 static int parse_CRowSeekNext(tvbuff_t *tvb, int offset, proto_tree *parent_tree, const char *fmt, ...)
5062 proto_tree *tree;
5063 proto_item *item;
5064 const char *txt;
5065 va_list ap;
5067 va_start(ap, fmt);
5068 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5069 va_end(ap);
5071 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRowsSeekNext, &item, txt);
5073 proto_tree_add_item(tree, hf_mswsp_crowseeknext_cskip, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5074 offset += 4;
5075 proto_item_set_end(item, tvb, offset);
5076 return offset;
5080 /* 2.2.1.37 CRowSeekAt */
5081 static int parse_CRowSeekAt(tvbuff_t *tvb, int offset, proto_tree *parent_tree, const char *fmt, ...)
5083 proto_tree *tree;
5084 proto_item *item;
5085 va_list ap;
5086 const char *txt;
5088 va_start(ap, fmt);
5089 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5090 va_end(ap);
5092 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRowsSeekAt, &item, txt);
5094 proto_tree_add_item(tree, hf_mswsp_crowseekat_bmkoffset, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5095 offset += 4;
5098 proto_tree_add_item(tree, hf_mswsp_crowseekat_skip, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5099 offset += 4;
5101 proto_tree_add_item(tree, hf_mswsp_crowseekat_hregion, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5102 offset += 4;
5104 proto_item_set_end(item, tvb, offset);
5105 return offset;
5108 /* 2.2.1.38 CRowSeekAtRatio */
5109 static int parse_CRowSeekAtRatio(tvbuff_t *tvb, int offset, proto_tree *parent_tree, const char *fmt, ...)
5111 proto_tree *tree;
5112 proto_item *item;
5113 va_list ap;
5114 const char *txt;
5116 va_start(ap, fmt);
5117 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5118 va_end(ap);
5120 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRowsSeekAtRatio, &item, txt);
5122 proto_tree_add_item(tree, hf_mswsp_crowseekatratio_ulnumerator, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5123 offset += 4;
5126 proto_tree_add_item(tree, hf_mswsp_crowseekatratio_uldenominator, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5127 offset += 4;
5129 proto_tree_add_item(tree, hf_mswsp_crowseekatratio_hregion, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5130 offset += 4;
5132 proto_item_set_end(item, tvb, offset);
5133 return offset;
5136 /* 2.2.1.39 CRowSeekByBookmark */
5137 static int parse_CRowSeekByBookmark(tvbuff_t *tvb, int offset, proto_tree *parent_tree, const char *fmt, ...)
5139 proto_tree *tree;
5140 proto_item *item;
5141 uint32_t num;
5142 const char *txt;
5143 va_list ap;
5145 va_start(ap, fmt);
5146 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5147 va_end(ap);
5149 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRowsSeekByBookmark, &item, txt);
5151 num = tvb_get_letohl(tvb,offset);
5152 proto_tree_add_item(tree, hf_mswsp_crowseekbybookmark_cbookmarks, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5153 offset += 4;
5155 offset = parse_UInt32Array(tvb, offset, tree, num, "abookmark", "abookmarks");
5157 num = tvb_get_letohl(tvb,offset);
5158 proto_tree_add_item(tree, hf_mswsp_crowseekbybookmark_maxret, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5159 offset += 4;
5161 offset = parse_UInt32Array(tvb, offset, tree, num, "ascret", "ascret");
5163 proto_item_set_end(item, tvb, offset);
5164 return offset;
5167 static int get_fixed_vtype_dataize(enum vType vtype)
5169 struct vtype_data *vt_type = vType_get_type(vtype);
5170 if (vt_type) {
5171 return vt_type->size;
5173 return -1;
5176 static int parse_CRowVariantArrayInfo(tvbuff_t *tvb, int offset, proto_tree *tree, bool is_64bit, struct CRowVariant *variant)
5178 if (is_64bit) {
5179 variant->content.array_vector.i64.count =
5180 tvb_get_letoh64(tvb, offset);
5181 proto_tree_add_uint64(tree, hf_mswsp_crowvariantinfo_count64, tvb, offset, 8, variant->content.array_vector.i64.count);
5182 offset += 8;
5183 variant->content.array_vector.i64.array_address = tvb_get_letoh64(tvb, offset);
5184 proto_tree_add_uint64(tree, hf_mswsp_arrayvector_address64, tvb, offset, 8, variant->content.array_vector.i64.array_address);
5185 offset += 8;
5187 } else {
5188 variant->content.array_vector.i32.count =
5189 tvb_get_letohl(tvb, offset);
5190 proto_tree_add_uint(tree, hf_mswsp_crowvariantinfo_count32, tvb, offset, 4, variant->content.array_vector.i32.count );
5191 offset += 4;
5192 variant->content.array_vector.i32.array_address = tvb_get_letohl(tvb, offset);
5193 proto_tree_add_uint(tree, hf_mswsp_arrayvector_address32, tvb, offset, 4, variant->content.array_vector.i32.array_address);
5194 offset += 4;
5196 return offset;
5199 static int parse_VariantColVector(tvbuff_t *tvb, int offset, proto_tree *tree, uint64_t base_address, bool is_64bit, struct CRowVariant *variant, struct vtype_data *vt_list_type)
5201 uint32_t i = 0;
5202 uint64_t count = 0;
5203 int buf_offset = 0;
5204 proto_tree *sub_tree;
5205 wmem_strbuf_t *strbuf;
5207 offset = parse_CRowVariantArrayInfo(tvb, offset, tree, is_64bit, variant);
5208 if (is_64bit) {
5209 buf_offset =
5210 (int)(variant->content.array_vector.i64.array_address - base_address);
5211 count = variant->content.array_vector.i64.count;
5212 } else {
5213 buf_offset =
5214 (int)(variant->content.array_vector.i32.array_address - base_address);
5215 count = variant->content.array_vector.i32.count;
5217 sub_tree = proto_tree_add_subtree(tree, tvb, buf_offset, 0, ett_CRowVariant_Vector, NULL, "values");
5218 for (i = 0; i < count; i++) {
5219 uint64_t item_address = 0;
5220 int address_of_address = 0;
5221 int size;
5222 union vt_single value;
5223 int len;
5224 if (is_64bit) {
5225 size = 8;
5226 address_of_address = buf_offset + (i * size);
5227 item_address = tvb_get_letoh64(tvb, address_of_address);
5228 proto_tree_add_uint64_format(sub_tree, hf_mswsp_rowvariant_item_address64, tvb, address_of_address, size, item_address, "address[%d] 0x%" PRIx64, i, item_address);
5229 } else {
5230 size = 4;
5231 item_address = tvb_get_letohl(tvb, buf_offset + (i * size));
5232 proto_tree_add_uint_format(sub_tree, hf_mswsp_rowvariant_item_address32, tvb, address_of_address, size, (uint32_t)item_address, "address[%d] 0x%x", i, (uint32_t)item_address);
5234 strbuf = wmem_strbuf_new(wmem_packet_scope(), "");
5235 if (vt_list_type->size == -1) {
5236 /* dynamic type */
5237 DISSECTOR_ASSERT_HINT(vt_list_type->tvb_get_value_only != 0,
5238 "appears this is a vector of dynamic types that we don't know yet how to handle, please submit a bug with trace");
5239 len = vt_list_type->tvb_get_value_only(tvb, (int)(item_address - base_address), 0, &value);
5240 vt_list_type->strbuf_append(strbuf, &value);
5241 } else {
5243 * assume non dynamic size types are stored directly.
5244 * Note: not test as not seen in the wild.
5246 len = vt_list_type->size;
5247 DISSECTOR_ASSERT_HINT(vt_list_type->tvb_get != 0,
5248 "appears this is a vector of fixed types that we don't know yet how to handle, please submit a bug with trace");
5250 vt_list_type->tvb_get(tvb, (int)(item_address - base_address), &value);
5251 vt_list_type->strbuf_append(strbuf, &value);
5253 proto_tree_add_string(sub_tree, hf_mswsp_rowvariant_item_value, tvb, (int)(item_address - base_address), len, wmem_strbuf_get_str(strbuf));
5255 return offset;
5258 static int parse_VariantCol(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, uint64_t base_address, uint32_t length _U_, bool is_64bit, struct CRowVariant *variant, const char *fmt, ...)
5260 proto_tree *tree;
5261 proto_item *item, *ti_type;
5263 va_list ap;
5264 struct vtype_data *vt_type;
5265 const char *modifier = "", *txt;
5266 int size;
5267 uint16_t vtype_high;
5269 va_start(ap, fmt);
5270 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5271 va_end(ap);
5273 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CRowVariant, &item, txt);
5275 variant->vtype = tvb_get_letohs(tvb, offset);
5276 vt_type = vType_get_type((enum vType)variant->vtype);
5277 vtype_high = (variant->vtype & 0xFF00);
5278 if (vtype_high) {
5279 if (vtype_high == VT_VECTOR) {
5280 modifier = "|VT_VECTOR";
5281 } else if (vtype_high == VT_ARRAY) {
5282 modifier = "|VT_ARRAY";
5283 } else {
5284 modifier = "|Unknown, possibly error";
5288 if (vt_type == NULL) {
5290 * Not a valid type.
5292 ti_type = proto_tree_add_string(tree, hf_mswsp_ctablecolumn_vtype, tvb, offset, 4, "Unknown variant column type");
5293 expert_add_info(pinfo, ti_type, &ei_mswsp_invalid_variant_type);
5295 THROW_FORMATTED(ReportedBoundsError, "Unknown variant column type%s", modifier);
5296 return offset;
5298 proto_tree_add_string_format_value(tree, hf_mswsp_rowvariant_vtype, tvb, offset, 2, vt_type->str, "%s%s", vt_type->str, modifier);
5299 offset += 2;
5301 proto_tree_add_item(tree, hf_mswsp_rowvariant_reserved1, tvb, offset, 2, ENC_LITTLE_ENDIAN);
5302 variant->reserved1 = tvb_get_letohs(tvb, offset);
5304 offset += 2;
5305 proto_tree_add_item(tree, hf_mswsp_rowvariant_reserved2, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5306 variant->reserved2 = tvb_get_letohl(tvb, offset);
5307 offset += 4;
5309 size = get_fixed_vtype_dataize((enum vType)(variant->vtype & 0x00FF));
5311 if (vtype_high == VT_VECTOR || vtype_high == VT_ARRAY) {
5312 offset = parse_VariantColVector(tvb, offset, tree, base_address,
5313 is_64bit, variant, vt_type);
5314 } else {
5315 wmem_strbuf_t *strbuf = wmem_strbuf_new(wmem_packet_scope(), "");
5316 if (size != -1) {
5317 /* single fixed size value type */
5318 const char* desc = vt_type->str;
5320 DISSECTOR_ASSERT_HINT(vt_type->tvb_get != 0,
5321 "appears fixed type that we don't know yet how to handle, please submit a bug with trace");
5322 vt_type->tvb_get(tvb, offset, &variant->content);
5323 vt_type->strbuf_append(strbuf, &variant->content);
5324 proto_tree_add_string_format_value(tree, hf_mswsp_rowvariant_item_value, tvb, offset, size, desc, "%s: %s", desc, wmem_strbuf_get_str(strbuf));
5325 } else {
5326 int64_t value_address;
5327 int buf_offset = offset;
5328 int len;
5329 union vt_single non_fixed_size_val;
5330 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");
5331 if (is_64bit) {
5332 variant->content.hyperw = tvb_get_letoh64(tvb, offset);
5333 offset += 8;
5334 value_address = variant->content.hyperw;
5335 proto_tree_add_uint64(tree, hf_mswsp_rowvariant_item_address64, tvb, buf_offset, 8, value_address);
5336 } else {
5337 variant->content.longw = tvb_get_letohl(tvb, offset);
5338 offset += 4;
5339 value_address = variant->content.longw;
5340 proto_tree_add_uint(tree, hf_mswsp_rowvariant_item_address32, tvb, buf_offset, 4, (uint32_t)value_address);
5343 len = vt_type->tvb_get_value_only(tvb, (int)(value_address - base_address), 0, &non_fixed_size_val);
5344 vt_type->strbuf_append(strbuf, &non_fixed_size_val);
5345 proto_tree_add_string(tree, hf_mswsp_rowvariant_item_value, tvb, (int)(value_address - base_address), len, wmem_strbuf_get_str(strbuf));
5349 return offset;
5352 static int parse_RowsBufferCol(tvbuff_t *tvb, packet_info *pinfo, int offset, uint32_t row, uint32_t col, struct CPMSetBindingsIn *bindingsin, struct rows_data *rowsin, bool b_is_64bit, proto_tree *parent_tree, const char *fmt, ...)
5354 proto_tree *tree;
5355 proto_item *item;
5356 uint32_t buf_start = offset;
5357 uint32_t buf_offset = buf_start + (row * bindingsin->brow);
5358 struct CTableColumn *pcol = &bindingsin->acolumns[col];
5360 static const value_string STATUS[] = {
5361 {0, "StoreStatusOk"},
5362 {1, "StoreStatusDeferred"},
5363 {2, "StoreStatusNull"},
5364 {0, NULL}
5367 const char *txt;
5368 va_list ap;
5370 va_start(ap, fmt);
5371 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5372 va_end(ap);
5373 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_GetRowsColumn, &item, txt);
5374 proto_item_append_text(item, " (%s)", pcol->name);
5375 if (pcol->statusused) {
5376 int tmp_offset = buf_offset + pcol->statusoffset;
5377 proto_tree_add_string(tree, hf_mswsp_ctablecolumn_status, tvb, tmp_offset, 1, val_to_str(tvb_get_uint8(tvb, tmp_offset), STATUS, "(Invalid: 0x%x)"));
5379 if (pcol->lengthused) {
5380 int tmp_offset = buf_offset + pcol->lengthoffset;
5381 proto_tree_add_item(tree, hf_mswsp_ctablecolumn_length, tvb, tmp_offset, 1, ENC_LITTLE_ENDIAN);
5383 if (pcol->valueused) {
5384 int tmp_offset = buf_offset + pcol->valueoffset;
5385 struct CRowVariant variant;
5386 uint32_t len = pcol->valuesize;
5387 uint64_t base_address = rowsin->ulclientbase;/*( + rowsin->cbreserved;*/
5388 ZERO_STRUCT(variant);
5390 if (pcol->lengthused) {
5391 len = tvb_get_letohs(tvb, buf_offset + pcol->lengthoffset) - pcol->valuesize;
5393 if (pcol->vtype == VT_VARIANT) {
5394 parse_VariantCol(tvb, pinfo, tmp_offset, tree, base_address, len, b_is_64bit, &variant, "CRowVariant");
5397 return offset;
5400 static int parse_RowsBuffer(tvbuff_t *tvb, packet_info *pinfo, int offset, uint32_t num_rows, struct CPMSetBindingsIn *bindingsin, struct rows_data *rowsin, bool is64bit, proto_tree *parent_tree, const char *fmt, ...)
5402 proto_tree *tree;
5403 proto_item *item;
5404 uint32_t num;
5405 const char *txt;
5406 va_list ap;
5408 va_start(ap, fmt);
5409 txt = wmem_strdup_vprintf(wmem_packet_scope(), fmt, ap);
5410 va_end(ap);
5412 tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_GetRowsRow, &item, txt);
5414 for (num = 0; num < num_rows; ++num) {
5415 uint32_t col;
5416 proto_tree *row_tree;
5417 row_tree = proto_tree_add_subtree_format(tree, tvb, offset, 0, ett_GetRowsRow, NULL, "Row[%d]", num);
5418 for (col = 0; col < bindingsin->ccolumns; col++) {
5419 parse_RowsBufferCol(tvb, pinfo, offset, num, col, bindingsin, rowsin, is64bit, row_tree, "Col[%d]", col);
5422 return offset;
5424 /* Code to actually dissect the packets */
5426 static int dissect_CPMConnect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *private_data)
5428 proto_item *ti;
5429 proto_tree *tree;
5430 int offset = 16;
5431 unsigned len;
5432 uint32_t version;
5433 struct message_data *data = NULL;
5434 struct mswsp_ct *ct = NULL;
5436 ti = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5437 tree = proto_item_add_subtree(ti, ett_mswsp_msg);
5438 proto_item_set_text(ti, "CPMConnect%s", in ? "In" : "Out");
5439 col_append_str(pinfo->cinfo, COL_INFO, "Connect");
5441 ti = proto_tree_add_item_ret_uint(tree, hf_mswsp_msg_Connect_Version, tvb,
5442 offset, 4, ENC_LITTLE_ENDIAN, &version);
5444 ct = get_create_converstation_data(pinfo);
5446 if (ct) {
5447 data = find_or_create_message_data(ct, pinfo, 0xC8, in, private_data);
5448 if (data) {
5449 data->content.version = version;
5452 offset += 4;
5454 if (in) {
5455 uint32_t blob_size1_off, blob_size2_off;
5456 proto_tree *pad_tree;
5458 pad_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_mswsp_pad, &ti, "Padding");
5460 proto_tree_add_item(tree, hf_mswsp_msg_ConnectIn_ClientIsRemote, tvb,
5461 offset, 4, ENC_LITTLE_ENDIAN);
5462 offset += 4;
5464 /* _cbBlob1 */
5465 blob_size1_off = offset;
5466 offset += 4;
5468 offset = parse_padding(tvb, offset, 8, pad_tree, "_paddingcbBlob2");
5470 /* _cbBlob2 */
5471 blob_size2_off = offset;
5472 offset += 4;
5474 offset = parse_padding(tvb, offset, 16, pad_tree, "_padding");
5476 len = tvb_unicode_strsize(tvb, offset);
5477 proto_tree_add_item(tree, hf_mswsp_msg_ConnectIn_MachineName, tvb,
5478 offset, len, ENC_LITTLE_ENDIAN | ENC_UCS_2);
5479 offset += len;
5481 len = tvb_unicode_strsize(tvb, offset);
5482 ti = proto_tree_add_item(tree, hf_mswsp_msg_ConnectIn_UserName, tvb,
5483 offset, len, ENC_LITTLE_ENDIAN | ENC_UCS_2);
5484 offset += len;
5486 offset = parse_padding(tvb, offset, 8, pad_tree, "_paddingcPropSets");
5488 offset = parse_PropertySetArray(tvb, pinfo, offset, blob_size1_off, tree, pad_tree, "PropSets");
5490 offset = parse_padding(tvb, offset, 8, pad_tree, "paddingExtPropset");
5492 offset = parse_PropertySetArray(tvb, pinfo, offset, blob_size2_off, tree, pad_tree, "ExtPropset");
5494 offset = parse_padding(tvb, offset, 8, pad_tree, "???");
5496 DISSECTOR_ASSERT(offset == (int)tvb_reported_length(tvb));
5498 /* make "Padding" the last item */
5499 proto_tree_move_item(tree, ti, proto_tree_get_parent(pad_tree));
5500 } else {
5503 return tvb_reported_length(tvb);
5506 static int dissect_CPMDisconnect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, bool in _U_, void *data _U_)
5508 col_append_str(pinfo->cinfo, COL_INFO, "Disconnect");
5509 return tvb_reported_length(tvb);
5512 static int dissect_CPMCreateQuery(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
5514 int offset = 16;
5515 proto_item *item;
5516 proto_tree *tree;
5518 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5519 tree = proto_item_add_subtree(item, ett_mswsp_msg);
5521 proto_item_set_text(item, "CPMCreateQuery%s", in ? "In" : "Out");
5522 col_append_str(pinfo->cinfo, COL_INFO, "CreateQuery");
5524 if (in) {
5525 proto_item *ti;
5526 proto_tree *pad_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_mswsp_pad, &ti, "Padding");
5527 uint8_t CColumnSetPresent, CRestrictionPresent, CSortSetPresent, CCategorizationSetPresent;
5528 uint32_t size = tvb_get_letohl(tvb, offset);
5529 proto_tree_add_uint(tree, hf_mswsp_msg_cpmcreatequery_size, tvb, offset, 4, size);
5530 offset += 4;
5532 CColumnSetPresent = tvb_get_uint8(tvb, offset);
5533 proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_ccolumnsetpresent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
5534 offset += 1;
5536 if (CColumnSetPresent) {
5537 offset = parse_padding(tvb, offset, 4, pad_tree, "paddingCColumnSetPresent");
5538 offset = parse_padding(tvb, offset, 4, pad_tree, "paddingCColumnSetPresent");
5539 offset = parse_CColumnSet(tvb, offset, tree, "CColumnSet");
5542 CRestrictionPresent = tvb_get_uint8(tvb, offset);
5543 proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_crestrictionpresent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
5544 offset += 1;
5546 if (CRestrictionPresent) {
5547 offset = parse_CRestrictionArray(tvb, pinfo, offset, tree, pad_tree, "RestrictionArray");
5550 CSortSetPresent = tvb_get_uint8(tvb, offset);
5551 proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_csortpresent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
5552 offset += 1;
5554 if (CSortSetPresent) {
5555 offset = parse_padding(tvb, offset, 4, tree, "paddingCSortSetPresent");
5556 offset = parse_CInGroupSortAggregSets(tvb, pinfo, offset, tree, pad_tree, "GroupSortAggregSets");
5560 CCategorizationSetPresent = tvb_get_uint8(tvb, offset);
5561 proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_ccategpresent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
5562 offset += 1;
5564 if (CCategorizationSetPresent) {
5565 uint32_t count, i;
5566 offset = parse_padding(tvb, offset, 4, pad_tree, "paddingCCategorizationSetPresent");
5567 /* 2.2.1.19 CCategorizationSet */
5568 count = tvb_get_letohl(tvb, offset);
5569 proto_tree_add_uint(tree, hf_mswsp_msg_cpmcreatequery_ccateg_count, tvb, offset, 4, count);
5570 offset += 4;
5571 for (i=0; i<count; i++) {
5572 offset = parse_CCategorizationSpec(tvb, pinfo, offset, tree, pad_tree, "categories[%u]", i);
5576 offset = parse_padding(tvb, offset, 4, tree, "XXXX");
5578 offset = parse_CRowsetProperties(tvb, offset, tree, pad_tree, "RowSetProperties");
5580 offset = parse_CPidMapper(tvb, offset, tree, pad_tree, "PidMapper");
5582 parse_CColumnGroupArray(tvb, offset, tree, pad_tree, "GroupArray");
5583 } else { /* out */
5584 proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_trueseq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5585 offset += 4;
5586 proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_workid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5587 offset += 4;
5589 * #FIXME Cursors is an array of uint32 where the size of the array is
5590 * determined by categories in the CategorizationSet in the CPMQuery
5591 * request message.
5593 proto_tree_add_item(tree, hf_mswsp_msg_cpmcreatequery_cursors, tvb, offset, -1, ENC_NA);
5596 return tvb_reported_length(tvb);
5599 static int dissect_CPMFreeCursor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, bool in _U_, void *data _U_)
5601 col_append_str(pinfo->cinfo, COL_INFO, "FreeCursor");
5602 return tvb_reported_length(tvb);
5605 static int dissect_CPMGetRows(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *private_data)
5607 struct mswsp_ct *ct = NULL;
5608 int offset = 16;
5609 proto_item *item;
5610 proto_tree *tree;
5611 proto_tree *seek_tree;
5612 uint32_t eType = 0;
5614 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, in ? 0 : -1, ENC_NA);
5615 tree = proto_item_add_subtree(item, ett_mswsp_msg);
5617 proto_item_set_text(item, "GetRows%s", in ? "In" : "Out");
5618 col_append_str(pinfo->cinfo, COL_INFO, "GetRows");
5620 ct = get_create_converstation_data(pinfo);
5621 if (in) {
5622 /* 2.2.3.11 */
5623 struct message_data *data = NULL;
5625 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5626 offset += 4;
5628 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_rowstotransfer, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5629 offset += 4;
5631 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_rowwidth, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5632 offset += 4;
5634 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_cbseek, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5635 offset += 4;
5637 data = find_or_create_message_data(ct, pinfo, 0xCC, in, private_data);
5638 if (data) {
5639 data->content.rowsin.cbreserved = tvb_get_letohl(tvb, offset);
5641 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_cbreserved, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5642 offset += 4;
5644 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_cbreadbuffer, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5645 offset += 4;
5647 if (data) {
5648 data->content.rowsin.ulclientbase = tvb_get_letohl(tvb, offset);
5651 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_ulclientbase, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5652 offset += 4;
5654 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_fbwdfetch, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5655 offset += 4;
5657 eType = tvb_get_letohl(tvb, offset);
5658 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_etype, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5659 offset += 4;
5661 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_chapt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5662 offset += 4;
5664 seek_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_SeekDescription, NULL, "SeekDescription");
5665 switch (eType) {
5666 case 0: /* eRowSeekNone */
5667 break;
5668 case 1: /* eRowSeekNext */
5669 parse_CRowSeekNext(tvb, offset, seek_tree, "CRowSeekNext");
5670 break;
5671 case 2: /* eRowSeekAt */
5672 parse_CRowSeekAt(tvb, offset, seek_tree, "CRowSeekAt");
5674 break;
5675 case 3: /* eRowSeekAtRatio */
5676 parse_CRowSeekAtRatio(tvb, offset, seek_tree, "CRowSeekAtRatio");
5677 break;
5678 case 4: /* eRowSeekByBookmark */
5679 parse_CRowSeekByBookmark(tvb, offset, seek_tree, "CRowSeekByRatio");
5680 break;
5681 default: /*error*/
5682 break;
5684 } else {
5685 /* 2.2.3.12 */
5687 * GetRows response needs information from GetRow & SetBindings
5688 * requests
5690 /* find the preceding SetBinding data */
5691 uint32_t num_rows = 0;
5692 proto_item *ti;
5693 proto_tree *pad_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_mswsp_pad, &ti, "Padding");
5694 struct CPMSetBindingsIn *bindingsin = find_binding_msg_data(ct, pinfo,
5695 private_data);
5696 struct rows_data *rowsin = find_rowsin_msg_data(ct, pinfo, private_data);
5697 bool b_64bit_mode = false;
5698 bool b_has_arch = is_64bit_mode(ct, pinfo, &b_64bit_mode, private_data);
5699 num_rows = tvb_get_letohl(tvb, offset);
5700 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_crowsreturned, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5701 offset += 4;
5703 eType = tvb_get_letohl(tvb, offset);
5704 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_etype, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5705 offset += 4;
5707 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrows_chapt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5708 offset += 4;
5710 seek_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_SeekDescription, NULL, "SeekDescription");
5711 switch (eType) {
5712 case 0: /* eRowSeekNone */
5713 break;
5714 case 1: /* eRowSeekNext */
5715 parse_CRowSeekNext(tvb, offset, seek_tree, "CRowSeekNext");
5716 break;
5717 case 2: /* eRowSeekAt */
5718 parse_CRowSeekAt(tvb, offset, seek_tree, "CRowSeekAt");
5720 break;
5721 case 3: /* eRowSeekAtRatio */
5722 parse_CRowSeekAtRatio(tvb, offset, seek_tree, "CRowSeekAtRatio");
5723 break;
5724 case 4: /* eRowSeekByBookmark */
5725 parse_CRowSeekByBookmark(tvb, offset, seek_tree, "CRowSeekByRatio");
5726 break;
5727 default: /*error*/
5728 break;
5731 if (b_has_arch && bindingsin && rowsin) {
5732 offset = parse_padding(tvb, offset, rowsin->cbreserved, pad_tree,
5733 "paddingRows");
5734 parse_RowsBuffer(tvb, pinfo, offset, num_rows, bindingsin, rowsin, b_64bit_mode, tree, "Rows");
5735 } else {
5736 int nbytes = tvb_reported_length_remaining(tvb, offset);
5737 proto_tree_add_expert_format(tree, pinfo, &ei_missing_msg_context, tvb, offset, nbytes, "Undissected %d bytes (due to missing preceding msg(s))", nbytes);
5741 return tvb_reported_length(tvb);
5745 static int dissect_CPMRatioFinished(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
5747 int offset = 16;
5748 proto_item *item;
5749 proto_tree *tree;
5750 col_append_str(pinfo->cinfo, COL_INFO, "RatioFinished");
5751 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5752 tree = proto_item_add_subtree(item, ett_mswsp_msg);
5753 proto_item_set_text(item, "RationFinised%s", in ? "In" : "Out");
5754 if (in) {
5755 proto_tree_add_item(tree, hf_mswsp_msg_cpmratiofinished_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5756 offset += 4;
5757 proto_tree_add_item(tree, hf_mswsp_msg_cpmratiofinished_fquick, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5758 } else {
5759 proto_tree_add_item(tree, hf_mswsp_msg_cpmratiofinished_ulnumerator, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5760 offset += 4;
5761 proto_tree_add_item(tree, hf_mswsp_msg_cpmratiofinished_uldenominator, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5762 offset += 4;
5763 proto_tree_add_item(tree, hf_mswsp_msg_cpmratiofinished_crows, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5764 offset += 4;
5765 proto_tree_add_item(tree, hf_mswsp_msg_cpmratiofinished_fnewrows, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5768 return tvb_reported_length(tvb);
5771 static int dissect_CPMCompareBmk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
5773 int offset = 16;
5774 proto_item *item;
5775 proto_tree *tree;
5777 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, in ? 0 : -1, ENC_NA);
5778 tree = proto_item_add_subtree(item, ett_mswsp_msg);
5780 proto_item_set_text(item, "CompareBmk%s", in ? "In" : "Out");
5781 col_append_str(pinfo->cinfo, COL_INFO, "CompareBmk");
5782 if (in) {
5783 proto_tree_add_item(tree, hf_mswsp_msg_cpmcomparebmk_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5784 offset += 4;
5785 proto_tree_add_item(tree, hf_mswsp_msg_cpmcomparebmk_chapt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5786 offset += 4;
5787 proto_tree_add_item(tree, hf_mswsp_msg_cpmcomparebmk_bmkfirst, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5788 offset += 4;
5789 proto_tree_add_item(tree, hf_mswsp_msg_cpmcomparebmk_bmksecond, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5790 } else {
5791 proto_tree_add_item(tree, hf_mswsp_msg_cpmcomparebmk_dwcomparison, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5793 return tvb_reported_length(tvb);
5796 static int dissect_CPMGetApproximatePosition(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
5798 int offset = 16;
5799 proto_item *item;
5800 proto_tree *tree;
5802 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, in ? 0 : -1, ENC_NA);
5803 tree = proto_item_add_subtree(item, ett_mswsp_msg);
5805 proto_item_set_text(item, "GetApproximatePosition%s", in ? "In" : "Out");
5806 col_append_str(pinfo->cinfo, COL_INFO, "GetApproximatePosition");
5807 if (in) {
5808 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetapproxpos_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5809 offset += 4;
5810 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetapproxpos_chapt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5811 offset += 4;
5812 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetapproxpos_bmk, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5813 } else {
5814 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetapproxpos_numerator, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5815 offset += 4;
5816 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetapproxpos_denominator, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5818 return tvb_reported_length(tvb);
5821 /* 2.2.3.10 */
5822 static int dissect_CPMSetBindings(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *private_data)
5824 int offset = 16;
5825 struct CPMSetBindingsIn request;
5827 col_append_str(pinfo->cinfo, COL_INFO, "SetBindings");
5828 if (in) {
5830 struct mswsp_ct *ct = NULL;
5831 struct message_data *data = NULL;
5832 proto_item *ti;
5833 proto_tree *tree, *pad_tree;
5834 uint32_t size, num, n;
5835 int64_t column_size;
5837 ti = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5838 tree = proto_item_add_subtree(ti, ett_mswsp_msg);
5840 proto_item_set_text(ti, "SetBindingsIn");
5842 pad_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_mswsp_pad, &ti, "Padding");
5844 proto_tree_add_item(tree, hf_mswsp_msg_cpmsetbinding_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5845 request.hcursor = tvb_get_letohl(tvb, offset);
5846 offset += 4;
5847 request.brow = tvb_get_letohl(tvb, offset);
5848 proto_tree_add_item(tree, hf_mswsp_msg_cpmsetbinding_cbrow, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5849 offset += 4;
5851 size = tvb_get_letohl(tvb, offset);
5852 request.bbindingdesc = size;
5853 proto_tree_add_item(tree, hf_mswsp_msg_cpmsetbinding_desc, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5854 offset += 4;
5856 request.dummy = tvb_get_letohl(tvb, offset);
5857 proto_tree_add_item(tree, hf_mswsp_msg_cpmsetbinding_dummy, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5858 offset += 4;
5860 num = tvb_get_letohl(tvb, offset);
5861 request.ccolumns = num;
5862 ti = proto_tree_add_item(tree, hf_mswsp_msg_cpmsetbinding_ccolumns, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5863 offset += 4;
5865 proto_tree_add_item(tree, hf_mswsp_msg_cpmsetbinding_acolumns, tvb, offset, size-4, ENC_NA);
5867 /* Sanity check size value */
5868 column_size = num*MIN_CTABLECOL_SIZE;
5869 if (num > MAX_CTABLECOL_SIZE || column_size > tvb_reported_length_remaining(tvb, offset))
5871 expert_add_info(pinfo, ti, &ei_mswsp_msg_cpmsetbinding_ccolumns);
5872 return tvb_reported_length(tvb);
5875 ct = get_create_converstation_data(pinfo);
5877 request.acolumns = (struct CTableColumn*)wmem_alloc(wmem_file_scope(),
5878 sizeof(struct CTableColumn) * num);
5879 for (n=0; n<num; n++) {
5880 offset = parse_padding(tvb, offset, 4, pad_tree, "padding_aColumns[%u]", n);
5881 offset = parse_CTableColumn(tvb, pinfo, offset, tree, pad_tree, &request.acolumns[n],"aColumns[%u]", n);
5883 data = find_or_create_message_data(ct, pinfo,0xD0,in, private_data);
5884 if (data) {
5885 data->content.bindingsin = request;
5888 } else { /* server only returns status with header */
5891 return tvb_reported_length(tvb);
5894 static int dissect_CPMGetNotify(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, bool in _U_, void *data _U_)
5896 col_append_str(pinfo->cinfo, COL_INFO, "GetNotify");
5897 return tvb_reported_length(tvb);
5900 static int dissect_CPMSendNotifyOut(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in _U_, void *data _U_)
5902 int offset = 16;
5903 proto_item *item;
5904 proto_tree *tree;
5906 col_append_str(pinfo->cinfo, COL_INFO, "SendNotify");
5907 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5908 tree = proto_item_add_subtree(item, ett_mswsp_msg);
5909 proto_item_set_text(item, "GetSendNotifyOut");
5910 proto_tree_add_item(tree, hf_mswsp_msg_cpmsendnotify_watchnotify, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5911 return tvb_reported_length(tvb);
5914 static int dissect_CPMGetQueryStatus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
5916 int offset = 16;
5917 proto_item *item;
5918 proto_tree *tree;
5920 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5921 tree = proto_item_add_subtree(item, ett_mswsp_msg);
5923 proto_item_set_text(item, "GetQueryStatus%s", in ? "In" : "Out");
5924 col_append_str(pinfo->cinfo, COL_INFO, "GetQueryStatus");
5926 if (in) {
5927 /* 2.2.3.7 */
5928 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetquerystatus_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5929 } else {
5930 /* 2.2.3.7 */
5931 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetquerystatus_qstatus, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5934 return tvb_reported_length(tvb);
5937 static int dissect_CPMCiState(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
5939 int offset = 16;
5940 proto_item *item;
5941 proto_tree *tree;
5943 col_append_str(pinfo->cinfo, COL_INFO, "CiState");
5945 if (!in) {
5946 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5947 tree = proto_item_add_subtree(item, ett_mswsp_msg);
5948 proto_item_set_text(item, "CiStateOut");
5949 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cbstruct, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5950 offset += 4;
5951 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cwordlist, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5952 offset += 4;
5953 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cpersistindex, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5954 offset += 4;
5955 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cqueries, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5956 offset += 4;
5957 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cfreshtest, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5958 offset += 4;
5959 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cfreshtest, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5960 offset += 4;
5961 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_dwmergeprogress, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5962 offset += 4;
5963 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_estate, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5964 offset += 4;
5965 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cfiltereddocs, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5966 offset += 4;
5967 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_ctotaldocs, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5968 offset += 4;
5969 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cpendingscans, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5970 offset += 4;
5971 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_dwindexsize, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5972 offset += 4;
5973 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_cuniquekeys, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5974 offset += 4;
5975 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_csecqdocuments, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5976 offset += 4;
5977 proto_tree_add_item(tree, hf_mswsp_msg_cpmcistate_dwpropcachesize, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5979 return tvb_reported_length(tvb);
5982 static int dissect_CPMFetchValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
5984 int offset = 16;
5985 proto_item *item;
5986 proto_tree *tree, *pad_tree;
5987 col_append_str(pinfo->cinfo, COL_INFO, "FetchValue");
5989 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
5990 tree = proto_tree_add_subtree_format(parent_tree, tvb, offset, 0, ett_mswsp_msg, &item, "FetchValue%s", in ? "In" : "Out");
5991 pad_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_mswsp_pad, NULL, "Padding");
5992 if (in) {
5993 struct CFullPropSpec prop;
5994 proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_wid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5995 offset += 4;
5996 proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_cbsofar, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5997 offset += 4;
5998 proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_cbpropspec, tvb, offset, 4, ENC_LITTLE_ENDIAN);
5999 offset += 4;
6000 proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_cbchunk, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6001 offset += 4;
6002 offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &prop,
6003 "PropSpec");
6004 parse_padding(tvb, offset, 4, pad_tree,"_padding");
6005 } else {
6006 uint32_t cbValue = tvb_get_letohl(tvb, offset);
6007 proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_cbvalue, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6008 offset += 4;
6009 proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_fmoreexists, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6010 offset += 4;
6011 proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_fvalueexists, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6012 offset += 4;
6013 proto_tree_add_item(tree, hf_mswsp_msg_cpmfetchvalue_vvalue, tvb, offset, cbValue, ENC_NA);
6015 return tvb_reported_length(tvb);
6018 static int dissect_CPMGetQueryStatusEx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
6020 int offset = 16;
6021 proto_item *item;
6022 proto_tree *tree;
6024 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
6025 tree = proto_item_add_subtree(item, ett_mswsp_msg);
6027 proto_item_set_text(item, "GetQueryStatusEx%s", in ? "In" : "Out");
6028 col_append_str(pinfo->cinfo, COL_INFO, "GetQueryStatusEx");
6030 if (in) {
6031 /* 2.2.3.8 */
6032 proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6033 offset += 4;
6034 proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_bmk, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6035 } else {
6036 /* 2.2.3.9 */
6037 proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_qstatus, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6038 offset += 4;
6039 proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_cfiltereddocs, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6040 offset += 4;
6041 proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_cdocstofilter, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6042 offset += 4;
6043 proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_dwratiodenom, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6044 offset += 4;
6045 proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_dwrationumer, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6046 offset += 4;
6047 proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_irowbmk, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6048 offset += 4;
6049 proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_crowstotal, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6050 offset += 4;
6051 proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_maxrank, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6052 offset += 4;
6053 proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_cresultsfound, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6054 offset += 4;
6055 proto_tree_add_item(tree, hf_mswsp_msg_cpmquerystatusex_whereid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6057 return tvb_reported_length(tvb);
6060 static int dissect_CPMRestartPosition(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
6062 int offset = 16;
6063 proto_item *item;
6064 proto_tree *tree;
6066 col_append_str(pinfo->cinfo, COL_INFO, "CPMRestartPosition");
6068 if (in) {
6069 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
6070 tree = proto_item_add_subtree(item, ett_mswsp_msg);
6071 proto_item_set_text(item, "CPMRestartPosition");
6072 proto_tree_add_item(tree, hf_mswsp_msg_cpmrestartposition_hcursor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6073 offset += 4;
6074 proto_tree_add_item(tree, hf_mswsp_msg_cpmrestartposition_chapt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6077 col_append_str(pinfo->cinfo, COL_INFO, "RestartPosition");
6078 return tvb_reported_length(tvb);
6081 static int dissect_CPMSetCatState(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, bool in _U_, void *data _U_)
6083 col_append_str(pinfo->cinfo, COL_INFO, "SetCatState");
6084 return tvb_reported_length(tvb);
6087 static int dissect_CPMGetRowsetNotify(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
6089 int offset = 16;
6090 proto_item *item;
6091 proto_tree *tree;
6092 col_append_str(pinfo->cinfo, COL_INFO, "GetRowsetNotify");
6093 if (!in) {
6094 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
6095 tree = proto_item_add_subtree(item, ett_mswsp_msg);
6096 proto_item_set_text(item, "GetRowsetNotifyOut");
6097 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_wid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6098 offset += 4;
6100 /* moveevents */
6101 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_moreevents, tvb, offset, 1, ENC_LITTLE_ENDIAN);
6102 /* eventType */
6103 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_eventtype, tvb, offset, 1, ENC_LITTLE_ENDIAN);
6104 offset += 1;
6106 /* rowSetItemState */
6107 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_rowsetitemstate, tvb, offset, 1, ENC_LITTLE_ENDIAN);
6108 offset += 1;
6110 /* changedItemState */
6111 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_changeditemstate, tvb, offset, 1, ENC_LITTLE_ENDIAN);
6112 offset += 1;
6114 /* rowSetEvent */
6115 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_rowsetevent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
6116 offset += 1;
6118 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_rowseteventdata1, tvb, offset, 8, ENC_LITTLE_ENDIAN);
6119 offset += 8;
6120 proto_tree_add_item(tree, hf_mswsp_msg_cpmgetrowsetnotify_rowseteventdata2, tvb, offset, 8, ENC_LITTLE_ENDIAN);
6121 /* it seems there is an extra unknown 8 bytes following */
6123 return tvb_reported_length(tvb);
6126 static int dissect_CPMFindIndices(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
6128 int offset = 16;
6129 proto_item *item;
6130 proto_tree *tree;
6131 col_append_str(pinfo->cinfo, COL_INFO, "FindIndices");
6132 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
6133 tree = proto_item_add_subtree(item, ett_mswsp_msg);
6134 proto_item_set_text(item, "FindIndices%s", in ? "In" : "Out");
6136 if (in) {
6137 uint32_t cWids;
6138 uint32_t cDepthPrev;
6139 cWids = tvb_get_letohl(tvb, offset);
6140 proto_tree_add_uint(tree, hf_mswsp_msg_cpmfindindices_cwids, tvb, offset, 4, cWids);
6141 offset += 4;
6142 cDepthPrev = tvb_get_letohl(tvb, offset);
6143 proto_tree_add_uint(tree, hf_mswsp_msg_cpmfindindices_cdepthprev, tvb, offset, 4, cDepthPrev);
6144 offset += 4;
6145 offset = parse_uin32_array(tvb, offset, tree, cWids, "pwids");
6146 parse_uin32_array(tvb, offset, tree, cDepthPrev, "prgiRowPrev");
6147 } else {
6148 uint32_t cDepthNext;
6149 cDepthNext = tvb_get_letohl(tvb, offset);
6150 proto_tree_add_uint(tree, hf_mswsp_msg_cpmfindindices_cdepthnext, tvb, offset, 4, cDepthNext);
6151 offset += 4;
6152 parse_uin32_array(tvb, offset, tree, cDepthNext, "prgiRowNext");
6154 return tvb_reported_length(tvb);
6157 static int dissect_CPMSetScopePrioritization(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
6159 int offset = 16;
6160 proto_item *item;
6161 proto_tree *tree;
6163 col_append_str(pinfo->cinfo, COL_INFO, "SetScopePrioritization");
6165 if (in) {
6166 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, -1, ENC_NA);
6167 tree = proto_item_add_subtree(item, ett_mswsp_msg);
6168 proto_item_set_text(item, "SetScopePrioritizationIn");
6169 proto_tree_add_item(tree, hf_mswsp_msg_cpmsetscopeprioritization_priority, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6170 offset += 4;
6171 proto_tree_add_item(tree, hf_mswsp_msg_cpmsetscopeprioritization_eventfreq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6173 return tvb_reported_length(tvb);
6176 static int dissect_CPMGetScopeStatistics(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, bool in, void *data _U_)
6179 int offset = 16;
6180 proto_item *item;
6181 proto_tree *tree;
6183 item = proto_tree_add_item(parent_tree, hf_mswsp_msg, tvb, offset, in ? 0 : -1, ENC_NA);
6184 tree = proto_item_add_subtree(item, ett_mswsp_msg);
6186 proto_item_set_text(item, "GetScopeStatistics%s", in ? "In" : "Out");
6187 col_append_str(pinfo->cinfo, COL_INFO, "GetScopeStatistics");
6189 if (in) {
6190 /* 2.2.3.33 */
6191 } else {
6192 /* 2.2.3.34 */
6193 proto_tree_add_item(tree, hf_mswsp_msg_cpmsetscopestatisics_dwindexitems, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6194 offset += 4;
6195 proto_tree_add_item(tree, hf_mswsp_msg_cpmsetscopestatisics_dwoutstandingadds, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6196 offset += 4;
6197 proto_tree_add_item(tree, hf_mswsp_msg_cpmsetscopestatisics_dwoutstandingmodifies, tvb, offset, 4, ENC_LITTLE_ENDIAN);
6200 return tvb_reported_length(tvb);
6204 static const value_string msg_ids[] = {
6205 {0x000000C8, "CPMConnect"}, /* In/Out */
6206 {0x000000C9, "CPMDisconnect"},
6207 {0x000000CA, "CPMCreateQuery"}, /* In/Out */
6208 {0x000000CB, "CPMFreeCursor"}, /* In/Out */
6209 {0x000000CC, "CPMGetRows"}, /* In/Out */
6210 {0x000000CD, "CPMRatioFinished"}, /* In/Out */
6211 {0x000000CE, "CPMCompareBmk"}, /* In/Out */
6212 {0x000000CF, "CPMGetApproximatePosition"}, /* In/Out */
6213 {0x000000D0, "CPMSetBindingsIn"},
6214 {0x000000D1, "CPMGetNotify"},
6215 {0x000000D2, "CPMSendNotifyOut"},
6216 {0x000000D7, "CPMGetQueryStatusIn"}, /* In/Out */
6217 {0x000000D9, "CPMCiStateInOut"},
6218 {0x000000E4, "CPMFetchValue"}, /* In/Out */
6219 {0x000000E7, "CPMGetQueryStatusEx"}, /* In/Out */
6220 {0x000000E8, "CPMRestartPositionIn"},
6221 {0x000000EC, "CPMSetCatStateIn"}, /* (not supported) */
6222 {0x000000F1, "CPMGetRowsetNotify"}, /* In/Out */
6223 {0x000000F2, "CPMFindIndices"}, /* In/Out */
6224 {0x000000F3, "CPMSetScopePrioritization"}, /* In/Out */
6225 {0x000000F4, "CPMGetScopeStatistics"}, /* In/Out */
6226 {0, NULL}
6230 static int
6231 dissect_mswsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, bool in, void *data)
6233 proto_tree *mswsp_tree = NULL;
6234 proto_tree *hdr_tree;
6235 proto_item *ti, *hti;
6236 uint32_t msg;
6237 uint32_t status;
6240 if (tvb_reported_length(tvb) < 16) {
6241 return 0;
6244 /* col_set_str(pinfo->cinfo, COL_PROTOCOL, "MS-WSP"); */
6245 col_append_str(pinfo->cinfo, COL_PROTOCOL, " WSP");
6246 /* col_clear(pinfo->cinfo, COL_INFO); */
6248 col_set_str(pinfo->cinfo, COL_INFO, "WSP ");
6249 col_append_str(pinfo->cinfo, COL_INFO, in ? "Request: " : "Response: ");
6251 ti = proto_tree_add_item(tree, proto_mswsp, tvb, 0, -1, ENC_NA);
6252 mswsp_tree = proto_item_add_subtree(ti, ett_mswsp);
6254 hti = proto_tree_add_item(mswsp_tree, hf_mswsp_hdr, tvb, 0, 16, ENC_NA);
6255 hdr_tree = proto_item_add_subtree(hti, ett_mswsp_hdr);
6257 proto_tree_add_item_ret_uint(hdr_tree, hf_mswsp_hdr_msg, tvb,
6258 0, 4, ENC_LITTLE_ENDIAN, &msg);
6259 proto_item_append_text(hti, " %s", val_to_str(msg, VALS(msg_ids),
6260 "(Unknown: 0x%x)"));
6262 proto_tree_add_item_ret_uint(hdr_tree, hf_mswsp_hdr_status, tvb,
6263 4, 4, ENC_LITTLE_ENDIAN, &status);
6264 if (!in || status != 0) {
6265 proto_item_append_text(hti, " %s",
6266 val_to_str(status, VALS(dcom_hresult_vals),
6267 "(Unknown: 0x%x)"));
6270 proto_tree_add_checksum(hdr_tree, tvb, 8, hf_mswsp_hdr_checksum, -1, NULL, pinfo, 0, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_NO_FLAGS);
6271 /* todo: validate checksum */
6273 proto_tree_add_item(hdr_tree, hf_mswsp_hdr_reserved, tvb,
6274 12, 4, ENC_LITTLE_ENDIAN);
6277 switch(msg) {
6278 case 0xC8:
6279 dissect_CPMConnect(tvb, pinfo, tree, in, data);
6280 break;
6281 case 0xC9:
6282 dissect_CPMDisconnect(tvb, pinfo, tree, in, data);
6283 break;
6284 case 0xCA:
6285 dissect_CPMCreateQuery(tvb, pinfo, tree, in, data);
6286 break;
6287 case 0xCB:
6288 dissect_CPMFreeCursor(tvb, pinfo, tree, in, data);
6289 break;
6290 case 0xCC:
6291 dissect_CPMGetRows(tvb, pinfo, tree, in, data);
6292 break;
6293 case 0xCD:
6294 dissect_CPMRatioFinished(tvb, pinfo, tree, in, data);
6295 break;
6296 case 0xCE:
6297 dissect_CPMCompareBmk(tvb, pinfo, tree, in, data);
6298 break;
6299 case 0xCF:
6300 dissect_CPMGetApproximatePosition(tvb, pinfo, tree, in, data);
6301 break;
6302 case 0xD0:
6303 dissect_CPMSetBindings(tvb, pinfo, tree, in, data);
6304 break;
6305 case 0xD1:
6306 dissect_CPMGetNotify(tvb, pinfo, tree, in, data);
6307 break;
6308 case 0xD2:
6309 dissect_CPMSendNotifyOut(tvb, pinfo, tree, in, data);
6310 break;
6311 case 0xD7:
6312 dissect_CPMGetQueryStatus(tvb, pinfo, tree, in, data);
6313 break;
6314 case 0xD9:
6315 dissect_CPMCiState(tvb, pinfo, tree, in, data);
6316 break;
6317 case 0xE4:
6318 dissect_CPMFetchValue(tvb, pinfo, tree, in, data);
6319 break;
6320 case 0xE7:
6321 dissect_CPMGetQueryStatusEx(tvb, pinfo, tree, in, data);
6322 break;
6323 case 0xE8:
6324 dissect_CPMRestartPosition(tvb, pinfo, tree, in, data);
6325 break;
6326 case 0xEC:
6327 dissect_CPMSetCatState(tvb, pinfo, tree, in, data);
6328 break;
6329 case 0xF1:
6330 dissect_CPMGetRowsetNotify(tvb, pinfo, tree, in, data);
6331 break;
6332 case 0xF2:
6333 dissect_CPMFindIndices(tvb, pinfo, tree, in, data);
6334 break;
6335 case 0xF3:
6336 dissect_CPMSetScopePrioritization(tvb, pinfo, tree, in, data);
6337 break;
6338 case 0xF4:
6339 dissect_CPMGetScopeStatistics(tvb, pinfo, tree, in, data);
6340 break;
6341 default:
6342 return 0;
6345 /* Return the amount of data this dissector was able to dissect */
6346 return tvb_reported_length(tvb);
6350 void
6351 proto_register_mswsp(void)
6353 expert_module_t* expert_mswsp = NULL;
6354 static hf_register_info hf[] = {
6356 &hf_mswsp_hdr,
6358 "Header", "mswsp.hdr",
6359 FT_NONE, BASE_NONE, NULL, 0,
6360 "Message header", HFILL
6364 &hf_mswsp_hdr_msg,
6366 "Msg id", "mswsp.hdr.id",
6367 FT_UINT32, BASE_HEX, VALS(msg_ids), 0,
6368 "Message id", HFILL
6372 &hf_mswsp_hdr_status,
6374 "Status", "mswsp.hdr.status",
6375 FT_UINT32, BASE_HEX, VALS(dcom_hresult_vals), 0,
6376 "Message Status", HFILL
6380 &hf_mswsp_hdr_checksum,
6382 "checksum", "mswsp.hdr.checksum",
6383 FT_UINT32, BASE_HEX, NULL, 0,
6384 "Message Checksum", HFILL
6388 &hf_mswsp_hdr_reserved,
6390 "Reserved", "mswsp.hdr.reserved",
6391 FT_UINT32, BASE_HEX, NULL, 0,
6392 "Reserved bytes", HFILL
6396 &hf_mswsp_msg,
6398 "msg", "mswsp.msg",
6399 FT_NONE, BASE_NONE, NULL, 0,
6400 "Message", HFILL
6404 &hf_mswsp_msg_Connect_Version,
6406 "Version", "mswsp.Connect.version",
6407 FT_UINT32, BASE_HEX, VALS(version_vals), 0,
6408 "OS Version", HFILL
6412 &hf_mswsp_msg_ConnectIn_ClientIsRemote,
6414 "Remote", "mswsp.ConnectIn.isRemote",
6415 FT_BOOLEAN, BASE_NONE, NULL, 0,
6416 "Client is remote",HFILL
6420 &hf_mswsp_msg_ConnectIn_Blob1,
6422 "Size", "mswsp.ConnectIn.propset.size",
6423 FT_UINT32, BASE_DEC, NULL, 0,
6424 "Size of PropSet fields",HFILL
6428 &hf_mswsp_msg_ConnectIn_MachineName,
6430 "Remote machine", "mswsp.ConnectIn.machine",
6431 FT_STRINGZ, BASE_NONE, NULL, 0,
6432 "Name of remote machine",HFILL
6436 &hf_mswsp_msg_ConnectIn_UserName,
6438 "User", "mswsp.ConnectIn.user",
6439 FT_STRINGZ, BASE_NONE, NULL, 0,
6440 "Name of remote user",HFILL
6444 &hf_mswsp_msg_ConnectIn_PropSets_num,
6446 "Num", "mswsp.ConnectIn.propset.num",
6447 FT_UINT32, BASE_DEC, NULL, 0,
6448 "Number of Property Sets", HFILL
6452 &hf_mswsp_bool_options,
6454 "uBooleanOptions", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions",
6455 FT_UINT32, BASE_HEX, NULL, 0, "Boolean options", HFILL
6459 &hf_mswsp_bool_options_cursor,
6461 "Cursor", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.cursor", FT_UINT32,
6462 BASE_HEX, VALS(cursor_vals), 0x00000007, "Cursor Type", HFILL
6466 &hf_mswsp_bool_options_async,
6468 "eAsynchronous", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eAsynchronous",
6469 FT_BOOLEAN, 32, NULL, eAsynchronous, "The client will not wait for execution completion", HFILL
6473 &hf_mswsp_bool_options_firstrows,
6475 "eFirstRows", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eFirstRows",
6476 FT_BOOLEAN, 32, NULL, eFirstRows, "Return the first rows encountered, not the best matches.", HFILL
6480 &hf_mswsp_bool_options_holdrows,
6482 "eHoldRows", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eHoldRows",
6483 FT_BOOLEAN, 32, NULL, eHoldRows, "The server MUST NOT discard rows until the client is done with a query.", HFILL
6487 &hf_mswsp_bool_options_chaptered,
6489 "eChaptered", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eChaptered",
6490 FT_BOOLEAN, 32, NULL, eChaptered, "The rowset supports chapters.", HFILL
6494 &hf_mswsp_bool_options_useci,
6496 "eUseCI", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eUseCI",
6497 FT_BOOLEAN, 32, NULL, eUseCI, "Use the inverted index to evaluate content restrictions even if it is out of date.", HFILL
6501 &hf_mswsp_bool_options_defertrim,
6503 "eDeferTrimming", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eDeferTrimming",
6504 FT_BOOLEAN, 32, NULL, eDeferTrimming, "Defer Non-indexed trimming operations like scoping or security checking which can be expensive.", HFILL
6508 &hf_mswsp_bool_options_rowsetevents,
6510 "eEnableRowsetEvents", "mswsp.RowSetProperties.CPMCreateQuery.uBooleanOptions.eEnableRowsetEvents",
6511 FT_BOOLEAN, 32, NULL, eEnableRowsetEvents, "Enables storage of rowset events on the server side.", HFILL
6515 &hf_mswsp_bool_options_dontcomputeexpensive,
6517 "eDoNotComputeExpensiveProps", "mswsp.CPMCreateQuery.RowSetProperties.uBooleanOptions.eDoNotComputeExpensiveProps",
6518 FT_BOOLEAN, 32, NULL, eDoNotComputeExpensiveProps, "Prevents computation of expensive properties.", HFILL
6522 &hf_mswsp_guid_time_low,
6524 "time-low", "mswsp.guid.time_low",
6525 FT_UINT32, BASE_HEX, NULL, 0, "time low value", HFILL
6529 &hf_mswsp_guid_time_mid,
6531 "time-mid", "mswsp.guid.time_mid",
6532 FT_UINT16, BASE_HEX, NULL, 0, "time mid value", HFILL
6536 &hf_mswsp_guid_time_high,
6538 "time-high", "mswsp.guid.time_high",
6539 FT_UINT16, BASE_HEX, NULL, 0, "time high value", HFILL
6543 &hf_mswsp_guid_time_clock_hi,
6545 "clock_seq_hi_and_reserved", "mswsp.guid.time_clock_high",
6546 FT_UINT8, BASE_HEX, NULL, 0, "time clock high value", HFILL
6550 &hf_mswsp_guid_time_clock_low,
6552 "clock_seq_low", "mswsp.guid.time_clock_low",
6553 FT_UINT8, BASE_HEX, NULL, 0, "time clock high low", HFILL
6557 &hf_mswsp_guid_node,
6559 "node", "mswsp.guid.node",
6560 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6564 &hf_mswsp_lcid,
6566 "lcid", "mswsp.lcid",
6567 FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6571 &hf_mswsp_lcid_sortid,
6573 "Sort ID", "mswsp.lcid.sortid",
6574 FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
6578 &hf_mswsp_lcid_langid,
6580 "Language ID", "mswsp.lcid.langid",
6581 FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
6585 &hf_mswsp_cscort_column,
6587 "column", "mswsp.csort.column",
6588 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6592 &hf_mswsp_cscort_order,
6594 "order", "mswsp.csort.order",
6595 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6599 &hf_mswsp_cscort_individual,
6601 "individual", "mswsp.csort.individual",
6602 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6606 &hf_mswsp_cscortset_count,
6608 "count", "mswsp.csortset.count",
6609 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6613 &hf_mswsp_ctablecolumn_vtype,
6615 "vType", "mswsp.ctablecolumn.vtype",
6616 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6620 &hf_mswsp_ctablecolumn_aggused,
6622 "AggregateUsed", "mswsp.ctablecolumn.aggused",
6623 FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
6627 &hf_mswsp_ctablecolumn_aggtype,
6629 "AggregateType", "mswsp.ctablecolumn.aggtype",
6630 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6634 &hf_mswsp_ctablecolumn_valused,
6636 "ValueUsed", "mswsp.ctablecolumn.valused",
6637 FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
6641 &hf_mswsp_ctablecolumn_valoffset,
6643 "ValueOffset", "mswsp.ctablecolumn.valoffset",
6644 FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
6648 &hf_mswsp_ctablecolumn_valsize,
6650 "ValueSize", "mswsp.ctablecolumn.valsize",
6651 FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
6655 &hf_mswsp_ctablecolumn_statused,
6657 "StatusUsed", "mswsp.ctablecolumn.statused",
6658 FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
6662 &hf_mswsp_ctablecolumn_statoffset,
6664 "StatusOffset", "mswsp.ctablecolumn.statoffset",
6665 FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
6669 &hf_mswsp_ctablecolumn_lenused,
6671 "LengthUsed", "mswsp.ctablecolumn.lenused",
6672 FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
6676 &hf_mswsp_ctablecolumn_lenoffset,
6678 "LengthOffset", "mswsp.ctablecolumn.lenoffset",
6679 FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
6683 &hf_mswsp_cfullpropspec_kind,
6685 "ulKind", "mswsp.cfullpropspec.kind",
6686 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6690 &hf_mswsp_cfullpropspec_propid,
6692 "propid", "mswsp.cfullpropspec.propid",
6693 FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6697 &hf_mswsp_cfullpropspec_propname,
6699 "propname", "mswsp.cfullpropspec.propname",
6700 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6704 &hf_mswsp_cproprestrict_relop,
6706 "relop", "mswsp.cproprestrict.relop",
6707 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6711 &hf_mswsp_ccoercerestrict_value,
6713 "value", "mswsp.ccoercerestrict.value",
6714 FT_FLOAT, BASE_NONE, NULL, 0, NULL, HFILL
6718 &hf_mswsp_ccontentrestrict_cc,
6720 "cc", "mswsp.ccontentrestrict.cc",
6721 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6725 &hf_mswsp_ccontentrestrict_phrase,
6727 "phrase", "mswsp.ccontentrestrict.phrase",
6728 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6732 &hf_mswsp_ccontentrestrict_method,
6734 "method", "mswsp.ccontentrestrict.method",
6735 FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6739 &hf_mswsp_natlangrestrict_cc,
6741 "cc", "mswsp.ccontentrestrict.cc",
6742 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6746 &hf_mswsp_natlangrestrict_phrase,
6748 "phrase", "mswsp.ccontentrestrict.phrase",
6749 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6753 &hf_mswsp_crestrict_ultype,
6755 "ulType", "mswsp.crestrict.ultype",
6756 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6760 &hf_mswsp_crestrict_weight,
6762 "Weight", "mswsp.crestrict.weight",
6763 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6767 &hf_mswsp_crestrictarray_count,
6769 "count", "mswsp.crestrictarray.count",
6770 FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
6774 &hf_mswsp_crestrictarray_present,
6776 "present", "mswsp.crestrictarray.present",
6777 FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
6781 &hf_mswsp_cnoderestrict_cnode,
6783 "Weight", "mswsp.cnoderestrict.cnode",
6784 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6788 &hf_mswsp_cbasestorvariant_vtype,
6790 "vType", "mswsp.cbasestorvariant.vtype",
6791 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6795 &hf_mswsp_cbasestorvariant_vvalue,
6797 "vValue", "mswsp.cbasestorvariant.vvalue",
6798 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6802 &hf_mswsp_cbasestorvariant_vdata1,
6804 "vData1", "mswsp.cbasestorvariant.vdata1",
6805 FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
6809 &hf_mswsp_cbasestorvariant_vdata2,
6811 "vData2", "mswsp.cbasestorvariant.vdata2",
6812 FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
6816 &hf_mswsp_cbasestorvariant_num,
6818 "num", "mswsp.cbasestorvariant.num",
6819 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6823 &hf_mswsp_cbasestorvariant_cdims,
6825 "cDims", "mswsp.cbasestorvariant.cdims",
6826 FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL
6830 &hf_mswsp_cbasestorvariant_ffeatures,
6832 "fFeatures", "mswsp.cbasestorvariant.ffeatures",
6833 FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL
6837 &hf_mswsp_cbasestorvariant_cbelements,
6839 "cbElements", "mswsp.cbasestorvariant.cbelements",
6840 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6844 &hf_mswsp_cbasestorvariant_rgsabound,
6846 "Rgsabound", "mswsp.cbasestorvariant.rgsabound",
6847 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6851 &hf_mswsp_cdbcolid_ekind,
6853 "eKind", "mswsp.cdbcolid.ekind",
6854 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6858 &hf_mswsp_cdbcolid_ulid,
6860 "ulId", "mswsp.cdbcolid.ulid",
6861 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6865 &hf_mswsp_cdbcolid_vstring,
6867 "vString", "mswsp.cdbcolid.vstring",
6868 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6872 &hf_mswsp_cdbprop_id,
6874 "Id", "mswsp.cdbprop.id",
6875 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6879 &hf_mswsp_cdbprop_options,
6881 "Options", "mswsp.cdbprop.options",
6882 FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6886 &hf_mswsp_cdbprop_status,
6888 "Status", "mswsp.cdbprop.status",
6889 FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6893 &hf_mswsp_cdbpropset_cprops,
6895 "cProperties", "mswsp.cdbpropset.cprops",
6896 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6900 &hf_mswsp_rangeboundry_ultype,
6902 "ulType", "mswsp.rangeboundry.ultype",
6903 FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6907 &hf_mswsp_rangeboundry_labelpresent,
6909 "labelPresent", "mswsp.rangeboundry.labelpresent",
6910 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL
6914 &hf_mswsp_rangeboundry_cclabel,
6916 "ccLabel", "mswsp.rangeboundry.cclabel",
6917 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6921 &hf_mswsp_rangeboundry_label,
6923 "Label", "mswsp.rangeboundry.label",
6924 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6928 &hf_mswsp_crangecategspec_crange,
6930 "cRange", "mswsp.crangecategspec.crange",
6931 FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
6935 &hf_mswsp_ccategspec_type,
6937 "type", "mswsp.ccategspec.type",
6938 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6942 &hf_mswsp_caggregspec_type,
6944 "type", "mswsp.caggregspec.type",
6945 FT_UINT8, BASE_DEC, VALS(DBAGGTTYPE), 0, NULL, HFILL
6949 &hf_mswsp_caggregspec_ccalias,
6951 "ccAlias", "mswsp.caggregspec.ccalias",
6952 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6956 &hf_mswsp_caggregspec_alias,
6958 "Alias", "mswsp.caggregspec.alias",
6959 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
6963 &hf_mswsp_caggregspec_idcolumn,
6965 "idColumn", "mswsp.caggregspec.idcolumn",
6966 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6970 &hf_mswsp_caggregspec_ulmaxnumtoreturn,
6972 "ulMaxNumToReturn",
6973 "mswsp.caggregspec.ulmaxnumtoreturn",
6974 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6978 &hf_mswsp_caggregspec_idrepresentative,
6980 "idRepresentative",
6981 "mswsp.caggregspec.idrepresentative",
6982 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6986 &hf_mswsp_caggregset_count,
6988 "count", "mswsp.caggregset.count",
6989 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
6993 &hf_mswsp_caggregsortkey_order,
6995 "order", "mswsp.caggregsortkey.order",
6996 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7000 &hf_mswsp_csortaggregset_count,
7002 "count", "mswsp.csortaggregset.count",
7003 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7007 &hf_mswsp_cingroupsortaggregset_type,
7009 "Type", "mswsp.cingroupsortaggregset.type",
7010 FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
7014 &hf_mswsp_cingroupsortaggregsets_count,
7016 "count", "mswsp.cingroupsortaggregsets.count",
7017 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7021 &hf_mswsp_categorizationspec_cmaxres,
7023 "cMaxResults", "mswsp.categorizationspec.cmaxres",
7024 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7028 &hf_mswsp_crowsetprops_ulmaxopenrows,
7030 "ulMaxOpenRows (ignored)", "mswsp.crowsetprops.ulmaxopenrows",
7031 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7035 &hf_mswsp_crowsetprops_ulmemusage,
7037 "ulMemUsage (ignored)", "mswsp.crowsetprops.ulmemusage",
7038 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7042 &hf_mswsp_crowsetprops_cmaxresults,
7044 "cMaxResults", "mswsp.crowsetprops.cmaxresults",
7045 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7049 &hf_mswsp_crowsetprops_ccmdtimeout,
7051 "cCmdTimeout", "mswsp.crowsetprops.ccmdtimeout",
7052 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7056 &hf_mswsp_cpidmapper_count,
7058 "count", "mswsp.cpidmapper.count",
7059 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7063 &hf_mswsp_ccolumngroup_count,
7065 "count", "mswsp.ccolumngroup.count",
7066 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7070 &hf_mswsp_ccolumngroup_grouppid,
7072 "groupPid", "mswsp.ccolumngroup.grouppid",
7073 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7077 &hf_mswsp_ccolumngroup_pid,
7079 "pid", "mswsp.ccolumngroup.pid",
7080 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7084 &hf_mswsp_ccolumngrouparray_count,
7086 "count", "mswsp.ccolumngrouparray.count",
7087 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7091 &hf_mswsp_int32array_value,
7093 "value", "mswsp.int32array.value",
7094 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7098 &hf_mswsp_crowseeknext_cskip,
7100 "cskip", "mswsp.crowseeknext.cskip",
7101 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7105 &hf_mswsp_crowseekat_bmkoffset,
7107 "bmkoffset", "mswsp.crowseekat.bmkoffset",
7108 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7112 &hf_mswsp_crowseekat_skip,
7114 "skip", "mswsp.crowseekat.skip",
7115 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7119 &hf_mswsp_crowseekat_hregion,
7121 "hregion", "mswsp.crowseekat.hregion",
7122 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7126 &hf_mswsp_crowseekatratio_ulnumerator,
7128 "ulnumerator", "mswsp.crowseekatratio.ulnumerator",
7129 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7133 &hf_mswsp_crowseekatratio_uldenominator,
7135 "uldenominator", "mswsp.crowseekatratio.uldenominator",
7136 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7140 &hf_mswsp_crowseekatratio_hregion,
7142 "hregion", "mswsp.crowseekatratio.hregion",
7143 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7147 &hf_mswsp_crowseekbybookmark_cbookmarks,
7149 "cbookmarks", "mswsp.crowseekbybookmark.cbookmarks",
7150 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7154 &hf_mswsp_crowseekbybookmark_maxret,
7156 "maxret", "mswsp.crowseekbybookmark.maxret",
7157 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7161 &hf_mswsp_crowvariantinfo_count64,
7163 "count", "mswsp.crowvariantinfo.count64",
7164 FT_UINT64, BASE_DEC, NULL, 0, NULL, HFILL
7168 &hf_mswsp_arrayvector_address64,
7170 "address of array", "mswsp.arrayvector.address64",
7171 FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL
7175 &hf_mswsp_crowvariantinfo_count32,
7177 "count", "mswsp.crowvariantinfo.count32",
7178 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7182 &hf_mswsp_arrayvector_address32,
7184 "address of array", "mswsp.arrayvector.address",
7185 FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
7189 &hf_mswsp_rowvariant_item_address64,
7191 "address", "mswsp.rowvariant.item.address64",
7192 FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL
7196 &hf_mswsp_rowvariant_item_address32,
7198 "address", "mswsp.rowvariant.item.address32",
7199 FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
7203 &hf_mswsp_rowvariant_item_value,
7205 "value", "mswsp.rowvariant.item.value",
7206 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
7210 &hf_mswsp_rowvariant_vtype,
7212 "vtype", "mswsp.rowvariant.vtype",
7213 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
7217 &hf_mswsp_rowvariant_reserved1,
7219 "reserved1", "mswsp.rowvariant.reserved1",
7220 FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
7224 &hf_mswsp_rowvariant_reserved2,
7226 "reserved2", "mswsp.rowvariant.reserved2",
7227 FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
7231 &hf_mswsp_ctablecolumn_status,
7233 "status", "mswsp.ctablecolumn.name",
7234 FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL
7238 &hf_mswsp_ctablecolumn_length,
7240 "length", "mswsp.ctablecolumn.length",
7241 FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
7245 &hf_mswsp_msg_cpmcreatequery_size,
7247 "size", "mswsp.cpmcreatequery.size",
7248 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7252 &hf_mswsp_msg_cpmcreatequery_ccolumnsetpresent,
7254 "CColumnSetPresent", "mswsp.cpmcreatequery.ccolumnsetpresent",
7255 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL
7259 &hf_mswsp_msg_cpmcreatequery_crestrictionpresent,
7261 "CRestrictionPresent", "mswsp.cpmcreatequery.crestrictionpresent",
7262 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL
7266 &hf_mswsp_msg_cpmcreatequery_csortpresent,
7268 "CSortPresent", "mswsp.cpmcreatequery.csortpresent",
7269 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL
7273 &hf_mswsp_msg_cpmcreatequery_ccategpresent,
7275 "CCategorizationSetPresent", "mswsp.cpmcreatequery.ccategpresent",
7276 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL
7280 &hf_mswsp_msg_cpmcreatequery_ccateg_count,
7282 "count", "mswsp.cpmcreatequery.ccateg.count",
7283 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7287 &hf_mswsp_msg_cpmcreatequery_trueseq,
7289 "TrueSequential", "mswsp.cpmcreatequery.trueseq",
7290 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7294 &hf_mswsp_msg_cpmcreatequery_workid,
7296 "WorkId", "mswsp.cpmcreatequery.workid",
7297 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7301 &hf_mswsp_msg_cpmcreatequery_cursors,
7303 "Cursors", "mswsp.cpmcreatequery.cursors",
7304 FT_BYTES, SEP_SPACE, NULL, 0, NULL, HFILL
7308 &hf_mswsp_msg_cpmgetrows_hcursor,
7310 "hCursor", "mswsp.msg.cpmgetrows.hcursor",
7311 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7315 &hf_mswsp_msg_cpmgetrows_rowstotransfer,
7317 "cRowsToTransfer", "mswsp.msg.cpmgetrows.rowstotransfer",
7318 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7322 &hf_mswsp_msg_cpmgetrows_rowwidth,
7324 "cbRowWidth", "mswsp.msg.cpmgetrows.rowswidth",
7325 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7329 &hf_mswsp_msg_cpmgetrows_cbseek,
7331 "cbSeek", "mswsp.msg.cpmgetrows.cbseek",
7332 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7336 &hf_mswsp_msg_cpmgetrows_cbreserved,
7338 "cbReserved", "mswsp.msg.cpmgetrows.cbreserved",
7339 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7343 &hf_mswsp_msg_cpmgetrows_cbreadbuffer,
7345 "cbReadBuffer", "mswsp.msg.cpmgetrows.cbreadbuffer",
7346 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7350 &hf_mswsp_msg_cpmgetrows_ulclientbase,
7352 "ulClientBase", "mswsp.msg.cpmgetrows.ulclientbase",
7353 FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
7357 &hf_mswsp_msg_cpmgetrows_fbwdfetch,
7359 "fBwdFetch", "mswsp.msg.cpmgetrows.fbwdfetch",
7360 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7364 &hf_mswsp_msg_cpmgetrows_etype,
7366 "eType", "mswsp.msg.cpmgetrows.etype",
7367 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7371 &hf_mswsp_msg_cpmgetrows_chapt,
7373 "chapt", "mswsp.msg.cpmgetrows.chapt",
7374 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7378 &hf_mswsp_msg_cpmgetrows_crowsreturned,
7380 "cRowsReturned", "mswsp.msg.cpmgetrows.crowsreturned",
7381 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7385 &hf_mswsp_msg_cpmratiofinished_hcursor,
7387 "hCursor", "mswsp.msg.cpmratiofinished_hcursor",
7388 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7392 &hf_mswsp_msg_cpmratiofinished_fquick,
7394 "fQuick", "mswsp.msg.cpmratiofinished_fquick",
7395 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7399 &hf_mswsp_msg_cpmratiofinished_ulnumerator,
7401 "ulNumerator", "mswsp.msg.cpmratiofinished_ulnumerator",
7402 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7406 &hf_mswsp_msg_cpmratiofinished_uldenominator,
7408 "ulDenominator", "mswsp.msg.cpmratiofinished_uldenominator",
7409 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7413 &hf_mswsp_msg_cpmratiofinished_crows,
7415 "cRows", "mswsp.msg.cpmratiofinished_crows",
7416 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7420 &hf_mswsp_msg_cpmratiofinished_fnewrows,
7422 "fNewRows", "mswsp.msg.cpmratiofinished_fnewrows",
7423 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7427 &hf_mswsp_msg_cpmcomparebmk_hcursor,
7429 "hCursor", "mswsp.msg.cpmcomparebmk.hcursor",
7430 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7434 &hf_mswsp_msg_cpmcomparebmk_chapt,
7436 "chapt", "mswsp.msg.cpmcomparebmk.chapt",
7437 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7441 &hf_mswsp_msg_cpmcomparebmk_bmkfirst,
7443 "bmkFirst", "mswsp.msg.cpmcomparebmk.bmkfirst",
7444 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7448 &hf_mswsp_msg_cpmcomparebmk_bmksecond,
7450 "bmkSecond", "mswsp.msg.cpmcomparebmk.bmksecond",
7451 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7455 &hf_mswsp_msg_cpmcomparebmk_dwcomparison,
7457 "dwComparison", "mswsp.msg.cpmcomparebmk.dwcomparison",
7458 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7462 &hf_mswsp_msg_cpmgetapproxpos_hcursor,
7464 "hCursor", "mswsp.msg.cpmgetapproxpos.hcursor",
7465 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7469 &hf_mswsp_msg_cpmgetapproxpos_chapt,
7471 "chapt", "mswsp.msg.cpmgetapproxpos.chapt",
7472 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7476 &hf_mswsp_msg_cpmgetapproxpos_bmk,
7478 "bmk", "mswsp.msg.cpmgetapproxpos.bmk",
7479 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7483 &hf_mswsp_msg_cpmgetapproxpos_numerator,
7485 "numerator", "mswsp.msg.cpmgetapproxpos.numerator",
7486 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7490 &hf_mswsp_msg_cpmgetapproxpos_denominator,
7492 "denominator", "mswsp.msg.cpmgetapproxpos.denominator",
7493 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7497 &hf_mswsp_msg_cpmsetbinding_hcursor,
7499 "hCursor", "mswsp.msg.cpmsetbinding.hcursor",
7500 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7504 &hf_mswsp_msg_cpmsetbinding_cbrow,
7506 "cBrow", "mswsp.msg.cpmsetbinding.cbrow",
7507 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7511 &hf_mswsp_msg_cpmsetbinding_desc,
7513 "cbBindingDesc", "mswsp.msg.cpmsetbinding.desc",
7514 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7518 &hf_mswsp_msg_cpmsetbinding_dummy,
7520 "dummy", "mswsp.msg.cpmsetbinding.dummy",
7521 FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL
7525 &hf_mswsp_msg_cpmsetbinding_ccolumns,
7527 "cColumns", "mswsp.msg.cpmsetbinding.ccolumns",
7528 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7532 &hf_mswsp_msg_cpmsetbinding_acolumns,
7534 "aColumns", "mswsp.msg.cpmsetbinding.acolumns",
7535 FT_BYTES, SEP_DOT, NULL, 0, NULL, HFILL
7539 &hf_mswsp_msg_cpmsendnotify_watchnotify,
7541 "watchNotify", "mswsp.msg.cpmsendnotify.watchnotify",
7542 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7546 &hf_mswsp_msg_cpmgetquerystatus_hcursor,
7548 "hCursor", "mswsp.msg.cpmquerystatus.hcursor",
7549 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7553 &hf_mswsp_msg_cpmgetquerystatus_qstatus,
7555 "QStatus", "mswsp.msg.cpmquerystatus.qstatus",
7556 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7560 &hf_mswsp_msg_cpmcistate_cbstruct,
7562 "cbStruct", "mswsp.msg.cpmcistate.cbstruct",
7563 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7567 &hf_mswsp_msg_cpmcistate_cwordlist,
7569 "cbWordList", "mswsp.msg.cpmcistate.cbwordlist",
7570 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7574 &hf_mswsp_msg_cpmcistate_cpersistindex,
7576 "cbPersistentIndex", "mswsp.msg.cpmcistate.cbpersistindex",
7577 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7581 &hf_mswsp_msg_cpmcistate_cqueries,
7583 "cQueries", "mswsp.msg.cpmcistate.cqueries",
7584 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7588 &hf_mswsp_msg_cpmcistate_cfreshtest,
7590 "cFreshTest", "mswsp.msg.cpmcistate.cfreshtest",
7591 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7595 &hf_mswsp_msg_cpmcistate_dwmergeprogress,
7597 "dwMergeProgress", "mswsp.msg.cpmcistate.dwmergeprogress",
7598 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7602 &hf_mswsp_msg_cpmcistate_estate,
7604 "eState", "mswsp.msg.cpmcistate.estate",
7605 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7609 &hf_mswsp_msg_cpmcistate_cfiltereddocs,
7611 "cFilteredDocuments", "mswsp.msg.cpmcistate.cfiltereddocs",
7612 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7616 &hf_mswsp_msg_cpmcistate_ctotaldocs,
7618 "cTotalDocuments", "mswsp.msg.cpmcistate.ctotaldocs",
7619 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7623 &hf_mswsp_msg_cpmcistate_cpendingscans,
7625 "cPendingScans", "mswsp.msg.cpmcistate.cpendingscans",
7626 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7630 &hf_mswsp_msg_cpmcistate_dwindexsize,
7632 "dwIndexSize", "mswsp.msg.cpmcistate.dwindexsize",
7633 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7637 &hf_mswsp_msg_cpmcistate_cuniquekeys,
7639 "cUniqueKeys", "mswsp.msg.cpmcistate.cuniquekeys",
7640 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7644 &hf_mswsp_msg_cpmcistate_csecqdocuments,
7646 "cSecQDocuments", "mswsp.msg.cpmcistate.csecqdocuments",
7647 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7651 &hf_mswsp_msg_cpmcistate_dwpropcachesize,
7653 "dwPropCacheSize", "mswsp.msg.cpmcistate.dwpropcachesize",
7654 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7658 &hf_mswsp_msg_cpmfetchvalue_wid,
7660 "wid", "mswsp.msg.cpmfetchvalue.wid",
7661 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7665 &hf_mswsp_msg_cpmfetchvalue_cbsofar,
7667 "cbSoFar", "mswsp.msg.cpmfetchvalue.cbsofar",
7668 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7672 &hf_mswsp_msg_cpmfetchvalue_cbpropspec,
7674 "cbPropSpec", "mswsp.msg.cpmfetchvalue.cbpropspec",
7675 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7679 &hf_mswsp_msg_cpmfetchvalue_cbchunk,
7681 "cbChunk", "mswsp.msg.cpmfetchvalue.chunk",
7682 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7686 &hf_mswsp_msg_cpmfetchvalue_cbvalue,
7688 "cbValue", "mswsp.msg.cpmfetchvalue.cbvalue",
7689 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7693 &hf_mswsp_msg_cpmfetchvalue_fmoreexists,
7695 "fMoreExists", "mswsp.msg.cpmfetchvalue.fmoreexists",
7696 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7700 &hf_mswsp_msg_cpmfetchvalue_fvalueexists,
7702 "fValueExists", "mswsp.msg.cpmfetchvalue.fvalueexists",
7703 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7707 &hf_mswsp_msg_cpmfetchvalue_vvalue,
7709 "vvalue", "mswsp.msg.cpmfetchvalue.vvalue",
7710 FT_BYTES, SEP_SPACE, NULL, 0, NULL, HFILL
7714 &hf_mswsp_msg_cpmquerystatusex_qstatus,
7716 "qStatus", "mswsp.msg.cpmquerystatusex.qstatus",
7717 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7721 &hf_mswsp_msg_cpmquerystatusex_hcursor,
7723 "hCursor", "mswsp.msg.cpmquerystatusex.hcursor",
7724 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7728 &hf_mswsp_msg_cpmquerystatusex_bmk,
7730 "bmk", "mswsp.msg.cpmquerystatusex.bmk",
7731 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7735 &hf_mswsp_msg_cpmquerystatusex_cfiltereddocs,
7737 "cFilteredDocuments", "mswsp.msg.cpmquerystatusex.cfiltereddocs",
7738 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7742 &hf_mswsp_msg_cpmquerystatusex_cdocstofilter,
7744 "cDocumentsToFilter", "mswsp.msg.cpmquerystatusex.cdocstofilter",
7745 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7749 &hf_mswsp_msg_cpmquerystatusex_dwratiodenom,
7751 "dwRatioFinishedDenominator", "mswsp.msg.cpmquerystatusex.dwratiodenom",
7752 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7756 &hf_mswsp_msg_cpmquerystatusex_dwrationumer,
7758 "dwRatioFinishedNumerator", "mswsp.msg.cpmquerystatusex.dwrationumer",
7759 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7763 &hf_mswsp_msg_cpmquerystatusex_irowbmk,
7765 "iRowBmk", "mswsp.msg.cpmquerystatusex.irowbmk",
7766 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7770 &hf_mswsp_msg_cpmquerystatusex_crowstotal,
7772 "cRowsTotal", "mswsp.msg.cpmquerystatusex.crowstotal",
7773 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7777 &hf_mswsp_msg_cpmquerystatusex_maxrank,
7779 "maxRank", "mswsp.msg.cpmquerystatusex.maxrank",
7780 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7784 &hf_mswsp_msg_cpmquerystatusex_cresultsfound,
7786 "cResultsFound", "mswsp.msg.cpmquerystatusex.cresultsfound",
7787 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7791 &hf_mswsp_msg_cpmquerystatusex_whereid,
7793 "whereId", "mswsp.msg.cpmquerystatusex.whereid",
7794 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7798 &hf_mswsp_msg_cpmrestartposition_hcursor,
7800 "hCursor", "mswsp.msg.cpmrestartposition.hcursor",
7801 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7805 &hf_mswsp_msg_cpmrestartposition_chapt,
7807 "chapt", "mswsp.msg.cpmrestartposition.chapt",
7808 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7812 &hf_mswsp_msg_cpmgetrowsetnotify_wid,
7814 "wid", "mswsp.msg.cpmgetrowsetnotify.wid",
7815 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7819 &hf_mswsp_msg_cpmgetrowsetnotify_moreevents,
7821 "moreEvents", "mswsp.msg.cpmgetrowsetnotify.moreevents",
7822 FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL
7826 &hf_mswsp_msg_cpmgetrowsetnotify_eventtype,
7828 "eventType", "mswsp.msg.cpmgetrowsetnotify.eventType",
7829 FT_UINT8, BASE_DEC, NULL, 0xFE, NULL, HFILL
7833 &hf_mswsp_msg_cpmgetrowsetnotify_rowsetitemstate,
7835 "rowSetItemState", "mswsp.msg.cpmgetrowsetnotify.rowsetitemstate",
7836 FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
7840 &hf_mswsp_msg_cpmgetrowsetnotify_changeditemstate,
7842 "changedItemState", "mswsp.msg.cpmgetrowsetnotify.changeditemState",
7843 FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
7847 &hf_mswsp_msg_cpmgetrowsetnotify_rowsetevent,
7849 "rowSetEvent", "mswsp.msg.cpmgetrowsetnotify.rowsetevent",
7850 FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
7854 &hf_mswsp_msg_cpmgetrowsetnotify_rowseteventdata1,
7856 "rowSetEventdata1", "mswsp.msg.cpmgetrowsetnotify.rowseteventdata1",
7857 FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL
7861 &hf_mswsp_msg_cpmgetrowsetnotify_rowseteventdata2,
7863 "rowSetEventdata2", "mswsp.msg.cpmgetrowsetnotify.rowseteventdata2",
7864 FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL
7868 &hf_mswsp_msg_cpmfindindices_cwids,
7870 "cWids", "mswsp.msg.cpmfindindices.cwids",
7871 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7875 &hf_mswsp_msg_cpmfindindices_cdepthprev,
7877 "cDepthPrev", "mswsp.msg.cpmfindindices.cdepthprev",
7878 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7882 &hf_mswsp_msg_cpmfindindices_cdepthnext,
7884 "cDepthNext", "mswsp.msg.cpmfindindices.cdepthnext",
7885 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7889 &hf_mswsp_msg_cpmsetscopeprioritization_priority,
7891 "priority", "mswsp.msg.cpmsetscopeprioritization.priority",
7892 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7896 &hf_mswsp_msg_cpmsetscopeprioritization_eventfreq,
7898 "eventFrequency", "mswsp.msg.cpmsetscopeprioritization.eventfreq",
7899 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7903 &hf_mswsp_msg_cpmsetscopestatisics_dwindexitems,
7905 "dwIndexedItems", "mswsp.msg.cpmsetscopestatistics.dwindexitems",
7906 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7910 &hf_mswsp_msg_cpmsetscopestatisics_dwoutstandingadds,
7912 "dwOutstandingAdds", "mswsp.msg.cpmsetscopestatistics.dwoutstandingadds",
7913 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7917 &hf_mswsp_msg_cpmsetscopestatisics_dwoutstandingmodifies,
7919 "dwOutstandingModifies", "mswsp.msg.cpmsetscopestatistics.dwoutstandingmodifies",
7920 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL
7925 static int *ett[] = {
7926 &ett_mswsp,
7927 &ett_mswsp_hdr,
7928 &ett_mswsp_msg,
7929 &ett_mswsp_pad,
7930 &ett_mswsp_property_restriction,
7931 &ett_CRestrictionArray,
7932 &ett_CBaseStorageVariant,
7933 &ett_CBaseStorageVariant_Vector,
7934 &ett_CBaseStorageVariant_Array,
7935 &ett_CDbColId,
7936 &ett_GUID,
7937 &ett_CDbProp,
7938 &ett_CDbPropSet,
7939 &ett_CDbPropSet_Array,
7940 &ett_CRestriction,
7941 &ett_CNodeRestriction,
7942 &ett_CPropertyRestriction,
7943 &ett_CCoercionRestriction,
7944 &ett_CContentRestriction,
7945 &ett_RANGEBOUNDARY,
7946 &ett_CRangeCategSpec,
7947 &ett_CCategSpec,
7948 &ett_CAggregSpec,
7949 &ett_CAggregSet,
7950 &ett_CCategorizationSpec,
7951 &ett_CAggregSortKey,
7952 &ett_CSortAggregSet,
7953 &ett_CInGroupSortAggregSet,
7954 &ett_CInGroupSortAggregSets,
7955 &ett_CRowsetProperties,
7956 &ett_CFullPropSpec,
7957 &ett_CPidMapper,
7958 &ett_CSort,
7959 &ett_CSortSet,
7960 &ett_CNatLanguageRestriction,
7961 &ett_CColumnGroup,
7962 &ett_CColumnGroupArray,
7963 &ett_LCID,
7964 &ett_CTableColumn,
7965 &ett_Array,
7966 &ett_SeekDescription,
7967 &ett_CRowsSeekNext,
7968 &ett_CRowsSeekAt,
7969 &ett_CRowsSeekAtRatio,
7970 &ett_CRowsSeekByBookmark,
7971 &ett_GetRowsRow,
7972 &ett_GetRowsColumn,
7973 &ett_CRowVariant,
7974 &ett_CRowVariant_Vector,
7975 &ett_mswsp_bool_options,
7976 &ett_mswsp_uin32_array,
7977 &ett_mswsp_msg_padding,
7978 &ett_mswsp_msg_creusewhere
7981 static ei_register_info ei[] = {
7982 { &ei_mswsp_invalid_variant_type, { "mswsp.invalid_variant_type", PI_PROTOCOL, PI_ERROR, "Invalid variant type", EXPFILL }},
7983 { &ei_missing_msg_context, { "mswsp.msg.cpmgetrows.missing_msg_context", PI_SEQUENCE, PI_WARN, "previous messages needed for context not captured", EXPFILL }},
7984 { &ei_mswsp_msg_cpmsetbinding_ccolumns, { "mswsp.msg.cpmsetbinding.ccolumns.invalid", PI_PROTOCOL, PI_WARN, "Invalid number of cColumns for packet", EXPFILL }}
7986 int i;
7988 proto_mswsp = proto_register_protocol("Windows Search Protocol", "MS-WSP", "mswsp");
7990 proto_register_field_array(proto_mswsp, hf, array_length(hf));
7991 proto_register_subtree_array(ett, array_length(ett));
7992 expert_mswsp = expert_register_protocol(proto_mswsp);
7993 expert_register_field_array(expert_mswsp, ei, array_length(ei));
7994 for (i=0; i<(int)array_length(GuidPropertySet); i++) {
7995 guids_add_guid(&GuidPropertySet[i].guid, GuidPropertySet[i].def);
7999 static int dissect_mswsp_smb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
8001 smb_info_t *si = (smb_info_t*)data;
8002 bool in = si->request;
8004 smb_fid_info_t *fid_info = NULL;
8005 fid_info = find_fid_info(si);
8007 if (!fid_info || !fid_info->fsi || !fid_info->fsi->filename) {
8008 return 0;
8012 if (g_ascii_strcasecmp(fid_info->fsi->filename, "\\MsFteWds") != 0) {
8013 return 0;
8015 p_add_proto_data(wmem_file_scope(), pinfo, proto_mswsp, 0, (void*)&SMB1);
8016 return dissect_mswsp(tvb, pinfo, tree, in, data);
8019 static bool
8020 dissect_mswsp_smb_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
8022 return dissect_mswsp_smb(tvb, pinfo, tree, data) > 0;
8025 static int dissect_mswsp_smb2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
8027 smb2_info_t *si = (smb2_info_t*)data;
8028 bool in;
8029 char* fid_name = NULL;
8030 uint32_t open_frame = 0, close_frame = 0;
8032 if (!si) {
8033 return 0;
8036 if (si->saved) {
8037 dcerpc_fetch_polhnd_data(&si->saved->policy_hnd, &fid_name, NULL, &open_frame, &close_frame, pinfo->num);
8040 if (!fid_name || g_ascii_strcasecmp(fid_name, "File: MsFteWds") != 0) {
8041 return 0;
8044 in = !(si->flags & SMB2_FLAGS_RESPONSE);
8045 p_add_proto_data(wmem_file_scope(), pinfo, proto_mswsp, 0, (void*)&SMB2);
8046 return dissect_mswsp(tvb, pinfo, tree, in, data);
8049 static bool
8050 dissect_mswsp_smb2_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
8052 return dissect_mswsp_smb2(tvb, pinfo, tree, data) > 0;
8055 void
8056 proto_reg_handoff_mswsp(void)
8058 heur_dissector_add("smb_transact", dissect_mswsp_smb_heur, "WSP over SMB1", "smb1_wsp", proto_mswsp, HEURISTIC_ENABLE);
8059 heur_dissector_add("smb2_pipe_subdissectors", dissect_mswsp_smb2_heur, "WSP over SMB2", "smb2_wsp", proto_mswsp, HEURISTIC_ENABLE);
8064 * Editor modelines - https://www.wireshark.org/tools/modelines.html
8066 * Local variables:
8067 * c-basic-offset: 4
8068 * tab-width: 8
8069 * indent-tabs-mode: t
8070 * End:
8072 * vi: set shiftwidth=4 tabstop=8 noexpandtab:
8073 * :indentSize=4:tabSize=8:noTabs=false: