comparison xml/libpst.in @ 75:987aa872294e stable-0-6-11

Use ftello/fseeko to properly handle large files. Document and properly use datasize field in b5 blocks. Fix some MSVC compile issues and collect MSVC dependencies into one place.
author Carl Byington <carl@five-ten-sg.com>
date Tue, 03 Jun 2008 12:00:58 -0700
parents 1bd4491cf8ff
children 87216aefc6df
comparison
equal deleted inserted replaced
74:6f82d13e9300 75:987aa872294e
31 </partintro> 31 </partintro>
32 32
33 33
34 <refentry id="readpst.1"> 34 <refentry id="readpst.1">
35 <refentryinfo> 35 <refentryinfo>
36 <date>2008-05-16</date> 36 <date>2008-06-03</date>
37 </refentryinfo> 37 </refentryinfo>
38 38
39 <refmeta> 39 <refmeta>
40 <refentrytitle>readpst</refentrytitle> 40 <refentrytitle>readpst</refentrytitle>
41 <manvolnum>1</manvolnum> 41 <manvolnum>1</manvolnum>
224 </refentry> 224 </refentry>
225 225
226 226
227 <refentry id="lspst.1"> 227 <refentry id="lspst.1">
228 <refentryinfo> 228 <refentryinfo>
229 <date>2008-05-16</date> 229 <date>2008-06-03</date>
230 </refentryinfo> 230 </refentryinfo>
231 231
232 <refmeta> 232 <refmeta>
233 <refentrytitle>lspst</refentrytitle> 233 <refentrytitle>lspst</refentrytitle>
234 <manvolnum>1</manvolnum> 234 <manvolnum>1</manvolnum>
327 </refentry> 327 </refentry>
328 328
329 329
330 <refentry id="readpstlog.1"> 330 <refentry id="readpstlog.1">
331 <refentryinfo> 331 <refentryinfo>
332 <date>2008-05-16</date> 332 <date>2008-06-03</date>
333 </refentryinfo> 333 </refentryinfo>
334 334
335 <refmeta> 335 <refmeta>
336 <refentrytitle>readpstlog</refentrytitle> 336 <refentrytitle>readpstlog</refentrytitle>
337 <manvolnum>1</manvolnum> 337 <manvolnum>1</manvolnum>
502 </refentry> 502 </refentry>
503 503
504 504
505 <refentry id="pst2ldif.1"> 505 <refentry id="pst2ldif.1">
506 <refentryinfo> 506 <refentryinfo>
507 <date>2008-05-16</date> 507 <date>2008-06-03</date>
508 </refentryinfo> 508 </refentryinfo>
509 509
510 <refmeta> 510 <refmeta>
511 <refentrytitle>pst2ldif</refentrytitle> 511 <refentrytitle>pst2ldif</refentrytitle>
512 <manvolnum>1</manvolnum> 512 <manvolnum>1</manvolnum>
626 </refentry> 626 </refentry>
627 627
628 628
629 <refentry id="pst2dii.1"> 629 <refentry id="pst2dii.1">
630 <refentryinfo> 630 <refentryinfo>
631 <date>2008-05-16</date> 631 <date>2008-06-03</date>
632 </refentryinfo> 632 </refentryinfo>
633 633
634 <refmeta> 634 <refmeta>
635 <refentrytitle>pst2dii</refentrytitle> 635 <refentrytitle>pst2dii</refentrytitle>
636 <manvolnum>1</manvolnum> 636 <manvolnum>1</manvolnum>
760 </refentry> 760 </refentry>
761 761
762 762
763 <refentry id="pst.5"> 763 <refentry id="pst.5">
764 <refentryinfo> 764 <refentryinfo>
765 <date>2008-05-16</date> 765 <date>2008-06-03</date>
766 </refentryinfo> 766 </refentryinfo>
767 767
768 <refmeta> 768 <refmeta>
769 <refentrytitle>outlook.pst</refentrytitle> 769 <refentrytitle>outlook.pst</refentrytitle>
770 <manvolnum>5</manvolnum> 770 <manvolnum>5</manvolnum>
1575 with a size of 8 bytes in this descriptor block. The "b5" block has the 1575 with a size of 8 bytes in this descriptor block. The "b5" block has the
1576 following format: 1576 following format:
1577 </para> 1577 </para>
1578 <literallayout class="monospaced"><![CDATA[ 1578 <literallayout class="monospaced"><![CDATA[
1579 0000 signature [2 bytes] 0x02b5 constant 1579 0000 signature [2 bytes] 0x02b5 constant
1580 0002 unknown [2 bytes] 0x0006 in this case 1580 0002 datasize [2 bytes] 0x0006 constant +2 for 8 byte entries
1581 0004 descoffset [4 bytes] 0x0040 index reference 1581 0004 descoffset [4 bytes] 0x0040 index reference
1582 ]]></literallayout> 1582 ]]></literallayout>
1583 <para> 1583 <para>
1584 Note the descoffset of 0x0040, which again is an index reference. In this 1584 Note the descoffset of 0x0040, which again is an index reference. In this
1585 case, it is an internal pointer reference, which needs to be right shifted by 4 bits 1585 case, it is an internal pointer reference, which needs to be right shifted by 4 bits
1586 to become 0x0004, which is then a byte offset to be added to the above 1586 to become 0x0004, which is then a byte offset to be added to the above
1587 indexOffset plus two (to skip the count), so it points to the (0x14, 0x7c) 1587 indexOffset plus two (to skip the count), so it points to the (0x14, 0x7c)
1588 pair. We now have the offset 0x14 of the descriptor array, composed of 8 byte 1588 pair. The datasize (6) plus the b5 code (02) gives size of the entries,
1589 entries. Each descriptor entry has the following format: 1589 in this case 8 bytes. We now have the offset 0x14 of the descriptor array,
1590 composed of 8 byte entries. Each descriptor entry has the following format:
1590 </para> 1591 </para>
1591 <literallayout class="monospaced"><![CDATA[ 1592 <literallayout class="monospaced"><![CDATA[
1592 0000 itemType [2 bytes] 1593 0000 itemType [2 bytes]
1593 0002 referenceType [2 bytes] 1594 0002 referenceType [2 bytes]
1594 0004 value [4 bytes] 1595 0004 value [4 bytes]
1947 located at offset 0xc with a size of 8 bytes in this descriptor block. 1948 located at offset 0xc with a size of 8 bytes in this descriptor block.
1948 The "b5" block has the following format: 1949 The "b5" block has the following format:
1949 </para> 1950 </para>
1950 <literallayout class="monospaced"><![CDATA[ 1951 <literallayout class="monospaced"><![CDATA[
1951 0000 signature [2 bytes] 0x04b5 constant 1952 0000 signature [2 bytes] 0x04b5 constant
1952 0002 unknown [2 bytes] 0x0002 in this case 1953 0002 datasize [2 bytes] 0x0002 +4 for 6 byte entries in this case
1953 0004 descoffset [4 bytes] 0x0060 index reference 1954 0004 descoffset [4 bytes] 0x0060 index reference
1954 ]]></literallayout> 1955 ]]></literallayout>
1955 <para> 1956 <para>
1956 Note the descoffset of 0x0060, which again is an index reference. In this 1957 Note the descoffset of 0x0060, which again is an index reference. In this
1957 case, it is an internal pointer reference, which needs to be right shifted by 4 1958 case, it is an internal pointer reference, which needs to be right shifted by 4
1958 bits to become 0x0006, which is then a byte offset to be added to the 1959 bits to become 0x0006, which is then a byte offset to be added to the
1959 above indexOffset plus two (to skip the count), so it points to the 1960 above indexOffset plus two (to skip the count), so it points to the
1960 (0xea, 0xf0) pair. That gives us (0xf0 - 0xea)/6 = 1, so we have a 1961 (0xea, 0xf0) pair. The datasize (2) plus the b5 code (04) gives the size
1961 recordCount of one. The actual data between 0xea and 0xf0 is unknown 1962 of the entries, in this case 6 bytes. We now have the offset 0xea of an
1962 and unused here. 1963 unused block of data in an unknown format, composed of 6 byte entries.
1964 That gives us (0xf0 - 0xea)/6 = 1, so we have a recordCount of one.
1963 </para> 1965 </para>
1964 <para> 1966 <para>
1965 We have seen cases where the descoffset in the b5 block is zero, and 1967 We have seen cases where the descoffset in the b5 block is zero, and
1966 the index2Offset in the 7c block is zero. This has been seen for 1968 the index2Offset in the 7c block is zero. This has been seen for
1967 objects that seem to be attachments on messages that have been 1969 objects that seem to be attachments on messages that have been