| /* | 
 |     genpeimg - Modify Portable Executable flags and properties. | 
 |     Copyright (C) 2009-2016 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 40 bytes size.  */ | 
 |   unsigned int is_64bit : 1; | 
 |   unsigned 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); | 
 | void peimg_set_hdr_opt_subsystem (pe_image *pe, unsigned short subsystem); | 
 |  | 
 | #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 |