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