Main Page | Namespace List | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

libpst.c File Reference

#include "define.h"

Include dependency graph for libpst.c:

Include dependency graph

Go to the source code of this file.

Data Structures

struct  pst_block_offset
struct  pst_block_offset_pointer
struct  pst_holder
struct  pst_subblock
struct  pst_subblocks
struct  pst_mapi_element
struct  pst_mapi_object
struct  pst_desc32
struct  pst_index32
struct  pst_table_ptr_struct32
struct  pst_desc
struct  pst_index
struct  pst_table_ptr_struct
struct  pst_block_header
struct  pst_id2_assoc32
struct  pst_id2_assoc
struct  pst_table3_rec32
struct  pst_table3_rec
struct  pst_block_hdr
struct  pst_x_attrib

Defines

#define ASSERT(x)   { if(!(x)) raise( SIGSEGV ); }
#define INDEX_TYPE32   0x0E
#define INDEX_TYPE32A   0x0F
#define INDEX_TYPE64   0x17
#define INDEX_TYPE64A   0x15
#define INDEX_TYPE_OFFSET   (int64_t)0x0A
#define FILE_SIZE_POINTER32   (int64_t)0xA8
#define INDEX_POINTER32   (int64_t)0xC4
#define INDEX_BACK32   (int64_t)0xC0
#define SECOND_POINTER32   (int64_t)0xBC
#define SECOND_BACK32   (int64_t)0xB8
#define ENC_TYPE32   (int64_t)0x1CD
#define FILE_SIZE_POINTER64   (int64_t)0xB8
#define INDEX_POINTER64   (int64_t)0xF0
#define INDEX_BACK64   (int64_t)0xE8
#define SECOND_POINTER64   (int64_t)0xE0
#define SECOND_BACK64   (int64_t)0xD8
#define ENC_TYPE64   (int64_t)0x201
#define FILE_SIZE_POINTER   ((pf->do_read64) ? FILE_SIZE_POINTER64 : FILE_SIZE_POINTER32)
#define INDEX_POINTER   ((pf->do_read64) ? INDEX_POINTER64 : INDEX_POINTER32)
#define INDEX_BACK   ((pf->do_read64) ? INDEX_BACK64 : INDEX_BACK32)
#define SECOND_POINTER   ((pf->do_read64) ? SECOND_POINTER64 : SECOND_POINTER32)
#define SECOND_BACK   ((pf->do_read64) ? SECOND_BACK64 : SECOND_BACK32)
#define ENC_TYPE   ((pf->do_read64) ? ENC_TYPE64 : ENC_TYPE32)
#define PST_SIGNATURE   0x4E444221
#define ITEM_COUNT_OFFSET32   0x1f0
#define LEVEL_INDICATOR_OFFSET32   0x1f3
#define BACKLINK_OFFSET32   0x1f8
#define ITEM_SIZE32   12
#define DESC_SIZE32   16
#define INDEX_COUNT_MAX32   41
#define DESC_COUNT_MAX32   31
#define ITEM_COUNT_OFFSET64   0x1e8
#define LEVEL_INDICATOR_OFFSET64   0x1eb
#define BACKLINK_OFFSET64   0x1f8
#define ITEM_SIZE64   24
#define DESC_SIZE64   32
#define INDEX_COUNT_MAX64   20
#define DESC_COUNT_MAX64   15
#define BLOCK_SIZE   512
#define DESC_BLOCK_SIZE   512
#define ITEM_COUNT_OFFSET   (size_t)((pf->do_read64) ? ITEM_COUNT_OFFSET64 : ITEM_COUNT_OFFSET32)
#define LEVEL_INDICATOR_OFFSET   (size_t)((pf->do_read64) ? LEVEL_INDICATOR_OFFSET64 : LEVEL_INDICATOR_OFFSET32)
#define BACKLINK_OFFSET   (size_t)((pf->do_read64) ? BACKLINK_OFFSET64 : BACKLINK_OFFSET32)
#define ITEM_SIZE   (size_t)((pf->do_read64) ? ITEM_SIZE64 : ITEM_SIZE32)
#define DESC_SIZE   (size_t)((pf->do_read64) ? DESC_SIZE64 : DESC_SIZE32)
#define INDEX_COUNT_MAX   (int32_t)((pf->do_read64) ? INDEX_COUNT_MAX64 : INDEX_COUNT_MAX32)
#define DESC_COUNT_MAX   (int32_t)((pf->do_read64) ? DESC_COUNT_MAX64 : DESC_COUNT_MAX32)
#define SAFE_FREE(x)   {if (x) free(x);}
#define SAFE_FREE_STR(x)   SAFE_FREE(x.str)
#define SAFE_FREE_BIN(x)   SAFE_FREE(x.data)
#define MALLOC_EMAIL(x)   { if (!x->email) { x->email = (pst_item_email*) pst_malloc(sizeof(pst_item_email)); memset(x->email, 0, sizeof(pst_item_email) );} }
#define MALLOC_FOLDER(x)   { if (!x->folder) { x->folder = (pst_item_folder*) pst_malloc(sizeof(pst_item_folder)); memset(x->folder, 0, sizeof(pst_item_folder) );} }
#define MALLOC_CONTACT(x)   { if (!x->contact) { x->contact = (pst_item_contact*) pst_malloc(sizeof(pst_item_contact)); memset(x->contact, 0, sizeof(pst_item_contact) );} }
#define MALLOC_MESSAGESTORE(x)   { if (!x->message_store) { x->message_store = (pst_item_message_store*) pst_malloc(sizeof(pst_item_message_store)); memset(x->message_store, 0, sizeof(pst_item_message_store));} }
#define MALLOC_JOURNAL(x)   { if (!x->journal) { x->journal = (pst_item_journal*) pst_malloc(sizeof(pst_item_journal)); memset(x->journal, 0, sizeof(pst_item_journal) );} }
#define MALLOC_APPOINTMENT(x)   { if (!x->appointment) { x->appointment = (pst_item_appointment*) pst_malloc(sizeof(pst_item_appointment)); memset(x->appointment, 0, sizeof(pst_item_appointment) );} }
#define LIST_COPY(targ, type)
#define LIST_COPY_CSTR(targ)
#define LIST_COPY_BOOL(label, targ)
#define LIST_COPY_EMAIL_BOOL(label, targ)
#define LIST_COPY_CONTACT_BOOL(label, targ)
#define LIST_COPY_APPT_BOOL(label, targ)
#define LIST_COPY_INT16_N(targ)
#define LIST_COPY_INT16(label, targ)
#define LIST_COPY_INT32_N(targ)
#define LIST_COPY_INT32(label, targ)
#define LIST_COPY_EMAIL_INT32(label, targ)
#define LIST_COPY_APPT_INT32(label, targ)
#define LIST_COPY_FOLDER_INT32(label, targ)
#define LIST_COPY_STORE_INT32(label, targ)
#define LIST_COPY_ENUM(label, targ, delta, count,)
#define LIST_COPY_EMAIL_ENUM(label, targ, delta, count,)
#define LIST_COPY_APPT_ENUM(label, targ, delta, count,)
#define LIST_COPY_ENUM16(label, targ, delta, count,)
#define LIST_COPY_CONTACT_ENUM16(label, targ, delta, count,)
#define LIST_COPY_ENTRYID(label, targ)
#define LIST_COPY_EMAIL_ENTRYID(label, targ)
#define LIST_COPY_STORE_ENTRYID(label, targ)
#define LIST_COPY_STR(label, targ)
#define LIST_COPY_EMAIL_STR(label, targ)
#define LIST_COPY_CONTACT_STR(label, targ)
#define LIST_COPY_APPT_STR(label, targ)
#define LIST_COPY_JOURNAL_STR(label, targ)
#define LIST_COPY_TIME(label, targ)
#define LIST_COPY_EMAIL_TIME(label, targ)
#define LIST_COPY_CONTACT_TIME(label, targ)
#define LIST_COPY_APPT_TIME(label, targ)
#define LIST_COPY_JOURNAL_TIME(label, targ)
#define LIST_COPY_BIN(targ)
#define LIST_COPY_EMAIL_BIN(label, targ)
#define LIST_COPY_APPT_BIN(label, targ)
#define NULL_CHECK(x)   { if (!x) { DEBUG_WARN(("NULL_CHECK: Null Found\n")); break;} }

