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