void parse_gdata_stream(void *stream, R_STREAM_FILE *stream_file) { unsigned short len = 0; unsigned short leaf_type = 0; char *data = 0; SGDATAStream *data_stream = (SGDATAStream *) stream; SGlobal *global = 0; data_stream->globals_list = NULL; while (1) { stream_file_read(stream_file, 2, (char *)&len); if (len == 0) break; data = (char *) malloc(len); if (!data) return; stream_file_read(stream_file, len, data); leaf_type = *(unsigned short *) (data); if ((leaf_type == 0x110E) || (leaf_type == 0x1009)) { global = (SGlobal *) malloc(sizeof(SGlobal)); if (!global) { free (data); return; } global->leaf_type = leaf_type; parse_global(data + 2, len, global); DL_APPEND(data_stream->globals_list, global); } } }
static void parse_pdb_info_stream(void *parsed_pdb_stream, R_STREAM_FILE *stream) { SPDBInfoStream *tmp = (SPDBInfoStream *)parsed_pdb_stream; tmp->names = 0; stream_file_read (stream, 4, (char *)&tmp->/*data.*/version); stream_file_read (stream, 4, (char *)&tmp->/*data.*/time_date_stamp); stream_file_read (stream, 4, (char *)&tmp->/*data.*/age); stream_file_read (stream, 4, (char *)&tmp->/*data.*/guid.data1); stream_file_read (stream, 2, (char *)&tmp->/*data.*/guid.data2); stream_file_read (stream, 2, (char *)&tmp->/*data.*/guid.data3); stream_file_read (stream, 8, (char *)&tmp->/*data.*/guid.data4); stream_file_read (stream, 4, (char *)&tmp->/*data.*/cb_names); tmp->/*data.*/names = (char *) calloc(1, tmp->/*data.*/cb_names); stream_file_read (stream, tmp->/*data.*/cb_names, tmp->/*data.*/names); }
void parse_dbi_stream(void *parsed_pdb_stream, R_STREAM_FILE *stream_file) { SDbiStream *dbi_stream = (SDbiStream *) parsed_pdb_stream; SDBIExHeader *dbi_ex_header = 0; int pos = 0; char *dbiexhdr_data = 0, *p_tmp = 0; int size = 0, sz = 0; int i = 0; parse_dbi_header (&dbi_stream->dbi_header, stream_file); pos += sizeof (SDBIHeader) - 2; // 2 because enum in C equal to 4, but // to read just 2; stream_file_seek (stream_file, pos, 0); size = dbi_stream->dbi_header.module_size; dbiexhdr_data = (char *) malloc(size); if (!dbiexhdr_data) { return; } stream_file_read (stream_file, size, dbiexhdr_data); dbi_stream->dbiexhdrs = r_list_new(); p_tmp = dbiexhdr_data; while (i < size) { dbi_ex_header = (SDBIExHeader *) malloc (sizeof(SDBIExHeader)); if (!dbi_ex_header) { break; } // TODO: rewrite for signature where can to do chech CAN_READ true? sz = parse_dbi_ex_header (p_tmp, size, dbi_ex_header); if ((sz % _ALIGN)) { sz = sz + (_ALIGN - (sz % _ALIGN)); } i += sz; p_tmp += sz; r_list_append (dbi_stream->dbiexhdrs, dbi_ex_header); } free (dbiexhdr_data); // "Section Contribution" stream_file_seek(stream_file, dbi_stream->dbi_header.seccon_size, 1); // "Section Map" stream_file_seek(stream_file, dbi_stream->dbi_header.secmap_size, 1); // "File Info" stream_file_seek(stream_file, dbi_stream->dbi_header.filinf_size, 1); // "TSM" stream_file_seek(stream_file, dbi_stream->dbi_header.tsmap_size, 1); // "EC" stream_file_seek(stream_file, dbi_stream->dbi_header.ecinfo_size, 1); parse_dbg_header(&dbi_stream->dbg_header, stream_file); }
static int stream_file_peek(avs_stream_abstract_t *stream_, size_t offset) { avs_stream_file_t *file = (avs_stream_file_t *) stream_; int8_t byte = EOF; size_t bytes_read; char message_finished; avs_off_t current; if (offset > LONG_MAX) { file->error_code = ERANGE; return -1; } current = ftell(file->fp); if (current < 0) { file->error_code = errno; return -1; } if (fseek(file->fp, (long) offset, SEEK_CUR)) { file->error_code = EIO; return -1; } if (stream_file_read(stream_, &bytes_read, &message_finished, (char *) &byte, 1)) { return -1; } if (fseek(file->fp, current, SEEK_SET)) { file->error_code = EIO; return -1; } file->error_code = 0; return (int) byte; }
static void parse_dbi_header(SDBIHeader *dbi_header, R_STREAM_FILE *stream_file) { stream_file_read(stream_file, sizeof(ut32), (char *)&dbi_header->magic); stream_file_read(stream_file, sizeof(ut32), (char *)&dbi_header->version); stream_file_read(stream_file, sizeof(ut32), (char *)&dbi_header->age); stream_file_read(stream_file, sizeof(ut16), (char *)&dbi_header->gssymStream); stream_file_read(stream_file, sizeof(ut16), (char *)&dbi_header->vers); stream_file_read(stream_file, sizeof(st16), (char *)&dbi_header->pssymStream); stream_file_read(stream_file, sizeof(ut16), (char *)&dbi_header->pdbver); stream_file_read(stream_file, sizeof(st16), (char *)&dbi_header->symrecStream); stream_file_read(stream_file, sizeof(ut16), (char *)&dbi_header->pdbver2); stream_file_read(stream_file, sizeof(ut32), (char *)&dbi_header->module_size); stream_file_read(stream_file, sizeof(ut32), (char *)&dbi_header->seccon_size); stream_file_read(stream_file, sizeof(ut32), (char *)&dbi_header->secmap_size); stream_file_read(stream_file, sizeof(ut32), (char *)&dbi_header->filinf_size); stream_file_read(stream_file, sizeof(ut32), (char *)&dbi_header->tsmap_size); stream_file_read(stream_file, sizeof(ut32), (char *)&dbi_header->mfc_index); stream_file_read(stream_file, sizeof(ut32), (char *)&dbi_header->dbghdr_size); stream_file_read(stream_file, sizeof(ut32), (char *)&dbi_header->ecinfo_size); stream_file_read(stream_file, sizeof(ut16), (char *)&dbi_header->flags); stream_file_read(stream_file, 2, (char *)&dbi_header->machine); stream_file_read(stream_file, sizeof(ut32), (char *)&dbi_header->resvd); }
static void parse_dbg_header(SDbiDbgHeader *dbg_header, R_STREAM_FILE *stream_file) { stream_file_read(stream_file, sizeof(short), (char *)&dbg_header->sn_fpo); stream_file_read(stream_file, sizeof(short), (char *)&dbg_header->sn_exception); stream_file_read(stream_file, sizeof(short), (char *)&dbg_header->sn_fixup); stream_file_read(stream_file, sizeof(short), (char *)&dbg_header->sn_omap_to_src); stream_file_read(stream_file, sizeof(short), (char *)&dbg_header->sn_omap_from_src); stream_file_read(stream_file, sizeof(short), (char *)&dbg_header->sn_section_hdr); stream_file_read(stream_file, sizeof(short), (char *)&dbg_header->sn_token_rid_map); stream_file_read(stream_file, sizeof(short), (char *)&dbg_header->sn_xdata); stream_file_read(stream_file, sizeof(short), (char *)&dbg_header->sn_pdata); stream_file_read(stream_file, sizeof(short), (char *)&dbg_header->sn_new_fpo); stream_file_read(stream_file, sizeof(short), (char *)&dbg_header->sn_section_hdr_orig); }
void stream_file_get_data(R_STREAM_FILE *stream_file, char *data) { int pos = stream_file_tell (stream_file); stream_file_seek (stream_file, 0, 0); stream_file_read (stream_file, -1, data); stream_file_seek (stream_file, pos, 0); }