Typedefs

typedef pst_block_offset pst_block_offset
typedef pst_block_offset_pointer pst_block_offset_pointer
typedef pst_holder pst_holder
typedef pst_subblock pst_subblock
typedef pst_subblocks pst_subblocks
typedef pst_mapi_element pst_mapi_element
typedef pst_mapi_object pst_mapi_object
typedef pst_desc32 pst_desc32
typedef pst_index32 pst_index32
typedef pst_desc pst_desc
typedef pst_index pst_index
typedef pst_block_header pst_block_header
typedef pst_id2_assoc32 pst_id2_assoc32
typedef pst_id2_assoc pst_id2_assoc
typedef pst_table3_rec32 pst_table3_rec32
typedef pst_table3_rec pst_table3_rec
typedef pst_block_hdr pst_block_hdr
typedef pst_x_attrib pst_x_attrib

Functions

size_t pst_append_holder (pst_holder *h, size_t size, char **buf, size_t z)
int pst_build_desc_ptr (pst_file *pf, int64_t offset, int32_t depth, uint64_t linku1, uint64_t start_val, uint64_t end_val)
pst_id2_treepst_build_id2 (pst_file *pf, pst_index_ll *list)
int pst_build_id_ptr (pst_file *pf, int64_t offset, int32_t depth, uint64_t linku1, uint64_t start_val, uint64_t end_val)
 Process the index1 b-tree from the pst file and create the pf->i_head linked list from it.
int pst_chr_count (char *str, char x)
size_t pst_ff_compile_ID (pst_file *pf, uint64_t i_id, pst_holder *h, size_t size)
size_t pst_ff_getIDblock (pst_file *pf, uint64_t i_id, char **buf)
size_t pst_ff_getID2block (pst_file *pf, uint64_t id2, pst_id2_tree *id2_head, char **buf)
size_t pst_ff_getID2data (pst_file *pf, pst_index_ll *ptr, pst_holder *h)
size_t pst_finish_cleanup_holder (pst_holder *h, size_t size)
void pst_free_attach (pst_item_attach *attach)
void pst_free_desc (pst_desc_tree *head)
void pst_free_id2 (pst_id2_tree *head)
void pst_free_id (pst_index_ll *head)
void pst_free_list (pst_mapi_object *list)
void pst_free_xattrib (pst_x_attrib_ll *x)
size_t pst_getAtPos (pst_file *pf, int64_t pos, void *buf, size_t size)
int pst_getBlockOffsetPointer (pst_file *pf, pst_id2_tree *i2_head, pst_subblocks *subblocks, uint32_t offset, pst_block_offset_pointer *p)
int pst_getBlockOffset (char *buf, size_t read_size, uint32_t i_offset, uint32_t offset, pst_block_offset *p)
pst_id2_treepst_getID2 (pst_id2_tree *ptr, uint64_t id)
pst_desc_treepst_getDptr (pst_file *pf, uint64_t d_id)
uint64_t pst_getIntAt (pst_file *pf, char *buf)
uint64_t pst_getIntAtPos (pst_file *pf, int64_t pos)
pst_mapi_objectpst_parse_block (pst_file *pf, uint64_t block_id, pst_id2_tree *i2_head)
void pst_printDptr (pst_file *pf, pst_desc_tree *ptr)
void pst_printID2ptr (pst_id2_tree *ptr)
int pst_process (pst_mapi_object *list, pst_item *item, pst_item_attach *attach)
size_t pst_read_block_size (pst_file *pf, int64_t offset, size_t size, char **buf)
int pst_decrypt (uint64_t i_id, char *buf, size_t size, unsigned char type)
int pst_stricmp (char *a, char *b)
int pst_strincmp (char *a, char *b, size_t x)
char * pst_wide_to_single (char *wt, size_t size)
int pst_open (pst_file *pf, const char *name)
 Open a pst file.
int pst_reopen (pst_file *pf)
 Reopen the pst file after a fork.
int pst_close (pst_file *pf)
 Close a pst file.
void add_descriptor_to_list (pst_desc_tree *node, pst_desc_tree **head, pst_desc_tree **tail)
 add a pst descriptor node to a linked list of such nodes.
void record_descriptor (pst_file *pf, pst_desc_tree *node)
 add a pst descriptor node into the global tree.
pst_id2_treedeep_copy (pst_id2_tree *head)
 make a deep copy of part of the id2 mapping tree, for use by an attachment containing an embedded rfc822 message.
pst_desc_treepst_getTopOfFolders (pst_file *pf, const pst_item *root)
 Get the top of folders descriptor tree.
pst_binary pst_attach_to_mem (pst_file *pf, pst_item_attach *attach)
 Assemble the binary attachment into a single buffer.
size_t pst_attach_to_file (pst_file *pf, pst_item_attach *attach, FILE *fp)
 Write a binary attachment to a file.
size_t pst_attach_to_file_base64 (pst_file *pf, pst_item_attach *attach, FILE *fp)
 Write a binary attachment base64 encoded to a file.
int pst_load_index (pst_file *pf)
 Load the index entries from the pst file.
pst_desc_treepst_getNextDptr (pst_desc_tree *d)
 Walk the descriptor tree.
int pst_load_extended_attributes (pst_file *pf)
 Load the extended attribute mapping table from the pst file.
size_t pst_decode_desc (pst_file *pf, pst_desc *desc, char *buf)
size_t pst_decode_table (pst_file *pf, struct pst_table_ptr_struct *table, char *buf)
size_t pst_decode_index (pst_file *pf, pst_index *index, char *buf)
size_t pst_decode_assoc (pst_file *pf, pst_id2_assoc *assoc, char *buf)
size_t pst_decode_type3 (pst_file *pf, pst_table3_rec *table3_rec, char *buf)
pst_itempst_parse_item (pst_file *pf, pst_desc_tree *d_ptr, pst_id2_tree *m_head)
 Assemble a mapi object from a descriptor pointer.

Variables

unsigned char comp_enc []
 for "compressible" encryption, just a simple substitution cipher, plaintext = comp_enc[ciphertext]; for "strong" encryption, this is the first rotor of an Enigma 3 rotor cipher.
unsigned char comp_high1 []
 for "strong" encryption, this is the second rotor of an Enigma 3 rotor cipher.
unsigned char comp_high2 []
 for "strong" encryption, this is the third rotor of an Enigma 3 rotor cipher.


Define Documentation

#define ASSERT  )     { if(!(x)) raise( SIGSEGV ); }
 

Definition at line 20 of file libpst.c.

#define BACKLINK_OFFSET   (size_t)((pf->do_read64) ? BACKLINK_OFFSET64 : BACKLINK_OFFSET32)
 

Definition at line 815 of file libpst.c.

Referenced by pst_build_id_ptr().

#define BACKLINK_OFFSET32   0x1f8
 

Definition at line 797 of file libpst.c.

#define BACKLINK_OFFSET64   0x1f8
 

Definition at line 805 of file libpst.c.

#define BLOCK_SIZE   512
 

Definition at line 811 of file libpst.c.

Referenced by pst_build_id_ptr().

#define DESC_BLOCK_SIZE   512
 

Definition at line 812 of file libpst.c.

#define DESC_COUNT_MAX   (int32_t)((pf->do_read64) ? DESC_COUNT_MAX64 : DESC_COUNT_MAX32)
 

Definition at line 819 of file libpst.c.

#define DESC_COUNT_MAX32   31
 

Definition at line 801 of file libpst.c.

#define DESC_COUNT_MAX64   15
 

Definition at line 809 of file libpst.c.

#define DESC_SIZE   (size_t)((pf->do_read64) ? DESC_SIZE64 : DESC_SIZE32)
 

Definition at line 817 of file libpst.c.

#define DESC_SIZE32   16
 

Definition at line 799 of file libpst.c.

#define DESC_SIZE64   32
 

Definition at line 807 of file libpst.c.

#define ENC_TYPE   ((pf->do_read64) ? ENC_TYPE64 : ENC_TYPE32)
 

Definition at line 47 of file libpst.c.

