Mercurial > libpst
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 < 2003 | |
61 0x0017: Outlook >= 2003 | |
62 | |
63 Outlook<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 >= 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 &node){ | |
114 tracef("readInnerNode fileOfs=%.0f\n", (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 < 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("node record: firstId=%.0f, backPtr=%.0f, fileOfs=%.0f\n", | |
130 (float)rec.firstId, (float)rec.backPtr, (float)rec.fileOfs); | |
131 } | |
132 } | |
133 trace("\n"); | |
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> |