2 * COPYRIGHT: See COPYRIGHT.TXT
3 * PROJECT: Ext2 File System Driver for WinNT/2K/XP
5 * PURPOSE: Header file: ext2 structures
6 * PROGRAMMER: Matt Wu <mattwu@163.com>
7 * HOMEPAGE: http://www.ext2fsd.com
14 /* INCLUDES *************************************************************/
15 #include <linux/module.h>
18 #include <ndk/rtlfuncs.h>
19 #include <pseh/pseh2.h>
24 #include <linux/ext2_fs.h>
25 #include <linux/ext3_fs.h>
26 #include <linux/ext3_fs_i.h>
27 #include <linux/ext4.h>
29 /* DEBUG ****************************************************************/
36 #define EXT_DEBUG_BREAKPOINT FALSE
38 #if EXT2_DEBUG && EXT_DEBUG_BREAKPOINT
40 //#define DbgBreak() __asm int 3
42 #define DbgBreak() KdBreakPoint()
48 /* STRUCTS & CONSTS******************************************************/
50 #define EXT2FSD_VERSION "0.63"
53 /* WDK DEFINITIONS ******************************************************/
56 /* COMPILER SWITCH / OPTIONS ********************************************/
59 // Ext2Fsd build options
62 // To support driver dynamics unload
64 #define EXT2_UNLOAD FALSE
66 // To support inode size expansion (fallocate)
68 #define EXT2_PRE_ALLOCATION_SUPPORT TRUE
74 #define EXT2_MAX_NESTED_LINKS (8)
75 #define EXT2_LINKLEN_IN_INODE (60)
76 #define EXT2_BLOCK_TYPES (0x04)
78 #define MAXIMUM_RECORD_LENGTH (0x10000)
80 #define SECTOR_BITS (Vcb->SectorBits)
81 #define SECTOR_SIZE (Vcb->DiskGeometry.BytesPerSector)
82 #define DEFAULT_SECTOR_SIZE (0x200)
84 #define SUPER_BLOCK_OFFSET (0x400)
85 #define SUPER_BLOCK_SIZE (0x400)
87 #define READ_AHEAD_GRANULARITY (0x10000)
89 #define SUPER_BLOCK (Vcb->SuperBlock)
91 #define INODE_SIZE (Vcb->InodeSize)
92 #define BLOCK_SIZE (Vcb->BlockSize)
93 #define BLOCK_BITS (SUPER_BLOCK->s_log_block_size + 10)
94 #define GROUP_DESC_SIZE (Vcb->sbi.s_desc_size)
96 #define INODES_COUNT (Vcb->SuperBlock->s_inodes_count)
98 #define INODES_PER_GROUP (SUPER_BLOCK->s_inodes_per_group)
99 #define BLOCKS_PER_GROUP (SUPER_BLOCK->s_blocks_per_group)
100 #define TOTAL_BLOCKS (ext3_blocks_count(SUPER_BLOCK))
102 #define EXT2_FIRST_DATA_BLOCK (SUPER_BLOCK->s_first_data_block)
104 typedef struct ext3_super_block EXT2_SUPER_BLOCK
, *PEXT2_SUPER_BLOCK
;
105 typedef struct ext3_inode EXT2_INODE
, *PEXT2_INODE
;
106 typedef struct ext4_group_desc EXT2_GROUP_DESC
, *PEXT2_GROUP_DESC
;
107 typedef struct ext3_dir_entry EXT2_DIR_ENTRY
, *PEXT2_DIR_ENTRY
;
108 typedef struct ext3_dir_entry_2 EXT2_DIR_ENTRY2
, *PEXT2_DIR_ENTRY2
;
110 #define CEILING_ALIGNED(T, A, B) (((A) + (B) - 1) & (~((T)(B) - 1)))
111 #define COCKLOFT_ALIGNED(T, A, B) (((A) + (B)) & (~((T)(B) - 1)))
113 /* File System Releated *************************************************/
115 #define DRIVER_NAME "Ext2Fsd"
116 #define DEVICE_NAME L"\\Ext2Fsd"
117 #define CDROM_NAME L"\\Ext2CdFsd"
121 #define PARAMETERS_KEY L"\\Parameters"
122 #define VOLUMES_KEY L"\\Volumes"
124 #define READING_ONLY L"Readonly"
125 #define WRITING_SUPPORT L"WritingSupport"
126 #define CHECKING_BITMAP L"CheckingBitmap"
127 #define EXT3_FORCEWRITING L"Ext3ForceWriting"
128 #define CODEPAGE_NAME L"CodePage"
129 #define HIDING_PREFIX L"HidingPrefix"
130 #define HIDING_SUFFIX L"HidingSuffix"
131 #define AUTO_MOUNT L"AutoMount"
132 #define MOUNT_POINT L"MountPoint"
134 #define DOS_DEVICE_NAME L"\\DosDevices\\Ext2Fsd"
136 // To support ext2fsd unload routine
139 // Private IOCTL to make the driver ready to unload
141 #define IOCTL_PREPARE_TO_UNLOAD \
142 CTL_CODE(FILE_DEVICE_UNKNOWN, 2048, METHOD_NEITHER, FILE_WRITE_ACCESS)
144 #endif // EXT2_UNLOAD
149 typedef IO_STACK_LOCATION EXTENDED_IO_STACK_LOCATION
, *PEXTENDED_IO_STACK_LOCATION
;
152 #define IsFlagOn(a,b) ((BOOLEAN)(FlagOn(a,b) == b))
154 #define FlagOn(_F,_SF) ((_F) & (_SF))
157 #ifndef BooleanFlagOn
158 #define BooleanFlagOn(F,SF) ((BOOLEAN)(((F) & (SF)) != 0))
162 #define SetFlag(_F,_SF) ((_F) |= (_SF))
166 #define ClearFlag(_F,_SF) ((_F) &= ~(_SF))
170 #define min(a,b) (((a) < (b)) ? (a) : (b))
174 #define max(a,b) (((a) > (b)) ? (a) : (b))
177 #ifdef _WIN2K_TARGET_
178 #define InterlockedOr _InterlockedOr
181 IN OUT LONG
volatile *Target
,
185 #pragma intrinsic (_InterlockedAnd)
186 #define InterlockedAnd _InterlockedAnd
190 IN OUT LONG
volatile *Target
,
194 #pragma intrinsic (_InterlockedXor)
195 #define InterlockedXor _InterlockedXor
197 #endif /* only for win2k */
201 #define SetLongFlag(_F,_SF) Ext2SetFlag((PULONG)&(_F), (ULONG)(_SF))
202 #define ClearLongFlag(_F,_SF) Ext2ClearFlag((PULONG)&(_F), (ULONG)(_SF))
209 Ext2SetFlag(PULONG Flags
, ULONG FlagBit
)
211 ULONG _ret
= InterlockedOr(Flags
, FlagBit
);
212 ASSERT(*Flags
== (_ret
| FlagBit
));
220 Ext2ClearFlag(PULONG Flags
, ULONG FlagBit
)
222 ULONG _ret
= InterlockedAnd(Flags
, ~FlagBit
);
223 ASSERT(*Flags
== (_ret
& (~FlagBit
)));
228 #define SetLongFlag(_F,_SF) InterlockedOr(&(_F), (ULONG)(_SF))
229 #define ClearLongFlag(_F,_SF) InterlockedAnd(&(_F), ~((ULONG)(_SF)))
233 #define Ext2RaiseStatus(IRPCONTEXT,STATUS) { \
234 (IRPCONTEXT)->ExceptionCode = (STATUS); \
235 ExRaiseStatus((STATUS)); \
238 #define Ext2NormalizeAndRaiseStatus(IRPCONTEXT,STATUS) { \
239 (IRPCONTEXT)->ExceptionCode = STATUS; \
240 if ((STATUS) == STATUS_VERIFY_REQUIRED) { ExRaiseStatus((STATUS)); } \
241 ExRaiseStatus(FsRtlNormalizeNtstatus((STATUS),STATUS_UNEXPECTED_IO_ERROR)); \
245 // Define IsWritingToEof for write (append) operations
248 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
250 #define IsWritingToEof(Pos) (((Pos).LowPart == FILE_WRITE_TO_END_OF_FILE) && \
251 ((Pos).HighPart == -1 ))
253 #define IsDirectory(Fcb) IsMcbDirectory((Fcb)->Mcb)
254 #define IsSpecialFile(Fcb) IsMcbSpecialFile((Fcb)->Mcb)
255 #define IsSymLink(Fcb) IsMcbSymLink((Fcb)->Mcb)
256 #define IsInodeSymLink(I) S_ISLNK((I)->i_mode)
257 #define IsRoot(Fcb) IsMcbRoot((Fcb)->Mcb)
263 #define TAG_VPB ' bpV'
264 #define VPB_SIZE sizeof(VPB)
266 #define EXT2_DATA_MAGIC 'BD2E'
267 #define EXT2_INAME_MAGIC 'NI2E'
268 #define EXT2_FNAME_MAGIC 'NF2E'
269 #define EXT2_VNAME_MAGIC 'NV2E'
270 #define EXT2_DENTRY_MAGIC 'ED2E'
271 #define EXT2_DIRSP_MAGIC 'SD2E'
272 #define EXT2_SB_MAGIC 'BS2E'
273 #define EXT2_GD_MAGIC 'DG2E'
274 #define EXT2_FLIST_MAGIC 'LF2E'
275 #define EXT2_PARAM_MAGIC 'PP2E'
276 #define EXT2_RWC_MAGIC 'WR2E'
279 // Bug Check Codes Definitions
282 #define EXT2_FILE_SYSTEM (FILE_SYSTEM)
284 #define EXT2_BUGCHK_BLOCK (0x00010000)
285 #define EXT2_BUGCHK_CLEANUP (0x00020000)
286 #define EXT2_BUGCHK_CLOSE (0x00030000)
287 #define EXT2_BUGCHK_CMCB (0x00040000)
288 #define EXT2_BUGCHK_CREATE (0x00050000)
289 #define EXT2_BUGCHK_DEBUG (0x00060000)
290 #define EXT2_BUGCHK_DEVCTL (0x00070000)
291 #define EXT2_BUGCHK_DIRCTL (0x00080000)
292 #define EXT2_BUGCHK_DISPATCH (0x00090000)
293 #define EXT2_BUGCHK_EXCEPT (0x000A0000)
294 #define EXT2_BUGCHK_EXT2 (0x000B0000)
295 #define EXT2_BUGCHK_FASTIO (0x000C0000)
296 #define EXT2_BUGCHK_FILEINFO (0x000D0000)
297 #define EXT2_BUGCHK_FLUSH (0x000E0000)
298 #define EXT2_BUGCHK_FSCTL (0x000F0000)
299 #define EXT2_BUGCHK_INIT (0x00100000)
300 #define EXT2_BUGCHK_LOCK (0x0011000)
301 #define EXT2_BUGCHK_MEMORY (0x0012000)
302 #define EXT2_BUGCHK_MISC (0x0013000)
303 #define EXT2_BUGCHK_READ (0x00140000)
304 #define EXT2_BUGCHK_SHUTDOWN (0x00150000)
305 #define EXT2_BUGCHK_VOLINFO (0x00160000)
306 #define EXT2_BUGCHK_WRITE (0x00170000)
308 #define EXT2_BUGCHK_LAST (0x00170000)
310 #define Ext2BugCheck(A,B,C,D) { KeBugCheckEx(EXT2_FILE_SYSTEM, A | __LINE__, B, C, D ); }
313 /* Ext2 file system definions *******************************************/
316 // The second extended file system magic number
319 #define EXT2_SUPER_MAGIC 0xEF53
321 #define EXT2_MIN_BLOCK 1024
322 #define EXT2_MIN_FRAG 1024
323 #define EXT2_MAX_USER_BLKSIZE 65536
325 // Inode flags (Linux uses octad number, but why ? strange!!!)
328 #define S_IFMT 0x0F000 /* 017 0000 */
329 #define S_IFSOCK 0x0C000 /* 014 0000 */
330 #define S_IFLNK 0x0A000 /* 012 0000 */
331 #define S_IFREG 0x08000 /* 010 0000 */
332 #define S_IFBLK 0x06000 /* 006 0000 */
333 #define S_IFDIR 0x04000 /* 004 0000 */
334 #define S_IFCHR 0x02000 /* 002 0000 */
335 #define S_IFIFO 0x01000 /* 001 0000 */
337 #define S_ISUID 0x00800 /* 000 4000 */
338 #define S_ISGID 0x00400 /* 000 2000 */
339 #define S_ISVTX 0x00200 /* 000 1000 */
341 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
342 #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
343 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
344 #define S_ISFIL(m) (((m) & S_IFMT) == S_IFFIL)
345 #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
346 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
347 #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
348 #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
350 #define S_IPERMISSION_MASK 0x1FF /* */
352 #define S_IRWXU 0x1C0 /* 0 0700 */
353 #define S_IRWNU 0x180 /* 0 0600 */
354 #define S_IRUSR 0x100 /* 0 0400 */
355 #define S_IWUSR 0x080 /* 0 0200 */
356 #define S_IXUSR 0x040 /* 0 0100 */
358 #define S_IRWXG 0x038 /* 0 0070 */
359 #define S_IRWNG 0x030 /* 0 0060 */
360 #define S_IRGRP 0x020 /* 0 0040 */
361 #define S_IWGRP 0x010 /* 0 0020 */
362 #define S_IXGRP 0x008 /* 0 0010 */
364 #define S_IRWXO 0x007 /* 0 0007 */
365 #define S_IRWNO 0x006 /* 0 0006 */
366 #define S_IROTH 0x004 /* 0 0004 */
367 #define S_IWOTH 0x002 /* 0 0002 */
368 #define S_IXOTH 0x001 /* 0 0001 */
370 #define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO)
371 #define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
372 #define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH)
373 #define S_IWUGO (S_IWUSR|S_IWGRP|S_IWOTH)
374 #define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH)
375 #define S_IFATTR (S_IRWNU|S_IRWNG|S_IRWNO)
377 #define S_ISREADABLE(m) (((m) & S_IPERMISSION_MASK) == (S_IRUSR | S_IRGRP | S_IROTH))
378 #define S_ISWRITABLE(m) (((m) & S_IPERMISSION_MASK) == (S_IWUSR | S_IWGRP | S_IWOTH))
380 #define Ext2SetReadable(m) do {(m) = (m) | (S_IRUSR | S_IRGRP | S_IROTH);} while(0)
381 #define Ext2SetWritable(m) do {(m) = (m) | (S_IWUSR | S_IWGRP | S_IWOTH);} while(0)
383 #define Ext2SetOwnerWritable(m) do {(m) |= S_IWUSR;} while(0)
384 #define Ext2SetOwnerReadOnly(m) do {(m) &= ~S_IWUSR;} while(0)
386 #define Ext2IsOwnerWritable(m) (((m) & S_IWUSR) == S_IWUSR)
387 #define Ext2IsOwnerReadable(m) (((m) & S_IRUSR) == S_IRUSR)
388 #define Ext2IsOwnerReadOnly(m) (!(Ext2IsOwnerWritable(m)) && Ext2IsOwnerReadable(m))
390 #define Ext2IsGroupWritable(m) (((m) & S_IWGRP) == S_IWGRP)
391 #define Ext2IsGroupReadable(m) (((m) & S_IRGRP) == S_IRGRP)
392 #define Ext2IsGroupReadOnly(m) (!(Ext2IsGroupWritable(m)) && Ext2IsGroupReadable(m))
394 #define Ext2IsOtherWritable(m) (((m) & S_IWOTH) == S_IWOTH)
395 #define Ext2IsOtherReadable(m) (((m) & S_IROTH) == S_IROTH)
396 #define Ext2IsOtherReadOnly(m) (!(Ext2IsOtherWritable(m)) && Ext2IsOtherReadable(m))
398 #define Ext2SetReadOnly(m) do {(m) &= ~(S_IWUSR | S_IWGRP | S_IWOTH);} while(0)
401 #define Ext2FileCanRead (0x1)
402 #define Ext2FileCanWrite (0x2)
403 #define Ext2FileCanExecute (0x4)
407 * We need 8-bytes aligned for all the sturctures
408 * It's a must for all ERESOURCE allocations
412 // Ext2Fsd Driver Definitions
416 // EXT2_IDENTIFIER_TYPE
418 // Identifiers used to mark the structures
421 typedef enum _EXT2_IDENTIFIER_TYPE
{
431 EXT2FGD
= 0xE2FD0001,
432 EXT2VCB
= 0xE2FD0002,
433 EXT2FCB
= 0xE2FD0003,
434 EXT2CCB
= 0xE2FD0004,
435 EXT2ICX
= 0xE2FD0005,
436 EXT2FSD
= 0xE2FD0006,
439 } EXT2_IDENTIFIER_TYPE
;
444 // Header used to mark the structures
446 typedef struct _EXT2_IDENTIFIER
{
447 EXT2_IDENTIFIER_TYPE Type
;
449 } EXT2_IDENTIFIER
, *PEXT2_IDENTIFIER
;
452 #define NodeType(Ptr) (*((EXT2_IDENTIFIER_TYPE *)(Ptr)))
454 typedef struct _EXT2_MCB EXT2_MCB
, *PEXT2_MCB
;
464 // Data that is not specific to a mounted volume
467 typedef struct _EXT2_GLOBAL
{
469 /* Identifier for this structure */
470 EXT2_IDENTIFIER Identifier
;
472 /* Syncronization primitive for this structure */
475 /* Global flags for the driver: I put it since
476 FastIoDispatch isn't 8bytes aligned. */
479 /* Table of pointers to the fast I/O entry points */
480 FAST_IO_DISPATCH FastIoDispatch
;
482 /* Table of pointers to the Cache Manager callbacks */
483 CACHE_MANAGER_CALLBACKS CacheManagerCallbacks
;
484 CACHE_MANAGER_CALLBACKS CacheManagerNoOpCallbacks
;
486 /* Pointer to the driver object */
487 PDRIVER_OBJECT DriverObject
;
489 /* Pointer to the disk device object */
490 PDEVICE_OBJECT DiskdevObject
;
492 /* Pointer to the cdrom device object */
493 PDEVICE_OBJECT CdromdevObject
;
495 /* List of mounted volumes */
498 /* Cleaning thread related: resource cleaner */
504 /* Look Aside table of IRP_CONTEXT, FCB, MCB, CCB */
505 NPAGED_LOOKASIDE_LIST Ext2IrpContextLookasideList
;
506 NPAGED_LOOKASIDE_LIST Ext2FcbLookasideList
;
507 NPAGED_LOOKASIDE_LIST Ext2CcbLookasideList
;
508 NPAGED_LOOKASIDE_LIST Ext2McbLookasideList
;
509 NPAGED_LOOKASIDE_LIST Ext2ExtLookasideList
;
510 NPAGED_LOOKASIDE_LIST Ext2DentryLookasideList
;
513 /* User specified global codepage name */
515 UCHAR AnsiName
[CODEPAGE_MAXLEN
];
516 struct nls_table
* PageTable
;
519 /* global hiding patterns */
520 BOOLEAN bHidingPrefix
;
521 CHAR sHidingPrefix
[HIDINGPAT_LEN
];
522 BOOLEAN bHidingSuffix
;
523 CHAR sHidingSuffix
[HIDINGPAT_LEN
];
526 UNICODE_STRING RegistryPath
;
528 /* global memory and i/o statistics and memory allocations
529 of various sturctures */
531 EXT2_PERF_STATISTICS_V2 PerfStat
;
533 } EXT2_GLOBAL
, *PEXT2_GLOBAL
;
536 // Flags for EXT2_GLOBAL_DATA
539 #define EXT2_UNLOAD_PENDING 0x00000001
540 #define EXT2_SUPPORT_WRITING 0x00000002
541 #define EXT3_FORCE_WRITING 0x00000004
542 #define EXT2_CHECKING_BITMAP 0x00000008
543 #define EXT2_AUTO_MOUNT 0x00000010
546 // Glboal Ext2Fsd Memory Block
549 extern PEXT2_GLOBAL Ext2Global
;
552 // memory allocation statistics
556 #define INC_MEM_COUNT(_i, _p, _s) do { ASSERT(_p); Ext2TraceMemory(TRUE, (int) (_i), (PVOID)(_p), (LONG)(_s)); } while(0)
557 #define DEC_MEM_COUNT(_i, _p, _s) do { ASSERT(_p); Ext2TraceMemory(FALSE, (int) (_i), (PVOID)(_p), (LONG)(_s)); } while(0)
558 #define INC_IRP_COUNT(IrpContext) Ext2TraceIrpContext(TRUE, (IrpContext))
559 #define DEC_IRP_COUNT(IrpContext) Ext2TraceIrpContext(FALSE, (IrpContext))
562 // Driver Extension define
565 #define IsExt2FsDevice(DO) ((DO == Ext2Global->DiskdevObject) || \
566 (DO == Ext2Global->CdromdevObject) )
568 #ifdef _WIN2K_TARGET_
569 #define FSRTL_ADVANCED_FCB_HEADER FSRTL_COMMON_FCB_HEADER
572 typedef struct _EXT2_FCBVCB
{
574 // Command header for Vcb and Fcb
575 FSRTL_ADVANCED_FCB_HEADER Header
;
577 #ifndef _WIN2K_TARGET_
581 // Ext2Fsd identifier
582 EXT2_IDENTIFIER Identifier
;
586 ERESOURCE MainResource
;
587 ERESOURCE PagingIoResource
;
589 } EXT2_FCBVCB
, *PEXT2_FCBVCB
;
592 // EXT2_VCB Volume Control Block
594 // Data that represents a mounted logical volume
595 // It is allocated as the device extension of the volume device object
597 typedef struct _EXT2_VCB
{
602 // Resource for metadata (super block, tables)
605 // Resource for Mcb (Meta data control block)
608 // Entry of Mcb Tree (Root Node)
615 // Link list to Global
619 SECTION_OBJECT_POINTERS SectionObject
;
621 // Dirty Mcbs of modifications for volume stream
624 // List of FCBs for open files on this volume
629 // Share Access for the file object
630 SHARE_ACCESS ShareAccess
;
632 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
633 // for both files on this volume and open instances of the
635 ULONG ReferenceCount
; /* total ref count */
636 ULONG OpenHandleCount
; /* all handles */
638 ULONG OpenVolumeCount
; /* volume handle */
643 // Pointer to the VPB in the target device object
647 // The FileObject of Volume used to lock the volume
648 PFILE_OBJECT LockFile
;
650 // List of IRPs pending on directory change notify requests
651 LIST_ENTRY NotifyList
;
653 // Pointer to syncronization primitive for this list
654 PNOTIFY_SYNC NotifySync
;
656 // This volumes device object
657 PDEVICE_OBJECT DeviceObject
;
659 // The physical device object (the disk)
660 PDEVICE_OBJECT TargetDeviceObject
;
662 // The physical device object (the disk)
663 PDEVICE_OBJECT RealDevice
;
665 // Information about the physical device object
666 DISK_GEOMETRY DiskGeometry
;
667 PARTITION_INFORMATION PartitionInformation
;
670 PEXT2_SUPER_BLOCK SuperBlock
;
673 // Bitmap Block per group
674 PRTL_BITMAP BlockBitMaps;
675 PRTL_BITMAP InodeBitMaps;
678 // Block / Cluster size
681 // Sector size in bits
684 // Aligned size (Page or Block)
685 ULONGLONG IoUnitSize
;
687 // Bits of aligned size
693 // Inode lookaside list
694 NPAGED_LOOKASIDE_LIST InodeLookasideList
;
696 // Flags for the volume
699 // Streaming File Object
702 // User specified codepage name per volume
704 UCHAR AnsiName
[CODEPAGE_MAXLEN
];
705 struct nls_table
* PageTable
;
708 /* patterns to hiding files */
709 BOOLEAN bHidingPrefix
;
710 CHAR sHidingPrefix
[HIDINGPAT_LEN
];
711 BOOLEAN bHidingSuffix
;
712 CHAR sHidingSuffix
[HIDINGPAT_LEN
];
714 /* User to impersanate */
722 /* mountpoint: symlink to DesDevices */
725 struct block_device bd
;
726 struct super_block sb
;
727 struct ext3_sb_info sbi
;
729 /* Maximum file size in blocks ... */
730 ULONG max_blocks_per_layer
[EXT2_BLOCK_TYPES
];
731 ULONG max_data_blocks
;
732 loff_t max_bitmap_bytes
;
734 } EXT2_VCB
, *PEXT2_VCB
;
737 // Flags for EXT2_VCB
739 #define VCB_INITIALIZED 0x00000001
740 #define VCB_VOLUME_LOCKED 0x00000002
741 #define VCB_MOUNTED 0x00000004
742 #define VCB_DISMOUNT_PENDING 0x00000008
743 #define VCB_NEW_VPB 0x00000010
744 #define VCB_BEING_CLOSED 0x00000020
745 #define VCB_USER_IDS 0x00000040 /* uid/gid specified by user */
746 #define VCB_USER_EIDS 0x00000080 /* euid/egid specified by user */
748 #define VCB_FORCE_WRITING 0x00004000
749 #define VCB_DEVICE_REMOVED 0x00008000
750 #define VCB_JOURNAL_RECOVER 0x00080000
751 #define VCB_ARRIVAL_NOTIFIED 0x00800000
752 #define VCB_READ_ONLY 0x08000000
753 #define VCB_WRITE_PROTECTED 0x10000000
754 #define VCB_FLOPPY_DISK 0x20000000
755 #define VCB_REMOVAL_PREVENTED 0x40000000
756 #define VCB_REMOVABLE_MEDIA 0x80000000
759 #define IsVcbInited(Vcb) (IsFlagOn((Vcb)->Flags, VCB_INITIALIZED))
760 #define IsMounted(Vcb) (IsFlagOn((Vcb)->Flags, VCB_MOUNTED))
761 #define IsDispending(Vcb) (IsFlagOn((Vcb)->Flags, VCB_DISMOUNT_PENDING))
762 #define IsVcbReadOnly(Vcb) (IsFlagOn((Vcb)->Flags, VCB_READ_ONLY) || \
763 IsFlagOn((Vcb)->Flags, VCB_WRITE_PROTECTED))
766 #define IsExt3ForceWrite() (IsFlagOn(Ext2Global->Flags, EXT3_FORCE_WRITING))
767 #define IsVcbForceWrite(Vcb) (IsFlagOn((Vcb)->Flags, VCB_FORCE_WRITING))
768 #define CanIWrite(Vcb) (IsExt3ForceWrite() || (!IsVcbReadOnly(Vcb) && IsVcbForceWrite(Vcb)))
769 #define IsLazyWriter(Fcb) ((Fcb)->LazyWriterThread == PsGetCurrentThread())
771 // EXT2_FCB File Control Block
773 // Data that represents an open file
774 // There is a single instance of the FCB for every open file
776 typedef struct _EXT2_FCB
{
781 // List of FCBs for this volume
784 SECTION_OBJECT_POINTERS SectionObject
;
786 // Share Access for the file object
787 SHARE_ACCESS ShareAccess
;
789 // List of byte-range locks for this file
790 FILE_LOCK FileLockAnchor
;
792 // oplock information management structure
795 // Lazy writer thread context
796 PETHREAD LazyWriterThread
;
798 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
799 ULONG OpenHandleCount
;
801 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
802 ULONG ReferenceCount
;
804 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
805 // But only for Files with FO_NO_INTERMEDIATE_BUFFERING flag
806 ULONG NonCachedOpenCount
;
811 // Pointer to the inode
820 } EXT2_FCB
, *PEXT2_FCB
;
823 // Flags for EXT2_FCB
826 #define FCB_FROM_POOL 0x00000001
827 #define FCB_PAGE_FILE 0x00000002
828 #define FCB_FILE_MODIFIED 0x00000020
829 #define FCB_STATE_BUSY 0x00000040
830 #define FCB_ALLOC_IN_CREATE 0x00000080
831 #define FCB_ALLOC_IN_WRITE 0x00000100
832 #define FCB_ALLOC_IN_SETINFO 0x00000200
834 #define FCB_DELETE_PENDING 0x80000000
842 // Identifier for this structure
843 EXT2_IDENTIFIER Identifier
;
849 PEXT2_MCB Parent
; // Parent
850 PEXT2_MCB Next
; // Siblings
853 PEXT2_MCB Child
; // Children Mcb nodes
854 PEXT2_MCB Target
; // Target Mcb of symlink
863 UNICODE_STRING ShortName
;
865 // Full name with path
866 UNICODE_STRING FullName
;
881 LARGE_INTEGER CreationTime
;
882 LARGE_INTEGER LastWriteTime
;
883 LARGE_INTEGER ChangeTime
;
884 LARGE_INTEGER LastAccessTime
;
886 // List Link to Vcb->McbList
896 #define MCB_FROM_POOL 0x00000001
897 #define MCB_VCB_LINK 0x00000002
898 #define MCB_ENTRY_TREE 0x00000004
899 #define MCB_FILE_DELETED 0x00000008
901 #define MCB_ZONE_INITED 0x20000000
902 #define MCB_TYPE_SPECIAL 0x40000000 /* unresolved symlink + device node */
903 #define MCB_TYPE_SYMLINK 0x80000000
905 #define IsMcbUsed(Mcb) ((Mcb)->Refercount > 0)
906 #define IsMcbSymLink(Mcb) IsFlagOn((Mcb)->Flags, MCB_TYPE_SYMLINK)
907 #define IsZoneInited(Mcb) IsFlagOn((Mcb)->Flags, MCB_ZONE_INITED)
908 #define IsMcbSpecialFile(Mcb) IsFlagOn((Mcb)->Flags, MCB_TYPE_SPECIAL)
909 #define IsMcbRoot(Mcb) ((Mcb)->Inode.i_ino == EXT2_ROOT_INO)
910 #define IsMcbReadonly(Mcb) IsFlagOn((Mcb)->FileAttr, FILE_ATTRIBUTE_READONLY)
911 #define IsMcbDirectory(Mcb) IsFlagOn((Mcb)->FileAttr, FILE_ATTRIBUTE_DIRECTORY)
912 #define IsFileDeleted(Mcb) IsFlagOn((Mcb)->Flags, MCB_FILE_DELETED)
914 #define IsLinkInvalid(Mcb) (IsMcbSymLink(Mcb) && IsFileDeleted(Mcb->Target))
917 * routines for reference count management
920 #define Ext2ReferXcb(_C) InterlockedIncrement(_C)
921 #define Ext2DerefXcb(_C) DEC_OBJ_CNT(_C)
926 __inline ULONG
DEC_OBJ_CNT(PULONG _C
) {
928 return InterlockedDecrement(_C
);
937 Ext2TraceMcb(PCHAR fn
, USHORT lc
, USHORT add
, PEXT2_MCB Mcb
);
938 #define Ext2ReferMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, TRUE, Mcb)
939 #define Ext2DerefMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, FALSE, Mcb)
941 #define Ext2ReferMcb(Mcb) Ext2ReferXcb(&Mcb->Refercount)
942 #define Ext2DerefMcb(Mcb) Ext2DerefXcb(&Mcb->Refercount)
946 // EXT2_CCB Context Control Block
948 // Data that represents one instance of an open file
949 // There is one instance of the CCB for every instance of an open file
951 typedef struct _EXT2_CCB
{
953 // Identifier for this structure
954 EXT2_IDENTIFIER Identifier
;
959 // Mcb of it's symbol link
962 // State that may need to be maintained
963 UNICODE_STRING DirectorySearchPattern
;
965 /* Open handle control block */
968 } EXT2_CCB
, *PEXT2_CCB
;
974 #define CCB_FROM_POOL 0x00000001
975 #define CCB_VOLUME_DASD_PURGE 0x00000002
976 #define CCB_LAST_WRITE_UPDATED 0x00000004
977 #define CCB_OPEN_REPARSE_POINT 0x00000008
978 #define CCB_DELETE_ON_CLOSE 0x00000010
980 #define CCB_ALLOW_EXTENDED_DASD_IO 0x80000000
985 // Used to pass information about a request between the drivers functions
987 typedef struct ext2_icb
{
989 // Identifier for this structure
990 EXT2_IDENTIFIER Identifier
;
992 // Pointer to the IRP this request describes
998 // The major and minor function code for the request
1000 UCHAR MinorFunction
;
1002 // The device object
1003 PDEVICE_OBJECT DeviceObject
;
1005 // The real device object
1006 PDEVICE_OBJECT RealDevice
;
1009 PFILE_OBJECT FileObject
;
1014 // If the request is top level
1017 // Used if the request needs to be queued for later processing
1018 WORK_QUEUE_ITEM WorkQueueItem
;
1020 // If an exception is currently in progress
1021 BOOLEAN ExceptionInProgress
;
1023 // The exception code when an exception is in progress
1024 NTSTATUS ExceptionCode
;
1026 } EXT2_IRP_CONTEXT
, *PEXT2_IRP_CONTEXT
;
1029 #define IRP_CONTEXT_FLAG_FROM_POOL (0x00000001)
1030 #define IRP_CONTEXT_FLAG_WAIT (0x00000002)
1031 #define IRP_CONTEXT_FLAG_WRITE_THROUGH (0x00000004)
1032 #define IRP_CONTEXT_FLAG_FLOPPY (0x00000008)
1033 #define IRP_CONTEXT_FLAG_DISABLE_POPUPS (0x00000020)
1034 #define IRP_CONTEXT_FLAG_DEFERRED (0x00000040)
1035 #define IRP_CONTEXT_FLAG_VERIFY_READ (0x00000080)
1036 #define IRP_CONTEXT_STACK_IO_CONTEXT (0x00000100)
1037 #define IRP_CONTEXT_FLAG_REQUEUED (0x00000200)
1038 #define IRP_CONTEXT_FLAG_USER_IO (0x00000400)
1039 #define IRP_CONTEXT_FLAG_DELAY_CLOSE (0x00000800)
1040 #define IRP_CONTEXT_FLAG_FILE_BUSY (0x00001000)
1043 #define Ext2CanIWait() (!IrpContext || IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT))
1046 // EXT2_ALLOC_HEADER
1048 // In the checked version of the driver this header is put in the beginning of
1049 // every memory allocation
1051 typedef struct _EXT2_ALLOC_HEADER
{
1052 EXT2_IDENTIFIER Identifier
;
1053 } EXT2_ALLOC_HEADER
, *PEXT2_ALLOC_HEADER
;
1055 typedef struct _FCB_LIST_ENTRY
{
1058 } FCB_LIST_ENTRY
, *PFCB_LIST_ENTRY
;
1061 // Block Description List
1062 typedef struct _EXT2_EXTENT
{
1067 struct _EXT2_EXTENT
* Next
;
1068 } EXT2_EXTENT
, *PEXT2_EXTENT
;
1071 /* FUNCTIONS DECLARATION *****************************************************/
1073 // Include this so we don't need the latest WDK to build the driver.
1074 #ifndef FSCTL_GET_RETRIEVAL_POINTER_BASE
1075 #define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS) // RETRIEVAL_POINTER_BASE
1079 // The following macro is used to determine if an FSD thread can block
1080 // for I/O or wait for a resource. It returns TRUE if the thread can
1081 // block and FALSE otherwise. This attribute can then be used to call
1082 // the FSD & FSP common work routine with the proper wait value.
1085 #define CanExt2Wait(IRP) IoIsOperationSynchronous(Irp)
1088 // memory allocation statistics
1096 Ext2TraceMemory(BOOLEAN _n
, int _i
, PVOID _p
, LONG _s
)
1099 InterlockedIncrement(&Ext2Global
->PerfStat
.Current
.Slot
[_i
]);
1100 InterlockedIncrement(&Ext2Global
->PerfStat
.Total
.Slot
[_i
]);
1101 InterlockedExchangeAdd(&Ext2Global
->PerfStat
.Size
.Slot
[_i
], _s
);
1103 InterlockedDecrement(&Ext2Global
->PerfStat
.Current
.Slot
[_i
]);
1104 InterlockedExchangeAdd(&Ext2Global
->PerfStat
.Size
.Slot
[_i
], -1 * _s
);
1113 Ext2TraceIrpContext(BOOLEAN _n
, PEXT2_IRP_CONTEXT IrpContext
)
1116 INC_MEM_COUNT(PS_IRP_CONTEXT
, IrpContext
, sizeof(EXT2_IRP_CONTEXT
));
1117 InterlockedIncrement(&(Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Current
));
1119 DEC_MEM_COUNT(PS_IRP_CONTEXT
, IrpContext
, sizeof(EXT2_IRP_CONTEXT
));
1120 InterlockedIncrement(&Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Processed
);
1121 InterlockedDecrement(&Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Current
);
1125 typedef struct _EXT2_FILLDIR_CONTEXT
{
1126 PEXT2_IRP_CONTEXT efc_irp
;
1131 NTSTATUS efc_status
;
1132 FILE_INFORMATION_CLASS efc_fi
;
1134 } EXT2_FILLDIR_CONTEXT
, *PEXT2_FILLDIR_CONTEXT
;
1141 int Ext2CheckInodeAccess(PEXT2_VCB Vcb
, struct inode
*in
, int attempt
);
1142 int Ext2CheckFileAccess (PEXT2_VCB Vcb
, PEXT2_MCB Mcb
, int attempt
);
1153 IN LOCK_OPERATION Operation
1157 Ext2DestroyMdl (IN PMDL Mdl
);
1160 Ext2LockUserBuffer (
1163 IN LOCK_OPERATION Operation
);
1165 Ext2GetUserBuffer (IN PIRP Irp
);
1169 Ext2ReadWriteBlocks(
1170 IN PEXT2_IRP_CONTEXT IrpContext
,
1172 IN PEXT2_EXTENT Extent
,
1179 IN ULONGLONG Offset
,
1182 IN BOOLEAN bVerify
);
1187 IN ULONGLONG Offset
,
1190 IN BOOLEAN bVerify
);
1194 IN PDEVICE_OBJECT DeviceOjbect
,
1196 IN PVOID InputBuffer
,
1197 IN ULONG InputBufferSize
,
1198 IN OUT PVOID OutputBuffer
,
1199 IN OUT PULONG OutputBufferSize
);
1202 Ext2MediaEjectControl (
1203 IN PEXT2_IRP_CONTEXT IrpContext
,
1205 IN BOOLEAN bPrevent
);
1208 Ext2DiskShutDown(PEXT2_VCB Vcb
);
1216 Ext2Cleanup (IN PEXT2_IRP_CONTEXT IrpContext
);
1223 Ext2Close (IN PEXT2_IRP_CONTEXT IrpContext
);
1226 Ext2QueueCloseRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1229 Ext2DeQueueCloseRequest (IN PVOID Context
);
1236 Ext2AcquireForLazyWrite (
1240 Ext2ReleaseFromLazyWrite (IN PVOID Context
);
1243 Ext2AcquireForReadAhead (
1248 Ext2ReleaseFromReadAhead (IN PVOID Context
);
1256 Ext2NoOpRelease (IN PVOID Fcb
);
1259 Ext2AcquireForCreateSection (
1260 IN PFILE_OBJECT FileObject
1264 Ext2ReleaseForCreateSection (
1265 IN PFILE_OBJECT FileObject
1269 Ext2AcquireFileForModWrite (
1270 IN PFILE_OBJECT FileObject
,
1271 IN PLARGE_INTEGER EndingOffset
,
1272 OUT PERESOURCE
*ResourceToRelease
,
1273 IN PDEVICE_OBJECT DeviceObject
1277 Ext2ReleaseFileForModWrite (
1278 IN PFILE_OBJECT FileObject
,
1279 IN PERESOURCE ResourceToRelease
,
1280 IN PDEVICE_OBJECT DeviceObject
1284 Ext2AcquireFileForCcFlush (
1285 IN PFILE_OBJECT FileObject
,
1286 IN PDEVICE_OBJECT DeviceObject
1290 Ext2ReleaseFileForCcFlush (
1291 IN PFILE_OBJECT FileObject
,
1292 IN PDEVICE_OBJECT DeviceObject
1302 Ext2IsNameValid(PUNICODE_STRING FileName
);
1306 IN PEXT2_IRP_CONTEXT IrpContext
,
1308 IN PEXT2_MCB Parent
,
1315 IN PEXT2_IRP_CONTEXT IrpContext
,
1317 IN PEXT2_MCB Parent
,
1318 IN PUNICODE_STRING FileName
,
1320 struct dentry
**dentry
1324 Ext2IsSpecialSystemFile(
1325 IN PUNICODE_STRING FileName
,
1326 IN BOOLEAN bDirectory
1329 #define EXT2_LOOKUP_FLAG_MASK (0xFF00000)
1330 #define EXT2_LOOKUP_NOT_FOLLOW (0x8000000)
1334 IN PEXT2_IRP_CONTEXT IrpContext
,
1336 IN PUNICODE_STRING FullName
,
1337 IN PEXT2_MCB Parent
,
1338 OUT PEXT2_MCB
* Ext2Mcb
,
1344 IN PEXT2_IRP_CONTEXT IrpContext
,
1346 OUT PBOOLEAN OpPostIrp
1351 IN PEXT2_IRP_CONTEXT IrpContext
,
1355 Ext2Create (IN PEXT2_IRP_CONTEXT IrpContext
);
1359 IN PEXT2_IRP_CONTEXT IrpContext
,
1361 IN PEXT2_FCB pParentFcb
,
1364 IN PUNICODE_STRING FileName
);
1368 Ext2SupersedeOrOverWriteFile(
1369 IN PEXT2_IRP_CONTEXT IrpContext
,
1370 IN PFILE_OBJECT FileObject
,
1373 IN PLARGE_INTEGER AllocationSize
,
1374 IN ULONG Disposition
1383 #define DL_VIT 0x00000001
1384 #define DL_ERR 0x00000002
1385 #define DL_DBG 0x00000004
1386 #define DL_INF 0x00000008
1387 #define DL_FUN 0x00000010
1388 #define DL_LOW 0x00000020
1389 #define DL_REN 0x00000040 /* renaming operation */
1390 #define DL_RES 0x00000080 /* entry reference managment */
1391 #define DL_BLK 0x00000100 /* data block allocation / free */
1392 #define DL_CP 0x00000200 /* code pages (create, querydir) */
1393 #define DL_EXT 0x00000400 /* mcb extents */
1394 #define DL_MAP 0x00000800 /* retrieval points */
1395 #define DL_JNL 0x00001000 /* dump journal operations */
1396 #define DL_HTI 0x00002000 /* htree index */
1397 #define DL_WRN 0x00004000 /* warning */
1398 #define DL_BH 0x00008000 /* buffer head */
1399 #define DL_PNP 0x00010000 /* pnp */
1400 #define DL_IO 0x00020000 /* file i/o */
1402 #define DL_ALL (DL_ERR|DL_VIT|DL_DBG|DL_INF|DL_FUN|DL_LOW|DL_REN|DL_RES|DL_BLK|DL_CP|DL_EXT|DL_MAP|DL_JNL|DL_HTI|DL_WRN|DL_BH|DL_PNP|DL_IO)
1404 #if EXT2_DEBUG && defined(__REACTOS__)
1405 #define DL_DEFAULT (DL_ERR|DL_VIT|DL_DBG|DL_INF|DL_FUN|DL_LOW|DL_WRN)
1407 #define DL_DEFAULT (DL_ERR|DL_VIT)
1411 extern ULONG DebugFilter
;
1420 #define DEBUG(_DL, arg) do {if ((_DL) & DebugFilter) Ext2Printf arg;} while(0)
1421 #define DEBUGNI(_DL, arg) do {if ((_DL) & DebugFilter) Ext2NiPrintf arg;} while(0)
1423 #define Ext2CompleteRequest(Irp, bPrint, PriorityBoost) \
1424 Ext2DbgPrintComplete(Irp, bPrint); \
1425 IoCompleteRequest(Irp, PriorityBoost)
1429 #define DEBUG(_DL, arg) do {if ((_DL) & DL_ERR) DbgPrint arg;} while(0)
1431 #define Ext2CompleteRequest(Irp, bPrint, PriorityBoost) \
1432 IoCompleteRequest(Irp, PriorityBoost)
1434 #endif // EXT2_DEBUG
1443 extern ULONG ProcessNameOffset
;
1445 #define Ext2GetCurrentProcessName() ( \
1446 (PUCHAR) PsGetCurrentProcess() + ProcessNameOffset \
1450 Ext2GetProcessNameOffset (VOID
);
1454 IN PDEVICE_OBJECT DeviceObject
,
1458 Ext2DbgPrintComplete (
1464 Ext2NtStatusToString (IN NTSTATUS Status
);
1466 PVOID
Ext2AllocatePool(
1467 IN POOL_TYPE PoolType
,
1468 IN SIZE_T NumberOfBytes
,
1483 Ext2ProcessGlobalProperty(
1484 IN PDEVICE_OBJECT DeviceObject
,
1485 IN PEXT2_VOLUME_PROPERTY2 Property
,
1490 Ext2ProcessVolumeProperty(
1492 IN PEXT2_VOLUME_PROPERTY2 Property
,
1497 Ext2ProcessUserProperty(
1498 IN PEXT2_IRP_CONTEXT IrpContext
,
1499 IN PEXT2_VOLUME_PROPERTY2 Property
,
1504 Ex2ProcessUserPerfStat(
1505 IN PEXT2_IRP_CONTEXT IrpContext
,
1506 IN PEXT2_QUERY_PERFSTAT QueryPerf
,
1511 Ex2ProcessMountPoint(
1512 IN PEXT2_IRP_CONTEXT IrpContext
,
1513 IN PEXT2_MOUNT_POINT MountPoint
,
1518 Ext2DeviceControlNormal (IN PEXT2_IRP_CONTEXT IrpContext
);
1521 Ext2PrepareToUnload (IN PEXT2_IRP_CONTEXT IrpContext
);
1524 Ext2DeviceControl (IN PEXT2_IRP_CONTEXT IrpContext
);
1531 Ext2GetInfoLength(IN FILE_INFORMATION_CLASS FileInformationClass
);
1535 IN PEXT2_IRP_CONTEXT IrpContext
,
1538 IN FILE_INFORMATION_CLASS FileInformationClass
,
1541 IN ULONG UsedLength
,
1544 IN PUNICODE_STRING pName
,
1545 OUT PULONG EntrySize
,
1552 IN POEM_STRING OeName
1555 NTSTATUS
Ext2QueryDirectory (IN PEXT2_IRP_CONTEXT IrpContext
);
1558 Ext2NotifyChangeDirectory (
1559 IN PEXT2_IRP_CONTEXT IrpContext
1563 Ext2NotifyReportChange (
1564 IN PEXT2_IRP_CONTEXT IrpContext
,
1572 Ext2DirectoryControl (IN PEXT2_IRP_CONTEXT IrpContext
);
1575 Ext2IsDirectoryEmpty (
1576 IN PEXT2_IRP_CONTEXT IrpContext
,
1586 Ext2OplockComplete (
1598 Ext2QueueRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1601 Ext2DeQueueRequest (IN PVOID Context
);
1604 Ext2DispatchRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1608 IN PDEVICE_OBJECT DeviceObject
,
1617 Ext2ExceptionFilter (
1618 IN PEXT2_IRP_CONTEXT IrpContext
,
1619 IN PEXCEPTION_POINTERS ExceptionPointer
1623 Ext2ExceptionHandler (IN PEXT2_IRP_CONTEXT IrpContext
);
1633 IN PEXT2_IRP_CONTEXT IrpContext
,
1644 PEXT2_IRP_CONTEXT IrpContext
,
1654 PEXT2_IRP_CONTEXT IrpContext
,
1665 static inline ext3_fsblk_t
ext3_blocks_count(struct ext3_super_block
*es
)
1667 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_blocks_count_hi
) << 32) |
1668 le32_to_cpu(es
->s_blocks_count
);
1671 static inline ext3_fsblk_t
ext3_r_blocks_count(struct ext3_super_block
*es
)
1673 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_r_blocks_count_hi
) << 32) |
1674 le32_to_cpu(es
->s_r_blocks_count
);
1677 static inline ext3_fsblk_t
ext3_free_blocks_count(struct ext3_super_block
*es
)
1679 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_free_blocks_count_hi
) << 32) |
1680 le32_to_cpu(es
->s_free_blocks_count
);
1683 static inline void ext3_blocks_count_set(struct ext3_super_block
*es
,
1686 es
->s_blocks_count
= cpu_to_le32((u32
)blk
);
1687 es
->s_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1690 static inline void ext3_free_blocks_count_set(struct ext3_super_block
*es
,
1693 es
->s_free_blocks_count
= cpu_to_le32((u32
)blk
);
1694 es
->s_free_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1697 static inline void ext3_r_blocks_count_set(struct ext3_super_block
*es
,
1700 es
->s_r_blocks_count
= cpu_to_le32((u32
)blk
);
1701 es
->s_r_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1704 blkcnt_t
ext3_inode_blocks(struct ext3_inode
*raw_inode
,
1705 struct inode
*inode
);
1707 int ext3_inode_blocks_set(struct ext3_inode
*raw_inode
,
1708 struct inode
* inode
);
1709 ext4_fsblk_t
ext4_block_bitmap(struct super_block
*sb
,
1710 struct ext4_group_desc
*bg
);
1712 ext4_fsblk_t
ext4_inode_bitmap(struct super_block
*sb
,
1713 struct ext4_group_desc
*bg
);
1714 ext4_fsblk_t
ext4_inode_table(struct super_block
*sb
,
1715 struct ext4_group_desc
*bg
);
1716 __u32
ext4_free_blks_count(struct super_block
*sb
,
1717 struct ext4_group_desc
*bg
);
1718 __u32
ext4_free_inodes_count(struct super_block
*sb
,
1719 struct ext4_group_desc
*bg
);
1720 __u32
ext4_used_dirs_count(struct super_block
*sb
,
1721 struct ext4_group_desc
*bg
);
1722 __u32
ext4_itable_unused_count(struct super_block
*sb
,
1723 struct ext4_group_desc
*bg
);
1724 void ext4_block_bitmap_set(struct super_block
*sb
,
1725 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1726 void ext4_inode_bitmap_set(struct super_block
*sb
,
1727 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1728 void ext4_inode_table_set(struct super_block
*sb
,
1729 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1730 void ext4_free_blks_set(struct super_block
*sb
,
1731 struct ext4_group_desc
*bg
, __u32 count
);
1732 void ext4_free_inodes_set(struct super_block
*sb
,
1733 struct ext4_group_desc
*bg
, __u32 count
);
1734 void ext4_used_dirs_set(struct super_block
*sb
,
1735 struct ext4_group_desc
*bg
, __u32 count
);
1736 void ext4_itable_unused_set(struct super_block
*sb
,
1737 struct ext4_group_desc
*bg
, __u32 count
);
1739 int ext3_bg_has_super(struct super_block
*sb
, ext3_group_t group
);
1740 unsigned long ext4_bg_num_gdb(struct super_block
*sb
, ext4_group_t group
);
1741 unsigned ext4_init_inode_bitmap(struct super_block
*sb
, struct buffer_head
*bh
,
1742 ext4_group_t block_group
,
1743 struct ext4_group_desc
*gdp
);
1744 unsigned ext4_init_block_bitmap(struct super_block
*sb
, struct buffer_head
*bh
,
1745 ext4_group_t block_group
, struct ext4_group_desc
*gdp
);
1746 struct ext4_group_desc
* ext4_get_group_desc(struct super_block
*sb
,
1747 ext4_group_t block_group
, struct buffer_head
**bh
);
1748 ext4_fsblk_t
ext4_count_free_blocks(struct super_block
*sb
);
1749 unsigned long ext4_count_free_inodes(struct super_block
*sb
);
1750 int ext4_check_descriptors(struct super_block
*sb
);
1756 OUT PEXT2_SUPER_BLOCK
* Sb
1762 IN PEXT2_IRP_CONTEXT IrpContext
,
1768 IN PEXT2_IRP_CONTEXT IrpContext
,
1773 Ext2LoadGroup(IN PEXT2_VCB Vcb
);
1776 Ext2PutGroup(IN PEXT2_VCB Vcb
);
1779 Ext2DropGroup(IN PEXT2_VCB Vcb
);
1783 IN PEXT2_IRP_CONTEXT IrpContext
,
1790 IN PEXT2_IRP_CONTEXT IrpContext
,
1798 OUT PLONGLONG offset
1804 IN
struct inode
*Inode
1809 IN PEXT2_IRP_CONTEXT IrpContext
,
1816 IN PEXT2_IRP_CONTEXT IrpContext
,
1818 IN
struct inode
*Inode
1830 IN PEXT2_IRP_CONTEXT IrpContext
,
1838 IN PEXT2_IRP_CONTEXT IrpContext
,
1846 IN PEXT2_IRP_CONTEXT IrpContext
,
1855 IN PEXT2_IRP_CONTEXT IrpContext
,
1862 IN PULONG BlockArray
,
1871 IN PEXT2_IRP_CONTEXT IrpContext
,
1882 IN PEXT2_IRP_CONTEXT IrpContext
,
1888 IN PEXT2_IRP_CONTEXT IrpContext
,
1893 IN OUT PULONG Number
1898 IN PEXT2_IRP_CONTEXT IrpContext
,
1907 IN PEXT2_IRP_CONTEXT IrpContext
,
1916 IN PEXT2_IRP_CONTEXT IrpContext
,
1924 IN PEXT2_IRP_CONTEXT IrpContext
,
1927 IN
struct inode
*Inode
,
1928 IN PUNICODE_STRING FileName
,
1929 OUT
struct dentry
**dentry
1934 IN PEXT2_IRP_CONTEXT IrpContext
,
1942 IN PEXT2_IRP_CONTEXT IrpContext
,
1949 Ext2SetParentEntry (
1950 IN PEXT2_IRP_CONTEXT IrpContext
,
1954 IN ULONG NewParent
);
1959 IN PEXT2_IRP_CONTEXT IrpContext
,
1966 IN PULONG BlockArray
,
1970 struct ext3_dir_entry_2
*ext3_next_entry(struct ext3_dir_entry_2
*p
);
1972 int ext3_check_dir_entry (const char * function
, struct inode
* dir
,
1973 struct ext3_dir_entry_2
* de
,
1974 struct buffer_head
* bh
,
1975 unsigned long offset
);
1977 loff_t
ext3_max_size(int blkbits
, int has_huge_files
);
1978 loff_t
ext3_max_bitmap_size(int bits
, int has_huge_files
);
1981 __le16
ext4_group_desc_csum(struct ext3_sb_info
*sbi
, __u32 block_group
,
1982 struct ext4_group_desc
*gdp
);
1983 int ext4_group_desc_csum_verify(struct ext3_sb_info
*sbi
, __u32 block_group
,
1984 struct ext4_group_desc
*gdp
);
1986 ext3_fsblk_t
descriptor_loc(struct super_block
*sb
,
1987 ext3_fsblk_t logical_sb_block
, unsigned int nr
);
1988 struct ext4_group_desc
* ext4_get_group_desc(struct super_block
*sb
,
1989 ext4_group_t block_group
, struct buffer_head
**bh
);
1990 int ext4_check_descriptors(struct super_block
*sb
);
1997 Ext2IsFastIoPossible(
2002 Ext2FastIoCheckIfPossible (
2003 IN PFILE_OBJECT FileObject
,
2004 IN PLARGE_INTEGER FileOffset
,
2008 IN BOOLEAN CheckForReadOperation
,
2009 OUT PIO_STATUS_BLOCK IoStatus
,
2010 IN PDEVICE_OBJECT DeviceObject
2015 Ext2FastIoRead (IN PFILE_OBJECT FileObject
,
2016 IN PLARGE_INTEGER FileOffset
,
2021 OUT PIO_STATUS_BLOCK IoStatus
,
2022 IN PDEVICE_OBJECT DeviceObject
);
2026 IN PFILE_OBJECT FileObject
,
2027 IN PLARGE_INTEGER FileOffset
,
2032 OUT PIO_STATUS_BLOCK IoStatus
,
2033 IN PDEVICE_OBJECT DeviceObject
);
2036 Ext2FastIoQueryBasicInfo (
2037 IN PFILE_OBJECT FileObject
,
2039 OUT PFILE_BASIC_INFORMATION Buffer
,
2040 OUT PIO_STATUS_BLOCK IoStatus
,
2041 IN PDEVICE_OBJECT DeviceObject
);
2044 Ext2FastIoQueryStandardInfo (
2045 IN PFILE_OBJECT FileObject
,
2047 OUT PFILE_STANDARD_INFORMATION Buffer
,
2048 OUT PIO_STATUS_BLOCK IoStatus
,
2049 IN PDEVICE_OBJECT DeviceObject
);
2053 IN PFILE_OBJECT FileObject
,
2054 IN PLARGE_INTEGER FileOffset
,
2055 IN PLARGE_INTEGER Length
,
2056 IN PEPROCESS Process
,
2058 IN BOOLEAN FailImmediately
,
2059 IN BOOLEAN ExclusiveLock
,
2060 OUT PIO_STATUS_BLOCK IoStatus
,
2061 IN PDEVICE_OBJECT DeviceObject
2065 Ext2FastIoUnlockSingle (
2066 IN PFILE_OBJECT FileObject
,
2067 IN PLARGE_INTEGER FileOffset
,
2068 IN PLARGE_INTEGER Length
,
2069 IN PEPROCESS Process
,
2071 OUT PIO_STATUS_BLOCK IoStatus
,
2072 IN PDEVICE_OBJECT DeviceObject
2076 Ext2FastIoUnlockAll (
2077 IN PFILE_OBJECT FileObject
,
2078 IN PEPROCESS Process
,
2079 OUT PIO_STATUS_BLOCK IoStatus
,
2080 IN PDEVICE_OBJECT DeviceObject
2084 Ext2FastIoUnlockAllByKey (
2085 IN PFILE_OBJECT FileObject
,
2089 IN PEPROCESS Process
,
2092 OUT PIO_STATUS_BLOCK IoStatus
,
2093 IN PDEVICE_OBJECT DeviceObject
2098 Ext2FastIoQueryNetworkOpenInfo (
2099 IN PFILE_OBJECT FileObject
,
2101 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
2102 OUT PIO_STATUS_BLOCK IoStatus
,
2103 IN PDEVICE_OBJECT DeviceObject
);
2106 Ext2FastIoQueryNetworkOpenInfo (
2107 IN PFILE_OBJECT FileObject
,
2109 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
2110 OUT PIO_STATUS_BLOCK IoStatus
,
2111 IN PDEVICE_OBJECT DeviceObject
);
2120 Ext2QueryFileInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2123 Ext2SetFileInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2128 PLARGE_INTEGER Size
,
2134 PEXT2_IRP_CONTEXT IrpContext
,
2142 PEXT2_IRP_CONTEXT IrpContext
,
2145 PLARGE_INTEGER AllocationSize
);
2148 Ext2IsFileRemovable(
2149 IN PEXT2_IRP_CONTEXT IrpContext
,
2156 Ext2SetDispositionInfo(
2157 PEXT2_IRP_CONTEXT IrpContext
,
2166 PEXT2_IRP_CONTEXT IrpContext
,
2174 PEXT2_IRP_CONTEXT IrpContext
,
2181 Ext2InodeType(PEXT2_MCB Mcb
);
2185 PEXT2_IRP_CONTEXT IrpContext
,
2198 IN PEXT2_IRP_CONTEXT IrpContext
,
2200 IN BOOLEAN bShutDown
2205 IN PEXT2_IRP_CONTEXT IrpContext
,
2207 IN BOOLEAN bShutDown
2212 IN PEXT2_IRP_CONTEXT IrpContext
,
2218 Ext2Flush (IN PEXT2_IRP_CONTEXT IrpContext
);
2227 IN PEXT2_IRP_CONTEXT IrpContext
,
2232 OUT PULONG BytesRead
2237 IN PEXT2_IRP_CONTEXT IrpContext
,
2242 OUT PULONG BytesWritten
2246 Ext2TruncateSymlink(
2247 PEXT2_IRP_CONTEXT IrpContext
,
2254 // MountPoint process workitem
2258 Ext2SetVpbFlag (IN PVPB Vpb
,
2262 Ext2ClearVpbFlag (IN PVPB Vpb
,
2267 IN PEXT2_IRP_CONTEXT IrpContext
,
2269 IN BOOLEAN bForce
);
2272 Ext2PurgeVolume (IN PEXT2_VCB Vcb
,
2273 IN BOOLEAN FlushBeforePurge
);
2276 Ext2PurgeFile (IN PEXT2_FCB Fcb
,
2277 IN BOOLEAN FlushBeforePurge
);
2280 Ext2IsHandleCountZero(IN PEXT2_VCB Vcb
);
2283 Ext2LockVcb (IN PEXT2_VCB Vcb
,
2284 IN PFILE_OBJECT FileObject
);
2287 Ext2LockVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2290 Ext2UnlockVcb (IN PEXT2_VCB Vcb
,
2291 IN PFILE_OBJECT FileObject
);
2294 Ext2UnlockVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2297 Ext2AllowExtendedDasdIo(IN PEXT2_IRP_CONTEXT IrpContext
);
2300 Ext2OplockRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
2303 Ext2QueryExtentMappings(
2304 IN PEXT2_IRP_CONTEXT IrpContext
,
2307 IN PLARGE_INTEGER RequestVbn
,
2308 OUT PLARGE_INTEGER
* pMappedRuns
2312 Ext2QueryRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext
);
2315 Ext2GetRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext
);
2318 Ext2GetRetrievalPointerBase(IN PEXT2_IRP_CONTEXT IrpContext
);
2321 Ext2UserFsRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
2324 Ext2IsMediaWriteProtected (
2325 IN PEXT2_IRP_CONTEXT IrpContext
,
2326 IN PDEVICE_OBJECT TargetDevice
2330 Ext2MountVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2333 Ext2VerifyVcb (IN PEXT2_IRP_CONTEXT IrpContext
,
2336 Ext2VerifyVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2339 Ext2IsVolumeMounted (IN PEXT2_IRP_CONTEXT IrpContext
);
2342 Ext2DismountVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2345 Ext2FileSystemControl (IN PEXT2_IRP_CONTEXT IrpContext
);
2351 struct buffer_head
*ext3_append(struct ext2_icb
*icb
, struct inode
*inode
,
2352 ext3_lblk_t
*block
, int *err
);
2354 void ext3_set_de_type(struct super_block
*sb
,
2355 struct ext3_dir_entry_2
*de
,
2358 __u32
ext3_current_time(struct inode
*in
);
2359 void ext3_warning (struct super_block
* sb
, const char * function
,
2361 #define ext3_error ext3_warning
2362 #define ext4_error ext3_error
2364 void ext3_update_dx_flag(struct inode
*inode
);
2365 int ext3_mark_inode_dirty(struct ext2_icb
*icb
, struct inode
*in
);
2367 void ext3_inc_count(struct inode
*inode
);
2368 void ext3_dec_count(struct inode
*inode
);
2370 struct buffer_head
*
2371 ext3_find_entry (struct ext2_icb
*icb
, struct dentry
*dentry
,
2372 struct ext3_dir_entry_2
** res_dir
);
2373 struct buffer_head
*
2374 ext3_dx_find_entry(struct ext2_icb
*, struct dentry
*dentry
,
2375 struct ext3_dir_entry_2
**res_dir
, int *err
);
2377 typedef int (*filldir_t
)(void *, const char *, int, unsigned long, __u32
, unsigned);
2378 int ext3_dx_readdir(struct file
*filp
, filldir_t filldir
, void * context
);
2380 struct buffer_head
*ext3_bread(struct ext2_icb
*icb
, struct inode
*inode
,
2381 unsigned long block
, int *err
);
2382 int add_dirent_to_buf(struct ext2_icb
*icb
, struct dentry
*dentry
,
2383 struct inode
*inode
, struct ext3_dir_entry_2
*de
,
2384 struct buffer_head
*bh
);
2386 #if !defined(__REACTOS__) || defined(_MSC_VER)
2387 struct ext3_dir_entry_2
*
2388 do_split(struct ext2_icb
*icb
, struct inode
*dir
,
2389 struct buffer_head
**bh
,struct dx_frame
*frame
,
2390 struct dx_hash_info
*hinfo
, int *error
);
2393 int ext3_add_entry(struct ext2_icb
*icb
, struct dentry
*dentry
, struct inode
*inode
);
2395 int ext3_delete_entry(struct ext2_icb
*icb
, struct inode
*dir
,
2396 struct ext3_dir_entry_2
*de_del
,
2397 struct buffer_head
*bh
);
2399 int ext3_is_dir_empty(struct ext2_icb
*icb
, struct inode
*inode
);
2406 Ext2QueryGlobalParameters (IN PUNICODE_STRING RegistryPath
);
2409 DriverUnload (IN PDRIVER_OBJECT DriverObject
);
2417 IN PEXT2_IRP_CONTEXT IrpContext
,
2428 PEXT2_IRP_CONTEXT IrpContext
,
2437 Ext2TruncateIndirect(
2438 PEXT2_IRP_CONTEXT IrpContext
,
2446 // linux.c: linux lib implemenation
2453 ext2_destroy_linux();
2461 Ext2LockControl (IN PEXT2_IRP_CONTEXT IrpContext
);
2469 Ext2AllocateIrpContext (IN PDEVICE_OBJECT DeviceObject
,
2473 Ext2FreeIrpContext (IN PEXT2_IRP_CONTEXT IrpContext
);
2483 Ext2FreeFcb (IN PEXT2_FCB Fcb
);
2486 Ext2InsertFcb(PEXT2_VCB Vcb
, PEXT2_FCB Fcb
);
2489 Ext2RemoveFcb(PEXT2_VCB Vcb
, PEXT2_FCB Fcb
);
2492 Ext2AllocateCcb (ULONG Flags
, PEXT2_MCB SymLink
);
2501 Ext2FreeCcb (IN PEXT2_VCB Vcb
, IN PEXT2_CCB Ccb
);
2504 Ext2AllocateInode (PEXT2_VCB Vcb
);
2507 Ext2DestroyInode (IN PEXT2_VCB Vcb
, IN PEXT2_INODE inode
);
2509 struct dentry
* Ext2AllocateEntry();
2510 VOID
Ext2FreeEntry (IN
struct dentry
*de
);
2511 struct dentry
*Ext2BuildEntry(PEXT2_VCB Vcb
, PEXT2_MCB Dcb
, PUNICODE_STRING FileName
);
2514 Ext2AllocateExtent();
2517 Ext2FreeExtent (IN PEXT2_EXTENT Extent
);
2520 Ext2CountExtents(IN PEXT2_EXTENT Chain
);
2524 IN PEXT2_EXTENT Chain
,
2525 IN PEXT2_EXTENT Extent
2529 Ext2DestroyExtentChain(IN PEXT2_EXTENT Chain
);
2533 IN PEXT2_IRP_CONTEXT IrpContext
,
2536 IN ULONGLONG Offset
,
2539 OUT PEXT2_EXTENT
* Chain
2543 Ext2ListExtents(PLARGE_MCB Extents
);
2555 Ext2ClearAllExtents(PLARGE_MCB Zone
);
2565 Ext2RemoveVcbExtent (
2572 Ext2LookupVcbExtent (
2576 OUT PLONGLONG Length
2589 Ext2RemoveMcbExtent (
2597 Ext2LookupMcbExtent (
2602 OUT PLONGLONG Length
2606 Ext2AddMcbMetaExts (
2614 Ext2RemoveMcbMetaExts (
2631 Ext2LookupBlockExtent(
2640 Ext2RemoveBlockExtent(
2649 IN PEXT2_IRP_CONTEXT IrpContext
,
2656 IN OUT PUNICODE_STRING Target
,
2657 IN PUNICODE_STRING File
,
2658 IN PUNICODE_STRING Parent
2665 IN PUNICODE_STRING FileName
,
2666 IN PUNICODE_STRING Parent
,
2674 PUNICODE_STRING FileName
2678 Ext2SearchMcbWithoutLock(
2680 PUNICODE_STRING FileName
2703 PEXT2_IRP_CONTEXT IrpContext
,
2704 PEXT2_VCB Vcb
, LONGLONG Block
2708 Ext2CheckBitmapConsistency(
2709 PEXT2_IRP_CONTEXT IrpContext
,
2714 Ext2InsertVcb(PEXT2_VCB Vcb
);
2717 Ext2RemoveVcb(PEXT2_VCB Vcb
);
2720 Ext2InitializeLabel(
2722 IN PEXT2_SUPER_BLOCK Sb
2727 PEXT2_IRP_CONTEXT IrpContext
,
2729 PEXT2_SUPER_BLOCK Ext2Sb
,
2730 PDEVICE_OBJECT TargetDevice
,
2731 PDEVICE_OBJECT VolumeDevice
,
2735 Ext2TearDownStream (IN PEXT2_VCB Vcb
);
2738 Ext2DestroyVcb (IN PEXT2_VCB Vcb
);
2741 Ext2CompleteIrpContext (
2742 IN PEXT2_IRP_CONTEXT IrpContext
,
2743 IN NTSTATUS Status
);
2746 Ext2SyncUninitializeCacheMap (
2747 IN PFILE_OBJECT FileObject
);
2750 Ext2LinkTailMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2754 Ext2LinkHeadMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2757 Ext2UnlinkMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2772 Ext2StartReaperThread();
2779 Ext2Log2(ULONG Value
);
2782 Ext2NtTime (IN ULONG i_time
);
2785 Ext2LinuxTime (IN LARGE_INTEGER SysTime
);
2788 Ext2OEMToUnicodeSize(
2796 IN OUT PUNICODE_STRING Oem
,
2797 IN POEM_STRING Unicode
2801 Ext2UnicodeToOEMSize(
2803 IN PUNICODE_STRING Unicode
2809 IN OUT POEM_STRING Oem
,
2810 IN PUNICODE_STRING Unicode
2814 Ext2Sleep(ULONG ms
);
2816 int Ext2LinuxError (NTSTATUS Status
);
2817 NTSTATUS
Ext2WinntError(int rc
);
2819 BOOLEAN
Ext2IsDot(PUNICODE_STRING name
);
2820 BOOLEAN
Ext2IsDotDot(PUNICODE_STRING name
);
2836 Ext2Pnp(IN PEXT2_IRP_CONTEXT IrpContext
);
2840 PEXT2_IRP_CONTEXT IrpContext
,
2845 PEXT2_IRP_CONTEXT IrpContext
,
2849 Ext2PnpCancelRemove(
2850 PEXT2_IRP_CONTEXT IrpContext
,
2854 Ext2PnpSurpriseRemove(
2855 PEXT2_IRP_CONTEXT IrpContext
,
2865 IN PEXT2_IRP_CONTEXT IrpContext
,
2868 IN ULONGLONG Offset
,
2871 IN BOOLEAN bDirectIo
,
2876 Ext2Read (IN PEXT2_IRP_CONTEXT IrpContext
);
2884 Ext2LoadInternalJournal(
2897 PEXT2_IRP_CONTEXT IrpContext
,
2907 Ext2ShutDown (IN PEXT2_IRP_CONTEXT IrpContext
);
2915 Ext2QueryVolumeInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2918 Ext2SetVolumeInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2924 typedef struct _EXT2_RW_CONTEXT
{
2929 PERESOURCE Resource
;
2930 ERESOURCE_THREAD ThreadId
;
2931 PFILE_OBJECT FileObject
;
2935 } EXT2_RW_CONTEXT
, *PEXT2_RW_CONTEXT
;
2937 #define EXT2_RW_CONTEXT_WRITE 1
2941 IN PEXT2_IRP_CONTEXT IrpContext
,
2944 IN ULONGLONG Offset
,
2947 IN BOOLEAN bDirectIo
,
2952 Ext2StartFloppyFlushDpc (
2955 PFILE_OBJECT FileObject
);
2959 IN PEXT2_IRP_CONTEXT IrpContext
,
2961 IN PFILE_OBJECT FileObject
,
2962 IN PLARGE_INTEGER Start
,
2963 IN PLARGE_INTEGER End
);
2966 Ext2Write (IN PEXT2_IRP_CONTEXT IrpContext
);
2968 #endif /* _EXT2_HEADER_ */