Referenced by pst_open().

#define ENC_TYPE32   (int64_t)0x1CD
 

Definition at line 33 of file libpst.c.

#define ENC_TYPE64   (int64_t)0x201
 

Definition at line 40 of file libpst.c.

#define FILE_SIZE_POINTER   ((pf->do_read64) ? FILE_SIZE_POINTER64 : FILE_SIZE_POINTER32)
 

Definition at line 42 of file libpst.c.

Referenced by pst_open().

#define FILE_SIZE_POINTER32   (int64_t)0xA8
 

Definition at line 28 of file libpst.c.

#define FILE_SIZE_POINTER64   (int64_t)0xB8
 

Definition at line 35 of file libpst.c.

#define INDEX_BACK   ((pf->do_read64) ? INDEX_BACK64 : INDEX_BACK32)
 

Definition at line 44 of file libpst.c.

Referenced by pst_open().

#define INDEX_BACK32   (int64_t)0xC0
 

Definition at line 30 of file libpst.c.

#define INDEX_BACK64   (int64_t)0xE8
 

Definition at line 37 of file libpst.c.

#define INDEX_COUNT_MAX   (int32_t)((pf->do_read64) ? INDEX_COUNT_MAX64 : INDEX_COUNT_MAX32)
 

Definition at line 818 of file libpst.c.

Referenced by pst_build_id_ptr().

#define INDEX_COUNT_MAX32   41
 

Definition at line 800 of file libpst.c.

#define INDEX_COUNT_MAX64   20
 

Definition at line 808 of file libpst.c.

#define INDEX_POINTER   ((pf->do_read64) ? INDEX_POINTER64 : INDEX_POINTER32)
 

Definition at line 43 of file libpst.c.

Referenced by pst_open().

#define INDEX_POINTER32   (int64_t)0xC4
 

Definition at line 29 of file libpst.c.

#define INDEX_POINTER64   (int64_t)0xF0
 

Definition at line 36 of file libpst.c.

#define INDEX_TYPE32   0x0E
 

Definition at line 22 of file libpst.c.

Referenced by pst_open().

#define INDEX_TYPE32A   0x0F
 

Definition at line 23 of file libpst.c.

Referenced by pst_open().

#define INDEX_TYPE64   0x17
 

Definition at line 24 of file libpst.c.

Referenced by pst_open().

#define INDEX_TYPE64A   0x15
 

Definition at line 25 of file libpst.c.

Referenced by pst_open().

#define INDEX_TYPE_OFFSET   (int64_t)0x0A
 

Definition at line 26 of file libpst.c.

Referenced by pst_open().

#define ITEM_COUNT_OFFSET   (size_t)((pf->do_read64) ? ITEM_COUNT_OFFSET64 : ITEM_COUNT_OFFSET32)
 

Definition at line 813 of file libpst.c.

#define ITEM_COUNT_OFFSET32   0x1f0
 

Definition at line 795 of file libpst.c.

#define ITEM_COUNT_OFFSET64   0x1e8
 

Definition at line 803 of file libpst.c.

#define ITEM_SIZE   (size_t)((pf->do_read64) ? ITEM_SIZE64 : ITEM_SIZE32)
 

Definition at line 816 of file libpst.c.

#define ITEM_SIZE32   12
 

Definition at line 798 of file libpst.c.

Referenced by pst_build_id_ptr().

#define ITEM_SIZE64   24
 

Definition at line 806 of file libpst.c.

#define LEVEL_INDICATOR_OFFSET   (size_t)((pf->do_read64) ? LEVEL_INDICATOR_OFFSET64 : LEVEL_INDICATOR_OFFSET32)
 

Definition at line 814 of file libpst.c.

#define LEVEL_INDICATOR_OFFSET32   0x1f3
 

Definition at line 796 of file libpst.c.

#define LEVEL_INDICATOR_OFFSET64   0x1eb
 

Definition at line 804 of file libpst.c.

#define LIST_COPY targ,
type   ) 
 

Value:

{                                    \
    targ = type realloc(targ, list->elements[x]->size+1);          \
    memcpy(targ, list->elements[x]->data, list->elements[x]->size);\
    memset(((char*)targ)+list->elements[x]->size, 0, (size_t)1);   \
}

#define LIST_COPY_APPT_BIN label,
targ   ) 
 

Value:

{           \
    MALLOC_APPOINTMENT(item);                       \
    LIST_COPY_BIN(targ);                            \
    DEBUG_INFO((label"\n"));                       \
    DEBUG_HEXDUMP(targ.data, targ.size);            \
}

#define LIST_COPY_APPT_BOOL label,
targ   ) 
 

Value:

{                      \
    MALLOC_APPOINTMENT(item);                                   \
    LIST_COPY_BOOL(label, targ)                                 \
}

#define LIST_COPY_APPT_ENUM label,
targ,
delta,
count   ) 
 

Value:

{   \
    MALLOC_APPOINTMENT(item);                                   \
    LIST_COPY_ENUM(label, targ, delta, count, __VA_ARGS__);     \
}

#define LIST_COPY_APPT_INT32 label,
targ   ) 
 

Value:

{                     \
    MALLOC_APPOINTMENT(item);                                   \
    LIST_COPY_INT32(label, targ);                               \
}

#define LIST_COPY_APPT_STR label,
targ   ) 
 

Value:

{                       \
    MALLOC_APPOINTMENT(item);                                   \
    LIST_COPY_STR(label, targ);                                 \
}

#define LIST_COPY_APPT_TIME label,
targ   ) 
 

Value:

{                      \
    MALLOC_APPOINTMENT(item);                                   \
    LIST_COPY_TIME(label, targ);                                \
}

#define LIST_COPY_BIN targ   ) 
 

Value:

{                                       \
    targ.size = list->elements[x]->size;                            \
    if (targ.size) {                                                \
        targ.data = (char*)realloc(targ.data, targ.size);           \
        memcpy(targ.data, list->elements[x]->data, targ.size);      \
    }                                                               \
    else {                                                          \
        SAFE_FREE_BIN(targ);                                        \
        targ.data = NULL;                                           \
    }                                                               \
}

#define LIST_COPY_BOOL label,
targ   ) 
 

Value:

{                                       \
    if (list->elements[x]->type != 0x0b) {                                  \
        DEBUG_WARN(("src not 0x0b for boolean dst\n"));                    \
        DEBUG_HEXDUMP(list->elements[x]->data, list->elements[x]->size);    \
    }                                                                       \
    if (*(int16_t*)list->elements[x]->data) {                               \
        DEBUG_INFO((label" - True\n"));                                    \
        targ = 1;                                                           \
    } else {                                                                \
        DEBUG_INFO((label" - False\n"));                                   \
        targ = 0;                                                           \
    }                                                                       \
}

#define LIST_COPY_CONTACT_BOOL label,
targ   ) 
 

Value:

{                   \
    MALLOC_CONTACT(item);                                       \
    LIST_COPY_BOOL(label, targ)                                 \
}

#define LIST_COPY_CONTACT_ENUM16 label,
targ,
delta,
count   ) 
 

Value:

{  \
    MALLOC_CONTACT(item);                                           \
    LIST_COPY_ENUM16(label, targ, delta, count, __VA_ARGS__);       \
}

#define LIST_COPY_CONTACT_STR label,
targ   ) 
 

Value:

{                    \
    MALLOC_CONTACT(item);                                       \
    LIST_COPY_STR(label, targ);                                 \
}

#define LIST_COPY_CONTACT_TIME label,
targ   ) 
 

Value:

{                   \
    MALLOC_CONTACT(item);                                       \
    LIST_COPY_TIME(label, targ);                                \
}

#define LIST_COPY_CSTR targ   ) 
 

Value:

{                                              \
    if ((list->elements[x]->type == 0x1f) ||                                \
        (list->elements[x]->type == 0x1e) ||                                \
        (list->elements[x]->type == 0x102)) {                               \
        LIST_COPY(targ, (char*))                                            \
    }                                                                       \
    else {                                                                  \
        DEBUG_WARN(("src not 0x1e or 0x1f or 0x102 for string dst\n"));    \
        DEBUG_HEXDUMP(list->elements[x]->data, list->elements[x]->size);    \
        SAFE_FREE(targ);                                                    \
        targ = NULL;                                                        \
    }                                                                       \
}

