The first part of an OPT record is an array of FOPTEs, consisting of ID-value pairs tightly packed:
typedef struct _FOPTE { struct { USHORT pid : 14; // Property ID USHORT fBid : 1; // value is a blip ID – only valid if fComplex is FALSE USHORT fComplex : 1; // complex property, value is length }; ULONG op; // Value } FOPTE;
The FOPTE array is sorted by property ID.
Some property values, such as Unicode strings, don't fit in 32 bits. For these properties, the fComplex bit is set in the FOPTE, and the length of the data is saved in the value slot. The data of the complex properties follows the FOPTE array in the file record (sorted by property ID).
BLIPs are usually saved in the BLIP Store, so, in most cases, BLIP properties just store a BLIP ID (basically an index into an array in the BLIP Store). This is signaled by the fBid flag; note however that this flag is only valid if fComplex is FALSE.
Boolean properties are grouped in bitfields by property set; note that the Boolean properties in each property set below are contiguous. They are saved under the property ID of the last Boolean property in the set, and are placed in the value field in reverse order starting with the last property in the low bit.
Notes on types and units:
The property listings below contain only those properties which are saved in OPT records in the file. Properties which are never saved, or which appear elsewhere in the file format, have been omitted.