#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); }