📄 ext2fs.h
字号:
/*
* COPYRIGHT: See COPYRIGHT.TXT
* PROJECT: Ext2 File System Driver for WinNT/2K/XP
* FILE: Ext2fs.h
* PURPOSE: Header file: ext2 structures
* PROGRAMMER: Matt Wu <mattwu@163.com>
* HOMEPAGE: http://ext2.yeah.net
* UPDATE HISTORY:
*/
#ifndef _EXT2_HEADER_
#define _EXT2_HEADER_
/* INCLUDES *************************************************************/
#include <linux/module.h>
#include <ntdddisk.h>
#include "stdio.h"
#include <string.h>
#include <linux/ext2_fs.h>
/* DEBUG ****************************************************************/
#define EXT2_DEBUG DBG
#if EXT2_DEBUG
#if _X86_
#define DbgBreak() /* __asm int 3 */
#else
#define DbgBreak() /* KdBreakPoint() */
#endif
#else
#define DbgBreak()
#endif
/* STRUCTS & CONSTS******************************************************/
#define EXT2FSD_VERSION "0.46"
//
// Ext2Fsd build options
//
// To support driver dynamics unload
#define EXT2_UNLOAD FALSE
//
// Constants
//
#define EXT2_MAX_NESTED_LINKS (8)
#define EXT2_LINKLEN_IN_INODE (60)
#define EXT2_BLOCK_TYPES (0x04)
#define MAXIMUM_RECORD_LENGTH (0x10000)
#define SECTOR_BITS (Vcb->SectorBits)
#define SECTOR_SIZE (Vcb->DiskGeometry.BytesPerSector)
#define DEFAULT_SECTOR_SIZE (0x200)
#define SUPER_BLOCK_OFFSET (0x400)
#define SUPER_BLOCK_SIZE (0x400)
#define READ_AHEAD_GRANULARITY (0x10000)
#define SUPER_BLOCK (Vcb->SuperBlock)
#define INODE_SIZE (Vcb->InodeSize)
#define BLOCK_SIZE (Vcb->BlockSize)
#define BLOCK_BITS (SUPER_BLOCK->s_log_block_size + 10)
#define INODES_COUNT (Vcb->SuperBlock->s_inodes_count)
#define INODES_PER_GROUP (SUPER_BLOCK->s_inodes_per_group)
#define BLOCKS_PER_GROUP (SUPER_BLOCK->s_blocks_per_group)
#define TOTAL_BLOCKS (SUPER_BLOCK->s_blocks_count)
#define EXT2_FIRST_DATA_BLOCK (SUPER_BLOCK->s_first_data_block)
typedef struct ext2_super_block EXT2_SUPER_BLOCK, *PEXT2_SUPER_BLOCK;
typedef struct ext2_inode EXT2_INODE, *PEXT2_INODE;
typedef struct ext2_group_desc EXT2_GROUP_DESC, *PEXT2_GROUP_DESC;
typedef struct ext2_dir_entry EXT2_DIR_ENTRY, *PEXT2_DIR_ENTRY;
typedef struct ext2_dir_entry_2 EXT2_DIR_ENTRY2, *PEXT2_DIR_ENTRY2;
#define CEILING_ALIGNED(T, A, B) (((A) + (B) - 1) & (~((T)(B) - 1)))
#define COCKLOFT_ALIGNED(T, A, B) (((A) + (B)) & (~((T)(B) - 1)))
/* File System Releated *************************************************/
#define DRIVER_NAME "Ext2Fsd"
#define DEVICE_NAME L"\\Ext2Fsd"
#define CDROM_NAME L"\\Ext2CdFsd"
// Registry
#define PARAMETERS_KEY L"\\Parameters"
#define VOLUMES_KEY L"\\Volumes"
#define READING_ONLY L"Readonly"
#define WRITING_SUPPORT L"WritingSupport"
#define CHECKING_BITMAP L"CheckingBitmap"
#define EXT3_FORCEWRITING L"Ext3ForceWriting"
#define CODEPAGE_NAME L"CodePage"
#define HIDING_PREFIX L"HidingPrefix"
#define HIDING_SUFFIX L"HidingSuffix"
#define MOUNT_POINT L"MountPoint"
#define DOS_DEVICE_NAME L"\\DosDevices\\Ext2Fsd"
// To support ext2fsd unload routine
#if EXT2_UNLOAD
//
// Private IOCTL to make the driver ready to unload
//
#define IOCTL_PREPARE_TO_UNLOAD \
CTL_CODE(FILE_DEVICE_UNKNOWN, 2048, METHOD_NEITHER, FILE_WRITE_ACCESS)
#endif // EXT2_UNLOAD
#include "common.h"
#ifndef _GNU_NTIFS_
typedef IO_STACK_LOCATION EXTENDED_IO_STACK_LOCATION, *PEXTENDED_IO_STACK_LOCATION;
#endif
#define IsFlagOn(a,b) ((BOOLEAN)(FlagOn(a,b) == b))
#ifndef FlagOn
#define FlagOn(_F,_SF) ((_F) & (_SF))
#endif
#ifndef BooleanFlagOn
#define BooleanFlagOn(F,SF) ((BOOLEAN)(((F) & (SF)) != 0))
#endif
#ifndef SetFlag
#define SetFlag(_F,_SF) ((_F) |= (_SF))
#endif
#ifndef ClearFlag
#define ClearFlag(_F,_SF) ((_F) &= ~(_SF))
#endif
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifdef _WIN2K_TARGET_
#define InterlockedOr _InterlockedOr
LONG
_InterlockedAnd (
IN OUT LONG volatile *Target,
IN LONG Set
);
#pragma intrinsic (_InterlockedAnd)
#define InterlockedAnd _InterlockedAnd
LONG
_InterlockedXor (
IN OUT LONG volatile *Target,
IN LONG Set
);
#pragma intrinsic (_InterlockedXor)
#define InterlockedXor _InterlockedXor
#endif /* only for win2k */
#if EXT2_DEBUG
#define SetLongFlag(_F,_SF) Ext2SetFlag(&(_F), (ULONG)(_SF))
#define ClearLongFlag(_F,_SF) Ext2ClearFlag(&(_F), (ULONG)(_SF))
__inline
VOID
Ext2SetFlag(PULONG Flags, ULONG FlagBit)
{
ULONG _ret = InterlockedOr(Flags, FlagBit);
ASSERT(*Flags == (_ret | FlagBit));
}
__inline
VOID
Ext2ClearFlag(PULONG Flags, ULONG FlagBit)
{
ULONG _ret = InterlockedAnd(Flags, ~FlagBit);
ASSERT(*Flags == (_ret & (~FlagBit)));
}
#else
#define SetLongFlag(_F,_SF) InterlockedOr(&(_F), (ULONG)(_SF))
#define ClearLongFlag(_F,_SF) InterlockedAnd(&(_F), ~((ULONG)(_SF)))
#endif /* release */
#define Ext2RaiseStatus(IRPCONTEXT,STATUS) { \
(IRPCONTEXT)->ExceptionCode = (STATUS); \
ExRaiseStatus((STATUS)); \
}
#define Ext2NormalizeAndRaiseStatus(IRPCONTEXT,STATUS) { \
(IRPCONTEXT)->ExceptionCode = STATUS; \
if ((STATUS) == STATUS_VERIFY_REQUIRED) { ExRaiseStatus((STATUS)); } \
ExRaiseStatus(FsRtlNormalizeNtstatus((STATUS),STATUS_UNEXPECTED_IO_ERROR)); \
}
//
// Define IsEndofFile for read and write operations
//
#define FILE_WRITE_TO_END_OF_FILE 0xffffffff
#define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
#define IsEndOfFile(Pos) ((Pos.LowPart == FILE_WRITE_TO_END_OF_FILE) && \
(Pos.HighPart == FILE_USE_FILE_POINTER_POSITION ))
#define IsMcbReadonly(Mcb) IsFlagOn(Mcb->FileAttr, FILE_ATTRIBUTE_READONLY)
#define IsMcbDirectory(Mcb) IsFlagOn(Mcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY)
#define IsDirectory(Fcb) IsMcbDirectory(Fcb->Mcb)
#define IsSymlink(Fcb) IsMcbSymlink(Fcb->Mcb)
#define IsInodeSymlink(I) S_ISLNK((I)->i_mode)
#define IsRoot(Fcb) IsMcbRoot(Fcb->Mcb)
#define IsMcbRoot(Mcb) (Mcb->iNo == EXT2_ROOT_INO)
//
// Pool Tags
//
#define TAG_VPB ' bpV'
#define VPB_SIZE sizeof(VPB)
#define EXT2_DATA_MAGIC 'BD2E'
#define EXT2_INAME_MAGIC 'NI2E'
#define EXT2_FNAME_MAGIC 'NF2E'
#define EXT2_VNAME_MAGIC 'NV2E'
#define EXT2_DENTRY_MAGIC 'ED2E'
#define EXT2_DIRSP_MAGIC 'SD2E'
#define EXT2_SB_MAGIC 'BS2E'
#define EXT2_GD_MAGIC 'DG2E'
#define EXT2_FLIST_MAGIC 'LF2E'
#define EXT2_PARAM_MAGIC 'PP2E'
#define EXT2_RWC_MAGIC 'WR2E'
//
// Bug Check Codes Definitions
//
#define EXT2_FILE_SYSTEM (FILE_SYSTEM)
#define EXT2_BUGCHK_BLOCK (0x00010000)
#define EXT2_BUGCHK_CLEANUP (0x00020000)
#define EXT2_BUGCHK_CLOSE (0x00030000)
#define EXT2_BUGCHK_CMCB (0x00040000)
#define EXT2_BUGCHK_CREATE (0x00050000)
#define EXT2_BUGCHK_DEBUG (0x00060000)
#define EXT2_BUGCHK_DEVCTL (0x00070000)
#define EXT2_BUGCHK_DIRCTL (0x00080000)
#define EXT2_BUGCHK_DISPATCH (0x00090000)
#define EXT2_BUGCHK_EXCEPT (0x000A0000)
#define EXT2_BUGCHK_EXT2 (0x000B0000)
#define EXT2_BUGCHK_FASTIO (0x000C0000)
#define EXT2_BUGCHK_FILEINFO (0x000D0000)
#define EXT2_BUGCHK_FLUSH (0x000E0000)
#define EXT2_BUGCHK_FSCTL (0x000F0000)
#define EXT2_BUGCHK_INIT (0x00100000)
#define EXT2_BUGCHK_LOCK (0x0011000)
#define EXT2_BUGCHK_MEMORY (0x0012000)
#define EXT2_BUGCHK_MISC (0x0013000)
#define EXT2_BUGCHK_READ (0x00140000)
#define EXT2_BUGCHK_SHUTDOWN (0x00150000)
#define EXT2_BUGCHK_VOLINFO (0x00160000)
#define EXT2_BUGCHK_WRITE (0x00170000)
#define EXT2_BUGCHK_LAST (0x00170000)
#define Ext2BugCheck(A,B,C,D) { KeBugCheckEx(EXT2_FILE_SYSTEM, A | __LINE__, B, C, D ); }
/* Ext2 file system definions *******************************************/
//
// The second extended file system magic number
//
#define EXT2_SUPER_MAGIC 0xEF53
#define EXT2_MIN_BLOCK 1024
#define EXT2_MIN_FRAG 1024
#define EXT2_MAX_USER_BLKSIZE 65536
//
// Inode flags (Linux uses octad number, but why ? strange!!!)
//
#define S_IFMT 0x0F000 /* 017 0000 */
#define S_IFSOCK 0x0C000 /* 014 0000 */
#define S_IFLNK 0x0A000 /* 012 0000 */
#define S_IFREG 0x08000 /* 010 0000 */
#define S_IFBLK 0x06000 /* 006 0000 */
#define S_IFDIR 0x04000 /* 004 0000 */
#define S_IFCHR 0x02000 /* 002 0000 */
#define S_IFIFO 0x01000 /* 001 0000 */
#define S_ISUID 0x00800 /* 000 4000 */
#define S_ISGID 0x00400 /* 000 2000 */
#define S_ISVTX 0x00200 /* 000 1000 */
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
#define S_ISFIL(m) (((m) & S_IFMT) == S_IFFIL)
#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
#define S_IPERMISSION_MASK 0x1FF /* */
#define S_IRWXU 0x1C0 /* 0 0700 */
#define S_IRWNU 0x180 /* 0 0600 */
#define S_IRUSR 0x100 /* 0 0400 */
#define S_IWUSR 0x080 /* 0 0200 */
#define S_IXUSR 0x040 /* 0 0100 */
#define S_IRWXG 0x038 /* 0 0070 */
#define S_IRWNG 0x030 /* 0 0060 */
#define S_IRGRP 0x020 /* 0 0040 */
#define S_IWGRP 0x010 /* 0 0020 */
#define S_IXGRP 0x008 /* 0 0010 */
#define S_IRWXO 0x007 /* 0 0007 */
#define S_IRWNO 0x006 /* 0 0006 */
#define S_IROTH 0x004 /* 0 0004 */
#define S_IWOTH 0x002 /* 0 0002 */
#define S_IXOTH 0x001 /* 0 0001 */
#define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO)
#define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
#define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH)
#define S_IWUGO (S_IWUSR|S_IWGRP|S_IWOTH)
#define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH)
#define S_IFATTR (S_IRWNU|S_IRWNG|S_IRWNO)
#define S_ISREADABLE(m) (((m) & S_IPERMISSION_MASK) == (S_IRUSR | S_IRGRP | S_IROTH))
#define S_ISWRITABLE(m) (((m) & S_IPERMISSION_MASK) == (S_IWUSR | S_IWGRP | S_IWOTH))
#define Ext2SetReadable(m) (m) = ((m) | (S_IRUSR | S_IRGRP | S_IROTH))
#define Ext2SetWritable(m) (m) = ((m) | (S_IWUSR | S_IWGRP | S_IWOTH))
#define Ext2SetOwnerWritable(m) (m) = ((m) | (S_IWUSR))
#define Ext2SetReadOnly(m) (m) = ((m) & (~(S_IWUSR | S_IWGRP | S_IWOTH)))
#define Ext2IsReadOnly(m) (!((m) & (S_IWUSR | S_IWGRP | S_IWOTH)))
//
// Inode state bits
//
#define I_DIRTY_SYNC 1 /* Not dirty enough for O_DATASYNC */
#define I_DIRTY_DATASYNC 2 /* Data-related inode changes pending */
#define I_DIRTY_PAGES 4 /* Data-related inode changes pending */
#define I_LOCK 8
#define I_FREEING 16
#define I_CLEAR 32
#define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES)
/*
* We need 8-bytes aligned for all the sturctures
* It's a must for all ERESOURCE allocations
*/
//
// Ext2Fsd Driver Definitions
//
//
// EXT2_IDENTIFIER_TYPE
//
// Identifiers used to mark the structures
//
typedef enum _EXT2_IDENTIFIER_TYPE {
#ifdef _MSC_VER
EXT2FGD = ':DGF',
EXT2VCB = ':BCV',
EXT2FCB = ':BCF',
EXT2CCB = ':BCC',
EXT2ICX = ':XCI',
EXT2FSD = ':DSF',
EXT2MCB = ':BCM'
#else
EXT2FGD = 0xE2FD0001,
EXT2VCB = 0xE2FD0002,
EXT2FCB = 0xE2FD0003,
EXT2CCB = 0xE2FD0004,
EXT2ICX = 0xE2FD0005,
EXT2FSD = 0xE2FD0006,
EXT2MCB = 0xE2FD0007
#endif
} EXT2_IDENTIFIER_TYPE;
//
// EXT2_IDENTIFIER
//
// Header used to mark the structures
//
typedef struct _EXT2_IDENTIFIER {
EXT2_IDENTIFIER_TYPE Type;
ULONG Size;
} EXT2_IDENTIFIER, *PEXT2_IDENTIFIER;
#define NodeType(Ptr) (*((EXT2_IDENTIFIER_TYPE *)(Ptr)))
typedef struct _EXT2_MCB EXT2_MCB, *PEXT2_MCB;
typedef PVOID PBCB;
//
//
// EXT2_GLOBAL_DATA
//
// Data that is not specific to a mounted volume
//
typedef struct _EXT2_GLOBAL {
/* Identifier for this structure */
EXT2_IDENTIFIER Identifier;
/* Syncronization primitive for this structure */
ERESOURCE Resource;
/* Global flags for the driver: I put it since
FastIoDispatch isn't 8bytes aligned. */
ULONG Flags;
/* Table of pointers to the fast I/O entry points */
FAST_IO_DISPATCH FastIoDispatch;
/* Table of pointers to the Cache Manager callbacks */
CACHE_MANAGER_CALLBACKS CacheManagerCallbacks;
CACHE_MANAGER_CALLBACKS CacheManagerNoOpCallbacks;
/* Pointer to the driver object */
PDRIVER_OBJECT DriverObject;
/* Pointer to the disk device object */
PDEVICE_OBJECT DiskdevObject;
/* Pointer to the cdrom device object */
PDEVICE_OBJECT CdromdevObject;
/* List of mounted volumes */
LIST_ENTRY VcbList;
/* Cleaning thread related: resource cleaner */
struct {
KEVENT Engine;
KEVENT Wait;
} Reaper;
/* Look Aside table of IRP_CONTEXT, FCB, MCB, CCB */
NPAGED_LOOKASIDE_LIST Ext2IrpContextLookasideList;
NPAGED_LOOKASIDE_LIST Ext2FcbLookasideList;
PAGED_LOOKASIDE_LIST Ext2CcbLookasideList;
PAGED_LOOKASIDE_LIST Ext2McbLookasideList;
PAGED_LOOKASIDE_LIST Ext2ExtLookasideList;
USHORT MaxDepth;
/* User specified global codepage name */
struct {
UCHAR AnsiName[CODEPAGE_MAXLEN];
struct nls_table * PageTable;
} Codepage;
/* global hiding patterns */
BOOLEAN bHidingPrefix;
CHAR sHidingPrefix[HIDINGPAT_LEN];
BOOLEAN bHidingSuffix;
CHAR sHidingSuffix[HIDINGPAT_LEN];
/* Registery path */
UNICODE_STRING RegistryPath;
/* global memory and i/o statistics and memory allocations
of various sturctures */
EXT2_PERF_STATISTICS PerfStat;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -