From 230bb508a585a3a81b7fe02d9d1a167bf1cdb164 Mon Sep 17 00:00:00 2001 From: inisider Date: Wed, 29 Oct 2014 17:38:05 -0400 Subject: [PATCH] Add support of RBuffer instead of FILE use r_buf_seek and r_buf_read --- libr/bin/pdb/pdb.c | 64 +++++++++++++++++++++----------------- libr/bin/pdb/stream_file.c | 10 +++--- libr/bin/pdb/stream_file.h | 2 +- libr/bin/pdb/types.h | 6 ++-- libr/include/r_pdb.h | 4 ++- 5 files changed, 49 insertions(+), 37 deletions(-) diff --git a/libr/bin/pdb/pdb.c b/libr/bin/pdb/pdb.c index e668671c95..1abb257337 100644 --- a/libr/bin/pdb/pdb.c +++ b/libr/bin/pdb/pdb.c @@ -53,9 +53,9 @@ static void free_pdb_stream(void *stream) { /// size - default value = -1 /// page_size - default value = 0x1000 /////////////////////////////////////////////////////////////////////////////// -static int init_r_pdb_stream(R_PDB_STREAM *pdb_stream, FILE *fp, int *pages, +static int init_r_pdb_stream(R_PDB_STREAM *pdb_stream, RBuffer *buf/*FILE *fp*/, int *pages, int pages_amount, int index, int size, int page_size) { - pdb_stream->fp = fp; + pdb_stream->buf = buf; pdb_stream->pages = pages; pdb_stream->indx = index; pdb_stream->page_size = page_size; @@ -67,20 +67,20 @@ static int init_r_pdb_stream(R_PDB_STREAM *pdb_stream, FILE *fp, int *pages, pdb_stream->size = size; } - init_r_stream_file (&(pdb_stream->stream_file), fp, pages, pages_amount, size, page_size); + init_r_stream_file (&(pdb_stream->stream_file), buf, pages, pages_amount, size, page_size); pdb_stream->free_ = free_pdb_stream; return 1; } /////////////////////////////////////////////////////////////////////////////// -static int read_int_var(char *var_name, int *var, FILE *fp) { - int bytes_read = fread(var, 4, 1, fp); - if (bytes_read != 1) { +static int read_int_var(char *var_name, int *var, R_PDB *pdb) { + int bytes_read = r_buf_read(pdb->buf, (unsigned char *)var, 4); + if (bytes_read != 4) { eprintf ("error while reading from file [%s]", var_name); return 0; } - return 1; + return bytes_read; } /////////////////////////////////////////////////////////////////////////////// @@ -112,7 +112,7 @@ static int init_pdb7_root_stream(R_PDB *pdb, int *root_page_list, int pages_amou R_PDB7_ROOT_STREAM *root_stream7; pdb->root_stream = (R_PDB7_ROOT_STREAM *) malloc(sizeof(R_PDB7_ROOT_STREAM)); - init_r_pdb_stream(&pdb->root_stream->pdb_stream, pdb->fp, root_page_list, pages_amount, + init_r_pdb_stream(&pdb->root_stream->pdb_stream, pdb->buf, root_page_list, pages_amount, indx, root_size, page_size); root_stream7 = pdb->root_stream; @@ -307,7 +307,7 @@ static int pdb_read_root(R_PDB *pdb) { it = r_list_iterator(root_stream->streams_list); while (r_list_iter_next(it)) { page = (SPage*) r_list_iter_get(it); - init_r_stream_file(&stream_file, pdb->fp, (int *)page->stream_pages, + init_r_stream_file(&stream_file, pdb->buf, (int *)page->stream_pages, page->num_pages/*root_stream->pdb_stream.pages_amount*/, page->stream_size, root_stream->pdb_stream.page_size); @@ -347,7 +347,7 @@ static int pdb_read_root(R_PDB *pdb) { } pdb_stream = (R_PDB_STREAM *) malloc(sizeof(R_PDB_STREAM)); - init_r_pdb_stream(pdb_stream, pdb->fp, (int *)page->stream_pages, + init_r_pdb_stream(pdb_stream, pdb->buf, (int *)page->stream_pages, root_stream->pdb_stream.pages_amount, i, page->stream_size, root_stream->pdb_stream.page_size); @@ -383,21 +383,21 @@ static int pdb7_parse(R_PDB *pdb) { void *p_tmp; int i = 0; - bytes_read = fread (signature, 1, PDB7_SIGNATURE_LEN, pdb->fp); + bytes_read = r_buf_read(pdb->buf, (unsigned char *)signature, PDB7_SIGNATURE_LEN); if (bytes_read != PDB7_SIGNATURE_LEN) { eprintf ("error while reading PDB7_SIGNATURE\n"); goto error; } - if (!read_int_var ("page_size", &page_size, pdb->fp)) + if (!read_int_var ("page_size", &page_size, pdb)) goto error; - if (!read_int_var ("alloc_tbl_ptr", &alloc_tbl_ptr, pdb->fp)) + if (!read_int_var ("alloc_tbl_ptr", &alloc_tbl_ptr, pdb)) goto error; - if (!read_int_var ("num_file_pages", &num_file_pages, pdb->fp)) + if (!read_int_var ("num_file_pages", &num_file_pages, pdb)) goto error; - if (!read_int_var ("root_size", &root_size, pdb->fp)) + if (!read_int_var ("root_size", &root_size, pdb)) goto error; - if (!read_int_var("reserved", &reserved, pdb->fp)) + if (!read_int_var("reserved", &reserved, pdb)) goto error; // FIXME: why they is not equal ???? @@ -415,8 +415,10 @@ static int pdb7_parse(R_PDB *pdb) { goto error; } - bytes_read = fread(root_index_pages, 4, num_root_index_pages, pdb->fp); - if (bytes_read != num_root_index_pages) { +// bytes_read = fread(root_index_pages, 4, num_root_index_pages, pdb->fp); + bytes_read = r_buf_read(pdb->buf, (unsigned char *)root_index_pages, 4 * num_root_index_pages); + //fread(root_index_pages, 4, num_root_index_pages, pdb->fp); + if (bytes_read != 4 * num_root_index_pages) { eprintf ("error while reading root_index_pages\n"); goto error; } @@ -429,8 +431,8 @@ static int pdb7_parse(R_PDB *pdb) { p_tmp = root_page_data; for (i = 0; i < num_root_index_pages; i++) { - fseek(pdb->fp, root_index_pages[i] * page_size, SEEK_SET); - fread(p_tmp, page_size, 1, pdb->fp); + r_buf_seek(pdb->buf, root_index_pages[i] * page_size, 0); + r_buf_read(pdb->buf, p_tmp, page_size); p_tmp = (char *)p_tmp + page_size; } @@ -551,7 +553,11 @@ static void finish_pdb_parse(R_PDB *pdb) if (pdb->stream_map) free(pdb->stream_map); - fclose(pdb->fp); + if (pdb->buf) { + free(pdb->buf); + } + +// fclose(pdb->fp); // printf("finish_pdb_parse()\n"); } @@ -688,12 +694,12 @@ int init_pdb_parser(R_PDB *pdb, const char *filename) { if (!pdb->printf) pdb->printf = (PrintfCallback)printf; - // TODO: Reimplement using RBuffer here - pdb->fp = r_sandbox_fopen (filename, "rb"); - if (!pdb->fp) { - eprintf ("file %s can not be open\n", filename); - goto error; - } + pdb->buf = r_buf_file(filename); +// pdb->fp = r_sandbox_fopen (filename, "rb"); +// if (!pdb->fp) { +// eprintf ("file %s can not be open\n", filename); +// goto error; +// } signature = (char *)malloc (PDB7_SIGNATURE_LEN); if (!signature) { @@ -701,13 +707,13 @@ int init_pdb_parser(R_PDB *pdb, const char *filename) { goto error; } - bytes_read = fread (signature, 1, PDB7_SIGNATURE_LEN, pdb->fp); + bytes_read = r_buf_read(pdb->buf, (unsigned char *)signature, PDB7_SIGNATURE_LEN); if (bytes_read != PDB7_SIGNATURE_LEN) { eprintf ("file reading error\n"); goto error; } - fseek (pdb->fp, 0, SEEK_SET); + r_buf_seek(pdb->buf, 0, 0); if (!memcmp (signature, PDB7_SIGNATURE, PDB7_SIGNATURE_LEN)) { pdb->pdb_parse = pdb7_parse; diff --git a/libr/bin/pdb/stream_file.c b/libr/bin/pdb/stream_file.c index 2451a237f8..fc01a52246 100644 --- a/libr/bin/pdb/stream_file.c +++ b/libr/bin/pdb/stream_file.c @@ -4,11 +4,11 @@ /// size = -1 (default value) /// pages_size = 0x1000 (default value) //////////////////////////////////////////////////////////////////////////////// -int init_r_stream_file(R_STREAM_FILE *stream_file, FILE *fp, int *pages, +int init_r_stream_file(R_STREAM_FILE *stream_file, RBuffer *buf, int *pages, int pages_amount, int size, int page_size) { stream_file->error = 0; - stream_file->fp = fp; + stream_file->buf = buf; stream_file->pages = pages; stream_file->pages_amount = pages_amount; stream_file->page_size = page_size; @@ -42,9 +42,11 @@ static void stream_file_read_pages(R_STREAM_FILE *stream_file, int start_indx, for (i = start_indx; i < end_indx; i++) { // tmp = stream_file->pages[i]; page_offset = stream_file->pages[i] * stream_file->page_size; - fseek(stream_file->fp, page_offset, SEEK_SET); + stream_file->buf->cur = page_offset; + r_buf_read_at(stream_file->buf, page_offset, res, stream_file->page_size); +// fseek(stream_file->fp, page_offset, SEEK_SET); // curr_pos = ftell(stream_file->fp); - fread(res, stream_file->page_size, 1, stream_file->fp); +// fread(res, stream_file->page_size, 1, stream_file->fp); res += stream_file->page_size; } } diff --git a/libr/bin/pdb/stream_file.h b/libr/bin/pdb/stream_file.h index e1cc71d764..95f45c2140 100644 --- a/libr/bin/pdb/stream_file.h +++ b/libr/bin/pdb/stream_file.h @@ -8,7 +8,7 @@ /// size = -1 (default value) /// pages_size = 0x1000 (default value) //////////////////////////////////////////////////////////////////////////////// -int init_r_stream_file(R_STREAM_FILE *stream_file, FILE *fp, int *pages, +int init_r_stream_file(R_STREAM_FILE *stream_file, RBuffer *buf, int *pages, int pages_amount, int size, int page_size); // size by default = -1 diff --git a/libr/bin/pdb/types.h b/libr/bin/pdb/types.h index 2da66347f6..f6fc941a2c 100644 --- a/libr/bin/pdb/types.h +++ b/libr/bin/pdb/types.h @@ -64,7 +64,8 @@ } typedef struct R_STREAM_FILE_{ - FILE *fp; +// FILE *fp; + RBuffer *buf; int *pages; int page_size; int pages_amount; @@ -583,7 +584,8 @@ typedef struct { } SPage; typedef struct { - FILE *fp; +// FILE *fp; + RBuffer *buf; int *pages; int pages_amount; int indx; diff --git a/libr/include/r_pdb.h b/libr/include/r_pdb.h index 98c21f9216..992d327a34 100644 --- a/libr/include/r_pdb.h +++ b/libr/include/r_pdb.h @@ -18,12 +18,14 @@ typedef struct R_PDB { int (*pdb_parse)(struct R_PDB *pdb); void (*finish_pdb_parse)(struct R_PDB *pdb); void (*print_types)(struct R_PDB *pdb); - FILE *fp; +// FILE *fp; PrintfCallback printf; struct R_PDB7_ROOT_STREAM *root_stream; void *stream_map; RList *pdb_streams; RList *pdb_streams2; + RBuffer *buf; // mmap of file +// int curr; void (*print_gvars)(struct R_PDB *pdb, int img_base); } R_PDB;