📄 ext2fs.h
字号:
} EXT2_GLOBAL, *PEXT2_GLOBAL;
//
// Flags for EXT2_GLOBAL_DATA
//
#define EXT2_UNLOAD_PENDING 0x00000001
#define EXT2_SUPPORT_WRITING 0x00000002
#define EXT3_FORCE_WRITING 0x00000004
#define EXT2_CHECKING_BITMAP 0x00000008
//
// Glboal Ext2Fsd Memory Block
//
extern PEXT2_GLOBAL Ext2Global;
//
// memory allocation statistics
//
#define INC_MEM_COUNT(_i, _p, _s) do { ASSERT(_p); Ext2TraceMemory(TRUE, (int) (_i), (PVOID)(_p), (LONG)(_s)); } while(0)
#define DEC_MEM_COUNT(_i, _p, _s) do { ASSERT(_p); Ext2TraceMemory(FALSE, (int) (_i), (PVOID)(_p), (LONG)(_s)); } while(0)
#define INC_IRP_COUNT(IrpContext) Ext2TraceIrpContext(TRUE, (IrpContext))
#define DEC_IRP_COUNT(IrpContext) Ext2TraceIrpContext(FALSE, (IrpContext))
//
// Driver Extension define
//
#define IsExt2FsDevice(DO) ((DO == Ext2Global->DiskdevObject) || \
(DO == Ext2Global->CdromdevObject) )
#ifdef _WIN2K_TARGET_
#define FSRTL_ADVANCED_FCB_HEADER FSRTL_COMMON_FCB_HEADER
#endif
typedef struct _EXT2_FCBVCB {
// Command header for Vcb and Fcb
FSRTL_ADVANCED_FCB_HEADER Header;
#ifndef _WIN2K_TARGET_
FAST_MUTEX Mutex;
#endif
// Ext2Fsd identifier
EXT2_IDENTIFIER Identifier;
// Locking resources
ERESOURCE MainResource;
ERESOURCE PagingIoResource;
} EXT2_FCBVCB, *PEXT2_FCBVCB;
//
// EXT2_VCB Volume Control Block
//
// Data that represents a mounted logical volume
// It is allocated as the device extension of the volume device object
//
typedef struct _EXT2_VCB {
/* Common header */
EXT2_FCBVCB;
// Resource for metadata (super block, tables)
ERESOURCE MetaLock;
// Resource for Mcb (Meta data control block)
ERESOURCE McbLock;
// Entry of Mcb Tree (Root Node)
PEXT2_MCB McbTree;
// Mcb list
LIST_ENTRY McbList;
ULONG NumOfMcb;
// Link list to Global
LIST_ENTRY Next;
// Section objects
SECTION_OBJECT_POINTERS SectionObject;
// Dirty Mcbs of modifications for volume stream
LARGE_MCB Extents;
// List of FCBs for open files on this volume
ULONG FcbCount;
LIST_ENTRY FcbList;
KSPIN_LOCK FcbLock;
// Share Access for the file object
SHARE_ACCESS ShareAccess;
// Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
// for files on this volume.
ULONG OpenFileHandleCount;
// Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
// for both files on this volume and open instances of the
// volume itself.
ULONG ReferenceCount;
ULONG OpenHandleCount;
// Disk change count
ULONG ChangeCount;
// Pointer to the VPB in the target device object
PVPB Vpb;
// The FileObject of Volume used to lock the volume
PFILE_OBJECT LockFile;
// List of IRPs pending on directory change notify requests
LIST_ENTRY NotifyList;
// Pointer to syncronization primitive for this list
PNOTIFY_SYNC NotifySync;
// This volumes device object
PDEVICE_OBJECT DeviceObject;
// The physical device object (the disk)
PDEVICE_OBJECT TargetDeviceObject;
// The physical device object (the disk)
PDEVICE_OBJECT RealDevice;
// Information about the physical device object
DISK_GEOMETRY DiskGeometry;
PARTITION_INFORMATION PartitionInformation;
BOOLEAN IsExt3fs;
PEXT2_SUPER_BLOCK SuperBlock;
PEXT2_GROUP_DESC GroupDesc;
// PVOID GroupDescBcb;
// Number of Group Decsciptions
ULONG NumOfGroups;
/*
// Bitmap Block per group
PRTL_BITMAP BlockBitMaps;
PRTL_BITMAP InodeBitMaps;
*/
// Block / Cluster size
ULONG BlockSize;
// Sector size in bits
ULONG SectorBits;
/* Maximum file size in blocks ... */
ULONG MaxInodeBlocks;
ULONG NumBlocks[EXT2_BLOCK_TYPES];
// Inode size
ULONG InodeSize;
// Inode lookaside list
NPAGED_LOOKASIDE_LIST InodeLookasideList;
// Flags for the volume
ULONG Flags;
// Streaming File Object
PFILE_OBJECT Volume;
// User specified codepage name per volume
struct {
UCHAR AnsiName[CODEPAGE_MAXLEN];
struct nls_table * PageTable;
} Codepage;
/* patterns to hiding files */
BOOLEAN bHidingPrefix;
CHAR sHidingPrefix[HIDINGPAT_LEN];
BOOLEAN bHidingSuffix;
CHAR sHidingSuffix[HIDINGPAT_LEN];
/* mountpoint: symlink to DesDevices */
UCHAR DrvLetter;
} EXT2_VCB, *PEXT2_VCB;
//
// Flags for EXT2_VCB
//
#define VCB_INITIALIZED 0x00000001
#define VCB_VOLUME_LOCKED 0x00000002
#define VCB_MOUNTED 0x00000004
#define VCB_DISMOUNT_PENDING 0x00000008
#define VCB_NEW_VPB 0x00000010
#define VCB_BEING_CLOSED 0x00000020
#define VCB_JOURNAL_RECOVER 0x00080000
#define VCB_ARRIVAL_NOTIFIED 0x00800000
#define VCB_READ_ONLY 0x08000000
#define VCB_WRITE_PROTECTED 0x10000000
#define VCB_FLOPPY_DISK 0x20000000
#define VCB_REMOVAL_PREVENTED 0x40000000
#define VCB_REMOVABLE_MEDIA 0x80000000
#define IsMounted(Vcb) (IsFlagOn(Vcb->Flags, VCB_MOUNTED))
#define IsDispending(Vcb) (IsFlagOn(Vcb->Flags, VCB_DISMOUNT_PENDING))
//
// EXT2_FCB File Control Block
//
// Data that represents an open file
// There is a single instance of the FCB for every open file
//
typedef struct _EXT2_FCB {
/* Common header */
EXT2_FCBVCB;
// List of FCBs for this volume
LIST_ENTRY Next;
SECTION_OBJECT_POINTERS SectionObject;
// Share Access for the file object
SHARE_ACCESS ShareAccess;
// List of byte-range locks for this file
FILE_LOCK FileLockAnchor;
// oplock information management structure
OPLOCK Oplock;
// Lazy writer thread context
PETHREAD LazyWriterThread;
// Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
ULONG OpenHandleCount;
// Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
ULONG ReferenceCount;
// Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
// But only for Files with FO_NO_INTERMEDIATE_BUFFERING flag
ULONG NonCachedOpenCount;
// Flags for the FCB
ULONG Flags;
// Pointer to the inode
PEXT2_INODE Inode;
// Vcb
PEXT2_VCB Vcb;
// Mcb Node ...
PEXT2_MCB Mcb;
// Allocation size allocated in Ext2Create
LARGE_INTEGER RealSize;
} EXT2_FCB, *PEXT2_FCB;
//
// Flags for EXT2_FCB
//
#define FCB_FROM_POOL 0x00000001
#define FCB_PAGE_FILE 0x00000002
#define FCB_DELETE_ON_CLOSE 0x00000004
#define FCB_DELETE_PENDING 0x00000008
#define FCB_FILE_DELETED 0x00000010
#define FCB_FILE_MODIFIED 0x00000020
#define FCB_STATE_BUSY 0x00000040
#define FCB_ALLOC_IN_CREATE 0x00000080
#define FCB_ALLOC_IN_WRITE 0x00000100
//
// Mcb Node
//
struct _EXT2_MCB {
// Identifier for this structure
EXT2_IDENTIFIER Identifier;
// Flags
ULONG Flags;
// Link List Info
PEXT2_MCB Parent; // Parent
PEXT2_MCB Next; // Brothers
union {
PEXT2_MCB Child; // Children Mcb nodes
PEXT2_MCB Target; // Target Mcb of symlink
};
// Mcb Node Info
// -> Fcb
PEXT2_FCB Fcb;
// Short name
UNICODE_STRING ShortName;
// Full name with path
UNICODE_STRING FullName;
// Inode number
ULONG iNo;
// Inode content
PEXT2_INODE Inode;
// Dir entry offset in parent
ULONG EntryOffset;
// File attribute
ULONG FileAttr;
// reference count
ULONG Refercount;
// File size (sync to inode.i_size/i_size_high)
LARGE_INTEGER FileSize;
// Extents zone
LARGE_MCB Extents;
// Time stamps
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER LastAccessTime;
// List Link to Vcb->McbList
LIST_ENTRY Link;
};
//
// Flags for MCB
//
#define MCB_FROM_POOL 0x00000001
#define MCB_VCB_LINK 0x00000002
#define MCB_ENTRY_TREE 0x00000004
#define MCB_ZONE_INIT 0x08000000
#define MCB_IS_SYMLINK 0x80000000
#define IsMcbUsed(Mcb) (Mcb->Refercount > 0)
#define IsMcbSymlink(Mcb) IsFlagOn(Mcb->Flags, MCB_IS_SYMLINK)
#define IsZoneInited(Mcb) IsFlagOn(Mcb->Flags, MCB_ZONE_INIT)
/*
* routines for reference count management
*/
#define Ext2ReferXcb(_C) InterlockedIncrement(_C)
#define Ext2DerefXcb(_C) DEC_OBJ_CNT(_C)
__inline ULONG DEC_OBJ_CNT(PULONG _C) {
if (*_C > 0) {
return InterlockedDecrement(_C);
} else {
DbgBreak();
}
return 0;
}
#if EXT2_DEBUG
VOID
Ext2TraceMcb(PCHAR fn, USHORT lc, USHORT add, PEXT2_MCB Mcb);
#define Ext2ReferMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, TRUE, Mcb)
#define Ext2DerefMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, FALSE, Mcb)
#else
#define Ext2ReferMcb(Mcb) Ext2ReferXcb(&Mcb->Refercount)
#define Ext2DerefMcb(Mcb) Ext2DerefXcb(&Mcb->Refercount)
#endif
//
// EXT2_CCB Context Control Block
//
// Data that represents one instance of an open file
// There is one instance of the CCB for every instance of an open file
//
typedef struct _EXT2_CCB {
// Identifier for this structure
EXT2_IDENTIFIER Identifier;
// Flags
ULONG Flags;
// Mcb of it's symbol link
PEXT2_MCB SymLink;
// State that may need to be maintained
ULONG CurrentByteOffset;
UNICODE_STRING DirectorySearchPattern;
} EXT2_CCB, *PEXT2_CCB;
//
// Flags for CCB
//
#define CCB_FROM_POOL 0x00000001
#define CCB_VOLUME_DASD_PURGE 0x00000002
#define CCB_LAST_WRITE_UPDATED 0x00000004
#define CCB_ALLOW_EXTENDED_DASD_IO 0x80000000
//
// EXT2_IRP_CONTEXT
//
// Used to pass information about a request between the drivers functions
//
typedef struct _EXT2_IRP_CONTEXT {
// Identifier for this structure
EXT2_IDENTIFIER Identifier;
// Pointer to the IRP this request describes
PIRP Irp;
// Flags
ULONG Flags;
// The major and minor function code for the request
UCHAR MajorFunction;
UCHAR MinorFunction;
// The device object
PDEVICE_OBJECT DeviceObject;
// The real device object
PDEVICE_OBJECT RealDevice;
// The file object
PFILE_OBJECT FileObject;
PEXT2_FCB Fcb;
PEXT2_CCB Ccb;
// If the request is top level
BOOLEAN IsTopLevel;
// Used if the request needs to be queued for later processing
WORK_QUEUE_ITEM WorkQueueItem;
// If an exception is currently in progress
BOOLEAN ExceptionInProgress;
// The exception code when an exception is in progress
NTSTATUS ExceptionCode;
} EXT2_IRP_CONTEXT, *PEXT2_IRP_CONTEXT;
#define IRP_CONTEXT_FLAG_FROM_POOL (0x00000001)
#define IRP_CONTEXT_FLAG_WAIT (0x00000002)
#define IRP_CONTEXT_FLAG_WRITE_THROUGH (0x00000004)
#define IRP_CONTEXT_FLAG_FLOPPY (0x00000008)
#define IRP_CONTEXT_FLAG_DISABLE_POPUPS (0x00000020)
#define IRP_CONTEXT_FLAG_DEFERRED (0x00000040)
#define IRP_CONTEXT_FLAG_VERIFY_READ (0x00000080)
#define IRP_CONTEXT_STACK_IO_CONTEXT (0x00000100)
#define IRP_CONTEXT_FLAG_REQUEUED (0x00000200)
#define IRP_CONTEXT_FLAG_USER_IO (0x00000400)
#define IRP_CONTEXT_FLAG_DELAY_CLOSE (0x00000800)
#define IRP_CONTEXT_FLAG_FILE_BUSY (0x00001000)
#define Ext2CanIWait() (!IrpContext || IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT))
//
// EXT2_ALLOC_HEADER
//
// In the checked version of the driver this header is put in the beginning of
// every memory allocation
//
typedef struct _EXT2_ALLOC_HEADER {
EXT2_IDENTIFIER Identifier;
} EXT2_ALLOC_HEADER, *PEXT2_ALLOC_HEADER;
typedef struct _FCB_LIST_ENTRY {
PEXT2_FCB Fcb;
LIST_ENTRY Next;
} FCB_LIST_ENTRY, *PFCB_LIST_ENTRY;
// Block Description List
typedef struct _EXT2_EXTENT {
LONGLONG Lba;
ULONG Offset;
ULONG Length;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -