mirror of
https://github.com/radareorg/radare2.git
synced 2025-01-15 02:00:31 +00:00
5cbcdf1da7
Signed-off-by: Riccardo Schirone <sirmy15@gmail.com>
132 lines
3.7 KiB
C
132 lines
3.7 KiB
C
#include "types.h"
|
|
#include "fpo.h"
|
|
#include "stream_file.h"
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
static int parse_fpo_data(char *data, int data_size, int *read_bytes, SFPO_DATA *fpo_data)
|
|
{
|
|
int curr_read_bytes = *read_bytes;
|
|
|
|
READ(*read_bytes, 4, data_size, fpo_data->ul_off_start, data, unsigned int);
|
|
READ(*read_bytes, 4, data_size, fpo_data->cb_proc_size, data, unsigned int);
|
|
READ(*read_bytes, 4, data_size, fpo_data->cdw_locals, data, unsigned int);
|
|
READ(*read_bytes, 2, data_size, fpo_data->cdw_params, data, unsigned short);
|
|
READ(*read_bytes, 2, data_size, fpo_data->bit_values.bit_values, data, unsigned short);
|
|
|
|
fpo_data->bit_values.bit_values = SWAP_UINT16(fpo_data->bit_values.bit_values);
|
|
|
|
return (*read_bytes - curr_read_bytes);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
static int parse_fpo_data_v2(char *data, int data_size, int *read_bytes, SFPO_DATA_V2 *fpo_data)
|
|
{
|
|
int curr_read_bytes = *read_bytes;
|
|
|
|
memcpy(fpo_data, data, sizeof(SFPO_DATA_V2));
|
|
*read_bytes += sizeof(SFPO_DATA_V2);
|
|
|
|
return (*read_bytes - curr_read_bytes);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
void parse_fpo_stream(void *stream, R_STREAM_FILE *stream_file)
|
|
{
|
|
int data_size;
|
|
char *data = 0, *ptmp = 0;
|
|
int curr_read_bytes = 0, read_bytes = 0;
|
|
SFPO_DATA *fpo_data = 0;
|
|
SFPOStream *fpo_stream = 0;
|
|
|
|
stream_file_get_size(stream_file, &data_size);
|
|
data = (char *) malloc(data_size);
|
|
stream_file_get_data(stream_file, data);
|
|
|
|
fpo_stream = (SFPOStream *) stream;
|
|
fpo_stream->fpo_data_list = r_list_new();
|
|
curr_read_bytes = 0;
|
|
ptmp = data;
|
|
while (read_bytes < data_size) {
|
|
fpo_data = (SFPO_DATA *) malloc(sizeof(SFPO_DATA));
|
|
curr_read_bytes = parse_fpo_data(ptmp, data_size, &read_bytes, fpo_data);
|
|
ptmp += curr_read_bytes;
|
|
|
|
if (!curr_read_bytes) {
|
|
free(fpo_data);
|
|
break;
|
|
}
|
|
|
|
r_list_append(fpo_stream->fpo_data_list, fpo_data);
|
|
}
|
|
|
|
free(data);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
void free_fpo_stream(void *stream)
|
|
{
|
|
SFPOStream *fpo_stream = (SFPOStream *) stream;
|
|
RListIter *it = 0;
|
|
SFPO_DATA *fpo_data = 0;
|
|
|
|
it = r_list_iterator(fpo_stream->fpo_data_list);
|
|
while (r_list_iter_next(it)) {
|
|
fpo_data = (SFPO_DATA *) r_list_iter_get(it);
|
|
free(fpo_data);
|
|
}
|
|
r_list_free(fpo_stream->fpo_data_list);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
void free_fpo_new_stream(void *stream)
|
|
{
|
|
SFPONewStream *fpo_stream = (SFPONewStream *) stream;
|
|
RListIter *it = 0;
|
|
SFPO_DATA_V2 *fpo_data = 0;
|
|
|
|
it = r_list_iterator(fpo_stream->fpo_data_list);
|
|
while (r_list_iter_next(it)) {
|
|
fpo_data = (SFPO_DATA_V2 *) r_list_iter_get(it);
|
|
free(fpo_data);
|
|
}
|
|
r_list_free(fpo_stream->fpo_data_list);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
void parse_fpo_new_stream(void *stream, R_STREAM_FILE *stream_file)
|
|
{
|
|
int data_size;
|
|
char *data = 0, *ptmp = 0;
|
|
int curr_read_bytes = 0, read_bytes = 0;
|
|
SFPO_DATA_V2 *fpo_data = 0;
|
|
SFPONewStream *fpo_stream = 0;
|
|
|
|
stream_file_get_size (stream_file, &data_size);
|
|
data = (char *) malloc (data_size);
|
|
if (!data) return;
|
|
stream_file_get_data (stream_file, data);
|
|
|
|
fpo_stream = (SFPONewStream *) stream;
|
|
fpo_stream->fpo_data_list = r_list_new ();
|
|
curr_read_bytes = 0;
|
|
ptmp = data;
|
|
while (read_bytes < data_size) {
|
|
fpo_data = (SFPO_DATA_V2 *) malloc (sizeof(SFPO_DATA_V2));
|
|
if (!fpo_data) {
|
|
free (data);
|
|
return;
|
|
}
|
|
curr_read_bytes = parse_fpo_data_v2 (ptmp, data_size, &read_bytes, fpo_data);
|
|
ptmp += curr_read_bytes;
|
|
|
|
if (!curr_read_bytes) {
|
|
free (fpo_data);
|
|
break;
|
|
}
|
|
|
|
r_list_append (fpo_stream->fpo_data_list, fpo_data);
|
|
}
|
|
|
|
free (data);
|
|
}
|