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