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.69"
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
{
497 EXT2_REAPER_RELEASE Free
;
499 } EXT2_REAPER
, *PEXT2_REAPER
;
501 #define EXT2_REAPER_FLAG_STOP (1 << 0)
503 typedef struct _EXT2_GLOBAL
{
505 /* Identifier for this structure */
506 EXT2_IDENTIFIER Identifier
;
508 /* Syncronization primitive for this structure */
511 /* Global flags for the driver: I put it since
512 FastIoDispatch isn't 8bytes aligned. */
515 /* Table of pointers to the fast I/O entry points */
516 FAST_IO_DISPATCH FastIoDispatch
;
518 /* Filter callbacks */
519 FS_FILTER_CALLBACKS FilterCallbacks
;
521 /* Table of pointers to the Cache Manager callbacks */
522 CACHE_MANAGER_CALLBACKS CacheManagerCallbacks
;
523 CACHE_MANAGER_CALLBACKS CacheManagerNoOpCallbacks
;
525 /* Pointer to the driver object */
526 PDRIVER_OBJECT DriverObject
;
528 /* Pointer to the disk device object */
529 PDEVICE_OBJECT DiskdevObject
;
531 /* Pointer to the cdrom device object */
532 PDEVICE_OBJECT CdromdevObject
;
534 /* List of mounted volumes */
537 /* Cleaning thread related: resource cleaner */
538 EXT2_REAPER FcbReaper
;
539 EXT2_REAPER McbReaper
;
540 EXT2_REAPER bhReaper
;
542 /* Look Aside table of IRP_CONTEXT, FCB, MCB, CCB */
543 NPAGED_LOOKASIDE_LIST Ext2IrpContextLookasideList
;
544 NPAGED_LOOKASIDE_LIST Ext2FcbLookasideList
;
545 NPAGED_LOOKASIDE_LIST Ext2CcbLookasideList
;
546 NPAGED_LOOKASIDE_LIST Ext2McbLookasideList
;
547 NPAGED_LOOKASIDE_LIST Ext2ExtLookasideList
;
548 NPAGED_LOOKASIDE_LIST Ext2DentryLookasideList
;
551 /* User specified global codepage name */
553 WCHAR PageName
[CODEPAGE_MAXLEN
];
554 UCHAR AnsiName
[CODEPAGE_MAXLEN
];
555 struct nls_table
* PageTable
;
558 /* global hiding patterns */
559 WCHAR wHidingPrefix
[HIDINGPAT_LEN
];
560 WCHAR wHidingSuffix
[HIDINGPAT_LEN
];
561 BOOLEAN bHidingPrefix
;
562 CHAR sHidingPrefix
[HIDINGPAT_LEN
];
563 BOOLEAN bHidingSuffix
;
564 CHAR sHidingSuffix
[HIDINGPAT_LEN
];
567 UNICODE_STRING RegistryPath
;
569 /* global memory and i/o statistics and memory allocations
570 of various sturctures */
572 EXT2_PERF_STATISTICS_V2 PerfStat
;
574 } EXT2_GLOBAL
, *PEXT2_GLOBAL
;
577 // Flags for EXT2_GLOBAL_DATA
580 #define EXT2_UNLOAD_PENDING 0x00000001
581 #define EXT2_SUPPORT_WRITING 0x00000002
582 #define EXT3_FORCE_WRITING 0x00000004
583 #define EXT2_CHECKING_BITMAP 0x00000008
584 #define EXT2_AUTO_MOUNT 0x00000010
587 // Glboal Ext2Fsd Memory Block
590 extern PEXT2_GLOBAL Ext2Global
;
593 // memory allocation statistics
597 #define INC_MEM_COUNT(_i, _p, _s) do { ASSERT(_p); Ext2TraceMemory(TRUE, (int) (_i), (PVOID)(_p), (LONG)(_s)); } while(0)
598 #define DEC_MEM_COUNT(_i, _p, _s) do { ASSERT(_p); Ext2TraceMemory(FALSE, (int) (_i), (PVOID)(_p), (LONG)(_s)); } while(0)
599 #define INC_IRP_COUNT(IrpContext) Ext2TraceIrpContext(TRUE, (IrpContext))
600 #define DEC_IRP_COUNT(IrpContext) Ext2TraceIrpContext(FALSE, (IrpContext))
603 // Driver Extension define
606 #define IsExt2FsDevice(DO) ((DO == Ext2Global->DiskdevObject) || \
607 (DO == Ext2Global->CdromdevObject) )
609 #ifdef _WIN2K_TARGET_
610 #define FSRTL_ADVANCED_FCB_HEADER FSRTL_COMMON_FCB_HEADER
613 typedef struct _EXT2_FCBVCB
{
615 // Command header for Vcb and Fcb
616 FSRTL_ADVANCED_FCB_HEADER Header
;
618 #ifndef _WIN2K_TARGET_
622 // Ext2Fsd identifier
623 EXT2_IDENTIFIER Identifier
;
627 ERESOURCE MainResource
;
628 ERESOURCE PagingIoResource
;
630 } EXT2_FCBVCB
, *PEXT2_FCBVCB
;
633 // EXT2_VCB Volume Control Block
635 // Data that represents a mounted logical volume
636 // It is allocated as the device extension of the volume device object
638 typedef struct _EXT2_VCB
{
643 // Resource for metadata (inode)
646 // Resource for metadata (block)
649 // Resource for Mcb (Meta data control block)
652 // List of FCBs for open files on this volume
661 // Entry of Mcb Tree (Root Node)
664 // Link list to Global
668 SECTION_OBJECT_POINTERS SectionObject
;
670 // Dirty Mcbs of modifications for volume stream
674 // Share Access for the file object
675 SHARE_ACCESS ShareAccess
;
677 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
678 // for both files on this volume and open instances of the
680 ULONG ReferenceCount
; /* total ref count */
681 ULONG OpenHandleCount
; /* all handles */
683 ULONG OpenVolumeCount
; /* volume handle */
688 // Pointer to the VPB in the target device object
692 // The FileObject of Volume used to lock the volume
693 PFILE_OBJECT LockFile
;
695 // List of IRPs pending on directory change notify requests
696 LIST_ENTRY NotifyList
;
698 // Pointer to syncronization primitive for this list
699 PNOTIFY_SYNC NotifySync
;
701 // This volumes device object
702 PDEVICE_OBJECT DeviceObject
;
704 // The physical device object (the disk)
705 PDEVICE_OBJECT TargetDeviceObject
;
707 // The physical device object (the disk)
708 PDEVICE_OBJECT RealDevice
;
710 // Information about the physical device object
711 DISK_GEOMETRY DiskGeometry
;
712 PARTITION_INFORMATION PartitionInformation
;
715 PEXT2_SUPER_BLOCK SuperBlock
;
717 // Block / Cluster size
720 // Sector size in bits
723 // Minimal i/o size: min(PageSize, BlockSize)
724 ULONGLONG IoUnitSize
;
726 // Bits of aligned size
732 // Inode lookaside list
733 NPAGED_LOOKASIDE_LIST InodeLookasideList
;
735 // Flags for the volume
738 // Streaming File Object
741 // User specified codepage name per volume
743 UCHAR AnsiName
[CODEPAGE_MAXLEN
];
744 struct nls_table
* PageTable
;
747 /* patterns to hiding files */
748 BOOLEAN bHidingPrefix
;
749 CHAR sHidingPrefix
[HIDINGPAT_LEN
];
750 BOOLEAN bHidingSuffix
;
751 CHAR sHidingSuffix
[HIDINGPAT_LEN
];
753 /* User to impersanate */
761 /* mountpoint: symlink to DesDevices */
764 struct block_device bd
;
765 struct super_block sb
;
766 struct ext3_sb_info sbi
;
768 /* Maximum file size in blocks ... */
769 ULONG max_blocks_per_layer
[EXT2_BLOCK_TYPES
];
770 ULONG max_data_blocks
;
771 loff_t max_bitmap_bytes
;
773 } EXT2_VCB
, *PEXT2_VCB
;
776 // Flags for EXT2_VCB
778 #define VCB_INITIALIZED 0x00000001
779 #define VCB_VOLUME_LOCKED 0x00000002
780 #define VCB_MOUNTED 0x00000004
781 #define VCB_DISMOUNT_PENDING 0x00000008
782 #define VCB_NEW_VPB 0x00000010
783 #define VCB_BEING_CLOSED 0x00000020
784 #define VCB_USER_IDS 0x00000040 /* uid/gid specified by user */
785 #define VCB_USER_EIDS 0x00000080 /* euid/egid specified by user */
786 #define VCB_GD_LOADED 0x00000100 /* group desc loaded */
788 #define VCB_BEING_DROPPED 0x00002000
789 #define VCB_FORCE_WRITING 0x00004000
790 #define VCB_DEVICE_REMOVED 0x00008000
791 #define VCB_JOURNAL_RECOVER 0x00080000
792 #define VCB_ARRIVAL_NOTIFIED 0x00800000
793 #define VCB_RO_COMPAT_READ_ONLY 0x01000000
794 #define VCB_READ_ONLY 0x08000000
795 #define VCB_WRITE_PROTECTED 0x10000000
796 #define VCB_FLOPPY_DISK 0x20000000
797 #define VCB_REMOVAL_PREVENTED 0x40000000
798 #define VCB_REMOVABLE_MEDIA 0x80000000
801 #define IsVcbInited(Vcb) (IsFlagOn((Vcb)->Flags, VCB_INITIALIZED))
802 #define IsMounted(Vcb) (IsFlagOn((Vcb)->Flags, VCB_MOUNTED))
803 #define IsDispending(Vcb) (IsFlagOn((Vcb)->Flags, VCB_DISMOUNT_PENDING))
804 #define IsVcbReadOnly(Vcb) (IsFlagOn((Vcb)->Flags, VCB_READ_ONLY) || \
805 IsFlagOn((Vcb)->Flags, VCB_RO_COMPAT_READ_ONLY) || \
806 IsFlagOn((Vcb)->Flags, VCB_WRITE_PROTECTED))
809 #define IsExt3ForceWrite() (IsFlagOn(Ext2Global->Flags, EXT3_FORCE_WRITING))
810 #define IsVcbForceWrite(Vcb) (IsFlagOn((Vcb)->Flags, VCB_FORCE_WRITING))
811 #define CanIWrite(Vcb) (IsExt3ForceWrite() || (!IsVcbReadOnly(Vcb) && IsVcbForceWrite(Vcb)))
812 #define IsLazyWriter(Fcb) ((Fcb)->LazyWriterThread == PsGetCurrentThread())
814 // EXT2_FCB File Control Block
816 // Data that represents an open file
817 // There is a single instance of the FCB for every open file
819 typedef struct _EXT2_FCB
{
824 // List of FCBs for this volume
826 LARGE_INTEGER TsDrop
; /* drop time */
828 SECTION_OBJECT_POINTERS SectionObject
;
830 // Share Access for the file object
831 SHARE_ACCESS ShareAccess
;
833 // List of byte-range locks for this file
834 FILE_LOCK FileLockAnchor
;
836 // oplock information management structure
839 // Lazy writer thread context
840 PETHREAD LazyWriterThread
;
842 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
843 ULONG OpenHandleCount
;
845 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
846 ULONG ReferenceCount
;
848 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
849 // But only for Files with FO_NO_INTERMEDIATE_BUFFERING flag
850 ULONG NonCachedOpenCount
;
855 // Pointer to the inode
864 } EXT2_FCB
, *PEXT2_FCB
;
867 // Flags for EXT2_FCB
870 #define FCB_FROM_POOL 0x00000001
871 #define FCB_PAGE_FILE 0x00000002
872 #define FCB_FILE_MODIFIED 0x00000020
874 #define FCB_ALLOC_IN_CREATE 0x00000080
875 #define FCB_ALLOC_IN_WRITE 0x00000100
876 #define FCB_ALLOC_IN_SETINFO 0x00000200
878 #define FCB_DELETE_PENDING 0x80000000
886 // Identifier for this structure
887 EXT2_IDENTIFIER Identifier
;
893 PEXT2_MCB Parent
; // Parent
894 PEXT2_MCB Next
; // Siblings
897 PEXT2_MCB Child
; // Children Mcb nodes
898 PEXT2_MCB Target
; // Target Mcb of symlink
907 UNICODE_STRING ShortName
;
909 // Full name with path
910 UNICODE_STRING FullName
;
925 LARGE_INTEGER CreationTime
;
926 LARGE_INTEGER LastWriteTime
;
927 LARGE_INTEGER ChangeTime
;
928 LARGE_INTEGER LastAccessTime
;
930 // List Link to Vcb->McbList
942 #define MCB_FROM_POOL 0x00000001
943 #define MCB_VCB_LINK 0x00000002
944 #define MCB_ENTRY_TREE 0x00000004
945 #define MCB_FILE_DELETED 0x00000008
947 #define MCB_ZONE_INITED 0x20000000
948 #define MCB_TYPE_SPECIAL 0x40000000 /* unresolved symlink + device node */
949 #define MCB_TYPE_SYMLINK 0x80000000
951 #define IsMcbUsed(Mcb) ((Mcb)->Refercount > 0)
952 #define IsMcbSymLink(Mcb) IsFlagOn((Mcb)->Flags, MCB_TYPE_SYMLINK)
953 #define IsZoneInited(Mcb) IsFlagOn((Mcb)->Flags, MCB_ZONE_INITED)
954 #define IsMcbSpecialFile(Mcb) IsFlagOn((Mcb)->Flags, MCB_TYPE_SPECIAL)
955 #define IsMcbRoot(Mcb) ((Mcb)->Inode.i_ino == EXT2_ROOT_INO)
956 #define IsMcbReadonly(Mcb) IsFlagOn((Mcb)->FileAttr, FILE_ATTRIBUTE_READONLY)
957 #define IsMcbDirectory(Mcb) IsFlagOn((Mcb)->FileAttr, FILE_ATTRIBUTE_DIRECTORY)
958 #define IsFileDeleted(Mcb) IsFlagOn((Mcb)->Flags, MCB_FILE_DELETED)
960 #define IsLinkInvalid(Mcb) (IsMcbSymLink(Mcb) && IsFileDeleted(Mcb->Target))
963 * routines for reference count management
966 #define Ext2ReferXcb(_C) InterlockedIncrement(_C)
967 #define Ext2DerefXcb(_C) DEC_OBJ_CNT(_C)
972 __inline ULONG
DEC_OBJ_CNT(PULONG _C
) {
976 return InterlockedDecrement(_C
);
981 Ext2TraceMcb(PCHAR fn
, USHORT lc
, USHORT add
, PEXT2_MCB Mcb
);
982 #define Ext2ReferMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, TRUE, Mcb)
983 #define Ext2DerefMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, FALSE, Mcb)
985 #define Ext2ReferMcb(Mcb) Ext2ReferXcb(&Mcb->Refercount)
986 #define Ext2DerefMcb(Mcb) Ext2DerefXcb(&Mcb->Refercount)
990 // EXT2_CCB Context Control Block
992 // Data that represents one instance of an open file
993 // There is one instance of the CCB for every instance of an open file
995 typedef struct _EXT2_CCB
{
997 // Identifier for this structure
998 EXT2_IDENTIFIER Identifier
;
1003 // Mcb of it's symbol link
1006 // State that may need to be maintained
1007 UNICODE_STRING DirectorySearchPattern
;
1009 /* Open handle control block */
1012 /* The EA index we are on */
1015 } EXT2_CCB
, *PEXT2_CCB
;
1021 #define CCB_FROM_POOL 0x00000001
1022 #define CCB_VOLUME_DASD_PURGE 0x00000002
1023 #define CCB_LAST_WRITE_UPDATED 0x00000004
1024 #define CCB_OPEN_REPARSE_POINT 0x00000008
1025 #define CCB_DELETE_ON_CLOSE 0x00000010
1027 #define CCB_ALLOW_EXTENDED_DASD_IO 0x80000000
1032 // Used to pass information about a request between the drivers functions
1034 typedef struct ext2_icb
{
1036 // Identifier for this structure
1037 EXT2_IDENTIFIER Identifier
;
1039 // Pointer to the IRP this request describes
1045 // The major and minor function code for the request
1046 UCHAR MajorFunction
;
1047 UCHAR MinorFunction
;
1049 // The device object
1050 PDEVICE_OBJECT DeviceObject
;
1052 // The real device object
1053 PDEVICE_OBJECT RealDevice
;
1056 PFILE_OBJECT FileObject
;
1061 // If the request is top level
1064 // Used if the request needs to be queued for later processing
1065 WORK_QUEUE_ITEM WorkQueueItem
;
1067 // If an exception is currently in progress
1068 BOOLEAN ExceptionInProgress
;
1070 // The exception code when an exception is in progress
1071 NTSTATUS ExceptionCode
;
1073 } EXT2_IRP_CONTEXT
, *PEXT2_IRP_CONTEXT
;
1076 #define IRP_CONTEXT_FLAG_FROM_POOL (0x00000001)
1077 #define IRP_CONTEXT_FLAG_WAIT (0x00000002)
1078 #define IRP_CONTEXT_FLAG_WRITE_THROUGH (0x00000004)
1079 #define IRP_CONTEXT_FLAG_FLOPPY (0x00000008)
1080 #define IRP_CONTEXT_FLAG_DISABLE_POPUPS (0x00000020)
1081 #define IRP_CONTEXT_FLAG_DEFERRED (0x00000040)
1082 #define IRP_CONTEXT_FLAG_VERIFY_READ (0x00000080)
1083 #define IRP_CONTEXT_STACK_IO_CONTEXT (0x00000100)
1084 #define IRP_CONTEXT_FLAG_REQUEUED (0x00000200)
1085 #define IRP_CONTEXT_FLAG_USER_IO (0x00000400)
1086 #define IRP_CONTEXT_FLAG_DELAY_CLOSE (0x00000800)
1087 #define IRP_CONTEXT_FLAG_FILE_BUSY (0x00001000)
1090 #define Ext2CanIWait() (!IrpContext || IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT))
1093 // EXT2_ALLOC_HEADER
1095 // In the checked version of the driver this header is put in the beginning of
1096 // every memory allocation
1098 typedef struct _EXT2_ALLOC_HEADER
{
1099 EXT2_IDENTIFIER Identifier
;
1100 } EXT2_ALLOC_HEADER
, *PEXT2_ALLOC_HEADER
;
1102 typedef struct _FCB_LIST_ENTRY
{
1105 } FCB_LIST_ENTRY
, *PFCB_LIST_ENTRY
;
1108 // Block Description List
1109 typedef struct _EXT2_EXTENT
{
1114 struct _EXT2_EXTENT
* Next
;
1115 } EXT2_EXTENT
, *PEXT2_EXTENT
;
1118 /* FUNCTIONS DECLARATION *****************************************************/
1120 // Include this so we don't need the latest WDK to build the driver.
1121 #ifndef FSCTL_GET_RETRIEVAL_POINTER_BASE
1122 #define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS) // RETRIEVAL_POINTER_BASE
1125 #ifndef FILE_SUPPORTS_EXTENDED_ATTRIBUTES
1126 #define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
1130 // The following macro is used to determine if an FSD thread can block
1131 // for I/O or wait for a resource. It returns TRUE if the thread can
1132 // block and FALSE otherwise. This attribute can then be used to call
1133 // the FSD & FSP common work routine with the proper wait value.
1136 #define CanExt2Wait(IRP) IoIsOperationSynchronous(Irp)
1139 // memory allocation statistics
1147 Ext2TraceMemory(BOOLEAN _n
, int _i
, PVOID _p
, LONG _s
)
1150 InterlockedIncrement(&Ext2Global
->PerfStat
.Current
.Slot
[_i
]);
1151 InterlockedIncrement(&Ext2Global
->PerfStat
.Total
.Slot
[_i
]);
1152 InterlockedExchangeAdd(&Ext2Global
->PerfStat
.Size
.Slot
[_i
], _s
);
1154 InterlockedDecrement(&Ext2Global
->PerfStat
.Current
.Slot
[_i
]);
1155 InterlockedExchangeAdd(&Ext2Global
->PerfStat
.Size
.Slot
[_i
], -1 * _s
);
1164 Ext2TraceIrpContext(BOOLEAN _n
, PEXT2_IRP_CONTEXT IrpContext
)
1167 INC_MEM_COUNT(PS_IRP_CONTEXT
, IrpContext
, sizeof(EXT2_IRP_CONTEXT
));
1168 InterlockedIncrement(&(Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Current
));
1170 DEC_MEM_COUNT(PS_IRP_CONTEXT
, IrpContext
, sizeof(EXT2_IRP_CONTEXT
));
1171 InterlockedIncrement(&Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Processed
);
1172 InterlockedDecrement(&Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Current
);
1176 typedef struct _EXT2_FILLDIR_CONTEXT
{
1177 PEXT2_IRP_CONTEXT efc_irp
;
1182 NTSTATUS efc_status
;
1183 FILE_INFORMATION_CLASS efc_fi
;
1185 } EXT2_FILLDIR_CONTEXT
, *PEXT2_FILLDIR_CONTEXT
;
1192 int Ext2CheckInodeAccess(PEXT2_VCB Vcb
, struct inode
*in
, int attempt
);
1193 int Ext2CheckFileAccess (PEXT2_VCB Vcb
, PEXT2_MCB Mcb
, int attempt
);
1203 IN LOCK_OPERATION Operation
1207 Ext2DestroyMdl (IN PMDL Mdl
);
1210 Ext2LockUserBuffer (
1213 IN LOCK_OPERATION Operation
);
1215 Ext2GetUserBuffer (IN PIRP Irp
);
1219 Ext2ReadWriteBlocks(
1220 IN PEXT2_IRP_CONTEXT IrpContext
,
1222 IN PEXT2_EXTENT Extent
,
1229 IN ULONGLONG Offset
,
1232 IN BOOLEAN bVerify
);
1237 IN ULONGLONG Offset
,
1240 IN BOOLEAN bVerify
);
1244 IN PDEVICE_OBJECT DeviceOjbect
,
1246 IN PVOID InputBuffer
,
1247 IN ULONG InputBufferSize
,
1248 IN OUT PVOID OutputBuffer
,
1249 IN OUT PULONG OutputBufferSize
);
1252 Ext2MediaEjectControl (
1253 IN PEXT2_IRP_CONTEXT IrpContext
,
1255 IN BOOLEAN bPrevent
);
1258 Ext2DiskShutDown(PEXT2_VCB Vcb
);
1266 Ext2Cleanup (IN PEXT2_IRP_CONTEXT IrpContext
);
1273 Ext2Close (IN PEXT2_IRP_CONTEXT IrpContext
);
1276 Ext2QueueCloseRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1279 Ext2DeQueueCloseRequest (IN PVOID Context
);
1286 Ext2AcquireForLazyWrite (
1290 Ext2ReleaseFromLazyWrite (IN PVOID Context
);
1293 Ext2AcquireForReadAhead (
1298 Ext2ReleaseFromReadAhead (IN PVOID Context
);
1306 Ext2NoOpRelease (IN PVOID Fcb
);
1314 Ext2IsNameValid(PUNICODE_STRING FileName
);
1318 IN PEXT2_IRP_CONTEXT IrpContext
,
1320 IN PEXT2_MCB Parent
,
1327 IN PEXT2_IRP_CONTEXT IrpContext
,
1329 IN PEXT2_MCB Parent
,
1330 IN PUNICODE_STRING FileName
,
1332 struct dentry
**dentry
1336 Ext2IsSpecialSystemFile(
1337 IN PUNICODE_STRING FileName
,
1338 IN BOOLEAN bDirectory
1341 #define EXT2_LOOKUP_FLAG_MASK (0xFF00000)
1342 #define EXT2_LOOKUP_NOT_FOLLOW (0x8000000)
1346 IN PEXT2_IRP_CONTEXT IrpContext
,
1348 IN PUNICODE_STRING FullName
,
1349 IN PEXT2_MCB Parent
,
1350 OUT PEXT2_MCB
* Ext2Mcb
,
1356 IN PEXT2_IRP_CONTEXT IrpContext
,
1358 OUT PBOOLEAN OpPostIrp
1363 IN PEXT2_IRP_CONTEXT IrpContext
,
1367 Ext2Create (IN PEXT2_IRP_CONTEXT IrpContext
);
1371 IN PEXT2_IRP_CONTEXT IrpContext
,
1373 IN PEXT2_FCB pParentFcb
,
1376 IN PUNICODE_STRING FileName
);
1380 Ext2SupersedeOrOverWriteFile(
1381 IN PEXT2_IRP_CONTEXT IrpContext
,
1382 IN PFILE_OBJECT FileObject
,
1385 IN PLARGE_INTEGER AllocationSize
,
1386 IN ULONG Disposition
1395 #define DL_VIT 0x00000001
1396 #define DL_ERR 0x00000002
1397 #define DL_DBG 0x00000004
1398 #define DL_INF 0x00000008
1399 #define DL_FUN 0x00000010
1400 #define DL_LOW 0x00000020
1401 #define DL_REN 0x00000040 /* renaming operation */
1402 #define DL_RES 0x00000080 /* entry reference managment */
1403 #define DL_BLK 0x00000100 /* data block allocation / free */
1404 #define DL_CP 0x00000200 /* code pages (create, querydir) */
1405 #define DL_EXT 0x00000400 /* mcb extents */
1406 #define DL_MAP 0x00000800 /* retrieval points */
1407 #define DL_JNL 0x00001000 /* dump journal operations */
1408 #define DL_HTI 0x00002000 /* htree index */
1409 #define DL_WRN 0x00004000 /* warning */
1410 #define DL_BH 0x00008000 /* buffer head */
1411 #define DL_PNP 0x00010000 /* pnp */
1412 #define DL_IO 0x00020000 /* file i/o */
1414 #define DL_DEFAULT (DL_ERR|DL_VIT)
1417 extern ULONG DebugFilter
;
1426 #define DEBUG(_DL, arg) do {if ((_DL) & DebugFilter) Ext2Printf arg;} while(0)
1427 #define DEBUGNI(_DL, arg) do {if ((_DL) & DebugFilter) Ext2NiPrintf arg;} while(0)
1429 #define Ext2CompleteRequest(Irp, bPrint, PriorityBoost) \
1430 Ext2DbgPrintComplete(Irp, bPrint); \
1431 IoCompleteRequest(Irp, PriorityBoost)
1435 #define DEBUG(_DL, arg) do {if ((_DL) & DL_ERR) DbgPrint arg;} while(0)
1437 #define Ext2CompleteRequest(Irp, bPrint, PriorityBoost) \
1438 IoCompleteRequest(Irp, PriorityBoost)
1440 #endif // EXT2_DEBUG
1449 extern ULONG ProcessNameOffset
;
1451 #define Ext2GetCurrentProcessName() ( \
1452 (PUCHAR) PsGetCurrentProcess() + ProcessNameOffset \
1456 Ext2GetProcessNameOffset (VOID
);
1460 IN PDEVICE_OBJECT DeviceObject
,
1464 Ext2DbgPrintComplete (
1470 Ext2NtStatusToString (IN NTSTATUS Status
);
1472 PVOID
Ext2AllocatePool(
1473 IN POOL_TYPE PoolType
,
1474 IN SIZE_T NumberOfBytes
,
1489 Ext2ProcessGlobalProperty(
1490 IN PDEVICE_OBJECT DeviceObject
,
1491 IN PEXT2_VOLUME_PROPERTY3 Property
,
1496 Ext2ProcessVolumeProperty(
1498 IN PEXT2_VOLUME_PROPERTY3 Property
,
1503 Ext2ProcessUserProperty(
1504 IN PEXT2_IRP_CONTEXT IrpContext
,
1505 IN PEXT2_VOLUME_PROPERTY3 Property
,
1510 Ex2ProcessUserPerfStat(
1511 IN PEXT2_IRP_CONTEXT IrpContext
,
1512 IN PEXT2_QUERY_PERFSTAT QueryPerf
,
1517 Ex2ProcessMountPoint(
1518 IN PEXT2_IRP_CONTEXT IrpContext
,
1519 IN PEXT2_MOUNT_POINT MountPoint
,
1524 Ext2DeviceControlNormal (IN PEXT2_IRP_CONTEXT IrpContext
);
1527 Ext2PrepareToUnload (IN PEXT2_IRP_CONTEXT IrpContext
);
1530 Ext2DeviceControl (IN PEXT2_IRP_CONTEXT IrpContext
);
1537 Ext2GetInfoLength(IN FILE_INFORMATION_CLASS FileInformationClass
);
1541 IN PEXT2_IRP_CONTEXT IrpContext
,
1544 IN FILE_INFORMATION_CLASS FileInformationClass
,
1547 IN ULONG UsedLength
,
1550 IN PUNICODE_STRING pName
,
1551 OUT PULONG EntrySize
,
1558 IN POEM_STRING OeName
1561 NTSTATUS
Ext2QueryDirectory (IN PEXT2_IRP_CONTEXT IrpContext
);
1564 Ext2NotifyChangeDirectory (
1565 IN PEXT2_IRP_CONTEXT IrpContext
1569 Ext2NotifyReportChange (
1570 IN PEXT2_IRP_CONTEXT IrpContext
,
1578 Ext2DirectoryControl (IN PEXT2_IRP_CONTEXT IrpContext
);
1581 Ext2IsDirectoryEmpty (
1582 IN PEXT2_IRP_CONTEXT IrpContext
,
1592 Ext2OplockComplete (
1604 Ext2QueueRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1607 Ext2DeQueueRequest (IN PVOID Context
);
1610 Ext2DispatchRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1614 IN PDEVICE_OBJECT DeviceObject
,
1624 IN PEXT2_IRP_CONTEXT IrpContext
1634 IN PEXT2_IRP_CONTEXT IrpContext
1643 Ext2ExceptionFilter (
1644 IN PEXT2_IRP_CONTEXT IrpContext
,
1645 IN PEXCEPTION_POINTERS ExceptionPointer
1649 Ext2ExceptionHandler (IN PEXT2_IRP_CONTEXT IrpContext
);
1659 IN PEXT2_IRP_CONTEXT IrpContext
,
1670 PEXT2_IRP_CONTEXT IrpContext
,
1680 PEXT2_IRP_CONTEXT IrpContext
,
1691 static inline ext3_fsblk_t
ext3_blocks_count(struct ext3_super_block
*es
)
1693 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_blocks_count_hi
) << 32) |
1694 le32_to_cpu(es
->s_blocks_count
);
1697 static inline ext3_fsblk_t
ext3_r_blocks_count(struct ext3_super_block
*es
)
1699 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_r_blocks_count_hi
) << 32) |
1700 le32_to_cpu(es
->s_r_blocks_count
);
1703 static inline ext3_fsblk_t
ext3_free_blocks_count(struct ext3_super_block
*es
)
1705 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_free_blocks_count_hi
) << 32) |
1706 le32_to_cpu(es
->s_free_blocks_count
);
1709 static inline void ext3_blocks_count_set(struct ext3_super_block
*es
,
1712 es
->s_blocks_count
= cpu_to_le32((u32
)blk
);
1713 es
->s_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1716 static inline void ext3_free_blocks_count_set(struct ext3_super_block
*es
,
1719 es
->s_free_blocks_count
= cpu_to_le32((u32
)blk
);
1720 es
->s_free_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1723 static inline void ext3_r_blocks_count_set(struct ext3_super_block
*es
,
1726 es
->s_r_blocks_count
= cpu_to_le32((u32
)blk
);
1727 es
->s_r_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1730 blkcnt_t
ext3_inode_blocks(struct ext3_inode
*raw_inode
,
1731 struct inode
*inode
);
1733 int ext3_inode_blocks_set(struct ext3_inode
*raw_inode
,
1734 struct inode
* inode
);
1735 ext4_fsblk_t
ext4_block_bitmap(struct super_block
*sb
,
1736 struct ext4_group_desc
*bg
);
1738 ext4_fsblk_t
ext4_inode_bitmap(struct super_block
*sb
,
1739 struct ext4_group_desc
*bg
);
1740 ext4_fsblk_t
ext4_inode_table(struct super_block
*sb
,
1741 struct ext4_group_desc
*bg
);
1742 __u32
ext4_free_blks_count(struct super_block
*sb
,
1743 struct ext4_group_desc
*bg
);
1744 __u32
ext4_free_inodes_count(struct super_block
*sb
,
1745 struct ext4_group_desc
*bg
);
1746 __u32
ext4_used_dirs_count(struct super_block
*sb
,
1747 struct ext4_group_desc
*bg
);
1748 __u32
ext4_itable_unused_count(struct super_block
*sb
,
1749 struct ext4_group_desc
*bg
);
1750 void ext4_block_bitmap_set(struct super_block
*sb
,
1751 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1752 void ext4_inode_bitmap_set(struct super_block
*sb
,
1753 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1754 void ext4_inode_table_set(struct super_block
*sb
,
1755 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1756 void ext4_free_blks_set(struct super_block
*sb
,
1757 struct ext4_group_desc
*bg
, __u32 count
);
1758 void ext4_free_inodes_set(struct super_block
*sb
,
1759 struct ext4_group_desc
*bg
, __u32 count
);
1760 void ext4_used_dirs_set(struct super_block
*sb
,
1761 struct ext4_group_desc
*bg
, __u32 count
);
1762 void ext4_itable_unused_set(struct super_block
*sb
,
1763 struct ext4_group_desc
*bg
, __u32 count
);
1765 int ext3_bg_has_super(struct super_block
*sb
, ext3_group_t group
);
1766 unsigned long ext4_bg_num_gdb(struct super_block
*sb
, ext4_group_t group
);
1767 unsigned ext4_init_inode_bitmap(struct super_block
*sb
, struct buffer_head
*bh
,
1768 ext4_group_t block_group
,
1769 struct ext4_group_desc
*gdp
);
1770 unsigned ext4_init_block_bitmap(struct super_block
*sb
, struct buffer_head
*bh
,
1771 ext4_group_t block_group
, struct ext4_group_desc
*gdp
);
1772 struct ext4_group_desc
* ext4_get_group_desc(struct super_block
*sb
,
1773 ext4_group_t block_group
, struct buffer_head
**bh
);
1774 ext4_fsblk_t
ext4_count_free_blocks(struct super_block
*sb
);
1775 unsigned long ext4_count_free_inodes(struct super_block
*sb
);
1776 int ext4_check_descriptors(struct super_block
*sb
);
1782 OUT PEXT2_SUPER_BLOCK
* Sb
1788 IN PEXT2_IRP_CONTEXT IrpContext
,
1794 IN PEXT2_IRP_CONTEXT IrpContext
,
1799 Ext2LoadGroupBH(IN PEXT2_VCB Vcb
);
1802 Ext2LoadGroup(IN PEXT2_VCB Vcb
);
1805 Ext2DropGroupBH(IN PEXT2_VCB Vcb
);
1808 Ext2PutGroup(IN PEXT2_VCB Vcb
);
1811 Ext2DropBH(IN PEXT2_VCB Vcb
);
1814 Ext2FlushVcb(IN PEXT2_VCB Vcb
);
1818 IN PEXT2_IRP_CONTEXT IrpContext
,
1825 IN PEXT2_IRP_CONTEXT IrpContext
,
1833 OUT PLONGLONG offset
1839 IN
struct inode
*Inode
1844 IN PEXT2_IRP_CONTEXT IrpContext
,
1851 IN PEXT2_IRP_CONTEXT IrpContext
,
1853 IN
struct inode
*Inode
1857 Ext2LoadInodeXattr(IN PEXT2_VCB Vcb
,
1858 IN
struct inode
*Inode
,
1859 IN PEXT2_INODE InodeXattr
);
1862 Ext2SaveInodeXattr(IN PEXT2_IRP_CONTEXT IrpContext
,
1864 IN
struct inode
*Inode
,
1865 IN PEXT2_INODE InodeXattr
);
1876 IN PEXT2_IRP_CONTEXT IrpContext
,
1884 IN PEXT2_IRP_CONTEXT IrpContext
,
1893 IN PEXT2_IRP_CONTEXT IrpContext
,
1901 IN PEXT2_IRP_CONTEXT IrpContext
,
1910 IN PEXT2_IRP_CONTEXT IrpContext
,
1917 IN PULONG BlockArray
,
1926 IN PEXT2_IRP_CONTEXT IrpContext
,
1937 IN PEXT2_IRP_CONTEXT IrpContext
,
1943 IN PEXT2_IRP_CONTEXT IrpContext
,
1948 IN OUT PULONG Number
1953 IN PEXT2_IRP_CONTEXT IrpContext
,
1962 IN PEXT2_IRP_CONTEXT IrpContext
,
1970 Ext2UpdateGroupDirStat(
1971 IN PEXT2_IRP_CONTEXT IrpContext
,
1978 IN PEXT2_IRP_CONTEXT IrpContext
,
1986 IN PEXT2_IRP_CONTEXT IrpContext
,
1989 IN
struct inode
*Inode
,
1990 IN PUNICODE_STRING FileName
,
1991 OUT
struct dentry
**dentry
1996 IN PEXT2_IRP_CONTEXT IrpContext
,
2005 IN PEXT2_IRP_CONTEXT IrpContext
,
2012 Ext2SetParentEntry (
2013 IN PEXT2_IRP_CONTEXT IrpContext
,
2017 IN ULONG NewParent
);
2022 IN PEXT2_IRP_CONTEXT IrpContext
,
2029 IN PULONG BlockArray
,
2033 struct ext3_dir_entry_2
*ext3_next_entry(struct ext3_dir_entry_2
*p
);
2035 int ext3_check_dir_entry (const char * function
, struct inode
* dir
,
2036 struct ext3_dir_entry_2
* de
,
2037 struct buffer_head
* bh
,
2038 unsigned long offset
);
2040 loff_t
ext3_max_size(int blkbits
, int has_huge_files
);
2041 loff_t
ext3_max_bitmap_size(int bits
, int has_huge_files
);
2044 __le16
ext4_group_desc_csum(struct ext3_sb_info
*sbi
, __u32 block_group
,
2045 struct ext4_group_desc
*gdp
);
2046 int ext4_group_desc_csum_verify(struct ext3_sb_info
*sbi
, __u32 block_group
,
2047 struct ext4_group_desc
*gdp
);
2049 ext3_fsblk_t
descriptor_loc(struct super_block
*sb
,
2050 ext3_fsblk_t logical_sb_block
, unsigned int nr
);
2051 struct ext4_group_desc
* ext4_get_group_desc(struct super_block
*sb
,
2052 ext4_group_t block_group
, struct buffer_head
**bh
);
2053 int ext4_check_descriptors(struct super_block
*sb
);
2060 Ext2IsFastIoPossible(
2065 Ext2FastIoCheckIfPossible (
2066 IN PFILE_OBJECT FileObject
,
2067 IN PLARGE_INTEGER FileOffset
,
2071 IN BOOLEAN CheckForReadOperation
,
2072 OUT PIO_STATUS_BLOCK IoStatus
,
2073 IN PDEVICE_OBJECT DeviceObject
2078 Ext2FastIoRead (IN PFILE_OBJECT FileObject
,
2079 IN PLARGE_INTEGER FileOffset
,
2084 OUT PIO_STATUS_BLOCK IoStatus
,
2085 IN PDEVICE_OBJECT DeviceObject
);
2089 IN PFILE_OBJECT FileObject
,
2090 IN PLARGE_INTEGER FileOffset
,
2095 OUT PIO_STATUS_BLOCK IoStatus
,
2096 IN PDEVICE_OBJECT DeviceObject
);
2099 Ext2FastIoQueryBasicInfo (
2100 IN PFILE_OBJECT FileObject
,
2102 OUT PFILE_BASIC_INFORMATION Buffer
,
2103 OUT PIO_STATUS_BLOCK IoStatus
,
2104 IN PDEVICE_OBJECT DeviceObject
);
2107 Ext2FastIoQueryStandardInfo (
2108 IN PFILE_OBJECT FileObject
,
2110 OUT PFILE_STANDARD_INFORMATION Buffer
,
2111 OUT PIO_STATUS_BLOCK IoStatus
,
2112 IN PDEVICE_OBJECT DeviceObject
);
2116 IN PFILE_OBJECT FileObject
,
2117 IN PLARGE_INTEGER FileOffset
,
2118 IN PLARGE_INTEGER Length
,
2119 IN PEPROCESS Process
,
2121 IN BOOLEAN FailImmediately
,
2122 IN BOOLEAN ExclusiveLock
,
2123 OUT PIO_STATUS_BLOCK IoStatus
,
2124 IN PDEVICE_OBJECT DeviceObject
2128 Ext2FastIoUnlockSingle (
2129 IN PFILE_OBJECT FileObject
,
2130 IN PLARGE_INTEGER FileOffset
,
2131 IN PLARGE_INTEGER Length
,
2132 IN PEPROCESS Process
,
2134 OUT PIO_STATUS_BLOCK IoStatus
,
2135 IN PDEVICE_OBJECT DeviceObject
2139 Ext2FastIoUnlockAll (
2140 IN PFILE_OBJECT FileObject
,
2141 IN PEPROCESS Process
,
2142 OUT PIO_STATUS_BLOCK IoStatus
,
2143 IN PDEVICE_OBJECT DeviceObject
2147 Ext2FastIoUnlockAllByKey (
2148 IN PFILE_OBJECT FileObject
,
2152 IN PEPROCESS Process
,
2155 OUT PIO_STATUS_BLOCK IoStatus
,
2156 IN PDEVICE_OBJECT DeviceObject
2161 Ext2FastIoQueryNetworkOpenInfo (
2162 IN PFILE_OBJECT FileObject
,
2164 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
2165 OUT PIO_STATUS_BLOCK IoStatus
,
2166 IN PDEVICE_OBJECT DeviceObject
);
2169 Ext2FastIoQueryNetworkOpenInfo (
2170 IN PFILE_OBJECT FileObject
,
2172 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
2173 OUT PIO_STATUS_BLOCK IoStatus
,
2174 IN PDEVICE_OBJECT DeviceObject
);
2178 Ext2AcquireForCreateSection (
2179 IN PFILE_OBJECT FileObject
2184 Ext2ReleaseForCreateSection (
2185 IN PFILE_OBJECT FileObject
2190 Ext2AcquireFileForModWrite (
2191 IN PFILE_OBJECT FileObject
,
2192 IN PLARGE_INTEGER EndingOffset
,
2193 OUT PERESOURCE
*ResourceToRelease
,
2194 IN PDEVICE_OBJECT DeviceObject
2199 Ext2ReleaseFileForModWrite (
2200 IN PFILE_OBJECT FileObject
,
2201 IN PERESOURCE ResourceToRelease
,
2202 IN PDEVICE_OBJECT DeviceObject
2207 Ext2AcquireFileForCcFlush (
2208 IN PFILE_OBJECT FileObject
,
2209 IN PDEVICE_OBJECT DeviceObject
2214 Ext2ReleaseFileForCcFlush (
2215 IN PFILE_OBJECT FileObject
,
2216 IN PDEVICE_OBJECT DeviceObject
2222 Ext2PreAcquireForCreateSection(
2223 IN PFS_FILTER_CALLBACK_DATA cd
,
2233 Ext2QueryFileInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2236 Ext2SetFileInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2241 PLARGE_INTEGER Size
,
2247 PEXT2_IRP_CONTEXT IrpContext
,
2255 PEXT2_IRP_CONTEXT IrpContext
,
2258 PLARGE_INTEGER AllocationSize
);
2261 Ext2IsFileRemovable(
2262 IN PEXT2_IRP_CONTEXT IrpContext
,
2269 Ext2SetDispositionInfo(
2270 PEXT2_IRP_CONTEXT IrpContext
,
2279 PEXT2_IRP_CONTEXT IrpContext
,
2287 PEXT2_IRP_CONTEXT IrpContext
,
2294 Ext2InodeType(PEXT2_MCB Mcb
);
2298 PEXT2_IRP_CONTEXT IrpContext
,
2311 IN PEXT2_IRP_CONTEXT IrpContext
,
2313 IN BOOLEAN bShutDown
2318 IN PEXT2_IRP_CONTEXT IrpContext
,
2320 IN BOOLEAN bShutDown
2325 IN PEXT2_IRP_CONTEXT IrpContext
,
2331 Ext2Flush (IN PEXT2_IRP_CONTEXT IrpContext
);
2340 IN PEXT2_IRP_CONTEXT IrpContext
,
2345 OUT PULONG BytesRead
2350 IN PEXT2_IRP_CONTEXT IrpContext
,
2355 OUT PULONG BytesWritten
2359 Ext2TruncateSymlink(
2360 PEXT2_IRP_CONTEXT IrpContext
,
2367 // MountPoint process workitem
2371 Ext2SetVpbFlag (IN PVPB Vpb
,
2375 Ext2ClearVpbFlag (IN PVPB Vpb
,
2380 IN PEXT2_IRP_CONTEXT IrpContext
,
2382 IN BOOLEAN bForce
);
2385 Ext2PurgeVolume (IN PEXT2_VCB Vcb
,
2386 IN BOOLEAN FlushBeforePurge
);
2389 Ext2PurgeFile (IN PEXT2_FCB Fcb
,
2390 IN BOOLEAN FlushBeforePurge
);
2393 Ext2IsHandleCountZero(IN PEXT2_VCB Vcb
);
2396 Ext2LockVcb (IN PEXT2_VCB Vcb
,
2397 IN PFILE_OBJECT FileObject
);
2400 Ext2LockVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2403 Ext2UnlockVcb (IN PEXT2_VCB Vcb
,
2404 IN PFILE_OBJECT FileObject
);
2407 Ext2UnlockVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2410 Ext2AllowExtendedDasdIo(IN PEXT2_IRP_CONTEXT IrpContext
);
2413 Ext2OplockRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
2416 Ext2QueryExtentMappings(
2417 IN PEXT2_IRP_CONTEXT IrpContext
,
2420 IN PLARGE_INTEGER RequestVbn
,
2421 OUT PLARGE_INTEGER
* pMappedRuns
2425 Ext2QueryRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext
);
2428 Ext2GetRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext
);
2431 Ext2GetRetrievalPointerBase(IN PEXT2_IRP_CONTEXT IrpContext
);
2434 Ext2UserFsRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
2437 Ext2IsMediaWriteProtected (
2438 IN PEXT2_IRP_CONTEXT IrpContext
,
2439 IN PDEVICE_OBJECT TargetDevice
2443 Ext2MountVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2446 Ext2VerifyVcb (IN PEXT2_IRP_CONTEXT IrpContext
,
2449 Ext2VerifyVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2452 Ext2IsVolumeMounted (IN PEXT2_IRP_CONTEXT IrpContext
);
2455 Ext2DismountVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2458 Ext2FileSystemControl (IN PEXT2_IRP_CONTEXT IrpContext
);
2464 struct buffer_head
*ext3_append(struct ext2_icb
*icb
, struct inode
*inode
,
2465 ext3_lblk_t
*block
, int *err
);
2467 void ext3_set_de_type(struct super_block
*sb
,
2468 struct ext3_dir_entry_2
*de
,
2471 __u32
ext3_current_time(struct inode
*in
);
2472 void ext3_warning (struct super_block
* sb
, const char * function
,
2474 #define ext3_error ext3_warning
2475 #define ext4_error ext3_error
2477 void ext3_update_dx_flag(struct inode
*inode
);
2478 int ext3_mark_inode_dirty(struct ext2_icb
*icb
, struct inode
*in
);
2480 void ext3_inc_count(struct inode
*inode
);
2481 void ext3_dec_count(struct inode
*inode
);
2483 struct buffer_head
*
2484 ext3_find_entry (struct ext2_icb
*icb
, struct dentry
*dentry
,
2485 struct ext3_dir_entry_2
** res_dir
);
2486 struct buffer_head
*
2487 ext3_dx_find_entry(struct ext2_icb
*, struct dentry
*dentry
,
2488 struct ext3_dir_entry_2
**res_dir
, int *err
);
2490 typedef int (*filldir_t
)(void *, const char *, int, unsigned long, __u32
, unsigned);
2491 int ext3_dx_readdir(struct file
*filp
, filldir_t filldir
, void * context
);
2493 struct buffer_head
*ext3_bread(struct ext2_icb
*icb
, struct inode
*inode
,
2494 unsigned long block
, int *err
);
2495 int add_dirent_to_buf(struct ext2_icb
*icb
, struct dentry
*dentry
,
2496 struct inode
*inode
, struct ext3_dir_entry_2
*de
,
2497 struct buffer_head
*bh
);
2498 #if !defined(__REACTOS__) || defined(_MSC_VER)
2499 struct ext3_dir_entry_2
*
2500 do_split(struct ext2_icb
*icb
, struct inode
*dir
,
2501 struct buffer_head
**bh
,struct dx_frame
*frame
,
2502 struct dx_hash_info
*hinfo
, int *error
);
2505 int ext3_add_entry(struct ext2_icb
*icb
, struct dentry
*dentry
, struct inode
*inode
);
2507 int ext3_delete_entry(struct ext2_icb
*icb
, struct inode
*dir
,
2508 struct ext3_dir_entry_2
*de_del
,
2509 struct buffer_head
*bh
);
2511 int ext3_is_dir_empty(struct ext2_icb
*icb
, struct inode
*inode
);
2518 Ext2QueryGlobalParameters(IN PUNICODE_STRING RegistryPath
);
2520 Ext2QueryRegistrySettings(IN PUNICODE_STRING RegistryPath
);
2523 DriverUnload (IN PDRIVER_OBJECT DriverObject
);
2531 IN PEXT2_IRP_CONTEXT IrpContext
,
2542 PEXT2_IRP_CONTEXT IrpContext
,
2551 Ext2TruncateIndirect(
2552 PEXT2_IRP_CONTEXT IrpContext
,
2560 // linux.c: linux lib implemenation
2567 ext2_destroy_linux();
2575 Ext2LockControl (IN PEXT2_IRP_CONTEXT IrpContext
);
2584 Ext2FcbReaperThread(
2590 Ext2McbReaperThread(
2602 Ext2AllocateIrpContext (IN PDEVICE_OBJECT DeviceObject
,
2606 Ext2FreeIrpContext (IN PEXT2_IRP_CONTEXT IrpContext
);
2616 Ext2UnlinkFcb(IN PEXT2_FCB Fcb
);
2619 Ext2FreeFcb (IN PEXT2_FCB Fcb
);
2621 Ext2ReleaseFcb (IN PEXT2_FCB Fcb
);
2624 Ext2InsertFcb(PEXT2_VCB Vcb
, PEXT2_FCB Fcb
);
2627 Ext2AllocateCcb (ULONG Flags
, PEXT2_MCB SymLink
);
2636 Ext2FreeCcb (IN PEXT2_VCB Vcb
, IN PEXT2_CCB Ccb
);
2639 Ext2AllocateInode (PEXT2_VCB Vcb
);
2642 Ext2DestroyInode (IN PEXT2_VCB Vcb
, IN PEXT2_INODE inode
);
2644 struct dentry
* Ext2AllocateEntry();
2645 VOID
Ext2FreeEntry (IN
struct dentry
*de
);
2646 struct dentry
*Ext2BuildEntry(PEXT2_VCB Vcb
, PEXT2_MCB Dcb
, PUNICODE_STRING FileName
);
2649 Ext2AllocateExtent();
2652 Ext2FreeExtent (IN PEXT2_EXTENT Extent
);
2655 Ext2CountExtents(IN PEXT2_EXTENT Chain
);
2659 IN PEXT2_EXTENT Chain
,
2660 IN PEXT2_EXTENT Extent
2664 Ext2DestroyExtentChain(IN PEXT2_EXTENT Chain
);
2668 IN PEXT2_IRP_CONTEXT IrpContext
,
2671 IN ULONGLONG Offset
,
2674 OUT PEXT2_EXTENT
* Chain
2678 Ext2ListExtents(PLARGE_MCB Extents
);
2690 Ext2ClearAllExtents(PLARGE_MCB Zone
);
2700 Ext2RemoveVcbExtent (
2707 Ext2LookupVcbExtent (
2711 OUT PLONGLONG Length
2724 Ext2RemoveMcbExtent (
2732 Ext2LookupMcbExtent (
2737 OUT PLONGLONG Length
2741 Ext2AddMcbMetaExts (
2749 Ext2RemoveMcbMetaExts (
2766 Ext2LookupBlockExtent(
2775 Ext2RemoveBlockExtent(
2784 IN PEXT2_IRP_CONTEXT IrpContext
,
2791 IN OUT PUNICODE_STRING Target
,
2792 IN PUNICODE_STRING File
,
2793 IN PUNICODE_STRING Parent
2800 IN PUNICODE_STRING FileName
,
2801 IN PUNICODE_STRING Parent
,
2809 PUNICODE_STRING FileName
2813 Ext2SearchMcbWithoutLock(
2815 PUNICODE_STRING FileName
2838 PEXT2_IRP_CONTEXT IrpContext
,
2839 PEXT2_VCB Vcb
, LONGLONG Block
2843 Ext2CheckBitmapConsistency(
2844 PEXT2_IRP_CONTEXT IrpContext
,
2849 Ext2InsertVcb(PEXT2_VCB Vcb
);
2852 Ext2RemoveVcb(PEXT2_VCB Vcb
);
2855 Ext2InitializeLabel(
2857 IN PEXT2_SUPER_BLOCK Sb
2862 PEXT2_IRP_CONTEXT IrpContext
,
2864 PEXT2_SUPER_BLOCK Ext2Sb
,
2865 PDEVICE_OBJECT TargetDevice
,
2866 PDEVICE_OBJECT VolumeDevice
,
2870 Ext2TearDownStream (IN PEXT2_VCB Vcb
);
2873 Ext2DestroyVcb (IN PEXT2_VCB Vcb
);
2876 Ext2CompleteIrpContext (
2877 IN PEXT2_IRP_CONTEXT IrpContext
,
2878 IN NTSTATUS Status
);
2881 Ext2SyncUninitializeCacheMap (
2882 IN PFILE_OBJECT FileObject
);
2885 Ext2LinkTailMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2889 Ext2LinkHeadMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2892 Ext2UnlinkMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2907 Ext2StartReaper(PEXT2_REAPER
, EXT2_REAPER_RELEASE
);
2910 Ext2StopReaper(PEXT2_REAPER Reaper
);
2917 Ext2Log2(ULONG Value
);
2920 Ext2NtTime (IN ULONG i_time
);
2923 Ext2LinuxTime (IN LARGE_INTEGER SysTime
);
2926 Ext2OEMToUnicodeSize(
2934 IN OUT PUNICODE_STRING Oem
,
2935 IN POEM_STRING Unicode
2939 Ext2UnicodeToOEMSize(
2941 IN PUNICODE_STRING Unicode
2947 IN OUT POEM_STRING Oem
,
2948 IN PUNICODE_STRING Unicode
2952 Ext2Sleep(ULONG ms
);
2954 int Ext2LinuxError (NTSTATUS Status
);
2955 NTSTATUS
Ext2WinntError(int rc
);
2957 BOOLEAN
Ext2IsDot(PUNICODE_STRING name
);
2958 BOOLEAN
Ext2IsDotDot(PUNICODE_STRING name
);
2974 Ext2Pnp(IN PEXT2_IRP_CONTEXT IrpContext
);
2978 PEXT2_IRP_CONTEXT IrpContext
,
2983 PEXT2_IRP_CONTEXT IrpContext
,
2987 Ext2PnpCancelRemove(
2988 PEXT2_IRP_CONTEXT IrpContext
,
2992 Ext2PnpSurpriseRemove(
2993 PEXT2_IRP_CONTEXT IrpContext
,
3003 IN PEXT2_IRP_CONTEXT IrpContext
,
3006 IN ULONGLONG Offset
,
3009 IN BOOLEAN bDirectIo
,
3014 Ext2Read (IN PEXT2_IRP_CONTEXT IrpContext
);
3022 Ext2LoadInternalJournal(
3035 PEXT2_IRP_CONTEXT IrpContext
,
3045 Ext2ShutDown (IN PEXT2_IRP_CONTEXT IrpContext
);
3053 Ext2QueryVolumeInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
3056 Ext2SetVolumeInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
3062 typedef struct _EXT2_RW_CONTEXT
{
3067 PERESOURCE Resource
;
3068 ERESOURCE_THREAD ThreadId
;
3069 PFILE_OBJECT FileObject
;
3073 } EXT2_RW_CONTEXT
, *PEXT2_RW_CONTEXT
;
3075 #define EXT2_RW_CONTEXT_WRITE 1
3079 IN PEXT2_IRP_CONTEXT IrpContext
,
3082 IN ULONGLONG Offset
,
3085 IN BOOLEAN bDirectIo
,
3091 Ext2StartFloppyFlushDpc (
3094 PFILE_OBJECT FileObject
);
3098 IN PEXT2_IRP_CONTEXT IrpContext
,
3100 IN PFILE_OBJECT FileObject
,
3101 IN PLARGE_INTEGER Start
,
3102 IN PLARGE_INTEGER End
);
3105 Ext2Write (IN PEXT2_IRP_CONTEXT IrpContext
);
3107 #endif /* _EXT2_HEADER_ */