1 /* 2 * Extent table functions 3 * 4 * Copyright (C) 2009-2021, Joachim Metz <joachim.metz@gmail.com> 5 * 6 * Refer to AUTHORS for acknowledgements. 7 * 8 * This program is free software: you can redistribute it and/or modify 9 * it under the terms of the GNU Lesser General Public License as published by 10 * the Free Software Foundation, either version 3 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public License 19 * along with this program. If not, see <https://www.gnu.org/licenses/>. 20 */ 21 22 #if !defined( _LIBVMDK_EXTENT_TABLE_H ) 23 #define _LIBVMDK_EXTENT_TABLE_H 24 25 #include <common.h> 26 #include <types.h> 27 28 #include "libvmdk_extent_descriptor.h" 29 #include "libvmdk_extent_file.h" 30 #include "libvmdk_io_handle.h" 31 #include "libvmdk_libbfio.h" 32 #include "libvmdk_libcerror.h" 33 #include "libvmdk_libfcache.h" 34 #include "libvmdk_libfdata.h" 35 36 #if defined( __cplusplus ) 37 extern "C" { 38 #endif 39 40 typedef struct libvmdk_extent_table libvmdk_extent_table_t; 41 42 struct libvmdk_extent_table 43 { 44 /* The IO handle 45 */ 46 libvmdk_io_handle_t *io_handle; 47 48 /* The data files path 49 */ 50 system_character_t *data_files_path; 51 52 /* The data files path size 53 */ 54 size_t data_files_path_size; 55 56 /* The disk type 57 */ 58 int disk_type; 59 60 /* The extent type 61 */ 62 int extent_type; 63 64 /* The number of extents 65 */ 66 int number_of_extents; 67 68 /* The extent files list used for sparse extent files 69 */ 70 libfdata_list_t *extent_files_list; 71 72 /* The extent files cache used for sparse extent files 73 */ 74 libfcache_cache_t *extent_files_cache; 75 76 /* The extent files stream used for flat (non-sparse) extent files 77 */ 78 libfdata_stream_t *extent_files_stream; 79 80 /* Flags 81 */ 82 uint8_t flags; 83 }; 84 85 int libvmdk_extent_table_initialize( 86 libvmdk_extent_table_t **extent_table, 87 libvmdk_io_handle_t *io_handle, 88 libcerror_error_t **error ); 89 90 int libvmdk_extent_table_free( 91 libvmdk_extent_table_t **extent_table, 92 libcerror_error_t **error ); 93 94 int libvmdk_extent_table_clear( 95 libvmdk_extent_table_t *extent_table, 96 libcerror_error_t **error ); 97 98 int libvmdk_extent_table_clone( 99 libvmdk_extent_table_t **destination_extent_table, 100 libvmdk_extent_table_t *source_extent_table, 101 libcerror_error_t **error ); 102 103 int libvmdk_extent_table_get_data_files_path_size( 104 libvmdk_extent_table_t *extent_table, 105 size_t *path, 106 libcerror_error_t **error ); 107 108 int libvmdk_extent_table_get_data_files_path( 109 libvmdk_extent_table_t *extent_table, 110 char *path, 111 size_t path_size, 112 libcerror_error_t **error ); 113 114 int libvmdk_extent_table_set_data_files_path( 115 libvmdk_extent_table_t *extent_table, 116 const char *path, 117 size_t path_length, 118 libcerror_error_t **error ); 119 120 #if defined( HAVE_WIDE_CHARACTER_TYPE ) 121 122 int libvmdk_extent_table_get_data_files_path_size_wide( 123 libvmdk_extent_table_t *extent_table, 124 size_t *path_size, 125 libcerror_error_t **error ); 126 127 int libvmdk_extent_table_get_data_files_path_wide( 128 libvmdk_extent_table_t *extent_table, 129 wchar_t *path, 130 size_t path_size, 131 libcerror_error_t **error ); 132 133 int libvmdk_extent_table_set_data_files_path_wide( 134 libvmdk_extent_table_t *extent_table, 135 const wchar_t *path, 136 size_t path_length, 137 libcerror_error_t **error ); 138 139 #endif /* defined( HAVE_WIDE_CHARACTER_TYPE ) */ 140 141 int libvmdk_extent_table_initialize_extents( 142 libvmdk_extent_table_t *extent_table, 143 int number_of_extents, 144 int disk_type, 145 libcerror_error_t **error ); 146 147 int libvmdk_extent_table_get_number_of_extents( 148 libvmdk_extent_table_t *extent_table, 149 int *number_of_extents, 150 libcerror_error_t **error ); 151 152 int libvmdk_extent_table_get_extent_by_index( 153 libvmdk_extent_table_t *extent_table, 154 int extent_index, 155 int *file_io_pool_entry, 156 size64_t *extent_file_size, 157 libcerror_error_t **error ); 158 159 int libvmdk_extent_table_get_extent_at_offset( 160 libvmdk_extent_table_t *extent_table, 161 off64_t offset, 162 int *file_io_pool_entry, 163 size64_t *extent_file_size, 164 libcerror_error_t **error ); 165 166 int libvmdk_extent_table_set_extent_storage_media_size_by_index( 167 libvmdk_extent_table_t *extent_table, 168 int extent_index, 169 size64_t storage_media_size, 170 libcerror_error_t **error ); 171 172 int libvmdk_extent_table_get_extent_file_by_index( 173 libvmdk_extent_table_t *extent_table, 174 int extent_index, 175 libbfio_pool_t *file_io_pool, 176 libvmdk_extent_file_t **extent_file, 177 libcerror_error_t **error ); 178 179 int libvmdk_extent_table_get_extent_file_at_offset( 180 libvmdk_extent_table_t *extent_table, 181 off64_t offset, 182 libbfio_pool_t *file_io_pool, 183 int *extent_index, 184 off64_t *extent_file_data_offset, 185 libvmdk_extent_file_t **extent_file, 186 libcerror_error_t **error ); 187 188 int libvmdk_extent_table_set_extent_file_by_index( 189 libvmdk_extent_table_t *extent_table, 190 libbfio_pool_t *file_io_pool, 191 int extent_index, 192 libvmdk_extent_file_t *extent_file, 193 libcerror_error_t **error ); 194 195 int libvmdk_extent_table_set_extent_by_extent_descriptor( 196 libvmdk_extent_table_t *extent_table, 197 libvmdk_internal_extent_descriptor_t *extent_descriptor, 198 int extent_index, 199 int file_io_pool_entry, 200 size64_t extent_file_size, 201 off64_t extent_file_offset, 202 size64_t extent_size, 203 libcerror_error_t **error ); 204 205 #if defined( __cplusplus ) 206 } 207 #endif 208 209 #endif /* !defined( _LIBVMDK_EXTENT_TABLE_H ) */ 210 211