1 /*
2  * Segment file reading/writing functions
3  *
4  * Copyright (c) 2006-2014, 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( _LIBEWF_SEGMENT_FILE_H )
23 #define _LIBEWF_SEGMENT_FILE_H
24 
25 #include <common.h>
26 #include <types.h>
27 
28 #include "libewf_chunk_table.h"
29 #include "libewf_hash_sections.h"
30 #include "libewf_header_sections.h"
31 #include "libewf_io_handle.h"
32 #include "libewf_libbfio.h"
33 #include "libewf_libcdata.h"
34 #include "libewf_libcerror.h"
35 #include "libewf_libfcache.h"
36 #include "libewf_libmfdata.h"
37 #include "libewf_media_values.h"
38 #include "libewf_section.h"
39 #include "libewf_single_files.h"
40 
41 #include "ewf_data.h"
42 #include "ewf_table.h"
43 
44 #if defined( __cplusplus )
45 extern "C" {
46 #endif
47 
48 extern const uint8_t dvf_file_signature[ 8 ];
49 extern const uint8_t evf_file_signature[ 8 ];
50 extern const uint8_t lvf_file_signature[ 8 ];
51 
52 typedef struct libewf_segment_file libewf_segment_file_t;
53 
54 struct libewf_segment_file
55 {
56 	/* The segment file type
57 	 */
58 	uint8_t type;
59 
60 	/* The segment number
61 	 */
62 	uint16_t segment_number;
63 
64 	/* The last section offset
65 	 */
66 	off64_t last_section_offset;
67 
68         /* The list of all the sections
69          */
70         libcdata_list_t *section_list;
71 
72 	/* The number of chunks
73 	 */
74 	uint32_t number_of_chunks;
75 
76 	/* Flags
77 	 */
78 	uint8_t flags;
79 };
80 
81 int libewf_segment_file_initialize(
82      libewf_segment_file_t **segment_file,
83      libcerror_error_t **error );
84 
85 int libewf_segment_file_free(
86      libewf_segment_file_t **segment_file,
87      libcerror_error_t **error );
88 
89 int libewf_segment_file_clone(
90      libewf_segment_file_t **destination_segment_file,
91      libewf_segment_file_t *source_segment_file,
92      libcerror_error_t **error );
93 
94 ssize_t libewf_segment_file_read_file_header(
95          libewf_segment_file_t *segment_file,
96          libbfio_pool_t *file_io_pool,
97          int file_io_pool_entry,
98          libcerror_error_t **error );
99 
100 ssize_t libewf_segment_file_write_file_header(
101          libewf_segment_file_t *segment_file,
102          libbfio_pool_t *file_io_pool,
103          int file_io_pool_entry,
104          libcerror_error_t **error );
105 
106 int libewf_segment_file_read(
107      intptr_t *io_handle,
108      libbfio_pool_t *file_io_pool,
109      int file_io_pool_entry,
110      libmfdata_file_t *file,
111      libfcache_cache_t *cache,
112      uint8_t read_flags,
113      libcerror_error_t **error );
114 
115 ssize_t libewf_segment_file_read_table_section(
116          libewf_segment_file_t *segment_file,
117          libewf_section_t *section,
118          libewf_io_handle_t *io_handle,
119          libbfio_pool_t *file_io_pool,
120          int file_io_pool_entry,
121          libewf_media_values_t *media_values,
122          libewf_chunk_table_t *chunk_table,
123          libmfdata_list_t *chunk_table_list,
124          libcerror_error_t **error );
125 
126 ssize_t libewf_segment_file_read_table2_section(
127          libewf_segment_file_t *segment_file,
128          libewf_section_t *section,
129          libewf_io_handle_t *io_handle,
130          libbfio_pool_t *file_io_pool,
131          int file_io_pool_entry,
132          libewf_chunk_table_t *chunk_table,
133          libmfdata_list_t *chunk_table_list,
134          libcerror_error_t **error );
135 
136 ssize_t libewf_segment_file_read_volume_section(
137          libewf_segment_file_t *segment_file,
138          libewf_section_t *section,
139          libewf_io_handle_t *io_handle,
140          libbfio_pool_t *file_io_pool,
141          int file_io_pool_entry,
142          libewf_media_values_t *media_values,
143          libmfdata_list_t *chunk_table_list,
144          libcerror_error_t **error );
145 
146 ssize_t libewf_segment_file_read_delta_chunk_section(
147          libewf_segment_file_t *segment_file,
148          libewf_section_t *section,
149          libbfio_pool_t *file_io_pool,
150          int file_io_pool_entry,
151          libmfdata_list_t *chunk_table_list,
152          libcerror_error_t **error );
153 
154 ssize_t libewf_segment_file_write_headers(
155          libewf_segment_file_t *segment_file,
156          libewf_io_handle_t *io_handle,
157          libbfio_pool_t *file_io_pool,
158          int file_io_pool_entry,
159          off64_t section_offset,
160          libewf_header_sections_t *header_sections,
161          libcerror_error_t **error );
162 
163 ssize_t libewf_segment_file_write_last_section(
164          libewf_segment_file_t *segment_file,
165          libewf_io_handle_t *io_handle,
166          libbfio_pool_t *file_io_pool,
167          int file_io_pool_entry,
168          off64_t section_offset,
169          int last_segment_file,
170          libcerror_error_t **error );
171 
172 ssize_t libewf_segment_file_write_start(
173          libewf_segment_file_t *segment_file,
174          libewf_io_handle_t *io_handle,
175          libbfio_pool_t *file_io_pool,
176          int file_io_pool_entry,
177          libewf_media_values_t *media_values,
178          libewf_header_sections_t *header_sections,
179          ewf_data_t **cached_data_section,
180          libcerror_error_t **error );
181 
182 ssize_t libewf_segment_file_write_chunks_section_start(
183          libewf_segment_file_t *segment_file,
184          libewf_io_handle_t *io_handle,
185          libbfio_pool_t *file_io_pool,
186          int file_io_pool_entry,
187          off64_t section_offset,
188          libmfdata_list_t *chunk_table_list,
189          ewf_table_offset_t *table_offsets,
190          uint32_t number_of_table_offsets,
191          uint32_t number_of_chunks_written,
192          uint32_t chunks_per_section,
193          libcerror_error_t **error );
194 
195 ssize_t libewf_segment_file_write_chunks_section_correction(
196          libewf_segment_file_t *segment_file,
197          libewf_io_handle_t *io_handle,
198          libbfio_pool_t *file_io_pool,
199          int file_io_pool_entry,
200          off64_t section_offset,
201          libmfdata_list_t *chunk_table_list,
202          ewf_table_offset_t *table_offsets,
203          uint32_t number_of_table_offsets,
204          off64_t chunks_section_offset,
205          size64_t chunks_section_size,
206          uint32_t number_of_chunks,
207          uint32_t section_number_of_chunks,
208          libcerror_error_t **error );
209 
210 ssize_t libewf_segment_file_write_chunk(
211          libewf_segment_file_t *segment_file,
212          libewf_io_handle_t *io_handle,
213          libbfio_pool_t *file_io_pool,
214          int file_io_pool_entry,
215          libmfdata_list_t *chunk_table_list,
216          int chunk_index,
217          uint8_t *chunk_buffer,
218          size_t chunk_buffer_size,
219          size_t chunk_data_size,
220          int8_t is_compressed,
221          uint8_t *checksum_buffer,
222          uint32_t *chunk_checksum,
223          int8_t write_checksum,
224          libcerror_error_t **error );
225 
226 ssize_t libewf_segment_file_write_delta_chunk(
227          libewf_segment_file_t *segment_file,
228          libbfio_pool_t *file_io_pool,
229          int file_io_pool_entry,
230          off64_t section_offset,
231          libmfdata_list_t *chunk_table_list,
232          int chunk_index,
233          uint8_t *chunk_buffer,
234          size_t chunk_size,
235          uint8_t *checksum_buffer,
236          uint32_t *chunk_checksum,
237          uint8_t write_checksum,
238 	 uint8_t no_section_append,
239          libcerror_error_t **error );
240 
241 ssize_t libewf_segment_file_write_close(
242          libewf_segment_file_t *segment_file,
243          libewf_io_handle_t *io_handle,
244          libbfio_pool_t *file_io_pool,
245          int file_io_pool_entry,
246          off64_t section_offset,
247          uint32_t number_of_chunks_written_to_segment,
248          int last_segment_file,
249          libewf_hash_sections_t *hash_sections,
250          libfvalue_table_t *hash_values,
251          libewf_media_values_t *media_values,
252          libcdata_array_t *sessions,
253          libcdata_array_t *tracks,
254          libcdata_range_list_t *acquiry_errors,
255          ewf_data_t **cached_data_section,
256          libcerror_error_t **error );
257 
258 int libewf_segment_file_write_sections_correction(
259      libewf_segment_file_t *segment_file,
260      libewf_io_handle_t *io_handle,
261      libbfio_pool_t *file_io_pool,
262      int file_io_pool_entry,
263      uint32_t number_of_chunks_written_to_segment,
264      int last_segment_file,
265      libewf_media_values_t *media_values,
266      libfvalue_table_t *hash_values,
267      libewf_hash_sections_t *hash_sections,
268      libcdata_array_t *sessions,
269      libcdata_array_t *tracks,
270      libcdata_range_list_t *acquiry_errors,
271      ewf_data_t **cached_data_section,
272      libcerror_error_t **error );
273 
274 #if defined( __cplusplus )
275 }
276 #endif
277 
278 #endif
279 
280