/* * EwfOpen */ static int EwfOpen(void *p_handle, const char **pp_filename_arr, uint64_t filename_arr_len) { pts_EwfHandle p_ewf_handle=(pts_EwfHandle)p_handle; // We need at least one file if(filename_arr_len==0) return EWF_NO_INPUT_FILES; // Make sure all files are EWF files for(uint64_t i=0;i<filename_arr_len;i++) { #ifdef HAVE_LIBEWF_V2_API if(libewf_check_file_signature(pp_filename_arr[i],NULL)!=1) #else if(libewf_check_file_signature(pp_filename_arr[i])!=1) #endif { return EWF_INVALID_INPUT_FILES; } } // Open EWF file #ifdef HAVE_LIBEWF_V2_API if(libewf_handle_open(p_ewf_handle->h_ewf, (char* const*)pp_filename_arr, filename_arr_len, libewf_get_access_flags_read(), NULL)!=1) #else p_ewf_handle->h_ewf=libewf_open((char* const*)pp_filename_arr, filename_arr_len, libewf_get_flags_read()); if(p_ewf_handle->h_ewf==NULL) #endif { return EWF_OPEN_FAILED; } #ifndef HAVE_LIBEWF_V2_API // Parse EWF header if(libewf_parse_header_values(p_ewf_handle->h_ewf, LIBEWF_DATE_FORMAT_ISO8601)!=1) { return EWF_HEADER_PARSING_FAILED; } #endif return EWF_OK; }
TSK_IMG_INFO * ewf_open(int a_num_img, const TSK_TCHAR * const a_images[], unsigned int a_ssize) { #if defined( HAVE_LIBEWF_V2_API ) char error_string[TSK_EWF_ERROR_STRING_SIZE]; libewf_error_t *ewf_error = NULL; int result = 0; #elif !defined( LIBEWF_STRING_DIGEST_HASH_LENGTH_MD5 ) uint8_t md5_hash[16]; #endif IMG_EWF_INFO *ewf_info = NULL; TSK_IMG_INFO *img_info = NULL; #if !defined( HAVE_LIBEWF_V2_API) if (tsk_verbose) libewf_set_notify_values(stderr, 1); #endif if ((ewf_info = (IMG_EWF_INFO *) tsk_img_malloc(sizeof(IMG_EWF_INFO))) == NULL) { return NULL; } img_info = (TSK_IMG_INFO *) ewf_info; // See if they specified only the first of the set... ewf_info->used_ewf_glob = 0; if (a_num_img == 1) { #if defined( HAVE_LIBEWF_V2_API) #ifdef TSK_WIN32 if (libewf_glob_wide(a_images[0], TSTRLEN(a_images[0]), LIBEWF_FORMAT_UNKNOWN, &ewf_info->images, &ewf_info->num_imgs, &ewf_error) == -1) { #else if (libewf_glob(a_images[0], TSTRLEN(a_images[0]), LIBEWF_FORMAT_UNKNOWN, &ewf_info->images, &ewf_info->num_imgs, &ewf_error) == -1) { #endif tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_MAGIC); getError(ewf_error, error_string); tsk_error_set_errstr("ewf_open: Not an E01 glob name (%s)", error_string); libewf_error_free(&ewf_error); tsk_img_free(ewf_info); return NULL; } #else //use v1 #ifdef TSK_WIN32 ewf_info->num_imgs = libewf_glob_wide(a_images[0], TSTRLEN(a_images[0]), LIBEWF_FORMAT_UNKNOWN, &ewf_info->images); #else ewf_info->num_imgs = libewf_glob(a_images[0], TSTRLEN(a_images[0]), LIBEWF_FORMAT_UNKNOWN, &ewf_info->images); #endif if (ewf_info->num_imgs <= 0) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_MAGIC); tsk_error_set_errstr("ewf_open: Not an E01 glob name"); tsk_img_free(ewf_info); return NULL; } #endif // end v1 ewf_info->used_ewf_glob = 1; if (tsk_verbose) tsk_fprintf(stderr, "ewf_open: found %d segment files via libewf_glob\n", ewf_info->num_imgs); } else { int i; ewf_info->num_imgs = a_num_img; if ((ewf_info->images = (TSK_TCHAR **) tsk_malloc(a_num_img * sizeof(TSK_TCHAR *))) == NULL) { tsk_img_free(ewf_info); return NULL; } for (i = 0; i < a_num_img; i++) { if ((ewf_info->images[i] = (TSK_TCHAR *) tsk_malloc((TSTRLEN(a_images[i]) + 1) * sizeof(TSK_TCHAR))) == NULL) { tsk_img_free(ewf_info); return NULL; } TSTRNCPY(ewf_info->images[i], a_images[i], TSTRLEN(a_images[i]) + 1); } } #if defined( HAVE_LIBEWF_V2_API ) // Check the file signature before we call the library open #if defined( TSK_WIN32 ) if (libewf_check_file_signature_wide(a_images[0], &ewf_error) != 1) #else if (libewf_check_file_signature(a_images[0], &ewf_error) != 1) #endif { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_MAGIC); getError(ewf_error, error_string); tsk_error_set_errstr("ewf_open: Not an EWF file (%s)", error_string); libewf_error_free(&ewf_error); tsk_img_free(ewf_info); if (tsk_verbose != 0) { tsk_fprintf(stderr, "Not an EWF file\n"); } return (NULL); } if (libewf_handle_initialize(&(ewf_info->handle), &ewf_error) != 1) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_OPEN); getError(ewf_error, error_string); tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error initializing handle (%s)", a_images[0], error_string); libewf_error_free(&ewf_error); tsk_img_free(ewf_info); if (tsk_verbose != 0) { tsk_fprintf(stderr, "Unable to create EWF handle\n"); } return (NULL); } #if defined( TSK_WIN32 ) if (libewf_handle_open_wide(ewf_info->handle, (wchar_t * const *) ewf_info->images, ewf_info->num_imgs, LIBEWF_OPEN_READ, &ewf_error) != 1) #else if (libewf_handle_open(ewf_info->handle, (char *const *) ewf_info->images, ewf_info->num_imgs, LIBEWF_OPEN_READ, &ewf_error) != 1) #endif { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_OPEN); getError(ewf_error, error_string); tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); libewf_error_free(&ewf_error); tsk_img_free(ewf_info); if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error opening EWF file\n"); } return (NULL); } if (libewf_handle_get_media_size(ewf_info->handle, (size64_t *) & (img_info->size), &ewf_error) != 1) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_OPEN); getError(ewf_error, error_string); tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error getting size of image (%s)", a_images[0], error_string); libewf_error_free(&ewf_error); tsk_img_free(ewf_info); if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error getting size of EWF file\n"); } return (NULL); } result = libewf_handle_get_utf8_hash_value_md5(ewf_info->handle, (uint8_t *) ewf_info->md5hash, 33, &ewf_error); if (result == -1) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_OPEN); getError(ewf_error, error_string); tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error getting MD5 of image (%s)", a_images[0], error_string); libewf_error_free(&ewf_error); tsk_img_free(ewf_info); if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error getting size of EWF file\n"); } return (NULL); } ewf_info->md5hash_isset = result; #else // V1 API // Check the file signature before we call the library open #if defined( TSK_WIN32 ) if (libewf_check_file_signature_wide(a_images[0]) != 1) #else if (libewf_check_file_signature(a_images[0]) != 1) #endif { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_MAGIC); tsk_error_set_errstr("ewf_open: Not an EWF file"); tsk_img_free(ewf_info); if (tsk_verbose) tsk_fprintf(stderr, "Not an EWF file\n"); return NULL; } #if defined( TSK_WIN32 ) ewf_info->handle = libewf_open_wide( (wchar_t * const *) ewf_info->images, ewf_info->num_imgs, LIBEWF_OPEN_READ); #else ewf_info->handle = libewf_open( (char *const *) ewf_info->images, ewf_info->num_imgs, LIBEWF_OPEN_READ); #endif if (ewf_info->handle == NULL) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_OPEN); tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error opening", ewf_info->images[0]); tsk_img_free(ewf_info); if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error opening EWF file\n"); } return (NULL); } #if defined( LIBEWF_STRING_DIGEST_HASH_LENGTH_MD5 ) // 2007 version img_info->size = libewf_get_media_size(ewf_info->handle); ewf_info->md5hash_isset = libewf_get_stored_md5_hash(ewf_info->handle, ewf_info->md5hash, LIBEWF_STRING_DIGEST_HASH_LENGTH_MD5); #else // libewf-20080322 version if (libewf_get_media_size(ewf_info->handle, (size64_t *) & (img_info->size)) != 1) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_OPEN); tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error getting size of image", ewf_info->images[0]); tsk_img_free(ewf_info); if (tsk_verbose) { tsk_fprintf(stderr, "Error getting size of EWF file\n"); } return (NULL); } if (libewf_get_md5_hash(ewf_info->handle, md5_hash, 16) == 1) { int md5_string_iterator = 0; int md5_hash_iterator = 0; for (md5_hash_iterator = 0; md5_hash_iterator < 16; md5_hash_iterator++) { int digit = md5_hash[md5_hash_iterator] / 16; if (digit <= 9) { ewf_info->md5hash[md5_string_iterator++] = '0' + (char) digit; } else { ewf_info->md5hash[md5_string_iterator++] = 'a' + (char) (digit - 10); } digit = md5_hash[md5_hash_iterator] % 16; if (digit <= 9) { ewf_info->md5hash[md5_string_iterator++] = '0' + (char) digit; } else { ewf_info->md5hash[md5_string_iterator++] = 'a' + (char) (digit - 10); } } ewf_info->md5hash_isset = 1; } #endif /* defined( LIBEWF_STRING_DIGEST_HASH_LENGTH_MD5 ) */ #endif /* defined( HAVE_LIBEWF_V2_API ) */ if (a_ssize != 0) { img_info->sector_size = a_ssize; } else { img_info->sector_size = 512; } img_info->itype = TSK_IMG_TYPE_EWF_EWF; img_info->read = &ewf_image_read; img_info->close = &ewf_image_close; img_info->imgstat = &ewf_image_imgstat; // initialize the read lock tsk_init_lock(&(ewf_info->read_lock)); return (img_info); }
static RIODesc *ewf__open(RIO *io, const char *pathname, int rw, int mode) { RIOEwf *rewf; libewf_handle_t *ewf_h; // XXX filename list should be dynamic. 1024 limit is ugly const char *filenames[1024]; char *ptr,*optr; ut8 hash[1024]; size64_t media_size; uint32_t bytes_per_sector; //uint64_t amount_of_sectors; uint32_t error_granularity; //uint32_t amount_of_acquiry_errors; int8_t compression_level; uint8_t media_type; uint8_t media_flags; uint8_t compress_empty_block; uint8_t format; int i; if (!memcmp (pathname, "els://", 6)) { FILE *fd = r_sandbox_fopen (pathname+6, "r"); ut64 len; char *buf; if (fd == NULL) return NULL; fseek (fd, 0, SEEK_END); len = ftell (fd); fseek(fd, 0, SEEK_SET); buf = (char *)malloc (len); fread (buf, len, 1, fd); ptr = strchr (buf, '\n'); for (i=0, optr = buf; ptr&&(ptr=strchr(ptr, '\n')); optr=ptr) { *ptr = '\0'; ptr++; filenames[i++] = optr; } filenames[i] = NULL; free (buf); fclose (fd); for (i=0; filenames[i]; i++) eprintf ("%02x: %s)\n", i, filenames[i]); } else { filenames[0] = pathname + 6; filenames[1] = NULL; } libewf_handle_initialize (&ewf_h, NULL); if (libewf_handle_open (ewf_h, (char * const *)filenames, (int)1, rw? LIBEWF_OPEN_READ_WRITE: LIBEWF_OPEN_READ, NULL) != 1) return NULL; #if 0 if( ((libewf_internal_plugin_t*)ewf_h)->header_values == NULL ) { fprintf( stream, "\tNo information found in file.\n" ); } else { libewf_get_header_value_examiner_name(ewf_h, hash, 128); eprintf("ExaminerName: %s\n", hash); libewf_get_header_value_case_number(ewf_h, hash, 128); eprintf("CaseNumber: %s\n", hash); } #endif libewf_handle_get_format (ewf_h, &format, NULL); eprintf ("FormatVersion: %d\n", format); libewf_handle_get_compression_values (ewf_h, &compression_level, &compress_empty_block, NULL); eprintf ("CompressionLevel: %d\n", compression_level); libewf_handle_get_error_granularity (ewf_h, &error_granularity, NULL); eprintf ("ErrorGranurality: %d\n", error_granularity); //libewf_handle_get_number_of_sectors (ewf_h, &amount_of_sectors, NULL); //eprintf ("AmountOfSectors: %"PFMT64d"\n", amount_of_sectors); libewf_handle_get_bytes_per_sector (ewf_h, &bytes_per_sector, NULL); eprintf ("BytesPerSector: %d\n", bytes_per_sector); libewf_handle_get_media_size (ewf_h, &media_size, NULL); eprintf ("MediaSize: %"PFMT64d"\n", media_size); libewf_handle_get_media_type (ewf_h, &media_type, NULL); eprintf ("MediaType: %d\n", media_type); libewf_handle_get_media_flags (ewf_h, &media_flags, NULL); eprintf ("MediaFlags: %d\n", media_flags); libewf_handle_get_md5_hash (ewf_h, hash, 128, NULL); eprintf ("CalculatedHash: %s\n", hash); rewf = R_NEW (RIOEwf); rewf->handle = ewf_h; rewf->fd = RIOEWF_TO_FD (rewf); return r_io_desc_new (&r_io_plugin_shm, rewf->fd, pathname, rw, mode, rewf); }
/* Tests writing data of media size to EWF file(s) with a maximum segment size * Return 1 if successful, 0 if not or -1 on error */ int ewf_test_write_chunk( const libcstring_system_character_t *filename, size64_t media_size, size64_t maximum_segment_size, int8_t compression_level, uint8_t compression_flags, libcerror_error_t **error ) { libewf_handle_t *handle = NULL; uint8_t *checksum_buffer = NULL; uint8_t *chunk_buffer = NULL; uint8_t *compressed_chunk_buffer = NULL; static char *function = "ewf_test_write_chunk"; size_t chunk_buffer_size = 0; size_t compressed_chunk_buffer_size = 0; ssize_t process_count = 0; ssize_t write_count = 0; uint32_t chunk_checksum = 0; uint32_t sectors_per_chunk = 0; int8_t is_compressed = 0; int8_t process_checksum = 0; int sector_iterator = 0; if( libewf_handle_initialize( &handle, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create handle.", function ); goto on_error; } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_handle_open_wide( handle, (wchar_t * const *) &filename, 1, LIBEWF_OPEN_WRITE, error ) != 1 ) #else if( libewf_handle_open( handle, (char * const *) &filename, 1, LIBEWF_OPEN_WRITE, error ) != 1 ) #endif { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_OPEN_FAILED, "%s: unable to open handle.", function ); goto on_error; } if( media_size > 0 ) { if( libewf_handle_set_media_size( handle, media_size, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable set media size.", function ); goto on_error; } } if( maximum_segment_size > 0 ) { if( libewf_handle_set_maximum_segment_size( handle, maximum_segment_size, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable set maximum segment size.", function ); goto on_error; } } if( libewf_handle_set_compression_values( handle, compression_level, compression_flags, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable set compression values.", function ); goto on_error; } sectors_per_chunk = 64; if( libewf_handle_set_sectors_per_chunk( handle, sectors_per_chunk, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable set sectors per chunk.", function ); goto on_error; } chunk_buffer_size = sectors_per_chunk * 512; /* Use the chunck buffer also as checksum buffer */ chunk_buffer = (uint8_t *) memory_allocate( sizeof( uint8_t ) * ( chunk_buffer_size + 4 ) ); /* The compressed data can become larger than the uncompressed data */ compressed_chunk_buffer_size = chunk_buffer_size * 2; compressed_chunk_buffer = (uint8_t *) memory_allocate( sizeof( uint8_t ) * compressed_chunk_buffer_size ); if( chunk_buffer != NULL ) { checksum_buffer = &( chunk_buffer[ chunk_buffer_size - 1 ] ); } for( sector_iterator = 0; sector_iterator < 26; sector_iterator++ ) { if( memory_set( chunk_buffer, (int) 'A' + sector_iterator, chunk_buffer_size ) == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_SET_FAILED, "%s: unable set value in chunk buffer.", function ); goto on_error; } process_count = libewf_handle_prepare_write_chunk( handle, chunk_buffer, chunk_buffer_size, compressed_chunk_buffer, &compressed_chunk_buffer_size, &is_compressed, &chunk_checksum, &process_checksum, error ); if( process_count == -1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to prepare chunk buffer before writing.", function ); goto on_error; } if( is_compressed == 0 ) { write_count = libewf_handle_write_chunk( handle, chunk_buffer, chunk_buffer_size, chunk_buffer_size, is_compressed, checksum_buffer, chunk_checksum, process_checksum, error ); } else { write_count = libewf_handle_write_chunk( handle, compressed_chunk_buffer, compressed_chunk_buffer_size, chunk_buffer_size, is_compressed, checksum_buffer, chunk_checksum, process_checksum, error ); } if( write_count < 0 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_WRITE_FAILED, "%s: unable write chunk of size: %" PRIzd ".", function, chunk_buffer_size ); goto on_error; } if( media_size > (size64_t) chunk_buffer_size ) { media_size -= chunk_buffer_size; } else if( media_size > 0 ) { media_size = 0; } if( media_size == 0 ) { break; } } memory_free( compressed_chunk_buffer ); compressed_chunk_buffer = NULL; memory_free( chunk_buffer ); chunk_buffer = NULL; if( libewf_handle_close( handle, error ) != 0 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_CLOSE_FAILED, "%s: unable to close handle.", function ); goto on_error; } if( libewf_handle_free( &handle, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free handle.", function ); goto on_error; } return( 1 ); on_error: if( compressed_chunk_buffer != NULL ) { memory_free( compressed_chunk_buffer ); } if( chunk_buffer != NULL ) { memory_free( chunk_buffer ); } if( handle != NULL ) { libewf_handle_close( handle, NULL ); libewf_handle_free( &handle, NULL ); } return( -1 ); }
int main( int argc, char * const argv[] ) #endif { libcerror_error_t *error = NULL; libewf_handle_t *handle = NULL; off64_t read_offset = 0; size64_t media_size = 0; size64_t read_size = 0; size32_t chunk_size = 0; if( argc < 2 ) { fprintf( stderr, "Missing filename(s).\n" ); return( EXIT_FAILURE ); } #if defined( HAVE_DEBUG_OUTPUT ) && defined( EWF_TEST_READ_VERBOSE ) libewf_notify_set_verbose( 1 ); libewf_notify_set_stream( stderr, NULL ); #endif /* Initialization */ if( libewf_handle_initialize( &handle, &error ) != 1 ) { fprintf( stderr, "Unable to create handle.\n" ); goto on_error; } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_handle_open_wide( handle, &( argv[ 1 ] ), argc - 1, LIBEWF_OPEN_READ, &error ) != 1 ) #else if( libewf_handle_open( handle, &( argv[ 1 ] ), argc - 1, LIBEWF_OPEN_READ, &error ) != 1 ) #endif { fprintf( stderr, "Unable to open file(s).\n" ); goto on_error; } if( libewf_handle_get_media_size( handle, &media_size, &error ) != 1 ) { fprintf( stderr, "Unable to retrieve media size.\n" ); goto on_error; } if( media_size > (size64_t) INT64_MAX ) { fprintf( stderr, "Media size exceeds maximum.\n" ); goto on_error; } if( libewf_handle_get_chunk_size( handle, &chunk_size, &error ) != 1 ) { fprintf( stderr, "Unable to retrieve chunk size.\n" ); goto on_error; } if( chunk_size == 0 ) { fprintf( stderr, "Invalid chunk size.\n" ); goto on_error; } fprintf( stdout, "Media size: %" PRIu64 " bytes\n", media_size ); /* Case 0: test full read */ /* Test: offset: 0 size: <media_size> * Expected result: offset: 0 size: <media_size> */ read_offset = 0; read_size = media_size; if( ewf_test_read_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read buffer.\n" ); goto on_error; } if( ewf_test_read_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read buffer.\n" ); goto on_error; } /* Case 1: test random read */ /* Test: offset: <media_size / 7> size: <media_size / 2> * Expected result: offset: <media_size / 7> size: <media_size / 2> */ read_offset = (off64_t) ( media_size / 7 ); read_size = media_size / 2; if( ewf_test_read_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read buffer.\n" ); goto on_error; } if( ewf_test_read_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read buffer.\n" ); goto on_error; } /* Case 2: test read buffer beyond media size */ if( media_size < 1024 ) { /* Test: offset: <media_size - 1024> size: 4096 * Expected result: offset: -1 size: <undetermined> */ read_offset = (off64_t) ( media_size - 1024 ); read_size = 4096; if( ewf_test_read_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, -1, (size64_t) -1 ) != 1 ) { fprintf( stderr, "Unable to test read buffer.\n" ); goto on_error; } if( ewf_test_read_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, -1, (size64_t) -1 ) != 1 ) { fprintf( stderr, "Unable to test read buffer.\n" ); goto on_error; } } else { /* Test: offset: <media_size - 1024> size: 4096 * Expected result: offset: <media_size - 1024> size: 1024 */ read_offset = (off64_t) ( media_size - 1024 ); read_size = 4096; if( ewf_test_read_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, read_offset, 1024 ) != 1 ) { fprintf( stderr, "Unable to test read buffer.\n" ); goto on_error; } if( ewf_test_read_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, read_offset, 1024 ) != 1 ) { fprintf( stderr, "Unable to test read buffer.\n" ); goto on_error; } } fprintf( stdout, "\nChunk size: %" PRIu32 " bytes\n", chunk_size ); /* Case 0: test full read */ /* Test: offset: 0 size: <media_size> * Expected result: offset: 0 size: <media_size> */ read_offset = 0; read_size = media_size; if( ewf_test_read_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read chunk.\n" ); goto on_error; } if( ewf_test_read_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read chunk.\n" ); goto on_error; } /* Case 1: test random read */ /* Test: offset: <( ( media_size / 7 ) / chunk_size ) * chunk_size> size: <( ( ( media_size / 2 ) / chunk_size ) + 1 ) * chunk_size> * Expected result: offset: <( ( media_size / 7 ) / chunk_size ) * chunk_size> size: <( ( ( media_size / 2 ) / chunk_size ) + 1 ) * chunk_size> */ read_offset = (off64_t) ( ( media_size / 7 ) / chunk_size ) * chunk_size; read_size = ( ( ( media_size / 2 ) / chunk_size ) + 1 ) * chunk_size; if( media_size == 0 ) { if( ewf_test_read_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, read_offset, 0 ) != 1 ) { fprintf( stderr, "Unable to test read chunk.\n" ); goto on_error; } if( ewf_test_read_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, read_offset, 0 ) != 1 ) { fprintf( stderr, "Unable to test read chunk.\n" ); goto on_error; } } else { if( ewf_test_read_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read chunk.\n" ); goto on_error; } if( ewf_test_read_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read chunk.\n" ); goto on_error; } } /* Case 2: test read chunk beyond media size */ if( media_size < 1024 ) { /* Test: offset: <media_size - 1024> size: chunk_size * Expected result: offset: -1 size: <undetermined> */ read_offset = (off64_t) ( media_size - 1024 ); read_size = chunk_size; if( ewf_test_read_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, -1, (size64_t) -1 ) != 1 ) { fprintf( stderr, "Unable to test read chunk.\n" ); goto on_error; } if( ewf_test_read_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, -1, (size64_t) -1 ) != 1 ) { fprintf( stderr, "Unable to test read chunk.\n" ); goto on_error; } } else { /* Test: offset: <media_size - 1024> size: chunk_size * Expected result: offset: <media_size - 1024> size: chunk size or media_size % chunk_size */ read_offset = (off64_t) ( media_size - 1024 ); read_size = chunk_size; if( ewf_test_read_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, (off64_t) ( media_size - 1024 ), ( ( media_size % chunk_size ) == 0 ) ? chunk_size : media_size % chunk_size ) != 1 ) { fprintf( stderr, "Unable to test read chunk.\n" ); goto on_error; } if( ewf_test_read_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, (off64_t) ( media_size - 1024 ), ( ( media_size % chunk_size ) == 0 ) ? chunk_size : media_size % chunk_size ) != 1 ) { fprintf( stderr, "Unable to test read chunk.\n" ); goto on_error; } } /* Clean up */ if( libewf_handle_close( handle, &error ) != 0 ) { fprintf( stderr, "Unable to close file(s).\n" ); goto on_error; } if( libewf_handle_free( &handle, &error ) != 1 ) { fprintf( stderr, "Unable to free handle.\n" ); goto on_error; } return( EXIT_SUCCESS ); on_error: if( error != NULL ) { libewf_error_backtrace_fprint( error, stderr ); libewf_error_free( &error ); } if( handle != NULL ) { libewf_handle_close( handle, NULL ); libewf_handle_free( &handle, NULL ); } return( EXIT_FAILURE ); }
disk_t *fewf_init(const char *device, const int mode) { unsigned int num_files=0; char **filenames= NULL; disk_t *disk=NULL; struct info_fewf_struct *data; #if !defined( HAVE_LIBEWF_V2_API ) && defined( HAVE_GLOB_H ) glob_t globbuf; #endif data=(struct info_fewf_struct *)MALLOC(sizeof(struct info_fewf_struct)); memset(data, 0, sizeof(struct info_fewf_struct)); data->file_name = strdup(device); data->handle=NULL; data->mode = mode; #ifdef DEBUG_EWF #if defined( HAVE_LIBEWF_V2_API ) libewf_notify_set_stream( stderr, NULL ); libewf_notify_set_verbose( 1 ); #else libewf_set_notify_values( stderr, 1 ); #endif #endif #if defined( HAVE_LIBEWF_V2_API ) if( libewf_glob( data->file_name, strlen(data->file_name), LIBEWF_FORMAT_UNKNOWN, &filenames, (int *)&num_files, NULL ) != 1 ) { log_error("libewf_glob failed\n"); free(data); return NULL; } #elif defined( HAVE_GLOB_H ) { globbuf.gl_offs = 0; glob(data->file_name, GLOB_DOOFFS, NULL, &globbuf); if(globbuf.gl_pathc>0) { filenames=(char **)MALLOC(globbuf.gl_pathc * sizeof(*filenames)); for (num_files=0; num_files<globbuf.gl_pathc; num_files++) { filenames[num_files]=globbuf.gl_pathv[num_files]; } } } if(filenames==NULL) { globfree(&globbuf); free(data); return NULL; } #else { filenames=(char **)MALLOC(1*sizeof(*filenames)); filenames[num_files] = data->file_name; num_files++; } #endif if((mode&TESTDISK_O_RDWR)==TESTDISK_O_RDWR) { #if defined( HAVE_LIBEWF_V2_API ) if( libewf_handle_initialize( &( data->handle ), NULL ) != 1 ) { log_error("libewf_handle_initialize failed\n"); libewf_glob_free( filenames, num_files, NULL ); free(data); return NULL; } if( libewf_handle_open( data->handle, filenames, num_files, LIBEWF_OPEN_READ_WRITE, NULL ) != 1 ) { log_error("libewf_handle_open(%s) failed\n", device); } #else data->handle=libewf_open(filenames, num_files, LIBEWF_OPEN_READ_WRITE); if(data->handle==NULL) { log_error("libewf_open(%s) failed\n", device); } #endif /* defined( HAVE_LIBEWF_V2_API ) */ } if(data->handle==NULL) { data->mode&=~TESTDISK_O_RDWR; #if defined( HAVE_LIBEWF_V2_API ) if( libewf_handle_initialize( &( data->handle ), NULL ) != 1 ) { log_error("libewf_handle_initialize failed\n"); libewf_glob_free( filenames, num_files, NULL ); free(data); return NULL; } if( libewf_handle_open( data->handle, filenames, num_files, LIBEWF_OPEN_READ, NULL ) != 1 ) { log_error("libewf_handle_open(%s) failed\n", device); libewf_handle_free( &( data->handle ), NULL ); libewf_glob_free( filenames, num_files, NULL ); free(data); return NULL; } #else data->handle=libewf_open(filenames, num_files, LIBEWF_OPEN_READ); if(data->handle==NULL) { log_error("libewf_open(%s) failed\n", device); #if defined( HAVE_GLOB_H ) globfree(&globbuf); #endif free(filenames); free(data); return NULL; } #endif /* defined( HAVE_LIBEWF_V2_API ) */ } #if defined( HAVE_LIBEWF_V2_API ) if( libewf_handle_set_header_values_date_format( data->handle, LIBEWF_DATE_FORMAT_DAYMONTH, NULL ) != 1 ) { log_error("%s Unable to set header values date format\n", device); } #else if( libewf_parse_header_values( data->handle, LIBEWF_DATE_FORMAT_DAYMONTH) != 1 ) { log_error("%s Unable to parse EWF header values\n", device); } #endif disk=(disk_t *)MALLOC(sizeof(*disk)); init_disk(disk); disk->arch=&arch_none; disk->device=strdup(device); disk->data=data; disk->description=fewf_description; disk->description_short=fewf_description_short; disk->pread_fast=fewf_pread_fast; disk->pread=fewf_pread; disk->pwrite=(data->mode&TESTDISK_O_RDWR?fewf_pwrite:fewf_nopwrite); disk->sync=fewf_sync; disk->access_mode=(data->mode&TESTDISK_O_RDWR); disk->clean=fewf_clean; #if defined( HAVE_LIBEWF_V2_API ) || defined( LIBEWF_GET_BYTES_PER_SECTOR_HAVE_TWO_ARGUMENTS ) { uint32_t bytes_per_sector = 0; #if defined( HAVE_LIBEWF_V2_API ) if( libewf_handle_get_bytes_per_sector( data->handle, &bytes_per_sector, NULL ) != 1 ) #else if( libewf_get_bytes_per_sector(data->handle, &bytes_per_sector)<0) #endif { disk->sector_size=DEFAULT_SECTOR_SIZE; } else { disk->sector_size=bytes_per_sector; } } #else disk->sector_size=libewf_get_bytes_per_sector(data->handle); #endif // printf("libewf_get_bytes_per_sector %u\n",disk->sector_size); if(disk->sector_size==0) disk->sector_size=DEFAULT_SECTOR_SIZE; /* Set geometry */ disk->geom.cylinders=0; disk->geom.heads_per_cylinder=1; disk->geom.sectors_per_head=1; disk->geom.bytes_per_sector=disk->sector_size; /* Get disk_real_size */ #if defined( HAVE_LIBEWF_V2_API ) || defined( LIBEWF_GET_MEDIA_SIZE_HAVE_TWO_ARGUMENTS ) { size64_t media_size = 0; #if defined( HAVE_LIBEWF_V2_API ) if( libewf_handle_get_media_size( data->handle, &media_size, NULL ) != 1 ) #else if(libewf_get_media_size(data->handle, &media_size)<0) #endif { disk->disk_real_size=0; } else { disk->disk_real_size=media_size; } } #else disk->disk_real_size=libewf_get_media_size(data->handle); #endif update_disk_car_fields(disk); #if defined( HAVE_LIBEWF_V2_API ) libewf_glob_free( filenames, num_files, NULL ); #else #if defined( HAVE_GLOB_H ) globfree(&globbuf); #endif free(filenames); #endif return disk; }
/* Open EWF file(s) * Returns a Python object if successful or NULL on error */ PyObject *pyewf_handle_open( pyewf_handle_t *pyewf_handle, PyObject *arguments, PyObject *keywords ) { char error_string[ PYEWF_ERROR_STRING_SIZE ]; liberror_error_t *error = NULL; char **filenames = NULL; static char *keyword_list[] = { "filenames", "access_flags", NULL }; PyObject *sequence_object = NULL; PyObject *string_object = NULL; static char *function = "pyewf_handle_open"; size_t filename_length = 0; int access_flags = 0; int filename_index = 0; int number_of_filenames = 0; if( pyewf_handle == NULL ) { PyErr_Format( PyExc_TypeError, "%s: invalid pyewf handle.", function ); return( NULL ); } if( PyArg_ParseTupleAndKeywords( arguments, keywords, "O|i", keyword_list, &sequence_object, &access_flags ) == 0 ) { return( NULL ); } if( PySequence_Check( sequence_object ) == 0 ) { PyErr_Format( PyExc_TypeError, "%s: argument: files must be a list or tuple.", function ); return( NULL ); } number_of_filenames = PySequence_Size( sequence_object ); if( ( number_of_filenames <= 0 ) || ( number_of_filenames > (int) UINT16_MAX ) ) { PyErr_Format( PyExc_ValueError, "%s: invalid number of files.", function ); return( NULL ); } filenames = (char **) memory_allocate( sizeof( char * ) * number_of_filenames ); if( filenames == NULL ) { PyErr_Format( PyExc_MemoryError, "%s: unable to create filenames.", function ); return( NULL ); } if( memory_set( filenames, 0, sizeof( char * ) * number_of_filenames ) == NULL ) { PyErr_Format( PyExc_MemoryError, "%s: unable to clear filenames.", function ); memory_free( filenames ); return( NULL ); } for( filename_index = 0; filename_index < number_of_filenames; filename_index++ ) { string_object = PySequence_GetItem( sequence_object, filename_index ); filename_length = PyString_Size( string_object ); filenames[ filename_index ] = (char *) memory_allocate( sizeof( char ) * ( filename_length + 1 ) ); if( filenames[ filename_index ] == NULL ) { PyErr_Format( PyExc_MemoryError, "%s: unable to create filename: %d.", function, filename_index ); for( ; filename_index > 0; filename_index-- ) { memory_free( filenames[ filename_index - 1 ] ); } memory_free( filenames ); return( NULL ); } if( libcstring_narrow_string_copy( filenames[ filename_index ], PyString_AsString( string_object ), filename_length ) == NULL ) { PyErr_Format( PyExc_MemoryError, "%s: unable to set filename: %d.", function, filename_index ); for( ; filename_index > 0; filename_index-- ) { memory_free( filenames[ filename_index - 1 ] ); } memory_free( filenames ); return( NULL ); } ( filenames[ filename_index ] )[ filename_length ] = 0; Py_DecRef( string_object ); } if( libewf_handle_open( pyewf_handle->handle, filenames, number_of_filenames, access_flags, &error ) != 1 ) { if( liberror_error_backtrace_sprint( error, error_string, PYEWF_ERROR_STRING_SIZE ) == -1 ) { PyErr_Format( PyExc_IOError, "%s: unable to open handle.", function ); } else { PyErr_Format( PyExc_IOError, "%s: unable to open handle.\n%s", function, error_string ); } liberror_error_free( &error ); for( filename_index = 0; filename_index < number_of_filenames; filename_index++ ) { memory_free( filenames[ filename_index ] ); } memory_free( filenames ); return( NULL ); } for( filename_index = 0; filename_index < number_of_filenames; filename_index++ ) { memory_free( filenames[ filename_index ] ); } memory_free( filenames ); return( Py_None ); }
/* * EwfOpen */ static int EwfOpen(void *p_handle, const char **pp_filename_arr, uint64_t filename_arr_len) { pts_EwfHandle p_ewf_handle=(pts_EwfHandle)p_handle; // We need at least one file if(filename_arr_len==0) return EWF_NO_INPUT_FILES; // Make sure all files are EWF files for(uint64_t i=0;i<filename_arr_len;i++) { #ifdef HAVE_LIBEWF_V2_API if(libewf_check_file_signature(pp_filename_arr[i],NULL)!=1) #else if(libewf_check_file_signature(pp_filename_arr[i])!=1) #endif { return EWF_INVALID_INPUT_FILES; } } // Open EWF file #ifdef HAVE_LIBEWF_V2_API if(libewf_handle_open(p_ewf_handle->h_ewf, (char* const*)pp_filename_arr, filename_arr_len, libewf_get_access_flags_read(), NULL)!=1) #else p_ewf_handle->h_ewf=libewf_open((char* const*)pp_filename_arr, filename_arr_len, libewf_get_flags_read()); if(p_ewf_handle->h_ewf==NULL) #endif { return EWF_OPEN_FAILED; } #ifdef HAVE_LIBEWF_V2_API // Try to read 1 byte from the image end to verify that all segments were // specified (Only needed because libewf_handle_open() won't fail even if not // all segments were specified!) uint64_t image_size=0; char buf; if(libewf_handle_get_media_size(p_ewf_handle->h_ewf,&image_size,NULL)!=1) { return EWF_GET_SIZE_FAILED; } if(image_size==0) return EWF_OK; LIBXMOUNT_LOG_DEBUG(p_ewf_handle->debug, "Trying to read last byte of image at offset %" PRIu64 " (image size = %" PRIu64 " bytes)\n", image_size-1, image_size); if(libewf_handle_seek_offset(p_ewf_handle->h_ewf, image_size-1, SEEK_SET, NULL)==-1) { return EWF_OPEN_FAILED_SEEK; } if(libewf_handle_read_buffer(p_ewf_handle->h_ewf,&buf,1,NULL)!=1) { return EWF_OPEN_FAILED_READ; } #endif #ifndef HAVE_LIBEWF_V2_API // Parse EWF header if(libewf_parse_header_values(p_ewf_handle->h_ewf, LIBEWF_DATE_FORMAT_ISO8601)!=1) { return EWF_HEADER_PARSING_FAILED; } #endif return EWF_OK; }
/* Open EWF file(s) * Returns a Python object if successful or NULL on error */ PyObject *pyewf_handle_open( pyewf_handle_t *pyewf_handle, PyObject *arguments, PyObject *keywords ) { char error_string[ PYEWF_ERROR_STRING_SIZE ]; libcerror_error_t *error = NULL; char **filenames = NULL; char *mode = NULL; static char *keyword_list[] = { "filenames", "mode", NULL }; PyObject *sequence_object = NULL; PyObject *string_object = NULL; static char *function = "pyewf_handle_open"; size_t filename_length = 0; int access_flags = 0; int filename_index = 0; int number_of_filenames = 0; int result = 0; if( pyewf_handle == NULL ) { PyErr_Format( PyExc_TypeError, "%s: invalid pyewf handle.", function ); return( NULL ); } if( PyArg_ParseTupleAndKeywords( arguments, keywords, "O|s", keyword_list, &sequence_object, &mode ) == 0 ) { return( NULL ); } if( PySequence_Check( sequence_object ) == 0 ) { PyErr_Format( PyExc_TypeError, "%s: argument: files must be a sequence object.", function ); return( NULL ); } if( mode == NULL ) { access_flags = LIBEWF_OPEN_READ; } else if( mode[ 0 ] == 'r' ) { if( mode[ 1 ] == '+' ) { if( ( mode[ 2 ] == 0 ) || ( ( mode[ 2 ] == 'b' ) && ( mode[ 3 ] == 0 ) ) ) { access_flags = LIBEWF_OPEN_READ_WRITE; } } else if( ( mode[ 1 ] == 0 ) || ( ( mode[ 1 ] == 'b' ) && ( mode[ 2 ] == 0 ) ) ) { access_flags = LIBEWF_OPEN_READ; } } else if( mode[ 0 ] == 'w' ) { if( ( mode[ 1 ] == 0 ) || ( ( mode[ 1 ] == 'b' ) && ( mode[ 2 ] == 0 ) ) ) { access_flags = LIBEWF_OPEN_WRITE; } } else if( mode[ 0 ] == 'a' ) { if( ( mode[ 1 ] == 0 ) || ( ( mode[ 1 ] == 'b' ) && ( mode[ 2 ] == 0 ) ) ) { access_flags = LIBEWF_OPEN_WRITE_RESUME; } } if( access_flags == 0 ) { PyErr_Format( PyExc_ValueError, "%s: unsupported mode: %s.", function, mode ); return( NULL ); } number_of_filenames = PySequence_Size( sequence_object ); if( ( number_of_filenames <= 0 ) || ( number_of_filenames > (int) UINT16_MAX ) ) { PyErr_Format( PyExc_ValueError, "%s: invalid number of files.", function ); goto on_error; } filenames = (char **) PyMem_Malloc( sizeof( char * ) * number_of_filenames ); if( filenames == NULL ) { PyErr_Format( PyExc_MemoryError, "%s: unable to create filenames.", function ); goto on_error; } if( memory_set( filenames, 0, sizeof( char * ) * number_of_filenames ) == NULL ) { PyErr_Format( PyExc_MemoryError, "%s: unable to clear filenames.", function ); PyMem_Free( filenames ); return( NULL ); } for( filename_index = 0; filename_index < number_of_filenames; filename_index++ ) { string_object = PySequence_GetItem( sequence_object, filename_index ); filename_length = PyString_Size( string_object ); filenames[ filename_index ] = (char *) PyMem_Malloc( sizeof( char ) * ( filename_length + 1 ) ); if( filenames[ filename_index ] == NULL ) { PyErr_Format( PyExc_MemoryError, "%s: unable to create filename: %d.", function, filename_index ); goto on_error; } if( libcstring_narrow_string_copy( filenames[ filename_index ], PyString_AsString( string_object ), filename_length ) == NULL ) { PyErr_Format( PyExc_MemoryError, "%s: unable to set filename: %d.", function, filename_index ); goto on_error; } ( filenames[ filename_index ] )[ filename_length ] = 0; Py_DecRef( string_object ); } Py_BEGIN_ALLOW_THREADS result = libewf_handle_open( pyewf_handle->handle, filenames, number_of_filenames, access_flags, &error ); Py_END_ALLOW_THREADS if( result != 1 ) { if( libcerror_error_backtrace_sprint( error, error_string, PYEWF_ERROR_STRING_SIZE ) == -1 ) { PyErr_Format( PyExc_IOError, "%s: unable to open handle.", function ); } else { PyErr_Format( PyExc_IOError, "%s: unable to open handle.\n%s", function, error_string ); } libcerror_error_free( &error ); goto on_error; } for( filename_index = 0; filename_index < number_of_filenames; filename_index++ ) { PyMem_Free( filenames[ filename_index ] ); } PyMem_Free( filenames ); Py_IncRef( Py_None ); return( Py_None ); on_error: if( filenames != NULL ) { for( ; filename_index > 0; filename_index-- ) { PyMem_Free( filenames[ filename_index - 1 ] ); } PyMem_Free( filenames ); } return( NULL ); }
int main( int argc, char * const argv[] ) #endif { libcstring_system_character_t **filenames = NULL; libewf_error_t *error = NULL; libewf_handle_t *handle = NULL; size64_t media_size = 0; int number_of_filenames = 0; if( argc < 2 ) { fprintf( stderr, "Missing filename(s).\n" ); return( EXIT_FAILURE ); } #if defined( HAVE_DEBUG_OUTPUT ) && defined( EWF_TEST_SEEK_VERBOSE ) libewf_notify_set_verbose( 1 ); libewf_notify_set_stream( stderr, NULL ); #endif #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_glob_wide( argv[ 1 ], libcstring_wide_string_length( argv[ 1 ] ), LIBEWF_FORMAT_UNKNOWN, &filenames, &number_of_filenames, &error ) != 1 ) #else if( libewf_glob( argv[ 1 ], libcstring_narrow_string_length( argv[ 1 ] ), LIBEWF_FORMAT_UNKNOWN, &filenames, &number_of_filenames, &error ) != 1 ) #endif { fprintf( stderr, "Unable to glob filenames.\n" ); goto on_error; } if( number_of_filenames < 0 ) { fprintf( stderr, "Invalid number of filenames.\n" ); goto on_error; } else if( number_of_filenames == 0 ) { fprintf( stderr, "Missing filenames.\n" ); goto on_error; } /* Initialization */ if( libewf_handle_initialize( &handle, &error ) != 1 ) { fprintf( stderr, "Unable to create handle.\n" ); goto on_error; } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_handle_open_wide( handle, filenames, number_of_filenames, LIBEWF_OPEN_READ, &error ) != 1 ) #else if( libewf_handle_open( handle, filenames, number_of_filenames, LIBEWF_OPEN_READ, &error ) != 1 ) #endif { fprintf( stderr, "Unable to open handle.\n" ); goto on_error; } if( libewf_handle_get_media_size( handle, &media_size, &error ) != 1 ) { fprintf( stderr, "Unable to retrieve media size.\n" ); goto on_error; } if( ewf_handle_test_seek( handle, media_size ) != 1 ) { fprintf( stderr, "Unable to seek in handle.\n" ); goto on_error; } /* Clean up */ if( libewf_handle_close( handle, &error ) != 0 ) { fprintf( stderr, "Unable to close handle.\n" ); goto on_error; } if( libewf_handle_free( &handle, &error ) != 1 ) { fprintf( stderr, "Unable to free handle.\n" ); goto on_error; } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_glob_wide_free( filenames, number_of_filenames, &error ) != 1 ) #else if( libewf_glob_free( filenames, number_of_filenames, &error ) != 1 ) #endif { fprintf( stderr, "Unable to free glob.\n" ); goto on_error; } return( EXIT_SUCCESS ); on_error: if( error != NULL ) { libewf_error_backtrace_fprint( error, stderr ); libewf_error_free( &error ); } if( handle != NULL ) { libewf_handle_close( handle, NULL ); libewf_handle_free( &handle, NULL ); } if( filenames != NULL ) { #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) libewf_glob_wide_free( filenames, number_of_filenames, NULL ); #else libewf_glob_free( filenames, number_of_filenames, NULL ); #endif } return( EXIT_FAILURE ); }
int main( int argc, char * const argv[] ) { libewf_error_t *error = NULL; libewf_handle_t *handle = NULL; if( argc <= 1 ) { fprintf( stderr, "Usage: ./open_close filename(s)\n" ); return( EXIT_FAILURE ); } /* The function will return 1 if successful or -1 on error. * On error the error 'object' is created by the library. * * handle must refer to NULL to create a new libewf handle 'object'. * * If error is NULL e.g. libewf_handle_initialize( &handle, NULL ) * no error 'object' is created * * The error 'object' can be freed by libewf_error_free() */ if( libewf_handle_initialize( &handle, &error ) != 1 ) { fprintf( stderr, "Unable to initialize handle.\n" ); goto on_error; } if( libewf_handle_open( handle, &( argv[ 1 ] ), argc - 1, LIBEWF_OPEN_READ, &error ) != 1 ) { fprintf( stderr, "Unable to open file(s).\n" ); goto on_error; } if( libewf_handle_close( handle, &error ) != 0 ) { fprintf( stderr, "Unable to close handle.\n" ); goto on_error; } if( libewf_handle_free( &handle, &error ) != 1 ) { fprintf( stderr, "Unable to free handle.\n" ); goto on_error; } return( EXIT_SUCCESS ); on_error: if( error != NULL ) { libewf_error_backtrace_fprint( error, stderr ); libewf_error_free( &error ); } if( handle != NULL ) { libewf_handle_free( &handle, NULL ); } return( EXIT_FAILURE ); }
/* Tests writing data of media size to EWF file(s) with a maximum segment size * Return 1 if successful, 0 if not or -1 on error */ int ewf_test_write( const char *filename, size64_t media_size, size64_t maximum_segment_size, int8_t compression_level, uint8_t compression_flags, liberror_error_t **error ) { libewf_handle_t *handle = NULL; uint8_t *buffer = NULL; static char *function = "ewf_test_write"; size_t write_size = 0; ssize_t write_count = 0; int sector_iterator = 0; if( libewf_handle_initialize( &handle, error ) != 1 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_RUNTIME, LIBERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create handle.", function ); goto on_error; } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_handle_open_wide( handle, (wchar_t * const *) &filename, 1, LIBEWF_OPEN_WRITE, error ) != 1 ) #else if( libewf_handle_open( handle, (char * const *) &filename, 1, LIBEWF_OPEN_WRITE, error ) != 1 ) #endif { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_IO, LIBERROR_IO_ERROR_OPEN_FAILED, "%s: unable to open handle.", function ); goto on_error; } if( media_size > 0 ) { if( libewf_handle_set_media_size( handle, media_size, error ) != 1 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_RUNTIME, LIBERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable set media size.", function ); goto on_error; } } if( maximum_segment_size > 0 ) { if( libewf_handle_set_maximum_segment_size( handle, maximum_segment_size, error ) != 1 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_RUNTIME, LIBERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable set maximum segment size.", function ); goto on_error; } } if( libewf_handle_set_compression_values( handle, compression_level, compression_flags, error ) != 1 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_RUNTIME, LIBERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable set compression values.", function ); goto on_error; } buffer = (uint8_t *) memory_allocate( EWF_TEST_BUFFER_SIZE ); if( buffer == NULL ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_MEMORY, LIBERROR_MEMORY_ERROR_INSUFFICIENT, "%s: unable created buffer.", function ); goto on_error; } write_size = 512; for( sector_iterator = 0; sector_iterator < 26; sector_iterator++ ) { if( memory_set( buffer, (int) 'A' + sector_iterator, write_size ) == NULL ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_MEMORY, LIBERROR_MEMORY_ERROR_SET_FAILED, "%s: unable set value in buffer.", function ); goto on_error; } write_count = libewf_handle_write_buffer( handle, buffer, write_size, error ); if( write_count < 0 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_IO, LIBERROR_IO_ERROR_WRITE_FAILED, "%s: unable write buffer of size: %" PRIzd ".", function, write_size ); goto on_error; } if( write_count != (ssize_t) write_size ) { if( (size64_t) write_count != media_size ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_IO, LIBERROR_IO_ERROR_WRITE_FAILED, "%s: unable write buffer of size: %" PRIzd ".", function, write_size ); goto on_error; } } if( media_size > 0 ) { media_size -= write_count; } } write_size = 3751; for( sector_iterator = 0; sector_iterator < 26; sector_iterator++ ) { if( memory_set( buffer, (int) 'a' + sector_iterator, write_size ) == NULL ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_MEMORY, LIBERROR_MEMORY_ERROR_SET_FAILED, "%s: unable set value in buffer.", function ); goto on_error; } write_count = libewf_handle_write_buffer( handle, buffer, write_size, error ); if( write_count < 0 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_IO, LIBERROR_IO_ERROR_WRITE_FAILED, "%s: unable write buffer of size: %" PRIzd ".", function, write_size ); goto on_error; } if( write_count != (ssize_t) write_size ) { if( (size64_t) write_count != media_size ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_IO, LIBERROR_IO_ERROR_WRITE_FAILED, "%s: unable write buffer of size: %" PRIzd ".", function, write_size ); goto on_error; } } if( media_size > 0 ) { media_size -= write_count; } } memory_free( buffer ); buffer = NULL; if( libewf_handle_close( handle, error ) != 0 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_IO, LIBERROR_IO_ERROR_CLOSE_FAILED, "%s: unable to close handle.", function ); goto on_error; } if( libewf_handle_free( &handle, error ) != 1 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_RUNTIME, LIBERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free handle.", function ); goto on_error; } return( 1 ); on_error: if( buffer != NULL ) { memory_free( buffer ); } if( handle != NULL ) { libewf_handle_close( handle, NULL ); libewf_handle_free( &handle, NULL ); } return( -1 ); }
/* Opens the input of the mount handle * Returns 1 if successful or -1 on error */ int mount_handle_open_input( mount_handle_t *mount_handle, libcstring_system_character_t * const * filenames, int number_of_filenames, libcerror_error_t **error ) { libcstring_system_character_t **libewf_filenames = NULL; static char *function = "mount_handle_open_input"; size_t first_filename_length = 0; if( mount_handle == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid mount handle.", function ); return( -1 ); } if( filenames == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid filenames.", function ); return( -1 ); } if( number_of_filenames <= 0 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_VALUE_ZERO_OR_LESS, "%s: invalid number of filenames.", function ); return( -1 ); } if( number_of_filenames == 1 ) { first_filename_length = libcstring_system_string_length( filenames[ 0 ] ); #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_glob_wide( filenames[ 0 ], first_filename_length, LIBEWF_FORMAT_UNKNOWN, &libewf_filenames, &number_of_filenames, error ) != 1 ) #else if( libewf_glob( filenames[ 0 ], first_filename_length, LIBEWF_FORMAT_UNKNOWN, &libewf_filenames, &number_of_filenames, error ) != 1 ) #endif { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to resolve filename(s).", function ); return( -1 ); } filenames = (libcstring_system_character_t * const *) libewf_filenames; } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_handle_open_wide( mount_handle->input_handle, filenames, number_of_filenames, LIBEWF_OPEN_READ, error ) != 1 ) #else if( libewf_handle_open( mount_handle->input_handle, filenames, number_of_filenames, LIBEWF_OPEN_READ, error ) != 1 ) #endif { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_OPEN_FAILED, "%s: unable to open file(s).", function ); if( libewf_filenames != NULL ) { #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) libewf_glob_wide_free( libewf_filenames, number_of_filenames, NULL ); #else libewf_glob_free( libewf_filenames, number_of_filenames, NULL ); #endif } return( -1 ); } if( libewf_filenames != NULL ) { #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_glob_wide_free( libewf_filenames, number_of_filenames, error ) != 1 ) #else if( libewf_glob_free( libewf_filenames, number_of_filenames, error ) != 1 ) #endif { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free globbed filenames.", function ); return( -1 ); } } if( mount_handle->input_format == MOUNT_HANDLE_INPUT_FORMAT_FILES ) { if( libewf_handle_get_root_file_entry( mount_handle->input_handle, &( mount_handle->root_file_entry ), error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve root file entry.", function ); return( -1 ); } } return( 1 ); }
/* Tests reading/writing data of a specific size at a specific offset * Return 1 if successful, 0 if not or -1 on error */ int ewf_test_read_write_delta( libcstring_system_character_t * const filenames[], int number_of_filenames, const libcstring_system_character_t *delta_segment_filename, off64_t write_offset, size64_t write_size, libcerror_error_t **error ) { libewf_handle_t *handle = NULL; uint8_t *buffer = NULL; static char *function = "ewf_test_read_write_delta"; size_t delta_segment_filename_length = 0; size_t read_size = 0; ssize_t read_count = 0; ssize_t write_count = 0; if( libewf_handle_initialize( &handle, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create handle.", function ); goto on_error; } #if defined( HAVE_DEBUG_OUTPUT ) && defined( EWF_TEST_READ_WRITE_DELTA_VERBOSE ) libewf_notify_set_verbose( 1 ); libewf_notify_set_stream( stderr, NULL ); #endif #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_handle_open_wide( handle, filenames, number_of_filenames, LIBEWF_OPEN_READ_WRITE, error ) != 1 ) #else if( libewf_handle_open( handle, filenames, number_of_filenames, LIBEWF_OPEN_READ_WRITE, error ) != 1 ) #endif { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_OPEN_FAILED, "%s: unable to open handle.", function ); goto on_error; } if( delta_segment_filename != NULL ) { delta_segment_filename_length = libcstring_system_string_length( delta_segment_filename ); #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_handle_set_delta_segment_filename_wide( handle, delta_segment_filename, delta_segment_filename_length, error ) != 1 ) #else if( libewf_handle_set_delta_segment_filename( handle, delta_segment_filename, delta_segment_filename_length, error ) != 1 ) #endif { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to set delta segment filename.", function ); goto on_error; } } if( libewf_handle_seek_offset( handle, write_offset, SEEK_SET, error ) == -1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_OPEN_FAILED, "%s: unable to seek offset: %" PRIi64 ".", function, write_offset ); goto on_error; } buffer = (uint8_t *) memory_allocate( EWF_TEST_BUFFER_SIZE ); while( write_size > 0 ) { if( write_size > (size64_t) EWF_TEST_BUFFER_SIZE ) { read_size = EWF_TEST_BUFFER_SIZE; } else { read_size = (size_t) write_size; } read_count = libewf_handle_read_buffer( handle, buffer, read_size, error ); if( read_count < 0 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_WRITE_FAILED, "%s: unable read buffer of size: %" PRIzd ".", function, read_size ); goto on_error; } if( memory_set( buffer, (int) 'X', (size_t) read_count ) == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_SET_FAILED, "%s: unable set value in buffer.", function ); goto on_error; } if( libewf_handle_seek_offset( handle, -1 * (off64_t) read_size, SEEK_CUR, error ) == -1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_OPEN_FAILED, "%s: unable to seek previous offset.", function ); goto on_error; } write_count = libewf_handle_write_buffer( handle, buffer, (size_t) read_count, error ); if( write_count < 0 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_WRITE_FAILED, "%s: unable write buffer of size: %" PRIzd ".", function, read_count ); goto on_error; } if( write_count != read_count ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_WRITE_FAILED, "%s: unable write buffer of size: %" PRIzd ".", function, read_count ); goto on_error; } write_offset += write_count; write_size -= write_count; } memory_free( buffer ); buffer = NULL; if( libewf_handle_close( handle, error ) != 0 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_CLOSE_FAILED, "%s: unable to close handle.", function ); goto on_error; } if( libewf_handle_free( &handle, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free handle.", function ); goto on_error; } return( 1 ); on_error: if( buffer != NULL ) { memory_free( buffer ); } if( handle != NULL ) { libewf_handle_close( handle, NULL ); libewf_handle_free( &handle, NULL ); } return( -1 ); }
/* Opens the mount handle * Returns 1 if successful or -1 on error */ int mount_handle_open( mount_handle_t *mount_handle, system_character_t * const * filenames, int number_of_filenames, libcerror_error_t **error ) { libewf_handle_t *ewf_handle = NULL; system_character_t **globbed_filenames = NULL; static char *function = "mount_handle_open"; size_t filename_length = 0; if( mount_handle == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid mount handle.", function ); return( -1 ); } if( filenames == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid filenames.", function ); return( -1 ); } if( number_of_filenames <= 0 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_VALUE_ZERO_OR_LESS, "%s: invalid number of filenames.", function ); return( -1 ); } if( number_of_filenames == 1 ) { filename_length = system_string_length( filenames[ 0 ] ); #if defined( HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_glob_wide( filenames[ 0 ], filename_length, LIBEWF_FORMAT_UNKNOWN, &globbed_filenames, &number_of_filenames, error ) != 1 ) #else if( libewf_glob( filenames[ 0 ], filename_length, LIBEWF_FORMAT_UNKNOWN, &globbed_filenames, &number_of_filenames, error ) != 1 ) #endif { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to resolve filename(s).", function ); goto on_error; } filenames = (system_character_t * const *) globbed_filenames; } if( libewf_handle_initialize( &ewf_handle, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to initialize handle.", function ); goto on_error; } if( libewf_handle_set_maximum_number_of_open_handles( ewf_handle, mount_handle->maximum_number_of_open_handles, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to set maximum number of open handles in handle.", function ); goto on_error; } #if defined( HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_handle_open_wide( ewf_handle, filenames, number_of_filenames, LIBEWF_OPEN_READ, error ) != 1 ) #else if( libewf_handle_open( ewf_handle, filenames, number_of_filenames, LIBEWF_OPEN_READ, error ) != 1 ) #endif { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_OPEN_FAILED, "%s: unable to open file(s).", function ); goto on_error; } if( mount_file_system_set_handle( mount_handle->file_system, ewf_handle, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to set handle in file system.", function ); goto on_error; } if( globbed_filenames != NULL ) { #if defined( HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_glob_wide_free( globbed_filenames, number_of_filenames, error ) != 1 ) #else if( libewf_glob_free( globbed_filenames, number_of_filenames, error ) != 1 ) #endif { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free globbed filenames.", function ); goto on_error; } } return( 1 ); on_error: if( ewf_handle != NULL ) { libewf_handle_free( &ewf_handle, NULL ); } if( globbed_filenames != NULL ) { #if defined( HAVE_WIDE_SYSTEM_CHARACTER ) libewf_glob_wide_free( globbed_filenames, number_of_filenames, NULL ); #else libewf_glob_free( globbed_filenames, number_of_filenames, NULL ); #endif } return( -1 ); }
/* Tests seeking in a handle * Returns 1 if successful, 0 if not or -1 on error */ int ewf_test_seek_handle( libcstring_system_character_t *source, libcerror_error_t **error ) { libcstring_system_character_t **filenames = NULL; libewf_handle_t *handle = NULL; size64_t media_size = 0; size_t string_length = 0; int number_of_filenames = 0; int result = 0; #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) string_length = libcstring_wide_string_length( source ); if( libewf_glob_wide( source, string_length, LIBEWF_FORMAT_UNKNOWN, &filenames, &number_of_filenames, error ) != 1 ) #else string_length = libcstring_narrow_string_length( source ); if( libewf_glob( source, string_length, LIBEWF_FORMAT_UNKNOWN, &filenames, &number_of_filenames, error ) != 1 ) #endif { fprintf( stderr, "Unable to glob filenames.\n" ); goto on_error; } if( number_of_filenames < 0 ) { fprintf( stderr, "Invalid number of filenames.\n" ); goto on_error; } else if( number_of_filenames == 0 ) { fprintf( stderr, "Missing filenames.\n" ); goto on_error; } if( libewf_handle_initialize( &handle, error ) != 1 ) { fprintf( stderr, "Unable to create handle.\n" ); goto on_error; } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_handle_open_wide( handle, (wchar_t * const *) filenames, number_of_filenames, LIBEWF_OPEN_READ, error ) != 1 ) #else if( libewf_handle_open( handle, (char * const *) filenames, number_of_filenames, LIBEWF_OPEN_READ, error ) != 1 ) #endif { fprintf( stderr, "Unable to open handle.\n" ); goto on_error; } if( libewf_handle_get_media_size( handle, &media_size, error ) != 1 ) { fprintf( stderr, "Unable to retrieve media size.\n" ); goto on_error; } result = ewf_test_seek( handle, media_size ); if( result == -1 ) { fprintf( stderr, "Unable to seek in handle.\n" ); goto on_error; } if( libewf_handle_close( handle, error ) != 0 ) { fprintf( stderr, "Unable to close handle.\n" ); goto on_error; } if( libewf_handle_free( &handle, error ) != 1 ) { fprintf( stderr, "Unable to free handle.\n" ); goto on_error; } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_glob_wide_free( filenames, number_of_filenames, error ) != 1 ) #else if( libewf_glob_free( filenames, number_of_filenames, error ) != 1 ) #endif { fprintf( stderr, "Unable to free glob.\n" ); goto on_error; } return( result ); on_error: if( handle != NULL ) { libewf_handle_close( handle, NULL ); libewf_handle_free( &handle, NULL ); } if( filenames != NULL ) { #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) libewf_glob_wide_free( filenames, number_of_filenames, NULL ); #else libewf_glob_free( filenames, number_of_filenames, NULL ); #endif } return( -1 ); }
int main( int argc, char * const argv[] ) #endif { #if !defined( HAVE_GLOB_H ) libcsystem_glob_t *glob = NULL; #endif libcerror_error_t *error = NULL; libcstring_system_character_t * const *source_filenames = NULL; libcstring_system_character_t **ewf_filenames = NULL; libcstring_system_character_t *option_header_codepage = NULL; libcstring_system_character_t *program = _LIBCSTRING_SYSTEM_STRING( "ewfdebug" ); libcstring_system_integer_t option = 0; size_t first_filename_length = 0; uint8_t verbose = 0; int number_of_filenames = 0; int header_codepage = LIBEWF_CODEPAGE_ASCII; int result = 0; libcnotify_stream_set( stderr, NULL ); libcnotify_verbose_set( 1 ); if( libclocale_initialize( "ewftools", &error ) != 1 ) { fprintf( stderr, "Unable to initialize locale values.\n" ); goto on_error; } if( libcsystem_initialize( _IONBF, &error ) != 1 ) { ewfoutput_version_fprint( stdout, program ); fprintf( stderr, "Unable to initialize system values.\n" ); goto on_error; } while( ( option = libcsystem_getopt( argc, argv, _LIBCSTRING_SYSTEM_STRING( "A:hqvV" ) ) ) != (libcstring_system_integer_t) -1 ) { switch( option ) { case (libcstring_system_integer_t) '?': default: ewfoutput_version_fprint( stdout, program ); fprintf( stderr, "Invalid argument: %" PRIs_LIBCSTRING_SYSTEM ".\n", argv[ optind - 1 ] ); usage_fprint( stdout ); return( EXIT_FAILURE ); case (libcstring_system_integer_t) 'A': option_header_codepage = optarg; break; case (libcstring_system_integer_t) 'h': ewfoutput_version_fprint( stdout, program ); usage_fprint( stdout ); return( EXIT_SUCCESS ); case (libcstring_system_integer_t) 'q': break; case (libcstring_system_integer_t) 'v': verbose = 1; break; case (libcstring_system_integer_t) 'V': ewfoutput_version_fprint( stdout, program ); ewfoutput_copyright_fprint( stdout ); return( EXIT_SUCCESS ); } } if( optind == argc ) { ewfoutput_version_fprint( stdout, program ); fprintf( stderr, "Missing EWF image file(s).\n" ); usage_fprint( stdout ); goto on_error; } ewfoutput_version_fprint( stdout, program ); libcnotify_verbose_set( verbose ); #if !defined( HAVE_LOCAL_LIBEWF ) libewf_notify_set_verbose( verbose ); libewf_notify_set_stream( stderr, NULL ); #endif if( option_header_codepage != NULL ) { if( ewfinput_determine_header_codepage( option_header_codepage, &header_codepage, &error ) != 1 ) { libcnotify_print_error_backtrace( error ); libcerror_error_free( &error ); fprintf( stderr, "Unsupported header codepage defaulting to: ascii.\n" ); header_codepage = LIBEWF_CODEPAGE_ASCII; } } if( libcsystem_signal_attach( ewfdebug_signal_handler, &error ) != 1 ) { fprintf( stderr, "Unable to attach signal handler.\n" ); libcnotify_print_error_backtrace( error ); libcerror_error_free( &error ); } #if !defined( HAVE_GLOB_H ) if( libcsystem_glob_initialize( &glob, &error ) != 1 ) { fprintf( stderr, "Unable to initialize glob.\n" ); goto on_error; } if( libcsystem_glob_resolve( glob, &( argv[ optind ] ), argc - optind, &error ) != 1 ) { fprintf( stderr, "Unable to resolve glob.\n" ); goto on_error; } if( libcsystem_glob_get_results( glob, &number_of_filenames, (libcstring_system_character_t ***) &source_filenames, &error ) != 1 ) { fprintf( stderr, "Unable to retrieve glob results.\n" ); goto on_error; } #else source_filenames = &( argv[ optind ] ); number_of_filenames = argc - optind; #endif if( number_of_filenames == 1 ) { first_filename_length = libcstring_system_string_length( source_filenames[ 0 ] ); #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_glob_wide( source_filenames[ 0 ], first_filename_length, LIBEWF_FORMAT_UNKNOWN, &ewf_filenames, &number_of_filenames, &error ) != 1 ) #else if( libewf_glob( source_filenames[ 0 ], first_filename_length, LIBEWF_FORMAT_UNKNOWN, &ewf_filenames, &number_of_filenames, &error ) != 1 ) #endif { fprintf( stderr, "Unable to resolve ewf file(s).\n" ); goto on_error; } source_filenames = (libcstring_system_character_t * const *) ewf_filenames; } if( libewf_handle_initialize( &ewfdebug_input_handle, &error ) != 1 ) { fprintf( stderr, "Unable to initialize input handle.\n" ); goto on_error; } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) result = libewf_handle_open_wide( ewfdebug_input_handle, source_filenames, number_of_filenames, LIBEWF_OPEN_READ, &error ); #else result = libewf_handle_open( ewfdebug_input_handle, source_filenames, number_of_filenames, LIBEWF_OPEN_READ, &error ); #endif #if !defined( HAVE_GLOB_H ) if( libcsystem_glob_free( &glob, &error ) != 1 ) { fprintf( stderr, "Unable to free glob.\n" ); goto on_error; } #endif if( ewf_filenames != NULL ) { for( ; number_of_filenames > 0; number_of_filenames-- ) { memory_free( ewf_filenames[ number_of_filenames - 1 ] ); } memory_free( ewf_filenames ); } if( ( ewfdebug_abort == 0 ) && ( result != 1 ) ) { fprintf( stderr, "Unable to open EWF file(s).\n" ); libewf_handle_close( ewfdebug_input_handle, NULL ); libewf_handle_free( &ewfdebug_input_handle, NULL ); return( EXIT_FAILURE ); } /* TODO */ if( libewf_handle_close( ewfdebug_input_handle, &error ) != 0 ) { fprintf( stderr, "Unable to close EWF file(s).\n" ); libewf_handle_free( &ewfdebug_input_handle, NULL ); return( EXIT_FAILURE ); } if( libewf_handle_free( &ewfdebug_input_handle, &error ) != 1 ) { fprintf( stderr, "Unable to free input handle.\n" ); return( EXIT_FAILURE ); } if( libcsystem_signal_detach( &error ) != 1 ) { fprintf( stderr, "Unable to detach signal handler.\n" ); libcnotify_print_error_backtrace( error ); libcerror_error_free( &error ); } if( ewfdebug_abort != 0 ) { fprintf( stdout, "%" PRIs_LIBCSTRING_SYSTEM ": ABORTED\n", program ); return( EXIT_FAILURE ); } fprintf( stdout, "Debug completed.\n" ); return( EXIT_SUCCESS ); on_error: if( error != NULL ) { libcnotify_print_error_backtrace( error ); libcerror_error_free( &error ); } #if !defined( HAVE_GLOB_H ) if( glob != NULL ) { libcsystem_glob_free( &glob, NULL ); } #endif return( EXIT_FAILURE ); }
int main( int argc, char * const argv[] ) #endif { libcstring_system_character_t *target_filename = NULL; liberror_error_t *error = NULL; libewf_handle_t *handle = NULL; libcstring_system_integer_t option = 0; off64_t read_offset = 0; size64_t media_size = 0; size64_t read_size = 0; size32_t chunk_size = 0; size_t delta_segment_filename_length = 0; while( ( option = libsystem_getopt( argc, argv, _LIBCSTRING_SYSTEM_STRING( "t:" ) ) ) != (libcstring_system_integer_t) -1 ) { switch( option ) { case (libcstring_system_integer_t) '?': default: fprintf( stderr, "Invalid argument: %" PRIs_LIBCSTRING_SYSTEM ".\n", argv[ optind - 1 ] ); return( EXIT_FAILURE ); case (libcstring_system_integer_t) 't': target_filename = optarg; break; } } if( optind == argc ) { fprintf( stderr, "Missing EWF image filename(s).\n" ); return( EXIT_FAILURE ); } /* Initialization */ if( libewf_handle_initialize( &handle, &error ) != 1 ) { fprintf( stderr, "Unable to create handle.\n" ); goto on_error; } /* #if defined( HAVE_DEBUG_OUTPUT ) libewf_notify_set_verbose( 1 ); libewf_notify_set_stream( stderr, NULL ); #endif */ #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_handle_open_wide( handle, &( argv[ optind ] ), argc - optind, LIBEWF_OPEN_READ_WRITE, &error ) != 1 ) #else if( libewf_handle_open( handle, &( argv[ optind ] ), argc - optind, LIBEWF_OPEN_READ_WRITE, &error ) != 1 ) #endif { fprintf( stderr, "Unable to open file(s).\n" ); goto on_error; } if( target_filename != NULL ) { delta_segment_filename_length = libcstring_system_string_length( target_filename ); #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_handle_set_delta_segment_filename_wide( handle, target_filename, delta_segment_filename_length, &error ) != 1 ) #else if( libewf_handle_set_delta_segment_filename( handle, target_filename, delta_segment_filename_length, &error ) != 1 ) #endif { fprintf( stderr, "Unable to set delta segment filename.\n" ); goto on_error; } } if( libewf_handle_get_media_size( handle, &media_size, &error ) != 1 ) { fprintf( stderr, "Unable to retrieve media size.\n" ); goto on_error; } if( media_size > (size64_t) INT64_MAX ) { fprintf( stderr, "Media size exceeds maximum.\n" ); goto on_error; } if( libewf_handle_get_chunk_size( handle, &chunk_size, &error ) != 1 ) { fprintf( stderr, "Unable to retrieve chunk size.\n" ); goto on_error; } if( chunk_size == 0 ) { fprintf( stderr, "Invalid chunk size.\n" ); goto on_error; } fprintf( stdout, "Media size: %" PRIu64 " bytes\n", media_size ); /* Case 0: test full read */ /* Test: offset: 0 size: <media_size> * Expected result: offset: 0 size: <media_size> */ read_offset = 0; read_size = media_size; if( ewf_test_read_write_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read/write buffer.\n" ); goto on_error; } if( ewf_test_read_write_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read/write buffer.\n" ); goto on_error; } /* Case 1: test random read */ /* Test: offset: <media_size / 7> size: <media_size / 2> * Expected result: offset: <media_size / 7> size: <media_size / 2> */ read_offset = (off64_t) ( media_size / 7 ); read_size = media_size / 2; if( ewf_test_read_write_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read/write buffer.\n" ); goto on_error; } if( ewf_test_read_write_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read/write buffer.\n" ); goto on_error; } /* Case 2: test read buffer beyond media size */ if( media_size < 1024 ) { /* Test: offset: <media_size - 1024> size: 4096 * Expected result: offset: -1 size: <undetermined> */ read_offset = (off64_t) ( media_size - 1024 ); read_size = 4096; if( ewf_test_read_write_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, -1, (size64_t) -1 ) != 1 ) { fprintf( stderr, "Unable to test read/write buffer.\n" ); goto on_error; } if( ewf_test_read_write_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, -1, (size64_t) -1 ) != 1 ) { fprintf( stderr, "Unable to test read/write buffer.\n" ); goto on_error; } } else { /* Test: offset: <media_size - 1024> size: 4096 * Expected result: offset: <media_size - 1024> size: 1024 */ read_offset = (off64_t) ( media_size - 1024 ); read_size = 4096; if( ewf_test_read_write_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, read_offset, 1024 ) != 1 ) { fprintf( stderr, "Unable to test read/write buffer.\n" ); goto on_error; } if( ewf_test_read_write_buffer_at_offset( handle, read_offset, SEEK_SET, read_size, read_offset, 1024 ) != 1 ) { fprintf( stderr, "Unable to test read/write buffer.\n" ); goto on_error; } } fprintf( stdout, "\nChunk size: %" PRIu32 " bytes\n", chunk_size ); /* Case 0: test full read */ /* Test: offset: 0 size: <media_size> * Expected result: offset: 0 size: <media_size> */ read_offset = 0; read_size = media_size; if( ewf_test_read_write_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read/write chunk.\n" ); goto on_error; } if( ewf_test_read_write_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read/write chunk.\n" ); goto on_error; } /* Case 1: test random read */ /* Test: offset: <( ( media_size / 7 ) / chunk_size ) * chunk_size> size: <( ( ( media_size / 2 ) / chunk_size ) + 1 ) * chunk_size> * Expected result: offset: <( ( media_size / 7 ) / chunk_size ) * chunk_size> size: <( ( ( media_size / 2 ) / chunk_size ) + 1 ) * chunk_size> */ read_offset = (off64_t) ( ( media_size / 7 ) / chunk_size ) * chunk_size; read_size = ( ( ( media_size / 2 ) / chunk_size ) + 1 ) * chunk_size; if( media_size == 0 ) { if( ewf_test_read_write_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, read_offset, 0 ) != 1 ) { fprintf( stderr, "Unable to test read/write chunk.\n" ); goto on_error; } if( ewf_test_read_write_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, read_offset, 0 ) != 1 ) { fprintf( stderr, "Unable to test read/write chunk.\n" ); goto on_error; } } else { if( ewf_test_read_write_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read/write chunk.\n" ); goto on_error; } if( ewf_test_read_write_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, read_offset, read_size ) != 1 ) { fprintf( stderr, "Unable to test read/write chunk.\n" ); goto on_error; } } /* Case 2: test read chunk beyond media size */ if( media_size < 1024 ) { /* Test: offset: <media_size - 1024> size: chunk_size * Expected result: offset: -1 size: <undetermined> */ read_offset = (off64_t) ( media_size - 1024 ); read_size = chunk_size; if( ewf_test_read_write_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, -1, (size64_t) -1 ) != 1 ) { fprintf( stderr, "Unable to test read/write chunk.\n" ); goto on_error; } if( ewf_test_read_write_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, -1, (size64_t) -1 ) != 1 ) { fprintf( stderr, "Unable to test read/write chunk.\n" ); goto on_error; } } else { /* Test: offset: <media_size - 1024> size: chunk_size * Expected result: offset: <media_size - 1024> size: chunk size or media_size % chunk_size */ read_offset = (off64_t) ( media_size - 1024 ); read_size = chunk_size; if( ewf_test_read_write_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, (off64_t) ( media_size - 1024 ), ( ( media_size % chunk_size ) == 0 ) ? chunk_size : media_size % chunk_size ) != 1 ) { fprintf( stderr, "Unable to test read/write chunk.\n" ); goto on_error; } if( ewf_test_read_write_chunk_at_offset( handle, chunk_size, read_offset, SEEK_SET, read_size, (off64_t) ( media_size - 1024 ), ( ( media_size % chunk_size ) == 0 ) ? chunk_size : media_size % chunk_size ) != 1 ) { fprintf( stderr, "Unable to test read/write chunk.\n" ); goto on_error; } } /* Clean up */ if( libewf_handle_close( handle, &error ) != 0 ) { fprintf( stderr, "Unable to close file(s).\n" ); goto on_error; } if( libewf_handle_free( &handle, &error ) != 1 ) { fprintf( stderr, "Unable to free handle.\n" ); goto on_error; } return( EXIT_SUCCESS ); on_error: if( error != NULL ) { libewf_error_backtrace_fprint( error, stderr ); libewf_error_free( &error ); } if( handle != NULL ) { libewf_handle_close( handle, NULL ); libewf_handle_free( &handle, NULL ); } return( EXIT_FAILURE ); }