#define LIST_COPY_EMAIL_BIN label,
targ   ) 
 

Value:

{          \
    MALLOC_EMAIL(item);                             \
    LIST_COPY_BIN(targ);                            \
    DEBUG_INFO((label"\n"));                       \
}

#define LIST_COPY_EMAIL_BOOL label,
targ   ) 
 

Value:

{                     \
    MALLOC_EMAIL(item);                                         \
    LIST_COPY_BOOL(label, targ)                                 \
}

#define LIST_COPY_EMAIL_ENTRYID label,
targ   ) 
 

Value:

{                  \
    MALLOC_EMAIL(item);                                         \
    LIST_COPY_ENTRYID(label, targ);                             \
}

#define LIST_COPY_EMAIL_ENUM label,
targ,
delta,
count   ) 
 

Value:

{  \
    MALLOC_EMAIL(item);                                         \
    LIST_COPY_ENUM(label, targ, delta, count, __VA_ARGS__);     \
}

#define LIST_COPY_EMAIL_INT32 label,
targ   ) 
 

Value:

{                    \
    MALLOC_EMAIL(item);                                         \
    LIST_COPY_INT32(label, targ);                               \
}

#define LIST_COPY_EMAIL_STR label,
targ   ) 
 

Value:

{                      \
    MALLOC_EMAIL(item);                                         \
    LIST_COPY_STR(label, targ);                                 \
}

#define LIST_COPY_EMAIL_TIME label,
targ   ) 
 

Value:

{                     \
    MALLOC_EMAIL(item);                                         \
    LIST_COPY_TIME(label, targ);                                \
}

#define LIST_COPY_ENTRYID label,
targ   ) 
 

Value:

{                        \
    LIST_COPY(targ, (pst_entryid*));                            \
    LE32_CPU(targ->u1);                                         \
    LE32_CPU(targ->id);                                         \
    DEBUG_INFO((label" u1=%#x, id=%#x\n", targ->u1, targ->id));\
}

#define LIST_COPY_ENUM label,
targ,
delta,
count   ) 
 

Value:

{        \
    char *tlabels[] = {__VA_ARGS__};                            \
    LIST_COPY_INT32_N(targ);                                    \
    targ += delta;                                              \
    DEBUG_INFO((label" - %s [%i]\n",                           \
        (((int)targ < 0) || ((int)targ >= count))               \
            ? "**invalid"                                       \
            : tlabels[(int)targ], (int)targ));                  \
}

#define LIST_COPY_ENUM16 label,
targ,
delta,
count   ) 
 

Value:

{      \
    char *tlabels[] = {__VA_ARGS__};                            \
    LIST_COPY_INT16_N(targ);                                    \
    targ += delta;                                              \
    DEBUG_INFO((label" - %s [%i]\n",                           \
        (((int)targ < 0) || ((int)targ >= count))               \
            ? "**invalid"                                       \
            : tlabels[(int)targ], (int)targ));                  \
}

#define LIST_COPY_FOLDER_INT32 label,
targ   ) 
 

Value:

{                   \
    MALLOC_FOLDER(item);                                        \
    LIST_COPY_INT32(label, targ);                               \
}

#define LIST_COPY_INT16 label,
targ   ) 
 

Value:

{                          \
    LIST_COPY_INT16_N(targ);                                    \
    DEBUG_INFO((label" - %i %#x\n", (int)targ, (int)targ));    \
}

#define LIST_COPY_INT16_N targ   ) 
 

Value:

{                                           \
    if (list->elements[x]->type != 0x02) {                                  \
        DEBUG_WARN(("src not 0x02 for int16 dst\n"));                      \
        DEBUG_HEXDUMP(list->elements[x]->data, list->elements[x]->size);    \
    }                                                                       \
    memcpy(&(targ), list->elements[x]->data, sizeof(targ));                 \
    LE16_CPU(targ);                                                         \
}

#define LIST_COPY_INT32 label,
targ   ) 
 

Value:

{                          \
    LIST_COPY_INT32_N(targ);                                    \
    DEBUG_INFO((label" - %i %#x\n", (int)targ, (int)targ));    \
}

#define LIST_COPY_INT32_N targ   ) 
 

Value:

{                                           \
    if (list->elements[x]->type != 0x03) {                                  \
        DEBUG_WARN(("src not 0x03 for int32 dst\n"));                      \
        DEBUG_HEXDUMP(list->elements[x]->data, list->elements[x]->size);    \
    }                                                                       \
    memcpy(&(targ), list->elements[x]->data, sizeof(targ));                 \
    LE32_CPU(targ);                                                         \
}

#define LIST_COPY_JOURNAL_STR label,
targ   ) 
 

Value:

{                    \
    MALLOC_JOURNAL(item);                                       \
    LIST_COPY_STR(label, targ);                                 \
}

#define LIST_COPY_JOURNAL_TIME label,
targ   ) 
 

Value:

{                   \
    MALLOC_JOURNAL(item);                                       \
    LIST_COPY_TIME(label, targ);                                \
}

#define LIST_COPY_STORE_ENTRYID label,
targ   ) 
 

Value:

{                  \
    MALLOC_MESSAGESTORE(item);                                  \
    LIST_COPY_ENTRYID(label, targ);                             \
}

#define LIST_COPY_STORE_INT32 label,
targ   ) 
 

Value:

{                    \
    MALLOC_MESSAGESTORE(item);                                  \
    LIST_COPY_INT32(label, targ);                               \
}

#define LIST_COPY_STR label,
targ   ) 
 

Value:

{                                    \
    LIST_COPY_CSTR(targ.str);                                           \
    targ.is_utf8 = (list->elements[x]->type == 0x1f) ? 1 : 0;           \
    DEBUG_INFO((label" - unicode %d - %s\n", targ.is_utf8, targ.str)); \
}

#define LIST_COPY_TIME label,
targ   ) 
 

Value:

{                                       \
    if (list->elements[x]->type != 0x40) {                                  \
        DEBUG_WARN(("src not 0x40 for filetime dst\n"));                    \
        DEBUG_HEXDUMP(list->elements[x]->data, list->elements[x]->size);    \
    }                                                                       \
    targ = (FILETIME*) realloc(targ, sizeof(FILETIME));                     \
    memcpy(targ, list->elements[x]->data, list->elements[x]->size);         \
    LE32_CPU(targ->dwLowDateTime);                                          \
    LE32_CPU(targ->dwHighDateTime);                                         \
    DEBUG_INFO((label" - %s", pst_fileTimeToAscii(targ, time_buffer)));    \
}

#define MALLOC_APPOINTMENT  )     { if (!x->appointment) { x->appointment = (pst_item_appointment*) pst_malloc(sizeof(pst_item_appointment)); memset(x->appointment, 0, sizeof(pst_item_appointment) );} }
 

#define MALLOC_CONTACT  )     { if (!x->contact) { x->contact = (pst_item_contact*) pst_malloc(sizeof(pst_item_contact)); memset(x->contact, 0, sizeof(pst_item_contact) );} }
 

#define MALLOC_EMAIL  )     { if (!x->email) { x->email = (pst_item_email*) pst_malloc(sizeof(pst_item_email)); memset(x->email, 0, sizeof(pst_item_email) );} }
 

#define MALLOC_FOLDER  )     { if (!x->folder) { x->folder = (pst_item_folder*) pst_malloc(sizeof(pst_item_folder)); memset(x->folder, 0, sizeof(pst_item_folder) );} }
 

#define MALLOC_JOURNAL  )     { if (!x->journal) { x->journal = (pst_item_journal*) pst_malloc(sizeof(pst_item_journal)); memset(x->journal, 0, sizeof(pst_item_journal) );} }
 

#define MALLOC_MESSAGESTORE  )     { if (!x->message_store) { x->message_store = (pst_item_message_store*) pst_malloc(sizeof(pst_item_message_store)); memset(x->message_store, 0, sizeof(pst_item_message_store));} }
 

#define NULL_CHECK  )     { if (!x) { DEBUG_WARN(("NULL_CHECK: Null Found\n")); break;} }
 

