1*0d297f47Sjsg /* $OpenBSD: ntfs.h,v 1.19 2022/01/11 03:13:59 jsg Exp $ */ 226f3deacStedu /* $NetBSD: ntfs.h,v 1.5 2003/04/24 07:50:19 christos Exp $ */ 326f3deacStedu 426f3deacStedu /*- 526f3deacStedu * Copyright (c) 1998, 1999 Semen Ustimenko 626f3deacStedu * All rights reserved. 726f3deacStedu * 826f3deacStedu * Redistribution and use in source and binary forms, with or without 926f3deacStedu * modification, are permitted provided that the following conditions 1026f3deacStedu * are met: 1126f3deacStedu * 1. Redistributions of source code must retain the above copyright 1226f3deacStedu * notice, this list of conditions and the following disclaimer. 1326f3deacStedu * 2. Redistributions in binary form must reproduce the above copyright 1426f3deacStedu * notice, this list of conditions and the following disclaimer in the 1526f3deacStedu * documentation and/or other materials provided with the distribution. 1626f3deacStedu * 1726f3deacStedu * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1826f3deacStedu * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1926f3deacStedu * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2026f3deacStedu * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2126f3deacStedu * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2226f3deacStedu * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2326f3deacStedu * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2426f3deacStedu * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2526f3deacStedu * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2626f3deacStedu * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2726f3deacStedu * SUCH DAMAGE. 2826f3deacStedu * 2926f3deacStedu * Id: ntfs.h,v 1.5 1999/05/12 09:42:51 semenu Exp 3026f3deacStedu */ 3126f3deacStedu 3226f3deacStedu /*#define NTFS_DEBUG 1*/ 3326f3deacStedu typedef u_int64_t cn_t; 3426f3deacStedu typedef u_int16_t wchar; 3526f3deacStedu 3626f3deacStedu #define BBSIZE 1024 3726f3deacStedu #define BBOFF ((off_t)(0)) 38ce7d09aaSderaadt #define BBLOCK 0 3926f3deacStedu #define NTFS_MFTINO 0 4026f3deacStedu #define NTFS_VOLUMEINO 3 4126f3deacStedu #define NTFS_ATTRDEFINO 4 4226f3deacStedu #define NTFS_ROOTINO 5 4326f3deacStedu #define NTFS_BITMAPINO 6 4426f3deacStedu #define NTFS_BOOTINO 7 4526f3deacStedu #define NTFS_BADCLUSINO 8 4626f3deacStedu #define NTFS_UPCASEINO 10 4726f3deacStedu #define NTFS_MAXFILENAME 255 4826f3deacStedu 4995a73601Sguenther /* 5095a73601Sguenther * UFS directories use 32bit inode numbers internally, regardless 5195a73601Sguenther * of what the system on top of it uses. 5295a73601Sguenther */ 5395a73601Sguenther typedef u_int32_t ntfsino_t; 5495a73601Sguenther 5526f3deacStedu struct fixuphdr { 5626f3deacStedu u_int32_t fh_magic; 5726f3deacStedu u_int16_t fh_foff; 5826f3deacStedu u_int16_t fh_fnum; 59e7940adfSderaadt } __packed; 6026f3deacStedu 6126f3deacStedu #define NTFS_AF_INRUN 0x00000001 6226f3deacStedu struct attrhdr { 6326f3deacStedu u_int32_t a_type; 6426f3deacStedu u_int32_t reclen; 6526f3deacStedu u_int8_t a_flag; 6626f3deacStedu u_int8_t a_namelen; 6726f3deacStedu u_int8_t a_nameoff; 6826f3deacStedu u_int8_t reserved1; 6926f3deacStedu u_int8_t a_compression; 7026f3deacStedu u_int8_t reserved2; 7126f3deacStedu u_int16_t a_index; 72e7940adfSderaadt } __packed; 7326f3deacStedu #define NTFS_A_STD 0x10 7426f3deacStedu #define NTFS_A_ATTRLIST 0x20 7526f3deacStedu #define NTFS_A_NAME 0x30 7626f3deacStedu #define NTFS_A_VOLUMENAME 0x60 7726f3deacStedu #define NTFS_A_DATA 0x80 7826f3deacStedu #define NTFS_A_INDXROOT 0x90 7926f3deacStedu #define NTFS_A_INDX 0xA0 8026f3deacStedu #define NTFS_A_INDXBITMAP 0xB0 8126f3deacStedu 8226f3deacStedu #define NTFS_MAXATTRNAME 255 8326f3deacStedu struct attr { 8426f3deacStedu struct attrhdr a_hdr; 8526f3deacStedu union { 8626f3deacStedu struct { 8726f3deacStedu u_int16_t a_datalen; 8826f3deacStedu u_int16_t reserved1; 8926f3deacStedu u_int16_t a_dataoff; 9026f3deacStedu u_int16_t a_indexed; 91e7940adfSderaadt } __packed a_S_r; 9226f3deacStedu struct { 9326f3deacStedu cn_t a_vcnstart; 9426f3deacStedu cn_t a_vcnend; 9526f3deacStedu u_int16_t a_dataoff; 9626f3deacStedu u_int16_t a_compressalg; 9726f3deacStedu u_int32_t reserved1; 9826f3deacStedu u_int64_t a_allocated; 9926f3deacStedu u_int64_t a_datalen; 10026f3deacStedu u_int64_t a_initialized; 101e7940adfSderaadt } __packed a_S_nr; 10226f3deacStedu } a_S; 103e7940adfSderaadt } __packed; 10426f3deacStedu #define a_r a_S.a_S_r 10526f3deacStedu #define a_nr a_S.a_S_nr 10626f3deacStedu 10726f3deacStedu typedef struct { 10826f3deacStedu u_int64_t t_create; 10926f3deacStedu u_int64_t t_write; 11026f3deacStedu u_int64_t t_mftwrite; 11126f3deacStedu u_int64_t t_access; 112e7940adfSderaadt } __packed ntfs_times_t; 11326f3deacStedu 11426f3deacStedu #define NTFS_FFLAG_RDONLY 0x01LL 11526f3deacStedu #define NTFS_FFLAG_HIDDEN 0x02LL 11626f3deacStedu #define NTFS_FFLAG_SYSTEM 0x04LL 11726f3deacStedu #define NTFS_FFLAG_ARCHIVE 0x20LL 11826f3deacStedu #define NTFS_FFLAG_COMPRESSED 0x0800LL 11926f3deacStedu #define NTFS_FFLAG_DIR 0x10000000LL 12026f3deacStedu 12126f3deacStedu struct attr_name { 12226f3deacStedu u_int32_t n_pnumber; /* Parent ntnode */ 12326f3deacStedu u_int32_t reserved; 12426f3deacStedu ntfs_times_t n_times; 12526f3deacStedu u_int64_t n_size; 12626f3deacStedu u_int64_t n_attrsz; 12726f3deacStedu u_int64_t n_flag; 12826f3deacStedu u_int8_t n_namelen; 12926f3deacStedu u_int8_t n_nametype; 13026f3deacStedu u_int16_t n_name[1]; 131e7940adfSderaadt } __packed; 13226f3deacStedu 13326f3deacStedu #define NTFS_IRFLAG_INDXALLOC 0x00000001 13426f3deacStedu struct attr_indexroot { 13526f3deacStedu u_int32_t ir_unkn1; /* always 0x30 */ 13626f3deacStedu u_int32_t ir_unkn2; /* always 0x1 */ 13726f3deacStedu u_int32_t ir_size;/* ??? */ 13826f3deacStedu u_int32_t ir_unkn3; /* number of cluster */ 13926f3deacStedu u_int32_t ir_unkn4; /* always 0x10 */ 1403adac763Smiod u_int32_t ir_datalen; /* sizeof something */ 14126f3deacStedu u_int32_t ir_allocated; /* same as above */ 14226f3deacStedu u_int16_t ir_flag;/* ?? always 1 */ 14326f3deacStedu u_int16_t ir_unkn7; 144e7940adfSderaadt } __packed; 14526f3deacStedu 14626f3deacStedu struct attr_attrlist { 14726f3deacStedu u_int32_t al_type; /* Attribute type */ 14826f3deacStedu u_int16_t reclen; /* length of this entry */ 14926f3deacStedu u_int8_t al_namelen; /* Attribute name len */ 15026f3deacStedu u_int8_t al_nameoff; /* Name offset from entry start */ 15126f3deacStedu u_int64_t al_vcnstart; /* VCN number */ 15226f3deacStedu u_int32_t al_inumber; /* Parent ntnode */ 15326f3deacStedu u_int32_t reserved; 15426f3deacStedu u_int16_t al_index; /* Attribute index in MFT record */ 15526f3deacStedu u_int16_t al_name[1]; /* Name */ 156e7940adfSderaadt } __packed; 15726f3deacStedu 15826f3deacStedu #define NTFS_INDXMAGIC (u_int32_t)(0x58444E49) 15926f3deacStedu struct attr_indexalloc { 16026f3deacStedu struct fixuphdr ia_fixup; 16126f3deacStedu u_int64_t unknown1; 16226f3deacStedu cn_t ia_bufcn; 16326f3deacStedu u_int16_t ia_hdrsize; 16426f3deacStedu u_int16_t unknown2; 16526f3deacStedu u_int32_t ia_inuse; 16626f3deacStedu u_int32_t ia_allocated; 167e7940adfSderaadt } __packed; 16826f3deacStedu 16926f3deacStedu #define NTFS_IEFLAG_SUBNODE 0x00000001 17026f3deacStedu #define NTFS_IEFLAG_LAST 0x00000002 17126f3deacStedu 17226f3deacStedu struct attr_indexentry { 17326f3deacStedu u_int32_t ie_number; 17426f3deacStedu u_int32_t unknown1; 17526f3deacStedu u_int16_t reclen; 17626f3deacStedu u_int16_t ie_size; 17726f3deacStedu u_int32_t ie_flag;/* 1 - has subnodes, 2 - last */ 17826f3deacStedu u_int32_t ie_fpnumber; 17926f3deacStedu u_int32_t unknown2; 18026f3deacStedu ntfs_times_t ie_ftimes; 18126f3deacStedu u_int64_t ie_fallocated; 18226f3deacStedu u_int64_t ie_fsize; 18326f3deacStedu u_int64_t ie_fflag; 18426f3deacStedu u_int8_t ie_fnamelen; 18526f3deacStedu u_int8_t ie_fnametype; 18626f3deacStedu wchar ie_fname[NTFS_MAXFILENAME]; 18726f3deacStedu /* cn_t ie_bufcn; buffer with subnodes */ 188e7940adfSderaadt } __packed; 18926f3deacStedu 19026f3deacStedu #define NTFS_FILEMAGIC (u_int32_t)(0x454C4946) 19126f3deacStedu #define NTFS_FRFLAG_DIR 0x0002 19226f3deacStedu struct filerec { 19326f3deacStedu struct fixuphdr fr_fixup; 19426f3deacStedu u_int8_t reserved[8]; 19526f3deacStedu u_int16_t fr_seqnum; /* Sequence number */ 19626f3deacStedu u_int16_t fr_nlink; 19726f3deacStedu u_int16_t fr_attroff; /* offset to attributes */ 19826f3deacStedu u_int16_t fr_flags; /* 1-nonresident attr, 2-directory */ 19926f3deacStedu u_int32_t fr_size;/* hdr + attributes */ 20026f3deacStedu u_int32_t fr_allocated; /* allocated length of record */ 20126f3deacStedu u_int64_t fr_mainrec; /* main record */ 20226f3deacStedu u_int16_t fr_attrnum; /* maximum attr number + 1 ??? */ 203e7940adfSderaadt } __packed; 20426f3deacStedu 20526f3deacStedu #define NTFS_ATTRNAME_MAXLEN 0x40 20626f3deacStedu #define NTFS_ADFLAG_NONRES 0x0080 /* Attrib can be non resident */ 20726f3deacStedu #define NTFS_ADFLAG_INDEX 0x0002 /* Attrib can be indexed */ 20826f3deacStedu struct attrdef { 20926f3deacStedu wchar ad_name[NTFS_ATTRNAME_MAXLEN]; 21026f3deacStedu u_int32_t ad_type; 21126f3deacStedu u_int32_t reserved1[2]; 21226f3deacStedu u_int32_t ad_flag; 21326f3deacStedu u_int64_t ad_minlen; 21426f3deacStedu u_int64_t ad_maxlen; /* -1 for nonlimited */ 215e7940adfSderaadt } __packed; 21626f3deacStedu 21726f3deacStedu struct ntvattrdef { 21826f3deacStedu char ad_name[0x40]; 21926f3deacStedu int ad_namelen; 22026f3deacStedu u_int32_t ad_type; 221e7940adfSderaadt } __packed; 22226f3deacStedu 22326f3deacStedu #define NTFS_BBID "NTFS " 22426f3deacStedu #define NTFS_BBIDLEN 8 22526f3deacStedu struct bootfile { 22626f3deacStedu u_int8_t reserved1[3]; /* asm jmp near ... */ 22726f3deacStedu u_int8_t bf_sysid[8]; /* 'NTFS ' */ 22826f3deacStedu u_int16_t bf_bps; /* bytes per sector */ 22926f3deacStedu u_int8_t bf_spc; /* sectors per cluster */ 23026f3deacStedu u_int8_t reserved2[7]; /* unused (zeroed) */ 23126f3deacStedu u_int8_t bf_media; /* media desc. (0xF8) */ 23226f3deacStedu u_int8_t reserved3[2]; 23326f3deacStedu u_int16_t bf_spt; /* sectors per track */ 23426f3deacStedu u_int16_t bf_heads; /* number of heads */ 23526f3deacStedu u_int8_t reserver4[12]; 23626f3deacStedu u_int64_t bf_spv; /* sectors per volume */ 23726f3deacStedu cn_t bf_mftcn; /* $MFT cluster number */ 23826f3deacStedu cn_t bf_mftmirrcn; /* $MFTMirr cn */ 23926f3deacStedu u_int8_t bf_mftrecsz; /* MFT record size (clust) */ 240*0d297f47Sjsg /* 0xF6 indicates 1/4 */ 24126f3deacStedu u_int32_t bf_ibsz; /* index buffer size */ 24226f3deacStedu u_int32_t bf_volsn; /* volume ser. num. */ 243e7940adfSderaadt } __packed; 24426f3deacStedu 24590337d88Stedu typedef wchar (ntfs_wget_func_t)(const char **); 24690337d88Stedu typedef int (ntfs_wput_func_t)(char *, size_t, wchar); 24790337d88Stedu typedef int (ntfs_wcmp_func_t)(wchar, wchar); 24826f3deacStedu 2498fc6378aSjsing /* 2508fc6378aSjsing * Maximum number of ntnodes to keep in memory. We do not want to leave 2518fc6378aSjsing * large data structures hanging off vnodes indefinitely and the data 2528fc6378aSjsing * needed to reload the ntnode should already be in the buffer cache. 2538fc6378aSjsing */ 2548fc6378aSjsing #define LOADED_NTNODE_HI 16 2558fc6378aSjsing struct ntnode; 2568fc6378aSjsing TAILQ_HEAD(ntnodeq, ntnode); 2578fc6378aSjsing 25826f3deacStedu #define NTFS_SYSNODESNUM 0x0B 25926f3deacStedu struct ntfsmount { 26026f3deacStedu struct mount *ntm_mountp; /* filesystem vfs structure */ 26126f3deacStedu struct bootfile ntm_bootfile; 26226f3deacStedu dev_t ntm_dev; /* device mounted */ 26326f3deacStedu struct vnode *ntm_devvp; /* block device mounted vnode */ 26426f3deacStedu struct vnode *ntm_sysvn[NTFS_SYSNODESNUM]; 26526f3deacStedu u_int32_t ntm_bpmftrec; 26626f3deacStedu uid_t ntm_uid; 26726f3deacStedu gid_t ntm_gid; 26826f3deacStedu mode_t ntm_mode; 26926f3deacStedu u_long ntm_flag; 27026f3deacStedu cn_t ntm_cfree; 27126f3deacStedu struct ntvattrdef *ntm_ad; 27226f3deacStedu int ntm_adnum; 27326f3deacStedu struct netexport ntm_export; /* export information */ 27426f3deacStedu ntfs_wget_func_t *ntm_wget; /* decode string to Unicode string */ 27526f3deacStedu ntfs_wput_func_t *ntm_wput; /* encode Unicode string to string */ 27626f3deacStedu ntfs_wcmp_func_t *ntm_wcmp; /* compare to wide characters */ 2778fc6378aSjsing int ntm_ntnodes; /* Number of loaded ntnodes. */ 2788fc6378aSjsing struct ntnodeq ntm_ntnodeq; /* Queue of ntnodes (LRU). */ 27926f3deacStedu }; 28026f3deacStedu 28126f3deacStedu #define ntm_mftcn ntm_bootfile.bf_mftcn 28226f3deacStedu #define ntm_mftmirrcn ntm_bootfile.bf_mftmirrcn 28326f3deacStedu #define ntm_mftrecsz ntm_bootfile.bf_mftrecsz 28426f3deacStedu #define ntm_spc ntm_bootfile.bf_spc 28526f3deacStedu #define ntm_bps ntm_bootfile.bf_bps 28626f3deacStedu 28726f3deacStedu #define NTFS_NEXTREC(s, type) ((type)(((caddr_t) s) + (s)->reclen)) 28826f3deacStedu 28926f3deacStedu /* Convert mount ptr to ntfsmount ptr. */ 29026f3deacStedu #define VFSTONTFS(mp) ((struct ntfsmount *)((mp)->mnt_data)) 29126f3deacStedu #define VTONT(v) FTONT(VTOF(v)) 29226f3deacStedu #define VTOF(v) ((struct fnode *)((v)->v_data)) 29326f3deacStedu #define FTOV(f) ((f)->f_vp) 29426f3deacStedu #define FTONT(f) ((f)->f_ip) 2951abdbfdeSderaadt #define ntfs_cntobn(cn) (daddr_t)((cn) * (ntmp->ntm_spc)) 29626f3deacStedu #define ntfs_cntob(cn) (off_t)((cn) * (ntmp)->ntm_spc * (ntmp)->ntm_bps) 29726f3deacStedu #define ntfs_btocn(off) (cn_t)((off) / ((ntmp)->ntm_spc * (ntmp)->ntm_bps)) 29826f3deacStedu #define ntfs_btocl(off) (cn_t)((off + ntfs_cntob(1) - 1) / ((ntmp)->ntm_spc * (ntmp)->ntm_bps)) 29926f3deacStedu #define ntfs_btocnoff(off) (off_t)((off) % ((ntmp)->ntm_spc * (ntmp)->ntm_bps)) 300ce7d09aaSderaadt #define ntfs_bntob(bn) (int32_t)((bn) * (ntmp)->ntm_bps) 30126f3deacStedu 302edafa7ceSbrad #ifdef _KERNEL 30326f3deacStedu #if defined(NTFS_DEBUG) 30426f3deacStedu extern int ntfs_debug; 305a1ea65c6Sjsing #define DNPRINTF(n, x...) do { if(ntfs_debug >= (n)) printf(x); } while(0) 306a1ea65c6Sjsing #define DPRINTF(x...) DNPRINTF(1, x) 307a1ea65c6Sjsing #define DDPRINTF(x...) DNPRINTF(2, x) 30826f3deacStedu #else /* NTFS_DEBUG */ 309a1ea65c6Sjsing #define DNPRINTF(n, x...) 310a1ea65c6Sjsing #define DPRINTF(x...) 311a1ea65c6Sjsing #define DDPRINTF(x...) 31226f3deacStedu #endif 31326f3deacStedu 3142d6b9e38Sclaudio extern const struct vops ntfs_vops; 315edafa7ceSbrad #endif 316