Home | History | Annotate | Line # | Download | only in ntfs
      1 /*	$NetBSD: ntfs.h,v 1.21 2014/12/28 12:19:21 maxv Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 1998, 1999 Semen Ustimenko
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  *
     28  *	Id: ntfs.h,v 1.5 1999/05/12 09:42:51 semenu Exp
     29  */
     30 
     31 #ifndef _NTFS_NTFS_H_
     32 #define _NTFS_NTFS_H_
     33 
     34 #if defined(_KERNEL_OPT)
     35 #include "opt_ntfs.h"
     36 #endif
     37 
     38 typedef u_int64_t cn_t;
     39 typedef u_int16_t wchar;
     40 
     41 #pragma pack(1)
     42 #define BBSIZE			1024
     43 #define	BBOFF			((off_t)(0))
     44 #define	BBLOCK			((daddr_t)(0))
     45 #define	NTFS_MFTINO		0
     46 #define	NTFS_VOLUMEINO		3
     47 #define	NTFS_ATTRDEFINO		4
     48 #define	NTFS_ROOTINO		5
     49 #define	NTFS_BITMAPINO		6
     50 #define	NTFS_BOOTINO		7
     51 #define	NTFS_BADCLUSINO		8
     52 #define	NTFS_UPCASEINO		10
     53 #define NTFS_MAXFILENAME	255
     54 
     55 struct fixuphdr {
     56 	u_int32_t       fh_magic;
     57 	u_int16_t       fh_foff;
     58 	u_int16_t       fh_fnum;
     59 };
     60 
     61 #define NTFS_AF_INRUN	0x00000001
     62 struct attrhdr {
     63 	u_int32_t       a_type;
     64 	u_int32_t       reclen;
     65 	u_int8_t        a_flag;
     66 	u_int8_t        a_namelen;
     67 	u_int8_t        a_nameoff;
     68 	u_int8_t        reserved1;
     69 	u_int8_t        a_compression;
     70 	u_int8_t        reserved2;
     71 	u_int16_t       a_index;
     72 };
     73 #define NTFS_A_STD	0x10
     74 #define NTFS_A_ATTRLIST	0x20
     75 #define NTFS_A_NAME	0x30
     76 #define NTFS_A_VOLUMENAME	0x60
     77 #define NTFS_A_DATA	0x80
     78 #define	NTFS_A_INDXROOT	0x90
     79 #define	NTFS_A_INDX	0xA0
     80 #define NTFS_A_INDXBITMAP 0xB0
     81 
     82 #define NTFS_MAXATTRNAME	255
     83 struct attr {
     84 	struct attrhdr  a_hdr;
     85 	union {
     86 		struct {
     87 			u_int16_t       a_datalen;
     88 			u_int16_t       reserved1;
     89 			u_int16_t       a_dataoff;
     90 			u_int16_t       a_indexed;
     91 		}               a_S_r;
     92 		struct {
     93 			cn_t            a_vcnstart;
     94 			cn_t            a_vcnend;
     95 			u_int16_t       a_dataoff;
     96 			u_int16_t       a_compressalg;
     97 			u_int32_t       reserved1;
     98 			u_int64_t       a_allocated;
     99 			u_int64_t       a_datalen;
    100 			u_int64_t       a_initialized;
    101 		}               a_S_nr;
    102 	}               a_S;
    103 };
    104 #define a_r	a_S.a_S_r
    105 #define a_nr	a_S.a_S_nr
    106 
    107 typedef struct {
    108 	u_int64_t       t_create;
    109 	u_int64_t       t_write;
    110 	u_int64_t       t_mftwrite;
    111 	u_int64_t       t_access;
    112 }               ntfs_times_t;
    113 
    114 #define NTFS_FFLAG_RDONLY	0x01LL
    115 #define NTFS_FFLAG_HIDDEN	0x02LL
    116 #define NTFS_FFLAG_SYSTEM	0x04LL
    117 #define NTFS_FFLAG_ARCHIVE	0x20LL
    118 #define NTFS_FFLAG_COMPRESSED	0x0800LL
    119 #define NTFS_FFLAG_DIR		0x10000000LL
    120 
    121 struct attr_name {
    122 	u_int32_t       n_pnumber;	/* Parent ntnode */
    123 	u_int32_t       reserved;
    124 	ntfs_times_t    n_times;
    125 	u_int64_t       n_size;
    126 	u_int64_t       n_attrsz;
    127 	u_int64_t       n_flag;
    128 	u_int8_t        n_namelen;
    129 	u_int8_t        n_nametype;
    130 	u_int16_t       n_name[1];
    131 };
    132 
    133 #define NTFS_IRFLAG_INDXALLOC	0x00000001
    134 struct attr_indexroot {
    135 	u_int32_t       ir_unkn1;	/* always 0x30 */
    136 	u_int32_t       ir_unkn2;	/* always 0x1 */
    137 	u_int32_t       ir_size;/* ??? */
    138 	u_int32_t       ir_unkn3;	/* number of cluster */
    139 	u_int32_t       ir_unkn4;	/* always 0x10 */
    140 	u_int32_t       ir_datalen;	/* sizeof simething */
    141 	u_int32_t       ir_allocated;	/* same as above */
    142 	u_int16_t       ir_flag;/* ?? always 1 */
    143 	u_int16_t       ir_unkn7;
    144 };
    145 
    146 struct attr_attrlist {
    147 	u_int32_t       al_type;	/* Attribute type */
    148 	u_int16_t       reclen;		/* length of this entry */
    149 	u_int8_t        al_namelen;	/* Attribute name len */
    150 	u_int8_t        al_nameoff;	/* Name offset from entry start */
    151 	u_int64_t       al_vcnstart;	/* VCN number */
    152 	u_int32_t       al_inumber;	/* Parent ntnode */
    153 	u_int32_t       reserved;
    154 	u_int16_t       al_index;	/* Attribute index in MFT record */
    155 	u_int16_t       al_name[1];	/* Name */
    156 };
    157 
    158 #define	NTFS_INDXMAGIC	(u_int32_t)(0x58444E49)
    159 struct attr_indexalloc {
    160 	struct fixuphdr ia_fixup;
    161 	u_int64_t       unknown1;
    162 	cn_t            ia_bufcn;
    163 	u_int16_t       ia_hdrsize;
    164 	u_int16_t       unknown2;
    165 	u_int32_t       ia_inuse;
    166 	u_int32_t       ia_allocated;
    167 };
    168 
    169 #define	NTFS_IEFLAG_SUBNODE	0x00000001
    170 #define	NTFS_IEFLAG_LAST	0x00000002
    171 
    172 struct attr_indexentry {
    173 	u_int32_t       ie_number;
    174 	u_int32_t       unknown1;
    175 	u_int16_t       reclen;
    176 	u_int16_t       ie_size;
    177 	u_int32_t       ie_flag;/* 1 - has subnodes, 2 - last */
    178 	u_int32_t       ie_fpnumber;
    179 	u_int32_t       unknown2;
    180 	ntfs_times_t    ie_ftimes;
    181 	u_int64_t       ie_fallocated;
    182 	u_int64_t       ie_fsize;
    183 	u_int64_t       ie_fflag;
    184 	u_int8_t        ie_fnamelen;
    185 	u_int8_t        ie_fnametype;
    186 	wchar           ie_fname[NTFS_MAXFILENAME];
    187 	/* cn_t		ie_bufcn;	 buffer with subnodes */
    188 };
    189 
    190 #define	NTFS_FILEMAGIC	(u_int32_t)(0x454C4946)
    191 #define	NTFS_FRFLAG_DIR	0x0002
    192 struct filerec {
    193 	struct fixuphdr fr_fixup;
    194 	u_int8_t        reserved[8];
    195 	u_int16_t       fr_seqnum;	/* Sequence number */
    196 	u_int16_t       fr_nlink;
    197 	u_int16_t       fr_attroff;	/* offset to attributes */
    198 	u_int16_t       fr_flags;	/* 1-nonresident attr, 2-directory */
    199 	u_int32_t       fr_size;/* hdr + attributes */
    200 	u_int32_t       fr_allocated;	/* allocated length of record */
    201 	u_int64_t       fr_mainrec;	/* main record */
    202 	u_int16_t       fr_attrnum;	/* maximum attr number + 1 ??? */
    203 };
    204 
    205 #define	NTFS_ATTRNAME_MAXLEN	0x40
    206 #define	NTFS_ADFLAG_NONRES	0x0080	/* Attrib can be non resident */
    207 #define	NTFS_ADFLAG_INDEX	0x0002	/* Attrib can be indexed */
    208 struct attrdef {
    209 	wchar		ad_name[NTFS_ATTRNAME_MAXLEN];
    210 	u_int32_t	ad_type;
    211 	u_int32_t	reserved1[2];
    212 	u_int32_t	ad_flag;
    213 	u_int64_t	ad_minlen;
    214 	u_int64_t	ad_maxlen;	/* -1 for nonlimited */
    215 };
    216 
    217 struct ntvattrdef {
    218 	char		ad_name[0x40];
    219 	int		ad_namelen;
    220 	u_int32_t	ad_type;
    221 };
    222 
    223 #define	NTFS_BBID	"NTFS    "
    224 #define	NTFS_BBIDLEN	8
    225 struct bootfile {
    226 	u_int8_t        reserved1[3];	/* asm jmp near ... */
    227 	u_int8_t        bf_sysid[8];	/* 'NTFS    ' */
    228 	u_int16_t       bf_bps;		/* bytes per sector */
    229 	u_int8_t        bf_spc;		/* sectors per cluster */
    230 	u_int8_t        reserved2[7];	/* unused (zeroed) */
    231 	u_int8_t        bf_media;	/* media desc. (0xF8) */
    232 	u_int8_t        reserved3[2];
    233 	u_int16_t       bf_spt;		/* sectors per track */
    234 	u_int16_t       bf_heads;	/* number of heads */
    235 	u_int8_t        reserved4[12];
    236 	u_int64_t       bf_spv;		/* sectors per volume */
    237 	cn_t            bf_mftcn;	/* $MFT cluster number */
    238 	cn_t            bf_mftmirrcn;	/* $MFTMirr cn */
    239 	u_int8_t        bf_mftrecsz;	/* MFT record size (clust) */
    240 					/* 0xF6 indicates 1/4 */
    241 	u_int32_t       bf_ibsz;	/* index buffer size */
    242 	u_int32_t       bf_volsn;	/* volume ser. num. */
    243 };
    244 
    245 #pragma pack()
    246 
    247 typedef wchar (ntfs_wget_func_t)(const char **, size_t *);
    248 typedef int (ntfs_wput_func_t)(char *, size_t, wchar);
    249 typedef int (ntfs_wcmp_func_t)(wchar, wchar);
    250 
    251 #define	NTFS_SYSNODESNUM	0x0B
    252 struct ntfsmount {
    253 	struct mount   *ntm_mountp;	/* filesystem vfs structure */
    254 	struct bootfile ntm_bootfile;
    255 	dev_t           ntm_dev;	/* device mounted */
    256 	struct vnode   *ntm_devvp;	/* block device mounted vnode */
    257 	struct vnode   *ntm_sysvn[NTFS_SYSNODESNUM];
    258 	u_int32_t       ntm_bpmftrec;
    259 	uid_t           ntm_uid;
    260 	gid_t           ntm_gid;
    261 	mode_t          ntm_mode;
    262 	u_long          ntm_flag;
    263 	cn_t		ntm_cfree;
    264 	struct ntvattrdef *ntm_ad;
    265 	int		ntm_adnum;
    266 	ntfs_wget_func_t *ntm_wget;	/* decode string to Unicode string */
    267 	ntfs_wput_func_t *ntm_wput;	/* encode Unicode string to string */
    268 	ntfs_wcmp_func_t *ntm_wcmp;	/* compare to wide characters */
    269 };
    270 
    271 #define ntm_mftcn	ntm_bootfile.bf_mftcn
    272 #define ntm_mftmirrcn	ntm_bootfile.bf_mftmirrcn
    273 #define	ntm_mftrecsz	ntm_bootfile.bf_mftrecsz
    274 #define	ntm_spc		ntm_bootfile.bf_spc
    275 #define	ntm_bps		ntm_bootfile.bf_bps
    276 
    277 #define	NTFS_NEXTREC(s, type) ((type)(((char *) s) + (s)->reclen))
    278 
    279 /* Convert mount ptr to ntfsmount ptr. */
    280 #define VFSTONTFS(mp)	((struct ntfsmount *)((mp)->mnt_data))
    281 #define VTONT(v)	FTONT(VTOF(v))
    282 #define	VTOF(v)		((struct fnode *)((v)->v_data))
    283 #define	FTOV(f)		((f)->f_vp)
    284 #define	FTONT(f)	((f)->f_ip)
    285 #define ntfs_cntobn(cn)	(daddr_t)((cn) * (ntmp->ntm_spc))
    286 #define ntfs_cntob(cn)	(off_t)((cn) * (ntmp)->ntm_spc * (ntmp)->ntm_bps)
    287 #define ntfs_btocn(off)	(cn_t)((off) / ((ntmp)->ntm_spc * (ntmp)->ntm_bps))
    288 #define ntfs_btocl(off)	(cn_t)((off + ntfs_cntob(1) - 1) / ((ntmp)->ntm_spc * (ntmp)->ntm_bps))
    289 #define ntfs_btocnoff(off)	(off_t)((off) % ((ntmp)->ntm_spc * (ntmp)->ntm_bps))
    290 #define ntfs_bntob(bn)	(daddr_t)((bn) * (ntmp)->ntm_bps)
    291 
    292 #define	ntfs_bpbl	(daddr_t)((ntmp)->ntm_bps)
    293 
    294 #ifdef _KERNEL
    295 MALLOC_DECLARE(M_NTFSMNT);
    296 MALLOC_DECLARE(M_NTFSNTNODE);
    297 MALLOC_DECLARE(M_NTFSDIR);
    298 MALLOC_DECLARE(M_NTFSNTVATTR);
    299 MALLOC_DECLARE(M_NTFSRDATA);
    300 MALLOC_DECLARE(M_NTFSDECOMP);
    301 MALLOC_DECLARE(M_NTFSRUN);
    302 #endif /* _KERNEL */
    303 
    304 typedef int (vop_t)(void *);
    305 #define HASHINIT(a, b, c, d)	hashinit((a), HASH_LIST, (b), (c), (d))
    306 #define bqrelse(bp)		brelse(bp, 0)
    307 
    308 #ifdef NTFS_DEBUG
    309 extern int ntfs_debug;
    310 #define DPRINTF(X, Y) do { if(ntfs_debug >= (X)) printf Y; } while(0)
    311 #define dprintf(a) DPRINTF(1, a)
    312 #define ddprintf(a) DPRINTF(2, a)
    313 #else /* NTFS_DEBUG */
    314 #define DPRINTF(X, Y)
    315 #define dprintf(a)
    316 #define ddprintf(a)
    317 #endif
    318 
    319 extern vop_t  **ntfs_vnodeop_p;
    320 #endif /* _NTFS_NTFS_H_ */
    321