#ifndef LIBOLE
#define LIBOLE
#define LIBOLE_VERSION "200512112226"
#define OLE_OK 0
#define OLEER_NO_INPUT_FILE 100
#define OLEER_BAD_INPUT_FILE 101
#define OLEER_NOT_OLE_FILE 102
#define OLEER_INSANE_OLE_FILE 103
#define OLEER_DECODE_NULL_OBJECT 10
#define OLEER_DECODE_NULL_FILENAME 11
#define OLEER_DECODE_NULL_PATH 12
#define OLEER_MINIFAT_READ_FAIL 30
#define OLEER_PROPERTIES_READ_FAIL 31
#define OLEER_MINISTREAM_READ_FAIL 32
#define OLEER_MINISTREAM_STREAM_READ_FAIL 33
#define OLEER_NORMALSTREAM_STREAM_READ_FAIL 34
#define OLEER_GET_BLOCK_SEEK 41
#define OLEER_GET_BLOCK_READ 42
#define OLEER_MEMORY_OVERFLOW 50
#define OLE_VERBOSE_NORMAL 1
#define OLE_VERBOSE_FATREAD 2
#define OLE_VERBOSE_DIRREAD 4
#define OLE_VERBOSE_STREAMREAD 8
#define OLE_VERBOSE_STREAMDECODE 16
#define OLE_VNORMAL(x) ((x) && OLE_VERBOSE_NORMAL == OLE_VERBOSE_NORMAL )
#define OLE_DEBUG_NORMAL 1
#define OLE_DEBUG_PEDANTIC 2
#define OLE_DNORMAL(x) ((x) && OLE_DEBUG_NORMAL == OLE_DEBUG_NORMAL)
#define OLE_DPEDANTIC(x) ((x) && OLE_DEBUG_PEDANTIC == OLE_DEBUG_PEDANTIC)
#define OLE_HEADER_FAT_SECTOR_COUNT_LIMIT 109
struct OLE_header {
unsigned int minor_version;
unsigned int dll_version;
unsigned int byte_order;
unsigned int sector_shift;
unsigned int sector_size;
unsigned int mini_sector_shift;
unsigned int mini_sector_size;
unsigned int fat_sector_count;
unsigned int directory_stream_start_sector;
unsigned int mini_cutoff_size;
unsigned int mini_fat_start;
unsigned int mini_fat_sector_count;
unsigned int dif_start_sector;
unsigned int dif_sector_count;
unsigned int FAT[OLE_HEADER_FAT_SECTOR_COUNT_LIMIT];
};
#define OLE_DIRECTORY_ELEMENT_NAME_SIZE 64
#define OLE_DIRECTORY_CLASS_SIZE 16
#define OLE_DIRECTORY_TIMESTAMPS_SIZE 16
struct OLE_directory_entry {
char element_name[OLE_DIRECTORY_ELEMENT_NAME_SIZE];
int element_name_byte_count;
char element_type;
char element_colour;
unsigned int left_child;
unsigned int right_child;
unsigned int root;
unsigned char class[OLE_DIRECTORY_CLASS_SIZE];
unsigned int userflags;
unsigned char timestamps[OLE_DIRECTORY_TIMESTAMPS_SIZE];
unsigned int start_sector;
unsigned int stream_size;
};
#define OLE_HEADER_BLOCK_SIZE 512
struct OLE_object {
int error;
size_t file_size;
int last_sector;
size_t last_chain_size;
FILE *f;
unsigned char *FAT;
unsigned char *FAT_limit; /** Added to prevent segment violations **/
unsigned char *miniFAT;
unsigned char *miniFAT_limit; /** Added to prevent segment violations **/
unsigned char header_block[OLE_HEADER_BLOCK_SIZE];
unsigned char *ministream;
unsigned char *properties;
struct OLE_header header;
// End user configurable parameters:
int debug;
int verbose;
int quiet;
int save_unknown_streams;
int save_streams;
int save_mini_streams;
int save_normal_streams;
int decode_streams;
int decode_mini_streams;
int decode_normal_streams;
int (*filename_report_fn)(char *);
};
// Prototypes
int OLE_version( void );
int OLE_init( struct OLE_object *ole );
int OLE_set_verbose( struct OLE_object *ole, int level );
int OLE_set_debug( struct OLE_object *ole, int level );
int OLE_set_quiet( struct OLE_object *ole, int level );
int OLE_set_save_unknown_streams( struct OLE_object *ole, int level );
int OLE_get_block( struct OLE_object *ole, int block_index, unsigned char *block_buffer );
int OLE_get_miniblock( struct OLE_object *ole, int block_index, unsigned char *block_buffer );
int OLE_dbstosbs( char *raw_string, size_t char_count, char *clean_string, int clean_string_len );
int OLE_print_string( char *string, size_t char_count);
int OLE_print_sector( struct OLE_object *ole, char *sector, unsigned int bytes);
int OLE_get_header( struct OLE_object *ole );
int OLE_convert_header( struct OLE_object *ole );
int OLE_print_header( struct OLE_object *ole );
int OLE_convert_directory(struct OLE_object *ole, unsigned char *buf, struct OLE_directory_entry *dir );
int OLE_print_directory( struct OLE_object *ole, struct OLE_directory_entry *dir );
int OLE_load_FAT( struct OLE_object *ole );
int OLE_follow_chain( struct OLE_object *ole, int FAT_sector_start );
int OLE_follow_minichain( struct OLE_object *ole, int miniFAT_sector_start );
unsigned char *OLE_load_minichain( struct OLE_object *ole, int miniFAT_sector_start );
unsigned char *OLE_load_chain( struct OLE_object *ole, int FAT_sector_start );
int OLE_open_file( struct OLE_object *ole, char *fullpath );
int OLE_decode_file( struct OLE_object *ole, char *fname, char *decode_path );
int OLE_decode_file_done( struct OLE_object *ole );
// Our callbacks.
int OLE_set_filename_report_fn( struct OLE_object *ole, int (*ptr_to_fn)(char *) );
#endif
syntax highlighted by Code2HTML, v. 0.9.1