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