1987da915Sopenharmony_ci/* 2987da915Sopenharmony_ci * mft.h - Exports for MFT record handling. Originated from the Linux-NTFS project. 3987da915Sopenharmony_ci * 4987da915Sopenharmony_ci * Copyright (c) 2000-2002 Anton Altaparmakov 5987da915Sopenharmony_ci * Copyright (c) 2004-2005 Richard Russon 6987da915Sopenharmony_ci * Copyright (c) 2006-2008 Szabolcs Szakacsits 7987da915Sopenharmony_ci * 8987da915Sopenharmony_ci * This program/include file is free software; you can redistribute it and/or 9987da915Sopenharmony_ci * modify it under the terms of the GNU General Public License as published 10987da915Sopenharmony_ci * by the Free Software Foundation; either version 2 of the License, or 11987da915Sopenharmony_ci * (at your option) any later version. 12987da915Sopenharmony_ci * 13987da915Sopenharmony_ci * This program/include file is distributed in the hope that it will be 14987da915Sopenharmony_ci * useful, but WITHOUT ANY WARRANTY; without even the implied warranty 15987da915Sopenharmony_ci * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16987da915Sopenharmony_ci * GNU General Public License for more details. 17987da915Sopenharmony_ci * 18987da915Sopenharmony_ci * You should have received a copy of the GNU General Public License 19987da915Sopenharmony_ci * along with this program (in the main directory of the NTFS-3G 20987da915Sopenharmony_ci * distribution in the file COPYING); if not, write to the Free Software 21987da915Sopenharmony_ci * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22987da915Sopenharmony_ci */ 23987da915Sopenharmony_ci 24987da915Sopenharmony_ci#ifndef _NTFS_MFT_H 25987da915Sopenharmony_ci#define _NTFS_MFT_H 26987da915Sopenharmony_ci 27987da915Sopenharmony_ci#include "volume.h" 28987da915Sopenharmony_ci#include "inode.h" 29987da915Sopenharmony_ci#include "layout.h" 30987da915Sopenharmony_ci#include "logging.h" 31987da915Sopenharmony_ci 32987da915Sopenharmony_ciextern int ntfs_mft_records_read(const ntfs_volume *vol, const MFT_REF mref, 33987da915Sopenharmony_ci const s64 count, MFT_RECORD *b); 34987da915Sopenharmony_ci 35987da915Sopenharmony_ci/** 36987da915Sopenharmony_ci * ntfs_mft_record_read - read a record from the mft 37987da915Sopenharmony_ci * @vol: volume to read from 38987da915Sopenharmony_ci * @mref: mft record number to read 39987da915Sopenharmony_ci * @b: output data buffer 40987da915Sopenharmony_ci * 41987da915Sopenharmony_ci * Read the mft record specified by @mref from volume @vol into buffer @b. 42987da915Sopenharmony_ci * Return 0 on success or -1 on error, with errno set to the error code. 43987da915Sopenharmony_ci * 44987da915Sopenharmony_ci * The read mft record is mst deprotected and is hence ready to use. The caller 45987da915Sopenharmony_ci * should check the record with is_baad_record() in case mst deprotection 46987da915Sopenharmony_ci * failed. 47987da915Sopenharmony_ci * 48987da915Sopenharmony_ci * NOTE: @b has to be at least of size vol->mft_record_size. 49987da915Sopenharmony_ci */ 50987da915Sopenharmony_cistatic __inline__ int ntfs_mft_record_read(const ntfs_volume *vol, 51987da915Sopenharmony_ci const MFT_REF mref, MFT_RECORD *b) 52987da915Sopenharmony_ci{ 53987da915Sopenharmony_ci int ret; 54987da915Sopenharmony_ci 55987da915Sopenharmony_ci ntfs_log_enter("Entering for inode %lld\n", (long long)MREF(mref)); 56987da915Sopenharmony_ci ret = ntfs_mft_records_read(vol, mref, 1, b); 57987da915Sopenharmony_ci ntfs_log_leave("\n"); 58987da915Sopenharmony_ci return ret; 59987da915Sopenharmony_ci} 60987da915Sopenharmony_ci 61987da915Sopenharmony_ciextern int ntfs_mft_record_check(const ntfs_volume *vol, const MFT_REF mref, 62987da915Sopenharmony_ci MFT_RECORD *m); 63987da915Sopenharmony_ci 64987da915Sopenharmony_ciextern int ntfs_file_record_read(const ntfs_volume *vol, const MFT_REF mref, 65987da915Sopenharmony_ci MFT_RECORD **mrec, ATTR_RECORD **attr); 66987da915Sopenharmony_ci 67987da915Sopenharmony_ciextern int ntfs_mft_records_write(const ntfs_volume *vol, const MFT_REF mref, 68987da915Sopenharmony_ci const s64 count, MFT_RECORD *b); 69987da915Sopenharmony_ci 70987da915Sopenharmony_ci/** 71987da915Sopenharmony_ci * ntfs_mft_record_write - write an mft record to disk 72987da915Sopenharmony_ci * @vol: volume to write to 73987da915Sopenharmony_ci * @mref: mft record number to write 74987da915Sopenharmony_ci * @b: data buffer containing the mft record to write 75987da915Sopenharmony_ci * 76987da915Sopenharmony_ci * Write the mft record specified by @mref from buffer @b to volume @vol. 77987da915Sopenharmony_ci * Return 0 on success or -1 on error, with errno set to the error code. 78987da915Sopenharmony_ci * 79987da915Sopenharmony_ci * Before the mft record is written, it is mst protected. After the write, it 80987da915Sopenharmony_ci * is deprotected again, thus resulting in an increase in the update sequence 81987da915Sopenharmony_ci * number inside the buffer @b. 82987da915Sopenharmony_ci * 83987da915Sopenharmony_ci * NOTE: @b has to be at least of size vol->mft_record_size. 84987da915Sopenharmony_ci */ 85987da915Sopenharmony_cistatic __inline__ int ntfs_mft_record_write(const ntfs_volume *vol, 86987da915Sopenharmony_ci const MFT_REF mref, MFT_RECORD *b) 87987da915Sopenharmony_ci{ 88987da915Sopenharmony_ci int ret; 89987da915Sopenharmony_ci 90987da915Sopenharmony_ci ntfs_log_enter("Entering for inode %lld\n", (long long)MREF(mref)); 91987da915Sopenharmony_ci ret = ntfs_mft_records_write(vol, mref, 1, b); 92987da915Sopenharmony_ci ntfs_log_leave("\n"); 93987da915Sopenharmony_ci return ret; 94987da915Sopenharmony_ci} 95987da915Sopenharmony_ci 96987da915Sopenharmony_ci/** 97987da915Sopenharmony_ci * ntfs_mft_record_get_data_size - return number of bytes used in mft record @b 98987da915Sopenharmony_ci * @m: mft record to get the data size of 99987da915Sopenharmony_ci * 100987da915Sopenharmony_ci * Takes the mft record @m and returns the number of bytes used in the record 101987da915Sopenharmony_ci * or 0 on error (i.e. @m is not a valid mft record). Zero is not a valid size 102987da915Sopenharmony_ci * for an mft record as it at least has to have the MFT_RECORD itself and a 103987da915Sopenharmony_ci * zero length attribute of type AT_END, thus making the minimum size 56 bytes. 104987da915Sopenharmony_ci * 105987da915Sopenharmony_ci * Aside: The size is independent of NTFS versions 1.x/3.x because the 8-byte 106987da915Sopenharmony_ci * alignment of the first attribute mask the difference in MFT_RECORD size 107987da915Sopenharmony_ci * between NTFS 1.x and 3.x. Also, you would expect every mft record to 108987da915Sopenharmony_ci * contain an update sequence array as well but that could in theory be 109987da915Sopenharmony_ci * non-existent (don't know if Windows' NTFS driver/chkdsk wouldn't view this 110987da915Sopenharmony_ci * as corruption in itself though). 111987da915Sopenharmony_ci */ 112987da915Sopenharmony_cistatic __inline__ u32 ntfs_mft_record_get_data_size(const MFT_RECORD *m) 113987da915Sopenharmony_ci{ 114987da915Sopenharmony_ci if (!m || !ntfs_is_mft_record(m->magic)) 115987da915Sopenharmony_ci return 0; 116987da915Sopenharmony_ci /* Get the number of used bytes and return it. */ 117987da915Sopenharmony_ci return le32_to_cpu(m->bytes_in_use); 118987da915Sopenharmony_ci} 119987da915Sopenharmony_ci 120987da915Sopenharmony_ciextern int ntfs_mft_record_layout(const ntfs_volume *vol, const MFT_REF mref, 121987da915Sopenharmony_ci MFT_RECORD *mrec); 122987da915Sopenharmony_ci 123987da915Sopenharmony_ciextern int ntfs_mft_record_format(const ntfs_volume *vol, const MFT_REF mref); 124987da915Sopenharmony_ci 125987da915Sopenharmony_ciextern ntfs_inode *ntfs_mft_record_alloc(ntfs_volume *vol, ntfs_inode *base_ni); 126987da915Sopenharmony_ci 127987da915Sopenharmony_ciextern ntfs_inode *ntfs_mft_rec_alloc(ntfs_volume *vol, BOOL mft_data); 128987da915Sopenharmony_ci 129987da915Sopenharmony_ciextern int ntfs_mft_record_free(ntfs_volume *vol, ntfs_inode *ni); 130987da915Sopenharmony_ci 131987da915Sopenharmony_ciextern int ntfs_mft_usn_dec(MFT_RECORD *mrec); 132987da915Sopenharmony_ci 133987da915Sopenharmony_ci#endif /* defined _NTFS_MFT_H */ 134987da915Sopenharmony_ci 135