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.68"
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 // Aligned size (Page or Block)
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 */
787 #define VCB_BEING_DROPPED 0x00002000
788 #define VCB_FORCE_WRITING 0x00004000
789 #define VCB_DEVICE_REMOVED 0x00008000
790 #define VCB_JOURNAL_RECOVER 0x00080000
791 #define VCB_ARRIVAL_NOTIFIED 0x00800000
792 #define VCB_RO_COMPAT_READ_ONLY 0x01000000
793 #define VCB_READ_ONLY 0x08000000
794 #define VCB_WRITE_PROTECTED 0x10000000
795 #define VCB_FLOPPY_DISK 0x20000000
796 #define VCB_REMOVAL_PREVENTED 0x40000000
797 #define VCB_REMOVABLE_MEDIA 0x80000000
800 #define IsVcbInited(Vcb) (IsFlagOn((Vcb)->Flags, VCB_INITIALIZED))
801 #define IsMounted(Vcb) (IsFlagOn((Vcb)->Flags, VCB_MOUNTED))
802 #define IsDispending(Vcb) (IsFlagOn((Vcb)->Flags, VCB_DISMOUNT_PENDING))
803 #define IsVcbReadOnly(Vcb) (IsFlagOn((Vcb)->Flags, VCB_READ_ONLY) || \
804 IsFlagOn((Vcb)->Flags, VCB_RO_COMPAT_READ_ONLY) || \
805 IsFlagOn((Vcb)->Flags, VCB_WRITE_PROTECTED))
808 #define IsExt3ForceWrite() (IsFlagOn(Ext2Global->Flags, EXT3_FORCE_WRITING))
809 #define IsVcbForceWrite(Vcb) (IsFlagOn((Vcb)->Flags, VCB_FORCE_WRITING))
810 #define CanIWrite(Vcb) (IsExt3ForceWrite() || (!IsVcbReadOnly(Vcb) && IsVcbForceWrite(Vcb)))
811 #define IsLazyWriter(Fcb) ((Fcb)->LazyWriterThread == PsGetCurrentThread())
813 // EXT2_FCB File Control Block
815 // Data that represents an open file
816 // There is a single instance of the FCB for every open file
818 typedef struct _EXT2_FCB
{
823 // List of FCBs for this volume
825 LARGE_INTEGER TsDrop
; /* drop time */
827 SECTION_OBJECT_POINTERS SectionObject
;
829 // Share Access for the file object
830 SHARE_ACCESS ShareAccess
;
832 // List of byte-range locks for this file
833 FILE_LOCK FileLockAnchor
;
835 // oplock information management structure
838 // Lazy writer thread context
839 PETHREAD LazyWriterThread
;
841 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
842 ULONG OpenHandleCount
;
844 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
845 ULONG ReferenceCount
;
847 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
848 // But only for Files with FO_NO_INTERMEDIATE_BUFFERING flag
849 ULONG NonCachedOpenCount
;
854 // Pointer to the inode
863 } EXT2_FCB
, *PEXT2_FCB
;
866 // Flags for EXT2_FCB
869 #define FCB_FROM_POOL 0x00000001
870 #define FCB_PAGE_FILE 0x00000002
871 #define FCB_FILE_MODIFIED 0x00000020
873 #define FCB_ALLOC_IN_CREATE 0x00000080
874 #define FCB_ALLOC_IN_WRITE 0x00000100
875 #define FCB_ALLOC_IN_SETINFO 0x00000200
877 #define FCB_DELETE_PENDING 0x80000000
885 // Identifier for this structure
886 EXT2_IDENTIFIER Identifier
;
892 PEXT2_MCB Parent
; // Parent
893 PEXT2_MCB Next
; // Siblings
896 PEXT2_MCB Child
; // Children Mcb nodes
897 PEXT2_MCB Target
; // Target Mcb of symlink
906 UNICODE_STRING ShortName
;
908 // Full name with path
909 UNICODE_STRING FullName
;
924 LARGE_INTEGER CreationTime
;
925 LARGE_INTEGER LastWriteTime
;
926 LARGE_INTEGER ChangeTime
;
927 LARGE_INTEGER LastAccessTime
;
929 // List Link to Vcb->McbList
939 #define MCB_FROM_POOL 0x00000001
940 #define MCB_VCB_LINK 0x00000002
941 #define MCB_ENTRY_TREE 0x00000004
942 #define MCB_FILE_DELETED 0x00000008
944 #define MCB_ZONE_INITED 0x20000000
945 #define MCB_TYPE_SPECIAL 0x40000000 /* unresolved symlink + device node */
946 #define MCB_TYPE_SYMLINK 0x80000000
948 #define IsMcbUsed(Mcb) ((Mcb)->Refercount > 0)
949 #define IsMcbSymLink(Mcb) IsFlagOn((Mcb)->Flags, MCB_TYPE_SYMLINK)
950 #define IsZoneInited(Mcb) IsFlagOn((Mcb)->Flags, MCB_ZONE_INITED)
951 #define IsMcbSpecialFile(Mcb) IsFlagOn((Mcb)->Flags, MCB_TYPE_SPECIAL)
952 #define IsMcbRoot(Mcb) ((Mcb)->Inode.i_ino == EXT2_ROOT_INO)
953 #define IsMcbReadonly(Mcb) IsFlagOn((Mcb)->FileAttr, FILE_ATTRIBUTE_READONLY)
954 #define IsMcbDirectory(Mcb) IsFlagOn((Mcb)->FileAttr, FILE_ATTRIBUTE_DIRECTORY)
955 #define IsFileDeleted(Mcb) IsFlagOn((Mcb)->Flags, MCB_FILE_DELETED)
957 #define IsLinkInvalid(Mcb) (IsMcbSymLink(Mcb) && IsFileDeleted(Mcb->Target))
960 * routines for reference count management
963 #define Ext2ReferXcb(_C) InterlockedIncrement(_C)
964 #define Ext2DerefXcb(_C) DEC_OBJ_CNT(_C)
969 __inline ULONG
DEC_OBJ_CNT(PULONG _C
) {
973 return InterlockedDecrement(_C
);
978 Ext2TraceMcb(PCHAR fn
, USHORT lc
, USHORT add
, PEXT2_MCB Mcb
);
979 #define Ext2ReferMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, TRUE, Mcb)
980 #define Ext2DerefMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, FALSE, Mcb)
982 #define Ext2ReferMcb(Mcb) Ext2ReferXcb(&Mcb->Refercount)
983 #define Ext2DerefMcb(Mcb) Ext2DerefXcb(&Mcb->Refercount)
987 // EXT2_CCB Context Control Block
989 // Data that represents one instance of an open file
990 // There is one instance of the CCB for every instance of an open file
992 typedef struct _EXT2_CCB
{
994 // Identifier for this structure
995 EXT2_IDENTIFIER Identifier
;
1000 // Mcb of it's symbol link
1003 // State that may need to be maintained
1004 UNICODE_STRING DirectorySearchPattern
;
1006 /* Open handle control block */
1009 } EXT2_CCB
, *PEXT2_CCB
;
1015 #define CCB_FROM_POOL 0x00000001
1016 #define CCB_VOLUME_DASD_PURGE 0x00000002
1017 #define CCB_LAST_WRITE_UPDATED 0x00000004
1018 #define CCB_OPEN_REPARSE_POINT 0x00000008
1019 #define CCB_DELETE_ON_CLOSE 0x00000010
1021 #define CCB_ALLOW_EXTENDED_DASD_IO 0x80000000
1026 // Used to pass information about a request between the drivers functions
1028 typedef struct ext2_icb
{
1030 // Identifier for this structure
1031 EXT2_IDENTIFIER Identifier
;
1033 // Pointer to the IRP this request describes
1039 // The major and minor function code for the request
1040 UCHAR MajorFunction
;
1041 UCHAR MinorFunction
;
1043 // The device object
1044 PDEVICE_OBJECT DeviceObject
;
1046 // The real device object
1047 PDEVICE_OBJECT RealDevice
;
1050 PFILE_OBJECT FileObject
;
1055 // If the request is top level
1058 // Used if the request needs to be queued for later processing
1059 WORK_QUEUE_ITEM WorkQueueItem
;
1061 // If an exception is currently in progress
1062 BOOLEAN ExceptionInProgress
;
1064 // The exception code when an exception is in progress
1065 NTSTATUS ExceptionCode
;
1067 } EXT2_IRP_CONTEXT
, *PEXT2_IRP_CONTEXT
;
1070 #define IRP_CONTEXT_FLAG_FROM_POOL (0x00000001)
1071 #define IRP_CONTEXT_FLAG_WAIT (0x00000002)
1072 #define IRP_CONTEXT_FLAG_WRITE_THROUGH (0x00000004)
1073 #define IRP_CONTEXT_FLAG_FLOPPY (0x00000008)
1074 #define IRP_CONTEXT_FLAG_DISABLE_POPUPS (0x00000020)
1075 #define IRP_CONTEXT_FLAG_DEFERRED (0x00000040)
1076 #define IRP_CONTEXT_FLAG_VERIFY_READ (0x00000080)
1077 #define IRP_CONTEXT_STACK_IO_CONTEXT (0x00000100)
1078 #define IRP_CONTEXT_FLAG_REQUEUED (0x00000200)
1079 #define IRP_CONTEXT_FLAG_USER_IO (0x00000400)
1080 #define IRP_CONTEXT_FLAG_DELAY_CLOSE (0x00000800)
1081 #define IRP_CONTEXT_FLAG_FILE_BUSY (0x00001000)
1084 #define Ext2CanIWait() (!IrpContext || IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT))
1087 // EXT2_ALLOC_HEADER
1089 // In the checked version of the driver this header is put in the beginning of
1090 // every memory allocation
1092 typedef struct _EXT2_ALLOC_HEADER
{
1093 EXT2_IDENTIFIER Identifier
;
1094 } EXT2_ALLOC_HEADER
, *PEXT2_ALLOC_HEADER
;
1096 typedef struct _FCB_LIST_ENTRY
{
1099 } FCB_LIST_ENTRY
, *PFCB_LIST_ENTRY
;
1102 // Block Description List
1103 typedef struct _EXT2_EXTENT
{
1108 struct _EXT2_EXTENT
* Next
;
1109 } EXT2_EXTENT
, *PEXT2_EXTENT
;
1112 /* FUNCTIONS DECLARATION *****************************************************/
1114 // Include this so we don't need the latest WDK to build the driver.
1115 #ifndef FSCTL_GET_RETRIEVAL_POINTER_BASE
1116 #define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS) // RETRIEVAL_POINTER_BASE
1120 // The following macro is used to determine if an FSD thread can block
1121 // for I/O or wait for a resource. It returns TRUE if the thread can
1122 // block and FALSE otherwise. This attribute can then be used to call
1123 // the FSD & FSP common work routine with the proper wait value.
1126 #define CanExt2Wait(IRP) IoIsOperationSynchronous(Irp)
1129 // memory allocation statistics
1137 Ext2TraceMemory(BOOLEAN _n
, int _i
, PVOID _p
, LONG _s
)
1140 InterlockedIncrement(&Ext2Global
->PerfStat
.Current
.Slot
[_i
]);
1141 InterlockedIncrement(&Ext2Global
->PerfStat
.Total
.Slot
[_i
]);
1142 InterlockedExchangeAdd(&Ext2Global
->PerfStat
.Size
.Slot
[_i
], _s
);
1144 InterlockedDecrement(&Ext2Global
->PerfStat
.Current
.Slot
[_i
]);
1145 InterlockedExchangeAdd(&Ext2Global
->PerfStat
.Size
.Slot
[_i
], -1 * _s
);
1154 Ext2TraceIrpContext(BOOLEAN _n
, PEXT2_IRP_CONTEXT IrpContext
)
1157 INC_MEM_COUNT(PS_IRP_CONTEXT
, IrpContext
, sizeof(EXT2_IRP_CONTEXT
));
1158 InterlockedIncrement(&(Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Current
));
1160 DEC_MEM_COUNT(PS_IRP_CONTEXT
, IrpContext
, sizeof(EXT2_IRP_CONTEXT
));
1161 InterlockedIncrement(&Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Processed
);
1162 InterlockedDecrement(&Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Current
);
1166 typedef struct _EXT2_FILLDIR_CONTEXT
{
1167 PEXT2_IRP_CONTEXT efc_irp
;
1172 NTSTATUS efc_status
;
1173 FILE_INFORMATION_CLASS efc_fi
;
1175 } EXT2_FILLDIR_CONTEXT
, *PEXT2_FILLDIR_CONTEXT
;
1182 int Ext2CheckInodeAccess(PEXT2_VCB Vcb
, struct inode
*in
, int attempt
);
1183 int Ext2CheckFileAccess (PEXT2_VCB Vcb
, PEXT2_MCB Mcb
, int attempt
);
1193 IN LOCK_OPERATION Operation
1197 Ext2DestroyMdl (IN PMDL Mdl
);
1200 Ext2LockUserBuffer (
1203 IN LOCK_OPERATION Operation
);
1205 Ext2GetUserBuffer (IN PIRP Irp
);
1209 Ext2ReadWriteBlocks(
1210 IN PEXT2_IRP_CONTEXT IrpContext
,
1212 IN PEXT2_EXTENT Extent
,
1219 IN ULONGLONG Offset
,
1222 IN BOOLEAN bVerify
);
1227 IN ULONGLONG Offset
,
1230 IN BOOLEAN bVerify
);
1234 IN PDEVICE_OBJECT DeviceOjbect
,
1236 IN PVOID InputBuffer
,
1237 IN ULONG InputBufferSize
,
1238 IN OUT PVOID OutputBuffer
,
1239 IN OUT PULONG OutputBufferSize
);
1242 Ext2MediaEjectControl (
1243 IN PEXT2_IRP_CONTEXT IrpContext
,
1245 IN BOOLEAN bPrevent
);
1248 Ext2DiskShutDown(PEXT2_VCB Vcb
);
1256 Ext2Cleanup (IN PEXT2_IRP_CONTEXT IrpContext
);
1263 Ext2Close (IN PEXT2_IRP_CONTEXT IrpContext
);
1266 Ext2QueueCloseRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1269 Ext2DeQueueCloseRequest (IN PVOID Context
);
1276 Ext2AcquireForLazyWrite (
1280 Ext2ReleaseFromLazyWrite (IN PVOID Context
);
1283 Ext2AcquireForReadAhead (
1288 Ext2ReleaseFromReadAhead (IN PVOID Context
);
1296 Ext2NoOpRelease (IN PVOID Fcb
);
1304 Ext2IsNameValid(PUNICODE_STRING FileName
);
1308 IN PEXT2_IRP_CONTEXT IrpContext
,
1310 IN PEXT2_MCB Parent
,
1317 IN PEXT2_IRP_CONTEXT IrpContext
,
1319 IN PEXT2_MCB Parent
,
1320 IN PUNICODE_STRING FileName
,
1322 struct dentry
**dentry
1326 Ext2IsSpecialSystemFile(
1327 IN PUNICODE_STRING FileName
,
1328 IN BOOLEAN bDirectory
1331 #define EXT2_LOOKUP_FLAG_MASK (0xFF00000)
1332 #define EXT2_LOOKUP_NOT_FOLLOW (0x8000000)
1336 IN PEXT2_IRP_CONTEXT IrpContext
,
1338 IN PUNICODE_STRING FullName
,
1339 IN PEXT2_MCB Parent
,
1340 OUT PEXT2_MCB
* Ext2Mcb
,
1346 IN PEXT2_IRP_CONTEXT IrpContext
,
1348 OUT PBOOLEAN OpPostIrp
1353 IN PEXT2_IRP_CONTEXT IrpContext
,
1357 Ext2Create (IN PEXT2_IRP_CONTEXT IrpContext
);
1361 IN PEXT2_IRP_CONTEXT IrpContext
,
1363 IN PEXT2_FCB pParentFcb
,
1366 IN PUNICODE_STRING FileName
);
1370 Ext2SupersedeOrOverWriteFile(
1371 IN PEXT2_IRP_CONTEXT IrpContext
,
1372 IN PFILE_OBJECT FileObject
,
1375 IN PLARGE_INTEGER AllocationSize
,
1376 IN ULONG Disposition
1385 #define DL_VIT 0x00000001
1386 #define DL_ERR 0x00000002
1387 #define DL_DBG 0x00000004
1388 #define DL_INF 0x00000008
1389 #define DL_FUN 0x00000010
1390 #define DL_LOW 0x00000020
1391 #define DL_REN 0x00000040 /* renaming operation */
1392 #define DL_RES 0x00000080 /* entry reference managment */
1393 #define DL_BLK 0x00000100 /* data block allocation / free */
1394 #define DL_CP 0x00000200 /* code pages (create, querydir) */
1395 #define DL_EXT 0x00000400 /* mcb extents */
1396 #define DL_MAP 0x00000800 /* retrieval points */
1397 #define DL_JNL 0x00001000 /* dump journal operations */
1398 #define DL_HTI 0x00002000 /* htree index */
1399 #define DL_WRN 0x00004000 /* warning */
1400 #define DL_BH 0x00008000 /* buffer head */
1401 #define DL_PNP 0x00010000 /* pnp */
1402 #define DL_IO 0x00020000 /* file i/o */
1404 #define DL_DEFAULT (DL_ERR|DL_VIT)
1407 extern ULONG DebugFilter
;
1416 #define DEBUG(_DL, arg) do {if ((_DL) & DebugFilter) Ext2Printf arg;} while(0)
1417 #define DEBUGNI(_DL, arg) do {if ((_DL) & DebugFilter) Ext2NiPrintf arg;} while(0)
1419 #define Ext2CompleteRequest(Irp, bPrint, PriorityBoost) \
1420 Ext2DbgPrintComplete(Irp, bPrint); \
1421 IoCompleteRequest(Irp, PriorityBoost)
1425 #define DEBUG(_DL, arg) do {if ((_DL) & DL_ERR) DbgPrint arg;} while(0)
1427 #define Ext2CompleteRequest(Irp, bPrint, PriorityBoost) \
1428 IoCompleteRequest(Irp, PriorityBoost)
1430 #endif // EXT2_DEBUG
1439 extern ULONG ProcessNameOffset
;
1441 #define Ext2GetCurrentProcessName() ( \
1442 (PUCHAR) PsGetCurrentProcess() + ProcessNameOffset \
1446 Ext2GetProcessNameOffset (VOID
);
1450 IN PDEVICE_OBJECT DeviceObject
,
1454 Ext2DbgPrintComplete (
1460 Ext2NtStatusToString (IN NTSTATUS Status
);
1462 PVOID
Ext2AllocatePool(
1463 IN POOL_TYPE PoolType
,
1464 IN SIZE_T NumberOfBytes
,
1479 Ext2ProcessGlobalProperty(
1480 IN PDEVICE_OBJECT DeviceObject
,
1481 IN PEXT2_VOLUME_PROPERTY3 Property
,
1486 Ext2ProcessVolumeProperty(
1488 IN PEXT2_VOLUME_PROPERTY3 Property
,
1493 Ext2ProcessUserProperty(
1494 IN PEXT2_IRP_CONTEXT IrpContext
,
1495 IN PEXT2_VOLUME_PROPERTY3 Property
,
1500 Ex2ProcessUserPerfStat(
1501 IN PEXT2_IRP_CONTEXT IrpContext
,
1502 IN PEXT2_QUERY_PERFSTAT QueryPerf
,
1507 Ex2ProcessMountPoint(
1508 IN PEXT2_IRP_CONTEXT IrpContext
,
1509 IN PEXT2_MOUNT_POINT MountPoint
,
1514 Ext2DeviceControlNormal (IN PEXT2_IRP_CONTEXT IrpContext
);
1517 Ext2PrepareToUnload (IN PEXT2_IRP_CONTEXT IrpContext
);
1520 Ext2DeviceControl (IN PEXT2_IRP_CONTEXT IrpContext
);
1527 Ext2GetInfoLength(IN FILE_INFORMATION_CLASS FileInformationClass
);
1531 IN PEXT2_IRP_CONTEXT IrpContext
,
1534 IN FILE_INFORMATION_CLASS FileInformationClass
,
1537 IN ULONG UsedLength
,
1540 IN PUNICODE_STRING pName
,
1541 OUT PULONG EntrySize
,
1548 IN POEM_STRING OeName
1551 NTSTATUS
Ext2QueryDirectory (IN PEXT2_IRP_CONTEXT IrpContext
);
1554 Ext2NotifyChangeDirectory (
1555 IN PEXT2_IRP_CONTEXT IrpContext
1559 Ext2NotifyReportChange (
1560 IN PEXT2_IRP_CONTEXT IrpContext
,
1568 Ext2DirectoryControl (IN PEXT2_IRP_CONTEXT IrpContext
);
1571 Ext2IsDirectoryEmpty (
1572 IN PEXT2_IRP_CONTEXT IrpContext
,
1582 Ext2OplockComplete (
1594 Ext2QueueRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1597 Ext2DeQueueRequest (IN PVOID Context
);
1600 Ext2DispatchRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1604 IN PDEVICE_OBJECT DeviceObject
,
1613 Ext2ExceptionFilter (
1614 IN PEXT2_IRP_CONTEXT IrpContext
,
1615 IN PEXCEPTION_POINTERS ExceptionPointer
1619 Ext2ExceptionHandler (IN PEXT2_IRP_CONTEXT IrpContext
);
1629 IN PEXT2_IRP_CONTEXT IrpContext
,
1640 PEXT2_IRP_CONTEXT IrpContext
,
1650 PEXT2_IRP_CONTEXT IrpContext
,
1661 static inline ext3_fsblk_t
ext3_blocks_count(struct ext3_super_block
*es
)
1663 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_blocks_count_hi
) << 32) |
1664 le32_to_cpu(es
->s_blocks_count
);
1667 static inline ext3_fsblk_t
ext3_r_blocks_count(struct ext3_super_block
*es
)
1669 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_r_blocks_count_hi
) << 32) |
1670 le32_to_cpu(es
->s_r_blocks_count
);
1673 static inline ext3_fsblk_t
ext3_free_blocks_count(struct ext3_super_block
*es
)
1675 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_free_blocks_count_hi
) << 32) |
1676 le32_to_cpu(es
->s_free_blocks_count
);
1679 static inline void ext3_blocks_count_set(struct ext3_super_block
*es
,
1682 es
->s_blocks_count
= cpu_to_le32((u32
)blk
);
1683 es
->s_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1686 static inline void ext3_free_blocks_count_set(struct ext3_super_block
*es
,
1689 es
->s_free_blocks_count
= cpu_to_le32((u32
)blk
);
1690 es
->s_free_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1693 static inline void ext3_r_blocks_count_set(struct ext3_super_block
*es
,
1696 es
->s_r_blocks_count
= cpu_to_le32((u32
)blk
);
1697 es
->s_r_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1700 blkcnt_t
ext3_inode_blocks(struct ext3_inode
*raw_inode
,
1701 struct inode
*inode
);
1703 int ext3_inode_blocks_set(struct ext3_inode
*raw_inode
,
1704 struct inode
* inode
);
1705 ext4_fsblk_t
ext4_block_bitmap(struct super_block
*sb
,
1706 struct ext4_group_desc
*bg
);
1708 ext4_fsblk_t
ext4_inode_bitmap(struct super_block
*sb
,
1709 struct ext4_group_desc
*bg
);
1710 ext4_fsblk_t
ext4_inode_table(struct super_block
*sb
,
1711 struct ext4_group_desc
*bg
);
1712 __u32
ext4_free_blks_count(struct super_block
*sb
,
1713 struct ext4_group_desc
*bg
);
1714 __u32
ext4_free_inodes_count(struct super_block
*sb
,
1715 struct ext4_group_desc
*bg
);
1716 __u32
ext4_used_dirs_count(struct super_block
*sb
,
1717 struct ext4_group_desc
*bg
);
1718 __u32
ext4_itable_unused_count(struct super_block
*sb
,
1719 struct ext4_group_desc
*bg
);
1720 void ext4_block_bitmap_set(struct super_block
*sb
,
1721 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1722 void ext4_inode_bitmap_set(struct super_block
*sb
,
1723 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1724 void ext4_inode_table_set(struct super_block
*sb
,
1725 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1726 void ext4_free_blks_set(struct super_block
*sb
,
1727 struct ext4_group_desc
*bg
, __u32 count
);
1728 void ext4_free_inodes_set(struct super_block
*sb
,
1729 struct ext4_group_desc
*bg
, __u32 count
);
1730 void ext4_used_dirs_set(struct super_block
*sb
,
1731 struct ext4_group_desc
*bg
, __u32 count
);
1732 void ext4_itable_unused_set(struct super_block
*sb
,
1733 struct ext4_group_desc
*bg
, __u32 count
);
1735 int ext3_bg_has_super(struct super_block
*sb
, ext3_group_t group
);
1736 unsigned long ext4_bg_num_gdb(struct super_block
*sb
, ext4_group_t group
);
1737 unsigned ext4_init_inode_bitmap(struct super_block
*sb
, struct buffer_head
*bh
,
1738 ext4_group_t block_group
,
1739 struct ext4_group_desc
*gdp
);
1740 unsigned ext4_init_block_bitmap(struct super_block
*sb
, struct buffer_head
*bh
,
1741 ext4_group_t block_group
, struct ext4_group_desc
*gdp
);
1742 struct ext4_group_desc
* ext4_get_group_desc(struct super_block
*sb
,
1743 ext4_group_t block_group
, struct buffer_head
**bh
);
1744 ext4_fsblk_t
ext4_count_free_blocks(struct super_block
*sb
);
1745 unsigned long ext4_count_free_inodes(struct super_block
*sb
);
1746 int ext4_check_descriptors(struct super_block
*sb
);
1752 OUT PEXT2_SUPER_BLOCK
* Sb
1758 IN PEXT2_IRP_CONTEXT IrpContext
,
1764 IN PEXT2_IRP_CONTEXT IrpContext
,
1769 Ext2LoadGroup(IN PEXT2_VCB Vcb
);
1772 Ext2PutGroup(IN PEXT2_VCB Vcb
);
1775 Ext2DropBH(IN PEXT2_VCB Vcb
);
1779 IN PEXT2_IRP_CONTEXT IrpContext
,
1786 IN PEXT2_IRP_CONTEXT IrpContext
,
1794 OUT PLONGLONG offset
1800 IN
struct inode
*Inode
1805 IN PEXT2_IRP_CONTEXT IrpContext
,
1812 IN PEXT2_IRP_CONTEXT IrpContext
,
1814 IN
struct inode
*Inode
1826 IN PEXT2_IRP_CONTEXT IrpContext
,
1834 IN PEXT2_IRP_CONTEXT IrpContext
,
1842 IN PEXT2_IRP_CONTEXT IrpContext
,
1851 IN PEXT2_IRP_CONTEXT IrpContext
,
1858 IN PULONG BlockArray
,
1867 IN PEXT2_IRP_CONTEXT IrpContext
,
1878 IN PEXT2_IRP_CONTEXT IrpContext
,
1884 IN PEXT2_IRP_CONTEXT IrpContext
,
1889 IN OUT PULONG Number
1894 IN PEXT2_IRP_CONTEXT IrpContext
,
1903 IN PEXT2_IRP_CONTEXT IrpContext
,
1911 Ext2UpdateGroupDirStat(
1912 IN PEXT2_IRP_CONTEXT IrpContext
,
1919 IN PEXT2_IRP_CONTEXT IrpContext
,
1927 IN PEXT2_IRP_CONTEXT IrpContext
,
1930 IN
struct inode
*Inode
,
1931 IN PUNICODE_STRING FileName
,
1932 OUT
struct dentry
**dentry
1937 IN PEXT2_IRP_CONTEXT IrpContext
,
1946 IN PEXT2_IRP_CONTEXT IrpContext
,
1953 Ext2SetParentEntry (
1954 IN PEXT2_IRP_CONTEXT IrpContext
,
1958 IN ULONG NewParent
);
1963 IN PEXT2_IRP_CONTEXT IrpContext
,
1970 IN PULONG BlockArray
,
1974 struct ext3_dir_entry_2
*ext3_next_entry(struct ext3_dir_entry_2
*p
);
1976 int ext3_check_dir_entry (const char * function
, struct inode
* dir
,
1977 struct ext3_dir_entry_2
* de
,
1978 struct buffer_head
* bh
,
1979 unsigned long offset
);
1981 loff_t
ext3_max_size(int blkbits
, int has_huge_files
);
1982 loff_t
ext3_max_bitmap_size(int bits
, int has_huge_files
);
1985 __le16
ext4_group_desc_csum(struct ext3_sb_info
*sbi
, __u32 block_group
,
1986 struct ext4_group_desc
*gdp
);
1987 int ext4_group_desc_csum_verify(struct ext3_sb_info
*sbi
, __u32 block_group
,
1988 struct ext4_group_desc
*gdp
);
1990 ext3_fsblk_t
descriptor_loc(struct super_block
*sb
,
1991 ext3_fsblk_t logical_sb_block
, unsigned int nr
);
1992 struct ext4_group_desc
* ext4_get_group_desc(struct super_block
*sb
,
1993 ext4_group_t block_group
, struct buffer_head
**bh
);
1994 int ext4_check_descriptors(struct super_block
*sb
);
2001 Ext2IsFastIoPossible(
2006 Ext2FastIoCheckIfPossible (
2007 IN PFILE_OBJECT FileObject
,
2008 IN PLARGE_INTEGER FileOffset
,
2012 IN BOOLEAN CheckForReadOperation
,
2013 OUT PIO_STATUS_BLOCK IoStatus
,
2014 IN PDEVICE_OBJECT DeviceObject
2019 Ext2FastIoRead (IN PFILE_OBJECT FileObject
,
2020 IN PLARGE_INTEGER FileOffset
,
2025 OUT PIO_STATUS_BLOCK IoStatus
,
2026 IN PDEVICE_OBJECT DeviceObject
);
2030 IN PFILE_OBJECT FileObject
,
2031 IN PLARGE_INTEGER FileOffset
,
2036 OUT PIO_STATUS_BLOCK IoStatus
,
2037 IN PDEVICE_OBJECT DeviceObject
);
2040 Ext2FastIoQueryBasicInfo (
2041 IN PFILE_OBJECT FileObject
,
2043 OUT PFILE_BASIC_INFORMATION Buffer
,
2044 OUT PIO_STATUS_BLOCK IoStatus
,
2045 IN PDEVICE_OBJECT DeviceObject
);
2048 Ext2FastIoQueryStandardInfo (
2049 IN PFILE_OBJECT FileObject
,
2051 OUT PFILE_STANDARD_INFORMATION Buffer
,
2052 OUT PIO_STATUS_BLOCK IoStatus
,
2053 IN PDEVICE_OBJECT DeviceObject
);
2057 IN PFILE_OBJECT FileObject
,
2058 IN PLARGE_INTEGER FileOffset
,
2059 IN PLARGE_INTEGER Length
,
2060 IN PEPROCESS Process
,
2062 IN BOOLEAN FailImmediately
,
2063 IN BOOLEAN ExclusiveLock
,
2064 OUT PIO_STATUS_BLOCK IoStatus
,
2065 IN PDEVICE_OBJECT DeviceObject
2069 Ext2FastIoUnlockSingle (
2070 IN PFILE_OBJECT FileObject
,
2071 IN PLARGE_INTEGER FileOffset
,
2072 IN PLARGE_INTEGER Length
,
2073 IN PEPROCESS Process
,
2075 OUT PIO_STATUS_BLOCK IoStatus
,
2076 IN PDEVICE_OBJECT DeviceObject
2080 Ext2FastIoUnlockAll (
2081 IN PFILE_OBJECT FileObject
,
2082 IN PEPROCESS Process
,
2083 OUT PIO_STATUS_BLOCK IoStatus
,
2084 IN PDEVICE_OBJECT DeviceObject
2088 Ext2FastIoUnlockAllByKey (
2089 IN PFILE_OBJECT FileObject
,
2093 IN PEPROCESS Process
,
2096 OUT PIO_STATUS_BLOCK IoStatus
,
2097 IN PDEVICE_OBJECT DeviceObject
2102 Ext2FastIoQueryNetworkOpenInfo (
2103 IN PFILE_OBJECT FileObject
,
2105 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
2106 OUT PIO_STATUS_BLOCK IoStatus
,
2107 IN PDEVICE_OBJECT DeviceObject
);
2110 Ext2FastIoQueryNetworkOpenInfo (
2111 IN PFILE_OBJECT FileObject
,
2113 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
2114 OUT PIO_STATUS_BLOCK IoStatus
,
2115 IN PDEVICE_OBJECT DeviceObject
);
2119 Ext2AcquireForCreateSection (
2120 IN PFILE_OBJECT FileObject
2125 Ext2ReleaseForCreateSection (
2126 IN PFILE_OBJECT FileObject
2131 Ext2AcquireFileForModWrite (
2132 IN PFILE_OBJECT FileObject
,
2133 IN PLARGE_INTEGER EndingOffset
,
2134 OUT PERESOURCE
*ResourceToRelease
,
2135 IN PDEVICE_OBJECT DeviceObject
2140 Ext2ReleaseFileForModWrite (
2141 IN PFILE_OBJECT FileObject
,
2142 IN PERESOURCE ResourceToRelease
,
2143 IN PDEVICE_OBJECT DeviceObject
2148 Ext2AcquireFileForCcFlush (
2149 IN PFILE_OBJECT FileObject
,
2150 IN PDEVICE_OBJECT DeviceObject
2155 Ext2ReleaseFileForCcFlush (
2156 IN PFILE_OBJECT FileObject
,
2157 IN PDEVICE_OBJECT DeviceObject
2163 Ext2PreAcquireForCreateSection(
2164 IN PFS_FILTER_CALLBACK_DATA cd
,
2174 Ext2QueryFileInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2177 Ext2SetFileInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2182 PLARGE_INTEGER Size
,
2188 PEXT2_IRP_CONTEXT IrpContext
,
2196 PEXT2_IRP_CONTEXT IrpContext
,
2199 PLARGE_INTEGER AllocationSize
);
2202 Ext2IsFileRemovable(
2203 IN PEXT2_IRP_CONTEXT IrpContext
,
2210 Ext2SetDispositionInfo(
2211 PEXT2_IRP_CONTEXT IrpContext
,
2220 PEXT2_IRP_CONTEXT IrpContext
,
2228 PEXT2_IRP_CONTEXT IrpContext
,
2235 Ext2InodeType(PEXT2_MCB Mcb
);
2239 PEXT2_IRP_CONTEXT IrpContext
,
2252 IN PEXT2_IRP_CONTEXT IrpContext
,
2254 IN BOOLEAN bShutDown
2259 IN PEXT2_IRP_CONTEXT IrpContext
,
2261 IN BOOLEAN bShutDown
2266 IN PEXT2_IRP_CONTEXT IrpContext
,
2272 Ext2Flush (IN PEXT2_IRP_CONTEXT IrpContext
);
2281 IN PEXT2_IRP_CONTEXT IrpContext
,
2286 OUT PULONG BytesRead
2291 IN PEXT2_IRP_CONTEXT IrpContext
,
2296 OUT PULONG BytesWritten
2300 Ext2TruncateSymlink(
2301 PEXT2_IRP_CONTEXT IrpContext
,
2308 // MountPoint process workitem
2312 Ext2SetVpbFlag (IN PVPB Vpb
,
2316 Ext2ClearVpbFlag (IN PVPB Vpb
,
2321 IN PEXT2_IRP_CONTEXT IrpContext
,
2323 IN BOOLEAN bForce
);
2326 Ext2PurgeVolume (IN PEXT2_VCB Vcb
,
2327 IN BOOLEAN FlushBeforePurge
);
2330 Ext2PurgeFile (IN PEXT2_FCB Fcb
,
2331 IN BOOLEAN FlushBeforePurge
);
2334 Ext2IsHandleCountZero(IN PEXT2_VCB Vcb
);
2337 Ext2LockVcb (IN PEXT2_VCB Vcb
,
2338 IN PFILE_OBJECT FileObject
);
2341 Ext2LockVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2344 Ext2UnlockVcb (IN PEXT2_VCB Vcb
,
2345 IN PFILE_OBJECT FileObject
);
2348 Ext2UnlockVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2351 Ext2AllowExtendedDasdIo(IN PEXT2_IRP_CONTEXT IrpContext
);
2354 Ext2OplockRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
2357 Ext2QueryExtentMappings(
2358 IN PEXT2_IRP_CONTEXT IrpContext
,
2361 IN PLARGE_INTEGER RequestVbn
,
2362 OUT PLARGE_INTEGER
* pMappedRuns
2366 Ext2QueryRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext
);
2369 Ext2GetRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext
);
2372 Ext2GetRetrievalPointerBase(IN PEXT2_IRP_CONTEXT IrpContext
);
2375 Ext2UserFsRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
2378 Ext2IsMediaWriteProtected (
2379 IN PEXT2_IRP_CONTEXT IrpContext
,
2380 IN PDEVICE_OBJECT TargetDevice
2384 Ext2MountVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2387 Ext2VerifyVcb (IN PEXT2_IRP_CONTEXT IrpContext
,
2390 Ext2VerifyVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2393 Ext2IsVolumeMounted (IN PEXT2_IRP_CONTEXT IrpContext
);
2396 Ext2DismountVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2399 Ext2FileSystemControl (IN PEXT2_IRP_CONTEXT IrpContext
);
2405 struct buffer_head
*ext3_append(struct ext2_icb
*icb
, struct inode
*inode
,
2406 ext3_lblk_t
*block
, int *err
);
2408 void ext3_set_de_type(struct super_block
*sb
,
2409 struct ext3_dir_entry_2
*de
,
2412 __u32
ext3_current_time(struct inode
*in
);
2413 void ext3_warning (struct super_block
* sb
, const char * function
,
2415 #define ext3_error ext3_warning
2416 #define ext4_error ext3_error
2418 void ext3_update_dx_flag(struct inode
*inode
);
2419 int ext3_mark_inode_dirty(struct ext2_icb
*icb
, struct inode
*in
);
2421 void ext3_inc_count(struct inode
*inode
);
2422 void ext3_dec_count(struct inode
*inode
);
2424 struct buffer_head
*
2425 ext3_find_entry (struct ext2_icb
*icb
, struct dentry
*dentry
,
2426 struct ext3_dir_entry_2
** res_dir
);
2427 struct buffer_head
*
2428 ext3_dx_find_entry(struct ext2_icb
*, struct dentry
*dentry
,
2429 struct ext3_dir_entry_2
**res_dir
, int *err
);
2431 typedef int (*filldir_t
)(void *, const char *, int, unsigned long, __u32
, unsigned);
2432 int ext3_dx_readdir(struct file
*filp
, filldir_t filldir
, void * context
);
2434 struct buffer_head
*ext3_bread(struct ext2_icb
*icb
, struct inode
*inode
,
2435 unsigned long block
, int *err
);
2436 int add_dirent_to_buf(struct ext2_icb
*icb
, struct dentry
*dentry
,
2437 struct inode
*inode
, struct ext3_dir_entry_2
*de
,
2438 struct buffer_head
*bh
);
2439 #if !defined(__REACTOS__) || defined(_MSC_VER)
2440 struct ext3_dir_entry_2
*
2441 do_split(struct ext2_icb
*icb
, struct inode
*dir
,
2442 struct buffer_head
**bh
,struct dx_frame
*frame
,
2443 struct dx_hash_info
*hinfo
, int *error
);
2446 int ext3_add_entry(struct ext2_icb
*icb
, struct dentry
*dentry
, struct inode
*inode
);
2448 int ext3_delete_entry(struct ext2_icb
*icb
, struct inode
*dir
,
2449 struct ext3_dir_entry_2
*de_del
,
2450 struct buffer_head
*bh
);
2452 int ext3_is_dir_empty(struct ext2_icb
*icb
, struct inode
*inode
);
2459 Ext2QueryGlobalParameters(IN PUNICODE_STRING RegistryPath
);
2461 Ext2QueryRegistrySettings(IN PUNICODE_STRING RegistryPath
);
2464 DriverUnload (IN PDRIVER_OBJECT DriverObject
);
2472 IN PEXT2_IRP_CONTEXT IrpContext
,
2483 PEXT2_IRP_CONTEXT IrpContext
,
2492 Ext2TruncateIndirect(
2493 PEXT2_IRP_CONTEXT IrpContext
,
2501 // linux.c: linux lib implemenation
2508 ext2_destroy_linux();
2516 Ext2LockControl (IN PEXT2_IRP_CONTEXT IrpContext
);
2525 Ext2FcbReaperThread(
2531 Ext2McbReaperThread(
2543 Ext2AllocateIrpContext (IN PDEVICE_OBJECT DeviceObject
,
2547 Ext2FreeIrpContext (IN PEXT2_IRP_CONTEXT IrpContext
);
2557 Ext2UnlinkFcb(IN PEXT2_FCB Fcb
);
2560 Ext2FreeFcb (IN PEXT2_FCB Fcb
);
2562 Ext2ReleaseFcb (IN PEXT2_FCB Fcb
);
2565 Ext2InsertFcb(PEXT2_VCB Vcb
, PEXT2_FCB Fcb
);
2568 Ext2AllocateCcb (ULONG Flags
, PEXT2_MCB SymLink
);
2577 Ext2FreeCcb (IN PEXT2_VCB Vcb
, IN PEXT2_CCB Ccb
);
2580 Ext2AllocateInode (PEXT2_VCB Vcb
);
2583 Ext2DestroyInode (IN PEXT2_VCB Vcb
, IN PEXT2_INODE inode
);
2585 struct dentry
* Ext2AllocateEntry();
2586 VOID
Ext2FreeEntry (IN
struct dentry
*de
);
2587 struct dentry
*Ext2BuildEntry(PEXT2_VCB Vcb
, PEXT2_MCB Dcb
, PUNICODE_STRING FileName
);
2590 Ext2AllocateExtent();
2593 Ext2FreeExtent (IN PEXT2_EXTENT Extent
);
2596 Ext2CountExtents(IN PEXT2_EXTENT Chain
);
2600 IN PEXT2_EXTENT Chain
,
2601 IN PEXT2_EXTENT Extent
2605 Ext2DestroyExtentChain(IN PEXT2_EXTENT Chain
);
2609 IN PEXT2_IRP_CONTEXT IrpContext
,
2612 IN ULONGLONG Offset
,
2615 OUT PEXT2_EXTENT
* Chain
2619 Ext2ListExtents(PLARGE_MCB Extents
);
2631 Ext2ClearAllExtents(PLARGE_MCB Zone
);
2641 Ext2RemoveVcbExtent (
2648 Ext2LookupVcbExtent (
2652 OUT PLONGLONG Length
2665 Ext2RemoveMcbExtent (
2673 Ext2LookupMcbExtent (
2678 OUT PLONGLONG Length
2682 Ext2AddMcbMetaExts (
2690 Ext2RemoveMcbMetaExts (
2707 Ext2LookupBlockExtent(
2716 Ext2RemoveBlockExtent(
2725 IN PEXT2_IRP_CONTEXT IrpContext
,
2732 IN OUT PUNICODE_STRING Target
,
2733 IN PUNICODE_STRING File
,
2734 IN PUNICODE_STRING Parent
2741 IN PUNICODE_STRING FileName
,
2742 IN PUNICODE_STRING Parent
,
2750 PUNICODE_STRING FileName
2754 Ext2SearchMcbWithoutLock(
2756 PUNICODE_STRING FileName
2779 PEXT2_IRP_CONTEXT IrpContext
,
2780 PEXT2_VCB Vcb
, LONGLONG Block
2784 Ext2CheckBitmapConsistency(
2785 PEXT2_IRP_CONTEXT IrpContext
,
2790 Ext2InsertVcb(PEXT2_VCB Vcb
);
2793 Ext2RemoveVcb(PEXT2_VCB Vcb
);
2796 Ext2InitializeLabel(
2798 IN PEXT2_SUPER_BLOCK Sb
2803 PEXT2_IRP_CONTEXT IrpContext
,
2805 PEXT2_SUPER_BLOCK Ext2Sb
,
2806 PDEVICE_OBJECT TargetDevice
,
2807 PDEVICE_OBJECT VolumeDevice
,
2811 Ext2TearDownStream (IN PEXT2_VCB Vcb
);
2814 Ext2DestroyVcb (IN PEXT2_VCB Vcb
);
2817 Ext2CompleteIrpContext (
2818 IN PEXT2_IRP_CONTEXT IrpContext
,
2819 IN NTSTATUS Status
);
2822 Ext2SyncUninitializeCacheMap (
2823 IN PFILE_OBJECT FileObject
);
2826 Ext2LinkTailMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2830 Ext2LinkHeadMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2833 Ext2UnlinkMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2848 Ext2StartReaper(PEXT2_REAPER
, EXT2_REAPER_RELEASE
);
2851 Ext2StopReaper(PEXT2_REAPER Reaper
);
2858 Ext2Log2(ULONG Value
);
2861 Ext2NtTime (IN ULONG i_time
);
2864 Ext2LinuxTime (IN LARGE_INTEGER SysTime
);
2867 Ext2OEMToUnicodeSize(
2875 IN OUT PUNICODE_STRING Oem
,
2876 IN POEM_STRING Unicode
2880 Ext2UnicodeToOEMSize(
2882 IN PUNICODE_STRING Unicode
2888 IN OUT POEM_STRING Oem
,
2889 IN PUNICODE_STRING Unicode
2893 Ext2Sleep(ULONG ms
);
2895 int Ext2LinuxError (NTSTATUS Status
);
2896 NTSTATUS
Ext2WinntError(int rc
);
2898 BOOLEAN
Ext2IsDot(PUNICODE_STRING name
);
2899 BOOLEAN
Ext2IsDotDot(PUNICODE_STRING name
);
2915 Ext2Pnp(IN PEXT2_IRP_CONTEXT IrpContext
);
2919 PEXT2_IRP_CONTEXT IrpContext
,
2924 PEXT2_IRP_CONTEXT IrpContext
,
2928 Ext2PnpCancelRemove(
2929 PEXT2_IRP_CONTEXT IrpContext
,
2933 Ext2PnpSurpriseRemove(
2934 PEXT2_IRP_CONTEXT IrpContext
,
2944 IN PEXT2_IRP_CONTEXT IrpContext
,
2947 IN ULONGLONG Offset
,
2950 IN BOOLEAN bDirectIo
,
2955 Ext2Read (IN PEXT2_IRP_CONTEXT IrpContext
);
2963 Ext2LoadInternalJournal(
2976 PEXT2_IRP_CONTEXT IrpContext
,
2986 Ext2ShutDown (IN PEXT2_IRP_CONTEXT IrpContext
);
2994 Ext2QueryVolumeInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2997 Ext2SetVolumeInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
3003 typedef struct _EXT2_RW_CONTEXT
{
3008 PERESOURCE Resource
;
3009 ERESOURCE_THREAD ThreadId
;
3010 PFILE_OBJECT FileObject
;
3014 } EXT2_RW_CONTEXT
, *PEXT2_RW_CONTEXT
;
3016 #define EXT2_RW_CONTEXT_WRITE 1
3020 IN PEXT2_IRP_CONTEXT IrpContext
,
3023 IN ULONGLONG Offset
,
3026 IN BOOLEAN bDirectIo
,
3032 Ext2StartFloppyFlushDpc (
3035 PFILE_OBJECT FileObject
);
3039 IN PEXT2_IRP_CONTEXT IrpContext
,
3041 IN PFILE_OBJECT FileObject
,
3042 IN PLARGE_INTEGER Start
,
3043 IN PLARGE_INTEGER End
);
3046 Ext2Write (IN PEXT2_IRP_CONTEXT IrpContext
);
3048 #endif /* _EXT2_HEADER_ */