#define PST_SIGNATURE   0x4E444221
 

Definition at line 49 of file libpst.c.

#define SAFE_FREE  )     {if (x) free(x);}
 

#define SAFE_FREE_BIN  )     SAFE_FREE(x.data)
 

#define SAFE_FREE_STR  )     SAFE_FREE(x.str)
 

#define SECOND_BACK   ((pf->do_read64) ? SECOND_BACK64 : SECOND_BACK32)
 

Definition at line 46 of file libpst.c.

Referenced by pst_open().

#define SECOND_BACK32   (int64_t)0xB8
 

Definition at line 32 of file libpst.c.

#define SECOND_BACK64   (int64_t)0xD8
 

Definition at line 39 of file libpst.c.

#define SECOND_POINTER   ((pf->do_read64) ? SECOND_POINTER64 : SECOND_POINTER32)
 

Definition at line 45 of file libpst.c.

Referenced by pst_open().

#define SECOND_POINTER32   (int64_t)0xBC
 

Definition at line 31 of file libpst.c.

#define SECOND_POINTER64   (int64_t)0xE0
 

Definition at line 38 of file libpst.c.


Typedef Documentation

typedef struct pst_block_hdr pst_block_hdr
 

typedef struct pst_block_header pst_block_header
 

typedef struct pst_block_offset pst_block_offset
 

typedef struct pst_block_offset_pointer pst_block_offset_pointer
 

typedef struct pst_desc pst_desc
 

Referenced by pst_decode_desc().

typedef struct pst_desc32 pst_desc32
 

Referenced by pst_decode_desc().

typedef struct pst_holder pst_holder
 

typedef struct pst_id2_assoc pst_id2_assoc
 

Referenced by pst_decode_assoc().

typedef struct pst_id2_assoc32 pst_id2_assoc32
 

Referenced by pst_decode_assoc().

typedef struct pst_index pst_index
 

Referenced by pst_decode_index().

typedef struct pst_index32 pst_index32
 

Referenced by pst_decode_index().

typedef struct pst_mapi_element pst_mapi_element
 

typedef struct pst_mapi_object pst_mapi_object
 

typedef struct pst_subblock pst_subblock
 

typedef struct pst_subblocks pst_subblocks
 

typedef struct pst_table3_rec pst_table3_rec
 

Referenced by pst_decode_type3().

typedef struct pst_table3_rec32 pst_table3_rec32
 

Referenced by pst_decode_type3().

typedef struct pst_x_attrib pst_x_attrib
 


Function Documentation

void add_descriptor_to_list pst_desc_tree node,
pst_desc_tree **  head,
pst_desc_tree **  tail
[static]
 

add a pst descriptor node to a linked list of such nodes.

Parameters:
node pointer to the node to be added to the list
head pointer to the list head pointer
tail pointer to the list tail pointer

Definition at line 409 of file libpst.c.

References DEBUG_ENT, DEBUG_RET, pst_desc_tree::next, pst_mapi_object::next, and pst_desc_tree::prev.

Referenced by record_descriptor().

pst_id2_tree * deep_copy pst_id2_tree head  )  [static]
 

make a deep copy of part of the id2 mapping tree, for use by an attachment containing an embedded rfc822 message.

Parameters:
head pointer to the subtree to be copied
Returns:
pointer to the new copy of the subtree

Definition at line 498 of file libpst.c.

References pst_id2_tree::child, pst_id2_tree::id, pst_id2_tree::id2, pst_id2_tree::next, and pst_malloc().

Referenced by pst_parse_item().

Here is the call graph for this function:

size_t pst_append_holder pst_holder h,
size_t  size,
char **  buf,
size_t  z
[static]
 

size_t pst_attach_to_file pst_file pf,
pst_item_attach attach,
FILE *  fp
 

Write a binary attachment to a file.

Parameters:
pf pointer to the pst_file structure setup by pst_open().
attach pointer to the attachment record
fp pointer to an open FILE.

Definition at line 566 of file libpst.c.

References pst_item_attach::data, pst_binary::data, DEBUG_ENT, DEBUG_RET, DEBUG_WARN, pst_item_attach::i_id, pst_ff_getID2data(), pst_fwrite(), pst_getID(), and pst_binary::size.

Referenced by write_separate_attachment().

Here is the call graph for this function:

size_t pst_attach_to_file_base64 pst_file pf,
pst_item_attach attach,
FILE *  fp
 

Write a binary attachment base64 encoded to a file.

Parameters:
pf pointer to the pst_file structure setup by pst_open().
attach pointer to the attachment record
fp pointer to an open FILE.

Definition at line 590 of file libpst.c.

References pst_item_attach::data, pst_binary::data, DEBUG_ENT, DEBUG_RET, DEBUG_WARN, pst_item_attach::i_id, pst_base64_encode(), pst_ff_getID2data(), pst_fwrite(), pst_getID(), and pst_binary::size.

Here is the call graph for this function:

pst_binary pst_attach_to_mem pst_file pf,
pst_item_attach attach
 

Assemble the binary attachment into a single buffer.

Parameters:
pf pointer to the pst_file structure setup by pst_open().
attach pointer to the attachment record
Returns:
structure containing size of and pointer to the buffer. the caller must free this buffer.

Definition at line 542 of file libpst.c.

References pst_binary::data, pst_item_attach::data, DEBUG_ENT, DEBUG_RET, DEBUG_WARN, pst_item_attach::i_id, pst_ff_getID2data(), pst_getID(), and pst_binary::size.

Here is the call graph for this function:

int pst_build_desc_ptr pst_file pf,
int64_t  offset,
int32_t  depth,
uint64_t  linku1,
uint64_t  start_val,
uint64_t  end_val
[static]
 

Referenced by pst_load_index().

pst_id2_tree* pst_build_id2 pst_file pf,
pst_index_ll list
[static]
 

Referenced by pst_load_extended_attributes(), and pst_parse_item().

int pst_build_id_ptr pst_file pf,
int64_t  offset,
int32_t  depth,
uint64_t  linku1,
uint64_t  start_val,
uint64_t  end_val
[static]
 

Process the index1 b-tree from the pst file and create the pf->i_head linked list from it.

This tree holds the location (offset and size) of lower level objects (0xbcec descriptor blocks, etc) in the pst file.

Definition at line 975 of file libpst.c.

References BACKLINK_OFFSET, BLOCK_SIZE, DEBUG_ENT, DEBUG_HEXDUMPC, DEBUG_INFO, DEBUG_RET, DEBUG_WARN, pst_file::i_head, pst_file::i_tail, pst_index::id, INDEX_COUNT_MAX, ITEM_SIZE32, pst_index_ll::next, pst_table_ptr_struct::offset, pst_index::offset, pst_decode_index(), pst_decode_table(), pst_getIntAt(), pst_malloc(), pst_read_block_size(), pst_index::size, pst_table_ptr_struct::start, pst_table_ptr_struct::u1, and pst_index::u1.

Referenced by pst_load_index().

Here is the call graph for this function:

int pst_chr_count char *  str,
char  x
[static]
 

int pst_close pst_file pf  ) 
 

Close a pst file.

Parameters:
pf pointer to the pst_file structure setup by pst_open().

Definition at line 380 of file libpst.c.

References pst_file::cwd, pst_file::d_head, DEBUG_ENT, DEBUG_RET, DEBUG_WARN, pst_file::fname, pst_file::fp, pst_file::i_head, pst_free_desc(), pst_free_id(), pst_free_xattrib(), and pst_file::x_head.

Referenced by main().

Here is the call graph for this function:

size_t pst_decode_assoc pst_file pf,
pst_id2_assoc assoc,
char *  buf
[static]
 

Definition at line 919 of file libpst.c.

References pst_id2_assoc32::child_id, pst_id2_assoc::child_id, DEBUG_HEXDUMPC, DEBUG_INFO, pst_file::do_read64, pst_id2_assoc32::id, pst_id2_assoc::id, pst_id2_assoc32::id2, pst_id2_assoc::id2, LE32_CPU, LE64_CPU, pst_id2_assoc, and pst_id2_assoc32.

size_t pst_decode_desc pst_file pf,
pst_desc desc,
char *  buf
[static]
 

