| /* |
| genpeimg - Modify Portable Executable flags and properties. |
| Copyright (C) 2009, 2010, 2011, 2012, 2013 mingw-w64 project |
| |
| This program is free software: you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation, either version 3 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| #ifndef IMG_HXX |
| #define IMG_HXX |
| |
| typedef struct file_image { |
| unsigned char *data; |
| size_t data_len; |
| char *filename; |
| unsigned int is_modified : 1; |
| unsigned int want_save : 1; |
| } file_image; |
| |
| file_image *fimg_create (void); |
| void fimg_free (file_image *pimg); |
| void fimg_show_stats (const file_image *pimg); |
| void fimg_dump_mem (const file_image *pimg, size_t len, FILE *out); |
| int fimg_load (file_image *pimg, const char *fname); |
| int fimg_rename (file_image *pimg, const char *newfname); |
| int fimg_save_as (file_image *pimg, const char *fname, size_t length); |
| int fimg_save (file_image *pimg); |
| int fimg_resize (file_image *pimg, size_t new_size); |
| file_image *fimg_clone (const file_image *pimg); |
| int fimg_replace_at (file_image *pimg, const void *dta, size_t pos, size_t length); |
| int fimg_insert_at (file_image *pimg, const void *dta, size_t pos, size_t length); |
| int fimg_remove_at (file_image *pimg, size_t pos, size_t length); |
| |
| unsigned char fimg_get_uchar_at (const file_image *pimg, size_t pos); |
| int fimg_set_uchar_at (file_image *pimg, unsigned char val, size_t pos); |
| unsigned short fimg_get_ushort_at (const file_image *pimg, size_t pos, int big_endian); |
| int fimg_set_ushort_at (file_image *pimg, unsigned short val, size_t pos, int big_endian); |
| unsigned int fimg_get_uint_at (const file_image *pimg, size_t pos, int big_endian); |
| int fimg_set_uint_at (file_image *pimg, unsigned int val, size_t pos, int big_endian); |
| unsigned long long fimg_get_uquad_at (const file_image *pimg, size_t pos, int big_endian); |
| int fimg_set_uquad_at (file_image *pimg, unsigned long long val, size_t pos, int big_endian); |
| |
| #define FIMG_POS_END ~((size_t) 0) |
| |
| typedef struct pe_image { |
| file_image *pimg; |
| size_t start_pe; |
| size_t size_pe; |
| struct { |
| unsigned short machine; |
| unsigned short numsecs; |
| unsigned int timestamp; |
| unsigned int pointer2SymTab; |
| unsigned int numSyms; |
| unsigned short szOptHdr; |
| unsigned short characteristics; |
| } pe_filehdr; |
| size_t optional_hdr_pos; |
| size_t section_list; |
| size_t section_list_sz; /* Each section entry has 36 bytes size. */ |
| int is_64bit : 1; |
| int is_bigendian : 1; |
| } pe_image; |
| |
| pe_image *peimg_create (file_image *pimg); |
| pe_image *peimg_load (const char *fname); |
| void peimg_free (pe_image *ppeimg); |
| void peimg_show (pe_image *ppeimg, FILE *outfp); |
| |
| void peimg_set_hdr_characeristics (pe_image *pe, unsigned short set, unsigned short mask); |
| void peimg_set_hdr_opt_dll_characteristics (pe_image *pe, unsigned short set, unsigned short mask); |
| |
| #define PEIMG_GET_UCHAR(PEIMG, POS) fimg_get_uchar_at ((PEIMG)->pimg, ((PEIMG)->start_pe + (POS))) |
| #define PEIMG_GET_USHORT(PEIMG, POS) fimg_get_ushort_at ((PEIMG)->pimg, ((PEIMG)->start_pe + (POS)), (PEIMG)->is_bigendian) |
| #define PEIMG_GET_UINT(PEIMG, POS) fimg_get_uint_at ((PEIMG)->pimg, ((PEIMG)->start_pe + (POS)), (PEIMG)->is_bigendian) |
| #define PEIMG_GET_UQUAD(PEIMG, POS) fimg_get_uquad_at ((PEIMG)->pimg, ((PEIMG)->start_pe + (POS)), (PEIMG)->is_bigendian) |
| |
| #define PEIMG_SET_UCHAR(PEIMG, POS, VAL) fimg_set_uchar_at ((PEIMG)->pimg, (unsigned char) (VAL), ((PEIMG)->start_pe + (POS))) |
| #define PEIMG_SET_USHORT(PEIMG, POS, VAL) fimg_set_ushort_at ((PEIMG)->pimg, (unsigned short) (VAL), ((PEIMG)->start_pe + (POS)), (PEIMG)->is_bigendian) |
| #define PEIMG_SET_UINT(PEIMG, POS, VAL) fimg_set_uint_at ((PEIMG)->pimg, (unsigned int) (VAL), ((PEIMG)->start_pe + (POS)), (PEIMG)->is_bigendian) |
| #define PEIMG_SET_UQUAD(PEIMG, POS, VAL) fimg_set_uquad_at ((PEIMG)->pimg, (unsigned long long) (VAL), ((PEIMG)->start_pe + (POS)), (PEIMG)->is_bigendian) |
| |
| #endif |