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