blob: a181ccc6bea049aefff120813cac2cb316eefd37
1 | /* |
2 | * volume.h - Exports for NTFS volume handling. Originated from the Linux-NTFS project. |
3 | * |
4 | * Copyright (c) 2000-2004 Anton Altaparmakov |
5 | * Copyright (c) 2004-2005 Richard Russon |
6 | * Copyright (c) 2005-2006 Yura Pakhuchiy |
7 | * Copyright (c) 2005-2009 Szabolcs Szakacsits |
8 | * Copyright (c) 2010 Jean-Pierre Andre |
9 | * |
10 | * This program/include file is free software; you can redistribute it and/or |
11 | * modify it under the terms of the GNU General Public License as published |
12 | * by the Free Software Foundation; either version 2 of the License, or |
13 | * (at your option) any later version. |
14 | * |
15 | * This program/include file is distributed in the hope that it will be |
16 | * useful, but WITHOUT ANY WARRANTY; without even the implied warranty |
17 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
18 | * GNU General Public License for more details. |
19 | * |
20 | * You should have received a copy of the GNU General Public License |
21 | * along with this program (in the main directory of the NTFS-3G |
22 | * distribution in the file COPYING); if not, write to the Free Software |
23 | * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
24 | */ |
25 | |
26 | #ifndef _NTFS_VOLUME_H |
27 | #define _NTFS_VOLUME_H |
28 | |
29 | #ifdef HAVE_CONFIG_H |
30 | #include "config.h" |
31 | #endif |
32 | |
33 | #ifdef HAVE_STDIO_H |
34 | #include <stdio.h> |
35 | #endif |
36 | #ifdef HAVE_SYS_PARAM_H |
37 | #include <sys/param.h> |
38 | #endif |
39 | #ifdef HAVE_SYS_MOUNT_H |
40 | #include <sys/mount.h> |
41 | #endif |
42 | #ifdef HAVE_MNTENT_H |
43 | #include <mntent.h> |
44 | #endif |
45 | |
46 | /* Forward declaration */ |
47 | typedef struct _ntfs_volume ntfs_volume; |
48 | |
49 | #include "param.h" |
50 | #include "types.h" |
51 | #include "support.h" |
52 | #include "device.h" |
53 | #include "inode.h" |
54 | #include "attrib.h" |
55 | #include "index.h" |
56 | |
57 | /** |
58 | * enum ntfs_mount_flags - |
59 | * |
60 | * Flags for the ntfs_mount() function. |
61 | */ |
62 | enum { |
63 | NTFS_MNT_NONE = 0x00000000, |
64 | NTFS_MNT_RDONLY = 0x00000001, |
65 | NTFS_MNT_FORENSIC = 0x04000000, /* No modification during |
66 | * mount. */ |
67 | NTFS_MNT_EXCLUSIVE = 0x08000000, |
68 | NTFS_MNT_RECOVER = 0x10000000, |
69 | NTFS_MNT_IGNORE_HIBERFILE = 0x20000000, |
70 | }; |
71 | typedef unsigned long ntfs_mount_flags; |
72 | |
73 | /** |
74 | * enum ntfs_mounted_flags - |
75 | * |
76 | * Flags returned by the ntfs_check_if_mounted() function. |
77 | */ |
78 | typedef enum { |
79 | NTFS_MF_MOUNTED = 1, /* Device is mounted. */ |
80 | NTFS_MF_ISROOT = 2, /* Device is mounted as system root. */ |
81 | NTFS_MF_READONLY = 4, /* Device is mounted read-only. */ |
82 | } ntfs_mounted_flags; |
83 | |
84 | extern int ntfs_check_if_mounted(const char *file, unsigned long *mnt_flags); |
85 | |
86 | typedef enum { |
87 | NTFS_VOLUME_OK = 0, |
88 | NTFS_VOLUME_SYNTAX_ERROR = 11, |
89 | NTFS_VOLUME_NOT_NTFS = 12, |
90 | NTFS_VOLUME_CORRUPT = 13, |
91 | NTFS_VOLUME_HIBERNATED = 14, |
92 | NTFS_VOLUME_UNCLEAN_UNMOUNT = 15, |
93 | NTFS_VOLUME_LOCKED = 16, |
94 | NTFS_VOLUME_RAID = 17, |
95 | NTFS_VOLUME_UNKNOWN_REASON = 18, |
96 | NTFS_VOLUME_NO_PRIVILEGE = 19, |
97 | NTFS_VOLUME_OUT_OF_MEMORY = 20, |
98 | NTFS_VOLUME_FUSE_ERROR = 21, |
99 | NTFS_VOLUME_INSECURE = 22 |
100 | } ntfs_volume_status; |
101 | |
102 | /** |
103 | * enum ntfs_volume_state_bits - |
104 | * |
105 | * Defined bits for the state field in the ntfs_volume structure. |
106 | */ |
107 | typedef enum { |
108 | NV_ReadOnly, /* 1: Volume is read-only. */ |
109 | NV_CaseSensitive, /* 1: Volume is mounted case-sensitive. */ |
110 | NV_LogFileEmpty, /* 1: $logFile journal is empty. */ |
111 | NV_ShowSysFiles, /* 1: Show NTFS metafiles. */ |
112 | NV_ShowHidFiles, /* 1: Show files marked hidden. */ |
113 | NV_HideDotFiles, /* 1: Set hidden flag on dot files */ |
114 | NV_Compression, /* 1: allow compression */ |
115 | NV_NoFixupWarn, /* 1: Do not log fixup errors */ |
116 | } ntfs_volume_state_bits; |
117 | |
118 | #define test_nvol_flag(nv, flag) test_bit(NV_##flag, (nv)->state) |
119 | #define set_nvol_flag(nv, flag) set_bit(NV_##flag, (nv)->state) |
120 | #define clear_nvol_flag(nv, flag) clear_bit(NV_##flag, (nv)->state) |
121 | |
122 | #define NVolReadOnly(nv) test_nvol_flag(nv, ReadOnly) |
123 | #define NVolSetReadOnly(nv) set_nvol_flag(nv, ReadOnly) |
124 | #define NVolClearReadOnly(nv) clear_nvol_flag(nv, ReadOnly) |
125 | |
126 | #define NVolCaseSensitive(nv) test_nvol_flag(nv, CaseSensitive) |
127 | #define NVolSetCaseSensitive(nv) set_nvol_flag(nv, CaseSensitive) |
128 | #define NVolClearCaseSensitive(nv) clear_nvol_flag(nv, CaseSensitive) |
129 | |
130 | #define NVolLogFileEmpty(nv) test_nvol_flag(nv, LogFileEmpty) |
131 | #define NVolSetLogFileEmpty(nv) set_nvol_flag(nv, LogFileEmpty) |
132 | #define NVolClearLogFileEmpty(nv) clear_nvol_flag(nv, LogFileEmpty) |
133 | |
134 | #define NVolShowSysFiles(nv) test_nvol_flag(nv, ShowSysFiles) |
135 | #define NVolSetShowSysFiles(nv) set_nvol_flag(nv, ShowSysFiles) |
136 | #define NVolClearShowSysFiles(nv) clear_nvol_flag(nv, ShowSysFiles) |
137 | |
138 | #define NVolShowHidFiles(nv) test_nvol_flag(nv, ShowHidFiles) |
139 | #define NVolSetShowHidFiles(nv) set_nvol_flag(nv, ShowHidFiles) |
140 | #define NVolClearShowHidFiles(nv) clear_nvol_flag(nv, ShowHidFiles) |
141 | |
142 | #define NVolHideDotFiles(nv) test_nvol_flag(nv, HideDotFiles) |
143 | #define NVolSetHideDotFiles(nv) set_nvol_flag(nv, HideDotFiles) |
144 | #define NVolClearHideDotFiles(nv) clear_nvol_flag(nv, HideDotFiles) |
145 | |
146 | #define NVolCompression(nv) test_nvol_flag(nv, Compression) |
147 | #define NVolSetCompression(nv) set_nvol_flag(nv, Compression) |
148 | #define NVolClearCompression(nv) clear_nvol_flag(nv, Compression) |
149 | |
150 | #define NVolNoFixupWarn(nv) test_nvol_flag(nv, NoFixupWarn) |
151 | #define NVolSetNoFixupWarn(nv) set_nvol_flag(nv, NoFixupWarn) |
152 | #define NVolClearNoFixupWarn(nv) clear_nvol_flag(nv, NoFixupWarn) |
153 | |
154 | /* |
155 | * NTFS version 1.1 and 1.2 are used by Windows NT4. |
156 | * NTFS version 2.x is used by Windows 2000 Beta |
157 | * NTFS version 3.0 is used by Windows 2000. |
158 | * NTFS version 3.1 is used by Windows XP, 2003 and Vista. |
159 | */ |
160 | |
161 | #define NTFS_V1_1(major, minor) ((major) == 1 && (minor) == 1) |
162 | #define NTFS_V1_2(major, minor) ((major) == 1 && (minor) == 2) |
163 | #define NTFS_V2_X(major, minor) ((major) == 2) |
164 | #define NTFS_V3_0(major, minor) ((major) == 3 && (minor) == 0) |
165 | #define NTFS_V3_1(major, minor) ((major) == 3 && (minor) == 1) |
166 | |
167 | #define NTFS_BUF_SIZE 8192 |
168 | |
169 | /** |
170 | * struct _ntfs_volume - structure describing an open volume in memory. |
171 | */ |
172 | struct _ntfs_volume { |
173 | union { |
174 | struct ntfs_device *dev; /* NTFS device associated with |
175 | the volume. */ |
176 | void *sb; /* For kernel porting compatibility. */ |
177 | }; |
178 | char *vol_name; /* Name of the volume. */ |
179 | unsigned long state; /* NTFS specific flags describing this volume. |
180 | See ntfs_volume_state_bits above. */ |
181 | |
182 | ntfs_inode *vol_ni; /* ntfs_inode structure for FILE_Volume. */ |
183 | u8 major_ver; /* Ntfs major version of volume. */ |
184 | u8 minor_ver; /* Ntfs minor version of volume. */ |
185 | le16 flags; /* Bit array of VOLUME_* flags. */ |
186 | |
187 | u16 sector_size; /* Byte size of a sector. */ |
188 | u8 sector_size_bits; /* Log(2) of the byte size of a sector. */ |
189 | u32 cluster_size; /* Byte size of a cluster. */ |
190 | u32 mft_record_size; /* Byte size of a mft record. */ |
191 | u32 indx_record_size; /* Byte size of a INDX record. */ |
192 | u8 cluster_size_bits; /* Log(2) of the byte size of a cluster. */ |
193 | u8 mft_record_size_bits;/* Log(2) of the byte size of a mft record. */ |
194 | u8 indx_record_size_bits;/* Log(2) of the byte size of a INDX record. */ |
195 | |
196 | /* Variables used by the cluster and mft allocators. */ |
197 | u8 mft_zone_multiplier; /* Initial mft zone multiplier. */ |
198 | u8 full_zones; /* cluster zones which are full */ |
199 | s64 mft_data_pos; /* Mft record number at which to allocate the |
200 | next mft record. */ |
201 | LCN mft_zone_start; /* First cluster of the mft zone. */ |
202 | LCN mft_zone_end; /* First cluster beyond the mft zone. */ |
203 | LCN mft_zone_pos; /* Current position in the mft zone. */ |
204 | LCN data1_zone_pos; /* Current position in the first data zone. */ |
205 | LCN data2_zone_pos; /* Current position in the second data zone. */ |
206 | |
207 | s64 nr_clusters; /* Volume size in clusters, hence also the |
208 | number of bits in lcn_bitmap. */ |
209 | ntfs_inode *lcnbmp_ni; /* ntfs_inode structure for FILE_Bitmap. */ |
210 | ntfs_attr *lcnbmp_na; /* ntfs_attr structure for the data attribute |
211 | of FILE_Bitmap. Each bit represents a |
212 | cluster on the volume, bit 0 representing |
213 | lcn 0 and so on. A set bit means that the |
214 | cluster and vice versa. */ |
215 | |
216 | LCN mft_lcn; /* Logical cluster number of the data attribute |
217 | for FILE_MFT. */ |
218 | ntfs_inode *mft_ni; /* ntfs_inode structure for FILE_MFT. */ |
219 | ntfs_attr *mft_na; /* ntfs_attr structure for the data attribute |
220 | of FILE_MFT. */ |
221 | ntfs_attr *mftbmp_na; /* ntfs_attr structure for the bitmap attribute |
222 | of FILE_MFT. Each bit represents an mft |
223 | record in the $DATA attribute, bit 0 |
224 | representing mft record 0 and so on. A set |
225 | bit means that the mft record is in use and |
226 | vice versa. */ |
227 | |
228 | ntfs_inode *secure_ni; /* ntfs_inode structure for FILE $Secure */ |
229 | ntfs_index_context *secure_xsii; /* index for using $Secure:$SII */ |
230 | ntfs_index_context *secure_xsdh; /* index for using $Secure:$SDH */ |
231 | int secure_reentry; /* check for non-rentries */ |
232 | unsigned int secure_flags; /* flags, see security.h for values */ |
233 | |
234 | int mftmirr_size; /* Size of the FILE_MFTMirr in mft records. */ |
235 | LCN mftmirr_lcn; /* Logical cluster number of the data attribute |
236 | for FILE_MFTMirr. */ |
237 | ntfs_inode *mftmirr_ni; /* ntfs_inode structure for FILE_MFTMirr. */ |
238 | ntfs_attr *mftmirr_na; /* ntfs_attr structure for the data attribute |
239 | of FILE_MFTMirr. */ |
240 | |
241 | ntfschar *upcase; /* Upper case equivalents of all 65536 2-byte |
242 | Unicode characters. Obtained from |
243 | FILE_UpCase. */ |
244 | u32 upcase_len; /* Length in Unicode characters of the upcase |
245 | table. */ |
246 | ntfschar *locase; /* Lower case equivalents of all 65536 2-byte |
247 | Unicode characters. Only if option |
248 | case_ignore is set. */ |
249 | |
250 | ATTR_DEF *attrdef; /* Attribute definitions. Obtained from |
251 | FILE_AttrDef. */ |
252 | s32 attrdef_len; /* Size of the attribute definition table in |
253 | bytes. */ |
254 | |
255 | s64 free_clusters; /* Track the number of free clusters which |
256 | greatly improves statfs() performance */ |
257 | s64 free_mft_records; /* Same for free mft records (see above) */ |
258 | BOOL efs_raw; /* volume is mounted for raw access to |
259 | efs-encrypted files */ |
260 | #ifdef XATTR_MAPPINGS |
261 | struct XATTRMAPPING *xattr_mapping; |
262 | #endif /* XATTR_MAPPINGS */ |
263 | #if CACHE_INODE_SIZE |
264 | struct CACHE_HEADER *xinode_cache; |
265 | #endif |
266 | #if CACHE_NIDATA_SIZE |
267 | struct CACHE_HEADER *nidata_cache; |
268 | #endif |
269 | #if CACHE_LOOKUP_SIZE |
270 | struct CACHE_HEADER *lookup_cache; |
271 | #endif |
272 | #if CACHE_SECURID_SIZE |
273 | struct CACHE_HEADER *securid_cache; |
274 | #endif |
275 | #if CACHE_LEGACY_SIZE |
276 | struct CACHE_HEADER *legacy_cache; |
277 | #endif |
278 | |
279 | }; |
280 | |
281 | extern const char *ntfs_home; |
282 | |
283 | extern ntfs_volume *ntfs_volume_alloc(void); |
284 | |
285 | extern ntfs_volume *ntfs_volume_startup(struct ntfs_device *dev, |
286 | ntfs_mount_flags flags); |
287 | |
288 | extern ntfs_volume *ntfs_device_mount(struct ntfs_device *dev, |
289 | ntfs_mount_flags flags); |
290 | |
291 | extern ntfs_volume *ntfs_mount(const char *name, ntfs_mount_flags flags); |
292 | extern int ntfs_umount(ntfs_volume *vol, const BOOL force); |
293 | |
294 | extern int ntfs_version_is_supported(ntfs_volume *vol); |
295 | extern int ntfs_volume_check_hiberfile(ntfs_volume *vol, int verbose); |
296 | extern int ntfs_logfile_reset(ntfs_volume *vol); |
297 | |
298 | extern int ntfs_volume_write_flags(ntfs_volume *vol, const le16 flags); |
299 | |
300 | extern int ntfs_volume_error(int err); |
301 | extern void ntfs_mount_error(const char *vol, const char *mntpoint, int err); |
302 | |
303 | extern int ntfs_volume_get_free_space(ntfs_volume *vol); |
304 | extern int ntfs_volume_rename(ntfs_volume *vol, const ntfschar *label, |
305 | int label_len); |
306 | |
307 | extern int ntfs_set_shown_files(ntfs_volume *vol, |
308 | BOOL show_sys_files, BOOL show_hid_files, BOOL hide_dot_files); |
309 | extern int ntfs_set_locale(void); |
310 | extern int ntfs_set_ignore_case(ntfs_volume *vol); |
311 | |
312 | #endif /* defined _NTFS_VOLUME_H */ |
313 | |
314 |