Definition at line 823 of file libpst.c.

References pst_desc32::d_id, pst_desc::d_id, DEBUG_HEXDUMPC, DEBUG_INFO, pst_desc32::desc_id, pst_desc::desc_id, pst_file::do_read64, LE32_CPU, LE64_CPU, pst_desc32::parent_d_id, pst_desc::parent_d_id, pst_desc, pst_desc32, pst_desc32::tree_id, pst_desc::tree_id, and pst_desc::u1.

size_t pst_decode_index pst_file pf,
pst_index index,
char *  buf
[static]
 

Definition at line 886 of file libpst.c.

References DEBUG_HEXDUMPC, DEBUG_INFO, pst_file::do_read64, pst_index32::id, pst_index::id, LE16_CPU, LE32_CPU, LE64_CPU, pst_index32::offset, pst_index::offset, pst_index, pst_index32, pst_index32::size, pst_index::size, pst_index::u0, pst_index32::u1, and pst_index::u1.

Referenced by pst_build_id_ptr().

size_t pst_decode_table pst_file pf,
struct pst_table_ptr_struct table,
char *  buf
[static]
 

Definition at line 857 of file libpst.c.

References DEBUG_HEXDUMPC, DEBUG_INFO, pst_file::do_read64, LE32_CPU, LE64_CPU, pst_table_ptr_struct32::offset, pst_table_ptr_struct::offset, pst_table_ptr_struct32::start, pst_table_ptr_struct::start, pst_table_ptr_struct32::u1, and pst_table_ptr_struct::u1.

Referenced by pst_build_id_ptr().

size_t pst_decode_type3 pst_file pf,
pst_table3_rec table3_rec,
char *  buf
[static]
 

Definition at line 947 of file libpst.c.

References DEBUG_ENT, DEBUG_HEXDUMPC, DEBUG_INFO, DEBUG_RET, pst_file::do_read64, pst_table3_rec32::id, pst_table3_rec::id, LE32_CPU, LE64_CPU, pst_table3_rec, and pst_table3_rec32.

int pst_decrypt uint64_t  i_id,
char *  buf,
size_t  size,
unsigned char  type
[static]
 

size_t pst_ff_compile_ID pst_file pf,
uint64_t  i_id,
pst_holder h,
size_t  size
[static]
 

size_t pst_ff_getID2block pst_file pf,
uint64_t  id2,
pst_id2_tree id2_head,
char **  buf
[static]
 

size_t pst_ff_getID2data pst_file pf,
pst_index_ll ptr,
pst_holder h
[static]
 

Referenced by pst_attach_to_file(), pst_attach_to_file_base64(), and pst_attach_to_mem().

size_t pst_ff_getIDblock pst_file pf,
uint64_t  i_id,
char **  buf
[static]
 

size_t pst_finish_cleanup_holder pst_holder h,
size_t  size
[static]
 

void pst_free_attach pst_item_attach attach  )  [static]
 

void pst_free_desc pst_desc_tree head  )  [static]
 

Referenced by pst_close().

void pst_free_id pst_index_ll head  )  [static]
 

Referenced by pst_close().

void pst_free_id2 pst_id2_tree head  )  [static]
 

Referenced by pst_load_extended_attributes(), and pst_parse_item().

void pst_free_list pst_mapi_object list  )  [static]
 

Referenced by pst_load_extended_attributes(), and pst_parse_item().

void pst_free_xattrib pst_x_attrib_ll x  )  [static]
 

Referenced by pst_close().

size_t pst_getAtPos pst_file pf,
int64_t  pos,
void *  buf,
size_t  size
[static]
 

Referenced by pst_open().

int pst_getBlockOffset char *  buf,
size_t  read_size,
uint32_t  i_offset,
uint32_t  offset,
pst_block_offset p
[static]
 

int pst_getBlockOffsetPointer pst_file pf,
pst_id2_tree i2_head,
pst_subblocks subblocks,
uint32_t  offset,
pst_block_offset_pointer p
[static]
 

pst_desc_tree* pst_getDptr pst_file pf,
uint64_t  d_id
[static]
 

Referenced by pst_getTopOfFolders(), pst_load_extended_attributes(), and record_descriptor().

pst_id2_tree* pst_getID2 pst_id2_tree ptr,
uint64_t  id
[static]
 

Referenced by pst_parse_item().

uint64_t pst_getIntAt pst_file pf,
char *  buf
[static]
 

Referenced by pst_build_id_ptr().

uint64_t pst_getIntAtPos pst_file pf,
int64_t  pos
[static]
 

Referenced by pst_open().

pst_desc_tree* pst_getNextDptr pst_desc_tree d  ) 
 

Walk the descriptor tree.

Parameters:
d pointer to the current item in the descriptor tree.
Returns:
pointer to the next item in the descriptor tree.

Definition at line 640 of file libpst.c.

References pst_desc_tree::child, DEBUG_ENT, DEBUG_RET, pst_desc_tree::next, and pst_desc_tree::parent.

Referenced by dumper().

pst_desc_tree* pst_getTopOfFolders pst_file pf,
const pst_item root
 

Get the top of folders descriptor tree.

This is the main descriptor tree that needs to be walked to look at every item in the pst file.

Parameters:
pf pointer to the pst_file structure setup by pst_open().
root root item, which can be obtained by pst_parse_item(pf, pf->d_head, NULL).

Definition at line 510 of file libpst.c.

References pst_desc_tree::assoc_tree, pst_desc_tree::d_id, DEBUG_ENT, DEBUG_INFO, DEBUG_RET, pst_desc_tree::desc, pst_entryid::id, pst_item::message_store, pst_desc_tree::parent_d_id, pst_getDptr(), pst_malloc(), record_descriptor(), and pst_item_message_store::top_of_personal_folder.

Referenced by main().

Here is the call graph for this function:

int pst_load_extended_attributes pst_file pf  ) 
 

Load the extended attribute mapping table from the pst file.

Returns:
true(1) or false(0) to indicate whether the extended attributes have been loaded

Definition at line 664 of file libpst.c.

References pst_desc_tree::assoc_tree, pst_mapi_object::count_elements, pst_mapi_element::data, DEBUG_ENT, DEBUG_HEXDUMPC, DEBUG_INFO, DEBUG_RET, DEBUG_WARN, pst_desc_tree::desc, pst_mapi_object::elements, pst_x_attrib::extended, pst_index_ll::i_id, LE32_CPU, pst_x_attrib::map, pst_x_attrib_ll::map, pst_mapi_element::mapi_id, pst_x_attrib_ll::next, pst_build_id2(), pst_free_id2(), pst_free_list(), pst_getDptr(), PST_LE_GET_UINT16, PST_LE_GET_UINT32, pst_malloc(), pst_parse_block(), pst_printID2ptr(), pst_wide_to_single(), pst_mapi_element::size, pst_mapi_element::type, pst_x_attrib::type, and pst_file::x_head.

Referenced by main().

Here is the call graph for this function:

int pst_load_index pst_file pf  ) 
 

Load the index entries from the pst file.

This loads both the i_id linked list, and the d_id tree, and should normally be the first call after pst_open().

Parameters:
pf pointer to the pst_file structure setup by pst_open().

Definition at line 618 of file libpst.c.

References pst_file::d_head, DEBUG_ENT, DEBUG_INFO, DEBUG_RET, DEBUG_WARN, pst_file::index1, pst_file::index1_back, pst_file::index2, pst_file::index2_back, pst_build_desc_ptr(), pst_build_id_ptr(), and pst_printDptr().

Referenced by main().

Here is the call graph for this function:

int pst_open pst_file pf,
const char *  name
 

Open a pst file.

Parameters:
pf pointer to uninitialized pst_file structure. This structure will be filled in by this function.
name name of the file, suitable for fopen().
Returns:
0 if ok, -1 if error

Definition at line 293 of file libpst.c.

References DEBUG_ENT, DEBUG_INFO, DEBUG_RET, DEBUG_WARN, ENC_TYPE, FILE_SIZE_POINTER, INDEX_BACK, INDEX_POINTER, INDEX_TYPE32, INDEX_TYPE32A, INDEX_TYPE64, INDEX_TYPE64A, INDEX_TYPE_OFFSET, LE32_CPU, pst_getAtPos(), pst_getIntAtPos(), pst_malloc(), pst_unicode_init(), SECOND_BACK, SECOND_POINTER, and WARN.

