176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright (C) 2011-2012 Paulo Alcantara <pcacjr@gmail.com> 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is free software; you can redistribute it and/or modify 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * it under the terms of the GNU General Public License as published by 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the Free Software Foundation; either version 2 of the License, or 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (at your option) any later version. 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is distributed in the hope that it will be useful, 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * but WITHOUT ANY WARRANTY; without even the implied warranty of 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * GNU General Public License for more details. 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * You should have received a copy of the GNU General Public License 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * along with this program; if not, write to the 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Free Software Foundation, Inc., 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "runlist.h" 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _NTFS_H_ 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _NTFS_H_ 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_bpb { 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t jmp_boot[3]; 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char oem_name[8]; 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t sector_size; 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t sec_per_clust; 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t res_sectors; 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t zero_0[3]; 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t zero_1; 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t media; 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t zero_2; 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t unused_0; 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t unused_1; 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t unused_2; 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t zero_3; 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t unused_3; 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t total_sectors; 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t mft_lclust; 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t mft_mirr_lclust; 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int8_t clust_per_mft_record; 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t unused_4[3]; 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t clust_per_idx_record; 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t unused_5[3]; 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t vol_serial; 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t unused_6; 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t pad[428]; /* padding to a sector boundary (512 bytes) */ 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Function type for an NTFS-version-dependent MFT record lookup */ 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_mft_record; 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct ntfs_mft_record *f_mft_record_lookup(struct fs_info *, 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t, block_t *); 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_sb_info { 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman block_t mft_blk; /* The first MFT record block */ 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t mft_lcn; /* LCN of the first MFT record */ 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned mft_size; /* The MFT size in sectors */ 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t mft_record_size; /* MFT record size in bytes */ 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t clust_per_idx_record; /* Clusters per Index Record */ 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned long long clusters; /* Total number of clusters */ 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned clust_shift; /* Based on sectors */ 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned clust_byte_shift; /* Based on bytes */ 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned clust_mask; 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned clust_size; 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t major_ver; /* Major version from $Volume */ 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t minor_ver; /* Minor version from $Volume */ 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* NTFS-version-dependent MFT record lookup function to use */ 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman f_mft_record_lookup *mft_record_lookup; 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* The NTFS in-memory inode structure */ 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_inode { 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t initialized_size; 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t allocated_size; 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned long mft_no; /* Number of the mft record / inode */ 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t seq_no; /* Sequence number of the mft record */ 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t type; /* Attribute type of this inode */ 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t non_resident; 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { /* Non-resident $DATA attribute */ 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { /* Used only if non_resident flags isn't set */ 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t offset; /* Data offset */ 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } resident; 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { /* Used only if non_resident is set */ 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct runlist *rlist; 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } non_resident; 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } data; 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t start_cluster; /* Starting cluster address */ 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sector_t start; /* Starting sector */ 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sector_t offset; /* Current sector offset */ 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sector_t here; /* Sector corresponding to offset */ 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* This is structure is used to keep a state for ntfs_readdir() callers. 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * As NTFS stores directory entries in a complex way, this is structure 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ends up saving a state required to find out where we must start from 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * for the next ntfs_readdir() call. 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_readdir_state { 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned long mft_no; /* MFT record number */ 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman bool in_idx_root; /* It's true if we're still in the INDEX root */ 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t idx_blks_count; /* Number of read INDX blocks */ 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t entries_count; /* Number of read INDEX entries */ 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t last_vcn; /* Last VCN of the INDX block */ 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum { 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman MAP_UNSPEC, 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman MAP_START = 1 << 0, 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman MAP_END = 1 << 1, 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman MAP_ALLOCATED = 1 << 2, 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman MAP_UNALLOCATED = 1 << 3, 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman MAP_MASK = 0x0000000F, 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct mapping_chunk { 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t vcn; 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t lcn; 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t len; 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t flags; 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* System defined attributes (32-bit) 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Each attribute type has a corresponding attribute name (in Unicode) 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum { 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_UNUSED = 0x00, 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_STANDARD_INFORMATION = 0x10, 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_ATTR_LIST = 0x20, 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_FILENAME = 0x30, 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_OBJ_ID = 0x40, 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_SECURITY_DESCP = 0x50, 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_VOL_NAME = 0x60, 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_VOL_INFO = 0x70, 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_DATA = 0x80, 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_INDEX_ROOT = 0x90, 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_INDEX_ALLOCATION = 0xA0, 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_BITMAP = 0xB0, 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_REPARSE_POINT = 0xC0, 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_EA_INFO = 0xD0, 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_EA = 0xE0, 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_PROPERTY_SET = 0xF0, 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_LOGGED_UTIL_STREAM = 0x100, 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_FIRST_USER_DEFINED_ATTR = 0x1000, 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_AT_END = 0xFFFFFFFF, 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* NTFS File Permissions (also called attributes in DOS terminology) */ 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum { 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_READONLY = 0x00000001, 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_HIDDEN = 0x00000002, 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_SYSTEM = 0x00000004, 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_DIRECTORY = 0x00000010, 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_ARCHIVE = 0x00000020, 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_DEVICE = 0x00000040, 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_NORMAL = 0x00000080, 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_TEMPORARY = 0x00000100, 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_SPARSE_FILE = 0x00000200, 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_REPARSE_POINT = 0x00000400, 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_COMPRESSED = 0x00000800, 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_OFFLINE = 0x00001000, 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_NOT_CONTENT_INDEXED = 0x00002000, 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_ENCRYPTED = 0x00004000, 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_VALID_FLAGS = 0x00007FB7, 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_VALID_SET_FLAGS = 0x000031A7, 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT = 0x10000000, 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_FILE_ATTR_DUP_VIEW_INDEX_PRESENT = 0x20000000, 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Magic identifiers present at the beginning of all ntfs record containing 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * records (like mft records for example). 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum { 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Found in $MFT/$DATA */ 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_MAGIC_FILE = 0x454C4946, /* MFT entry */ 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_MAGIC_INDX = 0x58444E49, /* Index buffer */ 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_MAGIC_HOLE = 0x454C4F48, 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Found in $LogFile/$DATA */ 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_MAGIC_RSTR = 0x52545352, 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_MAGIC_RCRD = 0x44524352, 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Found in $LogFile/$DATA (May be found in $MFT/$DATA, also ?) */ 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_MAGIC_CHKDSK = 0x444B4843, 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Found in all ntfs record containing records. */ 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_MAGIC_BAAD = 0x44414142, 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NTFS_MAGIC_EMPTY = 0xFFFFFFFF, /* Record is empty */ 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_record { 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t magic; 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t usa_ofs; 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t usa_count; 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)) NTFS_RECORD; 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* The $MFT metadata file types */ 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum ntfs_system_file { 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_MFT = 0, 20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_MFTMirr = 1, 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_LogFile = 2, 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_Volume = 3, 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_AttrDef = 4, 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_root = 5, 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_Bitmap = 6, 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_Boot = 7, 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_BadClus = 8, 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_Secure = 9, 21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_UpCase = 10, 21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_Extend = 11, 21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_reserved12 = 12, 21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_reserved13 = 13, 22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_reserved14 = 14, 22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_reserved15 = 15, 22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_reserved16 = 16, 22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum { 22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman MFT_RECORD_IN_USE = 0x0001, 22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman MFT_RECORD_IS_DIRECTORY = 0x0002, 22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_mft_record { 23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t magic; 23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t usa_ofs; 23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t usa_count; 23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t lsn; 23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t seq_no; 23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t link_count; 23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t attrs_offset; 23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t flags; /* MFT record flags */ 23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t bytes_in_use; 24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t bytes_allocated; 24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t base_mft_record; 24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t next_attr_instance; 24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t reserved; 24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t mft_record_no; 24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); /* 48 bytes */ 24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* This is the version without the NTFS 3.1+ specific fields */ 24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_mft_record_old { 24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t magic; 25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t usa_ofs; 25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t usa_count; 25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t lsn; 25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t seq_no; 25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t link_count; 25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t attrs_offset; 25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t flags; /* MFT record flags */ 25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t bytes_in_use; 25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t bytes_allocated; 25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t base_mft_record; 26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t next_attr_instance; 26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); /* 42 bytes */ 26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum { 26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ATTR_DEF_INDEXABLE = 0x02, 26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ATTR_DEF_MULTIPLE = 0x04, 26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ATTR_DEF_NOT_ZERO = 0x08, 26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ATTR_DEF_INDEXED_UNIQUE = 0x10, 26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ATTR_DEF_NAMED_UNIQUE = 0x20, 26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ATTR_DEF_RESIDENT = 0x40, 27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ATTR_DEF_ALWAYS_LOG = 0x80, 27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_attr_record { 27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t type; /* Attr. type code */ 27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t len; 27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t non_resident; 27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t name_len; 27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t name_offset; 27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t flags; /* Attr. flags */ 28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t instance; 28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { /* Resident attribute */ 28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t value_len; 28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t value_offset; 28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t flags; /* Flags of resident attributes */ 28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int8_t reserved; 28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) resident; 28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { /* Non-resident attributes */ 28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t lowest_vcn; 29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t highest_vcn; 29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t mapping_pairs_offset; 29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t compression_unit; 29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved[5]; 29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t allocated_size; 29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t data_size; /* Byte size of the attribute value. 29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note: it can be larger than 29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * allocated_size if attribute value is 29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * compressed or sparse. 29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t initialized_size; 30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t compressed_size; 30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) non_resident; 30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) data; 30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Attribute: Attribute List (0x20) 30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note: it can be either resident or non-resident 30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_attr_list_entry { 31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t type; 31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t length; 31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t name_length; 31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t name_offset; 31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t lowest_vcn; 31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t mft_ref; 31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t instance; 31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t name[0]; 31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define NTFS_MAX_FILE_NAME_LEN 255 32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Possible namespaces for filenames in ntfs (8-bit) */ 32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum { 32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_NAME_POSIX = 0x00, 32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_NAME_WIN32 = 0x01, 32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_NAME_DOS = 0x02, 32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FILE_NAME_WIN32_AND_DOS = 0x03, 32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Attribute: Filename (0x30) 33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note: always resident 33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_filename_attr { 33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t parent_directory; 33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t ctime; 33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t atime; 33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t mtime; 33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t rtime; 33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t allocated_size; 34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t data_size; 34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t file_attrs; 34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { 34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t packed_ea_size; 34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t reserved; /* reserved for alignment */ 34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) ea; 34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { 34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t reparse_point_tag; 34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) rp; 35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) type; 35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t file_name_len; 35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t file_name_type; 35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t file_name[0]; /* File name in Unicode */ 35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Attribute: Volume Name (0x60) 35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note: always resident 35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note: Present only in FILE_volume 35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_vol_name { 36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t name[0]; /* The name of the volume in Unicode */ 36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Attribute: Volume Information (0x70) 36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note: always resident 36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note: present only in FILE_Volume 36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_vol_info { 36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t reserved; 37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t major_ver; 37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t minor_ver; 37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t flags; /* Volume flags */ 37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Attribute: Data attribute (0x80) 37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note: can be either resident or non-resident 37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_data_attr { 37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t data[0]; 38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Index header flags (8-bit) */ 38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum { 38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman SMALL_INDEX = 0, 38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman LARGE_INDEX = 1, 38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman LEAF_NODE = 0, 38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman INDEX_NODE = 1, 38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman NODE_MASK = 1, 38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Header for the indexes, describing the INDEX_ENTRY records, which 39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * follow the struct ntfs_idx_header. 39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_idx_header { 39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t entries_offset; 39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t index_len; 39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t allocated_size; 39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t flags; /* Index header flags */ 39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved[3]; /* Align to 8-byte boundary */ 40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Attribute: Index Root (0x90) 40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note: always resident 40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_idx_root { 40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t type; /* It is $FILE_NAME for directories, zero for view indexes. 40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * No other values allowed. 40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t collation_rule; 41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t index_block_size; 41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t clust_per_index_block; 41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved[3]; 41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ntfs_idx_header index; 41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Attribute: Index allocation (0xA0) 41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note: always non-resident, of course! :-) 41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_idx_allocation { 42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t magic; 42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t usa_ofs; /* Update Sequence Array offsets */ 42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t usa_count; /* Update Sequence Array number in bytes */ 42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t lsn; 42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int64_t index_block_vcn; /* Virtual cluster number of the index block */ 42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ntfs_idx_header index; 42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum { 42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman INDEX_ENTRY_NODE = 1, 43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman INDEX_ENTRY_END = 2, 43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* force enum bit width to 16-bit */ 43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman INDEX_ENTRY_SPACE_FILTER = 0xFFFF, 43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_idx_entry_header { 43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { /* Only valid when INDEX_ENTRY_END is not set */ 43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t indexed_file; 43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) dir; 44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { /* Used for views/indexes to find the entry's data */ 44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t data_offset; 44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t data_len; 44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t reservedV; 44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) vi; 44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) data; 44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t len; 44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t key_len; 44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t flags; /* Index entry flags */ 44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t reserved; /* Align to 8-byte boundary */ 45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ntfs_idx_entry { 45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { /* Only valid when INDEX_ENTRY_END is not set */ 45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t indexed_file; 45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) dir; 45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct { /* Used for views/indexes to find the entry's data */ 45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t data_offset; 45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t data_len; 46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t reservedV; 46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) vi; 46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) data; 46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t len; 46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t key_len; 46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t flags; /* Index entry flags */ 46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t reserved; /* Align to 8-byte boundary */ 46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ntfs_filename_attr file_name; 46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //SII_INDEX_KEY sii; 47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //SDH_INDEX_KEY sdh; 47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //GUID object_id; 47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //REPARSE_INDEX_KEY reparse; 47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman //SID sid; 47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t owner_id; 47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } __attribute__((__packed__)) key; 47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((__packed__)); 47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline struct ntfs_sb_info *NTFS_SB(struct fs_info *fs) 47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return fs->fs_info; 48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define NTFS_PVT(i) ((struct ntfs_inode *)((i)->pvt)) 48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* _NTFS_H_ */ 486