DragonFlyBSD Kernel Audit
DF-0829 / sz.c
← back to finding ↓ download raw
/* Userspace mirror of sys/vfs/hpfs/hpfs.h struct layouts (no kernel headers).
 * Verifies our byte offsets for image crafting. */
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>

typedef uint32_t u_int32_t;
typedef uint64_t u_int64_t;
typedef uint16_t u_int16_t;
typedef uint8_t  u_int8_t;
typedef u_int32_t lsn_t;
typedef struct { lsn_t lsn1, lsn2; } rsp_t;
typedef struct { u_int32_t cnt; lsn_t lsn; } sptr_t;
typedef struct { 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 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_int32_t su_chkdskdate;
    u_int32_t 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)
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 FN_MAGIC 0xF7E40AAE
struct ea { u_int8_t ea_type; u_int8_t ea_namelen; u_int16_t ea_vallen; };
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 OFF(T, f) ((size_t)((char*)&((T*)0)->f - (char*)0))
int main(void) {
    printf("sizeof(struct fnode)    = %zu (expect 512)\n", sizeof(struct fnode));
    printf("sizeof(struct sublock)  = %zu\n", sizeof(struct sublock));
    printf("sizeof(struct spblock)  = %zu\n", sizeof(struct spblock));
    printf("sizeof(struct ea)       = %zu\n", sizeof(struct ea));
    printf("sizeof(alblk_t)         = %zu\n", sizeof(alblk_t));
    printf("OFF fnode fn_magic    = %zu\n", OFF(struct fnode, fn_magic));
    printf("OFF fnode fn_readhist = %zu\n", OFF(struct fnode, fn_readhist));
    printf("OFF fnode fn_namelen  = %zu\n", OFF(struct fnode, fn_namelen));
    printf("OFF fnode fn_name     = %zu\n", OFF(struct fnode, fn_name));
    printf("OFF fnode fn_parent   = %zu\n", OFF(struct fnode, fn_parent));
    printf("OFF fnode fn_extacl   = %zu\n", OFF(struct fnode, fn_extacl));
    printf("OFF fnode fn_acllen   = %zu\n", OFF(struct fnode, fn_acllen));
    printf("OFF fnode fn_extea    = %zu\n", OFF(struct fnode, fn_extea));
    printf("OFF fnode fn_ealen    = %zu\n", OFF(struct fnode, fn_ealen));
    printf("OFF fnode fn_exteaflag= %zu\n", OFF(struct fnode, fn_exteaflag));
    printf("OFF fnode fn_flag     = %zu\n", OFF(struct fnode, fn_flag));
    printf("OFF fnode fn_ab       = %zu\n", OFF(struct fnode, fn_ab));
    printf("OFF fnode fn_abd      = %zu\n", OFF(struct fnode, fn_abd));
    printf("OFF fnode fn_size     = %zu\n", OFF(struct fnode, fn_size));
    printf("OFF fnode fn_int      = %zu\n", OFF(struct fnode, fn_int));
    printf("OFF sublock su_magic  = %zu\n", OFF(struct sublock, su_magic));
    printf("OFF sublock su_rootfno= %zu\n", OFF(struct sublock, su_rootfno));
    printf("OFF sublock su_btotal = %zu\n", OFF(struct sublock, su_btotal));
    printf("OFF sublock su_bitmap = %zu\n", OFF(struct sublock, su_bitmap));
    printf("OFF spblock sp_magic  = %zu\n", OFF(struct spblock, sp_magic));
    printf("OFF spblock sp_cpinum = %zu\n", OFF(struct spblock, sp_cpinum));
    printf("OFF spblock sp_cpi    = %zu\n", OFF(struct spblock, sp_cpi));
    return 0;
}