2.2.4.1 Lexical structure

The lexical structure of the FastTransfer stream is essential to let its producers and consumers agree on rules that govern splitting of the stream into sequential buffers retrieved by using the RopFastTransferSourceGetBuffer ROP (section 2.2.3.1.1.5) or supplied through the RopFastTransferDestinationPutBuffer ROP (section 2.2.3.1.2.2). It is also beneficial for an explanation of the protocol, as it separates matters of data serialization and deserialization (lexical analysis) from data and data organization (syntactical analysis), and from its mapping to mailbox concepts (semantics).

The lexical structure of a FastTransfer stream is as follows:

 stream            = 1*element
 element           = marker / propValue
 marker            = PtypInteger32 <from the table in 2.2.4.1.4>
 propValue         = fixedPropType propInfo fixedSizeValue
 propValue         =/ varPropType propInfo length varSizeValue
 propValue         =/ mvPropType 
                         propInfo 
                         length 
                         *( fixedSizeValue / length varSizeValue )
 propInfo          = taggedPropId / ( namedPropId namedPropInfo )
 fixedSizeValue    = PtypInteger16 / PtypInteger32 / PtypFloating32
                     / PtypFloating64 / PtypCurrency / PtypFloatingTime
                     / PtypBoolean / PtypInteger64 / PtypTime
                     / PtypGuid 
 varSizeValue      = PtypString / PtypString8 / PtypServerId 
                     / PtypBinary / PtypObject
  
  
 namedPropInfo     = propertySet 
                      ((%x00 dispid) 
                      / (%x01 name))
 propertySet        = PtypGuid
 dispid             = PtypInteger32
 name               = PtypString
 namedPropId       = propertyId 
                      <Greater or equal to 0x8000>
 propertyId        = PtypInteger16
 taggedPropId       = propertyId 
                      <less than 0x8000>
 length            = PtypInteger32 <MUST be greater than 0>
 propType          = fixedPropType / varPropType / mvPropType
 fixedPropType     = PtypInteger16
 varPropType       = PtypInteger16
 mvPropType        = PtypInteger16

For more details about the fixedPropType, varPropType, and mvPropType property types, see section 2.2.4.1.1.

The lexical structure of the FastTransfer adheres to the following guidelines:

  • Camel-cased names are nonterminal syntactic elements, as specified in [RFC5234] section 2.3.

  • Pascal-cased names with a Ptyp prefix are any value of that type serialized as specified in section 2.2.4.1.3.

A FastTransfer stream can be larger than a single buffer. The server MUST split the stream when it cannot fit into a single buffer. If a split is required, the stream MUST be split either between two atoms or at any point inside a varSizeValue lexeme. A stream MUST NOT be split within a single atom. The lexical structure of an atom is as follows:

 atom               = marker 
                    / propDef 
                    / fixedSizeValue 
                    / length
 propDef            = ( propType propInfo )