#ifndef PE_DRIVER_IMPL_H #define PE_DRIVER_IMPL_H #include #include #include #include #include #include "argv/argv.h" #define PERK_OPTV_ELEMENTS 64 extern const struct argv_option pe_default_options[]; enum app_tags { TAG_HELP, TAG_VERSION, TAG_PRETTY, TAG_CATEGORY, TAG_SECTIONS, TAG_SYMBOLS, TAG_STRINGS, TAG_EXPSYMS, TAG_IMPLIBS, TAG_IMPSYMS, TAG_DSOLIBS, TAG_DSOSYMS, }; struct pe_driver_ctx_impl { struct pe_common_ctx cctx; struct pe_driver_ctx ctx; const struct pe_unit_ctx * euctx; const char * eunit; struct pe_error_info ** errinfp; struct pe_error_info ** erricap; struct pe_error_info * erriptr[64]; struct pe_error_info erribuf[64]; }; struct pe_unit_ctx_impl { const char * path; struct pe_raw_image map; struct pe_image_meta * meta; struct pe_unit_ctx uctx; }; static inline struct pe_driver_ctx_impl * pe_get_driver_ictx( const struct pe_driver_ctx * dctx) { uintptr_t addr; if (dctx) { addr = (uintptr_t)dctx - offsetof(struct pe_driver_ctx_impl,ctx); return (struct pe_driver_ctx_impl *)addr; } return 0; } static inline void pe_driver_set_ectx( const struct pe_driver_ctx * dctx, const struct pe_unit_ctx * uctx, const char * unit) { struct pe_driver_ctx_impl * ictx; ictx = pe_get_driver_ictx(dctx); ictx->euctx = uctx; ictx->eunit = unit; } #endif