typedef u_int32_t lsn_t;
typedef struct {
lsn_t lsn1;
lsn_t lsn2;
} rsp_t;
typedef struct {
u_int32_t cnt;
lsn_t lsn;
} sptr_t;
#define SUBLOCK 0x10
#define SUSIZE DEV_BSIZE
#define SPBLOCK 0x11
#define SPSIZE DEV_BSIZE
#define BMSIZE (4 * DEV_BSIZE)
#define HPFS_MAXFILENAME 255
#define SU_MAGIC ((u_int64_t)0xFA53E9C5F995E849ULL)
struct sublock {
u_int64_t su_magic;
u_int8_t su_hpfsver;
u_int8_t su_fnctver;
u_int16_t unused;
lsn_t su_rootfno;
u_int32_t su_btotal;
u_int32_t su_badbtotal;
rsp_t su_bitmap;
rsp_t su_badbl;
u_long su_chkdskdate;
u_long su_dskoptdate;
u_int32_t su_dbbsz;
lsn_t su_dbbstart;
lsn_t su_dbbend;
lsn_t su_dbbbitmap;
char su_volname[0x20];
lsn_t su_uidt;
};
#define SP_MAGIC ((u_int64_t)0xFA5229C5F9911849ULL)
#define SP_DIRTY 0x0001
#define SP_SPDBINUSE 0x0002
#define SP_HFINUSE 0x0004
#define SP_BADSECT 0x0008
#define SP_BADBMBL 0x0010
#define SP_FASTFRMT 0x0020
#define SP_OLDHPFS 0x0080
#define SP_IDASD 0x0100
#define SP_RDASD 0x0200
#define SP_DASD 0x0400
#define SP_MMACTIVE 0x0800
#define SP_DCEACLS 0x1000
#define SP_DSADDIRTY 0x2000
struct spblock {
u_int64_t sp_magic;
u_int16_t sp_flag;
u_int8_t sp_mmcontf;
u_int8_t unused;
lsn_t sp_hf;
u_int32_t sp_hfinuse;
u_int32_t sp_hfavail;
u_int32_t sp_spdbavail;
u_int32_t sp_spdbmax;
lsn_t sp_cpi;
u_int32_t sp_cpinum;
u_int32_t sp_suchecksum;
u_int32_t sp_spchecksum;
u_int8_t reserved[0x3C];
lsn_t sp_spdb[0x65];
};
#define DE_SPECIAL 0x0001
#define DE_ACL 0x0002
#define DE_DOWN 0x0004
#define DE_END 0x0008
#define DE_EALIST 0x0010
#define DE_EPERM 0x0020
#define DE_EXPLACL 0x0040
#define DE_NEEDEA 0x0080
#define DE_RONLY 0x0100
#define DE_HIDDEN 0x0200
#define DE_SYSTEM 0x0400
#define DE_VOLLABEL 0x0800
#define DE_DIR 0x1000
#define DE_ARCHIV 0x2000
#define DE_DOWNLSN(dep) (*(lsn_t *)((caddr_t)(dep) + (dep)->de_reclen - sizeof(lsn_t)))
#define DE_NEXTDE(dep) ((struct hpfsdirent *)((caddr_t)(dep) + (dep)->de_reclen))
typedef struct hpfsdirent {
u_int16_t de_reclen;
u_int16_t de_flag;
lsn_t de_fnode;
u_long de_mtime;
u_int32_t de_size;
u_long de_atime;
u_long de_ctime;
u_int32_t de_ealen;
u_int8_t de_flexflag;
u_int8_t de_cpid;
u_int8_t de_namelen;
char de_name[1];
} hpfsdirent_t;
#define D_BSIZE (DEV_BSIZE*4)
#define D_MAGIC 0x77E40AAE
#define D_DIRENT(dbp) ((hpfsdirent_t *)((caddr_t)dbp + sizeof(dirblk_t)))
#define D_DE(dbp, deoff) ((hpfsdirent_t *)((caddr_t)dbp + sizeof(dirblk_t) + (deoff)))
typedef struct dirblk {
u_int32_t d_magic;
u_int32_t d_freeoff;
u_int32_t d_chcnt;
lsn_t d_parent;
lsn_t d_self;
} dirblk_t;
#define AB_HBOFFEO 0x01
#define AB_FNPARENT 0x20
#define AB_SUGGBSCH 0x40
#define AB_NODES 0x80
#define AB_ALLEAF(abp) ((alleaf_t *)((caddr_t)(abp) + sizeof(alblk_t)))
#define AB_ALNODE(abp) ((alnode_t *)((caddr_t)(abp) + sizeof(alblk_t)))
#define AB_FREEALP(abp) ((alleaf_t *)((caddr_t)(abp) + (abp)->ab_freeoff))
#define AB_FREEANP(abp) ((alnode_t *)((caddr_t)(abp) + (abp)->ab_freeoff))
#define AB_LASTALP(abp) (AB_ALLEAF(abp) + (abp)->ab_busycnt - 1)
#define AB_LASTANP(abp) (AB_ALNODE(abp) + (abp)->ab_busycnt - 1)
#define AB_ADDNREC(abp, sz, n) { \
(abp)->ab_busycnt += (n); \
(abp)->ab_freecnt -= (n); \
(abp)->ab_freeoff += (n) * (sz); \
}
#define AB_RMNREC(abp, sz, n) { \
(abp)->ab_busycnt -= (n); \
(abp)->ab_freecnt += (n); \
(abp)->ab_freeoff -= (n) * (sz);\
}
#define AB_ADDAL(abp) AB_ADDNREC(abp,sizeof(alleaf_t), 1)
#define AB_ADDAN(abp) AB_ADDNREC(abp,sizeof(alnode_t), 1)
#define AB_RMAL(abp) AB_RMNREC(abp,sizeof(alleaf_t), 1)
#define AB_RMAN(abp) AB_RMNREC(abp,sizeof(alnode_t), 1)
typedef struct alblk {
u_int8_t ab_flag;
u_int8_t ab_res[3];
u_int8_t ab_freecnt;
u_int8_t ab_busycnt;
u_int16_t ab_freeoff;
} alblk_t;
#define FNODESIZE DEV_BSIZE
#define FN_MAGIC 0xF7E40AAE
struct fnode {
u_int32_t fn_magic;
u_int64_t fn_readhist;
u_int8_t fn_namelen;
char fn_name[0xF];
lsn_t fn_parent;
sptr_t fn_extacl;
u_int16_t fn_acllen;
u_int8_t fn_extaclflag;
u_int8_t fn_histbitcount;
sptr_t fn_extea;
u_int16_t fn_ealen;
u_int8_t fn_exteaflag;
u_int8_t fn_flag;
alblk_t fn_ab;
u_int8_t fn_abd[0x60];
u_int32_t fn_size;
u_int32_t fn_reqea;
u_int8_t fn_uid[0x10];
u_int16_t fn_intoff;
u_int8_t fn_1dasdthr;
u_int8_t fn_dasdthr;
u_int32_t fn_dasdlim;
u_int32_t fn_dasdusage;
u_int8_t fn_int[0x13c];
};
#define EA_NAME(eap) ((char *)(((caddr_t)(eap)) + sizeof(struct ea)))
struct ea {
u_int8_t ea_type;
u_int8_t ea_namelen;
u_int16_t ea_vallen;
};
#define AN_SET(anp,nextoff,lsn) { \
(anp)->an_nextoff = (nextoff); \
(anp)->an_lsn = (lsn); \
}
typedef struct alnode {
u_int32_t an_nextoff;
lsn_t an_lsn;
} alnode_t;
#define AL_SET(alp,off,len,lsn) { \
(alp)->al_off = (off); \
(alp)->al_len = (len); \
(alp)->al_lsn = (lsn); \
}
typedef struct alleaf {
u_int32_t al_off;
u_int32_t al_len;
lsn_t al_lsn;
} alleaf_t;
#define AS_MAGIC 0x37E40AAE
typedef struct alsec {
u_int32_t as_magic;
lsn_t as_self;
lsn_t as_parent;
alblk_t as_ab;
u_int8_t as_abd[0x1E0];
} alsec_t;
struct cpdblk {
u_int16_t b_country;
u_int16_t b_cpid;
u_int16_t b_dbcscnt;
char b_upcase[0x80];
u_int16_t b_dbcsrange;
};
#define CPD_MAGIC ((u_int32_t)0x894521F7)
struct cpdsec {
u_int32_t d_magic;
u_int16_t d_cpcnt;
u_int16_t d_cpfirst;
u_int32_t d_checksum[3];
u_int16_t d_offset[3];
struct cpdblk d_cpdblk[3];
};
struct cpiblk {
u_int16_t b_country;
u_int16_t b_cpid;
u_int32_t b_checksum;
lsn_t b_cpdsec;
u_int16_t b_vcpid;
u_int16_t b_dbcscnt;
};
#define CPI_MAGIC ((u_int32_t)0x494521F7)
struct cpisec {
u_int32_t s_magic;
u_int32_t s_cpicnt;
u_int32_t s_cpifirst;
lsn_t s_next;
struct cpiblk s_cpi[0x1F];
};
struct hpfsmount {
struct sublock hpm_su;
struct spblock hpm_sp;
struct netexport hpm_export;
struct mount * hpm_mp;
struct vnode * hpm_devvp;
cdev_t hpm_dev;
uid_t hpm_uid;
gid_t hpm_gid;
mode_t hpm_mode;
lsn_t * hpm_bmind;
struct cpdblk * hpm_cpdblk;
u_char hpm_u2d[0x80];
u_char hpm_d2u[0x80];
u_long hpm_bavail;
u_long hpm_dbnum;
u_int8_t * hpm_bitmap;
};
#define H_HASHED 0x0001
#define H_PARVALID 0x0002
#define H_CHANGE 0x0004
#define H_PARCHANGE 0x0008
#define H_INVAL 0x0010
struct hpfsnode {
struct lwkt_token h_interlock;
LIST_ENTRY(hpfsnode) h_hash;
struct hpfsmount *h_hpmp;
struct fnode h_fn;
struct vnode * h_vp;
struct vnode * h_devvp;
cdev_t h_dev;
lsn_t h_no;
uid_t h_uid;
gid_t h_gid;
mode_t h_mode;
u_int32_t h_flag;
u_long h_mtime;
u_long h_atime;
u_long h_ctime;
char h_name[HPFS_MAXFILENAME+1];
int h_namelen;
};
struct hpfid {
u_int16_t hpfid_len;
u_int16_t hpfid_pad;
lsn_t hpfid_ino;
int32_t hpfid_gen;
};
#if defined(HPFS_DEBUG)
#define dprintf(a) kprintf a
#if HPFS_DEBUG > 1
#define ddprintf(a) kprintf a
#else
#define ddprintf(a)
#endif
#else
#define dprintf(a)
#define ddprintf(a)
#endif
#ifdef MALLOC_DECLARE
MALLOC_DECLARE(M_HPFSMNT);
MALLOC_DECLARE(M_HPFSNO);
#endif
#define VFSTOHPFS(mp) ((struct hpfsmount *)((mp)->mnt_data))
#define VTOHP(v) ((struct hpfsnode *)((v)->v_data))
#define HPTOV(h) ((struct vnode *)((h)->h_vp))
#define FID(f) (*((lsn_t *)(f)->fid_data))
#define dbtodoff(dbn) ((off_t)(dbn) << DEV_BSHIFT)
#define VOP__LOCK(a, b) vn_lock((a), (b) | LK_FAILRECLAIM)
#define VOP__UNLOCK(a, b) vn_unlock((a))
#define VGET(a, b, c) vget((a), (b))
#define VN_LOCK(a, b) vn_lock((a), (b))
#define LOCKMGR(a, b) lockmgr((a), (b))
struct vfsconf;
void hpfs_hphashinit (void);
int hpfs_hphash_uninit (struct vfsconf *);
struct hpfsnode *hpfs_hphashlookup (cdev_t, lsn_t);
struct hpfsnode *hpfs_hphashget (cdev_t, lsn_t);
struct vnode *hpfs_hphashvget (cdev_t, lsn_t);
void hpfs_hphashins (struct hpfsnode *);
void hpfs_hphashrem (struct hpfsnode *);
extern struct lock hpfs_hphash_lock;