1 /*
2  * Page 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( _LIBESEDB_PAGE_H )
23 #define _LIBESEDB_PAGE_H
24 
25 #include <common.h>
26 #include <types.h>
27 
28 #include "libesedb_io_handle.h"
29 #include "libesedb_libbfio.h"
30 #include "libesedb_libcdata.h"
31 #include "libesedb_libcerror.h"
32 #include "libesedb_page_header.h"
33 #include "libesedb_page_value.h"
34 
35 #if defined( __cplusplus )
36 extern "C" {
37 #endif
38 
39 typedef struct libesedb_page libesedb_page_t;
40 
41 struct libesedb_page
42 {
43 	/* The page number
44 	 */
45 	uint32_t page_number;
46 
47 	/* The file offset of the page
48 	 */
49 	off64_t offset;
50 
51 	/* The header
52 	 */
53 	libesedb_page_header_t *header;
54 
55 	/* The data
56 	 */
57 	uint8_t *data;
58 
59 	/* The data size
60 	 */
61 	size_t data_size;
62 
63 	/* The values array
64 	 */
65 	libcdata_array_t *values_array;
66 };
67 
68 int libesedb_page_initialize(
69      libesedb_page_t **page,
70      libcerror_error_t **error );
71 
72 int libesedb_page_free(
73      libesedb_page_t **page,
74      libcerror_error_t **error );
75 
76 int libesedb_page_calculate_checksums(
77      libesedb_page_t *page,
78      libesedb_io_handle_t *io_handle,
79      const uint8_t *page_data,
80      size_t page_data_size,
81      uint32_t *ecc32_checksum,
82      uint32_t *xor32_checksum,
83      libcerror_error_t **error );
84 
85 int libesedb_page_read_tags(
86      libesedb_page_t *page,
87      libesedb_io_handle_t *io_handle,
88      const uint8_t *page_data,
89      size_t page_data_size,
90      uint16_t number_of_page_tags,
91      libcerror_error_t **error );
92 
93 int libesedb_page_read_values(
94      libesedb_page_t *page,
95      libesedb_io_handle_t *io_handle,
96      uint8_t *page_data,
97      size_t page_data_size,
98      size_t page_values_data_offset,
99      libcerror_error_t **error );
100 
101 int libesedb_page_read_file_io_handle(
102      libesedb_page_t *page,
103      libesedb_io_handle_t *io_handle,
104      libbfio_handle_t *file_io_handle,
105      off64_t file_offset,
106      libcerror_error_t **error );
107 
108 int libesedb_page_validate_root_page(
109      libesedb_page_t *page,
110      libcerror_error_t **error );
111 
112 int libesedb_page_validate_space_tree_page(
113      libesedb_page_t *page,
114      libcerror_error_t **error );
115 
116 int libesedb_page_validate_page(
117      libesedb_page_t *page,
118      libcerror_error_t **error );
119 
120 int libesedb_page_get_previous_page_number(
121      libesedb_page_t *page,
122      uint32_t *previous_page_number,
123      libcerror_error_t **error );
124 
125 int libesedb_page_get_next_page_number(
126      libesedb_page_t *page,
127      uint32_t *next_page_number,
128      libcerror_error_t **error );
129 
130 int libesedb_page_get_father_data_page_object_identifier(
131      libesedb_page_t *page,
132      uint32_t *father_data_page_object_identifier,
133      libcerror_error_t **error );
134 
135 int libesedb_page_get_flags(
136      libesedb_page_t *page,
137      uint32_t *flags,
138      libcerror_error_t **error );
139 
140 int libesedb_page_get_number_of_values(
141      libesedb_page_t *page,
142      uint16_t *number_of_values,
143      libcerror_error_t **error );
144 
145 int libesedb_page_get_value_by_index(
146      libesedb_page_t *page,
147      uint16_t value_index,
148      libesedb_page_value_t **page_value,
149      libcerror_error_t **error );
150 
151 #if defined( __cplusplus )
152 }
153 #endif
154 
155 #endif /* !defined( _LIBESEDB_PAGE_H ) */
156 
157