1*9663SMark.Logan@Sun.COM /* 2*9663SMark.Logan@Sun.COM * volume.h - Exports for NTFS volume handling. Part of the Linux-NTFS project. 3*9663SMark.Logan@Sun.COM * 4*9663SMark.Logan@Sun.COM * Copyright (c) 2000-2004 Anton Altaparmakov 5*9663SMark.Logan@Sun.COM * Copyright (c) 2005-2007 Yura Pakhuchiy 6*9663SMark.Logan@Sun.COM * Copyright (c) 2004-2005 Richard Russon 7*9663SMark.Logan@Sun.COM * 8*9663SMark.Logan@Sun.COM * This program/include file is free software; you can redistribute it and/or 9*9663SMark.Logan@Sun.COM * modify it under the terms of the GNU General Public License as published 10*9663SMark.Logan@Sun.COM * by the Free Software Foundation; either version 2 of the License, or 11*9663SMark.Logan@Sun.COM * (at your option) any later version. 12*9663SMark.Logan@Sun.COM * 13*9663SMark.Logan@Sun.COM * This program/include file is distributed in the hope that it will be 14*9663SMark.Logan@Sun.COM * useful, but WITHOUT ANY WARRANTY; without even the implied warranty 15*9663SMark.Logan@Sun.COM * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*9663SMark.Logan@Sun.COM * GNU General Public License for more details. 17*9663SMark.Logan@Sun.COM * 18*9663SMark.Logan@Sun.COM * You should have received a copy of the GNU General Public License 19*9663SMark.Logan@Sun.COM * along with this program (in the main directory of the Linux-NTFS 20*9663SMark.Logan@Sun.COM * distribution in the file COPYING); if not, write to the Free Software 21*9663SMark.Logan@Sun.COM * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22*9663SMark.Logan@Sun.COM */ 23*9663SMark.Logan@Sun.COM 24*9663SMark.Logan@Sun.COM #ifndef _NTFS_VOLUME_H 25*9663SMark.Logan@Sun.COM #define _NTFS_VOLUME_H 26*9663SMark.Logan@Sun.COM 27*9663SMark.Logan@Sun.COM #ifdef HAVE_CONFIG_H 28*9663SMark.Logan@Sun.COM #include "config.h" 29*9663SMark.Logan@Sun.COM #endif 30*9663SMark.Logan@Sun.COM 31*9663SMark.Logan@Sun.COM #ifdef HAVE_STDIO_H 32*9663SMark.Logan@Sun.COM #include <stdio.h> 33*9663SMark.Logan@Sun.COM #endif 34*9663SMark.Logan@Sun.COM #ifdef HAVE_SYS_PARAM_H 35*9663SMark.Logan@Sun.COM #include <sys/param.h> 36*9663SMark.Logan@Sun.COM #endif 37*9663SMark.Logan@Sun.COM #ifdef HAVE_SYS_MOUNT_H 38*9663SMark.Logan@Sun.COM #include <sys/mount.h> 39*9663SMark.Logan@Sun.COM #endif 40*9663SMark.Logan@Sun.COM #ifdef HAVE_MNTENT_H 41*9663SMark.Logan@Sun.COM #include <mntent.h> 42*9663SMark.Logan@Sun.COM #endif 43*9663SMark.Logan@Sun.COM 44*9663SMark.Logan@Sun.COM /* Forward declaration */ 45*9663SMark.Logan@Sun.COM typedef struct _ntfs_volume ntfs_volume; 46*9663SMark.Logan@Sun.COM 47*9663SMark.Logan@Sun.COM #include "list.h" 48*9663SMark.Logan@Sun.COM #include "types.h" 49*9663SMark.Logan@Sun.COM #include "support.h" 50*9663SMark.Logan@Sun.COM #include "device.h" 51*9663SMark.Logan@Sun.COM #include "inode.h" 52*9663SMark.Logan@Sun.COM #include "attrib.h" 53*9663SMark.Logan@Sun.COM 54*9663SMark.Logan@Sun.COM /** 55*9663SMark.Logan@Sun.COM * enum ntfs_mount_flags - 56*9663SMark.Logan@Sun.COM * 57*9663SMark.Logan@Sun.COM * Flags for the ntfs_mount() function. 58*9663SMark.Logan@Sun.COM */ 59*9663SMark.Logan@Sun.COM typedef enum { 60*9663SMark.Logan@Sun.COM NTFS_MNT_RDONLY = 1, 61*9663SMark.Logan@Sun.COM NTFS_MNT_FORENSIC = 2, 62*9663SMark.Logan@Sun.COM NTFS_MNT_CASE_SENSITIVE = 4, 63*9663SMark.Logan@Sun.COM NTFS_MNT_NOT_EXCLUSIVE = 8, 64*9663SMark.Logan@Sun.COM NTFS_MNT_FORCE = 16, 65*9663SMark.Logan@Sun.COM NTFS_MNT_INTERIX = 32, 66*9663SMark.Logan@Sun.COM } ntfs_mount_flags; 67*9663SMark.Logan@Sun.COM 68*9663SMark.Logan@Sun.COM /** 69*9663SMark.Logan@Sun.COM * enum ntfs_mounted_flags - 70*9663SMark.Logan@Sun.COM * 71*9663SMark.Logan@Sun.COM * Flags returned by the ntfs_check_if_mounted() function. 72*9663SMark.Logan@Sun.COM */ 73*9663SMark.Logan@Sun.COM typedef enum { 74*9663SMark.Logan@Sun.COM NTFS_MF_MOUNTED = 1, /* Device is mounted. */ 75*9663SMark.Logan@Sun.COM NTFS_MF_ISROOT = 2, /* Device is mounted as system root. */ 76*9663SMark.Logan@Sun.COM NTFS_MF_READONLY = 4, /* Device is mounted read-only. */ 77*9663SMark.Logan@Sun.COM } ntfs_mounted_flags; 78*9663SMark.Logan@Sun.COM 79*9663SMark.Logan@Sun.COM extern int ntfs_check_if_mounted(const char *file, unsigned long *mnt_flags); 80*9663SMark.Logan@Sun.COM 81*9663SMark.Logan@Sun.COM /** 82*9663SMark.Logan@Sun.COM * enum ntfs_volume_state_bits - 83*9663SMark.Logan@Sun.COM * 84*9663SMark.Logan@Sun.COM * Defined bits for the state field in the ntfs_volume structure. 85*9663SMark.Logan@Sun.COM */ 86*9663SMark.Logan@Sun.COM typedef enum { 87*9663SMark.Logan@Sun.COM NV_ReadOnly, /* 1: Volume is read-only. */ 88*9663SMark.Logan@Sun.COM NV_CaseSensitive, /* 1: Volume is mounted case-sensitive. */ 89*9663SMark.Logan@Sun.COM NV_LogFileEmpty, /* 1: $logFile journal is empty. */ 90*9663SMark.Logan@Sun.COM NV_NoATime, /* 1: Do not update access time. */ 91*9663SMark.Logan@Sun.COM NV_WasDirty, /* 1: Volume was marked dirty before we mounted 92*9663SMark.Logan@Sun.COM it. */ 93*9663SMark.Logan@Sun.COM NV_ForensicMount, /* 1: Mount is forensic, i.e. no modifications 94*9663SMark.Logan@Sun.COM are to be done by mount/umount. */ 95*9663SMark.Logan@Sun.COM NV_Interix, /* 1: Make libntfs recognize Interix special 96*9663SMark.Logan@Sun.COM files. */ 97*9663SMark.Logan@Sun.COM } ntfs_volume_state_bits; 98*9663SMark.Logan@Sun.COM 99*9663SMark.Logan@Sun.COM #define test_nvol_flag(nv, flag) test_bit(NV_##flag, (nv)->state) 100*9663SMark.Logan@Sun.COM #define set_nvol_flag(nv, flag) set_bit(NV_##flag, (nv)->state) 101*9663SMark.Logan@Sun.COM #define clear_nvol_flag(nv, flag) clear_bit(NV_##flag, (nv)->state) 102*9663SMark.Logan@Sun.COM 103*9663SMark.Logan@Sun.COM #define NVolReadOnly(nv) test_nvol_flag(nv, ReadOnly) 104*9663SMark.Logan@Sun.COM #define NVolSetReadOnly(nv) set_nvol_flag(nv, ReadOnly) 105*9663SMark.Logan@Sun.COM #define NVolClearReadOnly(nv) clear_nvol_flag(nv, ReadOnly) 106*9663SMark.Logan@Sun.COM 107*9663SMark.Logan@Sun.COM #define NVolCaseSensitive(nv) test_nvol_flag(nv, CaseSensitive) 108*9663SMark.Logan@Sun.COM #define NVolSetCaseSensitive(nv) set_nvol_flag(nv, CaseSensitive) 109*9663SMark.Logan@Sun.COM #define NVolClearCaseSensitive(nv) clear_nvol_flag(nv, CaseSensitive) 110*9663SMark.Logan@Sun.COM 111*9663SMark.Logan@Sun.COM #define NVolLogFileEmpty(nv) test_nvol_flag(nv, LogFileEmpty) 112*9663SMark.Logan@Sun.COM #define NVolSetLogFileEmpty(nv) set_nvol_flag(nv, LogFileEmpty) 113*9663SMark.Logan@Sun.COM #define NVolClearLogFileEmpty(nv) clear_nvol_flag(nv, LogFileEmpty) 114*9663SMark.Logan@Sun.COM 115*9663SMark.Logan@Sun.COM #define NVolWasDirty(nv) test_nvol_flag(nv, WasDirty) 116*9663SMark.Logan@Sun.COM #define NVolSetWasDirty(nv) set_nvol_flag(nv, WasDirty) 117*9663SMark.Logan@Sun.COM #define NVolClearWasDirty(nv) clear_nvol_flag(nv, WasDirty) 118*9663SMark.Logan@Sun.COM 119*9663SMark.Logan@Sun.COM #define NVolForensicMount(nv) test_nvol_flag(nv, ForensicMount) 120*9663SMark.Logan@Sun.COM #define NVolSetForensicMount(nv) set_nvol_flag(nv, ForensicMount) 121*9663SMark.Logan@Sun.COM #define NVolClearForensicMount(nv) clear_nvol_flag(nv, ForensicMount) 122*9663SMark.Logan@Sun.COM 123*9663SMark.Logan@Sun.COM #define NVolInterix(nv) test_nvol_flag(nv, Interix) 124*9663SMark.Logan@Sun.COM #define NVolSetInterix(nv) set_nvol_flag(nv, Interix) 125*9663SMark.Logan@Sun.COM #define NVolClearInterix(nv) clear_nvol_flag(nv, Interix) 126*9663SMark.Logan@Sun.COM 127*9663SMark.Logan@Sun.COM /* 128*9663SMark.Logan@Sun.COM * NTFS version 1.1 and 1.2 are used by Windows NT4. 129*9663SMark.Logan@Sun.COM * NTFS version 2.x is used by Windows 2000 Beta 130*9663SMark.Logan@Sun.COM * NTFS version 3.0 is used by Windows 2000. 131*9663SMark.Logan@Sun.COM * NTFS version 3.1 is used by Windows XP, 2003 and Vista. 132*9663SMark.Logan@Sun.COM */ 133*9663SMark.Logan@Sun.COM 134*9663SMark.Logan@Sun.COM #define NTFS_V1_1(major, minor) ((major) == 1 && (minor) == 1) 135*9663SMark.Logan@Sun.COM #define NTFS_V1_2(major, minor) ((major) == 1 && (minor) == 2) 136*9663SMark.Logan@Sun.COM #define NTFS_V2_X(major, minor) ((major) == 2) 137*9663SMark.Logan@Sun.COM #define NTFS_V3_0(major, minor) ((major) == 3 && (minor) == 0) 138*9663SMark.Logan@Sun.COM #define NTFS_V3_1(major, minor) ((major) == 3 && (minor) == 1) 139*9663SMark.Logan@Sun.COM 140*9663SMark.Logan@Sun.COM #define NTFS_BUF_SIZE 8192 141*9663SMark.Logan@Sun.COM 142*9663SMark.Logan@Sun.COM #define NTFS_INODE_CACHE_SIZE 512 /* WARNING: This should be power of 2. */ 143*9663SMark.Logan@Sun.COM #define NTFS_INODE_CACHE_SIZE_BITS (NTFS_INODE_CACHE_SIZE - 1) 144*9663SMark.Logan@Sun.COM 145*9663SMark.Logan@Sun.COM /** 146*9663SMark.Logan@Sun.COM * struct _ntfs_volume - structure describing an open volume in memory. 147*9663SMark.Logan@Sun.COM */ 148*9663SMark.Logan@Sun.COM struct _ntfs_volume { 149*9663SMark.Logan@Sun.COM union { 150*9663SMark.Logan@Sun.COM struct ntfs_device *dev; /* NTFS device associated with 151*9663SMark.Logan@Sun.COM the volume. */ 152*9663SMark.Logan@Sun.COM void *sb; /* For kernel porting compatibility. */ 153*9663SMark.Logan@Sun.COM } u; 154*9663SMark.Logan@Sun.COM char *vol_name; /* Name of the volume. */ 155*9663SMark.Logan@Sun.COM unsigned long state; /* NTFS specific flags describing this volume. 156*9663SMark.Logan@Sun.COM See ntfs_volume_state_bits above. */ 157*9663SMark.Logan@Sun.COM 158*9663SMark.Logan@Sun.COM ntfs_inode *vol_ni; /* ntfs_inode structure for FILE_Volume. */ 159*9663SMark.Logan@Sun.COM u8 major_ver; /* Ntfs major version of volume. */ 160*9663SMark.Logan@Sun.COM u8 minor_ver; /* Ntfs minor version of volume. */ 161*9663SMark.Logan@Sun.COM le16 flags; /* Bit array of VOLUME_* flags. */ 162*9663SMark.Logan@Sun.COM GUID guid; /* The volume guid if present (otherwise it is 163*9663SMark.Logan@Sun.COM a NULL guid). */ 164*9663SMark.Logan@Sun.COM 165*9663SMark.Logan@Sun.COM u16 sector_size; /* Byte size of a sector. */ 166*9663SMark.Logan@Sun.COM u8 sector_size_bits; /* Log(2) of the byte size of a sector. */ 167*9663SMark.Logan@Sun.COM u32 cluster_size; /* Byte size of a cluster. */ 168*9663SMark.Logan@Sun.COM u32 mft_record_size; /* Byte size of a mft record. */ 169*9663SMark.Logan@Sun.COM u32 indx_record_size; /* Byte size of a INDX record. */ 170*9663SMark.Logan@Sun.COM u8 cluster_size_bits; /* Log(2) of the byte size of a cluster. */ 171*9663SMark.Logan@Sun.COM u8 mft_record_size_bits;/* Log(2) of the byte size of a mft record. */ 172*9663SMark.Logan@Sun.COM u8 indx_record_size_bits;/* Log(2) of the byte size of a INDX record. */ 173*9663SMark.Logan@Sun.COM 174*9663SMark.Logan@Sun.COM /* Variables used by the cluster and mft allocators. */ 175*9663SMark.Logan@Sun.COM u8 mft_zone_multiplier; /* Initial mft zone multiplier. */ 176*9663SMark.Logan@Sun.COM s64 mft_data_pos; /* Mft record number at which to allocate the 177*9663SMark.Logan@Sun.COM next mft record. */ 178*9663SMark.Logan@Sun.COM LCN mft_zone_start; /* First cluster of the mft zone. */ 179*9663SMark.Logan@Sun.COM LCN mft_zone_end; /* First cluster beyond the mft zone. */ 180*9663SMark.Logan@Sun.COM LCN mft_zone_pos; /* Current position in the mft zone. */ 181*9663SMark.Logan@Sun.COM LCN data1_zone_pos; /* Current position in the first data zone. */ 182*9663SMark.Logan@Sun.COM LCN data2_zone_pos; /* Current position in the second data zone. */ 183*9663SMark.Logan@Sun.COM 184*9663SMark.Logan@Sun.COM s64 nr_clusters; /* Volume size in clusters, hence also the 185*9663SMark.Logan@Sun.COM number of bits in lcn_bitmap. */ 186*9663SMark.Logan@Sun.COM ntfs_inode *lcnbmp_ni; /* ntfs_inode structure for FILE_Bitmap. */ 187*9663SMark.Logan@Sun.COM ntfs_attr *lcnbmp_na; /* ntfs_attr structure for the data attribute 188*9663SMark.Logan@Sun.COM of FILE_Bitmap. Each bit represents a 189*9663SMark.Logan@Sun.COM cluster on the volume, bit 0 representing 190*9663SMark.Logan@Sun.COM lcn 0 and so on. A set bit means that the 191*9663SMark.Logan@Sun.COM cluster and vice versa. */ 192*9663SMark.Logan@Sun.COM 193*9663SMark.Logan@Sun.COM LCN mft_lcn; /* Logical cluster number of the data attribute 194*9663SMark.Logan@Sun.COM for FILE_MFT. */ 195*9663SMark.Logan@Sun.COM ntfs_inode *mft_ni; /* ntfs_inode structure for FILE_MFT. */ 196*9663SMark.Logan@Sun.COM ntfs_attr *mft_na; /* ntfs_attr structure for the data attribute 197*9663SMark.Logan@Sun.COM of FILE_MFT. */ 198*9663SMark.Logan@Sun.COM ntfs_attr *mftbmp_na; /* ntfs_attr structure for the bitmap attribute 199*9663SMark.Logan@Sun.COM of FILE_MFT. Each bit represents an mft 200*9663SMark.Logan@Sun.COM record in the $DATA attribute, bit 0 201*9663SMark.Logan@Sun.COM representing mft record 0 and so on. A set 202*9663SMark.Logan@Sun.COM bit means that the mft record is in use and 203*9663SMark.Logan@Sun.COM vice versa. */ 204*9663SMark.Logan@Sun.COM 205*9663SMark.Logan@Sun.COM int mftmirr_size; /* Size of the FILE_MFTMirr in mft records. */ 206*9663SMark.Logan@Sun.COM LCN mftmirr_lcn; /* Logical cluster number of the data attribute 207*9663SMark.Logan@Sun.COM for FILE_MFTMirr. */ 208*9663SMark.Logan@Sun.COM ntfs_inode *mftmirr_ni; /* ntfs_inode structure for FILE_MFTMirr. */ 209*9663SMark.Logan@Sun.COM ntfs_attr *mftmirr_na; /* ntfs_attr structure for the data attribute 210*9663SMark.Logan@Sun.COM of FILE_MFTMirr. */ 211*9663SMark.Logan@Sun.COM 212*9663SMark.Logan@Sun.COM ntfschar *upcase; /* Upper case equivalents of all 65536 2-byte 213*9663SMark.Logan@Sun.COM Unicode characters. Obtained from 214*9663SMark.Logan@Sun.COM FILE_UpCase. */ 215*9663SMark.Logan@Sun.COM u32 upcase_len; /* Length in Unicode characters of the upcase 216*9663SMark.Logan@Sun.COM table. */ 217*9663SMark.Logan@Sun.COM 218*9663SMark.Logan@Sun.COM ATTR_DEF *attrdef; /* Attribute definitions. Obtained from 219*9663SMark.Logan@Sun.COM FILE_AttrDef. */ 220*9663SMark.Logan@Sun.COM s32 attrdef_len; /* Size of the attribute definition table in 221*9663SMark.Logan@Sun.COM bytes. */ 222*9663SMark.Logan@Sun.COM 223*9663SMark.Logan@Sun.COM long nr_free_clusters; /* This two are self explaining. */ 224*9663SMark.Logan@Sun.COM long nr_free_mft_records; 225*9663SMark.Logan@Sun.COM 226*9663SMark.Logan@Sun.COM struct list_head inode_cache[NTFS_INODE_CACHE_SIZE]; /* List of opened 227*9663SMark.Logan@Sun.COM inodes. */ 228*9663SMark.Logan@Sun.COM }; 229*9663SMark.Logan@Sun.COM 230*9663SMark.Logan@Sun.COM extern ntfs_volume *ntfs_volume_alloc(void); 231*9663SMark.Logan@Sun.COM 232*9663SMark.Logan@Sun.COM extern ntfs_volume *ntfs_volume_startup(struct ntfs_device *dev, 233*9663SMark.Logan@Sun.COM ntfs_mount_flags flags); 234*9663SMark.Logan@Sun.COM 235*9663SMark.Logan@Sun.COM extern ntfs_volume *ntfs_device_mount(struct ntfs_device *dev, 236*9663SMark.Logan@Sun.COM ntfs_mount_flags flags); 237*9663SMark.Logan@Sun.COM extern int ntfs_device_umount(ntfs_volume *vol, const BOOL force); 238*9663SMark.Logan@Sun.COM 239*9663SMark.Logan@Sun.COM extern ntfs_volume *ntfs_mount(const char *name, ntfs_mount_flags flags); 240*9663SMark.Logan@Sun.COM extern int ntfs_umount(ntfs_volume *vol, const BOOL force); 241*9663SMark.Logan@Sun.COM 242*9663SMark.Logan@Sun.COM extern int ntfs_version_is_supported(ntfs_volume *vol); 243*9663SMark.Logan@Sun.COM extern int ntfs_logfile_reset(ntfs_volume *vol); 244*9663SMark.Logan@Sun.COM 245*9663SMark.Logan@Sun.COM extern int ntfs_volume_write_flags(ntfs_volume *vol, const le16 flags); 246*9663SMark.Logan@Sun.COM 247*9663SMark.Logan@Sun.COM #endif /* defined _NTFS_VOLUME_H */ 248