none
Recurrence ExtendedException Structure: ChangeHighlight and ReservedBlockEE1 fields RRS feed

  • Question

  • I'm trying to match up what I read in the documentation with what I'm seeing in the actual recurrence property for some Outlook 2007 appointments. According to the documentation:
    "ChangeHighlightSize
    The size of the ChangeHighlightValue and Reserved fields combined.

    ChangeHighlightValue
    The value for the PidLidChangeHighlight property in the Exception Embedded Message Object.

    Reserved
    Reserved.<31>

    ReservedBlockEE1Size
    The size of the ReservedBlockEE1 field that follows. This MUST be 0.

    ReservedBlockEE1 Reserved."
    What I'm actually seeing is:
    00000000 -> 0x00000000
    04000000 -> 0x00000004
    00000000 -> 0x00000000
    00000000 -> 0x00000000
    //Unicode exception data follows

    or

    00000000 -> 0x00000000
    04000000 -> 0x00000004
    03100000 -> 0x00001003
    00000000 -> 0x00000000
    //Unicode exception data follows

    or

    00000000 -> 0x00000000
    04000000 -> 0x00000004
    53000000 -> 0x00000053
    00000000 -> 0x00000000
    //Unicode exception data follows
    My guess is that ChangeHighlightSize only represents the size of the variable reserved field and not the size of ChangeHighlightValue and the variable reserved field, otherwise, I would expect to see a structure that looked more like:
    04000000 -> 0x00000004
    04000000 -> 0x00000004
    00000000 -> 0x00000000
    00000000 -> 0x00000000
    //Unicode exception data follows
    Also, I'm completely confused regarding the value of ReservedBlockEE1Size. Sometimes it has a value and sometimes it does not (values of 0x00000000, 0x00001003, and 0x00000053 shown above). Regardless, it doesn't seem to have anything to do with the size of the data that follows. Can anyone shed some more light on this value?

    Thanks,
    Elrond

    Tuesday, November 4, 2008 6:19 PM

Answers

  • Hi Tom,

    I believe I misinterpreted the data when I looked at the documentation the first time. The error I made was to ignore the ReservedBlock1Size buffer and instead jump directly to the ExtendedException(Variable) section where I treated the ReservedBlock1Size as the ChangeHighlightSize. The correctly translated bits are shown below:

    //RecurrencePattern
    0430    //ReaderVersion
    0430    //WriterVersion
    0B20    //RecurFrequency
    0100    //PatternType
    0000    //CalendarType

    C0210000 //FirstDateTime
    01000000 //Period - Every week
    00000000 //SlidingFlag
    02000000 //PatternTypeSpecific - Monday event

    21200000 //EndType

    2B000000 //OccurrenceCount
    00000000 //FirstDOW

    03000000 //DeletedInstanceCount
    20F9BB0C //DeletedInstanceDates[0]
    E082BD0C //DeletedInstanceDates[1]
    20AABF0C //DeletedInstanceDates[2]

    02000000 //ModifiedInstanceCount
    8088BD0C //ModifiedInstanceDates[0]
    C0AFBF0C //ModifiedInstanceDates[1]

    C0D1BB0C    //StartDate
    8047C20C    //EndDate

    06300000    //ReaderVersion2
    09300000    //WriterVersion2
    76020000    //StartTimeOffset
    B2020000    //EndTimeOffset

    //ExceptionCount
    0200

    //ExceptionInfo
    C98ABD0C
    F68ABD0C
    5685BD0C
    2102
    2400
    2300
    557064617465643A205374616666204D656574696E6720284578656320537461666629
    02000000

    //ExceptionInfo
    36B2BF0C
    72B2BF0C
    96ACBF0C
    2102
    1B00
    1A00
    5374616666204D656574696E6720284578656320537461666629
    02000000

    00000000 //ReservedBlock1Size - 0
    04000000 //ChangeHighlightSize = 4
    00000000 //ChangeHighlightValue = 0
    00000000 //ReservedBlockEE1Size

    C98ABD0C //StartDateTime
    F68ABD0C //EndDateTime
    5685BD0C //OriginalStartDate
    2300     //WideCharSubjectLength
    55007000640061007400650064003A0020005300740061006600660020004D0065006500740069006E0067002000280045007800650063002000530074006100660066002900 //WideCharSubject(Variable)

    00000000 //ReservedBlockEE2Size
    04000000 //ChangeHighlightSize = 4
    53000000 //ChangeHighlightValue = 0x53
    00000000 //ReservedBlockEE1Size

    36B2BF0C //StartDateTime
    72B2BF0C //EndDateTime
    96ACBF0C //OriginalStartDate
    1A00     //WideCharSubjectLength
    5300740061006600660020004D0065006500740069006E0067002000280045007800650063002000530074006100660066002900 //WideCharSubject(Variable)

    00000000 //ReservedBlockEE2Size
    00000000 //ReservedBlock2Size

    //junk at the end of the buffer - ignore
    006500630020005300740061006600660029000000000000000000

    Sorry for the confusion, and thanks for the help in tracking down the issue!

    Thanks again,
    Elrond



    Monday, November 24, 2008 7:48 PM