Referenced by main().

Here is the call graph for this function:

pst_mapi_object* pst_parse_block pst_file pf,
uint64_t  block_id,
pst_id2_tree i2_head
[static]
 

Referenced by pst_load_extended_attributes(), and pst_parse_item().

pst_item* pst_parse_item pst_file pf,
pst_desc_tree d_ptr,
pst_id2_tree m_head
 

Assemble a mapi object from a descriptor pointer.

append (buf,z) data to the output destination (h,size)

Parameters:
h specifies the output destination (buffer, file, encoding)
size number of bytes of data already sent to h
buf reference to a pointer to the buffer to be appended to the destination
z number of bytes in buf
Returns:
updated size of the output, buffer pointer possibly reallocated

finish cleanup for base64 encoding to a file with extra bytes left over

Parameters:
h specifies the output destination (buffer, file, encoding)
size number of bytes of data already sent to h
Returns:
updated size of the output

Convert a code page integer into a string suitable for iconv()

Parameters:
cp the code page integer used in the pst file
[in] buflen length of the output buffer
[out] result pointer to output buffer, must be at least 30 bytes
Returns:
pointer to a static buffer holding the string representation of the equivalent iconv character set

Get the default character set for this item. This is used to find the charset for pst_string elements that are not already in utf8 encoding.

Parameters:
item pointer to the mapi item of interest
[in] buflen length of the output buffer
[out] result pointer to output buffer, must be at least 30 bytes
Returns:
default character set as a string useable by iconv()

Convert str to utf8 if possible; null strings are preserved.

Parameters:
item pointer to the containing mapi item
str pointer to the mapi string of interest

Convert str to utf8 if possible; null strings are converted into empty strings.

Parameters:
item pointer to the containing mapi item
str pointer to the mapi string of interest

Decode raw recurrence data into a better structure.

Parameters:
appt pointer to appointment structure
Returns:
pointer to decoded recurrence structure that must be free'd by the caller.

Free a recurrence structure.

Parameters:
r input pointer to be freed

Definition at line 1209 of file libpst.c.

References pst_desc_tree::assoc_tree, pst_item::attach, pst_id2_tree::child, pst_mapi_object::count_objects, DEBUG_ENT, DEBUG_INFO, DEBUG_RET, DEBUG_WARN, deep_copy(), pst_desc_tree::desc, pst_index_ll::i_id, pst_item_attach::i_id, pst_id2_tree::id, pst_item_attach::id2_head, pst_item_attach::id2_val, pst_item_attach::next, pst_build_id2(), pst_free_id2(), pst_free_list(), pst_freeItem(), pst_getID2(), pst_item, pst_item_attach, pst_malloc(), pst_parse_block(), pst_printID2ptr(), and pst_process().

Referenced by dumper(), main(), and process().

Here is the call graph for this function:

void pst_printDptr pst_file pf,
pst_desc_tree ptr
[static]
 

Referenced by pst_load_index().

void pst_printID2ptr pst_id2_tree ptr  )  [static]
 

Referenced by pst_load_extended_attributes(), and pst_parse_item().

int pst_process pst_mapi_object list,
pst_item item,
pst_item_attach attach
[static]
 

Referenced by pst_parse_item().

size_t pst_read_block_size pst_file pf,
int64_t  offset,
size_t  size,
char **  buf
[static]
 

Referenced by pst_build_id_ptr().

int pst_reopen pst_file pf  ) 
 

Reopen the pst file after a fork.

Parameters:
pf pointer to the pst_file structure setup by pst_open().
Returns:
0 if ok, -1 if error

Definition at line 370 of file libpst.c.

References pst_file::cwd, pst_file::fname, and pst_file::fp.

Referenced by try_fork().

int pst_stricmp char *  a,
char *  b
[static]
 

int pst_strincmp char *  a,
char *  b,
size_t  x
[static]
 

char* pst_wide_to_single char *  wt,
size_t  size
[static]
 

Referenced by pst_load_extended_attributes().

void record_descriptor pst_file pf,
pst_desc_tree node
[static]
 

add a pst descriptor node into the global tree.

Parameters:
pf global pst file pointer
node pointer to the new node to be added to the tree

Definition at line 433 of file libpst.c.

References add_descriptor_to_list(), pst_desc_tree::child, pst_desc_tree::child_tail, pst_file::d_head, pst_desc_tree::d_id, pst_file::d_tail, DEBUG_ENT, DEBUG_INFO, DEBUG_RET, pst_desc_tree::next, pst_desc_tree::no_child, pst_desc_tree::parent, pst_desc_tree::parent_d_id, pst_desc_tree::prev, and pst_getDptr().

Referenced by pst_getTopOfFolders().

Here is the call graph for this function:


Variable Documentation

unsigned char comp_enc[] [static]
 

Initial value:

 {
    0x47, 0xf1, 0xb4, 0xe6, 0x0b, 0x6a, 0x72, 0x48, 0x85, 0x4e, 0x9e, 0xeb, 0xe2, 0xf8, 0x94, 0x53,
    0xe0, 0xbb, 0xa0, 0x02, 0xe8, 0x5a, 0x09, 0xab, 0xdb, 0xe3, 0xba, 0xc6, 0x7c, 0xc3, 0x10, 0xdd,
    0x39, 0x05, 0x96, 0x30, 0xf5, 0x37, 0x60, 0x82, 0x8c, 0xc9, 0x13, 0x4a, 0x6b, 0x1d, 0xf3, 0xfb,
    0x8f, 0x26, 0x97, 0xca, 0x91, 0x17, 0x01, 0xc4, 0x32, 0x2d, 0x6e, 0x31, 0x95, 0xff, 0xd9, 0x23,
    0xd1, 0x00, 0x5e, 0x79, 0xdc, 0x44, 0x3b, 0x1a, 0x28, 0xc5, 0x61, 0x57, 0x20, 0x90, 0x3d, 0x83,
    0xb9, 0x43, 0xbe, 0x67, 0xd2, 0x46, 0x42, 0x76, 0xc0, 0x6d, 0x5b, 0x7e, 0xb2, 0x0f, 0x16, 0x29,
    0x3c, 0xa9, 0x03, 0x54, 0x0d, 0xda, 0x5d, 0xdf, 0xf6, 0xb7, 0xc7, 0x62, 0xcd, 0x8d, 0x06, 0xd3,
    0x69, 0x5c, 0x86, 0xd6, 0x14, 0xf7, 0xa5, 0x66, 0x75, 0xac, 0xb1, 0xe9, 0x45, 0x21, 0x70, 0x0c,
    0x87, 0x9f, 0x74, 0xa4, 0x22, 0x4c, 0x6f, 0xbf, 0x1f, 0x56, 0xaa, 0x2e, 0xb3, 0x78, 0x33, 0x50,
    0xb0, 0xa3, 0x92, 0xbc, 0xcf, 0x19, 0x1c, 0xa7, 0x63, 0xcb, 0x1e, 0x4d, 0x3e, 0x4b, 0x1b, 0x9b,
    0x4f, 0xe7, 0xf0, 0xee, 0xad, 0x3a, 0xb5, 0x59, 0x04, 0xea, 0x40, 0x55, 0x25, 0x51, 0xe5, 0x7a,
    0x89, 0x38, 0x68, 0x52, 0x7b, 0xfc, 0x27, 0xae, 0xd7, 0xbd, 0xfa, 0x07, 0xf4, 0xcc, 0x8e, 0x5f,
    0xef, 0x35, 0x9c, 0x84, 0x2b, 0x15, 0xd5, 0x77, 0x34, 0x49, 0xb6, 0x12, 0x0a, 0x7f, 0x71, 0x88,
    0xfd, 0x9d, 0x18, 0x41, 0x7d, 0x93, 0xd8, 0x58, 0x2c, 0xce, 0xfe, 0x24, 0xaf, 0xde, 0xb8, 0x36,
    0xc8, 0xa1, 0x80, 0xa6, 0x99, 0x98, 0xa8, 0x2f, 0x0e, 0x81, 0x65, 0x73, 0xe4, 0xc2, 0xa2, 0x8a,
    0xd4, 0xe1, 0x11, 0xd0, 0x08, 0x8b, 0x2a, 0xf2, 0xed, 0x9a, 0x64, 0x3f, 0xc1, 0x6c, 0xf9, 0xec
}
for "compressible" encryption, just a simple substitution cipher, plaintext = comp_enc[ciphertext]; for "strong" encryption, this is the first rotor of an Enigma 3 rotor cipher.

