/* Initializes the extents * Returns 1 if successful or -1 on error */ int libvmdk_extent_table_initialize_extents( libvmdk_extent_table_t *extent_table, int number_of_extents, int disk_type, libcerror_error_t **error ) { static char *function = "libvmdk_extent_table_initialize_extents"; int result = 0; if( extent_table == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid extent table.", function ); return( -1 ); } if( ( disk_type != LIBVMDK_DISK_TYPE_2GB_EXTENT_FLAT ) && ( disk_type != LIBVMDK_DISK_TYPE_MONOLITHIC_FLAT ) && ( disk_type != LIBVMDK_DISK_TYPE_2GB_EXTENT_SPARSE ) && ( disk_type != LIBVMDK_DISK_TYPE_MONOLITHIC_SPARSE ) && ( disk_type != LIBVMDK_DISK_TYPE_STREAM_OPTIMIZED ) && ( disk_type != LIBVMDK_DISK_TYPE_VMFS_FLAT ) && ( disk_type != LIBVMDK_DISK_TYPE_VMFS_FLAT_PRE_ALLOCATED ) && ( disk_type != LIBVMDK_DISK_TYPE_VMFS_FLAT_ZEROED ) && ( disk_type != LIBVMDK_DISK_TYPE_VMFS_SPARSE ) && ( disk_type != LIBVMDK_DISK_TYPE_VMFS_SPARSE_THIN ) ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_UNSUPPORTED_VALUE, "%s: unsupported disk type.", function ); return( -1 ); } if( ( disk_type == LIBVMDK_DISK_TYPE_2GB_EXTENT_FLAT ) || ( disk_type == LIBVMDK_DISK_TYPE_MONOLITHIC_FLAT ) || ( disk_type == LIBVMDK_DISK_TYPE_VMFS_FLAT ) || ( disk_type == LIBVMDK_DISK_TYPE_VMFS_FLAT_PRE_ALLOCATED ) || ( disk_type == LIBVMDK_DISK_TYPE_VMFS_FLAT_ZEROED ) ) { /* TODO add write support ? */ result = libfdata_stream_initialize( &( extent_table->extent_files_stream ), (intptr_t *) extent_table->io_handle, NULL, NULL, NULL, (ssize_t (*)(intptr_t *, intptr_t *, int, int, uint8_t *, size_t, uint32_t, uint8_t, libcerror_error_t **)) &libvmdk_extent_file_read_segment_data, NULL, (off64_t (*)(intptr_t *, intptr_t *, int, int, off64_t, libcerror_error_t **)) &libvmdk_extent_file_seek_segment_offset, LIBFDATA_DATA_HANDLE_FLAG_NON_MANAGED, error ); if( result != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create extent files stream.", function ); goto on_error; } if( libfdata_stream_resize( extent_table->extent_files_stream, number_of_extents, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_RESIZE_FAILED, "%s: unable to resize extents file stream.", function ); goto on_error; } } else if( ( disk_type == LIBVMDK_DISK_TYPE_2GB_EXTENT_SPARSE ) || ( disk_type == LIBVMDK_DISK_TYPE_MONOLITHIC_SPARSE ) || ( disk_type == LIBVMDK_DISK_TYPE_STREAM_OPTIMIZED ) || ( disk_type == LIBVMDK_DISK_TYPE_VMFS_SPARSE ) || ( disk_type == LIBVMDK_DISK_TYPE_VMFS_SPARSE_THIN ) ) { /* TODO add write support ? */ result = libfdata_list_initialize( &( extent_table->extent_files_list ), (intptr_t *) extent_table->io_handle, NULL, NULL, (int (*)(intptr_t *, intptr_t *, libfdata_list_element_t *, libfdata_cache_t *, int, off64_t, size64_t, uint32_t, uint8_t, libcerror_error_t **)) &libvmdk_extent_file_read_element_data, NULL, LIBFDATA_DATA_HANDLE_FLAG_NON_MANAGED, error ); if( result != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create extent files list.", function ); goto on_error; } if( libfdata_list_resize( extent_table->extent_files_list, number_of_extents, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_RESIZE_FAILED, "%s: unable to resize extent files list.", function ); goto on_error; } result = libfcache_cache_initialize( &( extent_table->extent_files_cache ), LIBVMDK_MAXIMUM_CACHE_ENTRIES_EXTENT_FILES, error ); if( result != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create extent files cache.", function ); goto on_error; } } extent_table->disk_type = disk_type; extent_table->number_of_extents = number_of_extents; return( 1 ); on_error: if( extent_table->extent_files_list != NULL ) { libfdata_list_free( &( extent_table->extent_files_list ), NULL ); } return( -1 ); }
/* Appends a segment to the segment table based on the segment file * Returns 1 if successful or -1 on error */ int libewf_segment_table_append_segment_by_segment_file( libewf_segment_table_t *segment_table, libewf_segment_file_t *segment_file, int file_io_pool_entry, size64_t segment_file_size, libcerror_error_t **error ) { static char *function = "libewf_segment_table_append_segment_by_segment_file"; if( segment_table == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid segment table.", function ); return( -1 ); } if( segment_file == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid segment file.", function ); return( -1 ); } #if SIZEOF_INT <= 4 if( segment_file->segment_number > (uint32_t) INT_MAX ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_OUT_OF_BOUNDS, "%s: invalid segment file - segment number value out of bounds.", function ); return( -1 ); } #endif if( segment_file->segment_number > segment_table->number_of_segments ) { if( libfdata_list_resize( segment_table->segment_files_list, (int) segment_file->segment_number, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_APPEND_FAILED, "%s: unable to resize segment files list.", function ); return( -1 ); } segment_table->number_of_segments = segment_file->segment_number; } if( libfdata_list_set_element_by_index( segment_table->segment_files_list, (int) ( segment_file->segment_number - 1 ), file_io_pool_entry, 0, segment_file_size, 0, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to set element: %" PRIu32 " in segment files list.", function, segment_file->segment_number ); return( -1 ); } return( 1 ); }