All replies

  •  

    Good Morning Elrond:
    I have alerted our Protocols Support team concerning your questions about Outlook 2007. One of our team members will be in contact with you soon.

    Thanks for your questions!


    Regards, Obaid Farooqi
    Wednesday, November 5, 2008 4:33 PM
    Owner
  • Hi Elrond,

    I am assuming you are refering to the [MS-OXOCAL] Section 2.2.1.44.2 AppointmentRecurrencePattern Structure.  In reviewing the section against the code the documentation is correct. 

    Do you have a hex dump of the stream that I could see an example of?
    Developer Consultant
    Thursday, November 6, 2008 5:21 AM
    Moderator
  • Yes, I'm referring to [MS-OXOCAL] Section 2.2.1.44.2 AppointmentRecurrencePattern Structure.
    Here is the recurrence stream for the third example in my initial post (the example bits are in bold):

    043004300B2001000000C0210000010000000000000002000000212000002B000000000000000300000020F9BB0CE082BD0C20AABF0C020000008088BD0CC0AFBF0CC0D1BB0C8047C20C063000000930000076020000B20200000200C98ABD0CF68ABD0C5685BD0C210224002300557064617465643A205374616666204D656574696E67202845786563205374616666290200000036B2BF0C72B2BF0C96ACBF0C21021B001A005374616666204D656574696E67202845786563205374616666290200000000000000040000000000000000000000C98ABD0CF68ABD0C5685BD0C230055007000640061007400650064003A0020005300740061006600660020004D0065006500740069006E00670020002800450078006500630020005300740061006600660029000000000004000000530000000000000036B2BF0C72B2BF0C96ACBF0C1A005300740061006600660020004D0065006500740069006E00670020002800450078006500630020005300740061006600660029000000000000000000006500630020005300740061006600660029000000000000000000

    Thanks for the help!
    -Elrond
    Thursday, November 6, 2008 7:14 PM
  • Thanks Elrond,

    Looks like the bolding got dropped in  the post.  I started parsing the buffer and should have it parsed tommorrow. 


    Developer Consultant
    Friday, November 7, 2008 6:10 AM
    Moderator
  • Hi Tom,

    Have you made any progress with decoding the hex dump of the recurrence pattern stream?

    Thanks,
    Elrond

    Monday, November 17, 2008 9:26 PM
  • Elrond,

    I'm still working on it.  I should have this done by tommorrow.


    Developer Consultant
    Thursday, November 20, 2008 6:01 PM
    Moderator
  • Hi Elrond,

    I must be getting rusty on parsing buffer dumps as something doesn't appear to be correct.  It's not clear to me if the buffer is correct or pilot error on my part. 

    Can you share what you have parsed?

    In looking at the documentation here is what I interpret as pseudo code of [MS-OXOCAL] section 2.2.1.44.2  AppointmentRecurrencePattern Structure starting just before ExtendedException covering the question above.

    AppointmentRecurrencePattern  
    {  
        unsigned char Buffer[];  
        ...  
     
        if (WriterVersion2 >= 0x3008)  
        {  
            GetUnsignedLong(Buffer[index], &ReservedBlock1Size);  
            index += 4;  
     
            if (ReservedBlock1Size)           
            {  
                index += ReservedBlock1Size;  
            }  
     
            // ExtendedException (Variable)  
            for (i = 0; i < ExceptionCount; i ++)  
            {     
                if (WriterVersion2 >= 0x3009)  
                {  
                    GetUnSignedLong(Buffer[index], &ChangeHighlightSize);  
                    index += 4;   
     
                    GetUnSignedLong(Buffer[index], &ExceptionInfo[i].ChangeHighlightValue);  
                    index += 4;  
     
                    // Subtrack out size of ChangeHighlightValue  
                    ChangeHighlightSize -= 4;    
                    if (ChangeHighlightSize)  
                    {  
                        // skip over Reserved   
                        index += ChangeHighlightSize;  
                    }  
                }  
     
                GetUnSignedLong(Buffer[index], &ReservedBlockEE1Size);  
                index += 4;  
                if (ReservedBlockEE1Size)  
                {  
                    // skip over ReservedBlockEE1   
                    index += ReservedBlockEE1Size;  
                }  
     
                if (!(ExceptionInfo[i].Overrides & ARO_SUBJECT) &&   
                    !(ExceptionInfo[i].Overrides & ARO_LOCATION))  
                    continue;  
                ...  
            } // for (i = 0; i < ExceptionCount; i ++)  
            ...  
        }  

    Either you are offset by 4 bytes or ChangeHighlightSize defaults to 4 if the passed value is 0.  The latter is something I need to further research.


    Developer Consultant
    Friday, November 21, 2008 8:36 PM
    Moderator
  • Hi Tom,

    I believe I misinterpreted the data when I looked at the documentation the first time. The error I made was to ignore the ReservedBlock1Size buffer and instead jump directly to the ExtendedException(Variable) section where I treated the ReservedBlock1Size as the ChangeHighlightSize. The correctly translated bits are shown below:

    //RecurrencePattern
    0430    //ReaderVersion
    0430    //WriterVersion
    0B20    //RecurFrequency
    0100    //PatternType
    0000    //CalendarType

    C0210000 //FirstDateTime
    01000000 //Period - Every week
    00000000 //SlidingFlag
    02000000 //PatternTypeSpecific - Monday event

    21200000 //EndType

    2B000000 //OccurrenceCount
    00000000 //FirstDOW

    03000000 //DeletedInstanceCount
    20F9BB0C //DeletedInstanceDates[0]
    E082BD0C //DeletedInstanceDates[1]
    20AABF0C //DeletedInstanceDates[2]

    02000000 //ModifiedInstanceCount
    8088BD0C //ModifiedInstanceDates[0]
    C0AFBF0C //ModifiedInstanceDates[1]

    C0D1BB0C    //StartDate
    8047C20C    //EndDate

    06300000    //ReaderVersion2
    09300000    //WriterVersion2
    76020000    //StartTimeOffset
    B2020000    //EndTimeOffset

    //ExceptionCount
    0200

    //ExceptionInfo
    C98ABD0C
    F68ABD0C
    5685BD0C
    2102
    2400
    2300
    557064617465643A205374616666204D656574696E6720284578656320537461666629
    02000000

    //ExceptionInfo
    36B2BF0C
    72B2BF0C
    96ACBF0C
    2102
    1B00
    1A00
    5374616666204D656574696E6720284578656320537461666629
    02000000

    00000000 //ReservedBlock1Size - 0
    04000000 //ChangeHighlightSize = 4
    00000000 //ChangeHighlightValue = 0
    00000000 //ReservedBlockEE1Size

    C98ABD0C //StartDateTime
    F68ABD0C //EndDateTime
    5685BD0C //OriginalStartDate
    2300     //WideCharSubjectLength
    55007000640061007400650064003A0020005300740061006600660020004D0065006500740069006E0067002000280045007800650063002000530074006100660066002900 //WideCharSubject(Variable)

    00000000 //ReservedBlockEE2Size
    04000000 //ChangeHighlightSize = 4
    53000000 //ChangeHighlightValue = 0x53
    00000000 //ReservedBlockEE1Size

    36B2BF0C //StartDateTime
    72B2BF0C //EndDateTime
    96ACBF0C //OriginalStartDate
    1A00     //WideCharSubjectLength
    5300740061006600660020004D0065006500740069006E0067002000280045007800650063002000530074006100660066002900 //WideCharSubject(Variable)

    00000000 //ReservedBlockEE2Size
    00000000 //ReservedBlock2Size

    //junk at the end of the buffer - ignore
    006500630020005300740061006600660029000000000000000000

    Sorry for the confusion, and thanks for the help in tracking down the issue!

    Thanks again,
    Elrond



    Monday, November 24, 2008 7:48 PM