comparison archive/64.bit.documentation @ 57:de3753c3160a

add archive directory with history of alioth versions that have been merged here
author Carl Byington <carl@five-ten-sg.com>
date Sat, 02 Feb 2008 12:54:07 -0800
parents
children
comparison
equal deleted inserted replaced
56:b504411ad213 57:de3753c3160a
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
2 <HTML>
3 <HEAD>
4 <TITLE> [Libpst-devel] Contribution for Outlook 2003 to libpst
5 </TITLE>
6 <LINK REL="Index" HREF="index.html" >
7 <LINK REL="made" HREF="mailto:libpst-devel%40lists.alioth.debian.org?Subject=%5BLibpst-devel%5D%20Contribution%20for%20Outlook%202003%20to%20libpst&In-Reply-To=">
8 <META NAME="robots" CONTENT="index,nofollow">
9 <META http-equiv="Content-Type" content="text/html; charset=us-ascii">
10
11 <LINK REL="Next" HREF="000132.html">
12 </HEAD>
13 <BODY BGCOLOR="#ffffff">
14 <H1>[Libpst-devel] Contribution for Outlook 2003 to libpst</H1>
15 <B>Alexander Grau</B>
16 <A HREF="mailto:libpst-devel%40lists.alioth.debian.org?Subject=%5BLibpst-devel%5D%20Contribution%20for%20Outlook%202003%20to%20libpst&In-Reply-To="
17 TITLE="[Libpst-devel] Contribution for Outlook 2003 to libpst">alexandergrau at gmx.de
18 </A><BR>
19 <I>Mon Jan 1 23:48:05 CET 2007</I>
20 <P><UL>
21
22 <LI>Next message: <A HREF="000132.html">[Libpst-devel] libpst 0.5.2 released
23 </A></li>
24 <LI> <B>Messages sorted by:</B>
25 <a href="date.html#130">[ date ]</a>
26 <a href="thread.html#130">[ thread ]</a>
27 <a href="subject.html#130">[ subject ]</a>
28 <a href="author.html#130">[ author ]</a>
29 </LI>
30 </UL>
31 <HR>
32 <!--beginarticle-->
33 <PRE>Hello Joseph Nahmias,
34
35 To be able to write a recovery software, we did reverse-engineer the
36 Outlook 20003 format.
37
38 Now I decided to give some contribution (attached), so you can support
39 this format in some later version :-) (I recall it is not supported
40 yet?). I welcome all questions or feedback on my information.
41
42 A Happy New Year!
43 Regards,
44 Alexander Grau
45
46
47
48
49
50 -------------- next part --------------
51 Outlook and Outlook2003 - The differences :-)
52
53
54 All values are LE byte order.
55
56 File Header
57 Ofs Length Meaning
58 0 4 Signature 0x4e444221
59 0x0a 2 Version
60 0x000e: Outlook &lt; 2003
61 0x0017: Outlook &gt;= 2003
62
63 Outlook&lt;2003
64 ---------------------------------------------
65 Node size 516
66 size of ID1/2's (IDsize) 4
67 size of file offsets (fileOfsSize) 4
68
69 File Header
70 Ofs Length Meaning
71 0xbc 4 index2RootNodeFileOfs
72 0xc4 4 index1RootNodeFileOfs
73
74 Index Node
75 Ofs Length Meaning
76 0x1f4 2 index node signature (8080/8181)
77 0x1f0 1 index node item count
78 0x1f1 1 index node max item count
79 0x1f3 1 index node level
80 0x29 1 typical index1 leaf node max item count
81 0x1f 1 typical index2 leaf node max item count
82 0x1f8 IDsize back pointer
83
84
85 Outlook &gt;= 2003
86 ---------------------------------------------
87 Node size 512
88 size of ID1/2's (IDsize) 8
89 size of file offsets (fileOfsSize) 8
90
91 File Header
92 Ofs Length Meaning
93 0xe0 8 index2RootNodeFileOfs
94 0xf0 8 index1RootNodeFileOfs
95
96 Index Node
97 Ofs Length Meaning
98 0x1f0 2 index node signature (8080/8181)
99 0x1e8 1 index node item count
100 0x1e9 1 index node max item count
101 0x1eb 1 index node level
102 0x14 1 typical index1 leaf node max item count
103 0x0f 1 typical index2 leaf node max item count
104 0x1f2 IDsize back pointer
105
106
107 In Outlook and Outlook 2003, the values in the other structures (e.g. inner nodes) have the same format, the only difference is the length of the ID1/2's and file offsets.
108
109 In my C++ implementation I managed this by using a buf class with functions for reading in all types of bit-lengths like this:
110
111
112 // read inner node records
113 bool PSTFile::readInnerNode(IndexNode &amp;node){
114 tracef(&quot;readInnerNode fileOfs=%.0f\n&quot;, (float)node.fileOfsFound);
115 unsigned __int64 firstId, backPtr, fileOfs;
116 SaveBuf buf;
117 if (!buf.malloc(olSpecs[olFmt].nodeSize)) return false;
118 if (getAtPos(node.fileOfsFound, buf.buf, olSpecs[olFmt].nodeSize)) return false;
119
120 if (!buf.seek(0)) return false;
121 for (int i=0; i &lt; node.maxItemCnt; i++){
122 IndexNodeRecord rec;
123 if (!buf.numberLE(rec.firstId, olSpecs[olFmt].idSize)) break;
124 if (!buf.numberLE(rec.backPtr, olSpecs[olFmt].idSize)) break;
125 if (!buf.numberLE(rec.fileOfs, olSpecs[olFmt].fileOfsSize)) break;
126 rec.node = NULL;
127 if ( (rec.firstId != 0) || (rec.backPtr != 0) || (rec.fileOfs != 0) ) {
128 node.indexNodeRecordList.push_back(rec);
129 tracef(&quot;node record: firstId=%.0f, backPtr=%.0f, fileOfs=%.0f\n&quot;,
130 (float)rec.firstId, (float)rec.backPtr, (float)rec.fileOfs);
131 }
132 }
133 trace(&quot;\n&quot;);
134 return true;
135 }
136
137
138
139 </PRE>
140
141
142
143 <!--endarticle-->
144 <HR>
145 <P><UL>
146 <!--threads-->
147
148 <LI>Next message: <A HREF="000132.html">[Libpst-devel] libpst 0.5.2 released
149 </A></li>
150 <LI> <B>Messages sorted by:</B>
151 <a href="date.html#130">[ date ]</a>
152 <a href="thread.html#130">[ thread ]</a>
153 <a href="subject.html#130">[ subject ]</a>
154 <a href="author.html#130">[ author ]</a>
155 </LI>
156 </UL>
157
158 <hr>
159 <a href="http://lists.alioth.debian.org/mailman/listinfo/libpst-devel">More information about the Libpst-devel
160 mailing list</a><br>
161 </body></html>