Mercurial > libpst
changeset 24:f4643b609bdf stable-0-5-3 **INVALID**
switch to automake/autoconf
author | carl |
---|---|
date | Mon, 20 Feb 2006 15:14:54 -0800 |
parents | f86fa9e378a2 |
children | 73e8959cd86b |
files | ChangeLog Makefile.am libpst.spec.in man/Makefile.am package src/libpst.c xml/libpst.in |
diffstat | 7 files changed, 928 insertions(+), 84 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Sun Feb 19 21:50:40 2006 -0800 +++ b/ChangeLog Mon Feb 20 15:14:54 2006 -0800 @@ -1,10 +1,14 @@ -LibPST 0.5.3 (2006-02-19) +LibPST 0.5.3 (2006-02-20) =============================== - * switch to gnu autoconf/automake + * switch to gnu autoconf/automake. This breaks the MS VC++ projects + since the source code is now in the src subdirectory. + * documentation switched to xml, building man pages and html from the master xml copy. + * include rpm .spec file for building src and binary rpms. + LibPST 0.5.2 (2006-02-18) ===============================
--- a/Makefile.am Sun Feb 19 21:50:40 2006 -0800 +++ b/Makefile.am Mon Feb 20 15:14:54 2006 -0800 @@ -1,3 +1,3 @@ SUBDIRS = src man html info CLEANFILES = xml/libpst xml/Makefile -EXTRA_DIST = $(wildcard xml/M*) $(wildcard xml/h*) $(wildcard xml/lib*) +EXTRA_DIST = libpst.spec $(wildcard xml/M*) $(wildcard xml/h*) $(wildcard xml/lib*)
--- a/libpst.spec.in Sun Feb 19 21:50:40 2006 -0800 +++ b/libpst.spec.in Mon Feb 20 15:14:54 2006 -0800 @@ -44,11 +44,8 @@ datadir=$RPM_BUILD_ROOT%{_datadir} \ includedir=$RPM_BUILD_ROOT%{_includedir} \ sysconfdir=$RPM_BUILD_ROOT%{_sysconfdir} install -mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d mkdir -p $RPM_BUILD_ROOT%{_datadir}/doc/@PACKAGE@-@VERSION@ -mv -f $RPM_BUILD_ROOT%{_sysconfdir}/dnsbl/dnsbl $RPM_BUILD_ROOT/etc/rc.d/init.d -mv AUTHORS COPYING ChangeLog NEWS README $RPM_BUILD_ROOT%{_datadir}/doc/@PACKAGE@-@VERSION@ -mkdir -p %{buildroot}/var/run/@PACKAGE@ +mv AUTHORS COPYING ChangeLog NEWS README $RPM_BUILD_ROOT%{_datadir}/doc/@PACKAGE@-@VERSION@ %pre @@ -63,15 +60,13 @@ %files %defattr(-,root,root) -%{_sbindir}/* +%{_bindir}/* %doc %{_mandir}/* %docdir %{_datadir}/doc/@PACKAGE@-@VERSION@ %{_datadir}/doc/@PACKAGE@-@VERSION@ -%config(noreplace) %{_sysconfdir}/@PACKAGE@ -%config(noreplace) %{_sysconfdir}/@PACKAGE@/*.conf -/etc/rc.d/init.d/@PACKAGE@ -%dir %attr(0750,@PACKAGE@,root) /var/run/@PACKAGE@ %changelog * Sun Feb 19 2006 Carl Byington 1.0 +- initial spec file using autoconf and http://www.fedora.us/docs/rpm-packaging-guidelines.html +
--- a/man/Makefile.am Sun Feb 19 21:50:40 2006 -0800 +++ b/man/Makefile.am Mon Feb 20 15:14:54 2006 -0800 @@ -1,2 +1,2 @@ -man_MANS = readpst.1 readpstlog.1 +man_MANS = readpst.1 readpstlog.1 pst2ldif.1 outlook.pst.5 EXTRA_DIST = $(man_MANS)
--- a/package Sun Feb 19 21:50:40 2006 -0800 +++ b/package Mon Feb 20 15:14:54 2006 -0800 @@ -1,8 +1,5 @@ #!/bin/bash -pst=outlook.pst -cp /home/ldap/$pst . - T=`grep AM_INIT_AUTOMAKE configure.in | cut -d'(' -f2` NAME=`echo $T | cut -d, -f1` VER=`echo $T | cut -d, -f2 | cut -d')' -f1` @@ -10,25 +7,68 @@ web=/home/httpd/html/510sg/$NAME distlog=/tmp/distcheck -echo $web $BALL - chown --recursive root:root * make -f *cvs ./configure >/dev/null (cd xml; make; make distclean) -chown --recursive carl:carl * +cp -a html/*html $web +## make +## pst=/home/ldap/outlook.pst +## rm -f pst2ldif.log my.log +## src/pst2ldif -b 'o=ams-cc.com, c=US' -c 'newPerson' $pst >ams.ldif +## src/readpstlog pst2ldif.log | less >my.log +## hexdump -C -v $pst >pst.dump +## chown --recursive carl:carl * +## exit make distcheck >$distlog 2>&1 -exit +if [ $? -eq 0 ]; then + if [ -f $BALL ]; then + # expand locally to see the tarball + rm -rf junk + mkdir junk + cd junk + tar xfz ../$BALL + cd $NAME-$VER + ./configure >/dev/null + make >/dev/null + make install >/dev/null + cd .. + cd .. + + # build rpm on target + target=host62 + scp $BALL $target:/tmp + ssh $target "cd /tmp; rpmbuild -ta $BALL" -if [ -f pst2ldif ]; then - rm -f pst2ldif.log my.log - ./pst2ldif -b 'o=ams-cc.com, c=US' -c 'newPerson' $pst >ams.ldif - ./readpstlog pst2ldif.log | less >my.log - hexdump -C $pst >pst.dump + # add packages to the web site + wp=$web/packages + wp4=$wp/centos4 + mkdir -p $wp4 + rp=/usr/src/redhat + mv -f $BALL $wp + scp $target:$rp/SRPMS/$NAME-$VER*rpm $wp + scp $target:$rp/RPMS/i386/$NAME-$VER*rpm $wp4 + (cd $web; chown --recursive web:web .; ls -alR) + rpm -ql -p $wp4/$NAME-$VER*6.rpm + fi +else + tail -10 $distlog +fi +chown --recursive carl:carl * +args="-z -e ssh --times --perms --links --relative --owner --group --numeric-ids --delete" +echo rcync $args $web ns1:/ - grep '^dn:' ams.ldif | sort >aaa - grep '^dn:' /home/ldap/ams.ldif | sort >bbb +if [ -f /usr/local/bin/pst2ldif ]; then + pushd /home/ldap + pst=outlook.pst + #rm -f pst2ldif.log my.log + /usr/local/bin/pst2ldif -b 'o=ams-cc.com, c=US' -c 'newPerson' $pst >ams.ldif2 + #./readpstlog pst2ldif.log | less >my.log + #hexdump -C $pst >pst.dump + + grep '^dn:' ams.ldif2 | sort >aaa + grep '^dn:' ams.ldif | sort >bbb echo 'differences from nightly ldap' diff aaa bbb echo 'end differences'
--- a/src/libpst.c Sun Feb 19 21:50:40 2006 -0800 +++ b/src/libpst.c Mon Feb 20 15:14:54 2006 -0800 @@ -472,7 +472,7 @@ #define BLOCK_SIZE 516 // index blocks -#define DESC_BLOCK_SIZE 520 // descriptor blocks +#define DESC_BLOCK_SIZE 516 // descriptor blocks was 520 but bogus #define ITEM_COUNT_OFFSET 0x1f0 // count byte #define LEVEL_INDICATOR_OFFSET 0x1f3 // node or leaf #define BACKLINK_OFFSET 0x1f8 // backlink u1 value @@ -1310,43 +1310,40 @@ } na_ptr->items[x]->type = 0; // checked later before it is set /* Reference Types - - 2 - 0x0002 - Signed 16bit value - 3 - 0x0003 - Signed 32bit value - 4 - 0x0004 - 4-byte floating point - 5 - 0x0005 - Floating point double - 6 - 0x0006 - Signed 64-bit int - 7 - 0x0007 - Application Time - 10 - 0x000A - 32-bit error value - 11 - 0x000B - Boolean (non-zero = true) - 13 - 0x000D - Embedded Object - 20 - 0x0014 - 8-byte signed integer (64-bit) - 30 - 0x001E - Null terminated String - 31 - 0x001F - Unicode string - 64 - 0x0040 - Systime - Filetime structure - 72 - 0x0048 - OLE Guid - 258 - 0x0102 - Binary data - - - 0x1003 - Array of 32bit values - - 0x1014 - Array of 64bit values - - 0x101E - Array of Strings - - 0x1102 - Array of Binary data + 0x0002 - Signed 16bit value + 0x0003 - Signed 32bit value + 0x0004 - 4-byte floating point + 0x0005 - Floating point double + 0x0006 - Signed 64-bit int + 0x0007 - Application Time + 0x000A - 32-bit error value + 0x000B - Boolean (non-zero = true) + 0x000D - Embedded Object + 0x0014 - 8-byte signed integer (64-bit) + 0x001E - Null terminated String + 0x001F - Unicode string + 0x0040 - Systime - Filetime structure + 0x0048 - OLE Guid + 0x0102 - Binary data + 0x1003 - Array of 32bit values + 0x1014 - Array of 64bit values + 0x101E - Array of Strings + 0x1102 - Array of Binary data */ - if (table_rec.ref_type == 0x0003 || table_rec.ref_type == 0x000b - || table_rec.ref_type == 0x0002) { //contains data + if (table_rec.ref_type == 0x0002 || table_rec.ref_type == 0x0003 || table_rec.ref_type == 0x000b) { + //contains data na_ptr->items[x]->data = xmalloc(sizeof(int32_t)); memcpy(na_ptr->items[x]->data, &(table_rec.value), sizeof(int32_t)); - na_ptr->items[x]->size = sizeof(int32_t); na_ptr->items[x]->type = table_rec.ref_type; } else if (table_rec.ref_type == 0x0005 || table_rec.ref_type == 0x000D - || table_rec.ref_type == 0x1003 || table_rec.ref_type == 0x0014 - || table_rec.ref_type == 0x001E || table_rec.ref_type == 0x0102 - || table_rec.ref_type == 0x0040 || table_rec.ref_type == 0x101E - || table_rec.ref_type == 0x0048 || table_rec.ref_type == 0x1102 - || table_rec.ref_type == 0x1014) { + || table_rec.ref_type == 0x1003 || table_rec.ref_type == 0x0014 + || table_rec.ref_type == 0x001E || table_rec.ref_type == 0x0102 + || table_rec.ref_type == 0x0040 || table_rec.ref_type == 0x101E + || table_rec.ref_type == 0x0048 || table_rec.ref_type == 0x1102 + || table_rec.ref_type == 0x1014) { //contains index_ref to data LE32_CPU(table_rec.value); if ((table_rec.value & 0x0000000F) == 0xF) { @@ -1399,12 +1396,9 @@ } } else { DEBUG_EMAIL(("Ignoring 0 value in offset\n")); - if (na_ptr->items[x]->data) - free (na_ptr->items[x]->data); + if (na_ptr->items[x]->data) free (na_ptr->items[x]->data); na_ptr->items[x]->data = NULL; - free(na_ptr->items[x]); - na_ptr->count_item--; // remove this item from the destination list continue; } @@ -2265,6 +2259,14 @@ (t==5?"Embedded Message":"OLE")))))),t)); //INC_CHECK_X(); break; + case 0x3707: // PR_ATTACH_LONG_FILENAME Attachment filename (long?) + DEBUG_EMAIL(("Attachment Filename long - ")); + NULL_CHECK(attach); + MOVE_NEXT(attach); + LIST_COPY(attach->filename2, (char*)); + DEBUG_EMAIL(("%s\n", attach->filename2)); + //INC_CHECK_X(); + break; case 0x370B: // PR_RENDERING_POSITION // position in characters that the attachment appears in the plain text body DEBUG_EMAIL(("Attachment Position - ")); @@ -2275,14 +2277,6 @@ DEBUG_EMAIL(("%i [%#x]\n", attach->position)); //INC_CHECK_X(); break; - case 0x3707: // PR_ATTACH_LONG_FILENAME Attachment filename (long?) - DEBUG_EMAIL(("Attachment Filename long - ")); - NULL_CHECK(attach); - MOVE_NEXT(attach); - LIST_COPY(attach->filename2, (char*)); - DEBUG_EMAIL(("%s\n", attach->filename2)); - //INC_CHECK_X(); - break; case 0x370E: // PR_ATTACH_MIME_TAG Mime type of encoding DEBUG_EMAIL(("Attachment mime encoding - ")); NULL_CHECK(attach);
--- a/xml/libpst.in Sun Feb 19 21:50:40 2006 -0800 +++ b/xml/libpst.in Mon Feb 20 15:14:54 2006 -0800 @@ -7,12 +7,12 @@ The most recent documentation is available at <ulink url="http://www.five-ten-sg.com/@PACKAGE@/">http://www.five-ten-sg.com/@PACKAGE@/</ulink> </para> + </partintro> - </partintro> <refentry id="readpst.1"> <refentryinfo> - <date>2006-02-19</date> + <date>2006-02-20</date> </refentryinfo> <refmeta> @@ -40,13 +40,12 @@ <arg><option>-S</option></arg> <arg><option>-V</option></arg> <arg><option>-w</option></arg> - <arg>files...</arg> + <arg rep='repeat' choice='plain'>files</arg> </cmdsynopsis> </refsynopsisdiv> <refsect1 id='readpst.description.1'> <title>Description</title> - <para>This manual page briefly documents the <command>readpst</command> command.</para> <para><command>readpst</command> is a program that can read an Outlook PST (Personal Folders) file and convert it into an mbox file, a format suitable for KMail, a recursive mbox structure, or separate emails. @@ -72,7 +71,7 @@ <varlistentry> <term>-h</term> <listitem><para> - Show summary of options. + Show summary of options. Subsequent options are then ignored. </para></listitem> </varlistentry> <varlistentry> @@ -119,7 +118,7 @@ <varlistentry> <term>-V</term> <listitem><para> - Show version of program. Subsequent options are then ignored. + Show program version. Subsequent options are then ignored. </para></listitem> </varlistentry> <varlistentry> @@ -181,7 +180,7 @@ <refentry id="readpstlog.1"> <refentryinfo> - <date>2006-02-19</date> + <date>2006-02-20</date> </refentryinfo> <refmeta> @@ -192,26 +191,25 @@ <refnamediv id='readpstlog.name.1'> <refname>readpstlog</refname> - <refpurpose>convert a readpst logfile to text format</refpurpose> + <refpurpose>convert a <command>readpst</command> logfile to text format</refpurpose> </refnamediv> <refsynopsisdiv id='readpstlog.synopsis.1'> <title>Synopsis</title> <cmdsynopsis> - <command>readpst</command> + <command>readpstlog</command> <arg><option>-f <replaceable class="parameter">format</replaceable></option></arg> <arg><option>-t <replaceable class="parameter">include-types</replaceable></option></arg> <arg><option>-x <replaceable class="parameter">exclude-types</replaceable></option></arg> - <arg>logfile</arg> + <arg choice='plain'>logfile</arg> </cmdsynopsis> </refsynopsisdiv> <refsect1 id='readpstlog.description.1'> <title>Description</title> - <para>This manual page briefly documents the <command>readpstlog</command> command.</para> <para><command>readpstlog</command> - is a program that reads the binary logfile generated - by <command>readpst</command>, and outputs it in a more desirable format (i.e. text). + is a program that converts the binary logfile generated + by <command>readpst</command> to a more desirable text format. </para> </refsect1> @@ -244,8 +242,8 @@ <refsect1 id='readpstlog.message.types.1'> <title>Message Types</title> - <para> - <command>readpstlog</command> understands the following types of log messages: + <para><command>readpstlog</command> understands the following types of log + messages: </para> <variablelist> <varlistentry> @@ -346,4 +344,817 @@ </para> </refsect1> </refentry> + + + <refentry id="pst2ldif.1"> + <refentryinfo> + <date>2006-02-20</date> + </refentryinfo> + + <refmeta> + <refentrytitle>pst2ldif</refentrytitle> + <manvolnum>1</manvolnum> + <refmiscinfo>pst2ldif @VERSION@</refmiscinfo> + </refmeta> + + <refnamediv id='pst2ldif.name.1'> + <refname>pst2ldif</refname> + <refpurpose>extract contacts from a MS Outlook .pst file in .ldif format</refpurpose> + </refnamediv> + + <refsynopsisdiv id='pst2ldif.synopsis.1'> + <title>Synopsis</title> + <cmdsynopsis> + <command>pst2ldif</command> + <arg><option>-h</option></arg> + <arg><option>-V</option></arg> + <arg><option>-b <replaceable class="parameter">ldap-base</replaceable></option></arg> + <arg><option>-c <replaceable class="parameter">class</replaceable></option></arg> + <arg choice='plain'>pstfilename</arg> + </cmdsynopsis> + </refsynopsisdiv> + + <refsect1 id='pst2ldif.options.1'> + <title>Options</title> + <variablelist> + <varlistentry> + <term>-h</term> + <listitem><para> + Show summary of options. Subsequent options are then ignored. + </para></listitem> + </varlistentry> + <varlistentry> + <term>-V <replaceable class="parameter">include-types</replaceable></term> + <listitem><para> + Show program version. Subsequent options are then ignored. + </para></listitem> + </varlistentry> + <varlistentry> + <term>-b <replaceable class="parameter">ldap-base</replaceable></term> + <listitem><para> + Sets the ldap base value used in the dn records. You probably want to + use something like "o=organization, c=US". + </para></listitem> + </varlistentry> + <varlistentry> + <term>-c <replaceable class="parameter">class</replaceable></term> + <listitem><para> + Sets the objectClass values for the contact items. This class needs to be + defined in the schema used by your LDAP server, and at a minimum it must + contain the ldap attributes given below. + </para></listitem> + </varlistentry> + </variablelist> + </refsect1> + + <refsect1 id='pst2ldif.description.1'> + <title>Description</title> + <para><command>pst2ldif</command> + reads the contact information from a MS Outlook .pst file + and produces a .ldif file that may be used to import those contacts + into an LDAP database. The following ldap attributes are generated: + <simplelist> + <member>cn </member> + <member>givenName </member> + <member>sn </member> + <member>personalTitle </member> + <member>company </member> + <member>mail </member> + <member>postalAddress </member> + <member>l </member> + <member>st </member> + <member>postalCode </member> + <member>c </member> + <member>homePhone </member> + <member>telephoneNumber </member> + <member>facsimileTelephoneNumber </member> + <member>mobile </member> + <member>description </member> + </simplelist> + </para> + </refsect1> + + <refsect1 id='pst2ldif.copyright.1'> + <title>Copyright</title> + <para> + Copyright (C) 2006 by 510 Software Group <carl@five-ten-sg.com> + </para> + <para> + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + </para> + <para> + You should have received a copy of the GNU General Public License along + with this program; see the file COPYING. If not, please write to the + Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + </para> + </refsect1> + + <refsect1 id='pst2ldif.version.1'> + <title>CVS Version</title> + <para> + $Id$ + </para> + </refsect1> + </refentry> + + + <refentry id="pst.5"> + <refentryinfo> + <date>2006-02-20</date> + </refentryinfo> + + <refmeta> + <refentrytitle>outlook.pst</refentrytitle> + <manvolnum>5</manvolnum> + </refmeta> + + <refnamediv id='pst.name.1'> + <refname>outlook.pst</refname> + <refpurpose>format of MS Outlook .pst file</refpurpose> + </refnamediv> + + <refsynopsisdiv id='pst.synopsis.1'> + <title>Synopsis</title> + <cmdsynopsis> + <command>outlook.pst</command> + </cmdsynopsis> + </refsynopsisdiv> + + <refsect1 id='pst.file.overview.5'> + <title>Overview</title> + <para> + Each item in a .pst file is identified by two id values ID1 and ID2. + There are two separate b-trees indexed by these ID1 and ID2 values. + </para> + </refsect1> + + <refsect1 id='pst.file.header.5'> + <title>File Header</title> + <para> + The file header is located at offset 0 in the .pst file. + </para> + <literallayout class="monospaced"><![CDATA[ +0000 21 42 44 4e 49 f8 64 d9 53 4d 0e 00 13 00 01 01 +0010 00 00 00 00 00 00 00 00 50 d6 03 00 bd 1e 02 00 +0020 08 4c 00 00 00 04 00 00 00 04 00 00 0f 04 00 00 +0030 0d 40 00 00 99 0a 01 00 18 04 00 00 0d 40 00 00 +0040 0d 40 00 00 11 80 00 00 02 04 00 00 0a 04 00 00 +0050 00 04 00 00 00 04 00 00 0f 04 00 00 0f 04 00 00 +0060 0f 04 00 00 0d 40 00 00 00 04 00 00 00 04 00 00 +0070 04 40 00 00 00 04 00 00 00 04 00 00 00 04 00 00 +0080 00 04 00 00 00 04 00 00 00 04 00 00 00 04 00 00 +0090 00 04 00 00 00 04 00 00 00 04 00 00 00 04 00 00 +00a0 0c 09 00 00 00 00 00 00 00 04 27 00 00 24 23 00 +00b0 c0 09 0a 00 00 c8 00 00 bc 1e 02 00 00 7e 0c 00 +00c0 b4 1e 02 00 00 54 00 00 01 00 00 00 23 55 44 d1 +00d0 5a 4f ce 6b 80 ff ff ff 00 00 00 00 00 00 00 00 +00e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0140 00 00 00 00 00 00 00 00 00 00 00 00 3f ff ff ff +0150 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +0160 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +0170 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +0180 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +0190 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +01a0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +01b0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +01c0 ff ff ff ff ff ff ff ff ff ff ff ff 80 01 00 00 +01d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +01e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +01f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +0000 signature [4 bytes] 0x4e444221 constant +000a index type [1 byte] 0x0e constant +01cd encryption type [1 byte] 0x01 constant +00a8 total file size [4 bytes] 0x270400 in this case +00c0 back-pointer-1 [4 bytes] 0x021eb4 in this case +00c4 offset-index-1 [4 bytes] 0x005400 in this case +00b8 back-pointer-2 [4 bytes] 0x021ebc in this case +00bc offset-index-2 [4 bytes] 0x0c7e00 in this case +]]></literallayout> + <para> + We only support index type 0x0E and encryption type 0x01. + </para> + <para> + offset-index-1 is the file offset of the root of the + index1 b-tree, which contains (ID1, offset, size, unknown) tuples + for each item in the file. back-pointer-1 is the value that should + appear in the parent pointer of that root node. + </para> + <para> + offset-index-2 is the file offset of the root of the + index2 b-tree, which contains (ID2, DESC-ID1, LIST-ID1, PARENT-ID2) + tuples for each item in the file. back-pointer-2 is the value that should + appear in the parent pointer of that root node. + </para> + </refsect1> + + <refsect1 id='pst.file.node1.5'> + <title>Index 1 Node</title> + <para> + The index1 b-tree nodes are 516 byte blocks with the following format. + </para> + <literallayout class="monospaced"><![CDATA[ +0000 04 00 00 00 8a 1e 02 00 00 1c 0b 00 +000c 58 27 03 00 b3 1e 02 00 00 52 00 00 +0018 00 00 00 00 00 00 00 00 00 00 00 00 +0024 00 00 00 00 00 00 00 00 00 00 00 00 +0030 00 00 00 00 00 00 00 00 00 00 00 00 +003c 00 00 00 00 00 00 00 00 00 00 00 00 +0048 00 00 00 00 00 00 00 00 00 00 00 00 +0054 00 00 00 00 00 00 00 00 00 00 00 00 +0060 00 00 00 00 00 00 00 00 00 00 00 00 +006c 00 00 00 00 00 00 00 00 00 00 00 00 +0078 00 00 00 00 00 00 00 00 00 00 00 00 +0084 00 00 00 00 00 00 00 00 00 00 00 00 +0090 00 00 00 00 00 00 00 00 00 00 00 00 +009c 00 00 00 00 00 00 00 00 00 00 00 00 +00a8 00 00 00 00 00 00 00 00 00 00 00 00 +00b4 00 00 00 00 00 00 00 00 00 00 00 00 +00c0 00 00 00 00 00 00 00 00 00 00 00 00 +00cc 00 00 00 00 00 00 00 00 00 00 00 00 +00d8 00 00 00 00 00 00 00 00 00 00 00 00 +00e4 00 00 00 00 00 00 00 00 00 00 00 00 +00f0 00 00 00 00 00 00 00 00 00 00 00 00 +00fc 00 00 00 00 00 00 00 00 00 00 00 00 +0108 00 00 00 00 00 00 00 00 00 00 00 00 +0114 00 00 00 00 00 00 00 00 00 00 00 00 +0120 00 00 00 00 00 00 00 00 00 00 00 00 +012c 00 00 00 00 00 00 00 00 00 00 00 00 +0138 00 00 00 00 00 00 00 00 00 00 00 00 +0144 00 00 00 00 00 00 00 00 00 00 00 00 +0150 00 00 00 00 00 00 00 00 00 00 00 00 +015c 00 00 00 00 00 00 00 00 00 00 00 00 +0168 00 00 00 00 00 00 00 00 00 00 00 00 +0174 00 00 00 00 00 00 00 00 00 00 00 00 +0180 00 00 00 00 00 00 00 00 00 00 00 00 +018c 00 00 00 00 00 00 00 00 00 00 00 00 +0198 00 00 00 00 00 00 00 00 00 00 00 00 +01a4 00 00 00 00 00 00 00 00 00 00 00 00 +01b0 00 00 00 00 00 00 00 00 00 00 00 00 +01bc 00 00 00 00 00 00 00 00 00 00 00 00 +01c8 00 00 00 00 00 00 00 00 00 00 00 00 +01d4 00 00 00 00 00 00 00 00 00 00 00 00 +01e0 00 00 00 00 00 00 00 00 00 00 00 00 +01ec 00 00 00 00 02 29 0c 02 80 80 b6 4a +01f8 b4 1e 02 00 27 9c cc 56 58 27 03 00 + +01f0 item-count [1 byte] 0x02 in this case +01f1 max-item-count [1 byte] 0x29 constant +01f3 node-level [1 byte] 0x02 in this case +01f8 back-pointer [4 bytes] 0x021eb4 in this case +]]></literallayout> + <para> + The item-count specifies the number of 12 byte records that + are active. The node-level is non-zero for this style of nodes. + The leaf nodes have a different format. The back-pointer must + match the back-pointer from the triple that pointed to this node. + </para> + <para> + Each item in this node is a triple of (ID, back-pointer, offset) + where the offset points to the next deeper node in the tree, the + back-pointer value must match the back-pointer in that deeper node, + and ID is the lowest ID value in the subtree. + </para> + </refsect1> + + <refsect1 id='pst.file.leaf1.5'> + <title>Index 1 Leaf Node</title> + <para> + The index1 b-tree leaf nodes are 516 byte blocks with the following format. + </para> + <literallayout class="monospaced"><![CDATA[ +0000 04 00 00 00 00 58 00 00 64 00 0f 00 +000c 08 00 00 00 80 58 00 00 ac 00 06 00 +0018 0c 00 00 00 40 59 00 00 ac 00 06 00 +0024 10 00 00 00 00 5a 00 00 bc 00 03 00 +0030 14 00 00 00 00 5b 00 00 a4 00 02 00 +003c 18 00 00 00 c0 5b 00 00 64 00 02 00 +0048 1c 00 00 00 40 5c 00 00 5c 00 02 00 +0054 50 00 00 00 80 62 00 00 60 00 02 00 +0060 74 00 00 00 00 77 00 00 5e 00 02 00 +006c 7c 00 00 00 80 77 00 00 66 00 02 00 +0078 84 00 00 00 00 76 00 00 ca 00 02 00 +0084 88 00 00 00 00 63 00 00 52 00 02 00 +0090 90 00 00 00 00 79 00 00 58 00 02 00 +009c cc 00 00 00 c0 61 00 00 76 00 02 00 +00a8 e0 00 00 00 00 61 00 00 74 00 02 00 +00b4 f4 00 00 00 80 65 00 00 6e 00 02 00 +00c0 8c 01 00 00 40 60 00 00 70 00 02 00 +00cc ea 01 00 00 80 61 00 00 10 00 02 00 +00d8 ec 01 00 00 40 8a 00 00 f3 01 02 00 +00e4 f0 01 00 00 80 93 00 00 f4 1f 02 00 +00f0 fa 01 00 00 c0 7f 00 00 10 00 02 00 +00fc 00 02 00 00 00 89 00 00 34 01 02 00 +0108 1c 02 00 00 40 ec 00 00 12 06 02 00 +0114 22 02 00 00 00 84 00 00 10 00 02 00 +0120 24 02 00 00 c0 ea 00 00 3c 01 02 00 +012c 40 02 00 00 00 f4 00 00 0a 06 02 00 +0138 46 02 00 00 40 8c 00 00 10 00 02 00 +0144 48 02 00 00 80 f2 00 00 36 01 02 00 +0150 64 02 00 00 80 fb 00 00 bf 07 02 00 +015c 6a 02 00 00 80 63 00 00 10 00 02 00 +0168 6c 02 00 00 40 fa 00 00 2a 01 02 00 +0174 6c 02 00 00 40 fa 00 00 2a 01 02 00 +0180 6c 02 00 00 40 fa 00 00 2a 01 02 00 +018c 6c 02 00 00 40 fa 00 00 2a 01 02 00 +0198 6c 02 00 00 40 fa 00 00 2a 01 02 00 +01a4 6c 02 00 00 40 fa 00 00 2a 01 02 00 +01b0 64 02 00 00 80 fb 00 00 bf 07 02 00 +01bc 64 02 00 00 80 fb 00 00 bf 07 02 00 +01c8 64 02 00 00 80 fb 00 00 bf 07 02 00 +01d4 64 02 00 00 80 fb 00 00 bf 07 02 00 +01e0 64 02 00 00 80 fb 00 00 bf 07 02 00 +01ec 00 00 00 00 1f 29 0c 00 80 80 5b b3 +01f8 5a 67 01 00 4f ae 70 a7 92 06 00 00 + +01f0 item-count [1 byte] 0x1f in this case +01f1 max-item-count [1 byte] 0x29 constant +01f3 node-level [1 byte] 0x00 in this case +01f8 back-pointer [4 bytes] 0x01675a in this case +]]></literallayout> + <para> + The item-count specifies the number of 12 byte records that + are active. The node-level is zero for these leaf nodes. + The back-pointer must match the back-pointer from the triple + that pointed to this node. + </para> + <para> + Each item in this node is a tuple of (ID1, offset, size, unknown) + </para> + </refsect1> + + <refsect1 id='pst.file.node2.5'> + <title>Index 2 Node</title> + <para> + The index2 b-tree nodes are 516 byte blocks with the following format. + </para> + <literallayout class="monospaced"><![CDATA[ +0000 21 00 00 00 bb 1e 02 00 00 e2 0b 00 +000c 64 78 20 00 8c 1e 02 00 00 dc 0b 00 +0018 00 00 00 00 00 00 00 00 00 00 00 00 +0024 00 00 00 00 00 00 00 00 00 00 00 00 +0030 00 00 00 00 00 00 00 00 00 00 00 00 +003c 00 00 00 00 00 00 00 00 00 00 00 00 +0048 00 00 00 00 00 00 00 00 00 00 00 00 +0054 00 00 00 00 00 00 00 00 00 00 00 00 +0060 00 00 00 00 00 00 00 00 00 00 00 00 +006c 00 00 00 00 00 00 00 00 00 00 00 00 +0078 00 00 00 00 00 00 00 00 00 00 00 00 +0084 00 00 00 00 00 00 00 00 00 00 00 00 +0090 00 00 00 00 00 00 00 00 00 00 00 00 +009c 00 00 00 00 00 00 00 00 00 00 00 00 +00a8 00 00 00 00 00 00 00 00 00 00 00 00 +00b4 00 00 00 00 00 00 00 00 00 00 00 00 +00c0 00 00 00 00 00 00 00 00 00 00 00 00 +00cc 00 00 00 00 00 00 00 00 00 00 00 00 +00d8 00 00 00 00 00 00 00 00 00 00 00 00 +00e4 00 00 00 00 00 00 00 00 00 00 00 00 +00f0 00 00 00 00 00 00 00 00 00 00 00 00 +00fc 00 00 00 00 00 00 00 00 00 00 00 00 +0108 00 00 00 00 00 00 00 00 00 00 00 00 +0114 00 00 00 00 00 00 00 00 00 00 00 00 +0120 00 00 00 00 00 00 00 00 00 00 00 00 +012c 00 00 00 00 00 00 00 00 00 00 00 00 +0138 00 00 00 00 00 00 00 00 00 00 00 00 +0144 00 00 00 00 00 00 00 00 00 00 00 00 +0150 00 00 00 00 00 00 00 00 00 00 00 00 +015c 00 00 00 00 00 00 00 00 00 00 00 00 +0168 00 00 00 00 00 00 00 00 00 00 00 00 +0174 00 00 00 00 00 00 00 00 00 00 00 00 +0180 00 00 00 00 00 00 00 00 00 00 00 00 +018c 00 00 00 00 00 00 00 00 00 00 00 00 +0198 00 00 00 00 00 00 00 00 00 00 00 00 +01a4 00 00 00 00 00 00 00 00 00 00 00 00 +01b0 00 00 00 00 00 00 00 00 00 00 00 00 +01bc 00 00 00 00 00 00 00 00 00 00 00 00 +01c8 00 00 00 00 00 00 00 00 00 00 00 00 +01d4 00 00 00 00 00 00 00 00 00 00 00 00 +01e0 00 00 00 00 00 00 00 00 00 00 00 00 +01ec 00 00 00 00 02 29 0c 02 81 81 b2 60 +01f8 bc 1e 02 00 7e 70 dc e3 21 00 00 00 + +01f0 item-count [1 byte] 0x02 in this case +01f1 max-item-count [1 byte] 0x29 constant +01f3 node-level [1 byte] 0x02 in this case +01f8 back-pointer [4 bytes] 0x021ebc in this case +]]></literallayout> + <para> + The item-count specifies the number of 12 byte records that + are active. The node-level is non-zero for this style of nodes. + The leaf nodes have a different format. The back-pointer must + match the back-pointer from the triple that pointed to this node. + </para> + <para> + Each item in this node is a triple of (ID2, back-pointer, offset) + where the offset points to the next deeper node in the tree, the + back-pointer value must match the back-pointer in that deeper node, + and ID2 is the lowest ID2 value in the subtree. + </para> + </refsect1> + + <refsect1 id='pst.file.leaf2.5'> + <title>Index 2 Leaf Node</title> + <para> + The index2 b-tree leaf nodes are 516 byte blocks with the following format. + </para> + <literallayout class="monospaced"><![CDATA[ +0000 21 00 00 00 38 e6 00 00 00 00 00 00 00 00 00 00 +0010 61 00 00 00 2c a8 02 00 36 a8 02 00 00 00 00 00 +0020 22 01 00 00 20 a2 02 00 00 00 00 00 22 01 00 00 +0030 2d 01 00 00 88 7b 03 00 00 00 00 00 00 00 00 00 +0040 2e 01 00 00 08 00 00 00 00 00 00 00 00 00 00 00 +0050 2f 01 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 +0060 e1 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0070 01 02 00 00 b4 e4 02 00 00 00 00 00 00 00 00 00 +0080 61 02 00 00 a0 e4 02 00 00 00 00 00 00 00 00 00 +0090 0d 06 00 00 04 00 00 00 00 00 00 00 00 00 00 00 +00A0 0e 06 00 00 08 00 00 00 00 00 00 00 00 00 00 00 +00B0 0f 06 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 +00C0 10 06 00 00 10 00 00 00 00 00 00 00 00 00 00 00 +00D0 2b 06 00 00 84 00 00 00 00 00 00 00 00 00 00 00 +00E0 4c 06 00 00 1c 00 00 00 00 00 00 00 00 00 00 00 +00F0 71 06 00 00 18 00 00 00 00 00 00 00 00 00 00 00 +0100 92 06 00 00 14 00 00 00 00 00 00 00 00 00 00 00 +0110 23 22 00 00 14 a0 02 00 00 00 00 00 22 01 00 00 +0120 26 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0130 27 22 00 00 1c a0 02 00 00 00 00 00 00 00 00 00 +0140 22 80 00 00 50 00 00 00 00 00 00 00 22 01 00 00 +0150 2d 80 00 00 f8 9f 02 00 00 00 00 00 00 00 00 00 +0160 2e 80 00 00 08 00 00 00 00 00 00 00 00 00 00 00 +0170 2f 80 00 00 34 e6 00 00 00 00 00 00 00 00 00 00 +0180 42 80 00 00 3c 6d 02 00 00 00 00 00 22 80 00 00 +0190 4d 80 00 00 04 00 00 00 00 00 00 00 00 00 00 00 +01A0 4e 80 00 00 10 6d 02 00 00 00 00 00 00 00 00 00 +01B0 4f 80 00 00 ec 23 00 00 00 00 00 00 00 00 00 00 +01C0 62 80 00 00 38 78 02 00 00 00 00 00 22 01 00 00 +01D0 6d 80 00 00 34 78 02 00 00 00 00 00 00 00 00 00 +01E0 6e 80 00 00 08 00 00 00 00 00 00 00 00 00 00 00 +01F0 10 1f 10 00 81 81 a0 9a ae 1e 02 00 89 44 6a 0f +0200 b8 b1 03 00 + +01f0 item-count [1 byte] 0x10 in this case +01f1 max-item-count [1 byte] 0x1f constant +01f3 node-level [1 byte] 0x00 in this case +01f8 back-pointer [4 bytes] 0x021eae in this case +]]></literallayout> + <para> + The item-count specifies the number of 16 byte records that + are active. The node-level is zero for these leaf nodes. + The back-pointer must match the back-pointer from the triple + that pointed to this node. + </para> + <para> + Each item in this node is a tuple of (ID2, DESC-ID1, LIST-ID1, PARENT-ID2) + </para> + </refsect1> + + <refsect1 id='pst.file.list.5'> + <title>Associated List Item</title> + <para> + Contains associations between id1 and id2 for the items controlled by the record. + In the above leaf node, we have a tuple of (0x61, 0x02a82c, 0x02a836, 0) + 0x02a836 is the ID1 of the associated list, and we can lookup that ID1 value + in the index1 b-tree to find the (offset,size) of the data in the .pst file. + </para> + <literallayout class="monospaced"><![CDATA[ +0000 02 00 01 00 9f 81 00 00 30 a8 02 00 00 00 00 00 + +0000 unknown [2 bytes] 0x0002 constant +0002 count [2 bytes] 0x0001 in this case + repeating +0004 id2 [4 bytes] 0x00819f in this case +0008 id [4 bytes] 0x02a830 in this case +000c unknown [4 bytes] 0 in this case +]]></literallayout> + </refsect1> + + <refsect1 id='pst.file.desc.5'> + <title>Associated Descriptor Item</title> + <para> + Contains information about the item, which may be email, contact, or other outlook types. + In the above leaf node, we have a tuple of (0x21, 0x00e638, 0, 0) + 0x00e638 is the ID1 of the associated descriptor, and we can lookup that ID1 value + in the index1 b-tree to find the (offset,size) of the data in the .pst file. + </para> + <literallayout class="monospaced"><![CDATA[ +0000 3c 01 ec bc 20 00 00 00 00 00 00 00 b5 02 06 00 +0010 40 00 00 00 f9 0f 02 01 60 00 00 00 01 30 1e 00 +0020 80 00 00 00 04 30 1e 00 00 00 00 00 df 35 03 00 +0030 ff 00 00 00 e0 35 02 01 a0 00 00 00 e2 35 02 01 +0040 e0 00 00 00 e3 35 02 01 c0 00 00 00 e4 35 02 01 +0050 00 01 00 00 e5 35 02 01 20 01 00 00 e6 35 02 01 +0060 40 01 00 00 e7 35 02 01 60 01 00 00 1e 66 0b 00 +0070 00 00 00 00 ff 67 03 00 00 00 00 00 d2 7f 17 d8 +0080 64 8c d5 11 83 24 00 50 04 86 95 45 53 74 61 6e +0090 6c 65 79 00 00 00 00 d2 7f 17 d8 64 8c d5 11 83 +00A0 24 00 50 04 86 95 45 22 80 00 00 00 00 00 00 d2 +00B0 7f 17 d8 64 8c d5 11 83 24 00 50 04 86 95 45 42 +00C0 80 00 00 00 00 00 00 d2 7f 17 d8 64 8c d5 11 83 +00D0 24 00 50 04 86 95 45 a2 80 00 00 00 00 00 00 d2 +00E0 7f 17 d8 64 8c d5 11 83 24 00 50 04 86 95 45 c2 +00F0 80 00 00 00 00 00 00 d2 7f 17 d8 64 8c d5 11 83 +0100 24 00 50 04 86 95 45 e2 80 00 00 00 00 00 00 d2 +0110 7f 17 d8 64 8c d5 11 83 24 00 50 04 86 95 45 02 +0120 81 00 00 00 00 00 00 d2 7f 17 d8 64 8c d5 11 83 +0130 24 00 50 04 86 95 45 62 80 00 00 00 0b 00 00 00 +0140 0c 00 14 00 7c 00 8c 00 93 00 ab 00 c3 00 db 00 +0150 f3 00 0b 01 23 01 3b 01 + +0000 index-offset [2 bytes] 0x013c in this case +0002 signature [2 bytes] 0xbcec constant +0004 offset [2 bytes] 0x0020 in this case +]]></literallayout> + <para> + Note the index-offset of 0x013c - starting at that position in the + descriptor block, we have an array of two byte integers. The first + integer (0x000b) is a count of the number of overlapping pairs + following the count. The first pair is (0, 0xc), the next pair is (0xc, 0x14) + and the last (11th) pair is (0x10b, 0x123). These pairs are (start,end+1) + offsets of items in this block. So we have count+1 integers following + the count value. + </para> + <para> + Note the offset of 0x0020, which needs to be right shifted by 4 bits + to become 0x0002, which is then a byte offset to be added to the above + index-offset plus two (to skip the count), so it points to the (0xc, 0x14) + pair. Finally, we have the offset and size of the "b5" block located at offset 0xc + with a size of 8 bytes in this descriptor block. The "b5" block has the + following format: + </para> + <literallayout class="monospaced"><![CDATA[ +0000 signature [2 bytes] 0x02b5 constant +0002 unknown [2 bytes] 0x0006 in this case +0004 offset [4 bytes] 0x0040 in this case +]]></literallayout> + <para> + Note the "b5" offset of 0x0040, which needs to be right shifted by 4 bits + to become 0x0004, which is then a byte offset to be added to the above + index-offset plus two (to skip the count), so it points to the (0x14, 0x7c) + pair. We now have the offset 0x14 of the descriptor array, composed of 8 byte + entries. Each descriptor entry has the following format: + </para> + <literallayout class="monospaced"><![CDATA[ +0000 item-type [2 bytes] +0002 reference-type [2 bytes] +0004 value [4 bytes] +]]></literallayout> + <para> + For some reference types (2, 3, 0xb) the value is used directly. Otherwise, + the value is generally a non-zero offset, to be right shifted by 4 bits and used to fetch + a pair from the index table to find the offset and size of the item in this + descriptor block. However, if (value AND 0xf) == 0xf, then the value is an ID2 index. + </para> + <para> + The following reference types are known, but not all of these + are implemented in the code yet. + </para> + <literallayout class="monospaced"><![CDATA[ +0x0002 - Signed 16bit value +0x0003 - Signed 32bit value +0x0004 - 4-byte floating point +0x0005 - Floating point double +0x0006 - Signed 64-bit int +0x0007 - Application Time +0x000A - 32-bit error value +0x000B - Boolean (non-zero = true) +0x000D - Embedded Object +0x0014 - 8-byte signed integer (64-bit) +0x001E - Null terminated String +0x001F - Unicode string +0x0040 - Systime - Filetime structure +0x0048 - OLE Guid +0x0102 - Binary data +0x1003 - Array of 32bit values +0x1014 - Array of 64bit values +0x101E - Array of Strings +0x1102 - Array of Binary data +]]></literallayout> + <para> + The following item types are known, but not all of these + are implemented in the code yet. + Note: it appears that some types can have a IPOS value or a ID2 value + depending on the size of the field in question. It is safer to check + every field than for me to say what the "usually" contain. Absolute + values though, are generally going to be constant. + </para> + <literallayout class="monospaced"><![CDATA[ +0002 AutoForward allowed +0003 Extended Attributes Table +0017 Importance Level +001a IPM Context. What type of message is this +0023 Global Delivery Report +0026 Priority +0029 Read Receipt +002b Reassignment Prohibited +002e Original Sensitivity +0036 Sensitivity +0037 Email Subject. The referenced item is of type "Subject Type" +0039 Date. This is likely to be the arrival date +003b Outlook Address of Sender +003f Outlook structure describing the recipient +0040 Name of the Outlook recipient structure +0041 Outlook structure describing the sender +0042 Name of the Outlook sender structure +0043 Another structure describing the recipient +0044 Name of the second recipient structure +004f Reply-To Outlook Structure +0050 Name of the Reply-To structure +0051 Outlook Name of recipient +0052 Second Outlook name of recipient +0057 My address in TO field +0058 My address in CC field +0059 Message addressed to me +0063 Response requested +0064 Sender's Address access method (SMTP, EX) +0065 Sender's Address +0070 Processed Subject (with Fwd:, Re, ... removed) +0071 Date. Another date +0075 Recipient Address Access Method (SMTP, EX) +0076 Recipient's Address +0077 Second Recipient Access Method (SMTP, EX) +0078 Second Recipient Address +007d Email Header. This is the header that was attached to the email +0c17 Reply Requested +0c19 Second sender struct +0c1a Name of second sender struct +0c1d Second outlook name of sender +0c1e Second sender access method (SMTP, EX) +0c1f Second Sender Address +0e01 Delete after submit +0e03 CC Address? +0e04 SentTo Address +0e06 Date. +0e07 Flag - contains IsSeen value +0e08 Message Size +0e0a Sentmail EntryID +0e1f Compressed RTF in Sync +0e20 Attachment Size +0ff9 binary record header +1000 Plain Text Email Body. Does not exist if the email doesn't have a plain text version +1006 RTF Sync Body CRC +1007 RTF Sync Body character count +1008 RTF Sync body tag +1009 RTF Compressed body +1010 RTF whitespace prefix count +1011 RTF whitespace tailing count +1013 HTML Email Body. Does not exist if the email doesn't have a HTML version +1035 Message ID +1042 In-Reply-To or Parent's Message ID +1046 Return Path +3001 Folder Name? I have seen this value used for the contacts record aswell +3002 Address Type +3003 Contact Address +3004 Comment +3007 Date item creation +3008 Date item modification +300b binary record header +35df Valid Folder Mask +35e0 binary record found in first item. Contains the reference to "Top of Personal Folder" item +35e3 binary record with a reference to "Deleted Items" item +35e7 binary record with a refernece to "Search Root" item +3602 the number of emails stored in a folder +3603 the number of unread emails in a folder +360a Has Subfolders +3613 the folder content description +3617 Associate Content count +3701 Binary Data attachment +3704 Attachment Filename +3705 Attachement method +3707 Attachment Filename long +370b Attachment Position +370e Attachment mime encoding +3710 Attachment Mime Sequence +3a00 Contact's Account name +3a01 Contact Alternate Recipient +3a02 Callback telephone number +3a03 Message Conversion Prohibited +3a05 Contacts Suffix +3a06 Contacts First Name +3a07 Contacts Government ID Number +3a08 Business Telephone Number +3a09 Home Telephone Number +3a0a Contacts Initials +3a0b Keyword +3a0c Contact's Language +3a0d Contact's Location +3a0e Mail Permission +3a0f MHS Common Name +3a10 Organizational ID # +3a11 Contacts Surname +3a12 original entry id +3a13 original display name +3a14 original search key +3a15 Default Postal Address +3a16 Company Name +3a17 Job Title +3a18 Department Name +3a19 Office Location +3a1a Primary Telephone +3a1b Business Phone Number 2 +3a1c Mobile Phone Number +3a1d Radio Phone Number +3a1e Car Phone Number +3a1f Other Phone Number +3a20 Transmittable Display Name +3a21 Pager Phone Number +3a22 user certificate +3a23 Primary Fax Number +3a24 Business Fax Number +3a25 Home Fax Number +3a26 Business Address Country +3a27 Business Address City +3a28 Business Address State +3a29 Business Address Street +3a2a Business Postal Code +3a2b Business PO Box +3a2c Telex Number +3a2d ISDN Number +3a2e Assistant Phone Number +3a2f Home Phone 2 +3a30 Assistant's Name +3a40 Can receive Rich Text +3a41 Wedding Anniversary +3a42 Birthday +3a43 Hobbies +3a44 Middle Name +3a45 Display Name Prefix (Title) +3a46 Profession +3a47 Preferred By Name +3a48 Spouse's Name +3a49 Computer Network Name +3a4a Customer ID +3a4b TTY/TDD Phone +3a4c Ftp Site +3a4d Gender +3a4e Manager's Name +3a4f Nickname +3a50 Personal Home Page +3a51 Business Home Page +3a57 Company Main Phone +3a58 childrens names +3a59 Home Address City +3a5a Home Address Country +3a5b Home Address Postal Code +3a5c Home Address State or Province +3a5d Home Address Street +3a5e Home Address Post Office Box +3a5f Other Address City +3a60 Other Address Country +3a61 Other Address Postal Code +3a62 Other Address State +3a63 Other Address Street +3a64 Other Address Post Office box +65e3 Entry ID +67f2 Attachment ID2 value +67ff Password checksum [0x67FF] +6f02 Secure HTML Body +6f04 Secure Text Body +7c07 Top of folders RecID [0x7c07] +8000 Contain extra bits of information that have been taken from the email's header. I call them extra lines +8005 Contact Fullname +801a Home Address +801b Business Address +801c Other Address +8082 Email Address 1 Transport +8083 Email Address 1 Address +8084 Email Address 1 Description +8085 Email Address 1 Record +8092 Email Address 2 Transport +8093 Email Address 2 Address +8094 DEBUG_EMAIL (("Email Address 2 Description +8095 Email Address 2 Record +80a2 DEBUG_EMAIL (("Email Address 3 Transport +80a3 Email Address 3 Address +80a4 Email Address 3 Description +80a5 Email Address 3 Record +80d8 Internet Free/Busy +8205 Appointment shows as +8208 Appointment Location +8214 Label for appointment +8234 TimeZone of times +8235 Appointment Start Time +8236 Appointment End Time +8516 Duplicate Time Start +8517 Duplicate Time End +8530 Followup String +8534 Mileage +8535 Billing Information +8554 Outlook Version +8560 Appointment Reminder Time +8700 Journal Entry Type +8706 Start Timestamp +8708 End Timestamp +8712 Journal Entry Type +]]></literallayout> + </refsect1> + + </refentry> </reference>