/* Retrieves an extent at a specific offset from the extent table * Returns 1 if successful, 0 if not or -1 on error */ int libvmdk_extent_table_get_extent_at_offset( libvmdk_extent_table_t *extent_table, off64_t offset, int *file_io_pool_entry, size64_t *extent_file_size, libcerror_error_t **error ) { static char *function = "libvmdk_extent_table_get_extent_at_offset"; off64_t element_offset = 0; off64_t extent_file_data_offset = 0; uint32_t element_flags = 0; int extent_index = 0; 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 ); } result = libfdata_list_get_element_at_offset( extent_table->extent_files_list, offset, &extent_index, &extent_file_data_offset, file_io_pool_entry, &element_offset, extent_file_size, &element_flags, error ); if( result == -1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve element at offset: %" PRIi64 " from extent files list.", function, offset ); return( -1 ); } return( result ); }
/* Determines if the grain at a specific offset is sparse * Returns 1 if the grain is sparse, 0 if not or -1 on error */ int libvmdk_grain_table_grain_is_sparse_at_offset( libvmdk_grain_table_t *grain_table, uint64_t grain_index, libbfio_pool_t *file_io_pool, libvmdk_extent_table_t *extent_table, off64_t offset, libcerror_error_t **error ) { libvmdk_extent_file_t *extent_file = NULL; libfdata_list_t *grains_list = NULL; static char *function = "libvmdk_grain_table_grain_is_sparse_at_offset"; off64_t extent_file_data_offset = 0; off64_t grain_data_offset = 0; off64_t grain_group_data_offset = 0; off64_t grain_offset = 0; size64_t grain_size = 0; uint32_t grain_flags = 0; int extent_number = 0; int grain_file_index = 0; int grain_groups_list_index = 0; int grains_list_index = 0; int result = 0; if( grain_table == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid grain table.", function ); return( -1 ); } result = libvmdk_extent_table_get_extent_file_at_offset( extent_table, offset, file_io_pool, &extent_number, &extent_file_data_offset, &extent_file, error ); if( result != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve extent file at offset: %" PRIi64 " from extent table.", function, offset ); return( -1 ); } if( extent_file == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: missing extent file.", function ); return( -1 ); } result = libvmdk_extent_file_grain_group_is_sparse_at_offset( extent_file, extent_file_data_offset, &grain_groups_list_index, &grain_group_data_offset, error ); if( result == -1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve grain group from extent file: %d at offset: %" PRIi64 ".", function, extent_number, extent_file_data_offset ); return( -1 ); } else if( result != 0 ) { return( 1 ); } result = libvmdk_extent_file_get_grain_group_at_offset( extent_file, file_io_pool, extent_file_data_offset, &grain_groups_list_index, &grain_group_data_offset, &grains_list, error ); if( result != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve grain group from extent file: %d at offset: %" PRIi64 ".", function, extent_number, extent_file_data_offset ); return( -1 ); } result = libfdata_list_get_element_at_offset( grains_list, grain_group_data_offset, &grains_list_index, &grain_data_offset, &grain_file_index, &grain_offset, &grain_size, &grain_flags, error ); if( result != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve grain: %" PRIu64 " from grain group: %d in extent file: %d at offset: %" PRIi64 ".", function, grain_index, grain_groups_list_index, extent_number, extent_file_data_offset ); return( -1 ); } if( ( grain_flags & LIBVMDK_RANGE_FLAG_IS_SPARSE ) != 0 ) { return( 1 ); } return( 0 ); }