1 /* 2 * Extent file 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_FILE_H ) 23 #define _LIBVMDK_EXTENT_FILE_H 24 25 #include <common.h> 26 #include <types.h> 27 28 #include "libvmdk_io_handle.h" 29 #include "libvmdk_libbfio.h" 30 #include "libvmdk_libcerror.h" 31 #include "libvmdk_libfcache.h" 32 #include "libvmdk_libfdata.h" 33 34 #if defined( __cplusplus ) 35 extern "C" { 36 #endif 37 38 extern const char *cowd_sparse_file_signature; 39 extern const char *vmdk_sparse_file_signature; 40 41 typedef struct libvmdk_extent_file libvmdk_extent_file_t; 42 43 struct libvmdk_extent_file 44 { 45 /* The IO handle 46 */ 47 libvmdk_io_handle_t *io_handle; 48 49 /* The extent file type 50 */ 51 uint8_t file_type; 52 53 /* The extent file format version 54 */ 55 uint32_t format_version; 56 57 /* The extent file flags 58 */ 59 uint32_t flags; 60 61 /* The maximum data size 62 */ 63 size64_t maximum_data_size; 64 65 /* The compression method 66 */ 67 uint16_t compression_method; 68 69 /* The descriptor offset 70 */ 71 off64_t descriptor_offset; 72 73 /* The descriptor size 74 */ 75 size64_t descriptor_size; 76 77 /* The grain size 78 */ 79 size64_t grain_size; 80 81 /* The number of grain table entries 82 */ 83 uint32_t number_of_grain_table_entries; 84 85 /* The grain table size 86 */ 87 size_t grain_table_size; 88 89 /* The number of grain directory entries 90 */ 91 uint32_t number_of_grain_directory_entries; 92 93 /* The grain directory size 94 */ 95 size_t grain_directory_size; 96 97 /* The primary grain directory offset 98 */ 99 off64_t primary_grain_directory_offset; 100 101 /* The secondary grain directory offset 102 */ 103 off64_t secondary_grain_directory_offset; 104 105 /* Value to indicate the extent file is dirty 106 */ 107 uint8_t is_dirty; 108 109 /* The grain groups list 110 */ 111 libfdata_list_t *grain_groups_list; 112 113 /* The grain groups cache 114 */ 115 libfcache_cache_t *grain_groups_cache; 116 117 /* The (current) grain groups index 118 */ 119 int grain_groups_index; 120 121 /* The storage media size (in the extent file) 122 */ 123 size64_t storage_media_size; 124 }; 125 126 int libvmdk_extent_file_initialize( 127 libvmdk_extent_file_t **extent_file, 128 libvmdk_io_handle_t *io_handle, 129 libcerror_error_t **error ); 130 131 int libvmdk_extent_file_free( 132 libvmdk_extent_file_t **extent_file, 133 libcerror_error_t **error ); 134 135 int libvmdk_extent_file_check_for_empty_block( 136 const uint8_t *data, 137 size_t data_size, 138 libcerror_error_t **error ); 139 140 int libvmdk_extent_file_read_file_header_file_io_handle( 141 libvmdk_extent_file_t *extent_file, 142 libbfio_handle_t *file_io_handle, 143 off64_t file_offset, 144 libcerror_error_t **error ); 145 146 int libvmdk_extent_file_read_file_header( 147 libvmdk_extent_file_t *extent_file, 148 libbfio_pool_t *file_io_pool, 149 int file_io_pool_entry, 150 off64_t file_offset, 151 libcerror_error_t **error ); 152 153 int libvmdk_extent_file_read_file_header_data( 154 libvmdk_extent_file_t *extent_file, 155 const uint8_t *file_header_data, 156 size_t file_header_data_size, 157 libcerror_error_t **error ); 158 159 int libvmdk_extent_file_read_descriptor_data_file_io_handle( 160 libvmdk_extent_file_t *extent_file, 161 libbfio_handle_t *file_io_handle, 162 uint8_t *descriptor_data, 163 size_t descriptor_data_size, 164 libcerror_error_t **error ); 165 166 int libvmdk_extent_file_read_grain_directories( 167 libvmdk_extent_file_t *extent_file, 168 libbfio_pool_t *file_io_pool, 169 int file_io_pool_entry, 170 libcerror_error_t **error ); 171 172 int libvmdk_extent_file_read_grain_directory( 173 libvmdk_extent_file_t *extent_file, 174 libbfio_pool_t *file_io_pool, 175 int file_io_pool_entry, 176 off64_t file_offset, 177 libcerror_error_t **error ); 178 179 int libvmdk_extent_file_read_backup_grain_directory( 180 libvmdk_extent_file_t *extent_file, 181 libbfio_pool_t *file_io_pool, 182 int file_io_pool_entry, 183 off64_t file_offset, 184 libcerror_error_t **error ); 185 186 int libvmdk_extent_file_read_grains_scan( 187 libvmdk_extent_file_t *extent_file, 188 libbfio_pool_t *file_io_pool, 189 int file_io_pool_entry, 190 libcerror_error_t **error ); 191 192 int libvmdk_extent_file_read_element_data( 193 libvmdk_io_handle_t *io_handle, 194 libbfio_pool_t *file_io_pool, 195 libfdata_list_element_t *element, 196 libfdata_cache_t *cache, 197 int file_io_pool_entry, 198 off64_t element_offset, 199 size64_t extent_file_size, 200 uint32_t element_flags, 201 uint8_t read_flags, 202 libcerror_error_t **error ); 203 204 int libvmdk_extent_file_read_grain_group_element_data( 205 libvmdk_extent_file_t *extent_file, 206 libbfio_pool_t *file_io_pool, 207 libfdata_list_element_t *element, 208 libfdata_cache_t *cache, 209 int file_io_pool_entry, 210 off64_t grain_group_data_offset, 211 size64_t grain_group_data_size, 212 uint32_t grain_group_data_flags, 213 uint8_t read_flags, 214 libcerror_error_t **error ); 215 216 int libvmdk_extent_file_grain_group_is_sparse_at_offset( 217 libvmdk_extent_file_t *extent_file, 218 off64_t offset, 219 int *grain_group_index, 220 off64_t *grain_group_data_offset, 221 libcerror_error_t **error ); 222 223 int libvmdk_extent_file_get_grain_group_at_offset( 224 libvmdk_extent_file_t *extent_file, 225 libbfio_pool_t *file_io_pool, 226 off64_t offset, 227 int *grain_group_index, 228 off64_t *grain_group_data_offset, 229 libfdata_list_t **grains_list, 230 libcerror_error_t **error ); 231 232 ssize_t libvmdk_extent_file_read_segment_data( 233 intptr_t *data_handle, 234 libbfio_pool_t *file_io_pool, 235 int segment_index, 236 int segment_file_index, 237 uint8_t *segment_data, 238 size_t segment_data_size, 239 uint32_t segment_flags, 240 uint8_t read_flags, 241 libcerror_error_t **error ); 242 243 off64_t libvmdk_extent_file_seek_segment_offset( 244 intptr_t *data_handle, 245 libbfio_pool_t *file_io_pool, 246 int segment_index, 247 int segment_file_index, 248 off64_t segment_offset, 249 libcerror_error_t **error ); 250 251 #if defined( __cplusplus ) 252 } 253 #endif 254 255 #endif /* !defined( _LIBVMDK_EXTENT_FILE_H ) */ 256 257