#include "types.h" #include "stream_pe.h" #include "stream_file.h" /////////////////////////////////////////////////////////////////////////////// void parse_pe_stream(void *stream, R_STREAM_FILE *stream_file) { int data_size = 0; char *data = 0, *ptmp = 0; int read_bytes = 0; SIMAGE_SECTION_HEADER *sctn_header = 0; SPEStream *pe_stream = (SPEStream *) stream; int sctn_header_size =0; stream_file_get_size (stream_file, &data_size); data = (char *) malloc (data_size); if (!data) { return; } stream_file_get_data (stream_file, data); sctn_header_size = sizeof (SIMAGE_SECTION_HEADER); ptmp = data; pe_stream->sections_hdrs = r_list_new (); while (read_bytes < data_size) { sctn_header = (SIMAGE_SECTION_HEADER *) malloc (sctn_header_size); if (!sctn_header) { break; } memcpy (sctn_header, ptmp, sctn_header_size); ptmp += sctn_header_size; r_list_append (pe_stream->sections_hdrs, sctn_header); read_bytes += sctn_header_size; } free (data); } /////////////////////////////////////////////////////////////////////////////// void free_pe_stream(void *stream) { SPEStream *pe_stream = (SPEStream *) stream; SIMAGE_SECTION_HEADER *sctn_header = 0; RListIter *it = 0; it = r_list_iterator (pe_stream->sections_hdrs); while (r_list_iter_next (it)) { sctn_header = (SIMAGE_SECTION_HEADER *) r_list_iter_get (it); free (sctn_header); } r_list_free (pe_stream->sections_hdrs); }