From section 2 of [MS-OXCDATA] (Data Structures, the learn.microsoft.com PDF, read 2026-11-13). Many binary properties of a message hold these structures, for
example PidTagEntryId, PidTagSentRepresentingEntryId, the recipient entry IDs, PidLidDistributionListMembers and
PidTagRuleCondition. All numbers are little-endian. The structures are defined for the Exchange ROP protocol and reused in files; a "ROP buffer" restriction in
the specification does not apply to a file.
Folder, message and global identifiers
| Structure | Size | Layout |
|---|---|---|
| Folder ID, Message ID | 8 | ReplicaId (2: the store) then GlobalCounter (6: the folder or message within the store). Valid only where the store is already known. |
| Global Identifier | 22 | DatabaseGuid (16, replacing the replica ID) then GlobalCounter (6). |
| LongTermID | 24 | a Global Identifier plus 2 pad bytes of 0x0000. |
EntryIDs
An EntryID is a byte array whose length is given outside the structure. Every kind begins with Flags (4 bytes, zero for a long-term EntryID, which is the only kind stored in a property)
and a 16-byte ProviderUID that routes it to its provider; the rest is ProviderData.
| Kind | ProviderUID |
|---|---|
| Object in a private message store | the MailboxGuid returned by the logon |
| Object in a public message store | 1A 44 73 90 AA 66 11 CD 9B C8 00 AA 00 2F C4 5A |
| Address book recipient | DC A7 40 C8 C0 42 10 1A B4 B9 08 00 2B 2F E1 82 |
| One-off recipient | 81 2B 1F A4 BE A3 10 19 9D 6E 00 DD 01 0F 54 02 |
| Contact address or personal distribution list recipient | FE 42 AA 0A 18 C7 1A 10 E8 85 0B 65 1C 24 00 00 |
| Store object, and NNTP newsgroup folder | 38 A1 BB 10 05 E5 10 1A A1 BB 08 00 2B 2A 56 C2 |
Messaging-object EntryIDs begin their ProviderData with a 2-byte object type: 0001 private folder, 0003 public folder, 0005 mapped public folder,
0007 private message, 0009 public message, 000B mapped public message, 000C public newsgroup folder.
Layouts
| EntryID | Fields after Flags and ProviderUID |
|---|---|
| Folder | FolderType (2, an object type above), DatabaseGuid (16), GlobalCounter (6), Pad (2, zero). The ProviderUID is the mailbox GUID (private) or the public-store value. |
| Message | MessageType (2), FolderDatabaseGuid (16), FolderGlobalCounter (6), Pad (2), MessageDatabaseGuid (16), MessageGlobalCounter (6), Pad (2). |
| Store object | Version (1, zero), Flag (1, zero), DLLFileName (14, the bytes of emsmdb.dll padded with zeros), WrappedFlags (4, zero), WrappedProviderUID (16: mailbox store 1B 55 FA 20 AA 66 11 CD 9B C8 00 AA 00 2F C4 5A, public folder store 1C 83 02 10 AA 66 11 CD 9B C8 00 AA 00 2F C4 5A), WrappedType (4: 0000000C mailbox, 00000006 public), ServerShortname (null-terminated 8-bit string), and for a mailbox MailboxDN (null-terminated X500 DN). |
| NNTP newsgroup folder | FolderType (2, 000C), NewsgroupName (null-terminated 8-bit string). |
| One-off | Version (2, zero), then 2 bytes of bit fields, then DisplayName, AddressType and EmailAddress, three null-terminated strings. Bit fields (mask of the 16-bit word): 0x8000 pad (0); 0x1E00 message format (0x0006 text only, 0x000E HTML only, 0x0016 text and HTML, as word values); 0x0C00 encoding of Macintosh attachments (00 BinHex, 01 UUENCODE, 10 AppleSingle, 11 AppleDouble; the last two only for MIME); 0x0100 M: 0 send TNEF, 1 send pure MIME; 0x0080 U: strings are UTF-16 with 2-byte terminators if 1, MBCS with 1-byte terminators if 0; 0x0060 reserved (0); 0x0010 L: 1 means the server cannot look the address up in the address book; 0x000F pad (0). |
| Address book | Version (4, 01 00 00 00), Type (4), X500DN (null-terminated 8-bit string). Types: 0 local mail user, 1 distribution list, 2 bulletin board or public folder, 3 automated mailbox, 4 organizational mailbox, 5 private distribution list, 6 remote mail user, 0x100 container, 0x101 template, 0x102 one-off user, 0x200 search. |
| Contact address | Version (4, 3), Type (4, 4), Index (4: 0, 1, 2 for Email1 to Email3; 3, 4, 5 for Fax1 to Fax3), EntryIdCount (4), EntryIdBytes (the message EntryID of the contact). |
| Personal distribution list | as the contact address but Type is 5, Index is 0xFF and EntryIdBytes is the message EntryID of the list. |
Lists of EntryIDs
- EntryList (search folder criteria):
EntryCount(4), a 4-byte pad that is ignored, thenEntryCountpairs of an entry length (4) and an ignored 4-byte pad, then the EntryIDs one after another. - FlatEntry:
Size(4) then that many bytes of EntryID. FlatEntryList:Count(4),Size(4, the total size of all the entries including padding), then the FlatEntry structures, each starting at a multiple of 4 bytes (the next offset is the previous entry's size rounded up to 4). - FlatUID: a GUID in little-endian byte order, 16 bytes.
PropertyName and PropertyProblem
- PropertyName:
Kind(1:00identified by LID,01identified by name,FFno name follows),GUID(16, as a FlatUID), then for kind 0 theLID(4), or for kind 1NameSize(1, the byte count of the name) andName(UTF-16 with a 2-byte terminator). ThePropertyName_rform of [MS-NSPI] isGUID, 4 reserved zero bytes andLID, with no string names. - PropertyProblem:
Index(2, into the array of property tags),PropertyTag(4),ErrorCode(4).
Property rows and recipient rows
- StandardPropertyRow:
Flag(1,00: all values present and without error), then an array of PropertyValue (or TypedPropertyValue where the requested type was0000unspecified). FlaggedPropertyRow:Flag01(some values missing or in error, or the request used the unspecified type), then FlaggedPropertyValue (or FlaggedPropertyValueWithType) elements. The first byte tells the two apart. No tags are stored in a row: the context (the requested tags, or the columns set before) says which value is which.PropertyRow_r([MS-NSPI]) is: 4 reserved zero bytes,ValueCount(4, at most 100,000), then the standard row's value array. - PropertyRowSet:
RowCount(2) then that many rows. In table results a binary or string value of 255 bytes or characters may have been cut; a value of exactly that length is probably longer in the real object. - RecipientRow, in order:
RecipientFlags(2): bits0x0007address type (0none,1X500DN,2MsMail,3SMTP,4Fax,5professional office system,6and7personal distribution list);0x0008E: email address field present;0x0010D: display name present;0x0020T: transmittable display name present;0x0040S: transmittable display name equals display name;0x0080R: another transport delivers to this recipient;0x0100N: the recipient cannot receive rich text;0x0200U: strings are Unicode (2-byte terminators), else 8-bit in the connection's code page;0x0400I: simple display name present;0x7800reserved (0);0x8000O: a non-standard address type, whose name is present.- If the type is X500DN:
AddressPrefixUsed(1),DisplayType(1:0messaging user,1distribution list,2forum such as a bulletin board or public folder,3automated agent,4large-group address book object,5private distribution list,6foreign or remote user) andX500DN(null-terminated ASCII). - If the type is a personal distribution list (6 or 7):
EntryIdSize(2) and the address book EntryID of the list, thenSearchKeySize(2) and the search key (may be empty). - If the type is none (0) and flag O is set:
AddressType(null-terminated ASCII). Then, each present only if its flag is set:EmailAddress,DisplayName,SimpleDisplayName,TransmittableDisplayName(null-terminated, Unicode if U is set). RecipientColumnCount(2), the number of columns used from the column list of the request, andRecipientProperties, a PropertyRow of those columns.
- AddressEntry:
PropertyCount(4) then that many TaggedPropertyValue. AddressList:AddressCount(4) then that many AddressEntry (used in saved search folder criteria).
Restrictions and sort orders
A restriction is a Boolean filter over a table; the first byte is RestrictType. In ROP buffers counts are 16 bits; in extended rules and search folder definition messages they are 32 bits.
| Type | Name | Fields after the type byte |
|---|---|---|
00 | AndRestriction | RestrictCount, then that many restrictions |
01 | OrRestriction | as And |
02 | NotRestriction | one restriction |
03 | ContentRestriction | FuzzyLevelLow (2: 0000 full string, 0001 substring, 0002 prefix), FuzzyLevelHigh (2, string properties only, bit flags: 0001 ignore case, 0002 ignore non-spacing characters, 0004 loose), PropertyTag (4), TaggedPropertyValue |
04 | PropertyRestriction | RelOp (1), PropTag (4), TaggedPropertyValue. RelOp: 00 less than, 01 less or equal, 02 greater, 03 greater or equal, 04 equal, 05 not equal, 64 member of distribution list |
05 | ComparePropertiesRestriction | RelOp (1), two property tags (4 each): compares two properties of the object |
06 | BitMaskRestriction | BitmapRelOp (1: 00 mask AND value equals 0, 01 not equal to 0), PropTag (4), Mask (4) |
07 | SizeRestriction | RelOp (1), PropTag (4), Size (4): compares the size of the value |
08 | ExistRestriction | PropTag (4): true if the property has a value |
09 | SubObjectRestriction | Subobject (4, the attachment or recipient table), one restriction: true if any row satisfies it |
0A | CommentRestriction | TaggedValuesCount (1), that many TaggedPropertyValue (no multi-value properties), RestrictionPresent (1, 01 or 00), an optional restriction: stores comments with a restriction |
0B | CountRestriction | Count (4), one restriction: limits the number of matches |
SortOrder: PropertyType (2), PropertyId (2), Order (1: 00 ascending, 01 descending, 04 maximum category, an aggregated column in a categorised sort whose maximum value orders the groups). A multi-value column must carry both 0x1000 and 0x2000 in its type: one row is made per value. SortOrderSet: SortOrderCount (2), CategorizedCount (2), ExpandedCount (2), then the SortOrder structures.
Error codes
The property error codes of section 2.4.2 of [MS-OXCDATA], stored as the 32-bit value of a FlaggedPropertyValue with flag 0A (type 000A, ErrorCode) or in a PropertyProblem:
| Name | Value | Meaning |
|---|---|---|
| NotEnoughMemory | 8007000E | on get: the value is too large for the request and must be read as a stream |
| NotFound | 8004010F | on get: the property or column has no value for this object |
| BadValue | 80040301 | on set: the value is not acceptable |
| InvalidType | 80040302 | the data type passed is undefined |
| UnsupportedType | 80040303 | the data type is not acceptable to the server |
| UnexpectedType | 80040304 | the data type is not the one the server expected |
| TooBig | 80040305 | the result is too big to return |
| DeclineCopy | 80040306 | on copy: the server cannot copy the object and leaves it to the client |
| UnexpectedId | 80040307 | the server does not support property IDs in this range, usually the named range 8000 to FFFF |
The general error and warning codes of sections 2.4 and 2.4.3 of [MS-OXCDATA] (several hundred values) are not reproduced on this site.