mirror of
				https://github.com/bobranten/Ext4Fsd.git
				synced 2025-10-30 21:38:31 -05:00 
			
		
		
		
	Ext2Mgr adds + after fs name if it contains features not yet supported by the Windows driver, e.g EXT4+
This commit is contained in:
		
							
								
								
									
										235
									
								
								Ext2Mgr/super.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								Ext2Mgr/super.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,235 @@ | ||||
| #ifndef SUPER_H | ||||
| #define SUPER_H | ||||
|  | ||||
| /* The following is a subset of ext4.h used by the application */ | ||||
|  | ||||
| typedef unsigned char __u8; | ||||
| typedef unsigned short __u16, __le16; | ||||
| typedef unsigned int __u32, __le32; | ||||
| typedef unsigned long long __u64, __le64; | ||||
|  | ||||
| /* | ||||
|  * Structure of the super block | ||||
|  */ | ||||
| struct ext4_super_block { | ||||
| /*00*/	__le32	s_inodes_count;		/* Inodes count */ | ||||
| 	__le32	s_blocks_count_lo;	/* Blocks count */ | ||||
| 	__le32	s_r_blocks_count_lo;	/* Reserved blocks count */ | ||||
| 	__le32	s_free_blocks_count_lo;	/* Free blocks count */ | ||||
| /*10*/	__le32	s_free_inodes_count;	/* Free inodes count */ | ||||
| 	__le32	s_first_data_block;	/* First Data Block */ | ||||
| 	__le32	s_log_block_size;	/* Block size */ | ||||
| 	__le32	s_log_cluster_size;	/* Allocation cluster size */ | ||||
| /*20*/	__le32	s_blocks_per_group;	/* # Blocks per group */ | ||||
| 	__le32	s_clusters_per_group;	/* # Clusters per group */ | ||||
| 	__le32	s_inodes_per_group;	/* # Inodes per group */ | ||||
| 	__le32	s_mtime;		/* Mount time */ | ||||
| /*30*/	__le32	s_wtime;		/* Write time */ | ||||
| 	__le16	s_mnt_count;		/* Mount count */ | ||||
| 	__le16	s_max_mnt_count;	/* Maximal mount count */ | ||||
| 	__le16	s_magic;		/* Magic signature */ | ||||
| 	__le16	s_state;		/* File system state */ | ||||
| 	__le16	s_errors;		/* Behaviour when detecting errors */ | ||||
| 	__le16	s_minor_rev_level;	/* minor revision level */ | ||||
| /*40*/	__le32	s_lastcheck;		/* time of last check */ | ||||
| 	__le32	s_checkinterval;	/* max. time between checks */ | ||||
| 	__le32	s_creator_os;		/* OS */ | ||||
| 	__le32	s_rev_level;		/* Revision level */ | ||||
| /*50*/	__le16	s_def_resuid;		/* Default uid for reserved blocks */ | ||||
| 	__le16	s_def_resgid;		/* Default gid for reserved blocks */ | ||||
| 	/* | ||||
| 	 * These fields are for EXT4_DYNAMIC_REV superblocks only. | ||||
| 	 * | ||||
| 	 * Note: the difference between the compatible feature set and | ||||
| 	 * the incompatible feature set is that if there is a bit set | ||||
| 	 * in the incompatible feature set that the kernel doesn't | ||||
| 	 * know about, it should refuse to mount the filesystem. | ||||
| 	 * | ||||
| 	 * e2fsck's requirements are more strict; if it doesn't know | ||||
| 	 * about a feature in either the compatible or incompatible | ||||
| 	 * feature set, it must abort and not try to meddle with | ||||
| 	 * things it doesn't understand... | ||||
| 	 */ | ||||
| 	__le32	s_first_ino;		/* First non-reserved inode */ | ||||
| 	__le16  s_inode_size;		/* size of inode structure */ | ||||
| 	__le16	s_block_group_nr;	/* block group # of this superblock */ | ||||
| 	__le32	s_feature_compat;	/* compatible feature set */ | ||||
| /*60*/	__le32	s_feature_incompat;	/* incompatible feature set */ | ||||
| 	__le32	s_feature_ro_compat;	/* readonly-compatible feature set */ | ||||
| /*68*/	__u8	s_uuid[16];		/* 128-bit uuid for volume */ | ||||
| /*78*/	char	s_volume_name[16];	/* volume name */ | ||||
| /*88*/	char	s_last_mounted[64];	/* directory where last mounted */ | ||||
| /*C8*/	__le32	s_algorithm_usage_bitmap; /* For compression */ | ||||
| 	/* | ||||
| 	 * Performance hints.  Directory preallocation should only | ||||
| 	 * happen if the EXT4_FEATURE_COMPAT_DIR_PREALLOC flag is on. | ||||
| 	 */ | ||||
| 	__u8	s_prealloc_blocks;	/* Nr of blocks to try to preallocate*/ | ||||
| 	__u8	s_prealloc_dir_blocks;	/* Nr to preallocate for dirs */ | ||||
| 	__le16	s_reserved_gdt_blocks;	/* Per group desc for online growth */ | ||||
| 	/* | ||||
| 	 * Journaling support valid if EXT4_FEATURE_COMPAT_HAS_JOURNAL set. | ||||
| 	 */ | ||||
| /*D0*/	__u8	s_journal_uuid[16];	/* uuid of journal superblock */ | ||||
| /*E0*/	__le32	s_journal_inum;		/* inode number of journal file */ | ||||
| 	__le32	s_journal_dev;		/* device number of journal file */ | ||||
| 	__le32	s_last_orphan;		/* start of list of inodes to delete */ | ||||
| 	__le32	s_hash_seed[4];		/* HTREE hash seed */ | ||||
| 	__u8	s_def_hash_version;	/* Default hash version to use */ | ||||
| 	__u8	s_jnl_backup_type; | ||||
| 	__le16  s_desc_size;		/* size of group descriptor */ | ||||
| /*100*/	__le32	s_default_mount_opts; | ||||
| 	__le32	s_first_meta_bg;	/* First metablock block group */ | ||||
| 	__le32	s_mkfs_time;		/* When the filesystem was created */ | ||||
| 	__le32	s_jnl_blocks[17];	/* Backup of the journal inode */ | ||||
| 	/* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */ | ||||
| /*150*/	__le32	s_blocks_count_hi;	/* Blocks count */ | ||||
| 	__le32	s_r_blocks_count_hi;	/* Reserved blocks count */ | ||||
| 	__le32	s_free_blocks_count_hi;	/* Free blocks count */ | ||||
| 	__le16	s_min_extra_isize;	/* All inodes have at least # bytes */ | ||||
| 	__le16	s_want_extra_isize; 	/* New inodes should reserve # bytes */ | ||||
| 	__le32	s_flags;		/* Miscellaneous flags */ | ||||
| 	__le16  s_raid_stride;		/* RAID stride */ | ||||
| 	__le16  s_mmp_update_interval;  /* # seconds to wait in MMP checking */ | ||||
| 	__le64  s_mmp_block;            /* Block for multi-mount protection */ | ||||
| 	__le32  s_raid_stripe_width;    /* blocks on all data disks (N*stride)*/ | ||||
| 	__u8	s_log_groups_per_flex;  /* FLEX_BG group size */ | ||||
| 	__u8	s_checksum_type;	/* metadata checksum algorithm used */ | ||||
| 	__u8	s_encryption_level;	/* versioning level for encryption */ | ||||
| 	__u8	s_reserved_pad;		/* Padding to next 32bits */ | ||||
| 	__le64	s_kbytes_written;	/* nr of lifetime kilobytes written */ | ||||
| 	__le32	s_snapshot_inum;	/* Inode number of active snapshot */ | ||||
| 	__le32	s_snapshot_id;		/* sequential ID of active snapshot */ | ||||
| 	__le64	s_snapshot_r_blocks_count; /* reserved blocks for active | ||||
| 					      snapshot's future use */ | ||||
| 	__le32	s_snapshot_list;	/* inode number of the head of the | ||||
| 					   on-disk snapshot list */ | ||||
| 	__le32	s_error_count;		/* number of fs errors */ | ||||
| 	__le32	s_first_error_time;	/* first time an error happened */ | ||||
| 	__le32	s_first_error_ino;	/* inode involved in first error */ | ||||
| 	__le64	s_first_error_block;	/* block involved of first error */ | ||||
| 	__u8	s_first_error_func[32];	/* function where the error happened */ | ||||
| 	__le32	s_first_error_line;	/* line number where error happened */ | ||||
| 	__le32	s_last_error_time;	/* most recent time of an error */ | ||||
| 	__le32	s_last_error_ino;	/* inode involved in last error */ | ||||
| 	__le32	s_last_error_line;	/* line number where error happened */ | ||||
| 	__le64	s_last_error_block;	/* block involved of last error */ | ||||
| 	__u8	s_last_error_func[32];	/* function where the error happened */ | ||||
| 	__u8	s_mount_opts[64]; | ||||
| 	__le32	s_usr_quota_inum;	/* inode for tracking user quota */ | ||||
| 	__le32	s_grp_quota_inum;	/* inode for tracking group quota */ | ||||
| 	__le32	s_overhead_clusters;	/* overhead blocks/clusters in fs */ | ||||
| 	__le32	s_backup_bgs[2];	/* groups with sparse_super2 SBs */ | ||||
| 	__u8	s_encrypt_algos[4];	/* Encryption algorithms in use  */ | ||||
| 	__u8	s_encrypt_pw_salt[16];	/* Salt used for string2key algorithm */ | ||||
| 	__le32	s_lpf_ino;		/* Location of the lost+found inode */ | ||||
| 	__le32	s_prj_quota_inum;	/* inode for tracking project quota */ | ||||
| 	__le32	s_checksum_seed;	/* crc32c(uuid) if csum_seed set */ | ||||
| 	__u8	s_wtime_hi; | ||||
| 	__u8	s_mtime_hi; | ||||
| 	__u8	s_mkfs_time_hi; | ||||
| 	__u8	s_lastcheck_hi; | ||||
| 	__u8	s_first_error_time_hi; | ||||
| 	__u8	s_last_error_time_hi; | ||||
| 	__u8	s_pad[2]; | ||||
| 	__le32	s_reserved[96];		/* Padding to the end of the block */ | ||||
| 	__le32	s_checksum;		/* crc32c(superblock) */ | ||||
| }; | ||||
|  | ||||
| /* s_magic */ | ||||
| #define EXT4_SUPER_MAGIC	0xEF53 | ||||
|  | ||||
| /* | ||||
|  * Feature set definitions in s_feature_compat, | ||||
|  * s_feature_incompat and s_feature_ro_compat | ||||
|  */ | ||||
|  | ||||
| #define EXT4_HAS_COMPAT_FEATURE(sb,mask)			\ | ||||
| 	( (sb)->s_feature_compat & (mask) ) | ||||
| #define EXT4_HAS_RO_COMPAT_FEATURE(sb,mask)			\ | ||||
| 	( (sb)->s_feature_ro_compat & (mask) ) | ||||
| #define EXT4_HAS_INCOMPAT_FEATURE(sb,mask)			\ | ||||
| 	( (sb)->s_feature_incompat & (mask) ) | ||||
| #define EXT4_SET_COMPAT_FEATURE(sb,mask)			\ | ||||
| 	(sb)->s_feature_compat |= (mask) | ||||
| #define EXT4_SET_RO_COMPAT_FEATURE(sb,mask)			\ | ||||
| 	(sb)->s_feature_ro_compat |= (mask) | ||||
| #define EXT4_SET_INCOMPAT_FEATURE(sb,mask)			\ | ||||
| 	(sb)->s_feature_incompat |= (mask) | ||||
| #define EXT4_CLEAR_COMPAT_FEATURE(sb,mask)			\ | ||||
| 	(sb)->s_feature_compat &= ~(mask) | ||||
| #define EXT4_CLEAR_RO_COMPAT_FEATURE(sb,mask)			\ | ||||
| 	(sb)->s_feature_ro_compat &= ~(mask) | ||||
| #define EXT4_CLEAR_INCOMPAT_FEATURE(sb,mask)			\ | ||||
| 	(sb)->s_feature_incompat &= ~(mask) | ||||
|  | ||||
| #define EXT4_FEATURE_COMPAT_DIR_PREALLOC	0x0001 | ||||
| #define EXT4_FEATURE_COMPAT_IMAGIC_INODES	0x0002 | ||||
| #define EXT4_FEATURE_COMPAT_HAS_JOURNAL		0x0004 | ||||
| #define EXT4_FEATURE_COMPAT_EXT_ATTR		0x0008 | ||||
| #define EXT4_FEATURE_COMPAT_RESIZE_INODE	0x0010 | ||||
| #define EXT4_FEATURE_COMPAT_DIR_INDEX		0x0020 | ||||
| #define EXT4_FEATURE_COMPAT_SPARSE_SUPER2	0x0200 | ||||
| /* | ||||
|  * The reason why "FAST_COMMIT" is a compat feature is that, FS becomes | ||||
|  * incompatible only if fast commit blocks are present in the FS. Since we | ||||
|  * clear the journal (and thus the fast commit blocks), we don't mark FS as | ||||
|  * incompatible. We also have a JBD2 incompat feature, which gets set when | ||||
|  * there are fast commit blocks present in the journal. | ||||
|  */ | ||||
| #define EXT4_FEATURE_COMPAT_FAST_COMMIT		0x0400 | ||||
| #define EXT4_FEATURE_COMPAT_STABLE_INODES	0x0800 | ||||
| #define EXT4_FEATURE_COMPAT_ORPHAN_FILE		0x1000	/* Orphan file exists */ | ||||
|  | ||||
| #define EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER	0x0001 | ||||
| #define EXT4_FEATURE_RO_COMPAT_LARGE_FILE	0x0002 | ||||
| #define EXT4_FEATURE_RO_COMPAT_BTREE_DIR	0x0004 | ||||
| #define EXT4_FEATURE_RO_COMPAT_HUGE_FILE        0x0008 | ||||
| #define EXT4_FEATURE_RO_COMPAT_GDT_CSUM		0x0010 | ||||
| #define EXT4_FEATURE_RO_COMPAT_DIR_NLINK	0x0020 | ||||
| #define EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE	0x0040 | ||||
| #define EXT4_FEATURE_RO_COMPAT_QUOTA		0x0100 | ||||
| #define EXT4_FEATURE_RO_COMPAT_BIGALLOC		0x0200 | ||||
| /* | ||||
|  * METADATA_CSUM also enables group descriptor checksums (GDT_CSUM).  When | ||||
|  * METADATA_CSUM is set, group descriptor checksums use the same algorithm as | ||||
|  * all other data structures' checksums.  However, the METADATA_CSUM and | ||||
|  * GDT_CSUM bits are mutually exclusive. | ||||
|  */ | ||||
| #define EXT4_FEATURE_RO_COMPAT_METADATA_CSUM	0x0400 | ||||
| #define EXT4_FEATURE_RO_COMPAT_READONLY		0x1000 | ||||
| #define EXT4_FEATURE_RO_COMPAT_PROJECT		0x2000 | ||||
| #define EXT4_FEATURE_RO_COMPAT_VERITY		0x8000 | ||||
| #define EXT4_FEATURE_RO_COMPAT_ORPHAN_PRESENT	0x10000 /* Orphan file may be | ||||
| 							   non-empty */ | ||||
|  | ||||
| #define EXT4_FEATURE_INCOMPAT_COMPRESSION	0x0001 | ||||
| #define EXT4_FEATURE_INCOMPAT_FILETYPE		0x0002 | ||||
| #define EXT4_FEATURE_INCOMPAT_RECOVER		0x0004 /* Needs recovery */ | ||||
| #define EXT4_FEATURE_INCOMPAT_JOURNAL_DEV	0x0008 /* Journal device */ | ||||
| #define EXT4_FEATURE_INCOMPAT_META_BG		0x0010 | ||||
| #define EXT4_FEATURE_INCOMPAT_EXTENTS		0x0040 /* extents support */ | ||||
| #define EXT4_FEATURE_INCOMPAT_64BIT		0x0080 | ||||
| #define EXT4_FEATURE_INCOMPAT_MMP               0x0100 | ||||
| #define EXT4_FEATURE_INCOMPAT_FLEX_BG		0x0200 | ||||
| #define EXT4_FEATURE_INCOMPAT_EA_INODE		0x0400 /* EA in inode */ | ||||
| #define EXT4_FEATURE_INCOMPAT_DIRDATA		0x1000 /* data in dirent */ | ||||
| #define EXT4_FEATURE_INCOMPAT_CSUM_SEED		0x2000 | ||||
| #define EXT4_FEATURE_INCOMPAT_LARGEDIR		0x4000 /* >2GB or 3-lvl htree */ | ||||
| #define EXT4_FEATURE_INCOMPAT_INLINE_DATA	0x8000 /* data in inode */ | ||||
| #define EXT4_FEATURE_INCOMPAT_ENCRYPT		0x10000 | ||||
| #define EXT4_FEATURE_INCOMPAT_CASEFOLD		0x20000 | ||||
|  | ||||
| /* This declaration tells the application witch ext4 features the driver supports | ||||
|    so it must be kept in sync with ..\Ext4Fsd\include\linux\ext4.h */ | ||||
|  | ||||
| #define EXT4_FEATURE_INCOMPAT_SUPP	( \ | ||||
|                      EXT4_FEATURE_INCOMPAT_FILETYPE| \ | ||||
| 					 EXT4_FEATURE_INCOMPAT_RECOVER| \ | ||||
| 					 EXT4_FEATURE_INCOMPAT_META_BG| \ | ||||
| 					 EXT4_FEATURE_INCOMPAT_EXTENTS| \ | ||||
| 					 EXT4_FEATURE_INCOMPAT_64BIT| \ | ||||
| 					 EXT4_FEATURE_INCOMPAT_FLEX_BG| \ | ||||
| 					 EXT4_FEATURE_INCOMPAT_CSUM_SEED) | ||||
|  | ||||
| #endif /* SUPER_H */ | ||||
		Reference in New Issue
	
	Block a user