Definition at line 197 of file libpst.c.

unsigned char comp_high1[] [static]
 

Initial value:

 {
    0x41, 0x36, 0x13, 0x62, 0xa8, 0x21, 0x6e, 0xbb, 0xf4, 0x16, 0xcc, 0x04, 0x7f, 0x64, 0xe8, 0x5d,
    0x1e, 0xf2, 0xcb, 0x2a, 0x74, 0xc5, 0x5e, 0x35, 0xd2, 0x95, 0x47, 0x9e, 0x96, 0x2d, 0x9a, 0x88,
    0x4c, 0x7d, 0x84, 0x3f, 0xdb, 0xac, 0x31, 0xb6, 0x48, 0x5f, 0xf6, 0xc4, 0xd8, 0x39, 0x8b, 0xe7,
    0x23, 0x3b, 0x38, 0x8e, 0xc8, 0xc1, 0xdf, 0x25, 0xb1, 0x20, 0xa5, 0x46, 0x60, 0x4e, 0x9c, 0xfb,
    0xaa, 0xd3, 0x56, 0x51, 0x45, 0x7c, 0x55, 0x00, 0x07, 0xc9, 0x2b, 0x9d, 0x85, 0x9b, 0x09, 0xa0,
    0x8f, 0xad, 0xb3, 0x0f, 0x63, 0xab, 0x89, 0x4b, 0xd7, 0xa7, 0x15, 0x5a, 0x71, 0x66, 0x42, 0xbf,
    0x26, 0x4a, 0x6b, 0x98, 0xfa, 0xea, 0x77, 0x53, 0xb2, 0x70, 0x05, 0x2c, 0xfd, 0x59, 0x3a, 0x86,
    0x7e, 0xce, 0x06, 0xeb, 0x82, 0x78, 0x57, 0xc7, 0x8d, 0x43, 0xaf, 0xb4, 0x1c, 0xd4, 0x5b, 0xcd,
    0xe2, 0xe9, 0x27, 0x4f, 0xc3, 0x08, 0x72, 0x80, 0xcf, 0xb0, 0xef, 0xf5, 0x28, 0x6d, 0xbe, 0x30,
    0x4d, 0x34, 0x92, 0xd5, 0x0e, 0x3c, 0x22, 0x32, 0xe5, 0xe4, 0xf9, 0x9f, 0xc2, 0xd1, 0x0a, 0x81,
    0x12, 0xe1, 0xee, 0x91, 0x83, 0x76, 0xe3, 0x97, 0xe6, 0x61, 0x8a, 0x17, 0x79, 0xa4, 0xb7, 0xdc,
    0x90, 0x7a, 0x5c, 0x8c, 0x02, 0xa6, 0xca, 0x69, 0xde, 0x50, 0x1a, 0x11, 0x93, 0xb9, 0x52, 0x87,
    0x58, 0xfc, 0xed, 0x1d, 0x37, 0x49, 0x1b, 0x6a, 0xe0, 0x29, 0x33, 0x99, 0xbd, 0x6c, 0xd9, 0x94,
    0xf3, 0x40, 0x54, 0x6f, 0xf0, 0xc6, 0x73, 0xb8, 0xd6, 0x3e, 0x65, 0x18, 0x44, 0x1f, 0xdd, 0x67,
    0x10, 0xf1, 0x0c, 0x19, 0xec, 0xae, 0x03, 0xa1, 0x14, 0x7b, 0xa9, 0x0b, 0xff, 0xf8, 0xa3, 0xc0,
    0xa2, 0x01, 0xf7, 0x2e, 0xbc, 0x24, 0x68, 0x75, 0x0d, 0xfe, 0xba, 0x2f, 0xb5, 0xd0, 0xda, 0x3d
}
for "strong" encryption, this is the second rotor of an Enigma 3 rotor cipher.

Definition at line 218 of file libpst.c.

unsigned char comp_high2[] [static]
 

Initial value:

 {
    0x14, 0x53, 0x0f, 0x56, 0xb3, 0xc8, 0x7a, 0x9c, 0xeb, 0x65, 0x48, 0x17, 0x16, 0x15, 0x9f, 0x02,
    0xcc, 0x54, 0x7c, 0x83, 0x00, 0x0d, 0x0c, 0x0b, 0xa2, 0x62, 0xa8, 0x76, 0xdb, 0xd9, 0xed, 0xc7,
    0xc5, 0xa4, 0xdc, 0xac, 0x85, 0x74, 0xd6, 0xd0, 0xa7, 0x9b, 0xae, 0x9a, 0x96, 0x71, 0x66, 0xc3,
    0x63, 0x99, 0xb8, 0xdd, 0x73, 0x92, 0x8e, 0x84, 0x7d, 0xa5, 0x5e, 0xd1, 0x5d, 0x93, 0xb1, 0x57,
    0x51, 0x50, 0x80, 0x89, 0x52, 0x94, 0x4f, 0x4e, 0x0a, 0x6b, 0xbc, 0x8d, 0x7f, 0x6e, 0x47, 0x46,
    0x41, 0x40, 0x44, 0x01, 0x11, 0xcb, 0x03, 0x3f, 0xf7, 0xf4, 0xe1, 0xa9, 0x8f, 0x3c, 0x3a, 0xf9,
    0xfb, 0xf0, 0x19, 0x30, 0x82, 0x09, 0x2e, 0xc9, 0x9d, 0xa0, 0x86, 0x49, 0xee, 0x6f, 0x4d, 0x6d,
    0xc4, 0x2d, 0x81, 0x34, 0x25, 0x87, 0x1b, 0x88, 0xaa, 0xfc, 0x06, 0xa1, 0x12, 0x38, 0xfd, 0x4c,
    0x42, 0x72, 0x64, 0x13, 0x37, 0x24, 0x6a, 0x75, 0x77, 0x43, 0xff, 0xe6, 0xb4, 0x4b, 0x36, 0x5c,
    0xe4, 0xd8, 0x35, 0x3d, 0x45, 0xb9, 0x2c, 0xec, 0xb7, 0x31, 0x2b, 0x29, 0x07, 0x68, 0xa3, 0x0e,
    0x69, 0x7b, 0x18, 0x9e, 0x21, 0x39, 0xbe, 0x28, 0x1a, 0x5b, 0x78, 0xf5, 0x23, 0xca, 0x2a, 0xb0,
    0xaf, 0x3e, 0xfe, 0x04, 0x8c, 0xe7, 0xe5, 0x98, 0x32, 0x95, 0xd3, 0xf6, 0x4a, 0xe8, 0xa6, 0xea,
    0xe9, 0xf3, 0xd5, 0x2f, 0x70, 0x20, 0xf2, 0x1f, 0x05, 0x67, 0xad, 0x55, 0x10, 0xce, 0xcd, 0xe3,
    0x27, 0x3b, 0xda, 0xba, 0xd7, 0xc2, 0x26, 0xd4, 0x91, 0x1d, 0xd2, 0x1c, 0x22, 0x33, 0xf8, 0xfa,
    0xf1, 0x5a, 0xef, 0xcf, 0x90, 0xb6, 0x8b, 0xb5, 0xbd, 0xc0, 0xbf, 0x08, 0x97, 0x1e, 0x6c, 0xe2,
    0x61, 0xe0, 0xc6, 0xc1, 0x59, 0xab, 0xbb, 0x58, 0xde, 0x5f, 0xdf, 0x60, 0x79, 0x7e, 0xb2, 0x8a
}
for "strong" encryption, this is the third rotor of an Enigma 3 rotor cipher.

Definition at line 239 of file libpst.c.


Generated on Sat Sep 12 13:37:45 2009 for 'LibPst' by  doxygen 1.3.9.1