using System; using System.Collections.Generic; using System.Text; namespace ExploreUFS { class FS { internal const int MAXMNTLEN = 464; internal const int MAXVOLLEN = 32; internal const int FSMAXSNAP = 20; internal const int NOCSPTRS = ((124 / 4 - 4)); private Dictionary FieldSize = new Dictionary(); private Dictionary FieldData = new Dictionary(); public FS(byte[] Buffer) { FieldSize.Add("fs_firstfield", sizeof(int)); FieldSize.Add("fs_unused_1", sizeof(int)); FieldSize.Add("fs_sblkno", sizeof(int)); FieldSize.Add("fs_cblkno", sizeof(int)); FieldSize.Add("fs_iblkno", sizeof(int)); FieldSize.Add("fs_dblkno", sizeof(int)); FieldSize.Add("fs_old_cgoffset", sizeof(int)); FieldSize.Add("fs_old_cgmask", sizeof(int)); FieldSize.Add("fs_old_time", sizeof(int)); FieldSize.Add("fs_old_size", sizeof(int)); FieldSize.Add("fs_old_dsize", sizeof(int)); FieldSize.Add("fs_ncg", sizeof(int)); FieldSize.Add("fs_bsize", sizeof(int)); FieldSize.Add("fs_fsize", sizeof(int)); FieldSize.Add("fs_frag", sizeof(int)); FieldSize.Add("fs_minfree", sizeof(int)); FieldSize.Add("fs_old_rotdelay", sizeof(int)); FieldSize.Add("fs_old_rps", sizeof(int)); FieldSize.Add("fs_bmask", sizeof(int)); FieldSize.Add("fs_fmask", sizeof(int)); FieldSize.Add("fs_bshift", sizeof(int)); FieldSize.Add("fs_fshift", sizeof(int)); FieldSize.Add("fs_maxcontig", sizeof(int)); FieldSize.Add("fs_maxbpg", sizeof(int)); FieldSize.Add("fs_fragshift", sizeof(int)); FieldSize.Add("fs_fsbtodb", sizeof(int)); FieldSize.Add("fs_sbsize", sizeof(int)); FieldSize.Add("fs_spare1", sizeof(int) * 2); FieldSize.Add("fs_nindir", sizeof(int)); FieldSize.Add("fs_inopb", sizeof(int)); FieldSize.Add("fs_old_nspf", sizeof(int)); FieldSize.Add("fs_optim", sizeof(int)); FieldSize.Add("fs_old_npsect", sizeof(int)); FieldSize.Add("fs_old_interleave", sizeof(int)); FieldSize.Add("fs_old_trackskew", sizeof(int)); FieldSize.Add("fs_id", sizeof(int) * 2); FieldSize.Add("fs_old_csaddr", sizeof(int)); FieldSize.Add("fs_cssize", sizeof(int)); FieldSize.Add("fs_cgsize", sizeof(int)); FieldSize.Add("fs_spare2", sizeof(int)); FieldSize.Add("fs_old_nsect", sizeof(int)); FieldSize.Add("fs_old_spc", sizeof(int)); FieldSize.Add("fs_old_ncyl", sizeof(int)); FieldSize.Add("fs_old_cpg", sizeof(int)); FieldSize.Add("fs_ipg", sizeof(int)); FieldSize.Add("fs_fpg", sizeof(int)); FieldSize.Add("fs_old_cstotal", 16); // CSUM FieldSize.Add("fs_fmod", sizeof(byte)); FieldSize.Add("fs_clean", sizeof(byte)); FieldSize.Add("fs_ronly", sizeof(byte)); FieldSize.Add("fs_old_flags", sizeof(byte)); FieldSize.Add("fs_fsmnt", MAXMNTLEN * sizeof(char)); FieldSize.Add("fs_volname", MAXVOLLEN * sizeof(char)); FieldSize.Add("fs_swuid", sizeof(long)); FieldSize.Add("fs_pad", sizeof(int)); FieldSize.Add("fs_cgrotor", sizeof(int)); FieldSize.Add("fs_ocsp", NOCSPTRS * sizeof(int)); FieldSize.Add("fs_contigdirs", sizeof(int)); // ptr FieldSize.Add("fs_csp", sizeof(int)); // CSUM ptr FieldSize.Add("fs_maxcluster", sizeof(int)); FieldSize.Add("fs_active", sizeof(int)); FieldSize.Add("fs_old_cpc", sizeof(int)); FieldSize.Add("fs_maxbsize", sizeof(int)); FieldSize.Add("fs_sparecon64", sizeof(long) * 17); FieldSize.Add("fs_sblockloc", sizeof(long)); FieldSize.Add("fs_cstotal", sizeof(long) * 5 + sizeof(long) * 3); // CSUM TOTAL FieldSize.Add("fs_time", sizeof(long)); FieldSize.Add("fs_size", sizeof(long)); FieldSize.Add("fs_dsize", sizeof(long)); FieldSize.Add("fs_csaddr", sizeof(long)); FieldSize.Add("fs_pendingblocks", sizeof(long)); FieldSize.Add("fs_pendinginodes", sizeof(int)); FieldSize.Add("fs_snapinum", sizeof(int)); FieldSize.Add("fs_avgfilesize", sizeof(int)); FieldSize.Add("fs_avgfpdir", sizeof(int)); FieldSize.Add("fs_save_cgsize", sizeof(int)); FieldSize.Add("fs_sparecon32", sizeof(int)); FieldSize.Add("fs_flags", sizeof(int)); FieldSize.Add("fs_contigsumsize", sizeof(int)); FieldSize.Add("fs_maxsymlinklen", sizeof(int)); FieldSize.Add("fs_old_inodefmt", sizeof(int)); FieldSize.Add("fs_maxfilesize", sizeof(long)); FieldSize.Add("fs_qbmask", sizeof(long)); FieldSize.Add("fs_qfmask", sizeof(long)); FieldSize.Add("fs_state", sizeof(int)); FieldSize.Add("fs_old_postblformat", sizeof(int)); FieldSize.Add("fs_old_nrpos", sizeof(int)); FieldSize.Add("fs_spare5", sizeof(int)); FieldSize.Add("fs_magic", sizeof(int)); FieldData.Clear(); int Offset = 0; foreach (KeyValuePair kvp in FieldSize) { FieldData.Add(kvp.Key, new byte[kvp.Value]); for (int i = Offset; i < kvp.Value; i++) { FieldData[kvp.Key][i - Offset] = Buffer[i]; } Offset += kvp.Value; } } } }