Blame include/perk/perk.h

c0fbae
#ifndef PERK_H
c0fbae
#define PERK_H
c0fbae
c0fbae
#include <stdint.h>
c0fbae
#include <stdio.h>
c0fbae
1ef003
#include "perk_api.h"
c65ad9
#include "perk_meta.h"
906422
#include "perk_arbits.h"
c0fbae
c0fbae
#ifdef __cplusplus
c0fbae
extern "C" {
c0fbae
#endif
c0fbae
c0fbae
/* pre-alpha */
c0fbae
#ifndef PERK_APP
c0fbae
#ifndef PERK_PRE_ALPHA
a5c7b3
#warning libperk: pre-alpha: ABI is not final!
a5c7b3
#warning pass -DPERK_PRE_ALPHA to suppress this warning.
c0fbae
#endif
c0fbae
#endif
c0fbae
d6e02b
a3de1c
/* status codes */
a3de1c
#define PERK_OK				0x00
a3de1c
#define PERK_USAGE			0x01
b0d024
#define PERK_ERROR			0x02
a3de1c
a3de1c
/* driver flags */
a3de1c
#define PERK_DRIVER_VERBOSITY_NONE	0x0000
a3de1c
#define PERK_DRIVER_VERBOSITY_ERRORS	0x0001
a3de1c
#define PERK_DRIVER_VERBOSITY_STATUS	0x0002
51125f
#define PERK_DRIVER_VERBOSITY_UTILITY	0x0004
a3de1c
#define PERK_DRIVER_CLONE_VECTOR	0x0008
a3de1c
8fd1f5
#define PERK_DRIVER_VERSION		0x0010
8fd1f5
#define PERK_DRIVER_DRY_RUN		0x0020
5b008c
#define PERK_DRIVER_MAP_WRITE_ACCESS    0x0040
a3de1c
68f5d9
#define PERK_DRIVER_ANNOTATE_ALWAYS	0x1000
68f5d9
#define PERK_DRIVER_ANNOTATE_NEVER	0x2000
68f5d9
#define PERK_DRIVER_ANNOTATE_FULL	0x4000
68f5d9
d9d2d9
#define PERK_DRIVER_AR_STRICT_PE        0x10000
d9d2d9
#define PERK_DRIVER_AR_STRICT_PE_ARCH   0x20000
d9d2d9
#define PERK_DRIVER_AR_OBJECT_VECTOR    0x40000
5b248d
#define PERK_DRIVER_AR_LIST_MEMBERS     0x80000     /* [-t] */
5b248d
5b248d
#define PERK_DRIVER_AR_SUPPRESS_MESSAGE 0X100000    /* [-c] */
5b248d
#define PERK_DRIVER_AR_VERBOSE_OUTPUT   0X200000    /* [-v] */
5b248d
#define PERK_DRIVER_AR_UPDATE_SYMTBL    0X400000    /* [-s] */
5b248d
#define PERK_DRIVER_AR_UPDATE_MEMBERS   0x800000    /* [-u] */
5b248d
#define PERK_DRIVER_AR_PRESERVE_NEWER   0X800000    /* [-C] */
5b248d
5b248d
#define PERK_DRIVER_AR_DELETE_MEMBERS   0X1000000   /* [-d] */
5b248d
#define PERK_DRIVER_AR_APPEND_MEMBERS   0X2000000   /* [-q] */
5b248d
#define PERK_DRIVER_AR_REPLACE_MEMBERS  0X4000000   /* [-r] */
5b248d
#define PERK_DRIVER_AR_EXTRACT_MEMBERS  0X8000000   /* [-x] */
5b248d
5b248d
#define PERK_DRIVER_AR_MOVE_MEMBERS     0X10000000  /* [-m] */
5b248d
#define PERK_DRIVER_AR_POSITION_AFTER   0X20000000  /* [-a] */
5b248d
#define PERK_DRIVER_AR_POSITION_BEFORE  0X40000000  /* [-b] */
8ba1bc
#define PERK_DRIVER_AR_PRINT_MEMBERS    0X80000000  /* [-p] */
d9d2d9
e8769a
/* error flags */
e8769a
#define PERK_ERROR_TOP_LEVEL		0x0001
e8769a
#define PERK_ERROR_NESTED		0x0002
e8769a
#define PERK_ERROR_CHILD		0x0004
e8769a
#define PERK_ERROR_CUSTOM		0x0008
e8769a
ff121d
enum pe_custom_error {
ff121d
	PERK_ERR_FLOW_ERROR,
ff121d
	PERK_ERR_FLEE_ERROR,
ff121d
	PERK_ERR_NULL_CONTEXT,
ff121d
	PERK_ERR_NULL_IMAGE,
ff121d
	PERK_ERR_INVALID_CONTEXT,
ff121d
	PERK_ERR_INVALID_IMAGE,
ff121d
	PERK_ERR_IMAGE_SIZE_ZERO,
ff121d
	PERK_ERR_IMAGE_MALFORMED,
ff121d
	PERK_ERR_BAD_DOS_HEADER,
ff121d
	PERK_ERR_BAD_COFF_HEADER,
ff121d
	PERK_ERR_BAD_IMAGE_TYPE,
c63b6d
	PERK_ERR_UNSUPPORTED_ABI,
906422
	PERK_ERR_AR_FAIL,
906422
	PERK_ERR_AR_EMPTY_FILE,
906422
	PERK_ERR_AR_INVALID_SIGNATURE,
906422
	PERK_ERR_AR_INVALID_HEADER,
906422
	PERK_ERR_AR_TRUNCATED_DATA,
906422
	PERK_ERR_AR_DUPLICATE_LONG_NAMES,
906422
	PERK_ERR_AR_DUPLICATE_ARMAP_MEMBER,
906422
	PERK_ERR_AR_MISPLACED_ARMAP_MEMBER,
906422
	PERK_ERR_AR_NO_ACTION_SPECIFIED,
906422
	PERK_ERR_AR_NO_INPUT_SPECIFIED,
906422
	PERK_ERR_AR_DRIVER_MISMATCH,
906422
	PERK_ERR_AR_ARMAP_MISMATCH,
906422
	PERK_ERR_AR_INVALID_ARMAP_NUMBER_OF_SYMS,
906422
	PERK_ERR_AR_INVALID_ARMAP_SIZE_OF_REFS,
906422
	PERK_ERR_AR_INVALID_ARMAP_SIZE_OF_STRS,
906422
	PERK_ERR_AR_INVALID_ARMAP_STRING_TABLE,
906422
	PERK_ERR_AR_INVALID_ARMAP_MEMBER_OFFSET,
906422
	PERK_ERR_AR_INVALID_ARMAP_NAME_OFFSET,
906422
	PERK_ERR_AR_DLUNIT_NOT_SPECIFIED,
906422
	PERK_ERR_AR_OUTPUT_NOT_SPECIFIED,
906422
	PERK_ERR_AR_OUTPUT_NOT_APPLICABLE,
75666b
	PERK_ERR_AR_NON_ARCHIVE_IMAGE,
d9d2d9
	PERK_ERR_AR_NON_PE_MEMBERS,
d9d2d9
	PERK_ERR_AR_MIXED_PE_MEMBERS,
d9d2d9
	PERK_ERR_AR_NESTED_ARCHIVE,
663098
	PERK_ERR_AR_MISSING_ACTION,
663098
	PERK_ERR_AR_MULTIPLE_ACTIONS,
663098
	PERK_ERR_AR_MULTIPLE_ANCHORS,
663098
	PERK_ERR_AR_INVALID_ANCHORS,
663098
	PERK_ERR_AR_MISSING_ANCHOR,
663098
	PERK_ERR_AR_NULL_POSNAME,
663098
	PERK_ERR_AR_NULL_ARNAME,
ff121d
	PERK_ERR_CAP,
ff121d
};
ff121d
59b920
enum pe_cmd {
59b920
	PERK_CMD_DEFAULT,
59b920
	PERK_CMD_PERK,
c73e19
	PERK_CMD_AR,
59b920
	PERK_CMD_CAP,
59b920
};
59b920
d6e02b
struct pe_raw_image;
d6e02b
struct pe_raw_image_dos_hdr;
d6e02b
struct pe_raw_coff_image_hdr;
d6e02b
struct pe_raw_coff_object_hdr;
d6e02b
union  pe_raw_opt_hdr;
d6e02b
struct pe_raw_sec_hdr;
d6e02b
struct pe_raw_export_hdr;
d6e02b
struct pe_raw_import_hdr;
d6e02b
struct pe_raw_coff_symbol;
d6e02b
c0fbae
struct pe_raw_image {
ed06fb
	void *		map_addr;
ed06fb
	size_t		map_size;
c0fbae
};
c0fbae
906422
struct pe_raw_archive {
906422
	void *				map_addr;
906422
	size_t				map_size;
906422
};
906422
cf4adc
struct pe_expsym {
f0d194
	const char *	s_name;
f0d194
	void *		s_eaddr;
f0d194
	void *		s_maddr;
f0d194
	uint32_t	s_roffset;
cf4adc
};
cf4adc
753060
struct pe_meta_stats {
2111da
	int32_t		t_nexpsyms;
2111da
	int32_t		t_nimplibs;
20e8a3
	int32_t		t_ndsolibs;
20e8a3
	int32_t		t_ndsosyms;
fd0e2d
	int32_t         t_nsymbols;
2111da
	int32_t		t_nrelocs;
c0fbae
};
c0fbae
c0fbae
struct pe_image_meta {
f3d26e
	struct pe_raw_image		r_image;
f3d26e
	struct pe_raw_image_dos_hdr *	r_dos;
f3d26e
	struct pe_raw_coff_image_hdr *	r_coff;
f3d26e
	struct pe_raw_coff_object_hdr *	r_obj;
f3d26e
	union  pe_raw_opt_hdr *		r_opt;
f3d26e
	struct pe_raw_sec_hdr *		r_sectbl;
fd0e2d
	struct pe_raw_coff_symbol *     r_symtbl;
f3d26e
f3d26e
	struct pe_raw_export_hdr *	r_edata;
f3d26e
	struct pe_raw_import_hdr *	r_idata;
f3d26e
20e8a3
	void *				r_dsometa;
20e8a3
	void *				r_dsosyms;
20e8a3
	char *				r_dsostrs;
20e8a3
	void *				r_dsodata;
20e8a3
58ced9
	struct pe_meta_stats		m_stats;
58ced9
	struct pe_meta_image_dos_hdr	m_dos;
58ced9
	struct pe_meta_coff_file_hdr	m_coff;
58ced9
	struct pe_meta_opt_hdr		m_opt;
58ced9
	struct pe_meta_sec_hdr *	m_sectbl;
fd0e2d
	struct pe_meta_coff_symbol *    m_symtbl;
c0fbae
58ced9
	struct pe_meta_export_hdr	m_edata;
58ced9
	struct pe_meta_import_hdr *	m_idata;
c004d0
25e3c0
	struct pe_meta_sec_hdr *	h_edata;
25e3c0
	struct pe_meta_sec_hdr *	h_idata;
20e8a3
20e8a3
	struct pe_meta_sec_hdr *	h_dsometa;
20e8a3
	struct pe_meta_sec_hdr *	h_dsosyms;
20e8a3
	struct pe_meta_sec_hdr *	h_dsostrs;
20e8a3
	struct pe_meta_sec_hdr *	h_dsodata;
867bfb
867bfb
	enum pe_abi			m_abi;
867bfb
	enum pe_subtype			m_subtype;
867bfb
	enum pe_framework		m_framework;
c0fbae
};
c0fbae
906422
struct pe_archive_meta {
906422
	struct pe_raw_archive           r_archive;
906422
	struct ar_raw_signature *       r_signature;
906422
906422
	struct ar_meta_signature *      m_signature;
906422
906422
	struct ar_meta_member_info **   a_memberv;
906422
	struct ar_meta_member_info *    a_arref_longnames;
906422
	struct ar_meta_armap_info       a_armap_primary;
906422
	struct ar_meta_armap_info       a_armap_pecoff;
906422
};
906422
068b8d
struct pe_source_version {
068b8d
	int		major;
068b8d
	int		minor;
068b8d
	int		revision;
068b8d
	const char *	commit;
068b8d
};
068b8d
a85d3e
struct pe_fd_ctx {
a85d3e
	int		fdin;
a85d3e
	int		fdout;
a85d3e
	int		fderr;
a85d3e
	int		fdlog;
a85d3e
	int		fdcwd;
a85d3e
	int		fddst;
a85d3e
};
a85d3e
e8769a
struct pe_error_info {
f006c4
	const struct pe_driver_ctx *	edctx;
f006c4
	const struct pe_unit_ctx *	euctx;
f006c4
	const char *			eunit;
f006c4
	int				esyscode;
f006c4
	int				elibcode;
f006c4
	const char *			efunction;
f006c4
	int				eline;
f006c4
	unsigned			eflags;
f006c4
	void *				eany;
e8769a
};
e8769a
76aabf
struct pe_common_ctx {
a3de1c
	uint64_t			drvflags;
a3de1c
	uint64_t			fmtflags;
d38fc0
	uint64_t			hdrdump;
59b920
	enum pe_cmd                     cmd;
a3de1c
};
a3de1c
a3de1c
struct pe_driver_ctx {
a3de1c
	const char **			units;
a3de1c
	const char *			program;
a3de1c
	const char *			module;
c61328
	const struct pe_common_ctx *	cctx;
e8769a
	struct pe_error_info **		errv;
85119e
	void *				any;
a3de1c
};
a3de1c
a3de1c
struct pe_unit_ctx {
d7ed3e
	const char * const *		path;
d7ed3e
	const struct pe_image_meta *	meta;
d9d2d9
	const struct pe_archive_meta *	armeta;
d9d2d9
	const struct pe_image_meta **	objmeta;
85119e
	void *				any;
a3de1c
};
a3de1c
bf447f
struct pe_info_string {
bf447f
	char				buffer[128];
bf447f
};
bf447f
a3de1c
/* driver api */
77fbc1
perk_api int  pe_lib_get_driver_ctx             (char ** argv, char ** envp, uint32_t flags,
77fbc1
                                                 const struct pe_fd_ctx *,
77fbc1
                                                 struct pe_driver_ctx **);
4323e6
77fbc1
perk_api void pe_lib_free_driver_ctx            (struct pe_driver_ctx *);
a3de1c
77fbc1
perk_api int  pe_lib_get_unit_ctx               (const struct pe_driver_ctx *, const char * path,
77fbc1
                                                 struct pe_unit_ctx **);
4323e6
77fbc1
perk_api void pe_lib_free_unit_ctx              (struct pe_unit_ctx *);
a3de1c
77fbc1
perk_api int  pe_lib_get_driver_fdctx           (const struct pe_driver_ctx *, struct pe_fd_ctx *);
118b74
77fbc1
perk_api int  pe_lib_set_driver_fdctx           (struct pe_driver_ctx *, const struct pe_fd_ctx *);
a85d3e
59b920
/* cmd api */
77fbc1
perk_api int  pe_cmd_perk                       (const struct pe_driver_ctx *, const char *);
5b248d
perk_api int  pe_cmd_ar                         (const struct pe_driver_ctx *, uint64_t,
5b248d
                                                 const char *, const char *, const char **);
59b920
c0fbae
/* utility api */
77fbc1
perk_api int  pe_main                           (char **, char **, const struct pe_fd_ctx *);
a85d3e
77fbc1
perk_api int  pe_output_image_category          (const struct pe_driver_ctx *, const struct pe_image_meta *);
77fbc1
perk_api int  pe_output_image_sections          (const struct pe_driver_ctx *, const struct pe_image_meta *);
77fbc1
perk_api int  pe_output_image_symbols           (const struct pe_driver_ctx *, const struct pe_image_meta *);
77fbc1
perk_api int  pe_output_image_strings           (const struct pe_driver_ctx *, const struct pe_image_meta *);
77fbc1
perk_api int  pe_output_export_symbols          (const struct pe_driver_ctx *, const struct pe_image_meta *);
77fbc1
perk_api int  pe_output_import_libraries        (const struct pe_driver_ctx *, const struct pe_image_meta *);
77fbc1
perk_api int  pe_output_mdso_libraries          (const struct pe_driver_ctx *, const struct pe_image_meta *);
27496e
1647d6
/* error trace api */
1647d6
perk_api int  pe_output_error_record            (const struct pe_driver_ctx *, const struct pe_error_info *);
1647d6
perk_api int  pe_output_error_vector            (const struct pe_driver_ctx *);
1647d6
71ed2f
/* header dump api */
9e2275
perk_api int  pe_hexdump_image_dos_hdr          (const struct pe_driver_ctx *, const struct pe_image_meta *);
9e2275
perk_api int  pe_hexdump_coff_image_hdr         (const struct pe_driver_ctx *, const struct pe_image_meta *);
9e2275
perk_api int  pe_hexdump_coff_object_hdr        (const struct pe_driver_ctx *, const struct pe_image_meta *);
9e2275
perk_api int  pe_hexdump_coff_opt_hdr           (const struct pe_driver_ctx *, const struct pe_image_meta *);
9e2275
perk_api int  pe_hexdump_sec_tbl                (const struct pe_driver_ctx *, const struct pe_image_meta *);
9e2275
perk_api int  pe_hexdump_export_hdr             (const struct pe_driver_ctx *, const struct pe_image_meta *);
9e2275
perk_api int  pe_hexdump_import_tbl             (const struct pe_driver_ctx *, const struct pe_image_meta *);
71ed2f
4323e6
/* raw image api */
a7c639
perk_api int  pe_raw_map_raw_image              (const struct pe_driver_ctx *,
77fbc1
                                                 int fd, const char * path, int prot,
77fbc1
                                                 struct pe_raw_image *);
c0fbae
a7c639
perk_api int  pe_raw_unmap_raw_image            (struct pe_raw_image *);
c0fbae
4323e6
/* image meta api */
57ddbe
perk_api int  pe_meta_get_image_meta            (const struct pe_driver_ctx *,
77fbc1
                                                 const struct pe_raw_image *,
77fbc1
                                                 struct pe_image_meta **);
c0fbae
57ddbe
perk_api void pe_meta_free_image_meta           (struct pe_image_meta *);
4323e6
57ddbe
perk_api int  pe_meta_get_named_section_index   (const struct pe_image_meta *, const char *);
57ddbe
perk_api int  pe_meta_get_block_section_index   (const struct pe_image_meta *, const struct pe_block *);
62b9db
57ddbe
perk_api int  pe_meta_get_roffset_from_rva      (const struct pe_image_meta *, uint32_t, uint32_t *);
57ddbe
perk_api int  pe_meta_get_rva_from_roffset      (const struct pe_image_meta *, uint32_t, uint32_t *);
62b9db
57ddbe
perk_api int  pe_meta_get_expsym_by_name        (const struct pe_image_meta *, const char *, struct pe_expsym *);
57ddbe
perk_api int  pe_meta_get_expsym_by_index       (const struct pe_image_meta *, unsigned,     struct pe_expsym *);
c7ca52
bf447f
/* info api */
d24348
perk_api int  pe_info_get_image_abi             (const struct pe_image_meta *, struct pe_info_string *);
d24348
perk_api int  pe_info_get_image_subtype         (const struct pe_image_meta *, struct pe_info_string *);
d24348
perk_api int  pe_info_get_image_subsystem       (const struct pe_image_meta *, struct pe_info_string *);
d24348
perk_api int  pe_info_get_image_framework       (const struct pe_image_meta *, struct pe_info_string *);
bf447f
888b18
/* low-level reader api */
77fbc1
perk_api int  pe_read_dos_header                (const struct pe_raw_image_dos_hdr *,   struct pe_meta_image_dos_hdr *);
77fbc1
perk_api int  pe_read_coff_header               (const struct pe_raw_coff_image_hdr *,  struct pe_meta_coff_file_hdr *);
77fbc1
perk_api int  pe_read_object_header             (const struct pe_raw_coff_object_hdr *, struct pe_meta_coff_file_hdr *);
77fbc1
perk_api int  pe_read_optional_header           (const union  pe_raw_opt_hdr *,         struct pe_meta_opt_hdr *);
77fbc1
perk_api int  pe_read_section_header            (const struct pe_raw_sec_hdr *,         struct pe_meta_sec_hdr *);
77fbc1
perk_api int  pe_read_export_header             (const struct pe_raw_export_hdr *,      struct pe_meta_export_hdr *);
77fbc1
perk_api int  pe_read_import_header             (const struct pe_raw_import_hdr *,      struct pe_meta_import_hdr *);
77fbc1
77fbc1
perk_api int  pe_read_coff_symbol               (const struct pe_raw_coff_symbol *,     struct pe_meta_coff_symbol *,
77fbc1
                                                 const struct pe_meta_coff_file_hdr *,  void * base);
77fbc1
77fbc1
perk_api int  pe_read_import_lookup             (const unsigned char *,                 struct pe_meta_import_lookup *,
77fbc1
                                                 uint32_t magic);
4323e6
96b212
/* low-level symtbl api */
96b212
perk_api uint32_t pe_hash_mbstr_crc32           (const unsigned char *, size_t *);
96b212
perk_api uint64_t pe_hash_mbstr_crc64           (const unsigned char *, size_t *);
96b212
75adc9
/* archiver api */
75adc9
perk_api int  pe_ar_get_archive_meta            (const struct pe_driver_ctx *,
75adc9
                                                 const struct pe_raw_archive *,
75adc9
                                                 struct pe_archive_meta **);
75adc9
75adc9
perk_api void pe_ar_free_archive_meta           (struct pe_archive_meta *);
75adc9
3eb7d0
/* archiver utility api */
3eb7d0
perk_api int  pe_ar_list_members                (const struct pe_archive_meta *, const char **);
7cc041
perk_api int  pe_ar_print_members               (const struct pe_archive_meta *, const char **);
3eb7d0
4323e6
/* package info */
4323e6
perk_api const struct pe_source_version * pe_source_version(void);
381efa
c0fbae
#ifdef __cplusplus
c0fbae
}
c0fbae
#endif
c0fbae
c0fbae
#endif