blob: bb15f0f31568129273b4e7fbd7ef835d45ca7bd4
1 | /* |
2 | * mft.h - Exports for MFT record handling. Originated from the Linux-NTFS project. |
3 | * |
4 | * Copyright (c) 2000-2002 Anton Altaparmakov |
5 | * Copyright (c) 2004-2005 Richard Russon |
6 | * Copyright (c) 2006-2008 Szabolcs Szakacsits |
7 | * |
8 | * This program/include file is free software; you can redistribute it and/or |
9 | * modify it under the terms of the GNU General Public License as published |
10 | * by the Free Software Foundation; either version 2 of the License, or |
11 | * (at your option) any later version. |
12 | * |
13 | * This program/include file is distributed in the hope that it will be |
14 | * useful, but WITHOUT ANY WARRANTY; without even the implied warranty |
15 | * of 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 General Public License |
19 | * along with this program (in the main directory of the NTFS-3G |
20 | * distribution in the file COPYING); if not, write to the Free Software |
21 | * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
22 | */ |
23 | |
24 | #ifndef _NTFS_MFT_H |
25 | #define _NTFS_MFT_H |
26 | |
27 | #include "volume.h" |
28 | #include "inode.h" |
29 | #include "layout.h" |
30 | #include "logging.h" |
31 | |
32 | extern int ntfs_mft_records_read(const ntfs_volume *vol, const MFT_REF mref, |
33 | const s64 count, MFT_RECORD *b); |
34 | |
35 | /** |
36 | * ntfs_mft_record_read - read a record from the mft |
37 | * @vol: volume to read from |
38 | * @mref: mft record number to read |
39 | * @b: output data buffer |
40 | * |
41 | * Read the mft record specified by @mref from volume @vol into buffer @b. |
42 | * Return 0 on success or -1 on error, with errno set to the error code. |
43 | * |
44 | * The read mft record is mst deprotected and is hence ready to use. The caller |
45 | * should check the record with is_baad_record() in case mst deprotection |
46 | * failed. |
47 | * |
48 | * NOTE: @b has to be at least of size vol->mft_record_size. |
49 | */ |
50 | static __inline__ int ntfs_mft_record_read(const ntfs_volume *vol, |
51 | const MFT_REF mref, MFT_RECORD *b) |
52 | { |
53 | int ret; |
54 | |
55 | ntfs_log_enter("Entering for inode %lld\n", (long long)MREF(mref)); |
56 | ret = ntfs_mft_records_read(vol, mref, 1, b); |
57 | ntfs_log_leave("\n"); |
58 | return ret; |
59 | } |
60 | |
61 | extern int ntfs_mft_record_check(const ntfs_volume *vol, const MFT_REF mref, |
62 | MFT_RECORD *m); |
63 | |
64 | extern int ntfs_file_record_read(const ntfs_volume *vol, const MFT_REF mref, |
65 | MFT_RECORD **mrec, ATTR_RECORD **attr); |
66 | |
67 | extern int ntfs_mft_records_write(const ntfs_volume *vol, const MFT_REF mref, |
68 | const s64 count, MFT_RECORD *b); |
69 | |
70 | /** |
71 | * ntfs_mft_record_write - write an mft record to disk |
72 | * @vol: volume to write to |
73 | * @mref: mft record number to write |
74 | * @b: data buffer containing the mft record to write |
75 | * |
76 | * Write the mft record specified by @mref from buffer @b to volume @vol. |
77 | * Return 0 on success or -1 on error, with errno set to the error code. |
78 | * |
79 | * Before the mft record is written, it is mst protected. After the write, it |
80 | * is deprotected again, thus resulting in an increase in the update sequence |
81 | * number inside the buffer @b. |
82 | * |
83 | * NOTE: @b has to be at least of size vol->mft_record_size. |
84 | */ |
85 | static __inline__ int ntfs_mft_record_write(const ntfs_volume *vol, |
86 | const MFT_REF mref, MFT_RECORD *b) |
87 | { |
88 | int ret; |
89 | |
90 | ntfs_log_enter("Entering for inode %lld\n", (long long)MREF(mref)); |
91 | ret = ntfs_mft_records_write(vol, mref, 1, b); |
92 | ntfs_log_leave("\n"); |
93 | return ret; |
94 | } |
95 | |
96 | /** |
97 | * ntfs_mft_record_get_data_size - return number of bytes used in mft record @b |
98 | * @m: mft record to get the data size of |
99 | * |
100 | * Takes the mft record @m and returns the number of bytes used in the record |
101 | * or 0 on error (i.e. @m is not a valid mft record). Zero is not a valid size |
102 | * for an mft record as it at least has to have the MFT_RECORD itself and a |
103 | * zero length attribute of type AT_END, thus making the minimum size 56 bytes. |
104 | * |
105 | * Aside: The size is independent of NTFS versions 1.x/3.x because the 8-byte |
106 | * alignment of the first attribute mask the difference in MFT_RECORD size |
107 | * between NTFS 1.x and 3.x. Also, you would expect every mft record to |
108 | * contain an update sequence array as well but that could in theory be |
109 | * non-existent (don't know if Windows' NTFS driver/chkdsk wouldn't view this |
110 | * as corruption in itself though). |
111 | */ |
112 | static __inline__ u32 ntfs_mft_record_get_data_size(const MFT_RECORD *m) |
113 | { |
114 | if (!m || !ntfs_is_mft_record(m->magic)) |
115 | return 0; |
116 | /* Get the number of used bytes and return it. */ |
117 | return le32_to_cpu(m->bytes_in_use); |
118 | } |
119 | |
120 | extern int ntfs_mft_record_layout(const ntfs_volume *vol, const MFT_REF mref, |
121 | MFT_RECORD *mrec); |
122 | |
123 | extern int ntfs_mft_record_format(const ntfs_volume *vol, const MFT_REF mref); |
124 | |
125 | extern ntfs_inode *ntfs_mft_record_alloc(ntfs_volume *vol, ntfs_inode *base_ni); |
126 | |
127 | extern int ntfs_mft_record_free(ntfs_volume *vol, ntfs_inode *ni); |
128 | |
129 | extern int ntfs_mft_usn_dec(MFT_RECORD *mrec); |
130 | |
131 | #endif /* defined _NTFS_MFT_H */ |
132 | |
133 |