Autocomplete Stream
Applies to: Outlook 2013 | Outlook 2016
In addition to knowing how Microsoft Outlook interacts with the autocomplete stream, you must also understand the binary format of the autocomplete stream.
The autocomplete stream is a set of recipient property rows that are saved as a binary stream together with some bookkeeping metadata that is used only by Microsoft Outlook 2013, Microsoft Outlook 2010, Microsoft Office Outlook 2007, and Microsoft Outlook 2003. The metadata is relevant to Outlook interactions with the autocomplete stream so third parties must preserve what is in each metadata block when they save a modified autocomplete stream. In other words, third parties should modify only the row-set part of the binary format and preserve what was already in the metadata blocks of the autocomplete stream.
Stream Visualization
The high-level layout of the autocomplete stream is as follows:
Metadata (4 bytes)
Major Version Number (4 bytes)
Minor Version Number (4 bytes)
Number of rows n (4 bytes)
Number of properties p in row one (4 bytes)
Property 1's property tag (4 bytes)
Property 1's reserved data (4 bytes)
Property 1's value union (8 bytes)
Property 1's value data (0 or variable bytes)
… (property 2 through property P-1)
Property p's property tag (4 bytes)
Property p's reserved data (4 bytes)
Property p's value union (8 bytes)
Property p's value data (0 or variable bytes)
Number of properties q in row two (4 bytes)
… (row two's properties)
… (row 3 through row n-1)
Number of properties r in row n (4 bytes)
… (row n's properties)
Extra information byte count EI (4 bytes)
Extra information (EI bytes)
Metadata (8 bytes)
For an example of a binary structure, see Binary Example in the Outlook 2003/2007 NK2 File Format and Developer Guidelines.
High-level Layout
Broadly speaking, the layout of the autocomplete stream is as follows:
Value Data | Number of Bytes |
---|---|
Metadata |
4 |
Major Version Number |
4 |
Minor Version Number |
4 |
Row-set |
Variable |
Extra information byte count EI |
4 |
Extra information |
EI |
Metadata |
8 |
When reading this stream, if the major version is different than 12, then this stream should not be read or written. The current minor version of the autocomplete stream is 0, which has the Extra Information Byte count set to 0. If the minor version is different than 0, then there will be information in the extra information that needs to be read when reading the stream and preserved when writing the stream. The minor version will also need to be preserved when writing the stream. If both of these are not preserved, instances of Outlook that wrote the extra information will lose data.
Note
Applications must not add custom data to the Extra Information field or change the minor version as this functionality is to support Outlook extensions to the format and not arbitrary third-party extensions.
Row-set Layout
The row-set layout is as follows:
Value Data | Number of Bytes |
---|---|
Number of rows |
4 |
Rows |
Variable |
The number of rows identifies how many rows come in the next part of the binary stream sequence.
Row Layout
Each row is of the following format:
Value Data | Number of Bytes |
---|---|
Number of properties |
4 |
Properties |
Variable |
The number of properties identifies how many properties come in the next part of the binary stream sequence.
Property Layout
Each property is of the following format:
Value Data | Number of Bytes |
---|---|
Property Tag |
4 |
Reserved Data |
4 |
Property Value Union |
|
Value Data |
0 or variable (depending on the prop tag) |
Interpreting the Property Value
The Property Value Union and the Value Data are to be interpreted based on the property tag in the first 4 bytes of the property block. This property tag is in the same format as a MAPI property tag. Bits 0 through 15 of the property tag are the property's type. Bits 16 through 31 are the property's identifier. The property type determines how the rest of the property should be read.
Static Value
Some properties have no Value Data and only have data in the union. The following property types (which come from the Property Tag) should interpret the 8-byte Property Union data as follows:
Prop Type | Property Union Interpretation |
---|---|
PT_I2 |
short int |
PT_LONG |
long |
PT_ERROR |
long |
PT_R4 |
float |
PT_DOUBLE |
double |
PT_BOOLEAN |
short int |
PT_SYSTIME |
FILETIME |
PT_I8 |
LARGE_INTEGER |
Dynamic Values
Other properties have data in a Value Data block after the first 16 bytes that contain the Property Tag, the Reserved Data, and the Property Value Union. Unlike static values, the data that is stored in the 8-byte Property Value union is irrelevant on reading. When writing, make sure that you fill these 8 bytes with something. However, the content of the 8 bytes is not important. In dynamic values, the property tag's type determines how to interpret the Value Data.
PT_STRING8
Value Data | Number of Bytes |
---|---|
Number of bytes n |
4 |
Bytes to be interpreted as an ANSI string (includes NULL terminator) |
n |
PT_CLSID
Value Data | Number of Bytes |
---|---|
Bytes to be interpreted as a GUID |
16 |
PT_BINARY
Value Data | Number of Bytes |
---|---|
Number of bytes n |
4 |
Bytes to be interpreted as a byte array |
n |
PT_MV_BINARY
Value Data | Number of Bytes |
---|---|
Number of binary arrays X |
4 |
A run of bytes that contains X binary arrays. Each array should be interpreted exactly like the PT_BINARY byte run. | Variable |
PT_MV_STRING8 (Outlook 2007, Outlook 2010, and Outlook 2013)
Value Data | Number of Bytes |
---|---|
Number of ANSI strings X |
4 |
A run of bytes that contains X ANSI strings. Each string should be interpreted exactly like the PT_STRING8 byte run. | Variable |
PT_MV_UNICODE (Outlook 2007, Outlook 2010, Outlook 2013)
Value Data | Number of Bytes |
---|---|
Number of UNICODE strings X |
4 |
A run of bytes that contains X UNICODE strings. Each string should be interpreted exactly like the PT_UNICODE byte run. | Variable |
Significant properties
As mentioned previously in this topic, the binary blocks that represent properties have property tags that correspond to properties on address book recipients. For properties that are not listed here, you can look up the property description at https://msdn.microsoft.com/library/cc433490(EXCHG.80).aspx.
Property Name | Property Tag | Description (see MSDN for more information) |
---|---|---|
PR_NICK_NAME_W (not transmitted on recipients, specific to autocomplete stream only) |
0x6001001f |
This property must be first in each recipient row. It functionally serves as a key identifier for the recipient row. |
PR_ENTRYID |
0x0FFF0102 |
The address book entry identifier for the recipient. |
PR_DISPLAY_NAME_W |
0x3001001F |
The recipient's display name. |
PR_EMAIL_ADDRESS_W |
0x3003001F |
The recipient's email address (e.g. johndoe@contoso.com or /o=Contoso/OU=Foo/cn=Recipients/cn=johndoe) |
PR_ADDRTYPE_W |
0x3002001F |
The recipient's address type (e.g. SMTP or EX). |
PR_SEARCH_KEY |
0x300B0102 |
The recipient's MAPI search key. |
PR_SMTP_ADDRESS_W |
0x39FE001f |
The recipient's SMTP address. |
PR_DROPDOWN_DISPLAY_NAME_W (not transmitted on recipients, specific to autocomplete stream only) |
0X6003001f |
The display string that appears in the autocomplete list. |
PR_NICK_NAME_WEIGHT (not transmitted on recipients, specific to autocomplete stream only) |
0x60040003 |
The weight of this autocomplete entry. The weight is used to determine in what order autocomplete entries occur when matching the autocomplete list. Entries with higher weight will show before entries with lower weight. The complete autocomplete list is sorted by this property. The weight periodically decreases over time and increases when the user sends an email to this recipient. See the description later in this topic for more information about this property. |
PR_NICK_NAME_WEIGHT
The set of rows in the autocomplete stream is sorted in descending order by the PR_NICK_NAME_WEIGHT property and the autocomplete stream should always preserve this sorted characteristic. Therefore, any changes to a row's weight should also ensure that the row's position maintains the sorted order of the complete set of rows. Any additions to the row-set should be inserted to the correct position to maintain the sorted order.
The minimum value of this weight is 0x1 and the maximum value is LONG_MAX. Any other values for the weight are considered invalid.
When Outlook 2007 sends a mail to or resolves a recipient, it will increase that recipient's weight by 0x2000.