summaryrefslogtreecommitdiffstats
path: root/librpc/wsp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:20:00 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:20:00 +0000
commit8daa83a594a2e98f39d764422bfbdbc62c9efd44 (patch)
tree4099e8021376c7d8c05bdf8503093d80e9c7bad0 /librpc/wsp
parentInitial commit. (diff)
downloadsamba-8daa83a594a2e98f39d764422bfbdbc62c9efd44.tar.xz
samba-8daa83a594a2e98f39d764422bfbdbc62c9efd44.zip
Adding upstream version 2:4.20.0+dfsg.upstream/2%4.20.0+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'librpc/wsp')
-rw-r--r--librpc/wsp/README50
-rw-r--r--librpc/wsp/allprops-from-ms-wsp-spec.csv423
-rw-r--r--librpc/wsp/extra-props.csv63
-rw-r--r--librpc/wsp/wsp_helper.c40
-rw-r--r--librpc/wsp/wsp_helper.h28
-rw-r--r--librpc/wsp/wsp_util.c919
-rw-r--r--librpc/wsp/wsp_util.h89
7 files changed, 1612 insertions, 0 deletions
diff --git a/librpc/wsp/README b/librpc/wsp/README
new file mode 100644
index 0000000..45a544e
--- /dev/null
+++ b/librpc/wsp/README
@@ -0,0 +1,50 @@
+WSP properties are described in a number of sections in the MS-WSP protocol
+document. The document says that all properties are categorised as follows
+
+"GUID and PropId: Together, these parameters establish the unique identifier
+ for documents.
+isColumn: A boolean value set to TRUE if, and only if, the property can be
+ returned as a requested property as specified in the
+ ProjectionColumnsOffsets argument to a RunNewQuery Generic Search
+ Service (GSS) abstract interface call.
+inInvertedIndex: A boolean value set to TRUE if, and only if, the property can
+ be an argument to CContentRestriction within the
+ RestrictionSet argument to a RunNewQuery GSS abstract
+ interface call.
+columnIndexType: This parameter defines whether sorting, grouping, and
+ filtering are allowed for this property, as defined in the
+ SortOrders, Groupings, and Restrictions parameters of the
+ RunNewQuery GSS abstract interface call.
+ The columnIndexType parameter is a string set to one of the
+ following"
+
+additionally the property type 'VT_XXXX' and max size are known
+
+However, not all properties described match this, only properties mentioned in
+the "full property table" are fully described, others mentioned e.g. in
+"Standard" & "Open" property sections (and associated tables) have just the
+GUID, propid & property data type described, still other properties are only
+mentioned in the Example section and one needs to manually extract the info.
+
+We need the property descriptions and some scripting helps here, in this
+directory there is
+
+librpc/wsp/allprops-from-ms-wsp-spec.csv:
+ a csv file made from the "full property table" exported from the html
+ oneline version online version of MS-WSP open specification document.
+extra-props.csv:
+ a csv file of the same format containing the other properties mentioned
+ above and additionally a few more from the wireshark repo)
+
+and in directory source4/scripting/bin
+
+gen_wsp_props.py:
+ a simple python script to generate code from the csv files above,
+
+extra-props.csv was generated by basically grabbing the property definititions
+from the wireshark repo
+ https://github.com/wireshark/wireshark.git(epan/dissectors/packet-mswsp.c
+and comparing against the properties we already have
+
+The build generates code from the csv file mentioned above which is built into
+the NDR_WSP subsystem.
diff --git a/librpc/wsp/allprops-from-ms-wsp-spec.csv b/librpc/wsp/allprops-from-ms-wsp-spec.csv
new file mode 100644
index 0000000..b822304
--- /dev/null
+++ b/librpc/wsp/allprops-from-ms-wsp-spec.csv
@@ -0,0 +1,423 @@
+#Intellectual Property Rights Notice for Open Specifications Documentation
+#Technical Documentation. Microsoft publishes Open Specifications documentation (“this
+#documentation”) for protocols, file formats, data portability, computer languages, and standards
+#support. Additionally, overview documents cover inter-protocol relationships and interactions.
+#Copyrights. This documentation is covered by Microsoft copyrights. Regardless of any other
+#terms that are contained in the terms of use for the Microsoft website that hosts this
+#documentation, you can make copies of it in order to develop implementations of the technologies
+#that are described in this documentation and can distribute portions of it in your implementations
+#that use these technologies or in your documentation as necessary to properly document the
+#implementation. You can also distribute in your implementation, with or without modification, any
+#schemas, IDLs, or code samples that are included in the documentation. This permission also
+#applies to any documents that are referenced in the Open Specifications documentation.
+#No Trade Secrets. Microsoft does not claim any trade secret rights in this documentation.
+#Patents. Microsoft has patents that might cover your implementations of the technologies
+#described in the Open Specifications documentation. Neither this notice nor Microsoft's delivery of
+#this documentation grants any licenses under those patents or any other Microsoft patents.
+#However, a given Open Specifications document might be covered by the Microsoft Open
+#Specifications Promise or the Microsoft Community Promise. If you would prefer a written license,
+#or if the technologies described in this documentation are not covered by the Open Specifications
+#Promise or Community Promise, as applicable, patent licenses are available by contacting
+#iplg@microsoft.com.
+#License Programs. To see all of the protocols in scope under a specific license program and the
+#associated patents, visit the Patent Map.
+#Trademarks. The names of companies and products contained in this documentation might be
+#covered by trademarks or similar intellectual property rights. This notice does not grant any
+#licenses under those rights. For a list of Microsoft trademarks, visit
+#www.microsoft.com/trademarks.
+#Fictitious Names. The example companies, organizations, products, domain names, email
+#addresses, logos, people, places, and events that are depicted in this documentation are fictitious.
+#No association with any real company, organization, product, domain name, email address, logo,
+#person, place, or event is intended or should be inferred.
+#Reservation of Rights. All other rights are reserved, and this notice does not grant any rights other
+#than as specifically described above, whether by implication, estoppel, or otherwise.
+#Tools. The Open Specifications documentation does not require the use of Microsoft programming
+#tools or programming environments in order for you to develop an implementation. If you have access
+#to Microsoft programming tools and environments, you are free to take advantage of them. Certain
+#Open Specifications documents are intended for use in conjunction with publicly available standards
+#specifications and network programming art and, as such, assume that the reader either is familiar
+#with the aforementioned material or has immediate access to it.
+#Support. For questions and support, please contact dochelp@microsoft.com.
+#
+# content below has been extracted from the open specification MS-WSP
+#
+#Property Name,GUID,propID,inInvertedIndex,isColumn,columnIndexType,type,MaxSize,Vector Property,Description
+#
+System.AcquisitionID,{65A98875-3C80-40AB-ABBC-EFDAF77DBEE2},100,FALSE,TRUE, ,Int32,4, ,Hash to determine acquisition session.
+System.ApplicationName,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},18,TRUE,TRUE, ,String,512, , 
+System.Audio.ChannelCount,{64440490-4C8B-11D1-8B70-080036B11A03},7,FALSE,TRUE, ,UInt32,4, ,"Indicates the channel count for the audio file. Values: 1 (mono), 2 (stereo)."
+System.Audio.EncodingBitrate,{64440490-4C8B-11D1-8B70-080036B11A03},4,FALSE,TRUE, ,UInt32,4, ,"Indicates the average data rate in Hz for the audio file in ""bits per second""."
+System.Audio.PeakValue,{2579E5D0-1116-4084-BD9A-9B4F7CB4DF5E},100,FALSE,TRUE, ,UInt32,4, , 
+System.Audio.SampleRate,{64440490-4C8B-11D1-8B70-080036B11A03},5,FALSE,TRUE, ,UInt32,4, ,"Indicates the audio sample rate for the audio file in ""samples per second""."
+System.Audio.SampleSize,{64440490-4C8B-11D1-8B70-080036B11A03},6,FALSE,TRUE, ,UInt32,4, ,"Indicates the audio sample size for the audio file in ""bits per sample""."
+System.Author,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},4,TRUE,TRUE, ,String,256,TRUE, 
+System.Calendar.Duration,{293CA35A-09AA-4DD2-B180-1FE245728A52},100,TRUE,TRUE, ,String,512, ,The duration as specified in a string.
+System.Calendar.IsOnline,{BFEE9149-E3E2-49A7-A862-C05988145CEC},100,FALSE,TRUE, ,Boolean,2, ,Indicates whether the event is an online event.
+System.Calendar.IsRecurring,{315B9C8D-80A9-4EF9-AE16-8E746DA51D70},100,FALSE,TRUE, ,Boolean,2, , 
+System.Calendar.Location,{F6272D18-CECC-40B1-B26A-3911717AA7BD},100,TRUE,TRUE, ,String,512, , 
+System.Calendar.OptionalAttendeeAddresses,{D55BAE5A-3892-417A-A649-C6AC5AAAEAB3},100,TRUE,TRUE, ,String,256,TRUE, 
+System.Calendar.OptionalAttendeeNames,{09429607-582D-437F-84C3-DE93A2B24C3C},100,TRUE,TRUE, ,String,256,TRUE, 
+System.Calendar.OrganizerAddress,{744C8242-4DF5-456C-AB9E-014EFB9021E3},100,TRUE,TRUE, ,String,256, ,Address of the organizer organizing the event.
+System.Calendar.OrganizerName,{AAA660F9-9865-458E-B484-01BC7FE3973E},100,TRUE,TRUE, ,String,256, ,Name of the organizer organizing the event.
+System.Calendar.ReminderTime,{72FC5BA4-24F9-4011-9F3F-ADD27AFAD818},100,FALSE,TRUE, ,DateTime,8, , 
+System.Calendar.RequiredAttendeeAddresses,{0BA7D6C3-568D-4159-AB91-781A91FB71E5},100,TRUE,TRUE, ,String,256,TRUE, 
+System.Calendar.RequiredAttendeeNames,{B33AF30B-F552-4584-936C-CB93E5CDA29F},100,TRUE,TRUE, ,String,256,TRUE, 
+System.Calendar.Resources,{00F58A38-C54B-4C40-8696-97235980EAE1},100,TRUE,TRUE, ,String,512,TRUE, 
+System.Calendar.ResponseStatus,{188C1F91-3C40-4132-9EC5-D8B03B72A8A2},100,FALSE,TRUE, ,UInt16,2, ,This property stores the status of the user responses to meetings in the user's calendar.
+System.Calendar.ShowTimeAs,{5BF396D4-5EB2-466F-BDE9-2FB3F2361D6E},100,FALSE,TRUE, ,UInt16,2, , 
+System.Calendar.ShowTimeAsText,{53DA57CF-62C0-45C4-81DE-7610BCEFD7F5},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Calendar.ShowTimeAs. Not intended to be parsed programmatically.
+System.Category,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},2,TRUE,TRUE, ,String,512,TRUE, 
+System.Comment,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},6,TRUE,TRUE, ,String,2048, ,Comments.
+System.Communication.AccountName,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},9,TRUE,TRUE, ,String,512, ,Account Name
+System.Communication.DateItemExpires,{428040AC-A177-4C8A-9760-F6F761227F9A},100,FALSE,TRUE, ,DateTime,8, ,Date the item expires due to the retention policy.
+System.Communication.FollowupIconIndex,{83A6347E-6FE4-4F40-BA9C-C4865240D1F4},100,FALSE,TRUE, ,Int32,4, ,This is the icon index used on messages marked for follow up.
+System.Communication.HeaderItem,{C9C34F84-2241-4401-B607-BD20ED75AE7F},100,FALSE,TRUE, ,Boolean,2, ,This property will be true if the item is a header item which means the item hasn't been fully downloaded.
+System.Communication.PolicyTag,{EC0B4191-AB0B-4C66-90B6-C6637CDEBBAB},100,TRUE,TRUE, ,String,512, ,This a string used to identify the retention policy applied to the item.
+System.Communication.SecurityFlags,{8619A4B6-9F4D-4429-8C0F-B996CA59E335},100,FALSE,TRUE, ,Int32,4, ,"Security flags associated with the item to know if the item is encrypted, signed or DRM enabled."
+System.Communication.TaskStatus,{BE1A72C6-9A1D-46B7-AFE7-AFAF8CEF4999},100,FALSE,TRUE, ,UInt16,2, , 
+System.Communication.TaskStatusText,{A6744477-C237-475B-A075-54F34498292A},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Communication.TaskStatus. Not intended to be parsed programmatically.
+System.Company,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},15,TRUE,TRUE, ,String,512, ,The company or publisher.
+System.ComputerName,{28636AA6-953D-11D2-B5D6-00C04FD918D0},5,FALSE,TRUE, ,String,512, , 
+System.Contact.Anniversary,{9AD5BADB-CEA7-4470-A03D-B84E51B9949E},100,FALSE,TRUE, ,DateTime,8, , 
+System.Contact.AssistantName,{CD102C9C-5540-4A88-A6F6-64E4981C8CD1},100,TRUE,TRUE, ,String,256, , 
+System.Contact.AssistantTelephone,{9A93244D-A7AD-4FF8-9B99-45EE4CC09AF6},100,TRUE,TRUE, ,String,512, , 
+System.Contact.Birthday,{176DC63C-2688-4E89-8143-A347800F25E9},47,FALSE,TRUE, ,DateTime,8, , 
+System.Contact.BusinessAddress,{730FB6DD-CF7C-426B-A03F-BD166CC9EE24},100,TRUE,TRUE, ,String,512, , 
+System.Contact.BusinessAddressCity,{402B5934-EC5A-48C3-93E6-85E86A2D934E},100,TRUE,TRUE, ,String,512, , 
+System.Contact.BusinessAddressCountry,{B0B87314-FCF6-4FEB-8DFF-A50DA6AF561C},100,TRUE,TRUE, ,String,512, , 
+System.Contact.BusinessAddressPostalCode,{E1D4A09E-D758-4CD1-B6EC-34A8B5A73F80},100,TRUE,TRUE, ,String,512, , 
+System.Contact.BusinessAddressPostOfficeBox,{BC4E71CE-17F9-48D5-BEE9-021DF0EA5409},100,TRUE,TRUE, ,String,512, , 
+System.Contact.BusinessAddressState,{446F787F-10C4-41CB-A6C4-4D0343551597},100,TRUE,TRUE, ,String,512, , 
+System.Contact.BusinessAddressStreet,{DDD1460F-C0BF-4553-8CE4-10433C908FB0},100,TRUE,TRUE, ,String,512, , 
+System.Contact.BusinessFaxNumber,{91EFF6F3-2E27-42CA-933E-7C999FBE310B},100,TRUE,TRUE, ,String,512, ,Business fax number of the contact.
+System.Contact.BusinessHomePage,{56310920-2491-4919-99CE-EADB06FAFDB2},100,TRUE,TRUE, ,String,512, , 
+System.Contact.BusinessTelephone,{6A15E5A0-0A1E-4CD7-BB8C-D2F1B0C929BC},100,TRUE,TRUE, ,String,512, , 
+System.Contact.CallbackTelephone,{BF53D1C3-49E0-4F7F-8567-5A821D8AC542},100,TRUE,TRUE, ,String,512, , 
+System.Contact.CarTelephone,{8FDC6DEA-B929-412B-BA90-397A257465FE},100,TRUE,TRUE, ,String,512, , 
+System.Contact.Children,{D4729704-8EF1-43EF-9024-2BD381187FD5},100,TRUE,TRUE, ,String,512,TRUE, 
+System.Contact.CompanyMainTelephone,{8589E481-6040-473D-B171-7FA89C2708ED},100,TRUE,TRUE, ,String,512, , 
+System.Contact.Department,{FC9F7306-FF8F-4D49-9FB6-3FFE5C0951EC},100,TRUE,TRUE, ,String,512, , 
+System.Contact.EmailAddress,{F8FA7FA3-D12B-4785-8A4E-691A94F7A3E7},100,TRUE,TRUE, ,String,256, , 
+System.Contact.EmailAddress2,{38965063-EDC8-4268-8491-B7723172CF29},100,TRUE,TRUE, ,String,256, , 
+System.Contact.EmailAddress3,{644D37B4-E1B3-4BAD-B099-7E7C04966ACA},100,TRUE,TRUE, ,String,256, , 
+System.Contact.EmailAddresses,{84D8F337-981D-44B3-9615-C7596DBA17E3},100,TRUE,TRUE, ,String,256,TRUE, 
+System.Contact.EmailName,{CC6F4F24-6083-4BD4-8754-674D0DE87AB8},100,TRUE,TRUE, ,String,256, , 
+System.Contact.FileAsName,{F1A24AA7-9CA7-40F6-89EC-97DEF9FFE8DB},100,TRUE,TRUE, ,String,256, , 
+System.Contact.FirstName,{14977844-6B49-4AAD-A714-A4513BF60460},100,TRUE,TRUE, ,String,256, , 
+System.Contact.FullName,{635E9051-50A5-4BA2-B9DB-4ED056C77296},100,TRUE,TRUE, ,String,256, , 
+System.Contact.Gender,{3C8CEE58-D4F0-4CF9-B756-4E5D24447BCD},100,TRUE,TRUE, ,String,512, , 
+System.Contact.GenderValue,{3C8CEE58-D4F0-4CF9-B756-4E5D24447BCD},101,FALSE,TRUE, ,UInt16,2, , 
+System.Contact.Hobbies,{5DC2253F-5E11-4ADF-9CFE-910DD01E3E70},100,TRUE,TRUE, ,String,512,TRUE, 
+System.Contact.HomeAddress,{98F98354-617A-46B8-8560-5B1B64BF1F89},100,TRUE,TRUE, ,String,512, , 
+System.Contact.HomeAddressCity,{176DC63C-2688-4E89-8143-A347800F25E9},65,TRUE,TRUE, ,String,512, , 
+System.Contact.HomeAddressCountry,{08A65AA1-F4C9-43DD-9DDF-A33D8E7EAD85},100,TRUE,TRUE, ,String,512, , 
+System.Contact.HomeAddressPostalCode,{8AFCC170-8A46-4B53-9EEE-90BAE7151E62},100,TRUE,TRUE, ,String,512, , 
+System.Contact.HomeAddressPostOfficeBox,{7B9F6399-0A3F-4B12-89BD-4ADC51C918AF},100,TRUE,TRUE, ,String,512, , 
+System.Contact.HomeAddressState,{C89A23D0-7D6D-4EB8-87D4-776A82D493E5},100,TRUE,TRUE, ,String,512, , 
+System.Contact.HomeAddressStreet,{0ADEF160-DB3F-4308-9A21-06237B16FA2A},100,TRUE,TRUE, ,String,512, , 
+System.Contact.HomeFaxNumber,{660E04D6-81AB-4977-A09F-82313113AB26},100,TRUE,TRUE, ,String,512, , 
+System.Contact.HomeTelephone,{176DC63C-2688-4E89-8143-A347800F25E9},20,TRUE,TRUE, ,String,512, , 
+System.Contact.IMAddress,{D68DBD8A-3374-4B81-9972-3EC30682DB3D},100,TRUE,TRUE, ,String,256,TRUE, 
+System.Contact.JA.CompanyNamePhonetic,{897B3694-FE9E-43E6-8066-260F590C0100},2,TRUE,TRUE, ,String,256, , 
+System.Contact.JA.FirstNamePhonetic,{897B3694-FE9E-43E6-8066-260F590C0100},3,TRUE,TRUE, ,String,512, , 
+System.Contact.JA.LastNamePhonetic,{897B3694-FE9E-43E6-8066-260F590C0100},4,TRUE,TRUE, ,String,256, , 
+System.Contact.JobTitle,{176DC63C-2688-4E89-8143-A347800F25E9},6,TRUE,TRUE, ,String,512, , 
+System.Contact.Label,{97B0AD89-DF49-49CC-834E-660974FD755B},100,TRUE,TRUE, ,String,512, , 
+System.Contact.LastName,{8F367200-C270-457C-B1D4-E07C5BCD90C7},100,TRUE,TRUE, ,String,256, , 
+System.Contact.MailingAddress,{C0AC206A-827E-4650-95AE-77E2BB74FCC9},100,TRUE,TRUE, ,String,512, , 
+System.Contact.MiddleName,{176DC63C-2688-4E89-8143-A347800F25E9},71,TRUE,TRUE, ,String,256, , 
+System.Contact.MobileTelephone,{176DC63C-2688-4E89-8143-A347800F25E9},35,TRUE,TRUE, ,String,512, , 
+System.Contact.NickName,{176DC63C-2688-4E89-8143-A347800F25E9},74,TRUE,TRUE, ,String,256, , 
+System.Contact.OfficeLocation,{176DC63C-2688-4E89-8143-A347800F25E9},7,TRUE,TRUE, ,String,512, , 
+System.Contact.OtherAddress,{508161FA-313B-43D5-83A1-C1ACCF68622C},100,TRUE,TRUE, ,String,512, , 
+System.Contact.OtherAddressCity,{6E682923-7F7B-4F0C-A337-CFCA296687BF},100,TRUE,TRUE, ,String,512, , 
+System.Contact.OtherAddressCountry,{8F167568-0AAE-4322-8ED9-6055B7B0E398},100,TRUE,TRUE, ,String,512, , 
+System.Contact.OtherAddressPostalCode,{95C656C1-2ABF-4148-9ED3-9EC602E3B7CD},100,TRUE,TRUE, ,String,512, , 
+System.Contact.OtherAddressPostOfficeBox,{8B26EA41-058F-43F6-AECC-4035681CE977},100,TRUE,TRUE, ,String,512, , 
+System.Contact.OtherAddressState,{71B377D6-E570-425F-A170-809FAE73E54E},100,TRUE,TRUE, ,String,512, , 
+System.Contact.OtherAddressStreet,{FF962609-B7D6-4999-862D-95180D529AEA},100,TRUE,TRUE, ,String,512, , 
+System.Contact.PagerTelephone,{D6304E01-F8F5-4F45-8B15-D024A6296789},100,TRUE,TRUE, ,String,512, , 
+System.Contact.PersonalTitle,{176DC63C-2688-4E89-8143-A347800F25E9},69,TRUE,TRUE, ,String,512, , 
+System.Contact.PrimaryAddressCity,{C8EA94F0-A9E3-4969-A94B-9C62A95324E0},100,TRUE,TRUE, ,String,512, , 
+System.Contact.PrimaryAddressCountry,{E53D799D-0F3F-466E-B2FF-74634A3CB7A4},100,TRUE,TRUE, ,String,512, , 
+System.Contact.PrimaryAddressPostalCode,{18BBD425-ECFD-46EF-B612-7B4A6034EDA0},100,TRUE,TRUE, ,String,512, , 
+System.Contact.PrimaryAddressPostOfficeBox,{DE5EF3C7-46E1-484E-9999-62C5308394C1},100,TRUE,TRUE, ,String,512, , 
+System.Contact.PrimaryAddressState,{F1176DFE-7138-4640-8B4C-AE375DC70A6D},100,TRUE,TRUE, ,String,512, , 
+System.Contact.PrimaryAddressStreet,{63C25B20-96BE-488F-8788-C09C407AD812},100,TRUE,TRUE, ,String,512, , 
+System.Contact.PrimaryEmailAddress,{176DC63C-2688-4E89-8143-A347800F25E9},48,TRUE,TRUE, ,String,256, , 
+System.Contact.PrimaryTelephone,{176DC63C-2688-4E89-8143-A347800F25E9},25,TRUE,TRUE, ,String,512, , 
+System.Contact.Profession,{7268AF55-1CE4-4F6E-A41F-B6E4EF10E4A9},100,TRUE,TRUE, ,String,512, , 
+System.Contact.SpouseName,{9D2408B6-3167-422B-82B0-F583B7A7CFE3},100,TRUE,TRUE, ,String,256, , 
+System.Contact.Suffix,{176DC63C-2688-4E89-8143-A347800F25E9},73,TRUE,TRUE, ,String,512, , 
+System.Contact.TelexNumber,{C554493C-C1F7-40C1-A76C-EF8C0614003E},100,TRUE,TRUE, ,String,512, , 
+System.Contact.TTYTDDTelephone,{AAF16BAC-2B55-45E6-9F6D-415EB94910DF},100,TRUE,TRUE, ,String,512, , 
+System.Contact.WebPage,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},18,TRUE,TRUE, ,String,4168, , 
+System.ContentStatus,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},27,TRUE,TRUE, ,String,512, , 
+System.ContentType,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},26,TRUE,TRUE, ,String,512, , 
+System.ContentUrl,{49691C90-7E17-101A-A91C-08002B2ECDA9},10,TRUE,TRUE, ,String,4168, ,"In the Open Search Provider, an item is usually made up of a link and some content. This represents the URL to the content."
+System.Copyright,{64440492-4C8B-11D1-8B70-080036B11A03},11,TRUE,TRUE, ,String,512, , 
+System.DateAccessed,{B725F130-47EF-101A-A5F1-02608C9EEBAC},16,FALSE,TRUE, ,DateTime,8, , 
+System.DateAcquired,{2CBAA8F5-D81F-47CA-B17A-F8D822300131},100,FALSE,TRUE, ,DateTime,8, ,"The date the file entered the system via acquisition. This is not the same as System.DateImported. This would apply, for example, to transfer an image from a camera or to music purchase from an online site."
+System.DateArchived,{43F8D7B7-A444-4F87-9383-52271C9B915C},100,FALSE,TRUE, ,DateTime,8, , 
+System.DateCompleted,{72FAB781-ACDA-43E5-B155-B2434F85E678},100,FALSE,TRUE, ,DateTime,8, , 
+System.DateCreated,{B725F130-47EF-101A-A5F1-02608C9EEBAC},15,FALSE,TRUE, ,DateTime,8, ,The date and time the item was created. The WSS friendly name is 'create'.
+System.DateImported,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},18258,FALSE,TRUE, ,DateTime,8, ,"The date the file is imported into a separate database. This is not the same as System.DateAcquired. (For example, 2003:05:22 13:55:04)"
+System.DateModified,{B725F130-47EF-101A-A5F1-02608C9EEBAC},14,FALSE,TRUE, ,DateTime,8, ,The date and time of the last write to the item. The WSS friendly name is 'write'.
+System.Document.ByteCount,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},4,FALSE,TRUE, ,Int32,4, , 
+System.Document.CharacterCount,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},16,FALSE,TRUE, ,Int32,4, , 
+System.Document.ClientID,{276D7BB0-5B34-4FB0-AA4B-158ED12A1809},100,TRUE,TRUE, ,String,512, , 
+System.Document.Contributor,{F334115E-DA1B-4509-9B3D-119504DC7ABB},100,TRUE,TRUE, ,String,512,TRUE, 
+System.Document.DateCreated,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},12,FALSE,TRUE, ,DateTime,8, ,"This property is stored in the document, not obtained from the file system."
+System.Document.DatePrinted,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},11,FALSE,TRUE, ,DateTime,8, , 
+System.Document.DateSaved,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},13,FALSE,TRUE, ,DateTime,8, , 
+System.Document.Division,{1E005EE6-BF27-428B-B01C-79676ACD2870},100,TRUE,TRUE, ,String,512, , 
+System.Document.DocumentID,{E08805C8-E395-40DF-80D2-54F0D6C43154},100,TRUE,TRUE, ,String,512, , 
+System.Document.HiddenSlideCount,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},9,FALSE,TRUE, ,Int32,4, , 
+System.Document.LastAuthor,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},8,TRUE,TRUE, ,String,256, , 
+System.Document.LineCount,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},5,FALSE,TRUE, ,Int32,4, , 
+System.Document.Manager,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},14,TRUE,TRUE, ,String,512, , 
+System.Document.PageCount,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},14,FALSE,TRUE, ,Int32,4, , 
+System.Document.ParagraphCount,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},6,FALSE,TRUE, ,Int32,4, , 
+System.Document.PresentationFormat,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},3,TRUE,TRUE, ,String,512, , 
+System.Document.RevisionNumber,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},9,TRUE,TRUE, ,String,512, , 
+System.Document.SlideCount,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},7,FALSE,TRUE, ,Int32,4, , 
+System.Document.TotalEditingTime,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},10,FALSE,TRUE, ,UInt64,8, ,"100ns units, not milliseconds. VT_FILETIME for IPropertySetStorage handlers (legacy)"
+System.Document.Version,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},29,FALSE,TRUE, ,String,512, , 
+System.Document.WordCount,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},15,FALSE,TRUE, ,Int32,4, , 
+System.DRM.IsProtected,{AEAC19E4-89AE-4508-B9B7-BB867ABEE2ED},2,FALSE,TRUE, ,Boolean,2, , 
+System.DueDate,{3F8472B5-E0AF-4DB2-8071-C53FE76AE7CE},100,FALSE,TRUE, ,DateTime,8, , 
+System.EndDate,{C75FAA05-96FD-49E7-9CB4-9F601082D553},100,FALSE,TRUE, ,DateTime,8, , 
+System.FileAttributes,{B725F130-47EF-101A-A5F1-02608C9EEBAC},13,FALSE,TRUE, ,UInt32,4, ,This is the WIN32_FIND_DATA dwFileAttributes for the file-based item.
+System.FileDescription,{0CEF7D53-FA64-11D1-A203-0000F81FEDEE},3,TRUE,FALSE, ,String,512, ,This is a user-friendly description of the file.
+System.FileExtension,{E4F10A3C-49E6-405D-8288-A23BD4EEAA6C},100,TRUE,TRUE, ,String,512, ,"This is the file extension of the file-based item, including the leading period. If System.FileName is VT_EMPTY, then this property should be too. Otherwise, it should be derived appropriately by the data source from System.FileName. If System.FileName does not have a file extension, this value should be VT_EMPTY. To obtain the type of any item (including an item that is not a file), use System.ItemType.Example values: If the path is... The property value is... ----------------- ------------------------ ""c:\foo\bar\hello.txt"" "".txt"" ""\\server\share\mydir\goodnews.doc"" "".doc"" ""\\server\share\numbers.xls"" "".xls"" ""\\server\share\folder"" VT_EMPTY ""c:\foo\MyFolder"" VT_EMPTY [desktop] VT_EMPTY"
+System.FileFRN,{B725F130-47EF-101A-A5F1-02608C9EEBAC},21,FALSE,TRUE, ,UInt64,8, ,"This is the unique file ID, also known as the File Reference Number. For a given file, this is the same value as is found in the structure variable FILE_ID_BOTH_DIR_INFO.FileId, via GetFileInformationByHandleEx()."
+System.FileName,{41CF5AE0-F75A-4806-BD87-59C7D9248EB9},100,TRUE,TRUE, ,String,520, ,"This is the file name (including extension) of the file. It is possible that the item might not exist on a filesystem (that is, it may not be opened using CreateFile). Nonetheless, if the item is represented as a file from the logical sense (and its name follows standard Win32 file-naming syntax), then the data source should emit this property. If an item is not a file, then the value for this property is VT_EMPTY. SeeSystem.ItemNameDisplay. This has the same value as System.ParsingName for items that are provided by the Shell's file folder. Example values: if the path is... The property value is...----------------- ------------------------""c:\foo\bar\hello.txt"" ""hello.txt""""\\server\share\mydir\goodnews.doc"" ""goodnews.doc""""\\server\share\numbers.xls"" ""numbers.xls""""c:\foo\MyFolder"" ""MyFolder""(email message) VT_EMPTY(song on portable device) ""song.wma"""
+System.FileOwner,{9B174B34-40FF-11D2-A27E-00C04FC30871},4,TRUE,TRUE, ,String,256, ,"This is the owner of the file, according to the file system."
+System.FlagColor,{67DF94DE-0CA7-4D6F-B792-053A3E4F03CF},100,FALSE,TRUE, ,UInt16,2, ,"name=""Purple"" value=""1"" text=""Purple""name=""Orange"" value=""2"" text=""Orange""name=""Green"" value=""3"" text=""Green"" name=""Yellow"" value=""4"" text=""Yellow""name=""Blue"" value=""5"" text=""Blue"" name=""Red"" value=""6"" text=""Red"" "
+System.FlagColorText,{45EAE747-8E2A-40AE-8CBF-CA52ABA6152A},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.FlagColor. Not intended to be parsed programmatically.
+System.FlagStatus,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},12,FALSE,TRUE, ,Int32,4, ,Status of Flag. Values: (0=none 1=white 2=Red).
+System.FlagStatusText,{DC54FD2E-189D-4871-AA01-08C2F57A4ABC},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.FlagStatus. Not intended to be parsed programmatically.
+System.GPS.Date,{3602C812-0F3B-45F0-85AD-603468D69423},100,FALSE,TRUE, ,DateTime,8, ,Date and time of the GPS record.
+System.IconIndex,{5CBF2787-48CF-4208-B90E-EE5E5D420294},26,FALSE,TRUE, ,Int32,4, , 
+System.Identity,{A26F4AFC-7346-4299-BE47-EB1AE613139F},100,TRUE,TRUE, ,String,512, , 
+System.Image.BitDepth,{6444048F-4C8B-11D1-8B70-080036B11A03},7,FALSE,TRUE, ,UInt32,4, , 
+System.Image.Compression,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},259,FALSE,TRUE, ,UInt16,2, ,Indicates the image compression level. PropertyTagCompression.
+System.Image.CompressionText,{3F08E66F-2F44-4BB9-A682-AC35D2562322},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Image.Compression. Not intended to be parsed programmatically.
+System.Image.Dimensions,{6444048F-4C8B-11D1-8B70-080036B11A03},13,TRUE,TRUE, ,String,512, ,Indicates the dimensions of the image.
+System.Image.HorizontalResolution,{6444048F-4C8B-11D1-8B70-080036B11A03},5,FALSE,TRUE, ,Double,8, , 
+System.Image.HorizontalSize,{6444048F-4C8B-11D1-8B70-080036B11A03},3,FALSE,TRUE, ,UInt32,4, , 
+System.Image.VerticalResolution,{6444048F-4C8B-11D1-8B70-080036B11A03},6,FALSE,TRUE, ,Double,8, , 
+System.Image.VerticalSize,{6444048F-4C8B-11D1-8B70-080036B11A03},4,FALSE,TRUE, ,UInt32,4, , 
+System.Importance,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},11,FALSE,TRUE, ,Int32,4, , 
+System.ImportanceText,{A3B29791-7713-4E1D-BB40-17DB85F01831},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Importance. Not intended to be parsed programmatically.
+System.IsAttachment,{F23F425C-71A1-4FA8-922F-678EA4A60408},100,FALSE,TRUE, ,Boolean,2, ,Identifies this item as an attachment.
+System.IsDeleted,{5CDA5FC8-33EE-4FF3-9094-AE7BD8868C4D},100,FALSE,TRUE, ,Boolean,2, , 
+System.IsEncrypted,{90E5E14E-648B-4826-B2AA-ACAF790E3513},10,FALSE,TRUE, ,Boolean,2, ,Holds a value indicating whether the item encrypted?
+System.IsFlagged,{5DA84765-E3FF-4278-86B0-A27967FBDD03},100,FALSE,TRUE, ,Boolean,2, , 
+System.IsFlaggedComplete,{A6F360D2-55F9-48DE-B909-620E090A647C},100,FALSE,TRUE, ,Boolean,2, , 
+System.IsFolder,{09329B74-40A3-4C68-BF07-AF9A572F607C},100,FALSE,TRUE, ,Boolean,2, ,Set this to true if the item is a folder.
+System.IsIncomplete,{346C8BD1-2E6A-4C45-89A4-61B78E8E700F},100,FALSE,TRUE, ,Boolean,2, ,Indicates whether the message was not completely received for some error condition.
+System.IsRead,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},10,FALSE,TRUE, ,Boolean,2, ,Has the item been read?
+System.ItemAuthors,{D0A04F0A-462A-48A4-BB2F-3706E88DBD7D},100,TRUE,TRUE, ,String,256,TRUE,"This is the generic list of authors associated with an item. For example, the artist name for a track is the item author."
+System.ItemDate,{F7DB74B4-4287-4103-AFBA-F1B13DCD75CF},100,FALSE,TRUE, ,DateTime,8, ,"This is the main date for an item. The date of interest. For example, for photos this maps to System.Photo.DateTaken."
+System.ItemFolderNameDisplay,{B725F130-47EF-101A-A5F1-02608C9EEBAC},2,TRUE,TRUE, ,String,512, ,"This is the user-friendly display name of the parent folder of an item. If System.ItemFolderPathDisplay is VT_EMPTY, then this property should be too. Otherwise, it should be derived appropriately by the data source from System.ItemFolderPathDisplay. If the folder is a file folder, the value will be localized if a localized name is available .Example values: If the path is... The property value is...----------------- ------------------------""c:\foo\bar\hello.txt"" ""bar""""\\server\share\mydir\goodnews.doc"" ""mydir""""\\server\share\numbers.xls"" ""share""""c:\foo\MyFolder"" ""foo""""/Mailbox Account/Inbox/'Re: Hello!'"" ""Inbox"""
+System.ItemFolderPathDisplay,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},6,TRUE,TRUE, ,String,520, ,"This is the user-friendly display path of the parent folder of an item.If System.ItemPathDisplay is VT_EMPTY, then this property should be too. Otherwise, it should be derived appropriately by the data source from System.ItemPathDisplay.Example values:If the path is... The property value is...----------------- ------------------------""c:\foo\bar\hello.txt"" ""c:\foo\bar""""\\server\share\mydir\goodnews.doc"" ""\\server\share\mydir""""\\server\share\numbers.xls"" ""\\server\share""""c:\foo\MyFolder"" ""c:\foo""""/Mailbox Account/Inbox/'Re: Hello!'"" ""/Mailbox Account/Inbox"""
+System.ItemFolderPathDisplayNarrow,{DABD30ED-0043-4789-A7F8-D013A4736622},100,TRUE,TRUE, ,String,520, ,"This is the user-friendly display path of the parent folder of an item. The format of the string should be tailored such that the folder name comes first, to optimize for a narrow viewing column. If the folder is a file folder, the value includes localized names if they are present. If System.ItemFolderPathDisplay is VT_EMPTY, then this property should be too. Otherwise, it should be derived appropriately by the data source from System.ItemFolderPathDisplay.Example values: ----------------""c:\foo\bar\hello.txt"" ""bar (c:\foo)""""\\server\share\mydir\goodnews.doc"" ""mydir (\\server\share)""""\\server\share\numbers.xls"" ""share (\\server)""""c:\foo\MyFolder"" ""foo (c:\)""""/Mailbox Account/Inbox/'Re: Hello!'"" ""Inbox (/Mailbox Account)"""
+System.ItemName,{6B8DA074-3B5C-43BC-886F-0A2CDCE00B6F},100,FALSE,TRUE, ,String,520, ,"This is the base-name of the System.ItemNameDisplay. If the item is a file this property includes the extension in all cases, and will be localized if a localized name is available. If the item is a message, then the value of this property does not include the forwarding or reply prefixes (see System.ItemNamePrefix)."
+System.ItemNameDisplay,{B725F130-47EF-101A-A5F1-02608C9EEBAC},10,TRUE,TRUE, ,String,520, ,"This is the display name in ""most complete"" form. This is the best effort unique representation of the name of an item that makes sense for end users to read. It is the concatenation of System.ItemNamePrefix and System.ItemName. If the item is a file this property includes the extension in all cases, and will be localized if a localized name is available. There are acceptable cases when System.FileName is not VT_EMPTY, yet the value of this property is completely different. Email messages are a key example. If the item is an email message, the item name is likely the subject. In that case, the value must be the concatenation of the System.ItemNamePrefix and System.ItemName. Since the value of System.ItemNamePrefix excludes any trailing whitespace, the concatenation must include whitespace when generating System.ItemNameDisplay. Note that this property is not guaranteed to be unique, but the idea is to promote the most likely candidate that can be unique and also makes sense for end users. For example, for documents, you might think about using System.Title as the System.ItemNameDisplay, but in practice the title of the documents may not be useful or unique enough to be of value as the sole System.ItemNameDisplay. Instead, providing the value of System.FileName as the value of System.ItemNameDisplay is a better candidate. In Windows Mail, the emails are stored in the file system as .eml files and the System.FileName for those files are not human-friendly as they contain GUIDs. In this example, promoting System.Subject as System.ItemNameDisplay makes more sense. Compatibility notes: Shell folder implementations on Vista: use PKEY_ItemNameDisplay for the name column when you want Explorer to call ISF::GetDisplayNameOf(SHGDN_NORMAL) to get the value of the name. Use another PKEY (like PKEY_ItemName) when you want Explorer to call either the folder's property store orISF2::GetDetailsEx in order to get the value of the name. Shell folder implementations on XP: the first column needs to be the name column, and Explorer will call ISF::GetDisplayNameOf to get the value of the name. The PKEY/SCID does not matter. Example values:File: ""hello.txt""Message: ""Re: Let's talk about Tom's argyle socks!""Device folder: ""song.wma""Folder: ""Documents"""
+System.ItemNamePrefix,{D7313FF1-A77A-401C-8C99-3DBDD68ADD36},100,FALSE,TRUE, ,String,520, ,"This is the prefix of an item, used for email messages where the subject begins with ""Re:"" which is the prefix. If the item is a file, then the value of this property is VT_EMPTY. If the item is a message, then the value of this property is the forwarding or reply prefixes (including delimiting colon, but no whitespace), or VT_EMPTY if there is no prefix. Example values: System.ItemNamePrefix System.ItemName System.ItemNameDisplay--------------------- ------------------- ----------------------VT_EMPTY ""Great day"" ""Great day""""Re:"" ""Great day"" ""Re: Great day""""Fwd: "" ""Monthly budget"" ""Fwd: Monthly budget""VT_EMPTY ""accounts.xls"" ""accounts.xls"""
+System.ItemParticipants,{D4D0AA16-9948-41A4-AA85-D97FF9646993},100,TRUE,TRUE, ,String,256,TRUE,"This is the generic list of people associated with an item and who contributed to the item. For example, this is the combination of people in the To list, Cc list and Sender of an email message."
+System.ItemPathDisplay,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},7,TRUE,TRUE, ,String,520, ,"This is the user-friendly display path to the item. If the item is a file or folder this property includes the extension in all cases, and will be localized if a localized name is available. For other items, this is the user-friendly equivalent, assuming the item exists in hierarchical storage. Unlike System.ItemUrl, this property value does not include the URL scheme. To parse an item path, use System.ItemUrl or System.ParsingPath. To reference shell namespace items using shell APIs, use System.ParsingPath. Example values: If the path is... The property value is...----------------- ------------------------""c:\foo\bar\hello.txt"" ""c:\foo\bar\hello.txt""""\\server\share\mydir\goodnews.doc"" ""\\server\share\mydir\goodnews.doc""""\\server\share\numbers.xls"" ""\\server\share\numbers.xls""""c:\foo\MyFolder"" ""c:\foo\MyFolder""""/Mailbox Account/Inbox/'Re: Hello!'"" ""/Mailbox Account/Inbox/'Re: Hello!'"""
+System.ItemPathDisplayNarrow,{28636AA6-953D-11D2-B5D6-00C04FD918D0},8,FALSE,TRUE, ,String,520, ,"This is the user-friendly display path to the item. The format of the string should be tailored such that the name comes first, to optimize for a narrow viewing column. If the item is a file, the value excludes the file extension, and includes localized names if they are present. If the item is a message, the value includes the System.ItemNamePrefix. To parse an item path, use System.ItemUrl or System.ParsingPath. Example values: If the path is... The property value is...----------------- ------------------------""c:\foo\bar\hello.txt"" ""hello (c:\foo\bar)""""\\server\share\mydir\goodnews.doc"" ""goodnews (\\server\share\mydir)""""\\server\share\folder"" ""folder (\\server\share)""""c:\foo\MyFolder"" ""MyFolder (c:\foo)""""/Mailbox Account/Inbox/'Re: Hello!'"" ""Re: Hello! (/Mailbox Account/Inbox)"""
+System.ItemType,{28636AA6-953D-11D2-B5D6-00C04FD918D0},11,TRUE,TRUE, ,String,512, ,"This is the canonical type of the item and is intended to be programmatically parsed. If there is no canonical type, the value is VT_EMPTY. If the item is a file (that is, System.FileName is not VT_EMPTY), the value is the same as System.FileExtension. Use System.ItemTypeText when you want to display the type to end users in a view. (If the item is a file, passing the System.ItemType value to PSFormatForDisplay will result in the same value as System.ItemTypeText.) Example values: If the path is... The property value is...----------------- ------------------------""c:\foo\bar\hello.txt"" "".txt""""\\server\share\mydir\goodnews.doc"" "".doc""""\\server\share\folder"" ""Directory""""c:\foo\MyFolder"" ""Directory""[desktop] ""Folder""""/Mailbox Account/Inbox/'Re: Hello!'"" ""MAPI/IPM.Message"""
+System.ItemTypeText,{B725F130-47EF-101A-A5F1-02608C9EEBAC},4,TRUE,TRUE, ,String,512, ,"This is the user friendly type name of the item. This is not intended to be programmatically parsed. If System.ItemType is VT_EMPTY, the value of this property is also VT_EMPTY. If the item is a file, the value of this property is the same as if you passed thefile's System.ItemType value to PSFormatForDisplay.This property should not be confused with System.Kind, where System.Kind is a high-level user friendly kind name. For example, for a document, System.Kind = ""Document"" andSystem.Item.Type = "".doc"" and System.Item.TypeText = ""Microsoft Word Document"" Example values: If the path is... The property value is...----------------- ------------------------""c:\foo\bar\hello.txt"" ""Text File""""\\server\share\mydir\goodnews.doc"" ""Microsoft Word Document""""\\server\share\folder"" ""File Folder""""c:\foo\MyFolder"" ""File Folder""""/Mailbox Account/Inbox/'Re: Hello!'"" ""Outlook E-mail Message"""
+System.ItemUrl,{49691C90-7E17-101A-A91C-08002B2ECDA9},9,TRUE,TRUE, ,String,4168, ,"This always represents a well formed URL that points to the item. To reference shell namespace items using shell APIs, use System.ParsingPath. Example values:Files: ""file:///c:/foo/bar/hello.txt""""csc://{GUID}/...""Messages: ""mapi://..."""
+System.Journal.Contacts,{DEA7C82C-1D89-4A66-9427-A4E3DEBABCB1},100,TRUE,TRUE, ,String,512,TRUE, 
+System.Journal.EntryType,{95BEB1FC-326D-4644-B396-CD3ED90E6DDF},100,TRUE,TRUE, ,String,512, , 
+System.Keywords,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},5,TRUE,TRUE, ,String,512,TRUE,The keywords for the item. Also referred to as tags.
+System.Kind,{1E3EE840-BC2B-476C-8237-2ACD1A839B22},3,TRUE,TRUE, ,String,512,TRUE,"System.Kind is used to map extensions to various .Search folders. Extensions are mapped to Kinds at HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\KindMapThe list of kinds is not extensible. ""Calendar"" ""Communication"" ""Contact"" ""Document"" ""Email"" ""Feed"" ""Folder"" ""Game"" ""InstantMessage"" ""Journal"" ""Link"" ""Movie"" ""Music"" ""Note"" ""Picture"" ""Program"" ""RecordedTV"" ""SearchFolder"" ""Task"" ""Video"" ""WebHistory"" "
+System.KindText,{F04BEF95-C585-4197-A2B7-DF46FDC9EE6D},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Kind. Not intended to be parsed programmatically.
+System.Language,{D5CDD502-2E9C-101B-9397-08002B2CF9AE},28,TRUE,TRUE, ,String,512, , 
+System.Link.TargetExtension,{7A7D76F4-B630-4BD7-95FF-37CC51A975C9},2,TRUE,FALSE, ,String,512,TRUE,The file extension of the link target. See System.File.Extension
+System.Link.TargetParsingPath,{B9B4B3FC-2B51-4A42-B5D8-324146AFCF25},2,FALSE,TRUE, ,String,520, ,"This is the shell namespace path to the target of the link item. This path may be passed toSHParseDisplayName to parse the path to the correct shell folder. If the target item is a file, the value is identical to System.ItemPathDisplay. If the target item cannot be accessed through the shell namespace, this value is VT_EMPTY."
+System.Link.TargetSFGAOFlags,{B9B4B3FC-2B51-4A42-B5D8-324146AFCF25},8,FALSE,TRUE, ,UInt32,4, ,"IShellFolder::GetAttributesOf flags for the target of a link, with SFGAO_PKEYSFGAOMASK attributes masked out."
+System.Link.TargetSFGAOFlagsStrings,{D6942081-D53B-443D-AD47-5E059D9CD27A},3,TRUE,FALSE, ,String,512,TRUE,Expresses the SFGAO flags of a link as string values and is used as a query optimization. See PKEY_Shell_SFGAOFlagsStrings for possible values of this.
+System.Link.TargetUrl,{5CBF2787-48CF-4208-B90E-EE5E5D420294},2,TRUE,TRUE, ,String,4168, , 
+System.Media.AverageLevel,{09EDD5B6-B301-43C5-9990-D00302EFFD46},100,FALSE,TRUE, ,UInt32,4, , 
+System.Media.ClassPrimaryID,{64440492-4C8B-11D1-8B70-080036B11A03},13,FALSE,TRUE, ,String,512, , 
+System.Media.ClassSecondaryID,{64440492-4C8B-11D1-8B70-080036B11A03},14,FALSE,TRUE, ,String,512, , 
+System.Media.CollectionGroupID,{64440492-4C8B-11D1-8B70-080036B11A03},24,FALSE,TRUE, ,String,512, , 
+System.Media.CollectionID,{64440492-4C8B-11D1-8B70-080036B11A03},25,FALSE,TRUE, ,String,512, , 
+System.Media.ContentDistributor,{64440492-4C8B-11D1-8B70-080036B11A03},18,FALSE,TRUE, ,String,512, , 
+System.Media.ContentID,{64440492-4C8B-11D1-8B70-080036B11A03},26,FALSE,TRUE, ,String,512, , 
+System.Media.CreatorApplication,{64440492-4C8B-11D1-8B70-080036B11A03},27,TRUE,TRUE, ,String,512, , 
+System.Media.CreatorApplicationVersion,{64440492-4C8B-11D1-8B70-080036B11A03},28,TRUE,TRUE, ,String,512, , 
+System.Media.DateEncoded,{2E4B640D-5019-46D8-8881-55414CC5CAA0},100,FALSE,TRUE, ,DateTime,8, ,"DateTime is in UTC (in the doc, not file system)."
+System.Media.DateReleased,{DE41CC29-6971-4290-B472-F59F2E2F31E2},100,TRUE,TRUE, ,String,512, , 
+System.Media.Duration,{64440490-4C8B-11D1-8B70-080036B11A03},3,FALSE,TRUE, ,UInt64,8, ,"100ns units, not milliseconds"
+System.Media.DVDID,{64440492-4C8B-11D1-8B70-080036B11A03},15,FALSE,TRUE, ,String,512, , 
+System.Media.EncodedBy,{64440492-4C8B-11D1-8B70-080036B11A03},36,TRUE,TRUE, ,String,512, , 
+System.Media.FrameCount,{6444048F-4C8B-11D1-8B70-080036B11A03},12,FALSE,TRUE, ,UInt32,4, ,Indicates the frame count for the image.
+System.Media.MCDI,{64440492-4C8B-11D1-8B70-080036B11A03},16,FALSE,TRUE, ,String,512, , 
+System.Media.MetadataContentProvider,{64440492-4C8B-11D1-8B70-080036B11A03},17,FALSE,TRUE, ,String,512, , 
+System.Media.Producer,{64440492-4C8B-11D1-8B70-080036B11A03},22,TRUE,TRUE, ,String,256,TRUE, 
+System.Media.ProtectionType,{64440492-4C8B-11D1-8B70-080036B11A03},38,FALSE,TRUE, ,String,512, ,"If media is protected, how is it protected?"
+System.Media.ProviderRating,{64440492-4C8B-11D1-8B70-080036B11A03},39,FALSE,TRUE, ,String,512, ,Rating (0 - 99) supplied by metadata provider
+System.Media.ProviderStyle,{64440492-4C8B-11D1-8B70-080036B11A03},40,FALSE,TRUE, ,String,512, ,"Style of music or video, supplied by metadata provider"
+System.Media.Publisher,{64440492-4C8B-11D1-8B70-080036B11A03},30,TRUE,TRUE, ,String,512, , 
+System.Media.SubscriptionContentId,{9AEBAE7A-9644-487D-A92C-657585ED751A},100,FALSE,TRUE, ,String,512, , 
+System.Media.SubTitle,{56A3372E-CE9C-11D2-9F0E-006097C686F6},38,TRUE,TRUE, ,String,512, , 
+System.Media.UniqueFileIdentifier,{64440492-4C8B-11D1-8B70-080036B11A03},35,FALSE,TRUE, ,String,512, , 
+System.Media.UserNoAutoInfo,{64440492-4C8B-11D1-8B70-080036B11A03},41,FALSE,TRUE, ,String,512, ,"If true, do NOT alter this file's metadata. Set by user."
+System.Media.UserWebUrl,{64440492-4C8B-11D1-8B70-080036B11A03},34,FALSE,TRUE, ,String,4168, , 
+System.Media.Writer,{64440492-4C8B-11D1-8B70-080036B11A03},23,TRUE,TRUE, ,String,256,TRUE, 
+System.Media.Year,{56A3372E-CE9C-11D2-9F0E-006097C686F6},5,FALSE,TRUE, ,UInt32,4, , 
+System.Message.AttachmentContents,{3143BF7C-80A8-4854-8880-E2E40189BDD0},100,TRUE,FALSE, ,String,512, , 
+System.Message.AttachmentNames,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},21,TRUE,TRUE, ,String,512,TRUE,The names of the attachments in a message
+System.Message.BccAddress,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},2,TRUE,TRUE, ,String,256,TRUE,Lists the addresses in the Bcc: field
+System.Message.BccName,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},3,TRUE,TRUE, ,String,256,TRUE,Lists the names in the Bcc: field
+System.Message.CcAddress,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},4,TRUE,TRUE, ,String,256,TRUE,Lists the addresses in the Cc: field
+System.Message.CcName,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},5,TRUE,TRUE, ,String,256,TRUE,Indicates the names listed in the Cc: field
+System.Message.ConversationID,{DC8F80BD-AF1E-4289-85B6-3DFC1B493992},100,TRUE,TRUE, ,String,512, , 
+System.Message.ConversationIndex,{DC8F80BD-AF1E-4289-85B6-3DFC1B493992},101,FALSE,TRUE, ,Buffer,1024, , 
+System.Message.DateReceived,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},20,FALSE,TRUE, ,DateTime,8, ,Date and Time communication was received.
+System.Message.DateSent,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},19,FALSE,TRUE, ,DateTime,8, ,Date and Time communication was sent.
+System.Message.Flags,{A82D9EE7-CA67-4312-965E-226BCEA85023},100,FALSE,TRUE, ,Int32,4, ,"These are flags associated with email messages to know if a read receipt is pending, etc. The values stored here by Outlook are defined for PR_MESSAGE_FLAGS on MSDN."
+System.Message.FromAddress,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},13,TRUE,TRUE, ,String,256,TRUE, 
+System.Message.FromName,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},14,TRUE,TRUE, ,String,256,TRUE,Specifies the address in the from field as a person's name.
+System.Message.HasAttachments,{9C1FCF74-2D97-41BA-B4AE-CB2E3661A6E4},8,FALSE,TRUE, ,Boolean,2, , 
+System.Message.IsFwdOrReply,{9A9BC088-4F6D-469E-9919-E705412040F9},100,FALSE,TRUE, ,Int32,4, , 
+System.Message.MessageClass,{CD9ED458-08CE-418F-A70E-F912C7BB9C5C},103,TRUE,TRUE, ,String,512, ,"Describes what type of Outlook message this is (meeting, task, mail, etc.)"
+System.Message.ProofInProgress,{9098F33C-9A7D-48A8-8DE5-2E1227A64E91},100,FALSE,TRUE, ,Boolean,2, ,This property will be true if the message junk email proofing is still in progress.
+System.Message.SenderAddress,{0BE1C8E7-1981-4676-AE14-FDD78F05A6E7},100,TRUE,TRUE, ,String,256, , 
+System.Message.SenderName,{0DA41CFA-D224-4A18-AE2F-596158DB4B3A},100,TRUE,TRUE, ,String,256, , 
+System.Message.Store,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},15,FALSE,TRUE, ,String,512, ,"The store (aka protocol handler) FILE, MAIL, OUTLOOKEXPRESS"
+System.Message.ToAddress,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},16,TRUE,TRUE, ,String,256,TRUE,Addresses in To: field
+System.Message.ToDoFlags,{1F856A9F-6900-4ABA-9505-2D5F1B4D66CB},100,FALSE,TRUE, ,Int32,4, ,"Flags associated with a message flagged to know if it's still active, if it was custom flagged, etc."
+System.Message.ToDoTitle,{BCCC8A3C-8CEF-42E5-9B1C-C69079398BC7},100,TRUE,TRUE, ,String,512, , 
+System.Message.ToName,{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD},17,TRUE,TRUE, ,String,256,TRUE,Person names in To: field
+System.MileageInformation,{FDF84370-031A-4ADD-9E91-0D775F1C6605},100,TRUE,TRUE, ,String,512, , 
+System.MIMEType,{0B63E350-9CCC-11D0-BCDB-00805FCCCE04},5,TRUE,TRUE, ,String,512, ,"The MIME type. Eg, for EML files: 'message/rfc822'."
+System.Music.AlbumArtist,{56A3372E-CE9C-11D2-9F0E-006097C686F6},13,TRUE,TRUE, ,String,256, , 
+System.Music.AlbumID,{56A3372E-CE9C-11D2-9F0E-006097C686F6},100,TRUE,TRUE, ,String,2048, ,"Concatenation of System.Music.AlbumArtist and System.Music.AlbumTitle, suitable for indexing and display. Used to differentiate albums with the same title from different artists."
+System.Music.AlbumTitle,{56A3372E-CE9C-11D2-9F0E-006097C686F6},4,TRUE,TRUE, ,String,512, , 
+System.Music.Artist,{56A3372E-CE9C-11D2-9F0E-006097C686F6},2,TRUE,TRUE, ,String,256,TRUE, 
+System.Music.BeatsPerMinute,{56A3372E-CE9C-11D2-9F0E-006097C686F6},35,TRUE,TRUE, ,String,512, , 
+System.Music.Composer,{64440492-4C8B-11D1-8B70-080036B11A03},19,TRUE,TRUE, ,String,256,TRUE, 
+System.Music.Conductor,{56A3372E-CE9C-11D2-9F0E-006097C686F6},36,TRUE,TRUE, ,String,256,TRUE, 
+System.Music.ContentGroupDescription,{56A3372E-CE9C-11D2-9F0E-006097C686F6},33,FALSE,TRUE, ,String,512, , 
+System.Music.DisplayArtist,{FD122953-FA93-4EF7-92C3-04C946B2F7C8},100,TRUE,TRUE, ,String,256, ,"This property returns the best representation of Album Artist for a given music file based upon AlbumArtist, ContributingArtist and compilation info."
+System.Music.Genre,{56A3372E-CE9C-11D2-9F0E-006097C686F6},11,TRUE,TRUE, ,String,512,TRUE, 
+System.Music.InitialKey,{56A3372E-CE9C-11D2-9F0E-006097C686F6},34,TRUE,TRUE, ,String,512, , 
+System.Music.IsCompilation,{C449D5CB-9EA4-4809-82E8-AF9D59DED6D1},100,FALSE,TRUE, ,Boolean,2, ,Indicates whether the file is part of a compilation.
+System.Music.Lyrics,{56A3372E-CE9C-11D2-9F0E-006097C686F6},12,TRUE,FALSE, ,String,512, , 
+System.Music.Mood,{56A3372E-CE9C-11D2-9F0E-006097C686F6},39,TRUE,TRUE, ,String,512, , 
+System.Music.PartOfSet,{56A3372E-CE9C-11D2-9F0E-006097C686F6},37,FALSE,TRUE, ,String,512, , 
+System.Music.Period,{64440492-4C8B-11D1-8B70-080036B11A03},31,TRUE,TRUE, ,String,512, , 
+System.Music.TrackNumber,{56A3372E-CE9C-11D2-9F0E-006097C686F6},7,FALSE,TRUE, ,UInt32,4, , 
+System.Note.Color,{4776CAFA-BCE4-4CB1-A23E-265E76D8EB11},100,FALSE,TRUE, ,UInt16,2, ,"name=""Blue"" value=""0""name=""Green"" value=""1""name=""Pink"" value=""2""name=""Yellow"" value=""3""name=""White"" value=""4""name=""LightGreen"" value=""5"""
+System.Note.ColorText,{46B4E8DE-CDB2-440D-885C-1658EB65B914},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Note.Color. Not intended to be parsed programmatically.
+System.OriginalFileName,{0CEF7D53-FA64-11D1-A203-0000F81FEDEE},6,TRUE,TRUE, ,String,520, , 
+System.ParentalRating,{64440492-4C8B-11D1-8B70-080036B11A03},21,TRUE,TRUE, ,String,512, , 
+System.ParentalRatingReason,{10984E0A-F9F2-4321-B7EF-BAF195AF4319},100,TRUE,TRUE, ,String,512, , 
+System.ParsingName,{28636AA6-953D-11D2-B5D6-00C04FD918D0},24,TRUE,TRUE, ,String,520, ,The shell namespace name of an item relative to a parent folder. This name may be passed to IShellFolder::ParseDisplayName() of the parent shell folder.
+System.Photo.Aperture,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},37378,FALSE,TRUE, ,Double,8, ,PropertyTagExifAperture. Calculated from PKEY_Photo_ApertureNumerator and PKEY_Photo_ApertureDenominator
+System.Photo.CameraManufacturer,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},271,TRUE,TRUE, ,String,512, , 
+System.Photo.CameraModel,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},272,TRUE,TRUE, ,String,512, , 
+System.Photo.ContrastText,{59DDE9F2-5253-40EA-9A8B-479E96C6249A},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Photo.Contrast. Not intended to be parsed programmatically.
+System.Photo.DateTaken,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},36867,FALSE,TRUE, ,DateTime,8, , 
+System.Photo.DigitalZoom,{F85BF840-A925-4BC2-B0C4-8E36B598679E},100,FALSE,TRUE, ,Double,8, ,Calculated from PKEY_Photo_DigitalZoomNumerator and PKEY_Photo_DigitalZoomDenominator
+System.Photo.Event,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},18248,TRUE,TRUE, ,String,512,TRUE,The event at which the photo was taken.
+System.Photo.ExposureBias,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},37380,FALSE,TRUE, ,Double,8, ,Calculated from PKEY_Photo_ExposureBiasNumerator and PKEY_Photo_ExposureBiasDenominator
+System.Photo.ExposureProgram,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},34850,FALSE,TRUE, ,UInt32,4, ,"name=""Unknown"" value=""0"" text=""Unknown"" name=""Manual"" value=""1"" text=""Manual"" name=""Normal"" value=""2"" text=""Normal"" name=""Aperture"" value=""3"" text=""Aperture Priority"" name=""Shutter"" value=""4"" text=""Shutter Priority"" name=""Creative"" value=""5"" text=""Creative Program (biased toward depth of field)"" name=""Action"" value=""6"" text=""Action Program (biased toward shutter speed)"" name=""Portrait"" value=""7"" text=""Portrait Mode"" name=""Landscape"" value=""8"" text=""Landscape Mode"" "
+System.Photo.ExposureProgramText,{FEC690B7-5F30-4646-AE47-4CAAFBA884A3},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Photo.ExposureProgram. Not intended to be parsed programmatically.
+System.Photo.ExposureTime,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},33434,FALSE,TRUE, ,Double,8, ,Calculated from PKEY_Photo_ExposureTimeNumerator and PKEY_Photo_ExposureTimeDenominator
+System.Photo.Flash,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},37385,FALSE,TRUE, ,Byte,1, ,"name=""NoFlash"" value=""0"" text=""No flash"" name=""Flash"" value=""1"" text=""Flash"" name=""FlashNoReturnLight"" value=""5"" text=""Flash, no strobe return"" name=""FlashReturnLight"" value=""7"" text=""Flash, strobe return"" name=""FlashCompulsory"" value=""9"" text=""Flash, compulsory"" name=""FlashCompulsoryNoReturnLight"" value=""13"" text=""Flash, compulsory, no strobe return"" name=""FlashCompulsoryReturnLight"" value=""15"" text=""Flash, compulsory, strobe return"" name=""NoFlashCompulsory"" value=""16"" text=""No flash, compulsory"" name=""NoFlashAuto"" value=""24"" text=""No flash, auto"" name=""FlashAuto"" value=""25"" text=""Flash, auto"" name=""FlashAutoNoReturnLight"" value=""29"" text=""Flash, auto, no strobe return"" name=""FlashAutoReturnLight"" value=""31"" text=""Flash, auto, strobe return"" name=""NoFlashFunction"" value=""32"" text=""No flash function"" name=""FlashRedEye"" value=""65"" text=""Flash, red-eye"" name=""FlashRedEyeNoReturnLight"" value=""69"" text=""Flash, red-eye, no strobe return"" name=""FlashRedEyeReturnLight"" value=""71"" text=""Flash, red-eye, strobe return"" name=""FlashCompulsoryRedEye"" value=""73"" text=""Flash, compulsory, red-eye"" name=""FlashCompulsoryRedEyeNoReturnLight"" value=""77"" text=""Flash, compulsory, red-eye, no strobe return""name=""FlashCompulsoryRedEyeReturnLight"" value=""79"" text=""Flash, compulsory, red-eye, strobe return"" name=""FlashAutoRedEye"" value=""89"" text=""Flash, auto, red-eye"" name=""FlashAutoRedEyeNoReturnLight"" value=""93"" text=""Flash, auto, no strobe return, red-eye"" name=""FlashAutoRedEyeReturnLight"" value=""95"" text=""Flash, auto, strobe return, red-eye"" "
+System.Photo.FlashFired,{2D152B40-CA39-40DB-B2CC-573725B2FEC5},100,FALSE,TRUE, ,Boolean,2, , 
+System.Photo.FlashText,{6B8B68F6-200B-47EA-8D25-D8050F57339F},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Photo.Flash. Not intended to be parsed programmatically.
+System.Photo.FNumber,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},33437,FALSE,TRUE, ,Double,8, ,Calculated from PKEY_Photo_FNumberNumerator and PKEY_Photo_FNumberDenominator
+System.Photo.FocalLength,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},37386,FALSE,TRUE, ,Double,8, ,Calculated from PKEY_Photo_FocalLengthNumerator and PKEY_Photo_FocalLengthDenominator
+System.Photo.FocalLengthInFilm,{A0E74609-B84D-4F49-B860-462BD9971F98},100,FALSE,TRUE, ,UInt16,2, , 
+System.Photo.GainControlText,{C06238B2-0BF9-4279-A723-25856715CB9D},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Photo.GainControl. Not intended to be parsed programmatically.
+System.Photo.ISOSpeed,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},34855,FALSE,TRUE, ,UInt16,2, , 
+System.Photo.LightSource,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},37384,FALSE,TRUE, ,UInt32,4, ,"name=""Unknown"" value=""0"" text=""Unknown"" name=""Daylight"" value=""1"" text=""Daylight"" name=""Fluorescent"" value=""2"" text=""Fluorescent"" name=""Tungsten"" value=""3"" text=""Tungsten"" name=""StandardA"" value=""17"" text=""Standard Illuminant A""name=""StandardB"" value=""18"" text=""Standard Illuminant B""name=""StandardC"" value=""19"" text=""Standard Illuminant C""name=""D55"" value=""20"" text=""D55"" name=""D65"" value=""21"" text=""D65"" name=""D75"" value=""22"" text=""D75"" "
+System.Photo.MaxAperture,{08F6D7C2-E3F2-44FC-AF1E-5AA5C81A2D3E},100,FALSE,TRUE, ,Double,8, ,Calculated from PKEY_Photo_MaxApertureNumerator and PKEY_Photo_MaxApertureDenominator
+System.Photo.MeteringMode,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},37383,FALSE,TRUE, ,UInt16,2, ,"name=""Unknown"" value=""0"" text=""Unknown"" name=""Average"" value=""1"" text=""Average"" name=""Center"" value=""2"" text=""Center Weighted Average"" name=""Spot"" value=""3"" text=""Spot"" name=""MultiSpot"" value=""4"" text=""Multi Spot"" name=""Pattern"" value=""5"" text=""Pattern"" name=""Partial"" value=""6"" text=""Partial"" "
+System.Photo.MeteringModeText,{F628FD8C-7BA8-465A-A65B-C5AA79263A9E},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Photo.MeteringMode. Not intended to be parsed programmatically.
+System.Photo.Orientation,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},274,FALSE,TRUE, ,UInt16,2, ,"This is the image orientation viewed in terms of rows and columns.name=""Normal"" value=""1"" text=""Normal"" name=""FlipHorizontal"" value=""2"" text=""Flip horizontal"" name=""Rotate180"" value=""3"" text=""Rotate 180 degrees""name=""FlipVertical"" value=""4"" text=""Flip vertical"" name=""Transpose"" value=""5"" text=""Transpose"" name=""Rotate270"" value=""6"" text=""Rotate 270 degrees""name=""Transverse"" value=""7"" text=""Transverse"" name=""Rotate90"" value=""8"" text=""Rotate 90 degrees"" "
+System.Photo.OrientationText,{A9EA193C-C511-498A-A06B-58E2776DCC28},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Photo.Orientation. Not intended to be parsed programmatically.
+System.Photo.PeopleNames,{E8309B6E-084C-49B4-B1FC-90A80331B638},100,TRUE,TRUE, ,String,512,TRUE,The people tags on an image.
+System.Photo.PhotometricInterpretationText,{821437D6-9EAB-4765-A589-3B1CBBD22A61},100,TRUE,TRUE, ,String,512, ,"This is the user-friendly form of System.Photo.PhotometricInterpretation. Not intended to be parsed programmatically. name=""RGB"" value=""2"" text=""RGB"" name=""YCbCr"" value=""6"" text=""YCbCr"" "
+System.Photo.ProgramModeText,{7FE3AA27-2648-42F3-89B0-454E5CB150C3},100,TRUE,TRUE, ,String,512, ,"This is the user-friendly form of System.Photo.ProgramMode. Not intended to be parsed programmatically. name=""NotDefined"" value=""0"" text=""Not defined"" name=""Manual"" value=""1"" text=""Manual"" name=""Normal"" value=""2"" text=""Normal program"" name=""Aperture"" value=""3"" text=""Aperture priorityname=""Shutter"" value=""4"" text=""Shutter priority""name=""Creative"" value=""5"" text=""Creative program""name=""Action"" value=""6"" text=""Action program"" name=""Portrait"" value=""7"" text=""Portrait"" name=""Landscape"" value=""8"" text=""Landscape"" "
+System.Photo.SaturationText,{61478C08-B600-4A84-BBE4-E99C45F0A072},100,TRUE,TRUE, ,String,512, ,"This is the user-friendly form of System.Photo.Saturation. Not intended to be parsed programmatically. name=""Normal"" value=""0"" text=""Normal"" name=""Low"" value=""1"" text=""Low saturation"" name=""High"" value=""2"" text=""High saturation"" "
+System.Photo.SharpnessText,{51EC3F47-DD50-421D-8769-334F50424B1E},100,TRUE,TRUE, ,String,512, ,"This is the user-friendly form of System.Photo.Sharpness. Not intended to be parsed programmatically. name=""Normal"" value=""0"" text=""Normal""name=""Soft"" value=""1"" text=""Soft"" name=""Hard"" value=""2"" text=""Hard"" "
+System.Photo.ShutterSpeed,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},37377,FALSE,TRUE, ,Double,8, ,Calculated from PKEY_Photo_ShutterSpeedNumerator and PKEY_Photo_ShutterSpeedDenominator
+System.Photo.SubjectDistance,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},37382,FALSE,TRUE, ,Double,8, ,Calculated from PKEY_Photo_SubjectDistanceNumerator and PKEY_Photo_SubjectDistanceDenominator
+System.Photo.TagViewAggregate,{B812F15D-C2D8-4BBF-BACD-79744346113F},100,TRUE,TRUE,l,String,512,TRUE,A read-only aggregation of tag-like properties for use in building views.
+System.Photo.WhiteBalance,{EE3D3D8A-5381-4CFA-B13B-AAF66B5F4EC9},100,FALSE,TRUE, ,UInt32,4, ,"Indicates the white balance mode set when the image was shot. name=""Auto"" value=""0"" text=""Auto"" name=""Manual"" value=""1"" text=""Manual"" "
+System.Photo.WhiteBalanceText,{6336B95E-C7A7-426D-86FD-7AE3D39C84B4},100,TRUE,TRUE, ,String,512, ,"This is the user-friendly form of System.Photo.WhiteBalance. Not intended to be parsed programmatically. name=""Low"" value=""0"" text=""Low"" name=""Normal"" value=""1"" text=""Normal""name=""High"" value=""2"" text=""High"" "
+System.Priority,{9C1FCF74-2D97-41BA-B4AE-CB2E3661A6E4},5,FALSE,TRUE, ,UInt16,2, ,"name=""Low"" value=""0"" text=""Low"" name=""Normal"" value=""1"" text=""Normal""name=""High"" value=""2"" text=""High"" "
+System.PriorityText,{D98BE98B-B86B-4095-BF52-9D23B2E0A752},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Priority. Not intended to be parsed programmatically.
+System.Project,{39A7F922-477C-48DE-8BC8-B28441E342E3},100,TRUE,TRUE, ,String,512, , 
+System.ProviderItemID,{F21D9941-81F0-471A-ADEE-4E74B49217ED},100,TRUE,TRUE, ,String,512, , 
+System.Rating,{64440492-4C8B-11D1-8B70-080036B11A03},9,FALSE,TRUE, ,UInt32,4, ,"Indicates the users preference rating of an item on a scale of 1-99 (1-12 = One Star, 13-37 = Two Stars, 38-62 = Three Stars, 63-87 = Four Stars, 88-99 = Five Stars)."
+System.RatingText,{90197CA7-FD8F-4E8C-9DA3-B57E1E609295},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Rating. Not intended to be parsed programmatically.
+System.RecordedTV.ChannelNumber,{6D748DE2-8D38-4CC3-AC60-F009B057C557},7,FALSE,TRUE, ,UInt32,4, ,Example: 42
+System.RecordedTV.DateContentExpires,{6D748DE2-8D38-4CC3-AC60-F009B057C557},15,FALSE,TRUE, ,DateTime,8, , 
+System.RecordedTV.EpisodeName,{6D748DE2-8D38-4CC3-AC60-F009B057C557},2,TRUE,TRUE, ,String,512, ,"Example: ""Nowhere to Hyde"""
+System.RecordedTV.IsATSCContent,{6D748DE2-8D38-4CC3-AC60-F009B057C557},16,FALSE,TRUE, ,Boolean,2, , 
+System.RecordedTV.IsClosedCaptioningAvailable,{6D748DE2-8D38-4CC3-AC60-F009B057C557},12,FALSE,TRUE, ,Boolean,2, , 
+System.RecordedTV.IsDTVContent,{6D748DE2-8D38-4CC3-AC60-F009B057C557},17,FALSE,TRUE, ,Boolean,2, , 
+System.RecordedTV.IsHDContent,{6D748DE2-8D38-4CC3-AC60-F009B057C557},18,FALSE,TRUE, ,Boolean,2, , 
+System.RecordedTV.IsRepeatBroadcast,{6D748DE2-8D38-4CC3-AC60-F009B057C557},13,FALSE,TRUE, ,Boolean,2, , 
+System.RecordedTV.IsSAP,{6D748DE2-8D38-4CC3-AC60-F009B057C557},14,FALSE,TRUE, ,Boolean,2, , 
+System.RecordedTV.NetworkAffiliation,{2C53C813-FB63-4E22-A1AB-0B331CA1E273},100,FALSE,TRUE, ,String,512, , 
+System.RecordedTV.OriginalBroadcastDate,{4684FE97-8765-4842-9C13-F006447B178C},100,FALSE,TRUE, ,DateTime,8, , 
+System.RecordedTV.ProgramDescription,{6D748DE2-8D38-4CC3-AC60-F009B057C557},3,TRUE,TRUE, ,String,2048, , 
+System.RecordedTV.RecordingTime,{A5477F61-7A82-4ECA-9DDE-98B69B2479B3},100,FALSE,TRUE, ,DateTime,8, , 
+System.RecordedTV.StationCallSign,{6D748DE2-8D38-4CC3-AC60-F009B057C557},5,TRUE,TRUE, ,String,512, ,"Example: ""TOONP"""
+System.RecordedTV.StationName,{1B5439E7-EBA1-4AF8-BDD7-7AF1D4549493},100,TRUE,TRUE, ,String,512, , 
+# LEGACY ??? as a propid, I suppose it means something but what???
+#System.SDID,{B725F130-47EF-101A-A5F1-02608C9EEBAC},LEGACY,FALSE,TRUE, ,UInt32,4, ,Internal MSSearch Security Descriptor ID
+System.Search.AccessCount,{0B63E350-9CCC-11D0-BCDB-00805FCCCE04},9,FALSE,TRUE, ,UInt32,4, ,The number of times that the Windows Search Gatherer process pushed properties of this document to the Windows Search Gatherer Plugins.
+System.Search.AutoSummary,{560C36C0-503A-11CF-BAA1-00004C752A9A},2,FALSE,TRUE,NotIndexed,String,2048, ,General Summary of the document.
+System.Search.ContainerHash,{BCEEE283-35DF-4D53-826A-F36A3EEFC6BE},100,TRUE,FALSE, ,String,512, ,Hash code used to identify attachments to be deleted based on a common container URL.
+System.Search.Contents,{B725F130-47EF-101A-A5F1-02608C9EEBAC},19,TRUE,FALSE, ,String,512, ,The contents of the item. This property is for query restrictions only; it cannot be retrieved in a query result. The WSS friendly name is 'contents'.
+System.Search.EntryID,{49691C90-7E17-101A-A91C-08002B2ECDA9},5,FALSE,TRUE,NotIndexed,Int32,4, ,"The entry ID for an item within a given catalog in the Windows Search Index. This value may be recycled, and therefore is not considered unique over time."
+System.Search.GatherTime,{0B63E350-9CCC-11D0-BCDB-00805FCCCE04},8,FALSE,TRUE, ,DateTime,8, ,The Datetime that the Windows Search Gatherer process last pushed properties of this document to the Windows Search Gatherer Plugins.
+System.Search.HitCount,{49691C90-7E17-101A-A91C-08002B2ECDA9},4,FALSE,TRUE,NotIndexed,Int32,4, ,"When using CONTAINS over the Windows Search Index, this is the number of matches of the term. If there are multiple CONTAINS, an AND computes the min number of hits and an OR the max number of hits."
+System.Search.LastIndexedTotalTime,{0B63E350-9CCC-11D0-BCDB-00805FCCCE04},11,FALSE,TRUE, ,Double,8, ,The total time in seconds taken to index this document the last time it was indexed.
+System.Search.Rank,{49691C90-7E17-101A-A91C-08002B2ECDA9},3,FALSE,TRUE,NotIndexed,Int32,4, ,Relevance rank of row. Ranges from 0-1000. Larger numbers = better matches. Query-time only.
+System.Search.ReverseFileName,{49691C90-7E17-101A-A91C-08002B2ECDA9},8,TRUE,TRUE, ,String,520, ,Reverse of the FileName from Query propset.
+System.Search.Store,{A06992B3-8CAF-4ED7-A547-B259E32AC9FC},100,TRUE,TRUE, ,String,512, ,"The identifier for the protocol handler that produced this item. (E.g. MAPI, CSC, FILE etc.)"
+System.Sensitivity,{F8D3F6AC-4874-42CB-BE59-AB454B30716A},100,FALSE,TRUE, ,UInt16,2, ,"name=""Normal"" value=""0"" text=""Normal"" name=""Personal"" value=""1"" text=""Personal"" name=""Private"" value=""2"" text=""Private"" name=""Confidential"" value=""3"" text=""Confidential"""
+System.SensitivityText,{D0C7F054-3F72-4725-8527-129A577CB269},100,TRUE,TRUE, ,String,512, ,This is the user-friendly form of System.Sensitivity. Not intended to be parsed programmatically.
+System.SFGAOFlags,{28636AA6-953D-11D2-B5D6-00C04FD918D0},25,FALSE,TRUE, ,UInt32,4, ,"IShellFolder::GetAttributesOf flags, with SFGAO_PKEYSFGAOMASK attributes masked out."
+System.Shell.OmitFromView,{DE35258C-C695-4CBC-B982-38B0AD24CED0},2,TRUE,TRUE, ,String,512, ,Set this to a string value of 'True' to omit this item from shell views
+System.Shell.SFGAOFlagsStrings,{D6942081-D53B-443D-AD47-5E059D9CD27A},2,TRUE,FALSE, ,String,512,TRUE,"Expresses the SFGAO flags as string values and is used as a query optimization.name=""FileSys"" value=""filesys"" name=""FileSysAncestor"" value=""fileanc"" name=""StorageAncestor"" value=""storageanc""name=""Stream"" value=""stream"" name=""Link"" value=""link"" name=""Hidden"" value=""hidden"" name=""Superhidden"" value=""superhiddenname=""Folder"" value=""folder"" name=""NonEnumerated"" value=""nonenum"" name=""Browsable"" value=""browsable"" "
+System.Size,{B725F130-47EF-101A-A5F1-02608C9EEBAC},12,FALSE,TRUE, ,UInt64,8, ,"name=""Empty"" minValue=""0"" setValue=""0"" text=""Empty (0 KB)"" name=""Tiny"" minValue=""1"" setValue=""1"" text=""Tiny (0 - 10 KB)"" dname=""Small"" minValue=""10241"" setValue=""10241"" text=""Small (10 - 100 KB)"" name=""Medium"" minValue=""102401"" setValue=""102401"" text=""Medium (100 KB - 1 MB)""name=""Large"" minValue=""1048577"" setValue=""1048577"" text=""Large (1 - 16 MB)"" name=""Huge"" minValue=""16777217"" setValue=""16777217"" text=""Huge (16 - 128 MB)"" name=""Gigantic"" minValue=""134217729"" setValue=""134217729"" text=""Gigantic (>128 MB)"" "
+System.Software.DateLastUsed,{841E4F90-FF59-4D16-8947-E81BBFFAB36D},16,TRUE,TRUE, ,DateTime,8, , 
+System.Software.ProductName,{0CEF7D53-FA64-11D1-A203-0000F81FEDEE},7,TRUE,FALSE, ,String,512, , 
+System.Software.ProductVersion,{0CEF7D53-FA64-11D1-A203-0000F81FEDEE},8,TRUE,FALSE, ,String,512, , 
+System.SoftwareUsed,{14B81DA1-0135-4D31-96D9-6CBFC9671A99},305,TRUE,TRUE, ,String,512, , 
+System.SourceItem,{668CDFA5-7A1B-4323-AE4B-E527393A1D81},100,TRUE,TRUE, ,String,512, , 
+System.StartDate,{48FD6EC8-8A12-4CDF-A03E-4EC5A511EDDE},100,FALSE,TRUE, ,DateTime,8, , 
+System.Status,{000214A1-0000-0000-C000-000000000046},9,TRUE,TRUE, ,String,512, , 
+System.Subject,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},3,TRUE,TRUE, ,String,520, , 
+System.Task.BillingInformation,{D37D52C6-261C-4303-82B3-08B926AC6F12},100,TRUE,FALSE, ,String,512, , 
+System.Task.CompletionStatus,{084D8A0A-E6D5-40DE-BF1F-C8820E7C877C},100,TRUE,TRUE, ,String,512, , 
+System.Task.Owner,{08C7CC5F-60F2-4494-AD75-55E3E0B5ADD0},100,TRUE,TRUE, ,String,256, , 
+System.ThumbnailCacheId,{446D16B1-8DAD-4870-A748-402EA43D788C},100,FALSE,TRUE, ,UInt64,8, ,"Unique value that can be used as a key to cache thumbnails. The value changes when the name, volume, or data modified of an item changes."
+System.Title,{F29F85E0-4FF9-1068-AB91-08002B27B3D9},2,TRUE,TRUE, ,String,520, , 
+System.Video.Compression,{64440491-4C8B-11D1-8B70-080036B11A03},10,TRUE,TRUE, ,String,512, ,"Indicates the level of compression for the video stream. ""Compression""."
+System.Video.Director,{64440492-4C8B-11D1-8B70-080036B11A03},20,TRUE,TRUE, ,String,256,TRUE, 
+System.Video.EncodingBitrate,{64440491-4C8B-11D1-8B70-080036B11A03},8,FALSE,TRUE, ,UInt32,4, ,"Indicates the data rate in ""bits per second"" for the video stream. ""DataRate""."
+System.Video.FourCC,{64440491-4C8B-11D1-8B70-080036B11A03},44,FALSE,TRUE, ,UInt32,4, ,Indicates the 4CC for the video stream.
+System.Video.FrameHeight,{64440491-4C8B-11D1-8B70-080036B11A03},4,FALSE,TRUE, ,UInt32,4, ,Indicates the frame height for the video stream.
+System.Video.FrameRate,{64440491-4C8B-11D1-8B70-080036B11A03},6,FALSE,TRUE, ,UInt32,4, ,"Indicates the frame rate in ""frames per millisecond"" for the video stream."
+System.Video.FrameWidth,{64440491-4C8B-11D1-8B70-080036B11A03},3,FALSE,TRUE, ,UInt32,4, ,Indicates the frame width for the video stream.
+System.Video.HorizontalAspectRatio,{64440491-4C8B-11D1-8B70-080036B11A03},42,FALSE,TRUE, ,UInt32,4, ,"Indicates the horizontal portion of the aspect ratio. The X portion of XX:YY, like 16:9."
+System.Video.SampleSize,{64440491-4C8B-11D1-8B70-080036B11A03},9,FALSE,TRUE, ,UInt32,4, ,"Indicates the sample size in bits for the video stream. ""SampleSize""."
+System.Video.StreamName,{64440491-4C8B-11D1-8B70-080036B11A03},2,TRUE,TRUE, ,String,512, ,Indicates the name for the video stream.
+System.Video.TotalBitrate,{64440491-4C8B-11D1-8B70-080036B11A03},43,FALSE,TRUE, ,UInt32,4, ,"Indicates the total data rate in ""bits per second"" for all video and audio streams."
+System.Video.VerticalAspectRatio,{64440491-4C8B-11D1-8B70-080036B11A03},45,FALSE,TRUE, ,UInt32,4, ,Indicates the vertical portion of the aspect ratio. The Y portion of XX:YY.
diff --git a/librpc/wsp/extra-props.csv b/librpc/wsp/extra-props.csv
new file mode 100644
index 0000000..d26238b
--- /dev/null
+++ b/librpc/wsp/extra-props.csv
@@ -0,0 +1,63 @@
+# Unix SMB/CIFS implementation.
+#
+# WSP property definitions
+#
+# Copyright (C) Noel Power
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+DBPROP_CI_CATALOG_NAME,{a9bd1526-6a80-11d0-8c9d-0020af1d740e},2,FALSE,FALSE,,String,,,
+DBPROP_CI_INCLUDE_SCOPES,{a9bd1526-6a80-11d0-8c9d-0020af1d740e},3,FALSE,FALSE,,String,,TRUE,
+DBPROP_CI_SCOPE_FLAGS,{a9bd1526-6a80-11d0-8c9d-0020af1d740e},4,FALSE,FALSE,,Int32,,TRUE,
+DBPROP_CI_QUERY_TYPE,{a9bd1526-6a80-11d0-8c9d-0020af1d740e},7,FALSE,FALSE,,Int32,,,
+DBPROP_USECONTENTINDEX,{a7ac77ed-f8d7-11ce-a798-0020f8008025},2,FALSE,FALSE,,Boolean,,,
+DBPROP_DEFERNONINDEXEDTRIMMING,{a7ac77ed-f8d7-11ce-a798-0020f8008025},3,FALSE,FALSE,,Boolean,,,
+DBPROP_USEEXTENDEDDBTYPES,{a7ac77ed-f8d7-11ce-a798-0020f8008025},4,FALSE,FALSE,,Boolean,,,
+DBPROP_IGNORENOISEONLYCLAUSES,{a7ac77ed-f8d7-11ce-a798-0020f8008025},5,FALSE,FALSE,,Boolean,,,
+DBPROP_GENERICOPTIONS_STRING,{a7ac77ed-f8d7-11ce-a798-0020f8008025},6,FALSE,FALSE,,BString,,,
+DBPROP_FIRSTROWS,{a7ac77ed-f8d7-11ce-a798-0020f8008025},7,FALSE,FALSE,,Boolean,,,
+DBPROP_DEFERCATALOGVERIFICATION,{a7ac77ed-f8d7-11ce-a798-0020f8008025},8,FALSE,FALSE,,Boolean,,,
+DBPROP_GENERATEPARSETREE,{a7ac77ed-f8d7-11ce-a798-0020f8008025},10,FALSE,FALSE,,Boolean,,,
+DBPROP_FREETEXTANYTERM,{a7ac77ed-f8d7-11ce-a798-0020f8008025},12,FALSE,FALSE,,Boolean,,,
+DBPROP_FREETEXTUSESTEMMING,{a7ac77ed-f8d7-11ce-a798-0020f8008025},13,FALSE,FALSE,,Boolean,,,
+DBPROP_IGNORESBRI,{a7ac77ed-f8d7-11ce-a798-0020f8008025},14,FALSE,FALSE,,Boolean,,,
+DBPROP_ENABLEROWSETEVENTS,{a7ac77ed-f8d7-11ce-a798-0020f8008025},16,FALSE,FALSE,,Boolean,,,
+DBPROP_MACHINE,{afafaca5-b5d1-11d0-8c62-00c04fc2db8d},2,FALSE,FALSE,,BString,,,
+DBPROP_CLIENT_CLSID,{afafaca5-b5d1-11d0-8c62-00c04fc2db8d},3,FALSE,FALSE,,GUID,,,
+MSIDXSPROP_ROWSETQUERYSTATUS,{aa6ee6b0-e828-11d0-b23e-00aa0047fc01},2,FALSE,FALSE,,Int32,,,
+MSIDXSPROP_COMMAND_LOCALE_STRING,{aa6ee6b0-e828-11d0-b23e-00aa0047fc01},3,FALSE,FALSE,,BString,,,
+MSIDXSPROP_QUERY_RESTRICTION,{aa6ee6b0-e828-11d0-b23e-00aa0047fc01},4,FALSE,FALSE,,BString,,,
+MSIDXSPROP_PARSE_TREE,{aa6ee6b0-e828-11d0-b23e-00aa0047fc01},5,FALSE,FALSE,,BString,,,
+MSIDXSPROP_MAX_RANK,{aa6ee6b0-e828-11d0-b23e-00aa0047fc01},6,FALSE,FALSE,,Int32,,,
+MSIDXSPROP_RESULTS_FOUND,{aa6ee6b0-e828-11d0-b23e-00aa0047fc01},7,FALSE,FALSE,,Int32,,,
+ClassId,{b725f130-47ef-101a-a5f1-02608c9eebac},3,FALSE,FALSE,,GUID,,,
+FileIndex,{b725f130-47ef-101a-a5f1-02608c9eebac},8,FALSE,FALSE,,UInt64,,,
+USN,{b725f130-47ef-101a-a5f1-02608c9eebac},9,FALSE,FALSE,,Int64,,,
+Path,{b725f130-47ef-101a-a5f1-02608c9eebac},11,FALSE,FALSE,,String,,,
+AllocSize,{b725f130-47ef-101a-a5f1-02608c9eebac},18,FALSE,FALSE,,Int64,,,
+ShortFilename,{b725f130-47ef-101a-a5f1-02608c9eebac},20,FALSE,FALSE,,String,,,
+Scope,{b725f130-47ef-101a-a5f1-02608c9eebac},22,FALSE,FALSE,,String,,,
+DocTemplate,{f29f85e0-4ff9-1068-ab91-08002b27b3d9},7,FALSE,FALSE,,String,,,
+#NOTE!! DocThumbnail is reported as VT_CF (we know nothing about this type???)
+# so for the moment just say its a blob (so we at least generate a name for the property)
+DocThumbnail,{f29f85e0-4ff9-1068-ab91-08002b27b3d9},17,FALSE,FALSE,,Buffer,,,
+RankVector,{49691c90-7e17-101a-a91c-08002b2ecda9},2,FALSE,FALSE,,UInt32,,TRUE,
+All,{49691c90-7e17-101a-a91c-08002b2ecda9},6,FALSE,FALSE,,String,,,
+System.Search.RowID,{49691c90-7e17-101a-a91c-08002b2ecda9},15,FALSE,FALSE,,Int32,,,
+#PercivedType, FileCount & TotalFileSize are defined by gregors wireshark wip
+PercivedType,{28636aa6-953d-11d2-b5d6-00c04fd918d0},9,FALSE,FALSE,,Int32,,,
+FileCount,{28636aa6-953d-11d2-b5d6-00c04fd918d0},12,FALSE,FALSE,,UInt64,,,
+TotalFileSize,{28636aa6-953d-11d2-b5d6-00c04fd918d0},14,FALSE,FALSE,,UInt64,,,
+DocNoteCount,{d5cdd502-2e9c-101b-9397-08002b2cf9ae},8,FALSE,FALSE,,Int32,,,
+DocPartTitles,{d5cdd502-2e9c-101b-9397-08002b2cf9ae},13,FALSE,FALSE,,String,,TRUE,
diff --git a/librpc/wsp/wsp_helper.c b/librpc/wsp/wsp_helper.c
new file mode 100644
index 0000000..5e95c40
--- /dev/null
+++ b/librpc/wsp/wsp_helper.c
@@ -0,0 +1,40 @@
+/*
+ * Unix SMB/CIFS implementation.
+ *
+ * Window Search Service
+ *
+ * Copyright (c) Noel Power
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+#include "includes.h"
+#include "librpc/wsp/wsp_helper.h"
+#include "librpc/gen_ndr/ndr_wsp.h"
+
+uint32_t calc_array_size(struct safearraybound *bounds, uint32_t ndims)
+{
+ uint32_t i;
+ uint32_t result = 0;
+
+ for(i = 0; i < ndims; i++) {
+ uint32_t celements = bounds[i].celements;
+ if (i) {
+ SMB_ASSERT((result > UINT32_MAX / celements) == false);
+ result = result * celements;
+ } else {
+ result = celements;
+ }
+ }
+ return result;
+}
diff --git a/librpc/wsp/wsp_helper.h b/librpc/wsp/wsp_helper.h
new file mode 100644
index 0000000..7d1fc3e
--- /dev/null
+++ b/librpc/wsp/wsp_helper.h
@@ -0,0 +1,28 @@
+/*
+ * Unix SMB/CIFS implementation.
+ *
+ * Window Search Service
+ *
+ * Copyright (c) Noel Power
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef __LIBRPC_WSP_HELPER_H__
+#define __LIBRPC_WSP_HELPER_H__
+
+struct safearraybound;
+
+uint32_t calc_array_size(struct safearraybound *bounds, uint32_t ndims);
+
+#endif /* __LIBRPC_WSP_HELPER_H__ */
diff --git a/librpc/wsp/wsp_util.c b/librpc/wsp/wsp_util.c
new file mode 100644
index 0000000..fae6e0b
--- /dev/null
+++ b/librpc/wsp/wsp_util.c
@@ -0,0 +1,919 @@
+/*
+ * Unix SMB/CIFS implementation.
+ *
+ * Window Search Service
+ *
+ * Copyright (c) Noel Power
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+#include "includes.h"
+#include "librpc/wsp/wsp_util.h"
+#include "librpc/gen_ndr/wsp.h"
+#include "librpc/gen_ndr/ndr_wsp.h"
+#include "lib/util/strv_util.h"
+#include "lib/util/strv.h"
+#include "lib/util/util_str_hex.h"
+#include "source3/param/param_proto.h"
+#include "lib/util/dlinklist.h"
+
+#define BUFFER_SIZE 1024000
+struct guidtopropmap_holder
+{
+ struct guidtopropmap *guidtopropmaploc;
+};
+
+struct full_propset_info_list {
+ struct full_propset_info_list *prev, *next;
+ struct full_propset_info info;
+};
+
+struct guidtopropmap {
+ struct guidtopropmap *prev, *next;
+ struct GUID guid;
+ struct full_propset_info_list *propset;
+};
+
+static struct guidtopropmap *find_guid_props(
+ struct guidtopropmap_holder *holder,
+ const struct GUID *guid)
+{
+ struct guidtopropmap *mapitem;
+ for (mapitem = holder->guidtopropmaploc; mapitem; mapitem = mapitem->next) {
+ if (GUID_equal(guid, &mapitem->guid)) {
+ return mapitem;
+ }
+ }
+ return NULL;
+}
+
+static bool getbool(char *str)
+{
+ char *cpy = talloc_strdup(NULL, str);
+ bool result;
+
+ trim_string(cpy, " ", " ");
+ if (strequal("TRUE", cpy)) {
+ result = true;
+ } else {
+ result = false;
+ }
+ TALLOC_FREE(cpy);
+ return result;
+}
+
+struct {
+ const char* typename;
+ uint16_t type;
+} vtype_map[] = {
+ {"GUID", VT_CLSID},
+ {"String", VT_LPWSTR},
+ {"BString", VT_BSTR},
+ {"Double", VT_R8},
+ {"Buffer", VT_BLOB_OBJECT},
+ {"Byte", VT_UI1},
+ {"UInt64", VT_UI8},
+ {"Int64", VT_I8},
+ {"UInt32", VT_UI4},
+ {"Int32", VT_I4},
+ {"UInt16", VT_UI2},
+ {"Int16", VT_I2},
+ {"DateTime", VT_FILETIME},
+ {"Boolean", VT_BOOL}
+};
+
+static uint16_t getvtype(char *str, bool isvec)
+{
+ uint16_t result = UINT16_MAX;
+ int i;
+ for (i = 0; i < ARRAY_SIZE(vtype_map); i++) {
+ if (strequal(vtype_map[i].typename, str)) {
+ result = vtype_map[i].type;
+ if (isvec) {
+ result |= VT_VECTOR;
+ }
+ break;
+ }
+ }
+ return result;
+}
+
+static bool parse_csv_line(TALLOC_CTX *ctx,
+ char **csvs, size_t num_values,
+ struct guidtopropmap_holder *propmap_holder)
+{
+ struct guidtopropmap *mapitem = NULL;
+ struct full_propset_info_list *item = NULL;
+
+ char *guid_str = NULL;
+ struct GUID guid;
+ bool ok;
+
+ item = talloc_zero(ctx,
+ struct full_propset_info_list);
+ if (!item) {
+ return false;
+ }
+
+ item->info.in_inverted_index = false;
+ item->info.is_column = true;
+ item->info.can_col_be_indexed = true;
+
+ if (strlen(csvs[1])) {
+ guid_str = talloc_strdup(ctx, csvs[1]);
+ }
+
+ if (!guid_str) {
+ DBG_ERR("out of memory\n");
+ return false;
+ }
+
+ if (!trim_string(guid_str, "{", "}")) {
+ return false;
+ }
+
+ if (strlen(csvs[0])) {
+ char *tmp = talloc_strdup(item, csvs[0]);
+ trim_string(tmp, " ", " ");
+ item->info.name = tmp;
+ }
+
+ if (strlen(csvs[2])) {
+ item->info.id = atoi(csvs[2]);
+ }
+
+ if (strlen(csvs[3])) {
+ item->info.in_inverted_index = getbool(csvs[3]);
+ }
+
+ if (strlen(csvs[4])) {
+ item->info.is_column = getbool(csvs[4]);
+ }
+
+ if (strlen(csvs[5])) {
+ item->info.can_col_be_indexed = getbool(csvs[5]);
+ }
+
+ if (strlen(csvs[6])) {
+ bool isvec = false;
+ uint16_t type;
+ if (strlen(csvs[0])) {
+ isvec = getbool(csvs[8]);
+ }
+ type = getvtype(csvs[6], isvec);
+ if (type == UINT16_MAX) {
+ DBG_ERR("failed to parse type\n");
+ return false;
+ }
+ item->info.vtype = type;
+ }
+
+ ok = parse_guid_string(guid_str, &guid);
+ if (!ok) {
+ return false;
+ }
+
+ mapitem = find_guid_props(propmap_holder, &guid);
+ if (!mapitem) {
+ mapitem = talloc_zero(propmap_holder,
+ struct guidtopropmap);
+ if (!mapitem) {
+ return false;
+ }
+ mapitem->guid = guid;
+ DLIST_ADD_END(propmap_holder->guidtopropmaploc, mapitem);
+ }
+
+ talloc_steal(mapitem, item);
+ DLIST_ADD_END(mapitem->propset, item);
+ return true;
+}
+
+static bool parse_properties_line(TALLOC_CTX *ctx,
+ const char* line,
+ struct guidtopropmap_holder *propmap_holder)
+{
+ int ret;
+ int pos;
+ char* strv = NULL;
+ char** csv_line = NULL;
+ char* t = NULL;
+ size_t len;
+
+ ret = strv_split(ctx,
+ &strv,
+ line,
+ ",");
+
+ if (ret != 0) {
+ DBG_ERR("failed to split line\n");
+ return false;
+ }
+
+ len = strv_count(strv);
+
+ if (len < 9) {
+ DBG_WARNING("skipping line as it doesn't have "
+ "enough fields\n");
+ return true;
+ }
+
+ csv_line = talloc_zero_array(ctx,
+ char *,
+ len);
+
+ if (!csv_line) {
+ DBG_ERR("out of memory\n");
+ return false;
+ }
+ for (pos = 0; pos < talloc_array_length(csv_line); pos++) {
+ t = strv_next(strv, t);
+ /* the scraped property file can have a non ascii char */
+ if (strlen(t) == 1 && *t == 0xa0) {
+ csv_line[pos] = talloc_strdup(csv_line,
+ "");
+ } else {
+ csv_line[pos] = talloc_strdup(csv_line,
+ t);
+ }
+ trim_string(csv_line[pos], " ", " ");
+ }
+
+ if (!parse_csv_line(csv_line, csv_line, len, propmap_holder)) {
+ DBG_ERR("failed to parse line\n");
+ TALLOC_FREE(csv_line);
+ return false;
+ }
+ TALLOC_FREE(csv_line);
+ return true;
+}
+
+static bool parse_properties_csvfile(TALLOC_CTX *ctx,
+ struct guidtopropmap_holder *propmap_holder,
+ const char* filename)
+{
+ char **lines = NULL;
+ int numlines;
+ int i;
+
+ if (filename == NULL || strlen(filename) == 0) {
+ return false;
+ }
+
+ lines = file_lines_load(filename,
+ &numlines,
+ BUFFER_SIZE,
+ ctx);
+ if (!lines) {
+ DBG_ERR("Failed to load %s\n", filename);
+ return false;
+ }
+ DBG_ERR("parsed %d lines\n", numlines);
+
+ for (i = 0; i < numlines; i++) {
+ TALLOC_CTX *line_ctx = talloc_init("line context");
+ if (!line_ctx) {
+ DBG_ERR("out of memory\n");
+ return false;
+ }
+
+ trim_string(lines[i], " ", " ");
+ if (lines[i][0] == '#') {
+ DBG_WARNING("skipping comment at line %d.\n)", i);
+ TALLOC_FREE(line_ctx);
+ continue;
+ }
+
+ if (!parse_properties_line(line_ctx,
+ lines[i],
+ propmap_holder)) {
+ DBG_ERR("Failed to parse line %d\n", i);
+ }
+ TALLOC_FREE(line_ctx);
+ }
+ return true;
+}
+
+static bool populate_map(struct guidtopropmap_holder *propmap_holder)
+{
+ const char * path = NULL;
+ path = lp_wsp_property_file();
+
+ /* first populate the map from property file */
+ if (path) {
+ parse_properties_csvfile(propmap_holder, propmap_holder, path);
+ }
+
+ return true;
+}
+
+static struct guidtopropmap_holder *propmap(void)
+{
+ static struct guidtopropmap_holder *holder = NULL;
+
+ if (!holder) {
+ holder = talloc_zero(NULL, struct guidtopropmap_holder);
+ if (holder) {
+ populate_map(holder);
+ }
+ }
+
+ return holder;
+}
+
+const struct full_propset_info *get_propset_info_with_guid(
+ const char *prop_name,
+ struct GUID *propset_guid)
+{
+ const struct full_propset_info *result = NULL;
+ struct guidtopropmap_holder *holder = NULL;
+ struct guidtopropmap *mapitem = NULL;
+
+ size_t i;
+ const struct full_guid_propset *guid_propset = NULL;
+
+ /* search builtin props first */
+ for (i = 0; full_propertyset[i].prop_info != NULL; i++) {
+ const struct full_propset_info *item = NULL;
+ guid_propset = &full_propertyset[i];
+ item = guid_propset->prop_info;
+ while (item->id) {
+ if (strequal(prop_name, item->name)) {
+ *propset_guid = guid_propset->guid;
+ result = item;
+ break;
+ }
+ item++;
+ }
+ if (result) {
+ break;
+ }
+ }
+
+ if (result) {
+ return result;
+ }
+
+ /* if we didn't find a match in builtin props try the extra props */
+ holder = propmap();
+ for (mapitem = holder->guidtopropmaploc; mapitem;
+ mapitem = mapitem->next) {
+ struct full_propset_info_list *propitem;
+ for (propitem = mapitem->propset; propitem;
+ propitem = propitem->next) {
+ if (strequal(prop_name, propitem->info.name)) {
+ *propset_guid = mapitem->guid;
+ result = &propitem->info;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+const struct full_propset_info *get_prop_info(const char *prop_name)
+{
+ const struct full_propset_info *result = NULL;
+ struct GUID guid;
+ result = get_propset_info_with_guid(prop_name, &guid);
+ return result;
+}
+
+char *prop_from_fullprop(TALLOC_CTX *ctx, struct wsp_cfullpropspec *fullprop)
+{
+ size_t i;
+ char *result = NULL;
+ const struct full_propset_info *item = NULL;
+ const struct full_propset_info_list *prop_item = NULL;
+ bool search_by_id = (fullprop->ulkind == PRSPEC_PROPID);
+ struct guidtopropmap_holder *holder = NULL;
+ struct guidtopropmap *mapitem = NULL;
+
+ /* check builtin properties */
+ for (i = 0; full_propertyset[i].prop_info != NULL; i++) {
+ /* find propset */
+ if (GUID_equal(&fullprop->guidpropset,
+ &full_propertyset[i].guid)) {
+ item = full_propertyset[i].prop_info;
+ break;
+ }
+ }
+ if (item) {
+ while (item->id) {
+ if (search_by_id) {
+ if( fullprop->name_or_id.prspec == item->id) {
+ result = talloc_strdup(ctx, item->name);
+ break;
+ }
+ } else if (strcmp(item->name,
+ fullprop->name_or_id.propname.vstring)
+ == 0) {
+ result = talloc_strdup(ctx, item->name);
+ break;
+ }
+ item++;
+ }
+ }
+
+ /* not found, search the extra props */
+ if (!result) {
+ holder = propmap();
+
+ for (mapitem = holder->guidtopropmaploc; mapitem;
+ mapitem = mapitem->next) {
+ if (GUID_equal(&fullprop->guidpropset,
+ &mapitem->guid)) {
+ prop_item = mapitem->propset;
+ break;
+ }
+ }
+
+ for (;prop_item; prop_item = prop_item->next) {
+ if (search_by_id) {
+ if(fullprop->name_or_id.prspec ==
+ prop_item->info.id) {
+ result = talloc_strdup(ctx,
+ prop_item->info.name);
+ break;
+ }
+ } else if (strcmp(prop_item->info.name,
+ fullprop->name_or_id.propname.vstring) == 0) {
+ result = talloc_strdup(ctx,
+ prop_item->info.name);
+ break;
+ }
+ }
+ }
+
+ if (!result) {
+ result = GUID_string(ctx, &fullprop->guidpropset);
+
+ if (search_by_id) {
+ result = talloc_asprintf(result, "%s/%d", result,
+ fullprop->name_or_id.prspec);
+ } else {
+ result = talloc_asprintf(result, "%s/%s", result,
+ fullprop->name_or_id.propname.vstring);
+ }
+ }
+ return result;
+}
+
+const char *genmeth_to_string(uint32_t genmethod)
+{
+ const char *result = NULL;
+ switch (genmethod) {
+ case 0:
+ result = "equals";
+ break;
+ case 1:
+ result = "starts with";
+ break;
+ case 2:
+ result = "matches inflection";
+ break;
+ default:
+ result = NULL;
+ break;
+ }
+ return result;
+}
+
+bool is_operator(struct wsp_crestriction *restriction) {
+ bool result;
+ switch(restriction->ultype) {
+ case RTAND:
+ case RTOR:
+ case RTNOT:
+ result = true;
+ break;
+ default:
+ result = false;
+ break;
+ }
+ return result;
+}
+
+const char *op_as_string(struct wsp_crestriction *restriction)
+{
+ const char *op = NULL;
+ if (is_operator(restriction)) {
+ switch(restriction->ultype) {
+ case RTAND:
+ op = " && ";
+ break;
+ case RTOR:
+ op = " || ";
+ break;
+ case RTNOT:
+ op = "!";
+ break;
+ }
+ } else if (restriction->ultype == RTPROPERTY) {
+ struct wsp_cpropertyrestriction *prop_restr =
+ &restriction->restriction.cpropertyrestriction;
+ switch (prop_restr->relop & 0XF) {
+ case PREQ:
+ op = "=";
+ break;
+ case PRNE:
+ op = "!=";
+ break;
+ case PRGE:
+ op = ">=";
+ break;
+ case PRLE:
+ op = "<=";
+ break;
+ case PRLT:
+ op = "<";
+ break;
+ case PRGT:
+ op = ">";
+ break;
+ default:
+ break;
+ }
+ } else if (restriction->ultype == RTCONTENT) {
+ struct wsp_ccontentrestriction *content = NULL;
+ content = &restriction->restriction.ccontentrestriction;
+ op = genmeth_to_string(content->ulgeneratemethod);
+ } else if (restriction->ultype == RTNATLANGUAGE) {
+ op = "=";
+ }
+ return op;
+}
+
+struct wsp_cfullpropspec *get_full_prop(struct wsp_crestriction *restriction)
+{
+ struct wsp_cfullpropspec *result;
+ switch (restriction->ultype) {
+ case RTPROPERTY:
+ result = &restriction->restriction.cpropertyrestriction.property;
+ break;
+ case RTCONTENT:
+ result = &restriction->restriction.ccontentrestriction.property;
+ break;
+ case RTNATLANGUAGE:
+ result = &restriction->restriction.cnatlanguagerestriction.property;
+ break;
+ default:
+ result = NULL;
+ break;
+ }
+ return result;
+}
+
+const char *variant_as_string(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *value, bool quote)
+{
+ const char* result = NULL;
+ switch(value->vtype) {
+ case VT_UI1:
+ result = talloc_asprintf(ctx, "%u",
+ value->vvalue.vt_ui1);
+ break;
+ case VT_INT:
+ case VT_I4:
+ result = talloc_asprintf(ctx, "%d",
+ value->vvalue.vt_i4);
+ break;
+ case VT_ERROR:
+ case VT_UINT:
+ case VT_UI4:
+ result = talloc_asprintf(ctx, "%u",
+ value->vvalue.vt_ui4);
+ break;
+ case VT_UI2:
+ case VT_I2:
+ result = talloc_asprintf(ctx, "%u",
+ value->vvalue.vt_ui2);
+ break;
+ case VT_BOOL:
+ result = talloc_asprintf(ctx, "%s",
+ value->vvalue.vt_ui2 == 0xFFFF ?
+ "true" : "false");
+ break;
+ case VT_DATE:
+ case VT_FILETIME: {
+ NTTIME filetime = value->vvalue.vt_ui8;
+ time_t unixtime;
+ struct tm *tm = NULL;
+ char datestring[256];
+ unixtime = nt_time_to_unix(filetime);
+ tm = gmtime(&unixtime);
+ strftime(datestring, sizeof(datestring), "%FT%TZ", tm);
+ result = talloc_strdup(ctx, datestring);
+ break;
+ }
+ case VT_R4: {
+ float f;
+ if (sizeof(f) != sizeof(value->vvalue.vt_ui4)) {
+ DBG_ERR("can't convert float\n");
+ break;
+ }
+ memcpy((void*)&f,
+ (void*)&value->vvalue.vt_ui4,
+ sizeof(value->vvalue.vt_ui4));
+ result = talloc_asprintf(ctx, "%f",
+ f);
+ break;
+ }
+ case VT_R8: {
+ /* should this really be unsigned ? */
+ double dval;
+ if (sizeof(dval) != sizeof(value->vvalue.vt_i8)) {
+ DBG_ERR("can't convert double\n");
+ break;
+ }
+ memcpy((void*)&dval,
+ (void*)&value->vvalue.vt_i8,
+ sizeof(dval));
+ result = talloc_asprintf(ctx, "%f",
+ dval);
+ break;
+ }
+ case VT_I8: {
+ result = talloc_asprintf(ctx, "%" PRIi64,
+ value->vvalue.vt_i8);
+ break;
+ }
+ case VT_UI8: {
+ result = talloc_asprintf(ctx, "%" PRIu64,
+ value->vvalue.vt_ui8);
+ break;
+ }
+ case VT_LPWSTR:
+ result = talloc_asprintf(ctx, "%s%s%s",
+ quote ? "\'" : "",
+ value->vvalue.vt_lpwstr.value,
+ quote ? "\'" : "");
+ break;
+ case VT_LPWSTR | VT_VECTOR: {
+ int num_elems =
+ value->vvalue.vt_lpwstr_v.vvector_elements;
+ int i;
+ for(i = 0; i < num_elems; i++) {
+ struct vt_lpwstr_vec *vec;
+ const char *val;
+ vec = &value->vvalue.vt_lpwstr_v;
+ val = vec->vvector_data[i].value;
+ result =
+ talloc_asprintf(ctx,
+ "%s%s%s%s%s",
+ result ? result : "",
+ i ? "," : "",
+ quote ? "\'" : "",
+ val,
+ quote ? "\'" : "");
+ }
+ break;
+ }
+ default:
+ DBG_INFO("can't represent unsupported vtype 0x%x as string\n",
+ value->vtype);
+ break;
+ }
+ return result;
+}
+
+static const struct {
+ uint32_t id;
+ const char *name;
+} typename_map[] = {
+ {VT_EMPTY, "Empty"},
+ {VT_NULL, "Null"},
+ {VT_I2, "VT_I2"},
+ {VT_I4, "VT_I4"},
+ {VT_I4, "VT_I4"},
+ {VT_R4, "VT_R4"},
+ {VT_R8, "VT_R8"},
+ {VT_CY, "VT_CY"},
+ {VT_DATE, "VT_DATE"},
+ {VT_BSTR, "VT_BSTR"},
+ {VT_I1, "VT_I1"},
+ {VT_UI1, "VT_UI1"},
+ {VT_UI2, "VT_UI2"},
+ {VT_UI4, "VT_UI4"},
+ {VT_I8, "VT_I8"},
+ {VT_UI8, "VT_UI8"},
+ {VT_INT, "VT_INT"},
+ {VT_UINT, "VT_UINT"},
+ {VT_ERROR, "VT_ERROR"},
+ {VT_BOOL, "VT_BOOL"},
+ {VT_VARIANT, "VT_VARIANT"},
+ {VT_DECIMAL, "VT_DECIMAL"},
+ {VT_FILETIME, "VT_FILETIME"},
+ {VT_BLOB, "VT_BLOB"},
+ {VT_BLOB_OBJECT, "VT_BLOB_OBJECT"},
+ {VT_CLSID, "VT_CLSID"},
+ {VT_LPSTR, "VT_LPSTR"},
+ {VT_LPWSTR, "VT_LPWSTR"},
+ {VT_COMPRESSED_LPWSTR, "VT_COMPRESSED_LPWSTR"},
+};
+
+const char *get_vtype_name(uint32_t type)
+{
+ const char *type_name = NULL;
+ static char result_buf[255];
+ int i;
+ uint32_t temp = type & ~(VT_VECTOR | VT_ARRAY);
+ for (i = 0; i < ARRAY_SIZE(typename_map); i++) {
+ if (temp == typename_map[i].id) {
+ type_name = typename_map[i].name;
+ break;
+ }
+ }
+ if (type & VT_VECTOR) {
+ snprintf(result_buf, sizeof(result_buf), "Vector | %s", type_name);
+ } else if (type & VT_ARRAY) {
+ snprintf(result_buf, sizeof(result_buf), "Array | %s", type_name);
+ } else {
+ snprintf(result_buf, sizeof(result_buf), "%s", type_name);
+ }
+ return result_buf;
+}
+
+bool is_variable_size(uint16_t vtype)
+{
+ bool result;
+ switch(vtype) {
+ case VT_LPWSTR:
+ case VT_COMPRESSED_LPWSTR:
+ case VT_BSTR:
+ case VT_BLOB:
+ case VT_BLOB_OBJECT:
+ case VT_VARIANT:
+ result = true;
+ break;
+ default:
+ result = false;
+ break;
+ }
+ return result;
+}
+
+const char *get_store_status(uint8_t status_byte)
+{
+ const char *result;
+ switch(status_byte) {
+ case 0:
+ result = "StoreStatusOk";
+ break;
+ case 1:
+ result = "StoreStatusDeferred";
+ break;
+ case 2:
+ result = "StoreStatusNull";
+ break;
+ default:
+ result = "Unknown Status";
+ break;
+ }
+ return result;
+}
+
+void set_variant_lpwstr(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *vvalue,
+ const char *string_val)
+{
+ vvalue->vtype = VT_LPWSTR;
+ vvalue->vvalue.vt_lpwstr.value = talloc_strdup(ctx, string_val);
+}
+
+void set_variant_i4(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *vvalue,
+ uint32_t val)
+{
+ vvalue->vtype = VT_I4;
+ vvalue->vvalue.vt_i4 = val;
+}
+
+void set_variant_vt_bool(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *variant,
+ bool bval)
+{
+ variant->vtype = VT_BOOL;
+ variant->vvalue.vt_bool = bval;
+}
+
+static void fill_int32_vec(TALLOC_CTX* ctx,
+ int32_t **pdest,
+ int32_t* ivector, uint32_t elems)
+{
+ int i;
+ int32_t *dest = talloc_zero_array(ctx, int32_t, elems);
+ for ( i = 0; i < elems; i++ ) {
+ dest[ i ] = ivector[ i ];
+ }
+ *pdest = dest;
+}
+
+void set_variant_i4_vector(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *variant,
+ int32_t* ivector, uint32_t elems)
+{
+ variant->vtype = VT_VECTOR | VT_I4;
+ variant->vvalue.vt_i4_vec.vvector_elements = elems;
+ fill_int32_vec(ctx, &variant->vvalue.vt_i4_vec.vvector_data, ivector, elems);
+}
+
+static void fill_string_vec(TALLOC_CTX* ctx,
+ struct wsp_cbasestoragevariant *variant,
+ const char **strings, uint16_t elems)
+{
+ int i;
+ variant->vvalue.vt_lpwstr_v.vvector_elements = elems;
+ variant->vvalue.vt_lpwstr_v.vvector_data = talloc_zero_array(ctx,
+ struct vt_lpwstr,
+ elems);
+
+ for( i = 0; i < elems; i++ ) {
+ variant->vvalue.vt_lpwstr_v.vvector_data[ i ].value = talloc_strdup(ctx, strings[ i ]);
+ }
+}
+
+static void fill_bstr_vec(TALLOC_CTX *ctx,
+ struct vt_bstr **pvector,
+ const char **strings, uint16_t elems)
+{
+ int i;
+ struct vt_bstr *vdata = talloc_zero_array(ctx, struct vt_bstr, elems);
+
+ for( i = 0; i < elems; i++ ) {
+ vdata [ i ].value = talloc_strdup(ctx, strings[ i ]);
+ }
+ *pvector = vdata;
+}
+
+void set_variant_bstr(TALLOC_CTX *ctx, struct wsp_cbasestoragevariant *variant,
+ const char *string_val)
+{
+ variant->vtype = VT_BSTR;
+ variant->vvalue.vt_bstr.value = talloc_strdup(ctx, string_val);
+}
+
+void set_variant_lpwstr_vector(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *variant,
+ const char **string_vals, uint32_t elems)
+{
+ variant->vtype = VT_LPWSTR | VT_VECTOR;
+ fill_string_vec(ctx, variant, string_vals, elems);
+}
+
+void set_variant_array_bstr(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *variant,
+ const char **string_vals, uint16_t elems)
+{
+ variant->vtype = VT_BSTR | VT_ARRAY;
+ variant->vvalue.vt_bstr_array.cdims = 1;
+ variant->vvalue.vt_bstr_array.ffeatures = 0;
+
+ variant->vvalue.vt_bstr_array.rgsabound =
+ talloc_zero_array(ctx, struct safearraybound, 1);
+
+ variant->vvalue.vt_bstr_array.rgsabound[0].celements = elems;
+ variant->vvalue.vt_bstr_array.rgsabound[0].ilbound = 0;
+ variant->vvalue.vt_bstr_array.cbelements = 0;
+ fill_bstr_vec(ctx, &variant->vvalue.vt_bstr_array.vdata,
+ string_vals, elems);
+ /*
+ * if cbelements is the num bytes per elem it kindof means each
+ * string in the array must be the same size ?
+ */
+
+ if (elems >0) {
+ variant->vvalue.vt_bstr_array.cbelements =
+ strlen_m_term(variant->vvalue.vt_bstr_array.vdata[0].value)*2;
+ }
+}
+
+/* create single dim array of vt_i4 */
+void set_variant_array_i4(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *variant,
+ int32_t *vals, uint16_t elems)
+{
+ /* #TODO see if we can combine with other set_variant_array methods */
+ variant->vtype = VT_I4 | VT_ARRAY;
+ variant->vvalue.vt_i4_array.cdims = 1;
+ variant->vvalue.vt_i4_array.ffeatures = 0;
+
+ variant->vvalue.vt_i4_array.rgsabound =
+ talloc_zero_array(ctx, struct safearraybound, 1);
+
+ variant->vvalue.vt_i4_array.rgsabound[0].celements = elems;
+ variant->vvalue.vt_i4_array.rgsabound[0].ilbound = 0;
+ variant->vvalue.vt_i4_array.cbelements = sizeof(uint32_t);
+ fill_int32_vec(ctx, &variant->vvalue.vt_i4_array.vdata, vals, elems);
+}
diff --git a/librpc/wsp/wsp_util.h b/librpc/wsp/wsp_util.h
new file mode 100644
index 0000000..ccda53b
--- /dev/null
+++ b/librpc/wsp/wsp_util.h
@@ -0,0 +1,89 @@
+/*
+ * Unix SMB/CIFS implementation.
+ *
+ * Window Search Service
+ *
+ * Copyright (c) Noel Power
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef __LIBRPC_WSP_UTIL_H__
+#define __LIBRPC_WSP_UTIL_H__
+
+#include "librpc/gen_ndr/misc.h"
+
+struct safearraybound;
+struct wsp_cfullpropspec;
+struct wsp_cbasestoragevariant;
+struct wsp_crestriction;
+
+struct full_propset_info {
+ uint32_t id;
+ const char *name;
+ uint16_t vtype;
+ bool extra_info;
+ bool in_inverted_index;
+ bool is_column;
+ bool can_col_be_indexed;
+ uint16_t max_size;
+};
+
+struct full_guid_propset {
+ struct GUID guid;
+ const struct full_propset_info *prop_info;
+};
+
+extern const struct full_guid_propset full_propertyset[];
+
+char *prop_from_fullprop(TALLOC_CTX *ctx, struct wsp_cfullpropspec *fullprop);
+const struct full_propset_info *get_prop_info(const char *prop_name);
+const struct full_propset_info *get_propset_info_with_guid(
+ const char *prop_name,
+ struct GUID *guid);
+const char * get_vtype_name(uint32_t type);
+bool is_variable_size(uint16_t vtype);
+const char *get_store_status(uint8_t status_byte);
+
+bool is_operator(struct wsp_crestriction *restriction);
+const char *op_as_string(struct wsp_crestriction *restriction);
+const char *genmeth_to_string(uint32_t genmethod);
+const char *variant_as_string(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *value,
+ bool quote);
+void set_variant_lpwstr(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *vvalue,
+ const char *string_val);
+void set_variant_i4(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *vvalue,
+ uint32_t val);
+void set_variant_vt_bool(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *variant,
+ bool bval);
+void set_variant_bstr(TALLOC_CTX *ctx, struct wsp_cbasestoragevariant *variant,
+ const char *string_val);
+void set_variant_lpwstr_vector(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *variant,
+ const char **string_vals, uint32_t elems);
+void set_variant_array_bstr(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *variant,
+ const char **string_vals, uint16_t elems);
+void set_variant_i4_vector(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *variant,
+ int32_t* ivector, uint32_t elems);
+void set_variant_array_i4(TALLOC_CTX *ctx,
+ struct wsp_cbasestoragevariant *variant,
+ int32_t *vals, uint16_t elems);
+
+struct wsp_cfullpropspec *get_full_prop(struct wsp_crestriction *restriction);
+#endif /* __LIBRPC_WSP_UTIL_H__ */