DF-0829 / sz.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | /* 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; } |