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.66"
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)))
116 * Compile-time assertion: (Lustre version)
118 * Check an invariant described by a constant expression at compile time by
119 * forcing a compiler error if it does not hold. \a cond must be a constant
120 * expression as defined by the ISO C Standard:
122 * 6.8.4.2 The switch statement
124 * [#3] The expression of each case label shall be an integer
125 * constant expression and no two of the case constant
126 * expressions in the same switch statement shall have the same
127 * value after conversion...
131 #define CL_ASSERT(cond) do {switch('x') {case (cond): case 0: break;}} while (0)
133 /* File System Releated *************************************************/
135 #define DRIVER_NAME "Ext2Fsd"
136 #define DEVICE_NAME L"\\Ext2Fsd"
137 #define CDROM_NAME L"\\Ext2CdFsd"
141 #define PARAMETERS_KEY L"\\Parameters"
142 #define VOLUMES_KEY L"\\Volumes"
144 #define READING_ONLY L"Readonly"
145 #define WRITING_SUPPORT L"WritingSupport"
146 #define CHECKING_BITMAP L"CheckingBitmap"
147 #define EXT3_FORCEWRITING L"Ext3ForceWriting"
148 #define CODEPAGE_NAME L"CodePage"
149 #define HIDING_PREFIX L"HidingPrefix"
150 #define HIDING_SUFFIX L"HidingSuffix"
151 #define AUTO_MOUNT L"AutoMount"
152 #define MOUNT_POINT L"MountPoint"
158 #define DOS_DEVICE_NAME L"\\DosDevices\\Ext2Fsd"
160 // To support ext2fsd unload routine
163 // Private IOCTL to make the driver ready to unload
165 #define IOCTL_PREPARE_TO_UNLOAD \
166 CTL_CODE(FILE_DEVICE_UNKNOWN, 2048, METHOD_NEITHER, FILE_WRITE_ACCESS)
168 #endif // EXT2_UNLOAD
173 typedef IO_STACK_LOCATION EXTENDED_IO_STACK_LOCATION
, *PEXTENDED_IO_STACK_LOCATION
;
176 #define IsFlagOn(a,b) ((BOOLEAN)(FlagOn(a,b) == b))
178 #define FlagOn(_F,_SF) ((_F) & (_SF))
181 #ifndef BooleanFlagOn
182 #define BooleanFlagOn(F,SF) ((BOOLEAN)(((F) & (SF)) != 0))
186 #define SetFlag(_F,_SF) ((_F) |= (_SF))
190 #define ClearFlag(_F,_SF) ((_F) &= ~(_SF))
194 #define min(a,b) (((a) < (b)) ? (a) : (b))
198 #define max(a,b) (((a) > (b)) ? (a) : (b))
201 #ifdef _WIN2K_TARGET_
202 #define InterlockedOr _InterlockedOr
205 IN OUT LONG
volatile *Target
,
209 #pragma intrinsic (_InterlockedAnd)
210 #define InterlockedAnd _InterlockedAnd
214 IN OUT LONG
volatile *Target
,
218 #pragma intrinsic (_InterlockedXor)
219 #define InterlockedXor _InterlockedXor
221 #endif /* only for win2k */
225 #define SetLongFlag(_F,_SF) Ext2SetFlag((PULONG)&(_F), (ULONG)(_SF))
226 #define ClearLongFlag(_F,_SF) Ext2ClearFlag((PULONG)&(_F), (ULONG)(_SF))
233 Ext2SetFlag(PULONG Flags
, ULONG FlagBit
)
235 ULONG _ret
= InterlockedOr(Flags
, FlagBit
);
236 ASSERT(*Flags
== (_ret
| FlagBit
));
244 Ext2ClearFlag(PULONG Flags
, ULONG FlagBit
)
246 ULONG _ret
= InterlockedAnd(Flags
, ~FlagBit
);
247 ASSERT(*Flags
== (_ret
& (~FlagBit
)));
252 #define SetLongFlag(_F,_SF) InterlockedOr(&(_F), (ULONG)(_SF))
253 #define ClearLongFlag(_F,_SF) InterlockedAnd(&(_F), ~((ULONG)(_SF)))
257 #define Ext2RaiseStatus(IRPCONTEXT,STATUS) { \
258 (IRPCONTEXT)->ExceptionCode = (STATUS); \
259 ExRaiseStatus((STATUS)); \
262 #define Ext2NormalizeAndRaiseStatus(IRPCONTEXT,STATUS) { \
263 (IRPCONTEXT)->ExceptionCode = STATUS; \
264 if ((STATUS) == STATUS_VERIFY_REQUIRED) { ExRaiseStatus((STATUS)); } \
265 ExRaiseStatus(FsRtlNormalizeNtstatus((STATUS),STATUS_UNEXPECTED_IO_ERROR)); \
269 // Define IsWritingToEof for write (append) operations
272 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
274 #define IsWritingToEof(Pos) (((Pos).LowPart == FILE_WRITE_TO_END_OF_FILE) && \
275 ((Pos).HighPart == -1 ))
277 #define IsDirectory(Fcb) IsMcbDirectory((Fcb)->Mcb)
278 #define IsSpecialFile(Fcb) IsMcbSpecialFile((Fcb)->Mcb)
279 #define IsSymLink(Fcb) IsMcbSymLink((Fcb)->Mcb)
280 #define IsInodeSymLink(I) S_ISLNK((I)->i_mode)
281 #define IsRoot(Fcb) IsMcbRoot((Fcb)->Mcb)
287 #define TAG_VPB ' bpV'
288 #define VPB_SIZE sizeof(VPB)
290 #define EXT2_DATA_MAGIC 'BD2E'
291 #define EXT2_INAME_MAGIC 'NI2E'
292 #define EXT2_FNAME_MAGIC 'NF2E'
293 #define EXT2_VNAME_MAGIC 'NV2E'
294 #define EXT2_DENTRY_MAGIC 'ED2E'
295 #define EXT2_DIRSP_MAGIC 'SD2E'
296 #define EXT2_SB_MAGIC 'BS2E'
297 #define EXT2_GD_MAGIC 'DG2E'
298 #define EXT2_FLIST_MAGIC 'LF2E'
299 #define EXT2_PARAM_MAGIC 'PP2E'
300 #define EXT2_RWC_MAGIC 'WR2E'
303 // Bug Check Codes Definitions
306 #define EXT2_FILE_SYSTEM (FILE_SYSTEM)
308 #define EXT2_BUGCHK_BLOCK (0x00010000)
309 #define EXT2_BUGCHK_CLEANUP (0x00020000)
310 #define EXT2_BUGCHK_CLOSE (0x00030000)
311 #define EXT2_BUGCHK_CMCB (0x00040000)
312 #define EXT2_BUGCHK_CREATE (0x00050000)
313 #define EXT2_BUGCHK_DEBUG (0x00060000)
314 #define EXT2_BUGCHK_DEVCTL (0x00070000)
315 #define EXT2_BUGCHK_DIRCTL (0x00080000)
316 #define EXT2_BUGCHK_DISPATCH (0x00090000)
317 #define EXT2_BUGCHK_EXCEPT (0x000A0000)
318 #define EXT2_BUGCHK_EXT2 (0x000B0000)
319 #define EXT2_BUGCHK_FASTIO (0x000C0000)
320 #define EXT2_BUGCHK_FILEINFO (0x000D0000)
321 #define EXT2_BUGCHK_FLUSH (0x000E0000)
322 #define EXT2_BUGCHK_FSCTL (0x000F0000)
323 #define EXT2_BUGCHK_INIT (0x00100000)
324 #define EXT2_BUGCHK_LOCK (0x0011000)
325 #define EXT2_BUGCHK_MEMORY (0x0012000)
326 #define EXT2_BUGCHK_MISC (0x0013000)
327 #define EXT2_BUGCHK_READ (0x00140000)
328 #define EXT2_BUGCHK_SHUTDOWN (0x00150000)
329 #define EXT2_BUGCHK_VOLINFO (0x00160000)
330 #define EXT2_BUGCHK_WRITE (0x00170000)
332 #define EXT2_BUGCHK_LAST (0x00170000)
334 #define Ext2BugCheck(A,B,C,D) { KeBugCheckEx(EXT2_FILE_SYSTEM, A | __LINE__, B, C, D ); }
337 /* Ext2 file system definions *******************************************/
340 // The second extended file system magic number
343 #define EXT2_SUPER_MAGIC 0xEF53
345 #define EXT2_MIN_BLOCK 1024
346 #define EXT2_MIN_FRAG 1024
347 #define EXT2_MAX_USER_BLKSIZE 65536
349 // Inode flags (Linux uses octad number, but why ? strange!!!)
352 #define S_IFMT 0x0F000 /* 017 0000 */
353 #define S_IFSOCK 0x0C000 /* 014 0000 */
354 #define S_IFLNK 0x0A000 /* 012 0000 */
355 #define S_IFREG 0x08000 /* 010 0000 */
356 #define S_IFBLK 0x06000 /* 006 0000 */
357 #define S_IFDIR 0x04000 /* 004 0000 */
358 #define S_IFCHR 0x02000 /* 002 0000 */
359 #define S_IFIFO 0x01000 /* 001 0000 */
361 #define S_ISUID 0x00800 /* 000 4000 */
362 #define S_ISGID 0x00400 /* 000 2000 */
363 #define S_ISVTX 0x00200 /* 000 1000 */
365 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
366 #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
367 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
368 #define S_ISFIL(m) (((m) & S_IFMT) == S_IFFIL)
369 #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
370 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
371 #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
372 #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
374 #define S_IPERMISSION_MASK 0x1FF /* */
376 #define S_IRWXU 0x1C0 /* 0 0700 */
377 #define S_IRWNU 0x180 /* 0 0600 */
378 #define S_IRUSR 0x100 /* 0 0400 */
379 #define S_IWUSR 0x080 /* 0 0200 */
380 #define S_IXUSR 0x040 /* 0 0100 */
382 #define S_IRWXG 0x038 /* 0 0070 */
383 #define S_IRWNG 0x030 /* 0 0060 */
384 #define S_IRGRP 0x020 /* 0 0040 */
385 #define S_IWGRP 0x010 /* 0 0020 */
386 #define S_IXGRP 0x008 /* 0 0010 */
388 #define S_IRWXO 0x007 /* 0 0007 */
389 #define S_IRWNO 0x006 /* 0 0006 */
390 #define S_IROTH 0x004 /* 0 0004 */
391 #define S_IWOTH 0x002 /* 0 0002 */
392 #define S_IXOTH 0x001 /* 0 0001 */
394 #define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO)
395 #define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
396 #define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH)
397 #define S_IWUGO (S_IWUSR|S_IWGRP|S_IWOTH)
398 #define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH)
399 #define S_IFATTR (S_IRWNU|S_IRWNG|S_IRWNO)
401 #define S_ISREADABLE(m) (((m) & S_IPERMISSION_MASK) == (S_IRUSR | S_IRGRP | S_IROTH))
402 #define S_ISWRITABLE(m) (((m) & S_IPERMISSION_MASK) == (S_IWUSR | S_IWGRP | S_IWOTH))
404 #define Ext2SetReadable(m) do {(m) = (m) | (S_IRUSR | S_IRGRP | S_IROTH);} while(0)
405 #define Ext2SetWritable(m) do {(m) = (m) | (S_IWUSR | S_IWGRP | S_IWOTH);} while(0)
407 #define Ext2SetOwnerWritable(m) do {(m) |= S_IWUSR;} while(0)
408 #define Ext2SetOwnerReadOnly(m) do {(m) &= ~S_IWUSR;} while(0)
410 #define Ext2IsOwnerWritable(m) (((m) & S_IWUSR) == S_IWUSR)
411 #define Ext2IsOwnerReadable(m) (((m) & S_IRUSR) == S_IRUSR)
412 #define Ext2IsOwnerReadOnly(m) (!(Ext2IsOwnerWritable(m)) && Ext2IsOwnerReadable(m))
414 #define Ext2IsGroupWritable(m) (((m) & S_IWGRP) == S_IWGRP)
415 #define Ext2IsGroupReadable(m) (((m) & S_IRGRP) == S_IRGRP)
416 #define Ext2IsGroupReadOnly(m) (!(Ext2IsGroupWritable(m)) && Ext2IsGroupReadable(m))
418 #define Ext2IsOtherWritable(m) (((m) & S_IWOTH) == S_IWOTH)
419 #define Ext2IsOtherReadable(m) (((m) & S_IROTH) == S_IROTH)
420 #define Ext2IsOtherReadOnly(m) (!(Ext2IsOtherWritable(m)) && Ext2IsOtherReadable(m))
422 #define Ext2SetReadOnly(m) do {(m) &= ~(S_IWUSR | S_IWGRP | S_IWOTH);} while(0)
425 #define Ext2FileCanRead (0x1)
426 #define Ext2FileCanWrite (0x2)
427 #define Ext2FileCanExecute (0x4)
431 * We need 8-bytes aligned for all the sturctures
432 * It's a must for all ERESOURCE allocations
436 // Ext2Fsd Driver Definitions
440 // EXT2_IDENTIFIER_TYPE
442 // Identifiers used to mark the structures
445 typedef enum _EXT2_IDENTIFIER_TYPE
{
455 EXT2FGD
= 0xE2FD0001,
456 EXT2VCB
= 0xE2FD0002,
457 EXT2FCB
= 0xE2FD0003,
458 EXT2CCB
= 0xE2FD0004,
459 EXT2ICX
= 0xE2FD0005,
460 EXT2FSD
= 0xE2FD0006,
463 } EXT2_IDENTIFIER_TYPE
;
468 // Header used to mark the structures
470 typedef struct _EXT2_IDENTIFIER
{
471 EXT2_IDENTIFIER_TYPE Type
;
473 } EXT2_IDENTIFIER
, *PEXT2_IDENTIFIER
;
476 #define NodeType(Ptr) (*((EXT2_IDENTIFIER_TYPE *)(Ptr)))
478 typedef struct _EXT2_MCB EXT2_MCB
, *PEXT2_MCB
;
488 // Data that is not specific to a mounted volume
491 typedef VOID (NTAPI
*EXT2_REAPER_RELEASE
)(PVOID
);
493 typedef struct _EXT2_REAPER
{
496 EXT2_REAPER_RELEASE Free
;
498 } EXT2_REAPER
, *PEXT2_REAPER
;
500 #define EXT2_REAPER_FLAG_STOP (1 << 0)
502 typedef struct _EXT2_GLOBAL
{
504 /* Identifier for this structure */
505 EXT2_IDENTIFIER Identifier
;
507 /* Syncronization primitive for this structure */
510 /* Global flags for the driver: I put it since
511 FastIoDispatch isn't 8bytes aligned. */
514 /* Table of pointers to the fast I/O entry points */
515 FAST_IO_DISPATCH FastIoDispatch
;
517 /* Filter callbacks */
518 FS_FILTER_CALLBACKS FilterCallbacks
;
520 /* Table of pointers to the Cache Manager callbacks */
521 CACHE_MANAGER_CALLBACKS CacheManagerCallbacks
;
522 CACHE_MANAGER_CALLBACKS CacheManagerNoOpCallbacks
;
524 /* Pointer to the driver object */
525 PDRIVER_OBJECT DriverObject
;
527 /* Pointer to the disk device object */
528 PDEVICE_OBJECT DiskdevObject
;
530 /* Pointer to the cdrom device object */
531 PDEVICE_OBJECT CdromdevObject
;
533 /* List of mounted volumes */
536 /* Cleaning thread related: resource cleaner */
537 EXT2_REAPER McbReaper
;
538 EXT2_REAPER bhReaper
;
540 /* Look Aside table of IRP_CONTEXT, FCB, MCB, CCB */
541 NPAGED_LOOKASIDE_LIST Ext2IrpContextLookasideList
;
542 NPAGED_LOOKASIDE_LIST Ext2FcbLookasideList
;
543 NPAGED_LOOKASIDE_LIST Ext2CcbLookasideList
;
544 NPAGED_LOOKASIDE_LIST Ext2McbLookasideList
;
545 NPAGED_LOOKASIDE_LIST Ext2ExtLookasideList
;
546 NPAGED_LOOKASIDE_LIST Ext2DentryLookasideList
;
549 /* User specified global codepage name */
551 WCHAR PageName
[CODEPAGE_MAXLEN
];
552 UCHAR AnsiName
[CODEPAGE_MAXLEN
];
553 struct nls_table
* PageTable
;
556 /* global hiding patterns */
557 WCHAR wHidingPrefix
[HIDINGPAT_LEN
];
558 WCHAR wHidingSuffix
[HIDINGPAT_LEN
];
559 BOOLEAN bHidingPrefix
;
560 CHAR sHidingPrefix
[HIDINGPAT_LEN
];
561 BOOLEAN bHidingSuffix
;
562 CHAR sHidingSuffix
[HIDINGPAT_LEN
];
565 UNICODE_STRING RegistryPath
;
567 /* global memory and i/o statistics and memory allocations
568 of various sturctures */
570 EXT2_PERF_STATISTICS_V2 PerfStat
;
572 } EXT2_GLOBAL
, *PEXT2_GLOBAL
;
575 // Flags for EXT2_GLOBAL_DATA
578 #define EXT2_UNLOAD_PENDING 0x00000001
579 #define EXT2_SUPPORT_WRITING 0x00000002
580 #define EXT3_FORCE_WRITING 0x00000004
581 #define EXT2_CHECKING_BITMAP 0x00000008
582 #define EXT2_AUTO_MOUNT 0x00000010
585 // Glboal Ext2Fsd Memory Block
588 extern PEXT2_GLOBAL Ext2Global
;
591 // memory allocation statistics
595 #define INC_MEM_COUNT(_i, _p, _s) do { ASSERT(_p); Ext2TraceMemory(TRUE, (int) (_i), (PVOID)(_p), (LONG)(_s)); } while(0)
596 #define DEC_MEM_COUNT(_i, _p, _s) do { ASSERT(_p); Ext2TraceMemory(FALSE, (int) (_i), (PVOID)(_p), (LONG)(_s)); } while(0)
597 #define INC_IRP_COUNT(IrpContext) Ext2TraceIrpContext(TRUE, (IrpContext))
598 #define DEC_IRP_COUNT(IrpContext) Ext2TraceIrpContext(FALSE, (IrpContext))
601 // Driver Extension define
604 #define IsExt2FsDevice(DO) ((DO == Ext2Global->DiskdevObject) || \
605 (DO == Ext2Global->CdromdevObject) )
607 #ifdef _WIN2K_TARGET_
608 #define FSRTL_ADVANCED_FCB_HEADER FSRTL_COMMON_FCB_HEADER
611 typedef struct _EXT2_FCBVCB
{
613 // Command header for Vcb and Fcb
614 FSRTL_ADVANCED_FCB_HEADER Header
;
616 #ifndef _WIN2K_TARGET_
620 // Ext2Fsd identifier
621 EXT2_IDENTIFIER Identifier
;
625 ERESOURCE MainResource
;
626 ERESOURCE PagingIoResource
;
628 } EXT2_FCBVCB
, *PEXT2_FCBVCB
;
631 // EXT2_VCB Volume Control Block
633 // Data that represents a mounted logical volume
634 // It is allocated as the device extension of the volume device object
636 typedef struct _EXT2_VCB
{
641 // Resource for metadata (inode)
644 // Resource for metadata (block)
647 // Resource for Mcb (Meta data control block)
650 // Entry of Mcb Tree (Root Node)
657 // Link list to Global
661 SECTION_OBJECT_POINTERS SectionObject
;
663 // Dirty Mcbs of modifications for volume stream
666 // List of FCBs for open files on this volume
671 // Share Access for the file object
672 SHARE_ACCESS ShareAccess
;
674 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
675 // for both files on this volume and open instances of the
677 ULONG ReferenceCount
; /* total ref count */
678 ULONG OpenHandleCount
; /* all handles */
680 ULONG OpenVolumeCount
; /* volume handle */
685 // Pointer to the VPB in the target device object
689 // The FileObject of Volume used to lock the volume
690 PFILE_OBJECT LockFile
;
692 // List of IRPs pending on directory change notify requests
693 LIST_ENTRY NotifyList
;
695 // Pointer to syncronization primitive for this list
696 PNOTIFY_SYNC NotifySync
;
698 // This volumes device object
699 PDEVICE_OBJECT DeviceObject
;
701 // The physical device object (the disk)
702 PDEVICE_OBJECT TargetDeviceObject
;
704 // The physical device object (the disk)
705 PDEVICE_OBJECT RealDevice
;
707 // Information about the physical device object
708 DISK_GEOMETRY DiskGeometry
;
709 PARTITION_INFORMATION PartitionInformation
;
712 PEXT2_SUPER_BLOCK SuperBlock
;
714 // Block / Cluster size
717 // Sector size in bits
720 // Aligned size (Page or Block)
721 ULONGLONG IoUnitSize
;
723 // Bits of aligned size
729 // Inode lookaside list
730 NPAGED_LOOKASIDE_LIST InodeLookasideList
;
732 // Flags for the volume
735 // Streaming File Object
738 // User specified codepage name per volume
740 UCHAR AnsiName
[CODEPAGE_MAXLEN
];
741 struct nls_table
* PageTable
;
744 /* patterns to hiding files */
745 BOOLEAN bHidingPrefix
;
746 CHAR sHidingPrefix
[HIDINGPAT_LEN
];
747 BOOLEAN bHidingSuffix
;
748 CHAR sHidingSuffix
[HIDINGPAT_LEN
];
750 /* User to impersanate */
758 /* mountpoint: symlink to DesDevices */
761 struct block_device bd
;
762 struct super_block sb
;
763 struct ext3_sb_info sbi
;
765 /* Maximum file size in blocks ... */
766 ULONG max_blocks_per_layer
[EXT2_BLOCK_TYPES
];
767 ULONG max_data_blocks
;
768 loff_t max_bitmap_bytes
;
770 } EXT2_VCB
, *PEXT2_VCB
;
773 // Flags for EXT2_VCB
775 #define VCB_INITIALIZED 0x00000001
776 #define VCB_VOLUME_LOCKED 0x00000002
777 #define VCB_MOUNTED 0x00000004
778 #define VCB_DISMOUNT_PENDING 0x00000008
779 #define VCB_NEW_VPB 0x00000010
780 #define VCB_BEING_CLOSED 0x00000020
781 #define VCB_USER_IDS 0x00000040 /* uid/gid specified by user */
782 #define VCB_USER_EIDS 0x00000080 /* euid/egid specified by user */
784 #define VCB_BEING_DROPPED 0x00002000
785 #define VCB_FORCE_WRITING 0x00004000
786 #define VCB_DEVICE_REMOVED 0x00008000
787 #define VCB_JOURNAL_RECOVER 0x00080000
788 #define VCB_ARRIVAL_NOTIFIED 0x00800000
789 #define VCB_READ_ONLY 0x08000000
790 #define VCB_WRITE_PROTECTED 0x10000000
791 #define VCB_FLOPPY_DISK 0x20000000
792 #define VCB_REMOVAL_PREVENTED 0x40000000
793 #define VCB_REMOVABLE_MEDIA 0x80000000
796 #define IsVcbInited(Vcb) (IsFlagOn((Vcb)->Flags, VCB_INITIALIZED))
797 #define IsMounted(Vcb) (IsFlagOn((Vcb)->Flags, VCB_MOUNTED))
798 #define IsDispending(Vcb) (IsFlagOn((Vcb)->Flags, VCB_DISMOUNT_PENDING))
799 #define IsVcbReadOnly(Vcb) (IsFlagOn((Vcb)->Flags, VCB_READ_ONLY) || \
800 IsFlagOn((Vcb)->Flags, VCB_WRITE_PROTECTED))
803 #define IsExt3ForceWrite() (IsFlagOn(Ext2Global->Flags, EXT3_FORCE_WRITING))
804 #define IsVcbForceWrite(Vcb) (IsFlagOn((Vcb)->Flags, VCB_FORCE_WRITING))
805 #define CanIWrite(Vcb) (IsExt3ForceWrite() || (!IsVcbReadOnly(Vcb) && IsVcbForceWrite(Vcb)))
806 #define IsLazyWriter(Fcb) ((Fcb)->LazyWriterThread == PsGetCurrentThread())
808 // EXT2_FCB File Control Block
810 // Data that represents an open file
811 // There is a single instance of the FCB for every open file
813 typedef struct _EXT2_FCB
{
818 // List of FCBs for this volume
821 SECTION_OBJECT_POINTERS SectionObject
;
823 // Share Access for the file object
824 SHARE_ACCESS ShareAccess
;
826 // List of byte-range locks for this file
827 FILE_LOCK FileLockAnchor
;
829 // oplock information management structure
832 // Lazy writer thread context
833 PETHREAD LazyWriterThread
;
835 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
836 ULONG OpenHandleCount
;
838 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
839 ULONG ReferenceCount
;
841 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
842 // But only for Files with FO_NO_INTERMEDIATE_BUFFERING flag
843 ULONG NonCachedOpenCount
;
848 // Pointer to the inode
857 } EXT2_FCB
, *PEXT2_FCB
;
860 // Flags for EXT2_FCB
863 #define FCB_FROM_POOL 0x00000001
864 #define FCB_PAGE_FILE 0x00000002
865 #define FCB_FILE_MODIFIED 0x00000020
866 #define FCB_STATE_BUSY 0x00000040
867 #define FCB_ALLOC_IN_CREATE 0x00000080
868 #define FCB_ALLOC_IN_WRITE 0x00000100
869 #define FCB_ALLOC_IN_SETINFO 0x00000200
871 #define FCB_DELETE_PENDING 0x80000000
879 // Identifier for this structure
880 EXT2_IDENTIFIER Identifier
;
886 PEXT2_MCB Parent
; // Parent
887 PEXT2_MCB Next
; // Siblings
890 PEXT2_MCB Child
; // Children Mcb nodes
891 PEXT2_MCB Target
; // Target Mcb of symlink
900 UNICODE_STRING ShortName
;
902 // Full name with path
903 UNICODE_STRING FullName
;
918 LARGE_INTEGER CreationTime
;
919 LARGE_INTEGER LastWriteTime
;
920 LARGE_INTEGER ChangeTime
;
921 LARGE_INTEGER LastAccessTime
;
923 // List Link to Vcb->McbList
933 #define MCB_FROM_POOL 0x00000001
934 #define MCB_VCB_LINK 0x00000002
935 #define MCB_ENTRY_TREE 0x00000004
936 #define MCB_FILE_DELETED 0x00000008
938 #define MCB_ZONE_INITED 0x20000000
939 #define MCB_TYPE_SPECIAL 0x40000000 /* unresolved symlink + device node */
940 #define MCB_TYPE_SYMLINK 0x80000000
942 #define IsMcbUsed(Mcb) ((Mcb)->Refercount > 0)
943 #define IsMcbSymLink(Mcb) IsFlagOn((Mcb)->Flags, MCB_TYPE_SYMLINK)
944 #define IsZoneInited(Mcb) IsFlagOn((Mcb)->Flags, MCB_ZONE_INITED)
945 #define IsMcbSpecialFile(Mcb) IsFlagOn((Mcb)->Flags, MCB_TYPE_SPECIAL)
946 #define IsMcbRoot(Mcb) ((Mcb)->Inode.i_ino == EXT2_ROOT_INO)
947 #define IsMcbReadonly(Mcb) IsFlagOn((Mcb)->FileAttr, FILE_ATTRIBUTE_READONLY)
948 #define IsMcbDirectory(Mcb) IsFlagOn((Mcb)->FileAttr, FILE_ATTRIBUTE_DIRECTORY)
949 #define IsFileDeleted(Mcb) IsFlagOn((Mcb)->Flags, MCB_FILE_DELETED)
951 #define IsLinkInvalid(Mcb) (IsMcbSymLink(Mcb) && IsFileDeleted(Mcb->Target))
954 * routines for reference count management
957 #define Ext2ReferXcb(_C) InterlockedIncrement(_C)
958 #define Ext2DerefXcb(_C) DEC_OBJ_CNT(_C)
963 __inline ULONG
DEC_OBJ_CNT(PULONG _C
) {
965 return InterlockedDecrement(_C
);
974 Ext2TraceMcb(PCHAR fn
, USHORT lc
, USHORT add
, PEXT2_MCB Mcb
);
975 #define Ext2ReferMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, TRUE, Mcb)
976 #define Ext2DerefMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, FALSE, Mcb)
978 #define Ext2ReferMcb(Mcb) Ext2ReferXcb(&Mcb->Refercount)
979 #define Ext2DerefMcb(Mcb) Ext2DerefXcb(&Mcb->Refercount)
983 // EXT2_CCB Context Control Block
985 // Data that represents one instance of an open file
986 // There is one instance of the CCB for every instance of an open file
988 typedef struct _EXT2_CCB
{
990 // Identifier for this structure
991 EXT2_IDENTIFIER Identifier
;
996 // Mcb of it's symbol link
999 // State that may need to be maintained
1000 UNICODE_STRING DirectorySearchPattern
;
1002 /* Open handle control block */
1005 } EXT2_CCB
, *PEXT2_CCB
;
1011 #define CCB_FROM_POOL 0x00000001
1012 #define CCB_VOLUME_DASD_PURGE 0x00000002
1013 #define CCB_LAST_WRITE_UPDATED 0x00000004
1014 #define CCB_OPEN_REPARSE_POINT 0x00000008
1015 #define CCB_DELETE_ON_CLOSE 0x00000010
1017 #define CCB_ALLOW_EXTENDED_DASD_IO 0x80000000
1022 // Used to pass information about a request between the drivers functions
1024 typedef struct ext2_icb
{
1026 // Identifier for this structure
1027 EXT2_IDENTIFIER Identifier
;
1029 // Pointer to the IRP this request describes
1035 // The major and minor function code for the request
1036 UCHAR MajorFunction
;
1037 UCHAR MinorFunction
;
1039 // The device object
1040 PDEVICE_OBJECT DeviceObject
;
1042 // The real device object
1043 PDEVICE_OBJECT RealDevice
;
1046 PFILE_OBJECT FileObject
;
1051 // If the request is top level
1054 // Used if the request needs to be queued for later processing
1055 WORK_QUEUE_ITEM WorkQueueItem
;
1057 // If an exception is currently in progress
1058 BOOLEAN ExceptionInProgress
;
1060 // The exception code when an exception is in progress
1061 NTSTATUS ExceptionCode
;
1063 } EXT2_IRP_CONTEXT
, *PEXT2_IRP_CONTEXT
;
1066 #define IRP_CONTEXT_FLAG_FROM_POOL (0x00000001)
1067 #define IRP_CONTEXT_FLAG_WAIT (0x00000002)
1068 #define IRP_CONTEXT_FLAG_WRITE_THROUGH (0x00000004)
1069 #define IRP_CONTEXT_FLAG_FLOPPY (0x00000008)
1070 #define IRP_CONTEXT_FLAG_DISABLE_POPUPS (0x00000020)
1071 #define IRP_CONTEXT_FLAG_DEFERRED (0x00000040)
1072 #define IRP_CONTEXT_FLAG_VERIFY_READ (0x00000080)
1073 #define IRP_CONTEXT_STACK_IO_CONTEXT (0x00000100)
1074 #define IRP_CONTEXT_FLAG_REQUEUED (0x00000200)
1075 #define IRP_CONTEXT_FLAG_USER_IO (0x00000400)
1076 #define IRP_CONTEXT_FLAG_DELAY_CLOSE (0x00000800)
1077 #define IRP_CONTEXT_FLAG_FILE_BUSY (0x00001000)
1080 #define Ext2CanIWait() (!IrpContext || IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT))
1083 // EXT2_ALLOC_HEADER
1085 // In the checked version of the driver this header is put in the beginning of
1086 // every memory allocation
1088 typedef struct _EXT2_ALLOC_HEADER
{
1089 EXT2_IDENTIFIER Identifier
;
1090 } EXT2_ALLOC_HEADER
, *PEXT2_ALLOC_HEADER
;
1092 typedef struct _FCB_LIST_ENTRY
{
1095 } FCB_LIST_ENTRY
, *PFCB_LIST_ENTRY
;
1098 // Block Description List
1099 typedef struct _EXT2_EXTENT
{
1104 struct _EXT2_EXTENT
* Next
;
1105 } EXT2_EXTENT
, *PEXT2_EXTENT
;
1108 /* FUNCTIONS DECLARATION *****************************************************/
1110 // Include this so we don't need the latest WDK to build the driver.
1111 #ifndef FSCTL_GET_RETRIEVAL_POINTER_BASE
1112 #define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS) // RETRIEVAL_POINTER_BASE
1116 // The following macro is used to determine if an FSD thread can block
1117 // for I/O or wait for a resource. It returns TRUE if the thread can
1118 // block and FALSE otherwise. This attribute can then be used to call
1119 // the FSD & FSP common work routine with the proper wait value.
1122 #define CanExt2Wait(IRP) IoIsOperationSynchronous(Irp)
1125 // memory allocation statistics
1133 Ext2TraceMemory(BOOLEAN _n
, int _i
, PVOID _p
, LONG _s
)
1136 InterlockedIncrement(&Ext2Global
->PerfStat
.Current
.Slot
[_i
]);
1137 InterlockedIncrement(&Ext2Global
->PerfStat
.Total
.Slot
[_i
]);
1138 InterlockedExchangeAdd(&Ext2Global
->PerfStat
.Size
.Slot
[_i
], _s
);
1140 InterlockedDecrement(&Ext2Global
->PerfStat
.Current
.Slot
[_i
]);
1141 InterlockedExchangeAdd(&Ext2Global
->PerfStat
.Size
.Slot
[_i
], -1 * _s
);
1150 Ext2TraceIrpContext(BOOLEAN _n
, PEXT2_IRP_CONTEXT IrpContext
)
1153 INC_MEM_COUNT(PS_IRP_CONTEXT
, IrpContext
, sizeof(EXT2_IRP_CONTEXT
));
1154 InterlockedIncrement(&(Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Current
));
1156 DEC_MEM_COUNT(PS_IRP_CONTEXT
, IrpContext
, sizeof(EXT2_IRP_CONTEXT
));
1157 InterlockedIncrement(&Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Processed
);
1158 InterlockedDecrement(&Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Current
);
1162 typedef struct _EXT2_FILLDIR_CONTEXT
{
1163 PEXT2_IRP_CONTEXT efc_irp
;
1168 NTSTATUS efc_status
;
1169 FILE_INFORMATION_CLASS efc_fi
;
1171 } EXT2_FILLDIR_CONTEXT
, *PEXT2_FILLDIR_CONTEXT
;
1178 int Ext2CheckInodeAccess(PEXT2_VCB Vcb
, struct inode
*in
, int attempt
);
1179 int Ext2CheckFileAccess (PEXT2_VCB Vcb
, PEXT2_MCB Mcb
, int attempt
);
1189 IN LOCK_OPERATION Operation
1193 Ext2DestroyMdl (IN PMDL Mdl
);
1196 Ext2LockUserBuffer (
1199 IN LOCK_OPERATION Operation
);
1201 Ext2GetUserBuffer (IN PIRP Irp
);
1205 Ext2ReadWriteBlocks(
1206 IN PEXT2_IRP_CONTEXT IrpContext
,
1208 IN PEXT2_EXTENT Extent
,
1215 IN ULONGLONG Offset
,
1218 IN BOOLEAN bVerify
);
1223 IN ULONGLONG Offset
,
1226 IN BOOLEAN bVerify
);
1230 IN PDEVICE_OBJECT DeviceOjbect
,
1232 IN PVOID InputBuffer
,
1233 IN ULONG InputBufferSize
,
1234 IN OUT PVOID OutputBuffer
,
1235 IN OUT PULONG OutputBufferSize
);
1238 Ext2MediaEjectControl (
1239 IN PEXT2_IRP_CONTEXT IrpContext
,
1241 IN BOOLEAN bPrevent
);
1244 Ext2DiskShutDown(PEXT2_VCB Vcb
);
1252 Ext2Cleanup (IN PEXT2_IRP_CONTEXT IrpContext
);
1259 Ext2Close (IN PEXT2_IRP_CONTEXT IrpContext
);
1262 Ext2QueueCloseRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1265 Ext2DeQueueCloseRequest (IN PVOID Context
);
1272 Ext2AcquireForLazyWrite (
1276 Ext2ReleaseFromLazyWrite (IN PVOID Context
);
1279 Ext2AcquireForReadAhead (
1284 Ext2ReleaseFromReadAhead (IN PVOID Context
);
1292 Ext2NoOpRelease (IN PVOID Fcb
);
1300 Ext2IsNameValid(PUNICODE_STRING FileName
);
1304 IN PEXT2_IRP_CONTEXT IrpContext
,
1306 IN PEXT2_MCB Parent
,
1313 IN PEXT2_IRP_CONTEXT IrpContext
,
1315 IN PEXT2_MCB Parent
,
1316 IN PUNICODE_STRING FileName
,
1318 struct dentry
**dentry
1322 Ext2IsSpecialSystemFile(
1323 IN PUNICODE_STRING FileName
,
1324 IN BOOLEAN bDirectory
1327 #define EXT2_LOOKUP_FLAG_MASK (0xFF00000)
1328 #define EXT2_LOOKUP_NOT_FOLLOW (0x8000000)
1332 IN PEXT2_IRP_CONTEXT IrpContext
,
1334 IN PUNICODE_STRING FullName
,
1335 IN PEXT2_MCB Parent
,
1336 OUT PEXT2_MCB
* Ext2Mcb
,
1342 IN PEXT2_IRP_CONTEXT IrpContext
,
1344 OUT PBOOLEAN OpPostIrp
1349 IN PEXT2_IRP_CONTEXT IrpContext
,
1353 Ext2Create (IN PEXT2_IRP_CONTEXT IrpContext
);
1357 IN PEXT2_IRP_CONTEXT IrpContext
,
1359 IN PEXT2_FCB pParentFcb
,
1362 IN PUNICODE_STRING FileName
);
1366 Ext2SupersedeOrOverWriteFile(
1367 IN PEXT2_IRP_CONTEXT IrpContext
,
1368 IN PFILE_OBJECT FileObject
,
1371 IN PLARGE_INTEGER AllocationSize
,
1372 IN ULONG Disposition
1381 #define DL_VIT 0x00000001
1382 #define DL_ERR 0x00000002
1383 #define DL_DBG 0x00000004
1384 #define DL_INF 0x00000008
1385 #define DL_FUN 0x00000010
1386 #define DL_LOW 0x00000020
1387 #define DL_REN 0x00000040 /* renaming operation */
1388 #define DL_RES 0x00000080 /* entry reference managment */
1389 #define DL_BLK 0x00000100 /* data block allocation / free */
1390 #define DL_CP 0x00000200 /* code pages (create, querydir) */
1391 #define DL_EXT 0x00000400 /* mcb extents */
1392 #define DL_MAP 0x00000800 /* retrieval points */
1393 #define DL_JNL 0x00001000 /* dump journal operations */
1394 #define DL_HTI 0x00002000 /* htree index */
1395 #define DL_WRN 0x00004000 /* warning */
1396 #define DL_BH 0x00008000 /* buffer head */
1397 #define DL_PNP 0x00010000 /* pnp */
1398 #define DL_IO 0x00020000 /* file i/o */
1400 #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)
1402 #if EXT2_DEBUG && defined(__REACTOS__)
1403 #define DL_DEFAULT (DL_ERR|DL_VIT|DL_DBG|DL_INF|DL_FUN|DL_LOW|DL_WRN)
1405 #define DL_DEFAULT (DL_ERR|DL_VIT)
1409 extern ULONG DebugFilter
;
1418 #define DEBUG(_DL, arg) do {if ((_DL) & DebugFilter) Ext2Printf arg;} while(0)
1419 #define DEBUGNI(_DL, arg) do {if ((_DL) & DebugFilter) Ext2NiPrintf arg;} while(0)
1421 #define Ext2CompleteRequest(Irp, bPrint, PriorityBoost) \
1422 Ext2DbgPrintComplete(Irp, bPrint); \
1423 IoCompleteRequest(Irp, PriorityBoost)
1427 #define DEBUG(_DL, arg) do {if ((_DL) & DL_ERR) DbgPrint arg;} while(0)
1429 #define Ext2CompleteRequest(Irp, bPrint, PriorityBoost) \
1430 IoCompleteRequest(Irp, PriorityBoost)
1432 #endif // EXT2_DEBUG
1441 extern ULONG ProcessNameOffset
;
1443 #define Ext2GetCurrentProcessName() ( \
1444 (PUCHAR) PsGetCurrentProcess() + ProcessNameOffset \
1448 Ext2GetProcessNameOffset (VOID
);
1452 IN PDEVICE_OBJECT DeviceObject
,
1456 Ext2DbgPrintComplete (
1462 Ext2NtStatusToString (IN NTSTATUS Status
);
1464 PVOID
Ext2AllocatePool(
1465 IN POOL_TYPE PoolType
,
1466 IN SIZE_T NumberOfBytes
,
1481 Ext2ProcessGlobalProperty(
1482 IN PDEVICE_OBJECT DeviceObject
,
1483 IN PEXT2_VOLUME_PROPERTY3 Property
,
1488 Ext2ProcessVolumeProperty(
1490 IN PEXT2_VOLUME_PROPERTY3 Property
,
1495 Ext2ProcessUserProperty(
1496 IN PEXT2_IRP_CONTEXT IrpContext
,
1497 IN PEXT2_VOLUME_PROPERTY3 Property
,
1502 Ex2ProcessUserPerfStat(
1503 IN PEXT2_IRP_CONTEXT IrpContext
,
1504 IN PEXT2_QUERY_PERFSTAT QueryPerf
,
1509 Ex2ProcessMountPoint(
1510 IN PEXT2_IRP_CONTEXT IrpContext
,
1511 IN PEXT2_MOUNT_POINT MountPoint
,
1516 Ext2DeviceControlNormal (IN PEXT2_IRP_CONTEXT IrpContext
);
1519 Ext2PrepareToUnload (IN PEXT2_IRP_CONTEXT IrpContext
);
1522 Ext2DeviceControl (IN PEXT2_IRP_CONTEXT IrpContext
);
1529 Ext2GetInfoLength(IN FILE_INFORMATION_CLASS FileInformationClass
);
1533 IN PEXT2_IRP_CONTEXT IrpContext
,
1536 IN FILE_INFORMATION_CLASS FileInformationClass
,
1539 IN ULONG UsedLength
,
1542 IN PUNICODE_STRING pName
,
1543 OUT PULONG EntrySize
,
1550 IN POEM_STRING OeName
1553 NTSTATUS
Ext2QueryDirectory (IN PEXT2_IRP_CONTEXT IrpContext
);
1556 Ext2NotifyChangeDirectory (
1557 IN PEXT2_IRP_CONTEXT IrpContext
1561 Ext2NotifyReportChange (
1562 IN PEXT2_IRP_CONTEXT IrpContext
,
1570 Ext2DirectoryControl (IN PEXT2_IRP_CONTEXT IrpContext
);
1573 Ext2IsDirectoryEmpty (
1574 IN PEXT2_IRP_CONTEXT IrpContext
,
1584 Ext2OplockComplete (
1596 Ext2QueueRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1599 Ext2DeQueueRequest (IN PVOID Context
);
1602 Ext2DispatchRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1606 IN PDEVICE_OBJECT DeviceObject
,
1615 Ext2ExceptionFilter (
1616 IN PEXT2_IRP_CONTEXT IrpContext
,
1617 IN PEXCEPTION_POINTERS ExceptionPointer
1621 Ext2ExceptionHandler (IN PEXT2_IRP_CONTEXT IrpContext
);
1631 IN PEXT2_IRP_CONTEXT IrpContext
,
1642 PEXT2_IRP_CONTEXT IrpContext
,
1652 PEXT2_IRP_CONTEXT IrpContext
,
1663 static inline ext3_fsblk_t
ext3_blocks_count(struct ext3_super_block
*es
)
1665 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_blocks_count_hi
) << 32) |
1666 le32_to_cpu(es
->s_blocks_count
);
1669 static inline ext3_fsblk_t
ext3_r_blocks_count(struct ext3_super_block
*es
)
1671 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_r_blocks_count_hi
) << 32) |
1672 le32_to_cpu(es
->s_r_blocks_count
);
1675 static inline ext3_fsblk_t
ext3_free_blocks_count(struct ext3_super_block
*es
)
1677 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_free_blocks_count_hi
) << 32) |
1678 le32_to_cpu(es
->s_free_blocks_count
);
1681 static inline void ext3_blocks_count_set(struct ext3_super_block
*es
,
1684 es
->s_blocks_count
= cpu_to_le32((u32
)blk
);
1685 es
->s_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1688 static inline void ext3_free_blocks_count_set(struct ext3_super_block
*es
,
1691 es
->s_free_blocks_count
= cpu_to_le32((u32
)blk
);
1692 es
->s_free_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1695 static inline void ext3_r_blocks_count_set(struct ext3_super_block
*es
,
1698 es
->s_r_blocks_count
= cpu_to_le32((u32
)blk
);
1699 es
->s_r_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1702 blkcnt_t
ext3_inode_blocks(struct ext3_inode
*raw_inode
,
1703 struct inode
*inode
);
1705 int ext3_inode_blocks_set(struct ext3_inode
*raw_inode
,
1706 struct inode
* inode
);
1707 ext4_fsblk_t
ext4_block_bitmap(struct super_block
*sb
,
1708 struct ext4_group_desc
*bg
);
1710 ext4_fsblk_t
ext4_inode_bitmap(struct super_block
*sb
,
1711 struct ext4_group_desc
*bg
);
1712 ext4_fsblk_t
ext4_inode_table(struct super_block
*sb
,
1713 struct ext4_group_desc
*bg
);
1714 __u32
ext4_free_blks_count(struct super_block
*sb
,
1715 struct ext4_group_desc
*bg
);
1716 __u32
ext4_free_inodes_count(struct super_block
*sb
,
1717 struct ext4_group_desc
*bg
);
1718 __u32
ext4_used_dirs_count(struct super_block
*sb
,
1719 struct ext4_group_desc
*bg
);
1720 __u32
ext4_itable_unused_count(struct super_block
*sb
,
1721 struct ext4_group_desc
*bg
);
1722 void ext4_block_bitmap_set(struct super_block
*sb
,
1723 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1724 void ext4_inode_bitmap_set(struct super_block
*sb
,
1725 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1726 void ext4_inode_table_set(struct super_block
*sb
,
1727 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1728 void ext4_free_blks_set(struct super_block
*sb
,
1729 struct ext4_group_desc
*bg
, __u32 count
);
1730 void ext4_free_inodes_set(struct super_block
*sb
,
1731 struct ext4_group_desc
*bg
, __u32 count
);
1732 void ext4_used_dirs_set(struct super_block
*sb
,
1733 struct ext4_group_desc
*bg
, __u32 count
);
1734 void ext4_itable_unused_set(struct super_block
*sb
,
1735 struct ext4_group_desc
*bg
, __u32 count
);
1737 int ext3_bg_has_super(struct super_block
*sb
, ext3_group_t group
);
1738 unsigned long ext4_bg_num_gdb(struct super_block
*sb
, ext4_group_t group
);
1739 unsigned ext4_init_inode_bitmap(struct super_block
*sb
, struct buffer_head
*bh
,
1740 ext4_group_t block_group
,
1741 struct ext4_group_desc
*gdp
);
1742 unsigned ext4_init_block_bitmap(struct super_block
*sb
, struct buffer_head
*bh
,
1743 ext4_group_t block_group
, struct ext4_group_desc
*gdp
);
1744 struct ext4_group_desc
* ext4_get_group_desc(struct super_block
*sb
,
1745 ext4_group_t block_group
, struct buffer_head
**bh
);
1746 ext4_fsblk_t
ext4_count_free_blocks(struct super_block
*sb
);
1747 unsigned long ext4_count_free_inodes(struct super_block
*sb
);
1748 int ext4_check_descriptors(struct super_block
*sb
);
1754 OUT PEXT2_SUPER_BLOCK
* Sb
1760 IN PEXT2_IRP_CONTEXT IrpContext
,
1766 IN PEXT2_IRP_CONTEXT IrpContext
,
1771 Ext2LoadGroup(IN PEXT2_VCB Vcb
);
1774 Ext2PutGroup(IN PEXT2_VCB Vcb
);
1777 Ext2DropGroup(IN PEXT2_VCB Vcb
);
1781 IN PEXT2_IRP_CONTEXT IrpContext
,
1788 IN PEXT2_IRP_CONTEXT IrpContext
,
1796 OUT PLONGLONG offset
1802 IN
struct inode
*Inode
1807 IN PEXT2_IRP_CONTEXT IrpContext
,
1814 IN PEXT2_IRP_CONTEXT IrpContext
,
1816 IN
struct inode
*Inode
1828 IN PEXT2_IRP_CONTEXT IrpContext
,
1836 IN PEXT2_IRP_CONTEXT IrpContext
,
1844 IN PEXT2_IRP_CONTEXT IrpContext
,
1853 IN PEXT2_IRP_CONTEXT IrpContext
,
1860 IN PULONG BlockArray
,
1869 IN PEXT2_IRP_CONTEXT IrpContext
,
1880 IN PEXT2_IRP_CONTEXT IrpContext
,
1886 IN PEXT2_IRP_CONTEXT IrpContext
,
1891 IN OUT PULONG Number
1896 IN PEXT2_IRP_CONTEXT IrpContext
,
1905 IN PEXT2_IRP_CONTEXT IrpContext
,
1913 Ext2UpdateGroupDirStat(
1914 IN PEXT2_IRP_CONTEXT IrpContext
,
1921 IN PEXT2_IRP_CONTEXT IrpContext
,
1929 IN PEXT2_IRP_CONTEXT IrpContext
,
1932 IN
struct inode
*Inode
,
1933 IN PUNICODE_STRING FileName
,
1934 OUT
struct dentry
**dentry
1939 IN PEXT2_IRP_CONTEXT IrpContext
,
1948 IN PEXT2_IRP_CONTEXT IrpContext
,
1955 Ext2SetParentEntry (
1956 IN PEXT2_IRP_CONTEXT IrpContext
,
1960 IN ULONG NewParent
);
1965 IN PEXT2_IRP_CONTEXT IrpContext
,
1972 IN PULONG BlockArray
,
1976 struct ext3_dir_entry_2
*ext3_next_entry(struct ext3_dir_entry_2
*p
);
1978 int ext3_check_dir_entry (const char * function
, struct inode
* dir
,
1979 struct ext3_dir_entry_2
* de
,
1980 struct buffer_head
* bh
,
1981 unsigned long offset
);
1983 loff_t
ext3_max_size(int blkbits
, int has_huge_files
);
1984 loff_t
ext3_max_bitmap_size(int bits
, int has_huge_files
);
1987 __le16
ext4_group_desc_csum(struct ext3_sb_info
*sbi
, __u32 block_group
,
1988 struct ext4_group_desc
*gdp
);
1989 int ext4_group_desc_csum_verify(struct ext3_sb_info
*sbi
, __u32 block_group
,
1990 struct ext4_group_desc
*gdp
);
1992 ext3_fsblk_t
descriptor_loc(struct super_block
*sb
,
1993 ext3_fsblk_t logical_sb_block
, unsigned int nr
);
1994 struct ext4_group_desc
* ext4_get_group_desc(struct super_block
*sb
,
1995 ext4_group_t block_group
, struct buffer_head
**bh
);
1996 int ext4_check_descriptors(struct super_block
*sb
);
2003 Ext2IsFastIoPossible(
2008 Ext2FastIoCheckIfPossible (
2009 IN PFILE_OBJECT FileObject
,
2010 IN PLARGE_INTEGER FileOffset
,
2014 IN BOOLEAN CheckForReadOperation
,
2015 OUT PIO_STATUS_BLOCK IoStatus
,
2016 IN PDEVICE_OBJECT DeviceObject
2021 Ext2FastIoRead (IN PFILE_OBJECT FileObject
,
2022 IN PLARGE_INTEGER FileOffset
,
2027 OUT PIO_STATUS_BLOCK IoStatus
,
2028 IN PDEVICE_OBJECT DeviceObject
);
2032 IN PFILE_OBJECT FileObject
,
2033 IN PLARGE_INTEGER FileOffset
,
2038 OUT PIO_STATUS_BLOCK IoStatus
,
2039 IN PDEVICE_OBJECT DeviceObject
);
2042 Ext2FastIoQueryBasicInfo (
2043 IN PFILE_OBJECT FileObject
,
2045 OUT PFILE_BASIC_INFORMATION Buffer
,
2046 OUT PIO_STATUS_BLOCK IoStatus
,
2047 IN PDEVICE_OBJECT DeviceObject
);
2050 Ext2FastIoQueryStandardInfo (
2051 IN PFILE_OBJECT FileObject
,
2053 OUT PFILE_STANDARD_INFORMATION Buffer
,
2054 OUT PIO_STATUS_BLOCK IoStatus
,
2055 IN PDEVICE_OBJECT DeviceObject
);
2059 IN PFILE_OBJECT FileObject
,
2060 IN PLARGE_INTEGER FileOffset
,
2061 IN PLARGE_INTEGER Length
,
2062 IN PEPROCESS Process
,
2064 IN BOOLEAN FailImmediately
,
2065 IN BOOLEAN ExclusiveLock
,
2066 OUT PIO_STATUS_BLOCK IoStatus
,
2067 IN PDEVICE_OBJECT DeviceObject
2071 Ext2FastIoUnlockSingle (
2072 IN PFILE_OBJECT FileObject
,
2073 IN PLARGE_INTEGER FileOffset
,
2074 IN PLARGE_INTEGER Length
,
2075 IN PEPROCESS Process
,
2077 OUT PIO_STATUS_BLOCK IoStatus
,
2078 IN PDEVICE_OBJECT DeviceObject
2082 Ext2FastIoUnlockAll (
2083 IN PFILE_OBJECT FileObject
,
2084 IN PEPROCESS Process
,
2085 OUT PIO_STATUS_BLOCK IoStatus
,
2086 IN PDEVICE_OBJECT DeviceObject
2090 Ext2FastIoUnlockAllByKey (
2091 IN PFILE_OBJECT FileObject
,
2095 IN PEPROCESS Process
,
2098 OUT PIO_STATUS_BLOCK IoStatus
,
2099 IN PDEVICE_OBJECT DeviceObject
2104 Ext2FastIoQueryNetworkOpenInfo (
2105 IN PFILE_OBJECT FileObject
,
2107 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
2108 OUT PIO_STATUS_BLOCK IoStatus
,
2109 IN PDEVICE_OBJECT DeviceObject
);
2112 Ext2FastIoQueryNetworkOpenInfo (
2113 IN PFILE_OBJECT FileObject
,
2115 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
2116 OUT PIO_STATUS_BLOCK IoStatus
,
2117 IN PDEVICE_OBJECT DeviceObject
);
2121 Ext2AcquireForCreateSection (
2122 IN PFILE_OBJECT FileObject
2127 Ext2ReleaseForCreateSection (
2128 IN PFILE_OBJECT FileObject
2133 Ext2AcquireFileForModWrite (
2134 IN PFILE_OBJECT FileObject
,
2135 IN PLARGE_INTEGER EndingOffset
,
2136 OUT PERESOURCE
*ResourceToRelease
,
2137 IN PDEVICE_OBJECT DeviceObject
2142 Ext2ReleaseFileForModWrite (
2143 IN PFILE_OBJECT FileObject
,
2144 IN PERESOURCE ResourceToRelease
,
2145 IN PDEVICE_OBJECT DeviceObject
2150 Ext2AcquireFileForCcFlush (
2151 IN PFILE_OBJECT FileObject
,
2152 IN PDEVICE_OBJECT DeviceObject
2157 Ext2ReleaseFileForCcFlush (
2158 IN PFILE_OBJECT FileObject
,
2159 IN PDEVICE_OBJECT DeviceObject
2165 Ext2PreAcquireForCreateSection(
2166 IN PFS_FILTER_CALLBACK_DATA cd
,
2176 Ext2QueryFileInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2179 Ext2SetFileInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2184 PLARGE_INTEGER Size
,
2190 PEXT2_IRP_CONTEXT IrpContext
,
2198 PEXT2_IRP_CONTEXT IrpContext
,
2201 PLARGE_INTEGER AllocationSize
);
2204 Ext2IsFileRemovable(
2205 IN PEXT2_IRP_CONTEXT IrpContext
,
2212 Ext2SetDispositionInfo(
2213 PEXT2_IRP_CONTEXT IrpContext
,
2222 PEXT2_IRP_CONTEXT IrpContext
,
2230 PEXT2_IRP_CONTEXT IrpContext
,
2237 Ext2InodeType(PEXT2_MCB Mcb
);
2241 PEXT2_IRP_CONTEXT IrpContext
,
2254 IN PEXT2_IRP_CONTEXT IrpContext
,
2256 IN BOOLEAN bShutDown
2261 IN PEXT2_IRP_CONTEXT IrpContext
,
2263 IN BOOLEAN bShutDown
2268 IN PEXT2_IRP_CONTEXT IrpContext
,
2274 Ext2Flush (IN PEXT2_IRP_CONTEXT IrpContext
);
2283 IN PEXT2_IRP_CONTEXT IrpContext
,
2288 OUT PULONG BytesRead
2293 IN PEXT2_IRP_CONTEXT IrpContext
,
2298 OUT PULONG BytesWritten
2302 Ext2TruncateSymlink(
2303 PEXT2_IRP_CONTEXT IrpContext
,
2310 // MountPoint process workitem
2314 Ext2SetVpbFlag (IN PVPB Vpb
,
2318 Ext2ClearVpbFlag (IN PVPB Vpb
,
2323 IN PEXT2_IRP_CONTEXT IrpContext
,
2325 IN BOOLEAN bForce
);
2328 Ext2PurgeVolume (IN PEXT2_VCB Vcb
,
2329 IN BOOLEAN FlushBeforePurge
);
2332 Ext2PurgeFile (IN PEXT2_FCB Fcb
,
2333 IN BOOLEAN FlushBeforePurge
);
2336 Ext2IsHandleCountZero(IN PEXT2_VCB Vcb
);
2339 Ext2LockVcb (IN PEXT2_VCB Vcb
,
2340 IN PFILE_OBJECT FileObject
);
2343 Ext2LockVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2346 Ext2UnlockVcb (IN PEXT2_VCB Vcb
,
2347 IN PFILE_OBJECT FileObject
);
2350 Ext2UnlockVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2353 Ext2AllowExtendedDasdIo(IN PEXT2_IRP_CONTEXT IrpContext
);
2356 Ext2OplockRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
2359 Ext2QueryExtentMappings(
2360 IN PEXT2_IRP_CONTEXT IrpContext
,
2363 IN PLARGE_INTEGER RequestVbn
,
2364 OUT PLARGE_INTEGER
* pMappedRuns
2368 Ext2QueryRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext
);
2371 Ext2GetRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext
);
2374 Ext2GetRetrievalPointerBase(IN PEXT2_IRP_CONTEXT IrpContext
);
2377 Ext2UserFsRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
2380 Ext2IsMediaWriteProtected (
2381 IN PEXT2_IRP_CONTEXT IrpContext
,
2382 IN PDEVICE_OBJECT TargetDevice
2386 Ext2MountVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2389 Ext2VerifyVcb (IN PEXT2_IRP_CONTEXT IrpContext
,
2392 Ext2VerifyVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2395 Ext2IsVolumeMounted (IN PEXT2_IRP_CONTEXT IrpContext
);
2398 Ext2DismountVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2401 Ext2FileSystemControl (IN PEXT2_IRP_CONTEXT IrpContext
);
2407 struct buffer_head
*ext3_append(struct ext2_icb
*icb
, struct inode
*inode
,
2408 ext3_lblk_t
*block
, int *err
);
2410 void ext3_set_de_type(struct super_block
*sb
,
2411 struct ext3_dir_entry_2
*de
,
2414 __u32
ext3_current_time(struct inode
*in
);
2415 void ext3_warning (struct super_block
* sb
, const char * function
,
2417 #define ext3_error ext3_warning
2418 #define ext4_error ext3_error
2420 void ext3_update_dx_flag(struct inode
*inode
);
2421 int ext3_mark_inode_dirty(struct ext2_icb
*icb
, struct inode
*in
);
2423 void ext3_inc_count(struct inode
*inode
);
2424 void ext3_dec_count(struct inode
*inode
);
2426 struct buffer_head
*
2427 ext3_find_entry (struct ext2_icb
*icb
, struct dentry
*dentry
,
2428 struct ext3_dir_entry_2
** res_dir
);
2429 struct buffer_head
*
2430 ext3_dx_find_entry(struct ext2_icb
*, struct dentry
*dentry
,
2431 struct ext3_dir_entry_2
**res_dir
, int *err
);
2433 typedef int (*filldir_t
)(void *, const char *, int, unsigned long, __u32
, unsigned);
2434 int ext3_dx_readdir(struct file
*filp
, filldir_t filldir
, void * context
);
2436 struct buffer_head
*ext3_bread(struct ext2_icb
*icb
, struct inode
*inode
,
2437 unsigned long block
, int *err
);
2438 int add_dirent_to_buf(struct ext2_icb
*icb
, struct dentry
*dentry
,
2439 struct inode
*inode
, struct ext3_dir_entry_2
*de
,
2440 struct buffer_head
*bh
);
2442 #if !defined(__REACTOS__) || defined(_MSC_VER)
2443 struct ext3_dir_entry_2
*
2444 do_split(struct ext2_icb
*icb
, struct inode
*dir
,
2445 struct buffer_head
**bh
,struct dx_frame
*frame
,
2446 struct dx_hash_info
*hinfo
, int *error
);
2449 int ext3_add_entry(struct ext2_icb
*icb
, struct dentry
*dentry
, struct inode
*inode
);
2451 int ext3_delete_entry(struct ext2_icb
*icb
, struct inode
*dir
,
2452 struct ext3_dir_entry_2
*de_del
,
2453 struct buffer_head
*bh
);
2455 int ext3_is_dir_empty(struct ext2_icb
*icb
, struct inode
*inode
);
2462 Ext2QueryGlobalParameters(IN PUNICODE_STRING RegistryPath
);
2464 Ext2QueryRegistrySettings(IN PUNICODE_STRING RegistryPath
);
2467 DriverUnload (IN PDRIVER_OBJECT DriverObject
);
2475 IN PEXT2_IRP_CONTEXT IrpContext
,
2486 PEXT2_IRP_CONTEXT IrpContext
,
2495 Ext2TruncateIndirect(
2496 PEXT2_IRP_CONTEXT IrpContext
,
2504 // linux.c: linux lib implemenation
2511 ext2_destroy_linux();
2519 Ext2LockControl (IN PEXT2_IRP_CONTEXT IrpContext
);
2528 Ext2McbReaperThread(
2540 Ext2AllocateIrpContext (IN PDEVICE_OBJECT DeviceObject
,
2544 Ext2FreeIrpContext (IN PEXT2_IRP_CONTEXT IrpContext
);
2554 Ext2FreeFcb (IN PEXT2_FCB Fcb
);
2557 Ext2InsertFcb(PEXT2_VCB Vcb
, PEXT2_FCB Fcb
);
2560 Ext2RemoveFcb(PEXT2_VCB Vcb
, PEXT2_FCB Fcb
);
2563 Ext2AllocateCcb (ULONG Flags
, PEXT2_MCB SymLink
);
2572 Ext2FreeCcb (IN PEXT2_VCB Vcb
, IN PEXT2_CCB Ccb
);
2575 Ext2AllocateInode (PEXT2_VCB Vcb
);
2578 Ext2DestroyInode (IN PEXT2_VCB Vcb
, IN PEXT2_INODE inode
);
2580 struct dentry
* Ext2AllocateEntry();
2581 VOID
Ext2FreeEntry (IN
struct dentry
*de
);
2582 struct dentry
*Ext2BuildEntry(PEXT2_VCB Vcb
, PEXT2_MCB Dcb
, PUNICODE_STRING FileName
);
2585 Ext2AllocateExtent();
2588 Ext2FreeExtent (IN PEXT2_EXTENT Extent
);
2591 Ext2CountExtents(IN PEXT2_EXTENT Chain
);
2595 IN PEXT2_EXTENT Chain
,
2596 IN PEXT2_EXTENT Extent
2600 Ext2DestroyExtentChain(IN PEXT2_EXTENT Chain
);
2604 IN PEXT2_IRP_CONTEXT IrpContext
,
2607 IN ULONGLONG Offset
,
2610 OUT PEXT2_EXTENT
* Chain
2614 Ext2ListExtents(PLARGE_MCB Extents
);
2626 Ext2ClearAllExtents(PLARGE_MCB Zone
);
2636 Ext2RemoveVcbExtent (
2643 Ext2LookupVcbExtent (
2647 OUT PLONGLONG Length
2660 Ext2RemoveMcbExtent (
2668 Ext2LookupMcbExtent (
2673 OUT PLONGLONG Length
2677 Ext2AddMcbMetaExts (
2685 Ext2RemoveMcbMetaExts (
2702 Ext2LookupBlockExtent(
2711 Ext2RemoveBlockExtent(
2720 IN PEXT2_IRP_CONTEXT IrpContext
,
2727 IN OUT PUNICODE_STRING Target
,
2728 IN PUNICODE_STRING File
,
2729 IN PUNICODE_STRING Parent
2736 IN PUNICODE_STRING FileName
,
2737 IN PUNICODE_STRING Parent
,
2745 PUNICODE_STRING FileName
2749 Ext2SearchMcbWithoutLock(
2751 PUNICODE_STRING FileName
2774 PEXT2_IRP_CONTEXT IrpContext
,
2775 PEXT2_VCB Vcb
, LONGLONG Block
2779 Ext2CheckBitmapConsistency(
2780 PEXT2_IRP_CONTEXT IrpContext
,
2785 Ext2InsertVcb(PEXT2_VCB Vcb
);
2788 Ext2RemoveVcb(PEXT2_VCB Vcb
);
2791 Ext2InitializeLabel(
2793 IN PEXT2_SUPER_BLOCK Sb
2798 PEXT2_IRP_CONTEXT IrpContext
,
2800 PEXT2_SUPER_BLOCK Ext2Sb
,
2801 PDEVICE_OBJECT TargetDevice
,
2802 PDEVICE_OBJECT VolumeDevice
,
2806 Ext2TearDownStream (IN PEXT2_VCB Vcb
);
2809 Ext2DestroyVcb (IN PEXT2_VCB Vcb
);
2812 Ext2CompleteIrpContext (
2813 IN PEXT2_IRP_CONTEXT IrpContext
,
2814 IN NTSTATUS Status
);
2817 Ext2SyncUninitializeCacheMap (
2818 IN PFILE_OBJECT FileObject
);
2821 Ext2LinkTailMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2825 Ext2LinkHeadMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2828 Ext2UnlinkMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2843 Ext2StartReaper(PEXT2_REAPER
, EXT2_REAPER_RELEASE
);
2846 Ext2StopReaper(PEXT2_REAPER Reaper
);
2853 Ext2Log2(ULONG Value
);
2856 Ext2NtTime (IN ULONG i_time
);
2859 Ext2LinuxTime (IN LARGE_INTEGER SysTime
);
2862 Ext2OEMToUnicodeSize(
2870 IN OUT PUNICODE_STRING Oem
,
2871 IN POEM_STRING Unicode
2875 Ext2UnicodeToOEMSize(
2877 IN PUNICODE_STRING Unicode
2883 IN OUT POEM_STRING Oem
,
2884 IN PUNICODE_STRING Unicode
2888 Ext2Sleep(ULONG ms
);
2890 int Ext2LinuxError (NTSTATUS Status
);
2891 NTSTATUS
Ext2WinntError(int rc
);
2893 BOOLEAN
Ext2IsDot(PUNICODE_STRING name
);
2894 BOOLEAN
Ext2IsDotDot(PUNICODE_STRING name
);
2910 Ext2Pnp(IN PEXT2_IRP_CONTEXT IrpContext
);
2914 PEXT2_IRP_CONTEXT IrpContext
,
2919 PEXT2_IRP_CONTEXT IrpContext
,
2923 Ext2PnpCancelRemove(
2924 PEXT2_IRP_CONTEXT IrpContext
,
2928 Ext2PnpSurpriseRemove(
2929 PEXT2_IRP_CONTEXT IrpContext
,
2939 IN PEXT2_IRP_CONTEXT IrpContext
,
2942 IN ULONGLONG Offset
,
2945 IN BOOLEAN bDirectIo
,
2950 Ext2Read (IN PEXT2_IRP_CONTEXT IrpContext
);
2958 Ext2LoadInternalJournal(
2971 PEXT2_IRP_CONTEXT IrpContext
,
2981 Ext2ShutDown (IN PEXT2_IRP_CONTEXT IrpContext
);
2989 Ext2QueryVolumeInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2992 Ext2SetVolumeInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2998 typedef struct _EXT2_RW_CONTEXT
{
3003 PERESOURCE Resource
;
3004 ERESOURCE_THREAD ThreadId
;
3005 PFILE_OBJECT FileObject
;
3009 } EXT2_RW_CONTEXT
, *PEXT2_RW_CONTEXT
;
3011 #define EXT2_RW_CONTEXT_WRITE 1
3015 IN PEXT2_IRP_CONTEXT IrpContext
,
3018 IN ULONGLONG Offset
,
3021 IN BOOLEAN bDirectIo
,
3027 Ext2StartFloppyFlushDpc (
3030 PFILE_OBJECT FileObject
);
3034 IN PEXT2_IRP_CONTEXT IrpContext
,
3036 IN PFILE_OBJECT FileObject
,
3037 IN PLARGE_INTEGER Start
,
3038 IN PLARGE_INTEGER End
);
3041 Ext2Write (IN PEXT2_IRP_CONTEXT IrpContext
);
3043 #endif /* _EXT2_HEADER_ */