static int fewf_pread(disk_t *disk, void *buffer, const unsigned int count, const uint64_t offset) { struct info_fewf_struct *data=(struct info_fewf_struct *)disk->data; int64_t taille; #if defined( HAVE_LIBEWF_V2_API ) taille = libewf_handle_read_random( data->handle, buffer, count, offset, NULL ); #else taille=libewf_read_random(data->handle, buffer, count, offset); #endif if(taille!=count) { log_error("fewf_pread(xxx,%u,buffer,%lu(%u/%u/%u)) read err: ", (unsigned)(count/disk->sector_size), (long unsigned)(offset/disk->sector_size), offset2cylinder(disk,offset), offset2head(disk,offset), offset2sector(disk,offset)); if(taille<0) log_error("%s\n", strerror(errno)); else if(taille==0) log_error("read after end of file\n"); else log_error("Partial read\n"); if(taille<=0) return -1; } return taille; }
static ssize_t ewf_image_read(TSK_IMG_INFO * img_info, TSK_OFF_T offset, char *buf, size_t len) { #if defined( HAVE_LIBEWF_V2_API ) char error_string[TSK_EWF_ERROR_STRING_SIZE]; libewf_error_t *ewf_error = NULL; #endif ssize_t cnt; IMG_EWF_INFO *ewf_info = (IMG_EWF_INFO *) img_info; if (tsk_verbose) tsk_fprintf(stderr, "ewf_image_read: byte offset: %" PRIuOFF " len: %" PRIuSIZE "\n", offset, len); if (offset > img_info->size) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_READ_OFF); tsk_error_set_errstr("ewf_image_read - %" PRIuOFF, offset); return -1; } tsk_take_lock(&(ewf_info->read_lock)); #if defined( HAVE_LIBEWF_V2_API ) cnt = libewf_handle_read_random(ewf_info->handle, buf, len, offset, &ewf_error); if (cnt < 0) { char *errmsg = NULL; tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_READ); if (getError(ewf_error, error_string)) errmsg = strerror(errno); else errmsg = error_string; tsk_error_set_errstr("ewf_image_read - offset: %" PRIuOFF " - len: %" PRIuSIZE " - %s", offset, len, errmsg); tsk_release_lock(&(ewf_info->read_lock)); return -1; } #else cnt = libewf_read_random(ewf_info->handle, buf, len, offset); if (cnt < 0) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_READ); tsk_error_set_errstr("ewf_image_read - offset: %" PRIuOFF " - len: %" PRIuSIZE " - %s", offset, len, strerror(errno)); tsk_release_lock(&(ewf_info->read_lock)); return -1; } #endif tsk_release_lock(&(ewf_info->read_lock)); return cnt; }
/* Reads a buffer of media data at a specific offset from EWF file(s) * Returns a Python object holding the data if successful or NULL on error */ PyObject *pyewf_handle_read_random( pyewf_handle_t *pyewf_handle, PyObject *arguments, PyObject *keywords ) { char error_string[ PYEWF_ERROR_STRING_SIZE ]; liberror_error_t *error = NULL; PyObject *result_data = NULL; static char *function = "pyewf_handle_read_random"; static char *keyword_list[] = { "size", "offset", NULL }; off64_t read_offset = 0; ssize_t read_count = 0; int read_size = 0; if( pyewf_handle == NULL ) { PyErr_Format( PyExc_TypeError, "%s: invalid pyewf handle.", function ); return( NULL ); } if( pyewf_handle->handle == NULL ) { PyErr_Format( PyExc_TypeError, "%s: invalid pyewf handle - missing libewf handle.", function ); return( NULL ); } if( PyArg_ParseTupleAndKeywords( arguments, keywords, "i|L", keyword_list, &read_size, &read_offset ) == 0 ) { return( NULL ); } if( read_size < 0 ) { PyErr_Format( PyExc_ValueError, "%s: invalid argument read size value less than zero.", function ); return( NULL ); } /* Make sure the data fits into a memory buffer */ if( read_size > INT_MAX ) { PyErr_Format( PyExc_ValueError, "%s: invalid argument read size value exceeds maximum.", function ); return( NULL ); } if( read_offset < 0 ) { PyErr_Format( PyExc_ValueError, "%s: invalid argument read offset value less than zero.", function ); return( NULL ); } /* Make sure the data fits into a memory buffer */ result_data = PyString_FromStringAndSize( NULL, read_size ); read_count = libewf_handle_read_random( pyewf_handle->handle, PyString_AsString( result_data ), (size_t) read_size, (off64_t) read_offset, &error ); if( read_count != (ssize_t) read_size ) { if( liberror_error_backtrace_sprint( error, error_string, PYEWF_ERROR_STRING_SIZE ) == -1 ) { PyErr_Format( PyExc_IOError, "%s: unable to read data.", function ); } else { PyErr_Format( PyExc_IOError, "%s: unable to read data.\n%s", function, error_string ); } liberror_error_free( &error ); return( NULL ); } return( result_data ); }