xref: /netbsd-src/sys/fs/ntfs/ntfs.h (revision 6d178278b39842fda69058e0c44a4423c1601e24)
1*6d178278Smaxv /*	$NetBSD: ntfs.h,v 1.21 2014/12/28 12:19:21 maxv Exp $	*/
29accf4dfSjdolecek 
39accf4dfSjdolecek /*-
49accf4dfSjdolecek  * Copyright (c) 1998, 1999 Semen Ustimenko
59accf4dfSjdolecek  * All rights reserved.
69accf4dfSjdolecek  *
79accf4dfSjdolecek  * Redistribution and use in source and binary forms, with or without
89accf4dfSjdolecek  * modification, are permitted provided that the following conditions
99accf4dfSjdolecek  * are met:
109accf4dfSjdolecek  * 1. Redistributions of source code must retain the above copyright
119accf4dfSjdolecek  *    notice, this list of conditions and the following disclaimer.
129accf4dfSjdolecek  * 2. Redistributions in binary form must reproduce the above copyright
139accf4dfSjdolecek  *    notice, this list of conditions and the following disclaimer in the
149accf4dfSjdolecek  *    documentation and/or other materials provided with the distribution.
159accf4dfSjdolecek  *
169accf4dfSjdolecek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
179accf4dfSjdolecek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
189accf4dfSjdolecek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
199accf4dfSjdolecek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
209accf4dfSjdolecek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
219accf4dfSjdolecek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
229accf4dfSjdolecek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
239accf4dfSjdolecek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
249accf4dfSjdolecek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
259accf4dfSjdolecek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
269accf4dfSjdolecek  * SUCH DAMAGE.
279accf4dfSjdolecek  *
289accf4dfSjdolecek  *	Id: ntfs.h,v 1.5 1999/05/12 09:42:51 semenu Exp
299accf4dfSjdolecek  */
309accf4dfSjdolecek 
314bffed72Schristos #ifndef _NTFS_NTFS_H_
324bffed72Schristos #define _NTFS_NTFS_H_
334bffed72Schristos 
3413d9236cSpooka #if defined(_KERNEL_OPT)
359accf4dfSjdolecek #include "opt_ntfs.h"
369accf4dfSjdolecek #endif
379accf4dfSjdolecek 
389accf4dfSjdolecek typedef u_int64_t cn_t;
399accf4dfSjdolecek typedef u_int16_t wchar;
409accf4dfSjdolecek 
419accf4dfSjdolecek #pragma pack(1)
429accf4dfSjdolecek #define BBSIZE			1024
439accf4dfSjdolecek #define	BBOFF			((off_t)(0))
449accf4dfSjdolecek #define	BBLOCK			((daddr_t)(0))
459accf4dfSjdolecek #define	NTFS_MFTINO		0
469accf4dfSjdolecek #define	NTFS_VOLUMEINO		3
479accf4dfSjdolecek #define	NTFS_ATTRDEFINO		4
489accf4dfSjdolecek #define	NTFS_ROOTINO		5
499accf4dfSjdolecek #define	NTFS_BITMAPINO		6
509accf4dfSjdolecek #define	NTFS_BOOTINO		7
519accf4dfSjdolecek #define	NTFS_BADCLUSINO		8
529accf4dfSjdolecek #define	NTFS_UPCASEINO		10
539accf4dfSjdolecek #define NTFS_MAXFILENAME	255
549accf4dfSjdolecek 
559accf4dfSjdolecek struct fixuphdr {
569accf4dfSjdolecek 	u_int32_t       fh_magic;
579accf4dfSjdolecek 	u_int16_t       fh_foff;
589accf4dfSjdolecek 	u_int16_t       fh_fnum;
599accf4dfSjdolecek };
609accf4dfSjdolecek 
619accf4dfSjdolecek #define NTFS_AF_INRUN	0x00000001
629accf4dfSjdolecek struct attrhdr {
639accf4dfSjdolecek 	u_int32_t       a_type;
649accf4dfSjdolecek 	u_int32_t       reclen;
659accf4dfSjdolecek 	u_int8_t        a_flag;
669accf4dfSjdolecek 	u_int8_t        a_namelen;
679accf4dfSjdolecek 	u_int8_t        a_nameoff;
689accf4dfSjdolecek 	u_int8_t        reserved1;
699accf4dfSjdolecek 	u_int8_t        a_compression;
709accf4dfSjdolecek 	u_int8_t        reserved2;
719accf4dfSjdolecek 	u_int16_t       a_index;
729accf4dfSjdolecek };
739accf4dfSjdolecek #define NTFS_A_STD	0x10
749accf4dfSjdolecek #define NTFS_A_ATTRLIST	0x20
759accf4dfSjdolecek #define NTFS_A_NAME	0x30
769accf4dfSjdolecek #define NTFS_A_VOLUMENAME	0x60
779accf4dfSjdolecek #define NTFS_A_DATA	0x80
789accf4dfSjdolecek #define	NTFS_A_INDXROOT	0x90
799accf4dfSjdolecek #define	NTFS_A_INDX	0xA0
809accf4dfSjdolecek #define NTFS_A_INDXBITMAP 0xB0
819accf4dfSjdolecek 
829accf4dfSjdolecek #define NTFS_MAXATTRNAME	255
839accf4dfSjdolecek struct attr {
849accf4dfSjdolecek 	struct attrhdr  a_hdr;
859accf4dfSjdolecek 	union {
869accf4dfSjdolecek 		struct {
879accf4dfSjdolecek 			u_int16_t       a_datalen;
889accf4dfSjdolecek 			u_int16_t       reserved1;
899accf4dfSjdolecek 			u_int16_t       a_dataoff;
909accf4dfSjdolecek 			u_int16_t       a_indexed;
919accf4dfSjdolecek 		}               a_S_r;
929accf4dfSjdolecek 		struct {
939accf4dfSjdolecek 			cn_t            a_vcnstart;
949accf4dfSjdolecek 			cn_t            a_vcnend;
959accf4dfSjdolecek 			u_int16_t       a_dataoff;
969accf4dfSjdolecek 			u_int16_t       a_compressalg;
979accf4dfSjdolecek 			u_int32_t       reserved1;
989accf4dfSjdolecek 			u_int64_t       a_allocated;
999accf4dfSjdolecek 			u_int64_t       a_datalen;
1009accf4dfSjdolecek 			u_int64_t       a_initialized;
1019accf4dfSjdolecek 		}               a_S_nr;
1029accf4dfSjdolecek 	}               a_S;
1039accf4dfSjdolecek };
1049accf4dfSjdolecek #define a_r	a_S.a_S_r
1059accf4dfSjdolecek #define a_nr	a_S.a_S_nr
1069accf4dfSjdolecek 
1079accf4dfSjdolecek typedef struct {
1089accf4dfSjdolecek 	u_int64_t       t_create;
1099accf4dfSjdolecek 	u_int64_t       t_write;
1109accf4dfSjdolecek 	u_int64_t       t_mftwrite;
1119accf4dfSjdolecek 	u_int64_t       t_access;
1129accf4dfSjdolecek }               ntfs_times_t;
1139accf4dfSjdolecek 
1149accf4dfSjdolecek #define NTFS_FFLAG_RDONLY	0x01LL
1159accf4dfSjdolecek #define NTFS_FFLAG_HIDDEN	0x02LL
1169accf4dfSjdolecek #define NTFS_FFLAG_SYSTEM	0x04LL
1179accf4dfSjdolecek #define NTFS_FFLAG_ARCHIVE	0x20LL
1189accf4dfSjdolecek #define NTFS_FFLAG_COMPRESSED	0x0800LL
1199accf4dfSjdolecek #define NTFS_FFLAG_DIR		0x10000000LL
1209accf4dfSjdolecek 
1219accf4dfSjdolecek struct attr_name {
1229accf4dfSjdolecek 	u_int32_t       n_pnumber;	/* Parent ntnode */
1239accf4dfSjdolecek 	u_int32_t       reserved;
1249accf4dfSjdolecek 	ntfs_times_t    n_times;
1259accf4dfSjdolecek 	u_int64_t       n_size;
1269accf4dfSjdolecek 	u_int64_t       n_attrsz;
1279accf4dfSjdolecek 	u_int64_t       n_flag;
1289accf4dfSjdolecek 	u_int8_t        n_namelen;
1299accf4dfSjdolecek 	u_int8_t        n_nametype;
1309accf4dfSjdolecek 	u_int16_t       n_name[1];
1319accf4dfSjdolecek };
1329accf4dfSjdolecek 
1339accf4dfSjdolecek #define NTFS_IRFLAG_INDXALLOC	0x00000001
1349accf4dfSjdolecek struct attr_indexroot {
1359accf4dfSjdolecek 	u_int32_t       ir_unkn1;	/* always 0x30 */
1369accf4dfSjdolecek 	u_int32_t       ir_unkn2;	/* always 0x1 */
1379accf4dfSjdolecek 	u_int32_t       ir_size;/* ??? */
1389accf4dfSjdolecek 	u_int32_t       ir_unkn3;	/* number of cluster */
1399accf4dfSjdolecek 	u_int32_t       ir_unkn4;	/* always 0x10 */
1409accf4dfSjdolecek 	u_int32_t       ir_datalen;	/* sizeof simething */
1419accf4dfSjdolecek 	u_int32_t       ir_allocated;	/* same as above */
1429accf4dfSjdolecek 	u_int16_t       ir_flag;/* ?? always 1 */
1439accf4dfSjdolecek 	u_int16_t       ir_unkn7;
1449accf4dfSjdolecek };
1459accf4dfSjdolecek 
1469accf4dfSjdolecek struct attr_attrlist {
1479accf4dfSjdolecek 	u_int32_t       al_type;	/* Attribute type */
1489accf4dfSjdolecek 	u_int16_t       reclen;		/* length of this entry */
1499accf4dfSjdolecek 	u_int8_t        al_namelen;	/* Attribute name len */
1509accf4dfSjdolecek 	u_int8_t        al_nameoff;	/* Name offset from entry start */
1519accf4dfSjdolecek 	u_int64_t       al_vcnstart;	/* VCN number */
1529accf4dfSjdolecek 	u_int32_t       al_inumber;	/* Parent ntnode */
1539accf4dfSjdolecek 	u_int32_t       reserved;
1549accf4dfSjdolecek 	u_int16_t       al_index;	/* Attribute index in MFT record */
1559accf4dfSjdolecek 	u_int16_t       al_name[1];	/* Name */
1569accf4dfSjdolecek };
1579accf4dfSjdolecek 
1589accf4dfSjdolecek #define	NTFS_INDXMAGIC	(u_int32_t)(0x58444E49)
1599accf4dfSjdolecek struct attr_indexalloc {
1609accf4dfSjdolecek 	struct fixuphdr ia_fixup;
1619accf4dfSjdolecek 	u_int64_t       unknown1;
1629accf4dfSjdolecek 	cn_t            ia_bufcn;
1639accf4dfSjdolecek 	u_int16_t       ia_hdrsize;
1649accf4dfSjdolecek 	u_int16_t       unknown2;
1659accf4dfSjdolecek 	u_int32_t       ia_inuse;
1669accf4dfSjdolecek 	u_int32_t       ia_allocated;
1679accf4dfSjdolecek };
1689accf4dfSjdolecek 
1699accf4dfSjdolecek #define	NTFS_IEFLAG_SUBNODE	0x00000001
1709accf4dfSjdolecek #define	NTFS_IEFLAG_LAST	0x00000002
1719accf4dfSjdolecek 
1729accf4dfSjdolecek struct attr_indexentry {
1739accf4dfSjdolecek 	u_int32_t       ie_number;
1749accf4dfSjdolecek 	u_int32_t       unknown1;
1759accf4dfSjdolecek 	u_int16_t       reclen;
1769accf4dfSjdolecek 	u_int16_t       ie_size;
1779accf4dfSjdolecek 	u_int32_t       ie_flag;/* 1 - has subnodes, 2 - last */
1789accf4dfSjdolecek 	u_int32_t       ie_fpnumber;
1799accf4dfSjdolecek 	u_int32_t       unknown2;
1809accf4dfSjdolecek 	ntfs_times_t    ie_ftimes;
1819accf4dfSjdolecek 	u_int64_t       ie_fallocated;
1829accf4dfSjdolecek 	u_int64_t       ie_fsize;
1839accf4dfSjdolecek 	u_int64_t       ie_fflag;
1849accf4dfSjdolecek 	u_int8_t        ie_fnamelen;
1859accf4dfSjdolecek 	u_int8_t        ie_fnametype;
1869accf4dfSjdolecek 	wchar           ie_fname[NTFS_MAXFILENAME];
1879accf4dfSjdolecek 	/* cn_t		ie_bufcn;	 buffer with subnodes */
1889accf4dfSjdolecek };
1899accf4dfSjdolecek 
1909accf4dfSjdolecek #define	NTFS_FILEMAGIC	(u_int32_t)(0x454C4946)
1919accf4dfSjdolecek #define	NTFS_FRFLAG_DIR	0x0002
1929accf4dfSjdolecek struct filerec {
1939accf4dfSjdolecek 	struct fixuphdr fr_fixup;
1949accf4dfSjdolecek 	u_int8_t        reserved[8];
1959accf4dfSjdolecek 	u_int16_t       fr_seqnum;	/* Sequence number */
1969accf4dfSjdolecek 	u_int16_t       fr_nlink;
1979accf4dfSjdolecek 	u_int16_t       fr_attroff;	/* offset to attributes */
1989accf4dfSjdolecek 	u_int16_t       fr_flags;	/* 1-nonresident attr, 2-directory */
1999accf4dfSjdolecek 	u_int32_t       fr_size;/* hdr + attributes */
2009accf4dfSjdolecek 	u_int32_t       fr_allocated;	/* allocated length of record */
2019accf4dfSjdolecek 	u_int64_t       fr_mainrec;	/* main record */
2029accf4dfSjdolecek 	u_int16_t       fr_attrnum;	/* maximum attr number + 1 ??? */
2039accf4dfSjdolecek };
2049accf4dfSjdolecek 
2059accf4dfSjdolecek #define	NTFS_ATTRNAME_MAXLEN	0x40
2069accf4dfSjdolecek #define	NTFS_ADFLAG_NONRES	0x0080	/* Attrib can be non resident */
2079accf4dfSjdolecek #define	NTFS_ADFLAG_INDEX	0x0002	/* Attrib can be indexed */
2089accf4dfSjdolecek struct attrdef {
2099accf4dfSjdolecek 	wchar		ad_name[NTFS_ATTRNAME_MAXLEN];
2109accf4dfSjdolecek 	u_int32_t	ad_type;
2119accf4dfSjdolecek 	u_int32_t	reserved1[2];
2129accf4dfSjdolecek 	u_int32_t	ad_flag;
2139accf4dfSjdolecek 	u_int64_t	ad_minlen;
2149accf4dfSjdolecek 	u_int64_t	ad_maxlen;	/* -1 for nonlimited */
2159accf4dfSjdolecek };
2169accf4dfSjdolecek 
2179accf4dfSjdolecek struct ntvattrdef {
2189accf4dfSjdolecek 	char		ad_name[0x40];
2199accf4dfSjdolecek 	int		ad_namelen;
2209accf4dfSjdolecek 	u_int32_t	ad_type;
2219accf4dfSjdolecek };
2229accf4dfSjdolecek 
2239accf4dfSjdolecek #define	NTFS_BBID	"NTFS    "
2249accf4dfSjdolecek #define	NTFS_BBIDLEN	8
2259accf4dfSjdolecek struct bootfile {
2269accf4dfSjdolecek 	u_int8_t        reserved1[3];	/* asm jmp near ... */
2279accf4dfSjdolecek 	u_int8_t        bf_sysid[8];	/* 'NTFS    ' */
2289accf4dfSjdolecek 	u_int16_t       bf_bps;		/* bytes per sector */
2299accf4dfSjdolecek 	u_int8_t        bf_spc;		/* sectors per cluster */
2309accf4dfSjdolecek 	u_int8_t        reserved2[7];	/* unused (zeroed) */
2319accf4dfSjdolecek 	u_int8_t        bf_media;	/* media desc. (0xF8) */
2329accf4dfSjdolecek 	u_int8_t        reserved3[2];
2339accf4dfSjdolecek 	u_int16_t       bf_spt;		/* sectors per track */
2349accf4dfSjdolecek 	u_int16_t       bf_heads;	/* number of heads */
235*6d178278Smaxv 	u_int8_t        reserved4[12];
2369accf4dfSjdolecek 	u_int64_t       bf_spv;		/* sectors per volume */
2379accf4dfSjdolecek 	cn_t            bf_mftcn;	/* $MFT cluster number */
2389accf4dfSjdolecek 	cn_t            bf_mftmirrcn;	/* $MFTMirr cn */
2399accf4dfSjdolecek 	u_int8_t        bf_mftrecsz;	/* MFT record size (clust) */
240*6d178278Smaxv 					/* 0xF6 indicates 1/4 */
2419accf4dfSjdolecek 	u_int32_t       bf_ibsz;	/* index buffer size */
2429accf4dfSjdolecek 	u_int32_t       bf_volsn;	/* volume ser. num. */
2439accf4dfSjdolecek };
2449accf4dfSjdolecek 
2459accf4dfSjdolecek #pragma pack()
2469accf4dfSjdolecek 
24708fcacf4Sxtraeme typedef wchar (ntfs_wget_func_t)(const char **, size_t *);
24808fcacf4Sxtraeme typedef int (ntfs_wput_func_t)(char *, size_t, wchar);
24908fcacf4Sxtraeme typedef int (ntfs_wcmp_func_t)(wchar, wchar);
2509accf4dfSjdolecek 
2519accf4dfSjdolecek #define	NTFS_SYSNODESNUM	0x0B
2529accf4dfSjdolecek struct ntfsmount {
2539accf4dfSjdolecek 	struct mount   *ntm_mountp;	/* filesystem vfs structure */
2549accf4dfSjdolecek 	struct bootfile ntm_bootfile;
2559accf4dfSjdolecek 	dev_t           ntm_dev;	/* device mounted */
2569accf4dfSjdolecek 	struct vnode   *ntm_devvp;	/* block device mounted vnode */
2579accf4dfSjdolecek 	struct vnode   *ntm_sysvn[NTFS_SYSNODESNUM];
2589accf4dfSjdolecek 	u_int32_t       ntm_bpmftrec;
2599accf4dfSjdolecek 	uid_t           ntm_uid;
2609accf4dfSjdolecek 	gid_t           ntm_gid;
2619accf4dfSjdolecek 	mode_t          ntm_mode;
2629accf4dfSjdolecek 	u_long          ntm_flag;
2639accf4dfSjdolecek 	cn_t		ntm_cfree;
2649accf4dfSjdolecek 	struct ntvattrdef *ntm_ad;
2659accf4dfSjdolecek 	int		ntm_adnum;
2669accf4dfSjdolecek 	ntfs_wget_func_t *ntm_wget;	/* decode string to Unicode string */
2679accf4dfSjdolecek 	ntfs_wput_func_t *ntm_wput;	/* encode Unicode string to string */
2689accf4dfSjdolecek 	ntfs_wcmp_func_t *ntm_wcmp;	/* compare to wide characters */
2699accf4dfSjdolecek };
2709accf4dfSjdolecek 
2719accf4dfSjdolecek #define ntm_mftcn	ntm_bootfile.bf_mftcn
2729accf4dfSjdolecek #define ntm_mftmirrcn	ntm_bootfile.bf_mftmirrcn
2739accf4dfSjdolecek #define	ntm_mftrecsz	ntm_bootfile.bf_mftrecsz
2749accf4dfSjdolecek #define	ntm_spc		ntm_bootfile.bf_spc
2759accf4dfSjdolecek #define	ntm_bps		ntm_bootfile.bf_bps
2769accf4dfSjdolecek 
27753524e44Schristos #define	NTFS_NEXTREC(s, type) ((type)(((char *) s) + (s)->reclen))
2789accf4dfSjdolecek 
2799accf4dfSjdolecek /* Convert mount ptr to ntfsmount ptr. */
2809accf4dfSjdolecek #define VFSTONTFS(mp)	((struct ntfsmount *)((mp)->mnt_data))
2819accf4dfSjdolecek #define VTONT(v)	FTONT(VTOF(v))
2829accf4dfSjdolecek #define	VTOF(v)		((struct fnode *)((v)->v_data))
2839accf4dfSjdolecek #define	FTOV(f)		((f)->f_vp)
2849accf4dfSjdolecek #define	FTONT(f)	((f)->f_ip)
2859accf4dfSjdolecek #define ntfs_cntobn(cn)	(daddr_t)((cn) * (ntmp->ntm_spc))
2869accf4dfSjdolecek #define ntfs_cntob(cn)	(off_t)((cn) * (ntmp)->ntm_spc * (ntmp)->ntm_bps)
2879accf4dfSjdolecek #define ntfs_btocn(off)	(cn_t)((off) / ((ntmp)->ntm_spc * (ntmp)->ntm_bps))
2889accf4dfSjdolecek #define ntfs_btocl(off)	(cn_t)((off + ntfs_cntob(1) - 1) / ((ntmp)->ntm_spc * (ntmp)->ntm_bps))
2899accf4dfSjdolecek #define ntfs_btocnoff(off)	(off_t)((off) % ((ntmp)->ntm_spc * (ntmp)->ntm_bps))
2909accf4dfSjdolecek #define ntfs_bntob(bn)	(daddr_t)((bn) * (ntmp)->ntm_bps)
2919accf4dfSjdolecek 
2929accf4dfSjdolecek #define	ntfs_bpbl	(daddr_t)((ntmp)->ntm_bps)
2939accf4dfSjdolecek 
294355013fbShe #ifdef _KERNEL
2959accf4dfSjdolecek MALLOC_DECLARE(M_NTFSMNT);
2969accf4dfSjdolecek MALLOC_DECLARE(M_NTFSNTNODE);
2979accf4dfSjdolecek MALLOC_DECLARE(M_NTFSDIR);
29877500fa3Schristos MALLOC_DECLARE(M_NTFSNTVATTR);
29994f1b043Schristos MALLOC_DECLARE(M_NTFSRDATA);
30094f1b043Schristos MALLOC_DECLARE(M_NTFSDECOMP);
30194f1b043Schristos MALLOC_DECLARE(M_NTFSRUN);
302355013fbShe #endif /* _KERNEL */
3039accf4dfSjdolecek 
30408fcacf4Sxtraeme typedef int (vop_t)(void *);
3059accf4dfSjdolecek #define HASHINIT(a, b, c, d)	hashinit((a), HASH_LIST, (b), (c), (d))
3067dad9f73Sad #define bqrelse(bp)		brelse(bp, 0)
3079accf4dfSjdolecek 
308f229ea7fSchristos #ifdef NTFS_DEBUG
3099accf4dfSjdolecek extern int ntfs_debug;
3109accf4dfSjdolecek #define DPRINTF(X, Y) do { if(ntfs_debug >= (X)) printf Y; } while(0)
3119accf4dfSjdolecek #define dprintf(a) DPRINTF(1, a)
3129accf4dfSjdolecek #define ddprintf(a) DPRINTF(2, a)
3139accf4dfSjdolecek #else /* NTFS_DEBUG */
3149accf4dfSjdolecek #define DPRINTF(X, Y)
3159accf4dfSjdolecek #define dprintf(a)
3169accf4dfSjdolecek #define ddprintf(a)
3179accf4dfSjdolecek #endif
3189accf4dfSjdolecek 
3199accf4dfSjdolecek extern vop_t  **ntfs_vnodeop_p;
3204bffed72Schristos #endif /* _NTFS_NTFS_H_ */
321